From ea12adebc61c80232297475b87903a9cb4476ca7 Mon Sep 17 00:00:00 2001 From: bicochan Date: Wed, 30 Jul 2025 15:40:12 +0900 Subject: [PATCH 01/37] =?UTF-8?q?[apps/cs]=20feat:=20=EC=8B=A0=EA=B7=9C=20?= =?UTF-8?q?=ED=91=B8=ED=84=B0=20=EB=A0=88=EC=9D=B4=EC=95=84=EC=9B=83=20?= =?UTF-8?q?=EC=9E=91=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/common/components/package.json | 1 + packages/common/components/src/api/site.ts | 2 +- .../common/components/src/ui/footer/index.tsx | 68 + .../common/components/src/ui/layout/base.tsx | 10 +- .../components/src/ui/layout/footer.tsx | 9 - .../common/components/src/ui/layout/vbase.tsx | 2 +- .../common/components/src/ui/lnb/index.tsx | 2 +- pnpm-lock.yaml | 10847 ++++++++++++++++ 8 files changed, 10923 insertions(+), 18 deletions(-) create mode 100644 packages/common/components/src/ui/footer/index.tsx delete mode 100644 packages/common/components/src/ui/layout/footer.tsx create mode 100644 pnpm-lock.yaml diff --git a/packages/common/components/package.json b/packages/common/components/package.json index 96d381605..3cef3b0f0 100644 --- a/packages/common/components/package.json +++ b/packages/common/components/package.json @@ -58,6 +58,7 @@ "clsx": "^2.1.1", "date-fns": "^3.6.0", "dayjs": "^1.11.13", + "embla-carousel-autoplay": "^8.6.0", "embla-carousel-react": "^8.6.0", "js-cookie": "^3.0.5", "lucide-react": "^0.474.0", diff --git a/packages/common/components/src/api/site.ts b/packages/common/components/src/api/site.ts index da4de293f..f08b7c0a0 100644 --- a/packages/common/components/src/api/site.ts +++ b/packages/common/components/src/api/site.ts @@ -36,5 +36,5 @@ export const getSiteInfo = async (siteId: string) => { }, }, ); - return response.json(); + return response.json() as Promise; }; diff --git a/packages/common/components/src/ui/footer/index.tsx b/packages/common/components/src/ui/footer/index.tsx new file mode 100644 index 000000000..a760be6a5 --- /dev/null +++ b/packages/common/components/src/ui/footer/index.tsx @@ -0,0 +1,68 @@ +import { useQuery } from "@tanstack/react-query"; +import Autoplay from "embla-carousel-autoplay"; +import { getConfig } from "@common/config"; +import { ENDPOINT } from "../../config"; +import { getSiteInfo } from "../../api"; +import { + Carousel, + CarouselContent, + CarouselItem, + CarouselNext, + CarouselPrevious, +} from "../carousel"; +import { useRef } from "react"; + +const appConfig = getConfig(); +const siteId = appConfig.SITE_ID ?? ""; + +export function Footer() { + const { data: siteInfo } = useQuery({ + queryKey: [ENDPOINT.CMS_SERVICE.SITES, siteId], + queryFn: () => getSiteInfo(siteId), + }); + + const plugin = useRef(Autoplay({ delay: 2000, stopOnInteraction: true })); + + return ( +
+
+
{siteInfo?.siteExpln ?? ""}
+

+ 전화: {siteInfo?.telNo ?? ""} / 팩스: {siteInfo?.faxNumber ?? ""} +

+

{siteInfo?.lwndCn ?? ""}

+

+ 본 시스템은 Chrome, Firefox, Safari, Edge 브라우저에 최적화되어 + 있습니다. +

+
+
+
+ 개인정보처리방침 + 이용약관 + 사이트맵 + 고객센터 +
+ + + {Array.from({ length: 10 }).map((_, i) => ( + +
+
+ {`${i + 1}번째 배너`} +
+
+
+ ))} +
+ + +
+
+
+ ); +} diff --git a/packages/common/components/src/ui/layout/base.tsx b/packages/common/components/src/ui/layout/base.tsx index 6eb1322b0..272390d35 100644 --- a/packages/common/components/src/ui/layout/base.tsx +++ b/packages/common/components/src/ui/layout/base.tsx @@ -6,7 +6,7 @@ import type { MenuItem } from "../../api"; import { SidebarProvider } from "../sidebar"; import { LNB } from "../lnb"; import { Header } from "../header"; -import { Footer } from "./footer"; +import { Footer } from "../footer"; import "./common.css"; export function BaseLayout({ @@ -27,15 +27,13 @@ export function BaseLayout({
-
+
-
-
- {children} -
+
+
{children}
diff --git a/packages/common/components/src/ui/layout/footer.tsx b/packages/common/components/src/ui/layout/footer.tsx deleted file mode 100644 index f49b960b2..000000000 --- a/packages/common/components/src/ui/layout/footer.tsx +++ /dev/null @@ -1,9 +0,0 @@ -export function Footer() { - return ( -
-

- © 2025 Ona And All. All Rights Reserved. -

-
- ); -} diff --git a/packages/common/components/src/ui/layout/vbase.tsx b/packages/common/components/src/ui/layout/vbase.tsx index 48cc4639b..7868a412f 100644 --- a/packages/common/components/src/ui/layout/vbase.tsx +++ b/packages/common/components/src/ui/layout/vbase.tsx @@ -2,7 +2,7 @@ import { QueryProvider } from "../../provider/query-provider"; import { SidebarProvider } from "../sidebar"; import { LNB } from "../lnb"; import { Header } from "../header"; -import { Footer } from "./footer"; +import { Footer } from "../footer"; import "./common.css"; import type { QueryClient } from "@tanstack/react-query"; diff --git a/packages/common/components/src/ui/lnb/index.tsx b/packages/common/components/src/ui/lnb/index.tsx index 8f63a08f3..d7fabd39b 100644 --- a/packages/common/components/src/ui/lnb/index.tsx +++ b/packages/common/components/src/ui/lnb/index.tsx @@ -247,7 +247,7 @@ export function LNB({ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 000000000..adb241611 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,10847 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +overrides: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + +importers: + + .: + dependencies: + chart.js: + specifier: ^4.4.8 + version: 4.4.8 + react: + specifier: ^18.3.1 + version: 18.3.1 + react-chartjs-2: + specifier: ^5.3.0 + version: 5.3.0(chart.js@4.4.8)(react@18.3.1) + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + zustand: + specifier: ^5.0.3 + version: 5.0.3(@types/react@18.3.18)(react@18.3.1) + devDependencies: + '@types/node': + specifier: ^22.13.9 + version: 22.13.9 + '@types/react': + specifier: ^18.3.18 + version: 18.3.18 + '@types/react-dom': + specifier: ^18.3.5 + version: 18.3.5(@types/react@18.3.18) + turbo: + specifier: 2.4.2 + version: 2.4.2 + + apps/common/features: + dependencies: + '@common/assets': + specifier: workspace:* + version: link:../../../packages/common/assets + '@common/components': + specifier: workspace:* + version: link:../../../packages/common/components + '@common/config': + specifier: workspace:* + version: link:../../../packages/common/config + '@common/network': + specifier: workspace:* + version: link:../../../packages/common/network + '@fontsource-variable/noto-sans-kr': + specifier: ^5.2.5 + version: 5.2.5 + '@frontend-opensource/use-react-hooks': + specifier: ^1.1.4 + version: 1.1.4 + '@hookform/resolvers': + specifier: ^4.1.3 + version: 4.1.3(react-hook-form@7.54.2) + '@minoru/react-dnd-treeview': + specifier: ^3.5.0 + version: 3.5.0(dnd-core@16.0.1)(react-dnd@16.0.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-icons': + specifier: ^1.3.2 + version: 1.3.2(react@18.3.1) + '@radix-ui/react-label': + specifier: ^2.1.2 + version: 2.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': + specifier: ^1.1.2 + version: 1.1.2(@types/react@18.3.18)(react@18.3.1) + '@tanstack/react-query': + specifier: ^5.67.1 + version: 5.67.1(react@18.3.1) + '@tanstack/react-query-devtools': + specifier: ^5.75.5 + version: 5.75.5(@tanstack/react-query@5.67.1)(react@18.3.1) + '@tanstack/react-table': + specifier: ^8.21.2 + version: 8.21.2(react-dom@18.3.1)(react@18.3.1) + '@tinymce/tinymce-react': + specifier: ^6.1.0 + version: 6.1.0(react-dom@18.3.1)(react@18.3.1) + axios: + specifier: ^1.8.1 + version: 1.8.1 + chart.js: + specifier: ^4.4.8 + version: 4.4.8 + dayjs: + specifier: ^1.11.13 + version: 1.11.13 + js-cookie: + specifier: ^3.0.5 + version: 3.0.5 + next: + specifier: 15.3.0 + version: 15.3.0(react-dom@18.3.1)(react@18.3.1) + next-themes: + specifier: ^0.4.6 + version: 0.4.6(react-dom@18.3.1)(react@18.3.1) + react-chartjs-2: + specifier: ^5.3.0 + version: 5.3.0(chart.js@4.4.8)(react@18.3.1) + react-dnd: + specifier: ^16.0.1 + version: 16.0.1(@types/node@22.13.9)(@types/react@18.3.18)(react@18.3.1) + react-hook-form: + specifier: ^7.54.2 + version: 7.54.2(react@18.3.1) + sonner: + specifier: ^2.0.1 + version: 2.0.1(react-dom@18.3.1)(react@18.3.1) + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.4.17) + tus-js-client: + specifier: ^4.3.1 + version: 4.3.1 + zod: + specifier: ^3.24.2 + version: 3.24.2 + zustand: + specifier: ^5.0.3 + version: 5.0.3(@types/react@18.3.18)(react@18.3.1) + devDependencies: + '@eslint/eslintrc': + specifier: ^3 + version: 3.3.0 + '@types/js-cookie': + specifier: ^3.0.6 + version: 3.0.6 + '@types/node': + specifier: ^22.13.1 + version: 22.13.9 + '@types/webpack': + specifier: ^5.28.5 + version: 5.28.5 + eslint: + specifier: ^9 + version: 9.21.0 + eslint-config-next: + specifier: 15.1.7 + version: 15.1.7(eslint@9.21.0)(typescript@5.6.3) + postcss: + specifier: ^8 + version: 8.5.3 + prettier: + specifier: ^3.4.2 + version: 3.5.2 + prettier-plugin-tailwindcss: + specifier: ^0.6.11 + version: 0.6.11(prettier@3.5.2) + steiger: + specifier: ^0.5.5 + version: 0.5.5(typescript@5.6.3) + tailwindcss: + specifier: ^3.4.1 + version: 3.4.17 + typescript: + specifier: ^5 + version: 5.6.3 + + apps/cs: + dependencies: + '@common/assets': + specifier: workspace:* + version: link:../../packages/common/assets + '@common/components': + specifier: workspace:* + version: link:../../packages/common/components + '@common/config': + specifier: workspace:* + version: link:../../packages/common/config + '@fontsource-variable/noto-sans-kr': + specifier: ^5.2.5 + version: 5.2.5 + '@frontend-opensource/use-react-hooks': + specifier: ^1.1.4 + version: 1.1.4 + '@fullcalendar/core': + specifier: ^6.1.17 + version: 6.1.17 + '@fullcalendar/daygrid': + specifier: ^6.1.17 + version: 6.1.17(@fullcalendar/core@6.1.17) + '@fullcalendar/interaction': + specifier: ^6.1.17 + version: 6.1.17(@fullcalendar/core@6.1.17) + '@fullcalendar/react': + specifier: ^6.1.17 + version: 6.1.17(@fullcalendar/core@6.1.17)(react-dom@18.3.1)(react@18.3.1) + '@fullcalendar/timegrid': + specifier: ^6.1.17 + version: 6.1.17(@fullcalendar/core@6.1.17) + '@hookform/resolvers': + specifier: ^4.1.3 + version: 4.1.3(react-hook-form@7.54.2) + '@minoru/react-dnd-treeview': + specifier: 3.5.1-alpha.1 + version: 3.5.1-alpha.1(dnd-core@16.0.1)(react-dnd@16.0.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-icons': + specifier: ^1.3.2 + version: 1.3.2(react@18.3.1) + '@radix-ui/react-label': + specifier: ^2.1.2 + version: 2.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': + specifier: ^1.1.2 + version: 1.1.2(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-tooltip': + specifier: ^1.1.8 + version: 1.1.8(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@tanstack/react-query': + specifier: ^5.67.1 + version: 5.67.1(react@18.3.1) + '@tanstack/react-query-devtools': + specifier: ^5.75.5 + version: 5.75.5(@tanstack/react-query@5.67.1)(react@18.3.1) + '@tanstack/react-table': + specifier: ^8.21.2 + version: 8.21.2(react-dom@18.3.1)(react@18.3.1) + '@tinymce/tinymce-react': + specifier: ^6.1.0 + version: 6.1.0(react-dom@18.3.1)(react@18.3.1) + axios: + specifier: ^1.8.1 + version: 1.8.1 + chart.js: + specifier: ^4.4.8 + version: 4.4.8 + dayjs: + specifier: ^1.11.13 + version: 1.11.13 + js-cookie: + specifier: ^3.0.5 + version: 3.0.5 + lucide-react: + specifier: ^0.474.0 + version: 0.474.0(react@18.3.1) + next: + specifier: 15.3.0 + version: 15.3.0(react-dom@18.3.1)(react@18.3.1) + next-qrcode: + specifier: ^2.5.1 + version: 2.5.1(react@18.3.1) + next-themes: + specifier: ^0.4.6 + version: 0.4.6(react-dom@18.3.1)(react@18.3.1) + react-chartjs-2: + specifier: ^5.3.0 + version: 5.3.0(chart.js@4.4.8)(react@18.3.1) + react-dnd: + specifier: ^16.0.1 + version: 16.0.1(@types/node@22.13.5)(@types/react@18.3.18)(react@18.3.1) + react-hook-form: + specifier: ^7.54.2 + version: 7.54.2(react@18.3.1) + sonner: + specifier: ^2.0.1 + version: 2.0.1(react-dom@18.3.1)(react@18.3.1) + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.4.17) + tus-js-client: + specifier: ^4.3.1 + version: 4.3.1 + zod: + specifier: ^3.24.2 + version: 3.24.2 + zustand: + specifier: ^5.0.3 + version: 5.0.3(@types/react@18.3.18)(react@18.3.1) + devDependencies: + '@eslint/eslintrc': + specifier: ^3 + version: 3.3.0 + '@types/js-cookie': + specifier: ^3.0.6 + version: 3.0.6 + '@types/node': + specifier: ^22.13.1 + version: 22.13.5 + '@types/webpack': + specifier: ^5.28.5 + version: 5.28.5 + eslint: + specifier: ^9 + version: 9.21.0 + eslint-config-next: + specifier: 15.1.7 + version: 15.1.7(eslint@9.21.0)(typescript@5.6.3) + postcss: + specifier: ^8 + version: 8.5.3 + prettier: + specifier: ^3.4.2 + version: 3.5.2 + prettier-plugin-tailwindcss: + specifier: ^0.6.11 + version: 0.6.11(prettier@3.5.2) + steiger: + specifier: ^0.5.5 + version: 0.5.5(typescript@5.6.3) + tailwindcss: + specifier: ^3.4.1 + version: 3.4.17 + typescript: + specifier: ^5 + version: 5.6.3 + + apps/dm: + dependencies: + '@common/assets': + specifier: workspace:* + version: link:../../packages/common/assets + '@common/business_components': + specifier: workspace:* + version: link:../../packages/common/business_components + '@common/components': + specifier: workspace:* + version: link:../../packages/common/components + '@hookform/resolvers': + specifier: ^4.1.3 + version: 4.1.3(react-hook-form@7.54.2) + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + js-cookie: + specifier: ^3.0.5 + version: 3.0.5 + js-sha512: + specifier: ^0.9.0 + version: 0.9.0 + lucide-react: + specifier: ^0.474.0 + version: 0.474.0(react@18.3.1) + next: + specifier: 15.1.7 + version: 15.1.7(react-dom@18.3.1)(react@18.3.1) + react-hook-form: + specifier: ^7.54.2 + version: 7.54.2(react@18.3.1) + react-hot-toast: + specifier: ^2.5.2 + version: 2.5.2(react-dom@18.3.1)(react@18.3.1) + tailwind-merge: + specifier: ^3.0.1 + version: 3.0.2 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.4.17) + zod: + specifier: ^3.24.2 + version: 3.24.2 + devDependencies: + '@eslint/eslintrc': + specifier: ^3 + version: 3.3.0 + '@types/webpack': + specifier: ^5.28.5 + version: 5.28.5 + eslint: + specifier: ^9 + version: 9.21.0 + eslint-config-next: + specifier: 15.1.7 + version: 15.1.7(eslint@9.21.0)(typescript@5.6.3) + postcss: + specifier: ^8 + version: 8.5.3 + tailwindcss: + specifier: ^3.4.1 + version: 3.4.17 + typescript: + specifier: ^5 + version: 5.6.3 + + apps/fo: + dependencies: + '@common/business_components': + specifier: workspace:* + version: link:../../packages/common/business_components + '@common/components': + specifier: workspace:* + version: link:../../packages/common/components + '@tailwindcss/vite': + specifier: ^4.0.10 + version: 4.1.11(vite@6.2.0) + html2canvas: + specifier: ^1.4.1 + version: 1.4.1 + js-cookie: + specifier: ^3.0.5 + version: 3.0.5 + next: + specifier: 15.1.7 + version: 15.1.7(react-dom@18.3.1)(react@18.3.1) + select: + specifier: ^1.1.2 + version: 1.1.2 + webpack: + specifier: ^5.98.0 + version: 5.98.0 + zustand: + specifier: ^5.0.3 + version: 5.0.3(@types/react@18.3.18)(react@18.3.1) + devDependencies: + '@eslint/eslintrc': + specifier: ^3 + version: 3.3.0 + eslint: + specifier: ^9 + version: 9.21.0 + eslint-config-next: + specifier: 15.1.7 + version: 15.1.7(eslint@9.21.0)(typescript@5.6.3) + postcss: + specifier: ^8 + version: 8.5.3 + tailwindcss: + specifier: ^3.4.17 + version: 3.4.17 + typescript: + specifier: ^5.6.3 + version: 5.6.3 + + apps/sn: + dependencies: + '@common/assets': + specifier: workspace:* + version: link:../../packages/common/assets + '@common/business_components': + specifier: workspace:* + version: link:../../packages/common/business_components + '@common/components': + specifier: workspace:* + version: link:../../packages/common/components + '@fontsource-variable/noto-sans-kr': + specifier: ^5.2.5 + version: 5.2.5 + '@frontend-opensource/use-react-hooks': + specifier: ^1.1.4 + version: 1.1.4 + '@hookform/resolvers': + specifier: ^4.1.3 + version: 4.1.3(react-hook-form@7.54.2) + '@minoru/react-dnd-treeview': + specifier: 3.5.1-alpha.1 + version: 3.5.1-alpha.1(dnd-core@16.0.1)(react-dnd@16.0.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-label': + specifier: ^2.1.2 + version: 2.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': + specifier: ^1.1.2 + version: 1.1.2(@types/react@18.3.18)(react@18.3.1) + '@tanstack/react-query': + specifier: ^5.67.1 + version: 5.67.1(react@18.3.1) + '@tanstack/react-query-devtools': + specifier: ^5.75.5 + version: 5.75.5(@tanstack/react-query@5.67.1)(react@18.3.1) + '@tanstack/react-table': + specifier: ^8.21.2 + version: 8.21.2(react-dom@18.3.1)(react@18.3.1) + axios: + specifier: ^1.8.1 + version: 1.8.1 + chart.js: + specifier: ^4.4.8 + version: 4.4.8 + dayjs: + specifier: ^1.11.13 + version: 1.11.13 + js-cookie: + specifier: ^3.0.5 + version: 3.0.5 + moment: + specifier: ^2.30.1 + version: 2.30.1 + next: + specifier: 15.1.7 + version: 15.1.7(react-dom@18.3.1)(react@18.3.1) + react-chartjs-2: + specifier: ^5.3.0 + version: 5.3.0(chart.js@4.4.8)(react@18.3.1) + react-dnd: + specifier: ^16.0.1 + version: 16.0.1(@types/node@22.13.9)(@types/react@18.3.18)(react@18.3.1) + react-hook-form: + specifier: ^7.54.2 + version: 7.54.2(react@18.3.1) + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.4.17) + tus-js-client: + specifier: ^4.3.1 + version: 4.3.1 + zod: + specifier: ^3.24.2 + version: 3.24.2 + zustand: + specifier: ^5.0.3 + version: 5.0.3(@types/react@18.3.18)(react@18.3.1) + devDependencies: + '@eslint/eslintrc': + specifier: ^3 + version: 3.3.0 + '@faker-js/faker': + specifier: ^9.5.0 + version: 9.5.0 + '@types/js-cookie': + specifier: ^3.0.6 + version: 3.0.6 + '@types/node': + specifier: ^22.13.1 + version: 22.13.9 + '@types/webpack': + specifier: ^5.28.5 + version: 5.28.5 + eslint: + specifier: ^9 + version: 9.21.0 + eslint-config-next: + specifier: 15.1.7 + version: 15.1.7(eslint@9.21.0)(typescript@5.6.3) + postcss: + specifier: ^8 + version: 8.5.3 + prettier: + specifier: ^3.4.2 + version: 3.5.2 + prettier-plugin-tailwindcss: + specifier: ^0.6.11 + version: 0.6.11(prettier@3.5.2) + steiger: + specifier: ^0.5.5 + version: 0.5.5(typescript@5.6.3) + tailwindcss: + specifier: ^3.4.1 + version: 3.4.17 + typescript: + specifier: ^5 + version: 5.6.3 + + apps/wr: + dependencies: + '@common/assets': + specifier: workspace:* + version: link:../../packages/common/assets + '@common/business_components': + specifier: workspace:* + version: link:../../packages/common/business_components + '@common/components': + specifier: workspace:* + version: link:../../packages/common/components + '@hookform/resolvers': + specifier: ^4.1.3 + version: 4.1.3(react-hook-form@7.54.2) + '@tanstack/react-table': + specifier: ^8.21.2 + version: 8.21.2(react-dom@18.3.1)(react@18.3.1) + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + i18next: + specifier: ^25.3.2 + version: 25.3.2(typescript@5.6.3) + js-cookie: + specifier: ^3.0.5 + version: 3.0.5 + lucide-react: + specifier: ^0.474.0 + version: 0.474.0(react@18.3.1) + moment: + specifier: ^2.30.1 + version: 2.30.1 + next: + specifier: 15.1.7 + version: 15.1.7(react-dom@18.3.1)(react@18.3.1) + react-hook-form: + specifier: ^7.54.2 + version: 7.54.2(react@18.3.1) + react-hot-toast: + specifier: ^2.5.2 + version: 2.5.2(react-dom@18.3.1)(react@18.3.1) + react-i18next: + specifier: ^15.6.0 + version: 15.6.1(i18next@25.3.2)(react-dom@18.3.1)(react@18.3.1)(typescript@5.6.3) + tailwind-merge: + specifier: ^3.0.1 + version: 3.0.2 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.4.17) + tus-js-client: + specifier: ^4.3.1 + version: 4.3.1 + zod: + specifier: ^3.24.2 + version: 3.24.2 + devDependencies: + '@eslint/eslintrc': + specifier: ^3 + version: 3.3.0 + '@types/webpack': + specifier: ^5.28.5 + version: 5.28.5 + eslint: + specifier: ^9 + version: 9.21.0 + eslint-config-next: + specifier: 15.1.7 + version: 15.1.7(eslint@9.21.0)(typescript@5.6.3) + postcss: + specifier: ^8 + version: 8.5.3 + tailwindcss: + specifier: ^3.4.1 + version: 3.4.17 + typescript: + specifier: ^5 + version: 5.6.3 + + packages/common/assets: + devDependencies: + '@types/node': + specifier: ^20.11.0 + version: 20.17.19 + tsup: + specifier: ^8.0.1 + version: 8.3.6(postcss@8.5.3)(typescript@5.6.3) + typescript: + specifier: ^5.3.3 + version: 5.6.3 + + packages/common/business_components: + dependencies: + '@common/components': + specifier: workspace:* + version: link:../components + '@hookform/resolvers': + specifier: ^4.1.3 + version: 4.1.3(react-hook-form@7.54.2) + '@minoru/react-dnd-treeview': + specifier: 3.5.1-alpha.1 + version: 3.5.1-alpha.1(dnd-core@16.0.1)(react-dnd@16.0.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-label': + specifier: ^2.1.2 + version: 2.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-scroll-area': + specifier: ^1.2.3 + version: 1.2.3(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-select': + specifier: ^2.1.6 + version: 2.1.6(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': + specifier: ^1.1.2 + version: 1.1.2(@types/react@18.3.18)(react@18.3.1) + axios: + specifier: 1.8.1 + version: 1.8.1 + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + date-fns: + specifier: ^3.6.0 + version: 3.6.0 + libphonenumber-js: + specifier: ^1.12.9 + version: 1.12.10 + lucide-react: + specifier: ^0.474.0 + version: 0.474.0(react@18.3.1) + ol: + specifier: ^7.3.0 + version: 7.5.2 + ol-ext: + specifier: ^4.0.11 + version: 4.0.31(ol@7.5.2) + path: + specifier: ^0.12.7 + version: 0.12.7 + proj4: + specifier: ^2.9.0 + version: 2.15.0 + react-day-picker: + specifier: ^8.10.1 + version: 8.10.1(date-fns@3.6.0)(react@18.3.1) + react-dnd: + specifier: ^16.0.1 + version: 16.0.1(@types/node@22.13.9)(@types/react@18.3.18)(react@18.3.1) + react-dropzone: + specifier: ^14.3.8 + version: 14.3.8(react@18.3.1) + react-hook-form: + specifier: ^7.54.2 + version: 7.54.2(react@18.3.1) + recharts: + specifier: ^2.15.1 + version: 2.15.1(react-dom@18.3.1)(react@18.3.1) + sonner: + specifier: ^2.0.1 + version: 2.0.1(react-dom@18.3.1)(react@18.3.1) + tailwind-merge: + specifier: ^3.0.1 + version: 3.0.2 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.4.17) + xlsx: + specifier: ^0.18.5 + version: 0.18.5 + xlsx-populate: + specifier: ^1.21.0 + version: 1.21.0 + zod: + specifier: ^3.24.2 + version: 3.24.2 + devDependencies: + '@eslint/js': + specifier: ^9.17.0 + version: 9.21.0 + '@storybook/addon-essentials': + specifier: ^8.5.3 + version: 8.6.0(@types/react@18.3.18)(storybook@8.6.0) + '@storybook/addon-interactions': + specifier: ^8.5.3 + version: 8.6.0(storybook@8.6.0) + '@storybook/addon-onboarding': + specifier: ^8.5.3 + version: 8.6.0(storybook@8.6.0) + '@storybook/addon-themes': + specifier: ^8.5.4 + version: 8.6.0(storybook@8.6.0) + '@storybook/blocks': + specifier: ^8.5.3 + version: 8.6.0(react-dom@18.3.1)(react@18.3.1)(storybook@8.6.0) + '@storybook/manager-api': + specifier: ^8.5.5 + version: 8.6.0(storybook@8.6.0) + '@storybook/react': + specifier: ^8.5.3 + version: 8.6.0(@storybook/test@8.6.0)(react-dom@18.3.1)(react@18.3.1)(storybook@8.6.0)(typescript@5.6.3) + '@storybook/react-vite': + specifier: ^8.5.3 + version: 8.6.0(@storybook/test@8.6.0)(react-dom@18.3.1)(react@18.3.1)(storybook@8.6.0)(typescript@5.6.3)(vite@6.2.0) + '@storybook/test': + specifier: ^8.5.3 + version: 8.6.0(storybook@8.6.0) + '@storybook/theming': + specifier: ^8.5.5 + version: 8.6.0(storybook@8.6.0) + '@vitejs/plugin-react': + specifier: ^4.3.4 + version: 4.3.4(vite@6.2.0) + '@xlsx/xlsx-populate': + specifier: ^0.0.8 + version: 0.0.8 + autoprefixer: + specifier: ^10.4.20 + version: 10.4.20(postcss@8.5.3) + eslint: + specifier: ^9.17.0 + version: 9.21.0 + eslint-plugin-react-hooks: + specifier: ^5.0.0 + version: 5.1.0(eslint@9.21.0) + eslint-plugin-react-refresh: + specifier: ^0.4.16 + version: 0.4.19(eslint@9.21.0) + eslint-plugin-storybook: + specifier: ^0.11.2 + version: 0.11.3(eslint@9.21.0)(typescript@5.6.3) + globals: + specifier: ^15.14.0 + version: 15.15.0 + postcss: + specifier: ^8.5.3 + version: 8.5.3 + prettier: + specifier: ^3.4.2 + version: 3.5.2 + prettier-plugin-tailwindcss: + specifier: ^0.6.11 + version: 0.6.11(prettier@3.5.2) + storybook: + specifier: ^8.5.3 + version: 8.6.0(prettier@3.5.2) + tailwindcss: + specifier: ^3.4.17 + version: 3.4.17 + tsup: + specifier: 8.3.6 + version: 8.3.6(postcss@8.5.3)(typescript@5.6.3) + typescript: + specifier: ~5.6.2 + version: 5.6.3 + typescript-eslint: + specifier: ^8.18.2 + version: 8.25.0(eslint@9.21.0)(typescript@5.6.3) + vite: + specifier: ^6.0.5 + version: 6.2.0(@types/node@22.13.9) + vite-tsconfig-paths: + specifier: 5.1.4 + version: 5.1.4(typescript@5.6.3)(vite@6.2.0) + + packages/common/components: + dependencies: + '@common/assets': + specifier: workspace:* + version: link:../assets + '@common/config': + specifier: workspace:* + version: link:../config + '@frontend-opensource/use-react-hooks': + specifier: ^1.1.4 + version: 1.1.4 + '@minoru/react-dnd-treeview': + specifier: ^3.5.0 + version: 3.5.0(dnd-core@16.0.1)(react-dnd@16.0.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-accordion': + specifier: ^1.2.3 + version: 1.2.3(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-checkbox': + specifier: ^1.1.4 + version: 1.1.4(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-collapsible': + specifier: ^1.1.3 + version: 1.1.3(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-dialog': + specifier: ^1.1.6 + version: 1.1.6(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-dropdown-menu': + specifier: ^2.1.6 + version: 2.1.6(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-icons': + specifier: ^1.3.2 + version: 1.3.2(react@18.3.1) + '@radix-ui/react-label': + specifier: ^2.1.2 + version: 2.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-popover': + specifier: ^1.1.6 + version: 1.1.6(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-progress': + specifier: ^1.1.2 + version: 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-radio-group': + specifier: ^1.2.2 + version: 1.2.3(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-scroll-area': + specifier: ^1.2.3 + version: 1.2.3(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-select': + specifier: ^2.1.6 + version: 2.1.6(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-separator': + specifier: ^1.1.2 + version: 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slider': + specifier: ^1.2.3 + version: 1.2.3(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': + specifier: ^1.1.2 + version: 1.1.2(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-switch': + specifier: ^1.1.3 + version: 1.1.3(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-tabs': + specifier: ^1.1.3 + version: 1.1.3(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-tooltip': + specifier: ^1.1.8 + version: 1.1.8(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-visually-hidden': + specifier: ^1.1.2 + version: 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@tanstack/react-query': + specifier: ^5.67.1 + version: 5.67.1(react@18.3.1) + '@tanstack/react-table': + specifier: ^8.21.2 + version: 8.21.2(react-dom@18.3.1)(react@18.3.1) + '@types/js-cookie': + specifier: ^3.0.6 + version: 3.0.6 + axios: + specifier: ^1.8.1 + version: 1.8.1 + chart.js: + specifier: ^4.4.8 + version: 4.4.8 + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + date-fns: + specifier: ^3.6.0 + version: 3.6.0 + dayjs: + specifier: ^1.11.13 + version: 1.11.13 + embla-carousel-autoplay: + specifier: ^8.6.0 + version: 8.6.0(embla-carousel@8.6.0) + embla-carousel-react: + specifier: ^8.6.0 + version: 8.6.0(react@18.3.1) + js-cookie: + specifier: ^3.0.5 + version: 3.0.5 + lucide-react: + specifier: ^0.474.0 + version: 0.474.0(react@18.3.1) + react-chartjs-2: + specifier: ^5.3.0 + version: 5.3.0(chart.js@4.4.8)(react@18.3.1) + react-day-picker: + specifier: ^9.7.0 + version: 9.7.0(react@18.3.1) + react-dnd: + specifier: ^16.0.1 + version: 16.0.1(@types/node@22.13.5)(@types/react@18.3.18)(react@18.3.1) + react-dnd-html5-backend: + specifier: ^16.0.1 + version: 16.0.1 + tailwind-merge: + specifier: ^3.0.1 + version: 3.0.2 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.4.17) + devDependencies: + '@eslint/js': + specifier: ^9.17.0 + version: 9.21.0 + '@faker-js/faker': + specifier: ^9.5.0 + version: 9.5.0 + '@storybook/addon-essentials': + specifier: ^8.5.3 + version: 8.6.0(@types/react@18.3.18)(storybook@8.6.0) + '@storybook/addon-interactions': + specifier: ^8.5.3 + version: 8.6.0(storybook@8.6.0) + '@storybook/addon-onboarding': + specifier: ^8.5.3 + version: 8.6.0(storybook@8.6.0) + '@storybook/addon-themes': + specifier: ^8.5.4 + version: 8.6.0(storybook@8.6.0) + '@storybook/blocks': + specifier: ^8.5.3 + version: 8.6.0(react-dom@18.3.1)(react@18.3.1)(storybook@8.6.0) + '@storybook/manager-api': + specifier: ^8.5.5 + version: 8.6.0(storybook@8.6.0) + '@storybook/react': + specifier: ^8.5.3 + version: 8.6.0(@storybook/test@8.6.0)(react-dom@18.3.1)(react@18.3.1)(storybook@8.6.0)(typescript@5.6.3) + '@storybook/react-vite': + specifier: ^8.5.3 + version: 8.6.0(@storybook/test@8.6.0)(react-dom@18.3.1)(react@18.3.1)(storybook@8.6.0)(typescript@5.6.3)(vite@6.2.0) + '@storybook/test': + specifier: ^8.5.3 + version: 8.6.0(storybook@8.6.0) + '@storybook/theming': + specifier: ^8.5.5 + version: 8.6.0(storybook@8.6.0) + '@types/node': + specifier: ^22.13.1 + version: 22.13.5 + '@vitejs/plugin-react': + specifier: ^4.3.4 + version: 4.3.4(vite@6.2.0) + autoprefixer: + specifier: ^10.4.20 + version: 10.4.20(postcss@8.5.3) + eslint: + specifier: ^9.17.0 + version: 9.21.0 + eslint-plugin-react-hooks: + specifier: ^5.0.0 + version: 5.1.0(eslint@9.21.0) + eslint-plugin-react-refresh: + specifier: ^0.4.16 + version: 0.4.19(eslint@9.21.0) + eslint-plugin-storybook: + specifier: ^0.11.2 + version: 0.11.3(eslint@9.21.0)(typescript@5.6.3) + globals: + specifier: ^15.14.0 + version: 15.15.0 + postcss: + specifier: ^8.5.1 + version: 8.5.3 + prettier: + specifier: ^3.4.2 + version: 3.5.2 + prettier-plugin-tailwindcss: + specifier: ^0.6.11 + version: 0.6.11(prettier@3.5.2) + storybook: + specifier: ^8.5.3 + version: 8.6.0(prettier@3.5.2) + tailwindcss: + specifier: ^3.4.17 + version: 3.4.17 + tsup: + specifier: 8.3.6 + version: 8.3.6(postcss@8.5.3)(typescript@5.6.3) + typescript: + specifier: ~5.6.2 + version: 5.6.3 + typescript-eslint: + specifier: ^8.18.2 + version: 8.25.0(eslint@9.21.0)(typescript@5.6.3) + vite: + specifier: ^6.0.5 + version: 6.2.0(@types/node@22.13.5) + vite-tsconfig-paths: + specifier: 5.1.4 + version: 5.1.4(typescript@5.6.3)(vite@6.2.0) + + packages/common/config: + devDependencies: + eslint: + specifier: ^9.8.0 + version: 9.21.0 + tsup: + specifier: ^8.2.3 + version: 8.3.6(postcss@8.5.3)(typescript@5.6.3) + typescript: + specifier: ^5.5.3 + version: 5.6.3 + vite: + specifier: ^5.3.5 + version: 5.4.18(@types/node@22.13.9) + + packages/common/network: + dependencies: + '@types/js-cookie': + specifier: ^3.0.6 + version: 3.0.6 + axios: + specifier: ^1.8.1 + version: 1.8.1 + js-cookie: + specifier: ^3.0.5 + version: 3.0.5 + devDependencies: + '@types/node': + specifier: ^20.11.19 + version: 20.17.19 + typescript: + specifier: ^5.3.3 + version: 5.6.3 + +packages: + + /@adobe/css-tools@4.4.2: + resolution: {integrity: sha512-baYZExFpsdkBNuvGKTKWCwKH57HRZLVtycZS05WTQNVOiXVSeAki3nU35zlRbToeMW8aHlJfyS+1C4BOv27q0A==} + dev: true + + /@alloc/quick-lru@5.2.0: + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + /@ampproject/remapping@2.3.0: + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + /@babel/code-frame@7.26.2: + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + dev: true + + /@babel/compat-data@7.26.8: + resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core@7.26.9: + resolution: {integrity: sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.9 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) + '@babel/helpers': 7.26.9 + '@babel/parser': 7.26.9 + '@babel/template': 7.26.9 + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 + convert-source-map: 2.0.0 + debug: 4.4.0 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator@7.26.9: + resolution: {integrity: sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + dev: true + + /@babel/helper-compilation-targets@7.26.5: + resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.26.8 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.4 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + + /@babel/helper-module-imports@7.25.9: + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-module-transforms@7.26.0(@babel/core@7.26.9): + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.26.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-plugin-utils@7.26.5: + resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-string-parser@7.25.9: + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier@7.25.9: + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-option@7.25.9: + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helpers@7.26.9: + resolution: {integrity: sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.26.9 + '@babel/types': 7.26.9 + dev: true + + /@babel/parser@7.26.9: + resolution: {integrity: sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.26.9 + dev: true + + /@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/runtime@7.26.9: + resolution: {integrity: sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.1 + + /@babel/runtime@7.28.2: + resolution: {integrity: sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/template@7.26.9: + resolution: {integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 + dev: true + + /@babel/traverse@7.26.9: + resolution: {integrity: sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.9 + '@babel/parser': 7.26.9 + '@babel/template': 7.26.9 + '@babel/types': 7.26.9 + debug: 4.4.0 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types@7.26.9: + resolution: {integrity: sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + dev: true + + /@clack/core@0.3.5: + resolution: {integrity: sha512-5cfhQNH+1VQ2xLQlmzXMqUoiaH0lRBq9/CLW9lTyMbuKLC3+xEK01tHVvyut++mLOn5urSHmkm6I0Lg9MaJSTQ==} + dependencies: + picocolors: 1.1.1 + sisteransi: 1.0.5 + dev: true + + /@clack/prompts@0.8.2: + resolution: {integrity: sha512-6b9Ab2UiZwJYA9iMyboYyW9yJvAO9V753ZhS+DHKEjZRKAxPPOb7MXXu84lsPFG+vZt6FRFniZ8rXi+zCIw4yQ==} + dependencies: + '@clack/core': 0.3.5 + picocolors: 1.1.1 + sisteransi: 1.0.5 + dev: true + + /@date-fns/tz@1.2.0: + resolution: {integrity: sha512-LBrd7MiJZ9McsOgxqWX7AaxrDjcFVjWH/tIKJd7pnR7McaslGYOP1QmmiBXdJH/H/yLCT+rcQ7FaPBUxRGUtrg==} + dev: false + + /@dependents/detective-less@5.0.1: + resolution: {integrity: sha512-Y6+WUMsTFWE5jb20IFP4YGa5IrGY/+a/FbOSjDF/wz9gepU2hwCYSXRHP/vPwBvwcY3SVMASt4yXxbXNXigmZQ==} + engines: {node: '>=18'} + dependencies: + gonzales-pe: 4.3.0 + node-source-walk: 7.0.1 + dev: true + + /@emnapi/runtime@1.4.3: + resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} + requiresBuild: true + dependencies: + tslib: 2.8.1 + dev: false + optional: true + + /@esbuild/aix-ppc64@0.21.5: + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + + /@esbuild/aix-ppc64@0.24.2: + resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + + /@esbuild/aix-ppc64@0.25.0: + resolution: {integrity: sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + optional: true + + /@esbuild/android-arm64@0.21.5: + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.24.2: + resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.25.0: + resolution: {integrity: sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/android-arm@0.21.5: + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.24.2: + resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.25.0: + resolution: {integrity: sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/android-x64@0.21.5: + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.24.2: + resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.25.0: + resolution: {integrity: sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/darwin-arm64@0.21.5: + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.24.2: + resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.25.0: + resolution: {integrity: sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optional: true + + /@esbuild/darwin-x64@0.21.5: + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.24.2: + resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.25.0: + resolution: {integrity: sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + requiresBuild: true + optional: true + + /@esbuild/freebsd-arm64@0.21.5: + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.24.2: + resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.25.0: + resolution: {integrity: sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + optional: true + + /@esbuild/freebsd-x64@0.21.5: + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.24.2: + resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.25.0: + resolution: {integrity: sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + optional: true + + /@esbuild/linux-arm64@0.21.5: + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.24.2: + resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.25.0: + resolution: {integrity: sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-arm@0.21.5: + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.24.2: + resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.25.0: + resolution: {integrity: sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-ia32@0.21.5: + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.24.2: + resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.25.0: + resolution: {integrity: sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-loong64@0.21.5: + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.24.2: + resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.25.0: + resolution: {integrity: sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-mips64el@0.21.5: + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.24.2: + resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.25.0: + resolution: {integrity: sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-ppc64@0.21.5: + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.24.2: + resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.25.0: + resolution: {integrity: sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-riscv64@0.21.5: + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.24.2: + resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.25.0: + resolution: {integrity: sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-s390x@0.21.5: + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.24.2: + resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.25.0: + resolution: {integrity: sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-x64@0.21.5: + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.24.2: + resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.25.0: + resolution: {integrity: sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/netbsd-arm64@0.24.2: + resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-arm64@0.25.0: + resolution: {integrity: sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + requiresBuild: true + optional: true + + /@esbuild/netbsd-x64@0.21.5: + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.24.2: + resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.25.0: + resolution: {integrity: sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + optional: true + + /@esbuild/openbsd-arm64@0.24.2: + resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-arm64@0.25.0: + resolution: {integrity: sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + requiresBuild: true + optional: true + + /@esbuild/openbsd-x64@0.21.5: + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.24.2: + resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.25.0: + resolution: {integrity: sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + optional: true + + /@esbuild/sunos-x64@0.21.5: + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.24.2: + resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.25.0: + resolution: {integrity: sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + requiresBuild: true + optional: true + + /@esbuild/win32-arm64@0.21.5: + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.24.2: + resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.25.0: + resolution: {integrity: sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + requiresBuild: true + optional: true + + /@esbuild/win32-ia32@0.21.5: + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.24.2: + resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.25.0: + resolution: {integrity: sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + requiresBuild: true + optional: true + + /@esbuild/win32-x64@0.21.5: + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.24.2: + resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.25.0: + resolution: {integrity: sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + requiresBuild: true + optional: true + + /@eslint-community/eslint-utils@4.4.1(eslint@9.21.0): + resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 9.21.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.12.1: + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/config-array@0.19.2: + resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@eslint/object-schema': 2.1.6 + debug: 4.4.0 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/core@0.12.0: + resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@types/json-schema': 7.0.15 + dev: true + + /@eslint/eslintrc@3.3.0: + resolution: {integrity: sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + ajv: 6.12.6 + debug: 4.4.0 + espree: 10.3.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@9.21.0: + resolution: {integrity: sha512-BqStZ3HX8Yz6LvsF5ByXYrtigrV5AXADWLAGc7PH/1SxOb7/FIYYMszZZWiUou/GB9P2lXWk2SV4d+Z8h0nknw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: true + + /@eslint/object-schema@2.1.6: + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: true + + /@eslint/plugin-kit@0.2.7: + resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@eslint/core': 0.12.0 + levn: 0.4.1 + dev: true + + /@faker-js/faker@9.5.0: + resolution: {integrity: sha512-3qbjLv+fzuuCg3umxc9/7YjrEXNaKwHgmig949nfyaTx8eL4FAsvFbu+1JcFUj1YAXofhaDn6JdEUBTYuk0Ssw==} + engines: {node: '>=18.0.0', npm: '>=9.0.0'} + deprecated: Please update to a newer version + dev: true + + /@feature-sliced/filesystem@2.4.0: + resolution: {integrity: sha512-aOFdPACNvkFXYb+gNHId8UCRD5fm7Z9/RV6JgBPlgEvm1QtLS4idg2XeHMDGnHrNRCS4ki+0RauxVZxm+g9pvw==} + dependencies: + typescript: 5.6.3 + dev: true + + /@feature-sliced/steiger-plugin@0.5.4(typescript@5.6.3): + resolution: {integrity: sha512-QzkIQUqNq94fv7aV0GY8wKmlFij9CtSQEIV+/0ed33SZGrv1FjUaySO4eHPlSCcH3Y+fH9nnpTaULtqRwwT7sw==} + dependencies: + '@feature-sliced/filesystem': 2.4.0 + fastest-levenshtein: 1.0.16 + lodash-es: 4.17.21 + pluralize: 8.0.0 + precinct: 12.2.0 + tsconfck: 3.1.5(typescript@5.6.3) + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@floating-ui/core@1.6.9: + resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} + dependencies: + '@floating-ui/utils': 0.2.9 + dev: false + + /@floating-ui/dom@1.6.13: + resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} + dependencies: + '@floating-ui/core': 1.6.9 + '@floating-ui/utils': 0.2.9 + dev: false + + /@floating-ui/react-dom@2.1.2(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} + peerDependencies: + react: ^18.3.1 + react-dom: ^18.3.1 + dependencies: + '@floating-ui/dom': 1.6.13 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@floating-ui/utils@0.2.9: + resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + dev: false + + /@fontsource-variable/noto-sans-kr@5.2.5: + resolution: {integrity: sha512-dIJyVPIBRJXtvaFmQ6GKCV93J9Fx3O2Ym5C3gDRcz5zLpEigrnlEfBnsXBUv4aDBHEF/gm/Q07d40dddGxFytg==} + dev: false + + /@frontend-opensource/use-react-hooks@1.1.4: + resolution: {integrity: sha512-otCSyciL5MVCNNYmdDdg2lEL6rbZ3XX1meYQCzapUSC4V6qx2YxMk1kUbhwEM/+vdxhYzBHsVBGD0rZWl5cgrw==} + dependencies: + async-wave: 1.8.6 + fast-deep-equal: 3.1.3 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@fullcalendar/core@6.1.17: + resolution: {integrity: sha512-0W7lnIrv18ruJ5zeWBeNZXO8qCWlzxDdp9COFEsZnyNjiEhUVnrW/dPbjRKYpL0edGG0/Lhs0ghp1z/5ekt8ZA==} + dependencies: + preact: 10.12.1 + dev: false + + /@fullcalendar/daygrid@6.1.17(@fullcalendar/core@6.1.17): + resolution: {integrity: sha512-K7m+pd7oVJ9fW4h7CLDdDGJbc9szJ1xDU1DZ2ag+7oOo1aCNLv44CehzkkknM6r8EYlOOhgaelxQpKAI4glj7A==} + peerDependencies: + '@fullcalendar/core': ~6.1.17 + dependencies: + '@fullcalendar/core': 6.1.17 + dev: false + + /@fullcalendar/interaction@6.1.17(@fullcalendar/core@6.1.17): + resolution: {integrity: sha512-AudvQvgmJP2FU89wpSulUUjeWv24SuyCx8FzH2WIPVaYg+vDGGYarI7K6PcM3TH7B/CyaBjm5Rqw9lXgnwt5YA==} + peerDependencies: + '@fullcalendar/core': ~6.1.17 + dependencies: + '@fullcalendar/core': 6.1.17 + dev: false + + /@fullcalendar/react@6.1.17(@fullcalendar/core@6.1.17)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-AA8soHhlfRH5dUeqHnfAtzDiXa2vrgWocJSK/F5qzw/pOxc9MqpuoS/nQBROWtHHg6yQUg3DoGqOOhi7dmylXQ==} + peerDependencies: + '@fullcalendar/core': ~6.1.17 + react: ^18.3.1 + react-dom: ^18.3.1 + dependencies: + '@fullcalendar/core': 6.1.17 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@fullcalendar/timegrid@6.1.17(@fullcalendar/core@6.1.17): + resolution: {integrity: sha512-K4PlA3L3lclLOs3IX8cvddeiJI9ZVMD7RA9IqaWwbvac771971foc9tFze9YY+Pqesf6S+vhS2dWtEVlERaGlQ==} + peerDependencies: + '@fullcalendar/core': ~6.1.17 + dependencies: + '@fullcalendar/core': 6.1.17 + '@fullcalendar/daygrid': 6.1.17(@fullcalendar/core@6.1.17) + dev: false + + /@hookform/resolvers@4.1.3(react-hook-form@7.54.2): + resolution: {integrity: sha512-Jsv6UOWYTrEFJ/01ZrnwVXs7KDvP8XIo115i++5PWvNkNvkrsTfGiLS6w+eJ57CYtUtDQalUWovCZDHFJ8u1VQ==} + peerDependencies: + react-hook-form: ^7.0.0 + dependencies: + '@standard-schema/utils': 0.3.0 + react-hook-form: 7.54.2(react@18.3.1) + dev: false + + /@humanfs/core@0.19.1: + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + dev: true + + /@humanfs/node@0.16.6: + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/retry@0.3.1: + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + dev: true + + /@humanwhocodes/retry@0.4.2: + resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} + engines: {node: '>=18.18'} + dev: true + + /@img/sharp-darwin-arm64@0.33.5: + resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.4 + dev: false + optional: true + + /@img/sharp-darwin-arm64@0.34.1: + resolution: {integrity: sha512-pn44xgBtgpEbZsu+lWf2KNb6OAf70X68k+yk69Ic2Xz11zHR/w24/U49XT7AeRwJ0Px+mhALhU5LPci1Aymk7A==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.1.0 + dev: false + optional: true + + /@img/sharp-darwin-x64@0.33.5: + resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.4 + dev: false + optional: true + + /@img/sharp-darwin-x64@0.34.1: + resolution: {integrity: sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.1.0 + dev: false + optional: true + + /@img/sharp-libvips-darwin-arm64@1.0.4: + resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-darwin-arm64@1.1.0: + resolution: {integrity: sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-darwin-x64@1.0.4: + resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-darwin-x64@1.1.0: + resolution: {integrity: sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-arm64@1.0.4: + resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-arm64@1.1.0: + resolution: {integrity: sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-arm@1.0.5: + resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-arm@1.1.0: + resolution: {integrity: sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-ppc64@1.1.0: + resolution: {integrity: sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-s390x@1.0.4: + resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-s390x@1.1.0: + resolution: {integrity: sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-x64@1.0.4: + resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-x64@1.1.0: + resolution: {integrity: sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linuxmusl-arm64@1.0.4: + resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linuxmusl-arm64@1.1.0: + resolution: {integrity: sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linuxmusl-x64@1.0.4: + resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linuxmusl-x64@1.1.0: + resolution: {integrity: sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-linux-arm64@0.33.5: + resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.4 + dev: false + optional: true + + /@img/sharp-linux-arm64@0.34.1: + resolution: {integrity: sha512-kX2c+vbvaXC6vly1RDf/IWNXxrlxLNpBVWkdpRq5Ka7OOKj6nr66etKy2IENf6FtOgklkg9ZdGpEu9kwdlcwOQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.1.0 + dev: false + optional: true + + /@img/sharp-linux-arm@0.33.5: + resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.5 + dev: false + optional: true + + /@img/sharp-linux-arm@0.34.1: + resolution: {integrity: sha512-anKiszvACti2sGy9CirTlNyk7BjjZPiML1jt2ZkTdcvpLU1YH6CXwRAZCA2UmRXnhiIftXQ7+Oh62Ji25W72jA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.1.0 + dev: false + optional: true + + /@img/sharp-linux-s390x@0.33.5: + resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.4 + dev: false + optional: true + + /@img/sharp-linux-s390x@0.34.1: + resolution: {integrity: sha512-7s0KX2tI9mZI2buRipKIw2X1ufdTeaRgwmRabt5bi9chYfhur+/C1OXg3TKg/eag1W+6CCWLVmSauV1owmRPxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.1.0 + dev: false + optional: true + + /@img/sharp-linux-x64@0.33.5: + resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.4 + dev: false + optional: true + + /@img/sharp-linux-x64@0.34.1: + resolution: {integrity: sha512-wExv7SH9nmoBW3Wr2gvQopX1k8q2g5V5Iag8Zk6AVENsjwd+3adjwxtp3Dcu2QhOXr8W9NusBU6XcQUohBZ5MA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.1.0 + dev: false + optional: true + + /@img/sharp-linuxmusl-arm64@0.33.5: + resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + dev: false + optional: true + + /@img/sharp-linuxmusl-arm64@0.34.1: + resolution: {integrity: sha512-DfvyxzHxw4WGdPiTF0SOHnm11Xv4aQexvqhRDAoD00MzHekAj9a/jADXeXYCDFH/DzYruwHbXU7uz+H+nWmSOQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 + dev: false + optional: true + + /@img/sharp-linuxmusl-x64@0.33.5: + resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + dev: false + optional: true + + /@img/sharp-linuxmusl-x64@0.34.1: + resolution: {integrity: sha512-pax/kTR407vNb9qaSIiWVnQplPcGU8LRIJpDT5o8PdAx5aAA7AS3X9PS8Isw1/WfqgQorPotjrZL3Pqh6C5EBg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.1.0 + dev: false + optional: true + + /@img/sharp-wasm32@0.33.5: + resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + requiresBuild: true + dependencies: + '@emnapi/runtime': 1.4.3 + dev: false + optional: true + + /@img/sharp-wasm32@0.34.1: + resolution: {integrity: sha512-YDybQnYrLQfEpzGOQe7OKcyLUCML4YOXl428gOOzBgN6Gw0rv8dpsJ7PqTHxBnXnwXr8S1mYFSLSa727tpz0xg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + requiresBuild: true + dependencies: + '@emnapi/runtime': 1.4.3 + dev: false + optional: true + + /@img/sharp-win32-ia32@0.33.5: + resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-win32-ia32@0.34.1: + resolution: {integrity: sha512-WKf/NAZITnonBf3U1LfdjoMgNO5JYRSlhovhRhMxXVdvWYveM4kM3L8m35onYIdh75cOMCo1BexgVQcCDzyoWw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-win32-x64@0.33.5: + resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-win32-x64@0.34.1: + resolution: {integrity: sha512-hw1iIAHpNE8q3uMIRCgGOeDoz9KtFNarFLQclLxr/LK1VBkj8nby18RjFvr6aP7USRYAjTZW6yisnBWMX571Tw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + + /@isaacs/fs-minipass@4.0.1: + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + dependencies: + minipass: 7.1.2 + dev: false + + /@joshwooding/vite-plugin-react-docgen-typescript@0.5.0(typescript@5.6.3)(vite@6.2.0): + resolution: {integrity: sha512-qYDdL7fPwLRI+bJNurVcis+tNgJmvWjH4YTBGXTA8xMuxFrnAz6E5o35iyzyKbq5J5Lr8mJGfrR5GXl+WGwhgQ==} + peerDependencies: + typescript: '>= 4.3.x' + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + glob: 10.4.5 + magic-string: 0.27.0 + react-docgen-typescript: 2.2.2(typescript@5.6.3) + typescript: 5.6.3 + vite: 6.2.0(@types/node@22.13.5) + dev: true + + /@jridgewell/gen-mapping@0.3.8: + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + /@jridgewell/resolve-uri@3.1.2: + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + /@jridgewell/set-array@1.2.1: + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + /@jridgewell/source-map@0.3.6: + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + /@jridgewell/sourcemap-codec@1.5.0: + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + /@jridgewell/trace-mapping@0.3.25: + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + /@juggle/resize-observer@3.4.0: + resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} + dev: false + + /@kurkle/color@0.3.4: + resolution: {integrity: sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==} + dev: false + + /@mapbox/jsonlint-lines-primitives@2.0.2: + resolution: {integrity: sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==} + engines: {node: '>= 0.6'} + dev: false + + /@mapbox/mapbox-gl-style-spec@13.28.0: + resolution: {integrity: sha512-B8xM7Fp1nh5kejfIl4SWeY0gtIeewbuRencqO3cJDrCHZpaPg7uY+V8abuR+esMeuOjRl5cLhVTP40v+1ywxbg==} + hasBin: true + dependencies: + '@mapbox/jsonlint-lines-primitives': 2.0.2 + '@mapbox/point-geometry': 0.1.0 + '@mapbox/unitbezier': 0.0.0 + csscolorparser: 1.0.3 + json-stringify-pretty-compact: 2.0.0 + minimist: 1.2.8 + rw: 1.3.3 + sort-object: 0.3.2 + dev: false + + /@mapbox/point-geometry@0.1.0: + resolution: {integrity: sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==} + dev: false + + /@mapbox/unitbezier@0.0.0: + resolution: {integrity: sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA==} + dev: false + + /@mdx-js/react@3.1.0(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==} + peerDependencies: + '@types/react': ^18.3.18 + react: ^18.3.1 + dependencies: + '@types/mdx': 2.0.13 + '@types/react': 18.3.18 + react: 18.3.1 + dev: true + + /@minoru/react-dnd-treeview@3.5.0(dnd-core@16.0.1)(react-dnd@16.0.1)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-kDHGQ0UK18w6ie5EH68NynATSP9BAzNLmWBXuVSoaGkraWWFdEdAWqQxAZiMorAixFu40MzYkn2N9/Gam6q17w==} + peerDependencies: + react: ^18.3.1 + react-dnd: 15.x || 16.x + react-dom: ^18.3.1 + dependencies: + '@juggle/resize-observer': 3.4.0 + dnd-multi-backend: 8.1.2(dnd-core@16.0.1) + framer-motion: 11.18.2(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dnd: 16.0.1(@types/node@22.13.5)(@types/react@18.3.18)(react@18.3.1) + react-dnd-html5-backend: 16.0.1 + react-dnd-touch-backend: 16.0.1 + react-dom: 18.3.1(react@18.3.1) + react-use-measure: 2.1.7(react-dom@18.3.1)(react@18.3.1) + transitivePeerDependencies: + - '@emotion/is-prop-valid' + - dnd-core + dev: false + + /@minoru/react-dnd-treeview@3.5.1-alpha.1(dnd-core@16.0.1)(react-dnd@16.0.1)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-XEKBjhyltG0gzn+ioZRwhlV7+Q/uVZqTMS/tAO3On/rPNuNgqWHROFsyGdHQS/DYoENGOG8JX03chCxExOgEpA==} + peerDependencies: + react: ^18.3.1 + react-dnd: 15.x || 16.x + react-dom: ^18.3.1 + dependencies: + '@juggle/resize-observer': 3.4.0 + dnd-multi-backend: 8.1.2(dnd-core@16.0.1) + framer-motion: 11.18.2(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dnd: 16.0.1(@types/node@22.13.5)(@types/react@18.3.18)(react@18.3.1) + react-dnd-html5-backend: 16.0.1 + react-dnd-touch-backend: 16.0.1 + react-dom: 18.3.1(react@18.3.1) + react-use-measure: 2.1.7(react-dom@18.3.1)(react@18.3.1) + transitivePeerDependencies: + - '@emotion/is-prop-valid' + - dnd-core + dev: false + + /@next/env@15.1.7: + resolution: {integrity: sha512-d9jnRrkuOH7Mhi+LHav2XW91HOgTAWHxjMPkXMGBc9B2b7614P7kjt8tAplRvJpbSt4nbO1lugcT/kAaWzjlLQ==} + dev: false + + /@next/env@15.3.0: + resolution: {integrity: sha512-6mDmHX24nWlHOlbwUiAOmMyY7KELimmi+ed8qWcJYjqXeC+G6JzPZ3QosOAfjNwgMIzwhXBiRiCgdh8axTTdTA==} + dev: false + + /@next/eslint-plugin-next@15.1.7: + resolution: {integrity: sha512-kRP7RjSxfTO13NE317ek3mSGzoZlI33nc/i5hs1KaWpK+egs85xg0DJ4p32QEiHnR0mVjuUfhRIun7awqfL7pQ==} + dependencies: + fast-glob: 3.3.1 + dev: true + + /@next/swc-darwin-arm64@15.1.7: + resolution: {integrity: sha512-hPFwzPJDpA8FGj7IKV3Yf1web3oz2YsR8du4amKw8d+jAOHfYHYFpMkoF6vgSY4W6vB29RtZEklK9ayinGiCmQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@next/swc-darwin-arm64@15.3.0: + resolution: {integrity: sha512-PDQcByT0ZfF2q7QR9d+PNj3wlNN4K6Q8JoHMwFyk252gWo4gKt7BF8Y2+KBgDjTFBETXZ/TkBEUY7NIIY7A/Kw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@next/swc-darwin-x64@15.1.7: + resolution: {integrity: sha512-2qoas+fO3OQKkU0PBUfwTiw/EYpN+kdAx62cePRyY1LqKtP09Vp5UcUntfZYajop5fDFTjSxCHfZVRxzi+9FYQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@next/swc-darwin-x64@15.3.0: + resolution: {integrity: sha512-m+eO21yg80En8HJ5c49AOQpFDq+nP51nu88ZOMCorvw3g//8g1JSUsEiPSiFpJo1KCTQ+jm9H0hwXK49H/RmXg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-arm64-gnu@15.1.7: + resolution: {integrity: sha512-sKLLwDX709mPdzxMnRIXLIT9zaX2w0GUlkLYQnKGoXeWUhcvpCrK+yevcwCJPdTdxZEUA0mOXGLdPsGkudGdnA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-arm64-gnu@15.3.0: + resolution: {integrity: sha512-H0Kk04ZNzb6Aq/G6e0un4B3HekPnyy6D+eUBYPJv9Abx8KDYgNMWzKt4Qhj57HXV3sTTjsfc1Trc1SxuhQB+Tg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-arm64-musl@15.1.7: + resolution: {integrity: sha512-zblK1OQbQWdC8fxdX4fpsHDw+VSpBPGEUX4PhSE9hkaWPrWoeIJn+baX53vbsbDRaDKd7bBNcXRovY1hEhFd7w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-arm64-musl@15.3.0: + resolution: {integrity: sha512-k8GVkdMrh/+J9uIv/GpnHakzgDQhrprJ/FbGQvwWmstaeFG06nnAoZCJV+wO/bb603iKV1BXt4gHG+s2buJqZA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-x64-gnu@15.1.7: + resolution: {integrity: sha512-GOzXutxuLvLHFDAPsMP2zDBMl1vfUHHpdNpFGhxu90jEzH6nNIgmtw/s1MDwpTOiM+MT5V8+I1hmVFeAUhkbgQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-x64-gnu@15.3.0: + resolution: {integrity: sha512-ZMQ9yzDEts/vkpFLRAqfYO1wSpIJGlQNK9gZ09PgyjBJUmg8F/bb8fw2EXKgEaHbCc4gmqMpDfh+T07qUphp9A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-x64-musl@15.1.7: + resolution: {integrity: sha512-WrZ7jBhR7ATW1z5iEQ0ZJfE2twCNSXbpCSaAunF3BKcVeHFADSI/AW1y5Xt3DzTqPF1FzQlwQTewqetAABhZRQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-x64-musl@15.3.0: + resolution: {integrity: sha512-RFwq5VKYTw9TMr4T3e5HRP6T4RiAzfDJ6XsxH8j/ZeYq2aLsBqCkFzwMI0FmnSsLaUbOb46Uov0VvN3UciHX5A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-arm64-msvc@15.1.7: + resolution: {integrity: sha512-LDnj1f3OVbou1BqvvXVqouJZKcwq++mV2F+oFHptToZtScIEnhNRJAhJzqAtTE2dB31qDYL45xJwrc+bLeKM2Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-arm64-msvc@15.3.0: + resolution: {integrity: sha512-a7kUbqa/k09xPjfCl0RSVAvEjAkYBYxUzSVAzk2ptXiNEL+4bDBo9wNC43G/osLA/EOGzG4CuNRFnQyIHfkRgQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-x64-msvc@15.1.7: + resolution: {integrity: sha512-dC01f1quuf97viOfW05/K8XYv2iuBgAxJZl7mbCKEjMgdQl5JjAKJ0D2qMKZCgPWDeFbFT0Q0nYWwytEW0DWTQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-x64-msvc@15.3.0: + resolution: {integrity: sha512-vHUQS4YVGJPmpjn7r5lEZuMhK5UQBNBRSB+iGDvJjaNk649pTIcRluDWNb9siunyLLiu/LDPHfvxBtNamyuLTw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + /@nolyfill/is-core-module@1.0.39: + resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} + engines: {node: '>=12.4.0'} + dev: true + + /@petamoriken/float16@3.9.2: + resolution: {integrity: sha512-VgffxawQde93xKxT3qap3OH+meZf7VaSB5Sqd4Rqc+FP5alWbpOyan/7tRbOAvynjpG3GpdtAuGU/NdhQpmrog==} + dev: false + + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + optional: true + + /@radix-ui/number@1.1.0: + resolution: {integrity: sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==} + dev: false + + /@radix-ui/primitive@1.1.1: + resolution: {integrity: sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==} + dev: false + + /@radix-ui/react-accordion@1.2.3(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-RIQ15mrcvqIkDARJeERSuXSry2N8uYnxkdDetpfmalT/+0ntOXLkFOsh9iwlAsCv+qcmhZjbdJogIm6WBa6c4A==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-collapsible': 1.1.3(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-collection': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-arrow@1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-G+KcpzXHq24iH0uGG/pF8LyzpFJYGD4RfLjCIBfGdSLXvjLHST31RUiRVrupIBMvIppMgSzQ6l66iAxl03tdlg==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-checkbox@1.1.4(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-wP0CPAHq+P5I4INKe3hJrIa1WoNqqrejzW+zoU0rOvo1b9gDEJJFl2rYfO1PYJUQCc2H1WZxIJmyv9BS8i5fLw==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-collapsible@1.1.3(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-jFSerheto1X03MUC0g6R7LedNW9EEGWdg9W1+MlpkMLwGkgkbUXLPBH/KIuWKXUoeYRVY11llqbTBDzuLg7qrw==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-collection@1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-9z54IEKRxIa9VityapoEYMuByaG42iSy1ZXlY2KcuLSEtq8x4987/N6m15ppoMffgZX72gER2uHe1D9Y6Unlcw==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.1.2(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-compose-refs@1.1.1(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==} + peerDependencies: + '@types/react': ^18.3.18 + react: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.18 + react: 18.3.1 + dev: false + + /@radix-ui/react-context@1.1.1(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==} + peerDependencies: + '@types/react': ^18.3.18 + react: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.18 + react: 18.3.1 + dev: false + + /@radix-ui/react-dialog@1.1.6(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-/IVhJV5AceX620DUJ4uYVMymzsipdKBzo3edo+omeskCKGm9FRHM0ebIdbPnlQVJqyuHbuBltQUOG2mOTq2IYw==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-portal': 1.1.4(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.1.2(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.6.3(@types/react@18.3.18)(react@18.3.1) + dev: false + + /@radix-ui/react-direction@1.1.0(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==} + peerDependencies: + '@types/react': ^18.3.18 + react: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.18 + react: 18.3.1 + dev: false + + /@radix-ui/react-dismissable-layer@1.1.5(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-E4TywXY6UsXNRhFrECa5HAvE5/4BFcGyfTyK36gP+pAW1ed7UTK4vKwdr53gAJYwqbfCWC6ATvJa3J3R/9+Qrg==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-dropdown-menu@2.1.6(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-no3X7V5fD487wab/ZYSHXq3H37u4NVeLDKI/Ks724X/eEFSSEFYZxWgsIlr1UBeEyDaM29HM5x9p1Nv8DuTYPA==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-menu': 2.1.6(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-focus-guards@1.1.1(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==} + peerDependencies: + '@types/react': ^18.3.18 + react: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.18 + react: 18.3.1 + dev: false + + /@radix-ui/react-focus-scope@1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-zxwE80FCU7lcXUGWkdt6XpTTCKPitG1XKOwViTxHVKIJhZl9MvIl2dVHeZENCWD9+EdWv05wlaEkRXUykU27RA==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-icons@1.3.2(react@18.3.1): + resolution: {integrity: sha512-fyQIhGDhzfc9pK2kH6Pl9c4BDJGfMkPqkyIgYDthyNYoNg3wVhoJMMh19WS4Up/1KMPFVpNsT2q3WmXn2N1m6g==} + peerDependencies: + react: ^18.3.1 + dependencies: + react: 18.3.1 + dev: false + + /@radix-ui/react-id@1.1.0(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==} + peerDependencies: + '@types/react': ^18.3.18 + react: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + react: 18.3.1 + dev: false + + /@radix-ui/react-label@2.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-zo1uGMTaNlHehDyFQcDZXRJhUPDuukcnHz0/jnrup0JA6qL+AFpAnty+7VKa9esuU5xTblAZzTGYJKSKaBxBhw==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-menu@2.1.6(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-tBBb5CXDJW3t2mo9WlO7r6GTmWV0F0uzHZVFmlRmYpiSK1CDU5IKojP1pm7oknpBOrFZx/YgBRW9oorPO2S/Lg==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-collection': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-popper': 1.2.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-portal': 1.1.4(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.1.2(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.6.3(@types/react@18.3.18)(react@18.3.1) + dev: false + + /@radix-ui/react-popover@1.1.6(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-NQouW0x4/GnkFJ/pRqsIS3rM/k97VzKnVb2jB7Gq7VEGPy5g7uNV1ykySFt7eWSp3i2uSGFwaJcvIRJBAHmmFg==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-popper': 1.2.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-portal': 1.1.4(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.1.2(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.6.3(@types/react@18.3.18)(react@18.3.1) + dev: false + + /@radix-ui/react-popper@1.2.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-Rvqc3nOpwseCyj/rgjlJDYAgyfw7OC1tTkKn2ivhaMGcYt8FSBlahHOZak2i3QwkRXUXgGgzeEe2RuqeEHuHgA==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-arrow': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/rect': 1.1.0 + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-portal@1.1.4(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-sn2O9k1rPFYVyKd5LAJfo96JlSGVFpa1fS6UuBJfrZadudiw5tAmru+n1x7aMRQ84qDM71Zh1+SzK5QwU0tJfA==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-presence@1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-primitive@2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-Ec/0d38EIuvDF+GZjcMU/Ze6MxntVJYO/fRlCPhCaVUyPY9WTalHJw54tp9sXeJo3tlShWpy41vQRgLRGOuz+w==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-slot': 1.1.2(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-progress@1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-u1IgJFQ4zNAUTjGdDL5dcl/U8ntOR6jsnhxKb5RKp5Ozwl88xKR9EqRZOe/Mk8tnx0x5tNUe2F+MzsyjqMg0MA==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-radio-group@1.2.3(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-xtCsqt8Rp09FK50ItqEqTJ7Sxanz8EM8dnkVIhJrc/wkMMomSmXHvYbhv3E7Zx4oXh98aaLt9W679SUYXg4IDA==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-roving-focus@1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-zgMQWkNO169GtGqRvYrzb0Zf8NhMHS2DuEB/TiEmVnpr5OqPU3i8lfbxaAmC2J/KYuIQxyoQQ6DxepyXp61/xw==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-collection': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-scroll-area@1.2.3(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-l7+NNBfBYYJa9tNqVcP2AGvxdE3lmE6kFTBXdvHgUaZuy+4wGCL1Cl2AfaR7RKyimj7lZURGLwFO59k4eBnDJQ==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/number': 1.1.0 + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-select@2.1.6(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-T6ajELxRvTuAMWH0YmRJ1qez+x4/7Nq7QIx7zJ0VK3qaEWdnWpNbEDnmWldG1zBDwqrLy5aLMUWcoGirVj5kMg==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/number': 1.1.0 + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-collection': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-popper': 1.2.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-portal': 1.1.4(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.1.2(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.6.3(@types/react@18.3.18)(react@18.3.1) + dev: false + + /@radix-ui/react-separator@1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-oZfHcaAp2Y6KFBX6I5P1u7CQoy4lheCGiYj+pGFrHy8E/VNRb5E39TkTr3JrV520csPBTZjkuKFdEsjS5EUNKQ==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-slider@1.2.3(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-nNrLAWLjGESnhqBqcCNW4w2nn7LxudyMzeB6VgdyAnFLC6kfQgnAjSL2v6UkQTnDctJBlxrmxfplWS4iYjdUTw==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/number': 1.1.0 + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-collection': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-slot@1.1.2(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ==} + peerDependencies: + '@types/react': ^18.3.18 + react: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + react: 18.3.1 + dev: false + + /@radix-ui/react-switch@1.1.3(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-1nc+vjEOQkJVsJtWPSiISGT6OKm4SiOdjMo+/icLxo2G4vxz1GntC5MzfL4v8ey9OEfw787QCD1y3mUv0NiFEQ==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-tabs@1.1.3(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-9mFyI30cuRDImbmFF6O2KUJdgEOsGh9Vmx9x/Dh9tOhL7BngmQPQfwW4aejKm5OHpfWIdmeV6ySyuxoOGjtNng==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-tooltip@1.1.8(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-YAA2cu48EkJZdAMHC0dqo9kialOcRStbtiY4nJPaht7Ptrhcvpo+eDChaM6BIs8kL6a8Z5l5poiqLnXcNduOkA==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-popper': 1.2.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-portal': 1.1.4(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.1.2(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} + peerDependencies: + '@types/react': ^18.3.18 + react: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.18 + react: 18.3.1 + dev: false + + /@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==} + peerDependencies: + '@types/react': ^18.3.18 + react: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + react: 18.3.1 + dev: false + + /@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==} + peerDependencies: + '@types/react': ^18.3.18 + react: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + react: 18.3.1 + dev: false + + /@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==} + peerDependencies: + '@types/react': ^18.3.18 + react: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.18 + react: 18.3.1 + dev: false + + /@radix-ui/react-use-previous@1.1.0(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==} + peerDependencies: + '@types/react': ^18.3.18 + react: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.18 + react: 18.3.1 + dev: false + + /@radix-ui/react-use-rect@1.1.0(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==} + peerDependencies: + '@types/react': ^18.3.18 + react: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@radix-ui/rect': 1.1.0 + '@types/react': 18.3.18 + react: 18.3.1 + dev: false + + /@radix-ui/react-use-size@1.1.0(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==} + peerDependencies: + '@types/react': ^18.3.18 + react: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + react: 18.3.1 + dev: false + + /@radix-ui/react-visually-hidden@1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-1SzA4ns2M1aRlvxErqhLHsBHoS5eI5UUcI2awAMgGUp4LoaoWOKYmvqDY2s/tltuPkh3Yk77YF/r3IRj+Amx4Q==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/rect@1.1.0: + resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==} + dev: false + + /@react-dnd/asap@5.0.2: + resolution: {integrity: sha512-WLyfoHvxhs0V9U+GTsGilGgf2QsPl6ZZ44fnv0/b8T3nQyvzxidxsg/ZltbWssbsRDlYW8UKSQMTGotuTotZ6A==} + dev: false + + /@react-dnd/invariant@4.0.2: + resolution: {integrity: sha512-xKCTqAK/FFauOM9Ta2pswIyT3D8AQlfrYdOi/toTPEhqCuAs1v5tcJ3Y08Izh1cJ5Jchwy9SeAXmMg6zrKs2iw==} + dev: false + + /@react-dnd/shallowequal@4.0.2: + resolution: {integrity: sha512-/RVXdLvJxLg4QKvMoM5WlwNR9ViO9z8B/qPcc+C0Sa/teJY7QG7kJ441DwzOjMYEY7GmU4dj5EcGHIkKZiQZCA==} + dev: false + + /@rollup/pluginutils@5.1.4: + resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.6 + estree-walker: 2.0.2 + picomatch: 4.0.2 + dev: true + + /@rollup/rollup-android-arm-eabi@4.34.8: + resolution: {integrity: sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==} + cpu: [arm] + os: [android] + requiresBuild: true + optional: true + + /@rollup/rollup-android-arm64@4.34.8: + resolution: {integrity: sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==} + cpu: [arm64] + os: [android] + requiresBuild: true + optional: true + + /@rollup/rollup-darwin-arm64@4.34.8: + resolution: {integrity: sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optional: true + + /@rollup/rollup-darwin-x64@4.34.8: + resolution: {integrity: sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==} + cpu: [x64] + os: [darwin] + requiresBuild: true + optional: true + + /@rollup/rollup-freebsd-arm64@4.34.8: + resolution: {integrity: sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + optional: true + + /@rollup/rollup-freebsd-x64@4.34.8: + resolution: {integrity: sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==} + cpu: [x64] + os: [freebsd] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.34.8: + resolution: {integrity: sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==} + cpu: [arm] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-arm-musleabihf@4.34.8: + resolution: {integrity: sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==} + cpu: [arm] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.34.8: + resolution: {integrity: sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==} + cpu: [arm64] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-arm64-musl@4.34.8: + resolution: {integrity: sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==} + cpu: [arm64] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-loongarch64-gnu@4.34.8: + resolution: {integrity: sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==} + cpu: [loong64] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-powerpc64le-gnu@4.34.8: + resolution: {integrity: sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==} + cpu: [ppc64] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.34.8: + resolution: {integrity: sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-s390x-gnu@4.34.8: + resolution: {integrity: sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==} + cpu: [s390x] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.34.8: + resolution: {integrity: sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==} + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-x64-musl@4.34.8: + resolution: {integrity: sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==} + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.34.8: + resolution: {integrity: sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==} + cpu: [arm64] + os: [win32] + requiresBuild: true + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.34.8: + resolution: {integrity: sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==} + cpu: [ia32] + os: [win32] + requiresBuild: true + optional: true + + /@rollup/rollup-win32-x64-msvc@4.34.8: + resolution: {integrity: sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==} + cpu: [x64] + os: [win32] + requiresBuild: true + optional: true + + /@rtsao/scc@1.1.0: + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + dev: true + + /@rushstack/eslint-patch@1.10.5: + resolution: {integrity: sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A==} + dev: true + + /@sindresorhus/merge-streams@2.3.0: + resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} + engines: {node: '>=18'} + dev: true + + /@standard-schema/utils@0.3.0: + resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} + dev: false + + /@storybook/addon-actions@8.6.0(storybook@8.6.0): + resolution: {integrity: sha512-lI03stcI28wN8trjp7zx0PzN1NRxSpU/551slzEhSM0tghcLxcfLZR/wh4Jp0T68Obj7z//YXPttZ9PBFajs6w==} + peerDependencies: + storybook: ^8.6.0 + dependencies: + '@storybook/global': 5.0.0 + '@types/uuid': 9.0.8 + dequal: 2.0.3 + polished: 4.3.1 + storybook: 8.6.0(prettier@3.5.2) + uuid: 9.0.1 + dev: true + + /@storybook/addon-backgrounds@8.6.0(storybook@8.6.0): + resolution: {integrity: sha512-MbMPjuC19jJBXqQext8rENBACLKujDn+MuxIbNYMmn2ljzeYFp87tVxzlCB7XY7rV0zvkHxH8N/zDnPl7pBTcQ==} + peerDependencies: + storybook: ^8.6.0 + dependencies: + '@storybook/global': 5.0.0 + memoizerific: 1.11.3 + storybook: 8.6.0(prettier@3.5.2) + ts-dedent: 2.2.0 + dev: true + + /@storybook/addon-controls@8.6.0(storybook@8.6.0): + resolution: {integrity: sha512-oc+mssxmNY+D26jyJ+IZ1u8bmzveCO2wqpUl6vtLM5MruchZAHzHqa2ZIn+H9KOEqcKlYVDF5n6oEuprcnrsdg==} + peerDependencies: + storybook: ^8.6.0 + dependencies: + '@storybook/global': 5.0.0 + dequal: 2.0.3 + storybook: 8.6.0(prettier@3.5.2) + ts-dedent: 2.2.0 + dev: true + + /@storybook/addon-docs@8.6.0(@types/react@18.3.18)(storybook@8.6.0): + resolution: {integrity: sha512-ytYn5ec2Tp62t9emjXgm4Ds+eG7SiSg/vNeOwM6L1lM2UCV2/XdzntbqlUb/FHehSXIv9eRJDSe5BBzPieUUaw==} + peerDependencies: + storybook: ^8.6.0 + dependencies: + '@mdx-js/react': 3.1.0(@types/react@18.3.18)(react@18.3.1) + '@storybook/blocks': 8.6.0(react-dom@18.3.1)(react@18.3.1)(storybook@8.6.0) + '@storybook/csf-plugin': 8.6.0(storybook@8.6.0) + '@storybook/react-dom-shim': 8.6.0(react-dom@18.3.1)(react@18.3.1)(storybook@8.6.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + storybook: 8.6.0(prettier@3.5.2) + ts-dedent: 2.2.0 + transitivePeerDependencies: + - '@types/react' + dev: true + + /@storybook/addon-essentials@8.6.0(@types/react@18.3.18)(storybook@8.6.0): + resolution: {integrity: sha512-T3R9Q1hq6eJKy758gQgYEuAYxcddGZ8eGBLIyIJEgzpwsUnN5mF+rIqx8LoWxpWu/xiKzg17LqCBnJbLGkRZUA==} + peerDependencies: + storybook: ^8.6.0 + dependencies: + '@storybook/addon-actions': 8.6.0(storybook@8.6.0) + '@storybook/addon-backgrounds': 8.6.0(storybook@8.6.0) + '@storybook/addon-controls': 8.6.0(storybook@8.6.0) + '@storybook/addon-docs': 8.6.0(@types/react@18.3.18)(storybook@8.6.0) + '@storybook/addon-highlight': 8.6.0(storybook@8.6.0) + '@storybook/addon-measure': 8.6.0(storybook@8.6.0) + '@storybook/addon-outline': 8.6.0(storybook@8.6.0) + '@storybook/addon-toolbars': 8.6.0(storybook@8.6.0) + '@storybook/addon-viewport': 8.6.0(storybook@8.6.0) + storybook: 8.6.0(prettier@3.5.2) + ts-dedent: 2.2.0 + transitivePeerDependencies: + - '@types/react' + dev: true + + /@storybook/addon-highlight@8.6.0(storybook@8.6.0): + resolution: {integrity: sha512-xgSUzNV8ZpNDJ35bLz7wfg/q7/O/C5845wbZsn+PobUOWpOMOKeZwbGkO3Fh4+CWKeFuMhUpFiZSWkNgT+bV0g==} + peerDependencies: + storybook: ^8.6.0 + dependencies: + '@storybook/global': 5.0.0 + storybook: 8.6.0(prettier@3.5.2) + dev: true + + /@storybook/addon-interactions@8.6.0(storybook@8.6.0): + resolution: {integrity: sha512-AgobFrUxmKgGHKeOismuLZdXlndP3ZDquHztiomfMiu01xOqNPxG0+xoCcegvftU7hKE+TlBRzhjCWg/bFz4LQ==} + peerDependencies: + storybook: ^8.6.0 + dependencies: + '@storybook/global': 5.0.0 + '@storybook/instrumenter': 8.6.0(storybook@8.6.0) + '@storybook/test': 8.6.0(storybook@8.6.0) + polished: 4.3.1 + storybook: 8.6.0(prettier@3.5.2) + ts-dedent: 2.2.0 + dev: true + + /@storybook/addon-measure@8.6.0(storybook@8.6.0): + resolution: {integrity: sha512-ogc+VNLyXq8hGfI4Fkmh9i3JbxfiIViiINdBoldD6K0gId3yaqqrSwQ2vWhYIbfUuz+PsMxsoNS7MD4EiRXhPg==} + peerDependencies: + storybook: ^8.6.0 + dependencies: + '@storybook/global': 5.0.0 + storybook: 8.6.0(prettier@3.5.2) + tiny-invariant: 1.3.3 + dev: true + + /@storybook/addon-onboarding@8.6.0(storybook@8.6.0): + resolution: {integrity: sha512-UOOvYQlHKdY31YJwR+ECX7e/BNuhp4alcJmx1fuI7m6tXqTGLtioeMJEreh2jV3FDaaDqL4DL/1UfYXqNRMp+A==} + peerDependencies: + storybook: ^8.6.0 + dependencies: + storybook: 8.6.0(prettier@3.5.2) + dev: true + + /@storybook/addon-outline@8.6.0(storybook@8.6.0): + resolution: {integrity: sha512-IWxrNNZOk5rtOdnLNyK7gpqi0g0rMGYl5ju37Glbfa7iG2J1VKofG2CbkUpVyVY0uiTXqkKkhOKlc9zELhLQSg==} + peerDependencies: + storybook: ^8.6.0 + dependencies: + '@storybook/global': 5.0.0 + storybook: 8.6.0(prettier@3.5.2) + ts-dedent: 2.2.0 + dev: true + + /@storybook/addon-themes@8.6.0(storybook@8.6.0): + resolution: {integrity: sha512-dKUjFgHP9Fd2fxrXcUUjev5X3cGqVvVogzh+nCRA/QlZgf3NzA8J2VPtqtFMX3ex+vaozGsrEKrk+LQTK1B7SA==} + peerDependencies: + storybook: ^8.6.0 + dependencies: + storybook: 8.6.0(prettier@3.5.2) + ts-dedent: 2.2.0 + dev: true + + /@storybook/addon-toolbars@8.6.0(storybook@8.6.0): + resolution: {integrity: sha512-Mg0V9RrnDt/IQe+zjggGS+4Otkv4YFqyjL/ygwnV6aKGgzL5zFpC+5rf8MeBEvNeol9+THC/XltN/Xf+jbtLEQ==} + peerDependencies: + storybook: ^8.6.0 + dependencies: + storybook: 8.6.0(prettier@3.5.2) + dev: true + + /@storybook/addon-viewport@8.6.0(storybook@8.6.0): + resolution: {integrity: sha512-sVDF3gIjGdvfBdCM/jEBu6Nd5GlqITKBtdySiQdNDl5JI4ak77ZM+T+VQmJxB4sIqvCjWzCbQqUC45nymVObug==} + peerDependencies: + storybook: ^8.6.0 + dependencies: + memoizerific: 1.11.3 + storybook: 8.6.0(prettier@3.5.2) + dev: true + + /@storybook/blocks@8.6.0(react-dom@18.3.1)(react@18.3.1)(storybook@8.6.0): + resolution: {integrity: sha512-3PNxlB5Ooj8CIhttbDxeV6kW7ui+2GEdTngtqhnsUHVjzeTKpilsk2lviOeUzqlyq5FDK+rhpZ3L3DJ9pDvioA==} + peerDependencies: + react: ^18.3.1 + react-dom: ^18.3.1 + storybook: ^8.6.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + dependencies: + '@storybook/icons': 1.3.2(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + storybook: 8.6.0(prettier@3.5.2) + ts-dedent: 2.2.0 + dev: true + + /@storybook/builder-vite@8.6.0(storybook@8.6.0)(vite@6.2.0): + resolution: {integrity: sha512-Bdc5fXLJbPdQo2eJ3dDNhfhWuQOME2KWvrixnsfo57IOhDa5B81jVcDBQIIgB9K1NQDRGyaWfYCcKZqy16yPlQ==} + peerDependencies: + storybook: ^8.6.0 + vite: ^4.0.0 || ^5.0.0 || ^6.0.0 + dependencies: + '@storybook/csf-plugin': 8.6.0(storybook@8.6.0) + browser-assert: 1.2.1 + storybook: 8.6.0(prettier@3.5.2) + ts-dedent: 2.2.0 + vite: 6.2.0(@types/node@22.13.5) + dev: true + + /@storybook/components@8.6.0(storybook@8.6.0): + resolution: {integrity: sha512-k5MQAuLPt5KOaa5J4QvX/WKucaiFTMJiEX5lsSaY6qON6Sx8PtnLQxVwWF7BIMW/jLpd94BUxrVjVrQKlwoLKQ==} + peerDependencies: + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + dependencies: + storybook: 8.6.0(prettier@3.5.2) + dev: true + + /@storybook/core@8.6.0(prettier@3.5.2)(storybook@8.6.0): + resolution: {integrity: sha512-UzVo2sNz8PZuDp++/R9NBtjupSXhvxS8lptYcwtk51b6MvcM4AL/b4V3PGryOVJDru9sMwz+pzaj7Jg8RVFMJA==} + peerDependencies: + prettier: ^2 || ^3 + peerDependenciesMeta: + prettier: + optional: true + dependencies: + '@storybook/theming': 8.6.0(storybook@8.6.0) + better-opn: 3.0.2 + browser-assert: 1.2.1 + esbuild: 0.25.0 + esbuild-register: 3.6.0(esbuild@0.25.0) + jsdoc-type-pratt-parser: 4.1.0 + prettier: 3.5.2 + process: 0.11.10 + recast: 0.23.10 + semver: 7.7.1 + util: 0.12.5 + ws: 8.18.1 + transitivePeerDependencies: + - bufferutil + - storybook + - supports-color + - utf-8-validate + dev: true + + /@storybook/csf-plugin@8.6.0(storybook@8.6.0): + resolution: {integrity: sha512-Cd7LL4XQ8ccUDzJGxVyuzgsYuRYS5LVL4/ZNmAxikz9LtVrVFI/4RgFa5MvlQZc0twreoLtztFskziny8OiJUQ==} + peerDependencies: + storybook: ^8.6.0 + dependencies: + storybook: 8.6.0(prettier@3.5.2) + unplugin: 1.16.1 + dev: true + + /@storybook/csf@0.1.13: + resolution: {integrity: sha512-7xOOwCLGB3ebM87eemep89MYRFTko+D8qE7EdAAq74lgdqRR5cOUtYWJLjO2dLtP94nqoOdHJo6MdLLKzg412Q==} + dependencies: + type-fest: 2.19.0 + dev: true + + /@storybook/global@5.0.0: + resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} + dev: true + + /@storybook/icons@1.3.2(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-t3xcbCKkPvqyef8urBM0j/nP6sKtnlRkVgC+8JTbTAZQjaTmOjes3byEgzs89p4B/K6cJsg9wLW2k3SknLtYJw==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: ^18.3.1 + react-dom: ^18.3.1 + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: true + + /@storybook/instrumenter@8.6.0(storybook@8.6.0): + resolution: {integrity: sha512-eEY/Hfa3Vj5Nv4vHRHlSqjoyW6oAKNK3rKIXfL/eawQwb7rKhzijDLG5YBH44Hh7dEPIqUp0LEdgpyIY7GXezg==} + peerDependencies: + storybook: ^8.6.0 + dependencies: + '@storybook/global': 5.0.0 + '@vitest/utils': 2.1.9 + storybook: 8.6.0(prettier@3.5.2) + dev: true + + /@storybook/manager-api@8.6.0(storybook@8.6.0): + resolution: {integrity: sha512-ddBibYrO3yQCdtZBqQYqfABjR9eS+llvt2NFDajfyQw+zmuNIZfw4BDGKH1WHE4wm/kXmlFFhPHXaHgAPTRPfQ==} + peerDependencies: + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + dependencies: + storybook: 8.6.0(prettier@3.5.2) + dev: true + + /@storybook/preview-api@8.6.0(storybook@8.6.0): + resolution: {integrity: sha512-c/sZj4Tb+DtdCndcjoFUneUwl2XUdQckqN4nf1SuIJ/BXRbAexlD04fvPJ4wzmwUNg8EQF7BhTWVNDa1RvJz2w==} + peerDependencies: + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + dependencies: + storybook: 8.6.0(prettier@3.5.2) + dev: true + + /@storybook/react-dom-shim@8.6.0(react-dom@18.3.1)(react@18.3.1)(storybook@8.6.0): + resolution: {integrity: sha512-5Y+vMHhcx0xnaNsLQMbkmjc3zkDn/fGBNsiLH2e4POvW3ZQvOxjoyxAsEQaKwLtFgsdCFSd2tR89F6ItYrA2JQ==} + peerDependencies: + react: ^18.3.1 + react-dom: ^18.3.1 + storybook: ^8.6.0 + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + storybook: 8.6.0(prettier@3.5.2) + dev: true + + /@storybook/react-vite@8.6.0(@storybook/test@8.6.0)(react-dom@18.3.1)(react@18.3.1)(storybook@8.6.0)(typescript@5.6.3)(vite@6.2.0): + resolution: {integrity: sha512-uDQyf2u0Zki4qIavOu2jyGIlvmUOsgCpHXY+7KHr542ZIkXI3mGOi5/rwUxgNSHGD3JloYGdlt+4Md+9i5xEbA==} + engines: {node: '>=18.0.0'} + peerDependencies: + '@storybook/test': 8.6.0 + react: ^18.3.1 + react-dom: ^18.3.1 + storybook: ^8.6.0 + vite: ^4.0.0 || ^5.0.0 || ^6.0.0 + peerDependenciesMeta: + '@storybook/test': + optional: true + dependencies: + '@joshwooding/vite-plugin-react-docgen-typescript': 0.5.0(typescript@5.6.3)(vite@6.2.0) + '@rollup/pluginutils': 5.1.4 + '@storybook/builder-vite': 8.6.0(storybook@8.6.0)(vite@6.2.0) + '@storybook/react': 8.6.0(@storybook/test@8.6.0)(react-dom@18.3.1)(react@18.3.1)(storybook@8.6.0)(typescript@5.6.3) + '@storybook/test': 8.6.0(storybook@8.6.0) + find-up: 5.0.0 + magic-string: 0.30.17 + react: 18.3.1 + react-docgen: 7.1.1 + react-dom: 18.3.1(react@18.3.1) + resolve: 1.22.10 + storybook: 8.6.0(prettier@3.5.2) + tsconfig-paths: 4.2.0 + vite: 6.2.0(@types/node@22.13.5) + transitivePeerDependencies: + - rollup + - supports-color + - typescript + dev: true + + /@storybook/react@8.6.0(@storybook/test@8.6.0)(react-dom@18.3.1)(react@18.3.1)(storybook@8.6.0)(typescript@5.6.3): + resolution: {integrity: sha512-go0KhCFcOhxkTdaMCxeuJxmc/5CaiaO76+SBzIoPIMWEh9tZQmKb+vojdKcFZswHjZV3zA1uJFUzyympspRffA==} + engines: {node: '>=18.0.0'} + peerDependencies: + '@storybook/test': 8.6.0 + react: ^18.3.1 + react-dom: ^18.3.1 + storybook: ^8.6.0 + typescript: '>= 4.2.x' + peerDependenciesMeta: + '@storybook/test': + optional: true + typescript: + optional: true + dependencies: + '@storybook/components': 8.6.0(storybook@8.6.0) + '@storybook/global': 5.0.0 + '@storybook/manager-api': 8.6.0(storybook@8.6.0) + '@storybook/preview-api': 8.6.0(storybook@8.6.0) + '@storybook/react-dom-shim': 8.6.0(react-dom@18.3.1)(react@18.3.1)(storybook@8.6.0) + '@storybook/test': 8.6.0(storybook@8.6.0) + '@storybook/theming': 8.6.0(storybook@8.6.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + storybook: 8.6.0(prettier@3.5.2) + typescript: 5.6.3 + dev: true + + /@storybook/test@8.6.0(storybook@8.6.0): + resolution: {integrity: sha512-qiiv4wh4FoxTb1PoiA/noo9HcLDqfTwL0svMoNpTy2Bxm6xajgg5zYmmIT4pKyQkMd9pfKKQKILok31VxAj8vw==} + peerDependencies: + storybook: ^8.6.0 + dependencies: + '@storybook/global': 5.0.0 + '@storybook/instrumenter': 8.6.0(storybook@8.6.0) + '@testing-library/dom': 10.4.0 + '@testing-library/jest-dom': 6.5.0 + '@testing-library/user-event': 14.5.2(@testing-library/dom@10.4.0) + '@vitest/expect': 2.0.5 + '@vitest/spy': 2.0.5 + storybook: 8.6.0(prettier@3.5.2) + dev: true + + /@storybook/theming@8.6.0(storybook@8.6.0): + resolution: {integrity: sha512-te7dl0ZXnEyKS4LW+QHc3MP7nurWhWhmClY7G2WKNW9eHenb9zvXkcAQt6c4OWhrJi01CAYoXmZNJP0jEzxRRQ==} + peerDependencies: + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + dependencies: + storybook: 8.6.0(prettier@3.5.2) + dev: true + + /@swc/counter@0.1.3: + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + dev: false + + /@swc/helpers@0.5.15: + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + dependencies: + tslib: 2.8.1 + dev: false + + /@tailwindcss/node@4.1.11: + resolution: {integrity: sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q==} + dependencies: + '@ampproject/remapping': 2.3.0 + enhanced-resolve: 5.18.1 + jiti: 2.5.1 + lightningcss: 1.30.1 + magic-string: 0.30.17 + source-map-js: 1.2.1 + tailwindcss: 4.1.11 + dev: false + + /@tailwindcss/oxide-android-arm64@4.1.11: + resolution: {integrity: sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@tailwindcss/oxide-darwin-arm64@4.1.11: + resolution: {integrity: sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@tailwindcss/oxide-darwin-x64@4.1.11: + resolution: {integrity: sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@tailwindcss/oxide-freebsd-x64@4.1.11: + resolution: {integrity: sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11: + resolution: {integrity: sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@tailwindcss/oxide-linux-arm64-gnu@4.1.11: + resolution: {integrity: sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@tailwindcss/oxide-linux-arm64-musl@4.1.11: + resolution: {integrity: sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@tailwindcss/oxide-linux-x64-gnu@4.1.11: + resolution: {integrity: sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@tailwindcss/oxide-linux-x64-musl@4.1.11: + resolution: {integrity: sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@tailwindcss/oxide-wasm32-wasi@4.1.11: + resolution: {integrity: sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + requiresBuild: true + dev: false + optional: true + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + /@tailwindcss/oxide-win32-arm64-msvc@4.1.11: + resolution: {integrity: sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@tailwindcss/oxide-win32-x64-msvc@4.1.11: + resolution: {integrity: sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@tailwindcss/oxide@4.1.11: + resolution: {integrity: sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg==} + engines: {node: '>= 10'} + requiresBuild: true + dependencies: + detect-libc: 2.0.4 + tar: 7.4.3 + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.11 + '@tailwindcss/oxide-darwin-arm64': 4.1.11 + '@tailwindcss/oxide-darwin-x64': 4.1.11 + '@tailwindcss/oxide-freebsd-x64': 4.1.11 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.11 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.11 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.11 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.11 + '@tailwindcss/oxide-linux-x64-musl': 4.1.11 + '@tailwindcss/oxide-wasm32-wasi': 4.1.11 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.11 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.11 + dev: false + + /@tailwindcss/vite@4.1.11(vite@6.2.0): + resolution: {integrity: sha512-RHYhrR3hku0MJFRV+fN2gNbDNEh3dwKvY8XJvTxCSXeMOsCRSr+uKvDWQcbizrHgjML6ZmTE5OwMrl5wKcujCw==} + peerDependencies: + vite: ^5.2.0 || ^6 || ^7 + dependencies: + '@tailwindcss/node': 4.1.11 + '@tailwindcss/oxide': 4.1.11 + tailwindcss: 4.1.11 + vite: 6.2.0(@types/node@22.13.9) + dev: false + + /@tanstack/query-core@5.67.1: + resolution: {integrity: sha512-AkFmuukVejyqVIjEQoFhLb3q+xHl7JG8G9cANWTMe3s8iKzD9j1VBSYXgCjy6vm6xM8cUCR9zP2yqWxY9pTWOA==} + dev: false + + /@tanstack/query-devtools@5.74.7: + resolution: {integrity: sha512-nSNlfuGdnHf4yB0S+BoNYOE1o3oAH093weAYZolIHfS2stulyA/gWfSk/9H4ZFk5mAAHb5vNqAeJOmbdcGPEQw==} + dev: false + + /@tanstack/react-query-devtools@5.75.5(@tanstack/react-query@5.67.1)(react@18.3.1): + resolution: {integrity: sha512-S31U00nJOQIbxydRH1kOwdLRaLBrda8O5QjzmgkRg60UZzPGdbI6+873Qa0YGUfPeILDbR2ukgWyg7CJQPy4iA==} + peerDependencies: + '@tanstack/react-query': ^5.75.5 + react: ^18.3.1 + dependencies: + '@tanstack/query-devtools': 5.74.7 + '@tanstack/react-query': 5.67.1(react@18.3.1) + react: 18.3.1 + dev: false + + /@tanstack/react-query@5.67.1(react@18.3.1): + resolution: {integrity: sha512-fH5u4JLwB6A+wLFdi8wWBWAYoJV5deYif2OveJ26ktAWjU499uvVFS1wPWnyEyq5LvZX1MZInvv9QRaIZANRaQ==} + peerDependencies: + react: ^18.3.1 + dependencies: + '@tanstack/query-core': 5.67.1 + react: 18.3.1 + dev: false + + /@tanstack/react-table@8.21.2(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-11tNlEDTdIhMJba2RBH+ecJ9l1zgS2kjmexDPAraulc8jeNA4xocSNeyzextT0XJyASil4XsCYlJmf5jEWAtYg==} + engines: {node: '>=12'} + peerDependencies: + react: ^18.3.1 + react-dom: ^18.3.1 + dependencies: + '@tanstack/table-core': 8.21.2 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@tanstack/table-core@8.21.2: + resolution: {integrity: sha512-uvXk/U4cBiFMxt+p9/G7yUWI/UbHYbyghLCjlpWZ3mLeIZiUBSKcUnw9UnKkdRz7Z/N4UBuFLWQdJCjUe7HjvA==} + engines: {node: '>=12'} + dev: false + + /@testing-library/dom@10.4.0: + resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} + engines: {node: '>=18'} + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/runtime': 7.26.9 + '@types/aria-query': 5.0.4 + aria-query: 5.3.0 + chalk: 4.1.2 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + pretty-format: 27.5.1 + dev: true + + /@testing-library/jest-dom@6.5.0: + resolution: {integrity: sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==} + engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + dependencies: + '@adobe/css-tools': 4.4.2 + aria-query: 5.3.2 + chalk: 3.0.0 + css.escape: 1.5.1 + dom-accessibility-api: 0.6.3 + lodash: 4.17.21 + redent: 3.0.0 + dev: true + + /@testing-library/user-event@14.5.2(@testing-library/dom@10.4.0): + resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@testing-library/dom': '>=7.21.4' + dependencies: + '@testing-library/dom': 10.4.0 + dev: true + + /@tinymce/tinymce-react@6.1.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-K0MP3yYVKe8+etUwsg6zyRq+q9TGLaVf005WiBHiB8JZEomAwbBPERGunhU9uOqNQ5gJs8yVOPZ68Xcd1UHclA==} + peerDependencies: + react: ^18.3.1 + react-dom: ^18.3.1 + tinymce: ^7.0.0 || ^6.0.0 || ^5.5.1 + peerDependenciesMeta: + tinymce: + optional: true + dependencies: + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@types/aria-query@5.0.4: + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + dev: true + + /@types/babel__core@7.20.5: + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + dependencies: + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 + dev: true + + /@types/babel__generator@7.6.8: + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + dependencies: + '@babel/types': 7.26.9 + dev: true + + /@types/babel__template@7.4.4: + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + dependencies: + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 + dev: true + + /@types/babel__traverse@7.20.6: + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + dependencies: + '@babel/types': 7.26.9 + dev: true + + /@types/d3-array@3.2.1: + resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} + dev: false + + /@types/d3-color@3.1.3: + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + dev: false + + /@types/d3-ease@3.0.2: + resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + dev: false + + /@types/d3-interpolate@3.0.4: + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + dependencies: + '@types/d3-color': 3.1.3 + dev: false + + /@types/d3-path@3.1.1: + resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==} + dev: false + + /@types/d3-scale@4.0.9: + resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==} + dependencies: + '@types/d3-time': 3.0.4 + dev: false + + /@types/d3-shape@3.1.7: + resolution: {integrity: sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==} + dependencies: + '@types/d3-path': 3.1.1 + dev: false + + /@types/d3-time@3.0.4: + resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} + dev: false + + /@types/d3-timer@3.0.2: + resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + dev: false + + /@types/doctrine@0.0.9: + resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==} + dev: true + + /@types/eslint-scope@3.7.7: + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + dependencies: + '@types/eslint': 9.6.1 + '@types/estree': 1.0.6 + + /@types/eslint@9.6.1: + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + dependencies: + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 + + /@types/estree@1.0.6: + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + /@types/js-cookie@3.0.6: + resolution: {integrity: sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==} + + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + /@types/json5@0.0.29: + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + dev: true + + /@types/mdx@2.0.13: + resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + dev: true + + /@types/node@20.17.19: + resolution: {integrity: sha512-LEwC7o1ifqg/6r2gn9Dns0f1rhK+fPFDoMiceTJ6kWmVk6bgXBI/9IOWfVan4WiAavK9pIVWdX0/e3J+eEUh5A==} + dependencies: + undici-types: 6.19.8 + dev: true + + /@types/node@22.13.5: + resolution: {integrity: sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg==} + dependencies: + undici-types: 6.20.0 + + /@types/node@22.13.9: + resolution: {integrity: sha512-acBjXdRJ3A6Pb3tqnw9HZmyR3Fiol3aGxRCK1x3d+6CDAMjl7I649wpSd+yNURCjbOUGu9tqtLKnTGxmK6CyGw==} + dependencies: + undici-types: 6.20.0 + + /@types/prop-types@15.7.14: + resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} + + /@types/react-dom@18.3.5(@types/react@18.3.18): + resolution: {integrity: sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==} + peerDependencies: + '@types/react': ^18.3.18 + dependencies: + '@types/react': 18.3.18 + + /@types/react@18.3.18: + resolution: {integrity: sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==} + dependencies: + '@types/prop-types': 15.7.14 + csstype: 3.1.3 + + /@types/resolve@1.20.6: + resolution: {integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==} + dev: true + + /@types/uuid@9.0.8: + resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} + dev: true + + /@types/webpack@5.28.5: + resolution: {integrity: sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw==} + dependencies: + '@types/node': 22.13.9 + tapable: 2.2.1 + webpack: 5.98.0 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + - webpack-cli + dev: true + + /@typescript-eslint/eslint-plugin@8.25.0(@typescript-eslint/parser@8.25.0)(eslint@9.21.0)(typescript@5.6.3): + resolution: {integrity: sha512-VM7bpzAe7JO/BFf40pIT1lJqS/z1F8OaSsUB3rpFJucQA4cOSuH2RVVVkFULN+En0Djgr29/jb4EQnedUo95KA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.25.0(eslint@9.21.0)(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.25.0 + '@typescript-eslint/type-utils': 8.25.0(eslint@9.21.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.25.0(eslint@9.21.0)(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.25.0 + eslint: 9.21.0 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 2.0.1(typescript@5.6.3) + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser@8.25.0(eslint@9.21.0)(typescript@5.6.3): + resolution: {integrity: sha512-4gbs64bnbSzu4FpgMiQ1A+D+urxkoJk/kqlDJ2W//5SygaEiAP2B4GoS7TEdxgwol2el03gckFV9lJ4QOMiiHg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + dependencies: + '@typescript-eslint/scope-manager': 8.25.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.25.0 + debug: 4.4.0 + eslint: 9.21.0 + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@8.25.0: + resolution: {integrity: sha512-6PPeiKIGbgStEyt4NNXa2ru5pMzQ8OYKO1hX1z53HMomrmiSB+R5FmChgQAP1ro8jMtNawz+TRQo/cSXrauTpg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/visitor-keys': 8.25.0 + dev: true + + /@typescript-eslint/type-utils@8.25.0(eslint@9.21.0)(typescript@5.6.3): + resolution: {integrity: sha512-d77dHgHWnxmXOPJuDWO4FDWADmGQkN5+tt6SFRZz/RtCWl4pHgFl3+WdYCn16+3teG09DY6XtEpf3gGD0a186g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + dependencies: + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.6.3) + '@typescript-eslint/utils': 8.25.0(eslint@9.21.0)(typescript@5.6.3) + debug: 4.4.0 + eslint: 9.21.0 + ts-api-utils: 2.0.1(typescript@5.6.3) + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types@8.25.0: + resolution: {integrity: sha512-+vUe0Zb4tkNgznQwicsvLUJgZIRs6ITeWSCclX1q85pR1iOiaj+4uZJIUp//Z27QWu5Cseiw3O3AR8hVpax7Aw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: true + + /@typescript-eslint/typescript-estree@8.25.0(typescript@5.6.3): + resolution: {integrity: sha512-ZPaiAKEZ6Blt/TPAx5Ot0EIB/yGtLI2EsGoY6F7XKklfMxYQyvtL+gT/UCqkMzO0BVFHLDlzvFqQzurYahxv9Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.8.0' + dependencies: + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/visitor-keys': 8.25.0 + debug: 4.4.0 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.1 + ts-api-utils: 2.0.1(typescript@5.6.3) + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/typescript-estree@8.25.0(typescript@5.7.3): + resolution: {integrity: sha512-ZPaiAKEZ6Blt/TPAx5Ot0EIB/yGtLI2EsGoY6F7XKklfMxYQyvtL+gT/UCqkMzO0BVFHLDlzvFqQzurYahxv9Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.8.0' + dependencies: + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/visitor-keys': 8.25.0 + debug: 4.4.0 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.1 + ts-api-utils: 2.0.1(typescript@5.7.3) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@8.25.0(eslint@9.21.0)(typescript@5.6.3): + resolution: {integrity: sha512-syqRbrEv0J1wywiLsK60XzHnQe/kRViI3zwFALrNEgnntn1l24Ra2KvOAWwWbWZ1lBZxZljPDGOq967dsl6fkA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0) + '@typescript-eslint/scope-manager': 8.25.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.6.3) + eslint: 9.21.0 + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/visitor-keys@8.25.0: + resolution: {integrity: sha512-kCYXKAum9CecGVHGij7muybDfTS2sD3t0L4bJsEZLkyrXUImiCTq1M3LG2SRtOhiHFwMR9wAFplpT6XHYjTkwQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@typescript-eslint/types': 8.25.0 + eslint-visitor-keys: 4.2.0 + dev: true + + /@vitejs/plugin-react@4.3.4(vite@6.2.0): + resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 + dependencies: + '@babel/core': 7.26.9 + '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.9) + '@types/babel__core': 7.20.5 + react-refresh: 0.14.2 + vite: 6.2.0(@types/node@22.13.5) + transitivePeerDependencies: + - supports-color + dev: true + + /@vitest/expect@2.0.5: + resolution: {integrity: sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==} + dependencies: + '@vitest/spy': 2.0.5 + '@vitest/utils': 2.0.5 + chai: 5.2.0 + tinyrainbow: 1.2.0 + dev: true + + /@vitest/pretty-format@2.0.5: + resolution: {integrity: sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==} + dependencies: + tinyrainbow: 1.2.0 + dev: true + + /@vitest/pretty-format@2.1.9: + resolution: {integrity: sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==} + dependencies: + tinyrainbow: 1.2.0 + dev: true + + /@vitest/spy@2.0.5: + resolution: {integrity: sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==} + dependencies: + tinyspy: 3.0.2 + dev: true + + /@vitest/utils@2.0.5: + resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==} + dependencies: + '@vitest/pretty-format': 2.0.5 + estree-walker: 3.0.3 + loupe: 3.1.3 + tinyrainbow: 1.2.0 + dev: true + + /@vitest/utils@2.1.9: + resolution: {integrity: sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==} + dependencies: + '@vitest/pretty-format': 2.1.9 + loupe: 3.1.3 + tinyrainbow: 1.2.0 + dev: true + + /@vue/compiler-core@3.5.13: + resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} + dependencies: + '@babel/parser': 7.26.9 + '@vue/shared': 3.5.13 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + dev: true + + /@vue/compiler-dom@3.5.13: + resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} + dependencies: + '@vue/compiler-core': 3.5.13 + '@vue/shared': 3.5.13 + dev: true + + /@vue/compiler-sfc@3.5.13: + resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} + dependencies: + '@babel/parser': 7.26.9 + '@vue/compiler-core': 3.5.13 + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-ssr': 3.5.13 + '@vue/shared': 3.5.13 + estree-walker: 2.0.2 + magic-string: 0.30.17 + postcss: 8.5.3 + source-map-js: 1.2.1 + dev: true + + /@vue/compiler-ssr@3.5.13: + resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} + dependencies: + '@vue/compiler-dom': 3.5.13 + '@vue/shared': 3.5.13 + dev: true + + /@vue/shared@3.5.13: + resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} + dev: true + + /@webassemblyjs/ast@1.14.1: + resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} + dependencies: + '@webassemblyjs/helper-numbers': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + + /@webassemblyjs/floating-point-hex-parser@1.13.2: + resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} + + /@webassemblyjs/helper-api-error@1.13.2: + resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} + + /@webassemblyjs/helper-buffer@1.14.1: + resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} + + /@webassemblyjs/helper-numbers@1.13.2: + resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.13.2 + '@webassemblyjs/helper-api-error': 1.13.2 + '@xtuc/long': 4.2.2 + + /@webassemblyjs/helper-wasm-bytecode@1.13.2: + resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} + + /@webassemblyjs/helper-wasm-section@1.14.1: + resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/wasm-gen': 1.14.1 + + /@webassemblyjs/ieee754@1.13.2: + resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} + dependencies: + '@xtuc/ieee754': 1.2.0 + + /@webassemblyjs/leb128@1.13.2: + resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} + dependencies: + '@xtuc/long': 4.2.2 + + /@webassemblyjs/utf8@1.13.2: + resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} + + /@webassemblyjs/wasm-edit@1.14.1: + resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/helper-wasm-section': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-opt': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + '@webassemblyjs/wast-printer': 1.14.1 + + /@webassemblyjs/wasm-gen@1.14.1: + resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + /@webassemblyjs/wasm-opt@1.14.1: + resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + + /@webassemblyjs/wasm-parser@1.14.1: + resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-api-error': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + /@webassemblyjs/wast-printer@1.14.1: + resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@xtuc/long': 4.2.2 + + /@xlsx/xlsx-populate@0.0.8: + resolution: {integrity: sha512-6yu24ePaO3cnAuti77FhVPZvKkzUt6s6x3zJ9wiuBSjR0ImWu7l/SgePelZaf8Oty4SP4rg4vznQVCGQtfzu2A==} + engines: {node: '>=16'} + dev: true + + /@xtuc/ieee754@1.2.0: + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + /@xtuc/long@4.2.2: + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + /acorn-jsx@5.3.2(acorn@8.14.0): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.14.0 + dev: true + + /acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + /adler-32@1.3.1: + resolution: {integrity: sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==} + engines: {node: '>=0.8'} + dev: false + + /ajv-formats@2.1.1(ajv@8.17.1): + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + dependencies: + ajv: 8.17.1 + + /ajv-keywords@5.1.0(ajv@8.17.1): + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + dependencies: + ajv: 8.17.1 + fast-deep-equal: 3.1.3 + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.6 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + /arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /aria-hidden@1.2.4: + resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} + engines: {node: '>=10'} + dependencies: + tslib: 2.8.1 + dev: false + + /aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + dependencies: + dequal: 2.0.3 + dev: true + + /aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + dev: true + + /array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + is-array-buffer: 3.0.5 + dev: true + + /array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + is-string: 1.1.1 + dev: true + + /array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + dev: true + + /array.prototype.findlastindex@1.2.5: + resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + dev: true + + /array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-shim-unscopables: 1.1.0 + dev: true + + /array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-shim-unscopables: 1.1.0 + dev: true + + /array.prototype.tosorted@1.1.4: + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-shim-unscopables: 1.1.0 + dev: true + + /arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + dev: true + + /assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + dev: true + + /ast-module-types@6.0.1: + resolution: {integrity: sha512-WHw67kLXYbZuHTmcdbIrVArCq5wxo6NEuj3hiYAWr8mwJeC+C2mMCIBIWCiDoCye/OF/xelc+teJ1ERoWmnEIA==} + engines: {node: '>=18'} + dev: true + + /ast-types-flow@0.0.8: + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + dev: true + + /ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} + dependencies: + tslib: 2.8.1 + dev: true + + /async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + dev: true + + /async-wave@1.8.6: + resolution: {integrity: sha512-wqWvr0Mrc1TrY92hN9MV0Xebxa6kt+T7QtjZ7FEMv+RUBa/Hfpz/UOgz0rB+7uqVK8TuBSXykOyU/k9gogdLkw==} + dependencies: + is-promise: 4.0.0 + lodash.add: 3.7.0 + lodash.clonedeep: 4.5.0 + lodash.isequal: 4.5.0 + lodash.isfunction: 3.0.9 + lodash.size: 4.2.0 + dev: false + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false + + /attr-accept@2.2.5: + resolution: {integrity: sha512-0bDNnY/u6pPwHDMoF0FieU354oBi0a8rD9FcsLwzcGWbc8KS8KPIi7y+s13OlVY+gMWc/9xEMUgNE6Qm8ZllYQ==} + engines: {node: '>=4'} + dev: false + + /autoprefixer@10.4.20(postcss@8.5.3): + resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.24.4 + caniuse-lite: 1.0.30001701 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.1.1 + postcss: 8.5.3 + postcss-value-parser: 4.2.0 + dev: true + + /available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + dependencies: + possible-typed-array-names: 1.1.0 + dev: true + + /axe-core@4.10.2: + resolution: {integrity: sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==} + engines: {node: '>=4'} + dev: true + + /axios@1.8.1: + resolution: {integrity: sha512-NN+fvwH/kV01dYUQ3PTOZns4LWtWhOFCAhQ/pHb88WQ1hNe5V/dvFwc4VJcDL11LT9xSX0QtsR8sWUuyOuOq7g==} + dependencies: + follow-redirects: 1.15.9 + form-data: 4.0.2 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + + /axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /base64-arraybuffer@1.0.2: + resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==} + engines: {node: '>= 0.6.0'} + dev: false + + /better-opn@3.0.2: + resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==} + engines: {node: '>=12.0.0'} + dependencies: + open: 8.4.2 + dev: true + + /binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + + /braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.1.1 + + /browser-assert@1.2.1: + resolution: {integrity: sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==} + dev: true + + /browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001701 + electron-to-chromium: 1.5.107 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.24.4) + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + /bundle-require@5.1.0(esbuild@0.24.2): + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.18' + dependencies: + esbuild: 0.24.2 + load-tsconfig: 0.2.5 + dev: true + + /busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + dependencies: + streamsearch: 1.1.0 + dev: false + + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + + /call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + /call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + dev: true + + /call-bound@1.0.3: + resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + dev: true + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + /camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + dev: false + + /caniuse-lite@1.0.30001701: + resolution: {integrity: sha512-faRs/AW3jA9nTwmJBSO1PQ6L/EOgsB5HMQQq4iCu5zhPgVVgO/pZRHlmatwijZKetFw8/Pr4q6dEN8sJuq8qTw==} + + /cfb@1.2.2: + resolution: {integrity: sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==} + engines: {node: '>=0.8'} + dependencies: + adler-32: 1.3.1 + crc-32: 1.2.2 + dev: false + + /chai@5.2.0: + resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} + engines: {node: '>=12'} + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.3 + pathval: 2.0.0 + dev: true + + /chalk@3.0.0: + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chart.js@4.4.8: + resolution: {integrity: sha512-IkGZlVpXP+83QpMm4uxEiGqSI7jFizwVtF3+n5Pc3k7sMO+tkd0qxh2OzLhenM0K80xtmAONWGBn082EiBQSDA==} + engines: {pnpm: '>=8'} + dependencies: + '@kurkle/color': 0.3.4 + dev: false + + /check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + dev: true + + /chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + /chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + dependencies: + readdirp: 4.1.2 + dev: true + + /chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + dev: false + + /chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + + /class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + dependencies: + clsx: 2.1.1 + dev: false + + /client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + dev: false + + /cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + dev: false + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + dev: false + + /codepage@1.15.0: + resolution: {integrity: sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==} + engines: {node: '>=0.8'} + dev: false + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + requiresBuild: true + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + dev: false + optional: true + + /color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + requiresBuild: true + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + dev: false + optional: true + + /combine-errors@3.0.3: + resolution: {integrity: sha512-C8ikRNRMygCwaTx+Ek3Yr+OuZzgZjduCOfSQBjbM8V3MfgcjSTeto/GXP6PAwKvJz/v15b7GHZvx5rOlczFw/Q==} + dependencies: + custom-error-instance: 2.1.1 + lodash.uniqby: 4.5.0 + dev: false + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: false + + /commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + dev: true + + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /consola@3.4.0: + resolution: {integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==} + engines: {node: ^14.18.0 || >=16.10.0} + dev: true + + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: false + + /cosmiconfig@9.0.0(typescript@5.6.3): + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + parse-json: 5.2.0 + typescript: 5.6.3 + dev: true + + /crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + dev: false + + /cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + /css-line-break@2.1.0: + resolution: {integrity: sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==} + dependencies: + utrie: 1.0.2 + dev: false + + /css.escape@1.5.1: + resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + dev: true + + /csscolorparser@1.0.3: + resolution: {integrity: sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w==} + dev: false + + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + /csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + /custom-error-instance@2.1.1: + resolution: {integrity: sha512-p6JFxJc3M4OTD2li2qaHkDCw9SfMw82Ldr6OC9Je1aXiGfhx2W8p3GaoeaGrPJTUN9NirTM/KTxHWMUdR1rsUg==} + dev: false + + /d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + dependencies: + internmap: 2.0.3 + dev: false + + /d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + dev: false + + /d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + dev: false + + /d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + dev: false + + /d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + dependencies: + d3-color: 3.1.0 + dev: false + + /d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + dev: false + + /d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.0 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + dev: false + + /d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + dependencies: + d3-path: 3.1.0 + dev: false + + /d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + dependencies: + d3-time: 3.1.0 + dev: false + + /d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + dependencies: + d3-array: 3.2.4 + dev: false + + /d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + dev: false + + /damerau-levenshtein@1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + dev: true + + /data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-data-view: 1.0.2 + dev: true + + /data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-data-view: 1.0.2 + dev: true + + /data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-data-view: 1.0.2 + dev: true + + /date-fns-jalali@4.1.0-0: + resolution: {integrity: sha512-hTIP/z+t+qKwBDcmmsnmjWTduxCg+5KfdqWQvb2X/8C9+knYY6epN/pfxdDuyVlSVeFz0sM5eEfwIUQ70U4ckg==} + dev: false + + /date-fns@3.6.0: + resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} + dev: false + + /date-fns@4.1.0: + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} + dev: false + + /dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + dev: false + + /debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + + /debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + + /decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + dev: false + + /decimal.js-light@2.5.1: + resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} + dev: false + + /deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + dev: true + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + dev: true + + /define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + dev: true + + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + dev: true + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: false + + /dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + dev: true + + /detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + requiresBuild: true + dev: false + + /detect-libc@2.0.4: + resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} + engines: {node: '>=8'} + dev: false + + /detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + dev: false + + /detective-amd@6.0.1: + resolution: {integrity: sha512-TtyZ3OhwUoEEIhTFoc1C9IyJIud3y+xYkSRjmvCt65+ycQuc3VcBrPRTMWoO/AnuCyOB8T5gky+xf7Igxtjd3g==} + engines: {node: '>=18'} + hasBin: true + dependencies: + ast-module-types: 6.0.1 + escodegen: 2.1.0 + get-amd-module-type: 6.0.1 + node-source-walk: 7.0.1 + dev: true + + /detective-cjs@6.0.1: + resolution: {integrity: sha512-tLTQsWvd2WMcmn/60T2inEJNhJoi7a//PQ7DwRKEj1yEeiQs4mrONgsUtEJKnZmrGWBBmE0kJ1vqOG/NAxwaJw==} + engines: {node: '>=18'} + dependencies: + ast-module-types: 6.0.1 + node-source-walk: 7.0.1 + dev: true + + /detective-es6@5.0.1: + resolution: {integrity: sha512-XusTPuewnSUdoxRSx8OOI6xIA/uld/wMQwYsouvFN2LAg7HgP06NF1lHRV3x6BZxyL2Kkoih4ewcq8hcbGtwew==} + engines: {node: '>=18'} + dependencies: + node-source-walk: 7.0.1 + dev: true + + /detective-postcss@7.0.1(postcss@8.5.3): + resolution: {integrity: sha512-bEOVpHU9picRZux5XnwGsmCN4+8oZo7vSW0O0/Enq/TO5R2pIAP2279NsszpJR7ocnQt4WXU0+nnh/0JuK4KHQ==} + engines: {node: ^14.0.0 || >=16.0.0} + peerDependencies: + postcss: ^8.4.47 + dependencies: + is-url: 1.2.4 + postcss: 8.5.3 + postcss-values-parser: 6.0.2(postcss@8.5.3) + dev: true + + /detective-sass@6.0.1: + resolution: {integrity: sha512-jSGPO8QDy7K7pztUmGC6aiHkexBQT4GIH+mBAL9ZyBmnUIOFbkfZnO8wPRRJFP/QP83irObgsZHCoDHZ173tRw==} + engines: {node: '>=18'} + dependencies: + gonzales-pe: 4.3.0 + node-source-walk: 7.0.1 + dev: true + + /detective-scss@5.0.1: + resolution: {integrity: sha512-MAyPYRgS6DCiS6n6AoSBJXLGVOydsr9huwXORUlJ37K3YLyiN0vYHpzs3AdJOgHobBfispokoqrEon9rbmKacg==} + engines: {node: '>=18'} + dependencies: + gonzales-pe: 4.3.0 + node-source-walk: 7.0.1 + dev: true + + /detective-stylus@5.0.1: + resolution: {integrity: sha512-Dgn0bUqdGbE3oZJ+WCKf8Dmu7VWLcmRJGc6RCzBgG31DLIyai9WAoEhYRgIHpt/BCRMrnXLbGWGPQuBUrnF0TA==} + engines: {node: '>=18'} + dev: true + + /detective-typescript@14.0.0(typescript@5.7.3): + resolution: {integrity: sha512-pgN43/80MmWVSEi5LUuiVvO/0a9ss5V7fwVfrJ4QzAQRd3cwqU1SfWGXJFcNKUqoD5cS+uIovhw5t/0rSeC5Mw==} + engines: {node: '>=18'} + peerDependencies: + typescript: ^5.4.4 + dependencies: + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.7.3) + ast-module-types: 6.0.1 + node-source-walk: 7.0.1 + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + dev: true + + /detective-vue2@2.2.0(typescript@5.7.3): + resolution: {integrity: sha512-sVg/t6O2z1zna8a/UIV6xL5KUa2cMTQbdTIIvqNM0NIPswp52fe43Nwmbahzj3ww4D844u/vC2PYfiGLvD3zFA==} + engines: {node: '>=18'} + peerDependencies: + typescript: ^5.4.4 + dependencies: + '@dependents/detective-less': 5.0.1 + '@vue/compiler-sfc': 3.5.13 + detective-es6: 5.0.1 + detective-sass: 6.0.1 + detective-scss: 5.0.1 + detective-stylus: 5.0.1 + detective-typescript: 14.0.0(typescript@5.7.3) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + dev: true + + /didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + /dijkstrajs@1.0.3: + resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} + dev: false + + /dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + /dnd-core@16.0.1: + resolution: {integrity: sha512-HK294sl7tbw6F6IeuK16YSBUoorvHpY8RHO+9yFfaJyCDVb6n7PRcezrOEOa2SBCqiYpemh5Jx20ZcjKdFAVng==} + dependencies: + '@react-dnd/asap': 5.0.2 + '@react-dnd/invariant': 4.0.2 + redux: 4.2.1 + dev: false + + /dnd-multi-backend@8.1.2(dnd-core@16.0.1): + resolution: {integrity: sha512-KPDVEsiM+6gNEegqZYTWJQgJxYV4vB91tUrvoKJjaS0wwWqT/jNU0P7xJAwCue/cbasJNvk2dFZH7tC+bjX1Rg==} + peerDependencies: + dnd-core: ^16.0.1 + dependencies: + dnd-core: 16.0.1 + dev: false + + /doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + dev: true + + /dom-accessibility-api@0.6.3: + resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + dev: true + + /dom-helpers@5.2.1: + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + dependencies: + '@babel/runtime': 7.26.9 + csstype: 3.1.3 + dev: false + + /dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + /earcut@2.2.4: + resolution: {integrity: sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==} + dev: false + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + /effector@23.3.0: + resolution: {integrity: sha512-ZnQ3POaNARlxT9+kxrK58PO/xmStBdxfPq0rceglENg8Ryxx/yx+1RsV/ziznrFPhLkZYc7NdDA1OKxnMW98/g==} + engines: {node: '>=11.0.0'} + dev: true + + /electron-to-chromium@1.5.107: + resolution: {integrity: sha512-dJr1o6yCntRkXElnhsHh1bAV19bo/hKyFf7tCcWgpXbuFIF0Lakjgqv5LRfSDaNzAII8Fnxg2tqgHkgCvxdbxw==} + + /embla-carousel-autoplay@8.6.0(embla-carousel@8.6.0): + resolution: {integrity: sha512-OBu5G3nwaSXkZCo1A6LTaFMZ8EpkYbwIaH+bPqdBnDGQ2fh4+NbzjXjs2SktoPNKCtflfVMc75njaDHOYXcrsA==} + peerDependencies: + embla-carousel: 8.6.0 + dependencies: + embla-carousel: 8.6.0 + dev: false + + /embla-carousel-react@8.6.0(react@18.3.1): + resolution: {integrity: sha512-0/PjqU7geVmo6F734pmPqpyHqiM99olvyecY7zdweCw+6tKEXnrE90pBiBbMMU8s5tICemzpQ3hi5EpxzGW+JA==} + peerDependencies: + react: ^18.3.1 + dependencies: + embla-carousel: 8.6.0 + embla-carousel-reactive-utils: 8.6.0(embla-carousel@8.6.0) + react: 18.3.1 + dev: false + + /embla-carousel-reactive-utils@8.6.0(embla-carousel@8.6.0): + resolution: {integrity: sha512-fMVUDUEx0/uIEDM0Mz3dHznDhfX+znCCDCeIophYb1QGVM7YThSWX+wz11zlYwWFOr74b4QLGg0hrGPJeG2s4A==} + peerDependencies: + embla-carousel: 8.6.0 + dependencies: + embla-carousel: 8.6.0 + dev: false + + /embla-carousel@8.6.0: + resolution: {integrity: sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==} + dev: false + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + /empathic@1.0.0: + resolution: {integrity: sha512-qtKgI1Mv8rTacvpaTkh28HM2Lbf+IOjXb7rhpt/42kZxRm8TBb/IVlo5iL2ztT19kc/EHAFN0fZ641avlXAgdg==} + engines: {node: '>=16'} + dev: true + + /enhanced-resolve@5.18.1: + resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: true + + /env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + dev: true + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: true + + /es-abstract@1.23.9: + resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-regex: 1.2.1 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.18 + dev: true + + /es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + /es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + /es-iterator-helpers@1.2.1: + resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-set-tostringtag: 2.1.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + iterator.prototype: 1.1.5 + safe-array-concat: 1.1.3 + dev: true + + /es-module-lexer@1.6.0: + resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} + + /es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + + /es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + /es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + dependencies: + hasown: 2.0.2 + dev: true + + /es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + dev: true + + /esbuild-register@3.6.0(esbuild@0.25.0): + resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} + peerDependencies: + esbuild: '>=0.12 <1' + dependencies: + debug: 4.4.0 + esbuild: 0.25.0 + transitivePeerDependencies: + - supports-color + dev: true + + /esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + dev: true + + /esbuild@0.24.2: + resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} + engines: {node: '>=18'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.24.2 + '@esbuild/android-arm': 0.24.2 + '@esbuild/android-arm64': 0.24.2 + '@esbuild/android-x64': 0.24.2 + '@esbuild/darwin-arm64': 0.24.2 + '@esbuild/darwin-x64': 0.24.2 + '@esbuild/freebsd-arm64': 0.24.2 + '@esbuild/freebsd-x64': 0.24.2 + '@esbuild/linux-arm': 0.24.2 + '@esbuild/linux-arm64': 0.24.2 + '@esbuild/linux-ia32': 0.24.2 + '@esbuild/linux-loong64': 0.24.2 + '@esbuild/linux-mips64el': 0.24.2 + '@esbuild/linux-ppc64': 0.24.2 + '@esbuild/linux-riscv64': 0.24.2 + '@esbuild/linux-s390x': 0.24.2 + '@esbuild/linux-x64': 0.24.2 + '@esbuild/netbsd-arm64': 0.24.2 + '@esbuild/netbsd-x64': 0.24.2 + '@esbuild/openbsd-arm64': 0.24.2 + '@esbuild/openbsd-x64': 0.24.2 + '@esbuild/sunos-x64': 0.24.2 + '@esbuild/win32-arm64': 0.24.2 + '@esbuild/win32-ia32': 0.24.2 + '@esbuild/win32-x64': 0.24.2 + dev: true + + /esbuild@0.25.0: + resolution: {integrity: sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==} + engines: {node: '>=18'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.0 + '@esbuild/android-arm': 0.25.0 + '@esbuild/android-arm64': 0.25.0 + '@esbuild/android-x64': 0.25.0 + '@esbuild/darwin-arm64': 0.25.0 + '@esbuild/darwin-x64': 0.25.0 + '@esbuild/freebsd-arm64': 0.25.0 + '@esbuild/freebsd-x64': 0.25.0 + '@esbuild/linux-arm': 0.25.0 + '@esbuild/linux-arm64': 0.25.0 + '@esbuild/linux-ia32': 0.25.0 + '@esbuild/linux-loong64': 0.25.0 + '@esbuild/linux-mips64el': 0.25.0 + '@esbuild/linux-ppc64': 0.25.0 + '@esbuild/linux-riscv64': 0.25.0 + '@esbuild/linux-s390x': 0.25.0 + '@esbuild/linux-x64': 0.25.0 + '@esbuild/netbsd-arm64': 0.25.0 + '@esbuild/netbsd-x64': 0.25.0 + '@esbuild/openbsd-arm64': 0.25.0 + '@esbuild/openbsd-x64': 0.25.0 + '@esbuild/sunos-x64': 0.25.0 + '@esbuild/win32-arm64': 0.25.0 + '@esbuild/win32-ia32': 0.25.0 + '@esbuild/win32-x64': 0.25.0 + + /escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + dev: true + + /eslint-config-next@15.1.7(eslint@9.21.0)(typescript@5.6.3): + resolution: {integrity: sha512-zXoMnYUIy3XHaAoOhrcYkT9UQWvXqWju2K7NNsmb5wd/7XESDwof61eUdW4QhERr3eJ9Ko/vnXqIrj8kk/drYw==} + peerDependencies: + eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 + typescript: '>=3.3.1' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@next/eslint-plugin-next': 15.1.7 + '@rushstack/eslint-patch': 1.10.5 + '@typescript-eslint/eslint-plugin': 8.25.0(@typescript-eslint/parser@8.25.0)(eslint@9.21.0)(typescript@5.6.3) + '@typescript-eslint/parser': 8.25.0(eslint@9.21.0)(typescript@5.6.3) + eslint: 9.21.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.25.0)(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.21.0) + eslint-plugin-react: 7.37.4(eslint@9.21.0) + eslint-plugin-react-hooks: 5.1.0(eslint@9.21.0) + typescript: 5.6.3 + transitivePeerDependencies: + - eslint-import-resolver-webpack + - eslint-plugin-import-x + - supports-color + dev: true + + /eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + dependencies: + debug: 3.2.7 + is-core-module: 2.16.1 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0): + resolution: {integrity: sha512-A0bu4Ks2QqDWNpeEgTQMPTngaMhuDu4yv6xpftBMAf+1ziXnpx+eSR1WRfoPTe2BAiAjHFZ7kSNx1fvr5g5pmQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + eslint-plugin-import-x: '*' + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true + dependencies: + '@nolyfill/is-core-module': 1.0.39 + debug: 4.4.0 + enhanced-resolve: 5.18.1 + eslint: 9.21.0 + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.25.0)(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0) + get-tsconfig: 4.10.0 + is-bun-module: 1.3.0 + stable-hash: 0.0.4 + tinyglobby: 0.2.12 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-module-utils@2.12.0(@typescript-eslint/parser@8.25.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0): + resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 8.25.0(eslint@9.21.0)(typescript@5.6.3) + debug: 3.2.7 + eslint: 9.21.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0) + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.25.0)(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0): + resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@rtsao/scc': 1.1.0 + '@typescript-eslint/parser': 8.25.0(eslint@9.21.0)(typescript@5.6.3) + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 9.21.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.25.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0) + hasown: 2.0.2 + is-core-module: 2.16.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 + semver: 6.3.1 + string.prototype.trimend: 1.0.9 + tsconfig-paths: 3.15.0 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-plugin-jsx-a11y@6.10.2(eslint@9.21.0): + resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 + dependencies: + aria-query: 5.3.2 + array-includes: 3.1.8 + array.prototype.flatmap: 1.3.3 + ast-types-flow: 0.0.8 + axe-core: 4.10.2 + axobject-query: 4.1.0 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + eslint: 9.21.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + safe-regex-test: 1.1.0 + string.prototype.includes: 2.0.1 + dev: true + + /eslint-plugin-react-hooks@5.1.0(eslint@9.21.0): + resolution: {integrity: sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + dependencies: + eslint: 9.21.0 + dev: true + + /eslint-plugin-react-refresh@0.4.19(eslint@9.21.0): + resolution: {integrity: sha512-eyy8pcr/YxSYjBoqIFSrlbn9i/xvxUFa8CjzAYo9cFjgGXqq1hyjihcpZvxRLalpaWmueWR81xn7vuKmAFijDQ==} + peerDependencies: + eslint: '>=8.40' + dependencies: + eslint: 9.21.0 + dev: true + + /eslint-plugin-react@7.37.4(eslint@9.21.0): + resolution: {integrity: sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + dependencies: + array-includes: 3.1.8 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.3 + array.prototype.tosorted: 1.1.4 + doctrine: 2.1.0 + es-iterator-helpers: 1.2.1 + eslint: 9.21.0 + estraverse: 5.3.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + object.values: 1.2.1 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.12 + string.prototype.repeat: 1.0.0 + dev: true + + /eslint-plugin-storybook@0.11.3(eslint@9.21.0)(typescript@5.6.3): + resolution: {integrity: sha512-gDBnBZiyk4ZG7OMSJRaHBcuJ8TMCXgMIQ3HB/XvtN0SvSio2ZOIeYD3yGj39g/DbyCe/Bg02j/ip9tWlDEs82A==} + engines: {node: '>= 18'} + peerDependencies: + eslint: '>=8' + typescript: '>=4.8.4 <5.8.0' + dependencies: + '@storybook/csf': 0.1.13 + '@typescript-eslint/utils': 8.25.0(eslint@9.21.0)(typescript@5.6.3) + eslint: 9.21.0 + ts-dedent: 2.2.0 + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + /eslint-scope@8.2.0: + resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: true + + /eslint@9.21.0: + resolution: {integrity: sha512-KjeihdFqTPhOMXTt7StsDxriV4n66ueuF/jfPNC3j/lduHwr/ijDwJMsF+wyMJethgiKi5wniIE243vi07d3pg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.19.2 + '@eslint/core': 0.12.0 + '@eslint/eslintrc': 3.3.0 + '@eslint/js': 9.21.0 + '@eslint/plugin-kit': 0.2.7 + '@humanfs/node': 0.16.6 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.2 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.0 + escape-string-regexp: 4.0.0 + eslint-scope: 8.2.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 4.2.0 + dev: true + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + + /estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: true + + /estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + dependencies: + '@types/estree': 1.0.6 + dev: true + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + dev: false + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + /fast-equals@5.2.2: + resolution: {integrity: sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==} + engines: {node: '>=6.0.0'} + dev: false + + /fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + dev: true + + /fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fast-uri@3.0.6: + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + + /fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + dev: true + + /fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + dependencies: + reusify: 1.1.0 + + /fdir@6.4.3(picomatch@4.0.2): + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + dependencies: + picomatch: 4.0.2 + dev: true + + /file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + dependencies: + flat-cache: 4.0.1 + dev: true + + /file-selector@2.1.2: + resolution: {integrity: sha512-QgXo+mXTe8ljeqUFaX3QVHc5osSItJ/Km+xpocx0aSqWGMSCf6qYs/VnzZgS864Pjn5iceMRFigeAV7AfTlaig==} + engines: {node: '>= 12'} + dependencies: + tslib: 2.8.1 + dev: false + + /fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: false + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + dev: true + + /flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + dev: true + + /follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: false + + /for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + dev: true + + /foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + /form-data@4.0.2: + resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + mime-types: 2.1.35 + dev: false + + /frac@1.1.2: + resolution: {integrity: sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==} + engines: {node: '>=0.8'} + dev: false + + /fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + dev: true + + /framer-motion@11.18.2(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-5F5Och7wrvtLVElIpclDT0CBzMVg3dL22B64aZwHtsIY8RB4mXICLrkajK4G9R+ieSAGcgrLeae2SeUTg2pr6w==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + dependencies: + motion-dom: 11.18.1 + motion-utils: 11.18.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tslib: 2.8.1 + dev: false + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + /function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + dev: true + + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + + /geotiff@2.1.3: + resolution: {integrity: sha512-PT6uoF5a1+kbC3tHmZSUsLHBp2QJlHasxxxxPW47QIY1VBKpFB+FcDvX+MxER6UzgLQZ0xDzJ9s48B9JbOCTqA==} + engines: {node: '>=10.19'} + dependencies: + '@petamoriken/float16': 3.9.2 + lerc: 3.0.0 + pako: 2.1.0 + parse-headers: 2.0.6 + quick-lru: 6.1.2 + web-worker: 1.5.0 + xml-utils: 1.10.2 + zstddec: 0.1.0 + dev: false + + /get-amd-module-type@6.0.1: + resolution: {integrity: sha512-MtjsmYiCXcYDDrGqtNbeIYdAl85n+5mSv2r3FbzER/YV3ZILw4HNNIw34HuV5pyl0jzs6GFYU1VHVEefhgcNHQ==} + engines: {node: '>=18'} + dependencies: + ast-module-types: 6.0.1 + node-source-walk: 7.0.1 + dev: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + /get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + /get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + dev: false + + /get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + /get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + dev: true + + /get-tsconfig@4.10.0: + resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} + dependencies: + resolve-pkg-maps: 1.0.0 + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + + /glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + /glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + + /globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + dev: true + + /globals@15.15.0: + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + engines: {node: '>=18'} + dev: true + + /globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + dev: true + + /globby@14.1.0: + resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} + engines: {node: '>=18'} + dependencies: + '@sindresorhus/merge-streams': 2.3.0 + fast-glob: 3.3.3 + ignore: 7.0.3 + path-type: 6.0.0 + slash: 5.1.0 + unicorn-magic: 0.3.0 + dev: true + + /globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + dev: true + + /gonzales-pe@4.3.0: + resolution: {integrity: sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==} + engines: {node: '>=0.6.0'} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /goober@2.1.16(csstype@3.1.3): + resolution: {integrity: sha512-erjk19y1U33+XAMe1VTvIONHYoSqE4iS7BYUZfHaqeohLmnC0FdxEh7rQU+6MZ4OajItzjZFSRtVANrQwNq6/g==} + peerDependencies: + csstype: ^3.0.10 + dependencies: + csstype: 3.1.3 + dev: false + + /gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true + + /has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + /has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + dependencies: + es-define-property: 1.0.1 + dev: true + + /has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + dependencies: + dunder-proto: 1.0.1 + dev: true + + /has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + /has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.1.0 + + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + + /hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + dependencies: + react-is: 16.13.1 + dev: false + + /html-parse-stringify@3.0.1: + resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==} + dependencies: + void-elements: 3.1.0 + dev: false + + /html2canvas@1.4.1: + resolution: {integrity: sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==} + engines: {node: '>=8.0.0'} + dependencies: + css-line-break: 2.1.0 + text-segmentation: 1.0.3 + dev: false + + /i18next@25.3.2(typescript@5.6.3): + resolution: {integrity: sha512-JSnbZDxRVbphc5jiptxr3o2zocy5dEqpVm9qCGdJwRNO+9saUJS0/u4LnM/13C23fUEWxAylPqKU/NpMV/IjqA==} + peerDependencies: + typescript: ^5 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@babel/runtime': 7.28.2 + typescript: 5.6.3 + dev: false + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: false + + /ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + dev: true + + /ignore@7.0.3: + resolution: {integrity: sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==} + engines: {node: '>= 4'} + dev: true + + /immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + dev: false + + /immer@10.1.1: + resolution: {integrity: sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==} + dev: true + + /import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: true + + /inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + dev: false + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + dev: true + + /internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + dev: false + + /is-arguments@1.2.0: + resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + dev: true + + /is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.3.0 + dev: true + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: true + + /is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + requiresBuild: true + dev: false + optional: true + + /is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + dependencies: + async-function: 1.0.0 + call-bound: 1.0.3 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + dev: true + + /is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + dependencies: + has-bigints: 1.1.0 + dev: true + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.3.0 + + /is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + dev: true + + /is-bun-module@1.3.0: + resolution: {integrity: sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==} + dependencies: + semver: 7.7.1 + dev: true + + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: true + + /is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + dependencies: + hasown: 2.0.2 + + /is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + dev: true + + /is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + dev: true + + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + /is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + /is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + + /is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + dev: true + + /is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + /is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + dev: false + + /is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + dev: true + + /is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + dev: true + + /is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + dev: true + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: false + + /is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + dev: true + + /is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + dev: true + + /is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.18 + dev: true + + /is-url-superb@4.0.0: + resolution: {integrity: sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA==} + engines: {node: '>=10'} + dev: true + + /is-url@1.2.4: + resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} + dev: true + + /is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + dev: true + + /is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + dev: true + + /is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + get-intrinsic: 1.3.0 + dev: true + + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + dev: true + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: false + + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + /iterator.prototype@1.1.5: + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + has-symbols: 1.1.0 + set-function-name: 2.0.2 + dev: true + + /jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + /jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 22.13.9 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + /jiti@1.21.7: + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + hasBin: true + + /jiti@2.5.1: + resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} + hasBin: true + dev: false + + /joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + dev: true + + /js-base64@3.7.7: + resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} + dev: false + + /js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + dev: false + + /js-sha512@0.9.0: + resolution: {integrity: sha512-mirki9WS/SUahm+1TbAPkqvbCiCfOAAsyXeHxK1UkullnJVVqoJG2pL9ObvT05CN+tM7fxhfYm0NbXn+1hWoZg==} + dev: false + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /jsdoc-type-pratt-parser@4.1.0: + resolution: {integrity: sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==} + engines: {node: '>=12.0.0'} + dev: true + + /jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json-stringify-pretty-compact@2.0.0: + resolution: {integrity: sha512-WRitRfs6BGq4q8gTgOy4ek7iPFXjbra0H3PmDLKm2xnZ+Gh1HUhiKGgCZkSPNULlP7mvfu6FV/mOLhCarspADQ==} + dev: false + + /json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + dependencies: + array-includes: 3.1.8 + array.prototype.flat: 1.3.3 + object.assign: 4.1.7 + object.values: 1.2.1 + dev: true + + /jszip@3.10.1: + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + dev: false + + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + dev: true + + /language-subtag-registry@0.3.23: + resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} + dev: true + + /language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} + dependencies: + language-subtag-registry: 0.3.23 + dev: true + + /lerc@3.0.0: + resolution: {integrity: sha512-Rm4J/WaHhRa93nCN2mwWDZFoRVF18G1f47C+kvQWyHGEZxFpTUi73p7lMVSAndyxGt6lJ2/CFbOcf9ra5p8aww==} + dev: false + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /libphonenumber-js@1.12.10: + resolution: {integrity: sha512-E91vHJD61jekHHR/RF/E83T/CMoaLXT7cwYA75T4gim4FZjnM6hbJjVIGg7chqlSqRsSvQ3izGmOjHy1SQzcGQ==} + dev: false + + /lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + dependencies: + immediate: 3.0.6 + dev: false + + /lightningcss-darwin-arm64@1.30.1: + resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /lightningcss-darwin-x64@1.30.1: + resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /lightningcss-freebsd-x64@1.30.1: + resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-arm-gnueabihf@1.30.1: + resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-arm64-gnu@1.30.1: + resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-arm64-musl@1.30.1: + resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-x64-gnu@1.30.1: + resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-x64-musl@1.30.1: + resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-win32-arm64-msvc@1.30.1: + resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /lightningcss-win32-x64-msvc@1.30.1: + resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /lightningcss@1.30.1: + resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} + engines: {node: '>= 12.0.0'} + dependencies: + detect-libc: 2.0.3 + optionalDependencies: + lightningcss-darwin-arm64: 1.30.1 + lightningcss-darwin-x64: 1.30.1 + lightningcss-freebsd-x64: 1.30.1 + lightningcss-linux-arm-gnueabihf: 1.30.1 + lightningcss-linux-arm64-gnu: 1.30.1 + lightningcss-linux-arm64-musl: 1.30.1 + lightningcss-linux-x64-gnu: 1.30.1 + lightningcss-linux-x64-musl: 1.30.1 + lightningcss-win32-arm64-msvc: 1.30.1 + lightningcss-win32-x64-msvc: 1.30.1 + dev: false + + /lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + /load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: false + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + dev: true + + /lodash._baseiteratee@4.7.0: + resolution: {integrity: sha512-nqB9M+wITz0BX/Q2xg6fQ8mLkyfF7MU7eE+MNBNjTHFKeKaZAPEzEg+E8LWxKWf1DQVflNEn9N49yAuqKh2mWQ==} + dependencies: + lodash._stringtopath: 4.8.0 + dev: false + + /lodash._basetostring@4.12.0: + resolution: {integrity: sha512-SwcRIbyxnN6CFEEK4K1y+zuApvWdpQdBHM/swxP962s8HIxPO3alBH5t3m/dl+f4CMUug6sJb7Pww8d13/9WSw==} + dev: false + + /lodash._baseuniq@4.6.0: + resolution: {integrity: sha512-Ja1YevpHZctlI5beLA7oc5KNDhGcPixFhcqSiORHNsp/1QTv7amAXzw+gu4YOvErqVlMVyIJGgtzeepCnnur0A==} + dependencies: + lodash._createset: 4.0.3 + lodash._root: 3.0.1 + dev: false + + /lodash._createset@4.0.3: + resolution: {integrity: sha512-GTkC6YMprrJZCYU3zcqZj+jkXkrXzq3IPBcF/fIPpNEAB4hZEtXU8zp/RwKOvZl43NUmwDbyRk3+ZTbeRdEBXA==} + dev: false + + /lodash._root@3.0.1: + resolution: {integrity: sha512-O0pWuFSK6x4EXhM1dhZ8gchNtG7JMqBtrHdoUFUWXD7dJnNSUze1GuyQr5sOs0aCvgGeI3o/OJW8f4ca7FDxmQ==} + dev: false + + /lodash._stringtopath@4.8.0: + resolution: {integrity: sha512-SXL66C731p0xPDC5LZg4wI5H+dJo/EO4KTqOMwLYCH3+FmmfAKJEZCm6ohGpI+T1xwsDsJCfL4OnhorllvlTPQ==} + dependencies: + lodash._basetostring: 4.12.0 + dev: false + + /lodash.add@3.7.0: + resolution: {integrity: sha512-/uxUZkB6vYiPoGSXADJJE+Ee4W2vU+bxZOFdvJdx+mDgv+qyAO76sWD84Q4FxsMgTjC1+gVFC9YNhdG243QRDw==} + dev: false + + /lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + dev: false + + /lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. + dev: false + + /lodash.isfunction@3.0.9: + resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} + dev: false + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lodash.size@4.2.0: + resolution: {integrity: sha512-wbu3SF1XC5ijqm0piNxw59yCbuUf2kaShumYBLWUrcCvwh6C8odz6SY/wGVzCWTQTFL/1Ygbvqg2eLtspUVVAQ==} + dev: false + + /lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + dev: true + + /lodash.throttle@4.1.1: + resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + dev: false + + /lodash.uniqby@4.5.0: + resolution: {integrity: sha512-IRt7cfTtHy6f1aRVA5n7kT8rgN3N1nH6MOWLcHfpWG2SH19E3JksLK38MktLxZDhlAjCP9jpIXkOnRXlu6oByQ==} + dependencies: + lodash._baseiteratee: 4.7.0 + lodash._baseuniq: 4.6.0 + dev: false + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + + /loupe@3.1.3: + resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} + dev: true + + /lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: true + + /lucide-react@0.474.0(react@18.3.1): + resolution: {integrity: sha512-CmghgHkh0OJNmxGKWc0qfPJCYHASPMVSyGY8fj3xgk4v84ItqDg64JNKFZn5hC6E0vHi6gxnbCgwhyVB09wQtA==} + peerDependencies: + react: ^18.3.1 + dependencies: + react: 18.3.1 + dev: false + + /lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + dev: true + + /magic-string@0.27.0: + resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + dev: true + + /magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + /map-or-similar@1.5.0: + resolution: {integrity: sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==} + dev: true + + /mapbox-to-css-font@2.4.5: + resolution: {integrity: sha512-VJ6nB8emkO9VODI0Fk+TQ/0zKBTqmf/Pkt8Xv0kHstoc0iXRajA00DAid4Kc3K5xeFIOoiZrVxijEzj0GLVO2w==} + dev: false + + /math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + /memoizerific@1.11.3: + resolution: {integrity: sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==} + dependencies: + map-or-similar: 1.5.0 + dev: true + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + /mgrs@1.0.0: + resolution: {integrity: sha512-awNbTOqCxK1DBGjalK3xqWIstBZgN6fxsMSiXLs9/spqWkF2pAhb2rrYCFSsr1/tT7PhcDGjZndG8SWYn0byYA==} + dev: false + + /micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + /minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + /minizlib@3.0.2: + resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==} + engines: {node: '>= 18'} + dependencies: + minipass: 7.1.2 + dev: false + + /mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + dev: false + + /module-definition@6.0.1: + resolution: {integrity: sha512-FeVc50FTfVVQnolk/WQT8MX+2WVcDnTGiq6Wo+/+lJ2ET1bRVi3HG3YlJUfqagNMc/kUlFSoR96AJkxGpKz13g==} + engines: {node: '>=18'} + hasBin: true + dependencies: + ast-module-types: 6.0.1 + node-source-walk: 7.0.1 + dev: true + + /moment@2.30.1: + resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} + dev: false + + /motion-dom@11.18.1: + resolution: {integrity: sha512-g76KvA001z+atjfxczdRtw/RXOM3OMSdd1f4DL77qCTF/+avrRJiawSG4yDibEQ215sr9kpinSlX2pCTJ9zbhw==} + dependencies: + motion-utils: 11.18.1 + dev: false + + /motion-utils@11.18.1: + resolution: {integrity: sha512-49Kt+HKjtbJKLtgO/LKj9Ld+6vw9BjH5d9sc40R/kVyH8GLAXgT42M2NnuPcJNuA3s9ZfZBUcwIgpmZWGEE+hA==} + dev: false + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true + + /mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + /nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + /next-qrcode@2.5.1(react@18.3.1): + resolution: {integrity: sha512-ibiS1+p+myjurC1obVIgo7UCjFhxm0SNYTkikahQVmnyzlfREOdUCf2f77Vbz6W6q2zfx5Eww2/20vbgkLNdLw==} + engines: {node: '>=8', npm: '>=5'} + peerDependencies: + react: ^18.3.1 + dependencies: + qrcode: 1.5.4 + react: 18.3.1 + dev: false + + /next-themes@0.4.6(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==} + peerDependencies: + react: ^18.3.1 + react-dom: ^18.3.1 + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /next@15.1.7(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-GNeINPGS9c6OZKCvKypbL8GTsT5GhWPp4DM0fzkXJuXMilOO2EeFxuAY6JZbtk6XIl6Ws10ag3xRINDjSO5+wg==} + engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + babel-plugin-react-compiler: '*' + react: ^18.3.1 + react-dom: ^18.3.1 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + dependencies: + '@next/env': 15.1.7 + '@swc/counter': 0.1.3 + '@swc/helpers': 0.5.15 + busboy: 1.6.0 + caniuse-lite: 1.0.30001701 + postcss: 8.4.31 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + styled-jsx: 5.1.6(react@18.3.1) + optionalDependencies: + '@next/swc-darwin-arm64': 15.1.7 + '@next/swc-darwin-x64': 15.1.7 + '@next/swc-linux-arm64-gnu': 15.1.7 + '@next/swc-linux-arm64-musl': 15.1.7 + '@next/swc-linux-x64-gnu': 15.1.7 + '@next/swc-linux-x64-musl': 15.1.7 + '@next/swc-win32-arm64-msvc': 15.1.7 + '@next/swc-win32-x64-msvc': 15.1.7 + sharp: 0.33.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + dev: false + + /next@15.3.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-k0MgP6BsK8cZ73wRjMazl2y2UcXj49ZXLDEgx6BikWuby/CN+nh81qFFI16edgd7xYpe/jj2OZEIwCoqnzz0bQ==} + engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + babel-plugin-react-compiler: '*' + react: ^18.3.1 + react-dom: ^18.3.1 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + dependencies: + '@next/env': 15.3.0 + '@swc/counter': 0.1.3 + '@swc/helpers': 0.5.15 + busboy: 1.6.0 + caniuse-lite: 1.0.30001701 + postcss: 8.4.31 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + styled-jsx: 5.1.6(react@18.3.1) + optionalDependencies: + '@next/swc-darwin-arm64': 15.3.0 + '@next/swc-darwin-x64': 15.3.0 + '@next/swc-linux-arm64-gnu': 15.3.0 + '@next/swc-linux-arm64-musl': 15.3.0 + '@next/swc-linux-x64-gnu': 15.3.0 + '@next/swc-linux-x64-musl': 15.3.0 + '@next/swc-win32-arm64-msvc': 15.3.0 + '@next/swc-win32-x64-msvc': 15.3.0 + sharp: 0.34.1 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + dev: false + + /node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + /node-source-walk@7.0.1: + resolution: {integrity: sha512-3VW/8JpPqPvnJvseXowjZcirPisssnBuDikk6JIZ8jQzF7KJQX52iPFX4RYYxLycYH7IbMRSPUOga/esVjy5Yg==} + engines: {node: '>=18'} + dependencies: + '@babel/parser': 7.26.9 + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + /normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + dev: true + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + /object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + /object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + dev: true + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true + + /object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + dev: true + + /object.entries@1.1.8: + resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + dev: true + + /object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + dev: true + + /object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + dev: true + + /object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + dev: true + + /ol-ext@4.0.31(ol@7.5.2): + resolution: {integrity: sha512-byh26JcXZggkLUY79+c29cxf2ovkkwz5niWJzOIN+dLPDJ+ogSn0y4Wl8fIS9O2JtQff5/cInHRImgZBvl+N1g==} + peerDependencies: + ol: '>= 5.3.0' + dependencies: + ol: 7.5.2 + dev: false + + /ol-mapbox-style@10.7.0: + resolution: {integrity: sha512-S/UdYBuOjrotcR95Iq9AejGYbifKeZE85D9VtH11ryJLQPTZXZSW1J5bIXcr4AlAH6tyjPPHTK34AdkwB32Myw==} + dependencies: + '@mapbox/mapbox-gl-style-spec': 13.28.0 + mapbox-to-css-font: 2.4.5 + ol: 7.5.2 + dev: false + + /ol@7.5.2: + resolution: {integrity: sha512-HJbb3CxXrksM6ct367LsP3N+uh+iBBMdP3DeGGipdV9YAYTP0vTJzqGnoqQ6C2IW4qf8krw9yuyQbc9fjOIaOQ==} + dependencies: + earcut: 2.2.4 + geotiff: 2.1.3 + ol-mapbox-style: 10.7.0 + pbf: 3.2.1 + rbush: 3.0.1 + dev: false + + /open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: true + + /optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + dev: true + + /own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + dev: true + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: false + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: false + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: false + + /package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + /pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + dev: false + + /pako@2.1.0: + resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} + dev: false + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /parse-headers@2.0.6: + resolution: {integrity: sha512-Tz11t3uKztEW5FEVZnj1ox8GKblWn+PvHY9TmJV5Mll2uHEwRdR/5Li1OlXoECjLYkApdhWy44ocONwXLiKO5A==} + dev: false + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.26.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + /path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + /path-type@6.0.0: + resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} + engines: {node: '>=18'} + dev: true + + /path@0.12.7: + resolution: {integrity: sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==} + dependencies: + process: 0.11.10 + util: 0.10.4 + dev: false + + /pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} + dev: true + + /patronum@2.3.0(effector@23.3.0): + resolution: {integrity: sha512-BfKIOpoymVz6XnkOn8Fi5QZ1a3r/3lXdd8BcdHmYDbIXPTIRnD1EPFBFev/DheWnOge6/ZswEqgNF2ANLGOxLw==} + peerDependencies: + effector: ^23 + dependencies: + effector: 23.3.0 + dev: true + + /pbf@3.2.1: + resolution: {integrity: sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==} + hasBin: true + dependencies: + ieee754: 1.2.1 + resolve-protobuf-schema: 2.1.0 + dev: false + + /picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + /picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + dev: true + + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + /pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + dev: true + + /pngjs@5.0.0: + resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} + engines: {node: '>=10.13.0'} + dev: false + + /polished@4.3.1: + resolution: {integrity: sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==} + engines: {node: '>=10'} + dependencies: + '@babel/runtime': 7.26.9 + dev: true + + /possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + dev: true + + /postcss-import@15.1.0(postcss@8.5.3): + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.5.3 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.10 + + /postcss-js@4.0.1(postcss@8.5.3): + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.5.3 + + /postcss-load-config@4.0.2(postcss@8.5.3): + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 3.1.3 + postcss: 8.5.3 + yaml: 2.7.0 + + /postcss-load-config@6.0.1(postcss@8.5.3): + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + dependencies: + lilconfig: 3.1.3 + postcss: 8.5.3 + dev: true + + /postcss-nested@6.2.0(postcss@8.5.3): + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.5.3 + postcss-selector-parser: 6.1.2 + + /postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + /postcss-values-parser@6.0.2(postcss@8.5.3): + resolution: {integrity: sha512-YLJpK0N1brcNJrs9WatuJFtHaV9q5aAOj+S4DI5S7jgHlRfm0PIbDCAFRYMQD5SHq7Fy6xsDhyutgS0QOAs0qw==} + engines: {node: '>=10'} + peerDependencies: + postcss: ^8.2.9 + dependencies: + color-name: 1.1.4 + is-url-superb: 4.0.0 + postcss: 8.5.3 + quote-unquote: 1.0.0 + dev: true + + /postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + dev: false + + /postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + /preact@10.12.1: + resolution: {integrity: sha512-l8386ixSsBdbreOAkqtrwqHwdvR35ID8c3rKPa8lCWuO86dBi32QWHV4vfsZK1utLLFMvw+Z5Ad4XLkZzchscg==} + dev: false + + /precinct@12.2.0: + resolution: {integrity: sha512-NFBMuwIfaJ4SocE9YXPU/n4AcNSoFMVFjP72nvl3cx69j/ke61/hPOWFREVxLkFhhEGnA8ZuVfTqJBa+PK3b5w==} + engines: {node: '>=18'} + hasBin: true + dependencies: + '@dependents/detective-less': 5.0.1 + commander: 12.1.0 + detective-amd: 6.0.1 + detective-cjs: 6.0.1 + detective-es6: 5.0.1 + detective-postcss: 7.0.1(postcss@8.5.3) + detective-sass: 6.0.1 + detective-scss: 5.0.1 + detective-stylus: 5.0.1 + detective-typescript: 14.0.0(typescript@5.7.3) + detective-vue2: 2.2.0(typescript@5.7.3) + module-definition: 6.0.1 + node-source-walk: 7.0.1 + postcss: 8.5.3 + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + dev: true + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prettier-plugin-tailwindcss@0.6.11(prettier@3.5.2): + resolution: {integrity: sha512-YxaYSIvZPAqhrrEpRtonnrXdghZg1irNg4qrjboCXrpybLWVs55cW2N3juhspVJiO0JBvYJT8SYsJpc8OQSnsA==} + engines: {node: '>=14.21.3'} + peerDependencies: + '@ianvs/prettier-plugin-sort-imports': '*' + '@prettier/plugin-pug': '*' + '@shopify/prettier-plugin-liquid': '*' + '@trivago/prettier-plugin-sort-imports': '*' + '@zackad/prettier-plugin-twig': '*' + prettier: ^3.0 + prettier-plugin-astro: '*' + prettier-plugin-css-order: '*' + prettier-plugin-import-sort: '*' + prettier-plugin-jsdoc: '*' + prettier-plugin-marko: '*' + prettier-plugin-multiline-arrays: '*' + prettier-plugin-organize-attributes: '*' + prettier-plugin-organize-imports: '*' + prettier-plugin-sort-imports: '*' + prettier-plugin-style-order: '*' + prettier-plugin-svelte: '*' + peerDependenciesMeta: + '@ianvs/prettier-plugin-sort-imports': + optional: true + '@prettier/plugin-pug': + optional: true + '@shopify/prettier-plugin-liquid': + optional: true + '@trivago/prettier-plugin-sort-imports': + optional: true + '@zackad/prettier-plugin-twig': + optional: true + prettier-plugin-astro: + optional: true + prettier-plugin-css-order: + optional: true + prettier-plugin-import-sort: + optional: true + prettier-plugin-jsdoc: + optional: true + prettier-plugin-marko: + optional: true + prettier-plugin-multiline-arrays: + optional: true + prettier-plugin-organize-attributes: + optional: true + prettier-plugin-organize-imports: + optional: true + prettier-plugin-sort-imports: + optional: true + prettier-plugin-style-order: + optional: true + prettier-plugin-svelte: + optional: true + dependencies: + prettier: 3.5.2 + dev: true + + /prettier@3.5.2: + resolution: {integrity: sha512-lc6npv5PH7hVqozBR7lkBNOGXV9vMwROAPlumdBkX0wTbbzPu/U1hk5yL8p2pt4Xoc+2mkT8t/sow2YrV/M5qg==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + dev: true + + /prexit@2.3.0: + resolution: {integrity: sha512-mX+LIbtS0anKtl2PykYabxninwloblUQMRO6CubeSmjxb+kKlATuJoH9UeN8NLE4TgIEFWfBXw7V3GkWbBrSmg==} + engines: {node: '>=12'} + dev: true + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: false + + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + /proj4@2.15.0: + resolution: {integrity: sha512-LqCNEcPdI03BrCHxPLj29vsd5afsm+0sV1H/O3nTDKrv8/LA01ea1z4QADDMjUqxSXWnrmmQDjqFm1J/uZ5RLw==} + dependencies: + mgrs: 1.0.0 + wkt-parser: 1.4.0 + dev: false + + /prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + /proper-lockfile@4.1.2: + resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} + dependencies: + graceful-fs: 4.2.11 + retry: 0.12.0 + signal-exit: 3.0.7 + dev: false + + /protocol-buffers-schema@3.6.0: + resolution: {integrity: sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==} + dev: false + + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: false + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + dev: true + + /qrcode@1.5.4: + resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==} + engines: {node: '>=10.13.0'} + hasBin: true + dependencies: + dijkstrajs: 1.0.3 + pngjs: 5.0.0 + yargs: 15.4.1 + dev: false + + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: false + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + /quick-lru@6.1.2: + resolution: {integrity: sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ==} + engines: {node: '>=12'} + dev: false + + /quickselect@2.0.0: + resolution: {integrity: sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==} + dev: false + + /quote-unquote@1.0.0: + resolution: {integrity: sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg==} + dev: true + + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + + /rbush@3.0.1: + resolution: {integrity: sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==} + dependencies: + quickselect: 2.0.0 + dev: false + + /react-chartjs-2@5.3.0(chart.js@4.4.8)(react@18.3.1): + resolution: {integrity: sha512-UfZZFnDsERI3c3CZGxzvNJd02SHjaSJ8kgW1djn65H1KK8rehwTjyrRKOG3VTMG8wtHZ5rgAO5oTHtHi9GCCmw==} + peerDependencies: + chart.js: ^4.1.1 + react: ^18.3.1 + dependencies: + chart.js: 4.4.8 + react: 18.3.1 + dev: false + + /react-day-picker@8.10.1(date-fns@3.6.0)(react@18.3.1): + resolution: {integrity: sha512-TMx7fNbhLk15eqcMt+7Z7S2KF7mfTId/XJDjKE8f+IUcFn0l08/kI4FiYTL/0yuOLmEcbR4Fwe3GJf/NiiMnPA==} + peerDependencies: + date-fns: ^2.28.0 || ^3.0.0 + react: ^18.3.1 + dependencies: + date-fns: 3.6.0 + react: 18.3.1 + dev: false + + /react-day-picker@9.7.0(react@18.3.1): + resolution: {integrity: sha512-urlK4C9XJZVpQ81tmVgd2O7lZ0VQldZeHzNejbwLWZSkzHH498KnArT0EHNfKBOWwKc935iMLGZdxXPRISzUxQ==} + engines: {node: '>=18'} + peerDependencies: + react: ^18.3.1 + dependencies: + '@date-fns/tz': 1.2.0 + date-fns: 4.1.0 + date-fns-jalali: 4.1.0-0 + react: 18.3.1 + dev: false + + /react-dnd-html5-backend@16.0.1: + resolution: {integrity: sha512-Wu3dw5aDJmOGw8WjH1I1/yTH+vlXEL4vmjk5p+MHxP8HuHJS1lAGeIdG/hze1AvNeXWo/JgULV87LyQOr+r5jw==} + dependencies: + dnd-core: 16.0.1 + dev: false + + /react-dnd-touch-backend@16.0.1: + resolution: {integrity: sha512-NonoCABzzjyWGZuDxSG77dbgMZ2Wad7eQiCd/ECtsR2/NBLTjGksPUx9UPezZ1nQ/L7iD130Tz3RUshL/ClKLA==} + dependencies: + '@react-dnd/invariant': 4.0.2 + dnd-core: 16.0.1 + dev: false + + /react-dnd@16.0.1(@types/node@22.13.5)(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-QeoM/i73HHu2XF9aKksIUuamHPDvRglEwdHL4jsp784BgUuWcg6mzfxT0QDdQz8Wj0qyRKx2eMg8iZtWvU4E2Q==} + peerDependencies: + '@types/hoist-non-react-statics': '>= 3.3.1' + '@types/node': '>= 12' + '@types/react': ^18.3.18 + react: ^18.3.1 + peerDependenciesMeta: + '@types/hoist-non-react-statics': + optional: true + '@types/node': + optional: true + '@types/react': + optional: true + dependencies: + '@react-dnd/invariant': 4.0.2 + '@react-dnd/shallowequal': 4.0.2 + '@types/node': 22.13.5 + '@types/react': 18.3.18 + dnd-core: 16.0.1 + fast-deep-equal: 3.1.3 + hoist-non-react-statics: 3.3.2 + react: 18.3.1 + dev: false + + /react-dnd@16.0.1(@types/node@22.13.9)(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-QeoM/i73HHu2XF9aKksIUuamHPDvRglEwdHL4jsp784BgUuWcg6mzfxT0QDdQz8Wj0qyRKx2eMg8iZtWvU4E2Q==} + peerDependencies: + '@types/hoist-non-react-statics': '>= 3.3.1' + '@types/node': '>= 12' + '@types/react': ^18.3.18 + react: ^18.3.1 + peerDependenciesMeta: + '@types/hoist-non-react-statics': + optional: true + '@types/node': + optional: true + '@types/react': + optional: true + dependencies: + '@react-dnd/invariant': 4.0.2 + '@react-dnd/shallowequal': 4.0.2 + '@types/node': 22.13.9 + '@types/react': 18.3.18 + dnd-core: 16.0.1 + fast-deep-equal: 3.1.3 + hoist-non-react-statics: 3.3.2 + react: 18.3.1 + dev: false + + /react-docgen-typescript@2.2.2(typescript@5.6.3): + resolution: {integrity: sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==} + peerDependencies: + typescript: '>= 4.3.x' + dependencies: + typescript: 5.6.3 + dev: true + + /react-docgen@7.1.1: + resolution: {integrity: sha512-hlSJDQ2synMPKFZOsKo9Hi8WWZTC7POR8EmWvTSjow+VDgKzkmjQvFm2fk0tmRw+f0vTOIYKlarR0iL4996pdg==} + engines: {node: '>=16.14.0'} + dependencies: + '@babel/core': 7.26.9 + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.20.6 + '@types/doctrine': 0.0.9 + '@types/resolve': 1.20.6 + doctrine: 3.0.0 + resolve: 1.22.10 + strip-indent: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /react-dom@18.3.1(react@18.3.1): + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + /react-dropzone@14.3.8(react@18.3.1): + resolution: {integrity: sha512-sBgODnq+lcA4P296DY4wacOZz3JFpD99fp+hb//iBO2HHnyeZU3FwWyXJ6salNpqQdsZrgMrotuko/BdJMV8Ug==} + engines: {node: '>= 10.13'} + peerDependencies: + react: ^18.3.1 + dependencies: + attr-accept: 2.2.5 + file-selector: 2.1.2 + prop-types: 15.8.1 + react: 18.3.1 + dev: false + + /react-hook-form@7.54.2(react@18.3.1): + resolution: {integrity: sha512-eHpAUgUjWbZocoQYUHposymRb4ZP6d0uwUnooL2uOybA9/3tPUvoAKqEWK1WaSiTxxOfTpffNZP7QwlnM3/gEg==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.3.1 + dependencies: + react: 18.3.1 + dev: false + + /react-hot-toast@2.5.2(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-Tun3BbCxzmXXM7C+NI4qiv6lT0uwGh4oAfeJyNOjYUejTsm35mK9iCaYLGv8cBz9L5YxZLx/2ii7zsIwPtPUdw==} + engines: {node: '>=10'} + peerDependencies: + react: ^18.3.1 + react-dom: ^18.3.1 + dependencies: + csstype: 3.1.3 + goober: 2.1.16(csstype@3.1.3) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /react-i18next@15.6.1(i18next@25.3.2)(react-dom@18.3.1)(react@18.3.1)(typescript@5.6.3): + resolution: {integrity: sha512-uGrzSsOUUe2sDBG/+FJq2J1MM+Y4368/QW8OLEKSFvnDflHBbZhSd1u3UkW0Z06rMhZmnB/AQrhCpYfE5/5XNg==} + peerDependencies: + i18next: '>= 23.2.3' + react: ^18.3.1 + react-dom: '*' + react-native: '*' + typescript: ^5 + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + typescript: + optional: true + dependencies: + '@babel/runtime': 7.28.2 + html-parse-stringify: 3.0.1 + i18next: 25.3.2(typescript@5.6.3) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + typescript: 5.6.3 + dev: false + + /react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + /react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: true + + /react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + dev: false + + /react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + dev: true + + /react-remove-scroll-bar@2.3.8(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^18.3.18 + react: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.18 + react: 18.3.1 + react-style-singleton: 2.2.3(@types/react@18.3.18)(react@18.3.1) + tslib: 2.8.1 + dev: false + + /react-remove-scroll@2.6.3(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^18.3.18 + react: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.18 + react: 18.3.1 + react-remove-scroll-bar: 2.3.8(@types/react@18.3.18)(react@18.3.1) + react-style-singleton: 2.2.3(@types/react@18.3.18)(react@18.3.1) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@18.3.18)(react@18.3.1) + use-sidecar: 1.1.3(@types/react@18.3.18)(react@18.3.1) + dev: false + + /react-smooth@4.0.4(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==} + peerDependencies: + react: ^18.3.1 + react-dom: ^18.3.1 + dependencies: + fast-equals: 5.2.2 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-transition-group: 4.4.5(react-dom@18.3.1)(react@18.3.1) + dev: false + + /react-style-singleton@2.2.3(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^18.3.18 + react: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.18 + get-nonce: 1.0.1 + react: 18.3.1 + tslib: 2.8.1 + dev: false + + /react-transition-group@4.4.5(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + peerDependencies: + react: ^18.3.1 + react-dom: ^18.3.1 + dependencies: + '@babel/runtime': 7.26.9 + dom-helpers: 5.2.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /react-use-measure@2.1.7(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-KrvcAo13I/60HpwGO5jpW7E9DfusKyLPLvuHlUyP5zqnmAPhNc6qTRjUQrdTADl0lpPpDVU2/Gg51UlOGHXbdg==} + peerDependencies: + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + react-dom: + optional: true + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + + /read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + dependencies: + pify: 2.3.0 + + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: false + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + + /readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + dev: true + + /recast@0.23.10: + resolution: {integrity: sha512-mbCmRMJUKCJ1h41V0cu2C26ULBURwuoZ34C9rChjcDaeJ/4Kv5al3O2HPwTs2m0wQ1vGhMY+tguhzU1aE8md1A==} + engines: {node: '>= 4'} + dependencies: + ast-types: 0.16.1 + esprima: 4.0.1 + source-map: 0.6.1 + tiny-invariant: 1.3.3 + tslib: 2.8.1 + dev: true + + /recharts-scale@0.4.5: + resolution: {integrity: sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==} + dependencies: + decimal.js-light: 2.5.1 + dev: false + + /recharts@2.15.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-v8PUTUlyiDe56qUj82w/EDVuzEFXwEHp9/xOowGAZwfLjB9uAy3GllQVIYMWF6nU+qibx85WF75zD7AjqoT54Q==} + engines: {node: '>=14'} + peerDependencies: + react: ^18.3.1 + react-dom: ^18.3.1 + dependencies: + clsx: 2.1.1 + eventemitter3: 4.0.7 + lodash: 4.17.21 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-is: 18.3.1 + react-smooth: 4.0.4(react-dom@18.3.1)(react@18.3.1) + recharts-scale: 0.4.5 + tiny-invariant: 1.3.3 + victory-vendor: 36.9.2 + dev: false + + /redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + dev: true + + /redux@4.2.1: + resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} + dependencies: + '@babel/runtime': 7.26.9 + dev: false + + /reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + dev: true + + /regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + /regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + /require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + dev: false + + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: false + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + dev: true + + /resolve-protobuf-schema@2.1.0: + resolution: {integrity: sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==} + dependencies: + protocol-buffers-schema: 3.6.0 + dev: false + + /resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + /resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + dev: false + + /reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + /rollup@4.34.8: + resolution: {integrity: sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.34.8 + '@rollup/rollup-android-arm64': 4.34.8 + '@rollup/rollup-darwin-arm64': 4.34.8 + '@rollup/rollup-darwin-x64': 4.34.8 + '@rollup/rollup-freebsd-arm64': 4.34.8 + '@rollup/rollup-freebsd-x64': 4.34.8 + '@rollup/rollup-linux-arm-gnueabihf': 4.34.8 + '@rollup/rollup-linux-arm-musleabihf': 4.34.8 + '@rollup/rollup-linux-arm64-gnu': 4.34.8 + '@rollup/rollup-linux-arm64-musl': 4.34.8 + '@rollup/rollup-linux-loongarch64-gnu': 4.34.8 + '@rollup/rollup-linux-powerpc64le-gnu': 4.34.8 + '@rollup/rollup-linux-riscv64-gnu': 4.34.8 + '@rollup/rollup-linux-s390x-gnu': 4.34.8 + '@rollup/rollup-linux-x64-gnu': 4.34.8 + '@rollup/rollup-linux-x64-musl': 4.34.8 + '@rollup/rollup-win32-arm64-msvc': 4.34.8 + '@rollup/rollup-win32-ia32-msvc': 4.34.8 + '@rollup/rollup-win32-x64-msvc': 4.34.8 + fsevents: 2.3.3 + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + + /rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + dev: false + + /safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + dev: true + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: false + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + /safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + dev: true + + /safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-regex: 1.2.1 + dev: true + + /sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + dev: false + + /scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + dependencies: + loose-envify: 1.4.0 + + /schema-utils@4.3.0: + resolution: {integrity: sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + ajv-keywords: 5.1.0(ajv@8.17.1) + + /select@1.1.2: + resolution: {integrity: sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==} + dev: false + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: true + + /semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + + /serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + dependencies: + randombytes: 2.1.0 + + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: false + + /set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + dev: true + + /set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + dev: true + + /set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + dev: true + + /setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + dev: false + + /sharp@0.33.5: + resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + requiresBuild: true + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + semver: 7.7.1 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.5 + '@img/sharp-darwin-x64': 0.33.5 + '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@img/sharp-libvips-darwin-x64': 1.0.4 + '@img/sharp-libvips-linux-arm': 1.0.5 + '@img/sharp-libvips-linux-arm64': 1.0.4 + '@img/sharp-libvips-linux-s390x': 1.0.4 + '@img/sharp-libvips-linux-x64': 1.0.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + '@img/sharp-linux-arm': 0.33.5 + '@img/sharp-linux-arm64': 0.33.5 + '@img/sharp-linux-s390x': 0.33.5 + '@img/sharp-linux-x64': 0.33.5 + '@img/sharp-linuxmusl-arm64': 0.33.5 + '@img/sharp-linuxmusl-x64': 0.33.5 + '@img/sharp-wasm32': 0.33.5 + '@img/sharp-win32-ia32': 0.33.5 + '@img/sharp-win32-x64': 0.33.5 + dev: false + optional: true + + /sharp@0.34.1: + resolution: {integrity: sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + requiresBuild: true + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + semver: 7.7.1 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.1 + '@img/sharp-darwin-x64': 0.34.1 + '@img/sharp-libvips-darwin-arm64': 1.1.0 + '@img/sharp-libvips-darwin-x64': 1.1.0 + '@img/sharp-libvips-linux-arm': 1.1.0 + '@img/sharp-libvips-linux-arm64': 1.1.0 + '@img/sharp-libvips-linux-ppc64': 1.1.0 + '@img/sharp-libvips-linux-s390x': 1.1.0 + '@img/sharp-libvips-linux-x64': 1.1.0 + '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 + '@img/sharp-libvips-linuxmusl-x64': 1.1.0 + '@img/sharp-linux-arm': 0.34.1 + '@img/sharp-linux-arm64': 0.34.1 + '@img/sharp-linux-s390x': 0.34.1 + '@img/sharp-linux-x64': 0.34.1 + '@img/sharp-linuxmusl-arm64': 0.34.1 + '@img/sharp-linuxmusl-x64': 0.34.1 + '@img/sharp-wasm32': 0.34.1 + '@img/sharp-win32-ia32': 0.34.1 + '@img/sharp-win32-x64': 0.34.1 + dev: false + optional: true + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + /side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + dev: true + + /side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + dev: true + + /side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + dev: true + + /side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + dev: true + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: false + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + /simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + requiresBuild: true + dependencies: + is-arrayish: 0.3.2 + dev: false + optional: true + + /sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: true + + /slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + dev: true + + /sonner@2.0.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-FRBphaehZ5tLdLcQ8g2WOIRE+Y7BCfWi5Zyd8bCvBjiW8TxxAyoWZIxS661Yz6TGPqFQ4VLzOF89WEYhfynSFQ==} + peerDependencies: + react: ^18.3.1 + react-dom: ^18.3.1 + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /sort-asc@0.1.0: + resolution: {integrity: sha512-jBgdDd+rQ+HkZF2/OHCmace5dvpos/aWQpcxuyRs9QUbPRnkEJmYVo81PIGpjIdpOcsnJ4rGjStfDHsbn+UVyw==} + engines: {node: '>=0.10.0'} + dev: false + + /sort-desc@0.1.1: + resolution: {integrity: sha512-jfZacW5SKOP97BF5rX5kQfJmRVZP5/adDUTY8fCSPvNcXDVpUEe2pr/iKGlcyZzchRJZrswnp68fgk3qBXgkJw==} + engines: {node: '>=0.10.0'} + dev: false + + /sort-object@0.3.2: + resolution: {integrity: sha512-aAQiEdqFTTdsvUFxXm3umdo04J7MRljoVGbBlkH7BgNsMvVNAJyGj7C/wV1A8wHWAJj/YikeZbfuCKqhggNWGA==} + engines: {node: '>=0.10.0'} + dependencies: + sort-asc: 0.1.0 + sort-desc: 0.1.1 + dev: false + + /source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + /source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + dependencies: + whatwg-url: 7.1.0 + dev: true + + /ssf@0.11.2: + resolution: {integrity: sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==} + engines: {node: '>=0.8'} + dependencies: + frac: 1.1.2 + dev: false + + /stable-hash@0.0.4: + resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==} + dev: true + + /steiger@0.5.5(typescript@5.6.3): + resolution: {integrity: sha512-d4eZwqJjfG7dKgwXKBwmZsNWSRqeQrRpEvEr58rhMmNbICcQsJ8cpK9n6nuish3kNjKyYzx6t2TpQYEO26xTFA==} + hasBin: true + dependencies: + '@clack/prompts': 0.8.2 + '@feature-sliced/steiger-plugin': 0.5.4(typescript@5.6.3) + chokidar: 4.0.3 + cosmiconfig: 9.0.0(typescript@5.6.3) + effector: 23.3.0 + empathic: 1.0.0 + fastest-levenshtein: 1.0.16 + globby: 14.1.0 + immer: 10.1.1 + lodash-es: 4.17.21 + micromatch: 4.0.8 + patronum: 2.3.0(effector@23.3.0) + picocolors: 1.1.1 + prexit: 2.3.0 + yargs: 17.7.2 + zod: 3.24.2 + zod-validation-error: 3.4.0(zod@3.24.2) + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /storybook@8.6.0(prettier@3.5.2): + resolution: {integrity: sha512-NEHCK2nXogw7WxAkJfMwPnc5Cmh/KqVNrdaFeXBAKhC2Zr1FTZIiCR5nSUT85run44Wkpmo7qvUoKvII9GOWbA==} + hasBin: true + peerDependencies: + prettier: ^2 || ^3 + peerDependenciesMeta: + prettier: + optional: true + dependencies: + '@storybook/core': 8.6.0(prettier@3.5.2)(storybook@8.6.0) + prettier: 3.5.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + dev: false + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + /string.prototype.includes@2.0.1: + resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + dev: true + + /string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 + set-function-name: 2.0.2 + side-channel: 1.1.0 + dev: true + + /string.prototype.repeat@1.0.0: + resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + dependencies: + define-properties: 1.2.1 + es-abstract: 1.23.9 + dev: true + + /string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + dev: true + + /string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + dev: true + + /string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + dev: true + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: false + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.1.0 + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + + /strip-indent@4.0.0: + resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} + engines: {node: '>=12'} + dependencies: + min-indent: 1.0.1 + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /styled-jsx@5.1.6(react@18.3.1): + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: ^18.3.1 + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + dependencies: + client-only: 0.0.1 + react: 18.3.1 + dev: false + + /sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + /tailwind-merge@3.0.2: + resolution: {integrity: sha512-l7z+OYZ7mu3DTqrL88RiKrKIqO3NcpEO8V/Od04bNpvk0kiIFndGEoqfuzvj4yuhRkHKjRkII2z+KS2HfPcSxw==} + dev: false + + /tailwindcss-animate@1.0.7(tailwindcss@3.4.17): + resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + dependencies: + tailwindcss: 3.4.17 + dev: false + + /tailwindcss@3.4.17: + resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.3 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.7 + lilconfig: 3.1.3 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.5.3 + postcss-import: 15.1.0(postcss@8.5.3) + postcss-js: 4.0.1(postcss@8.5.3) + postcss-load-config: 4.0.2(postcss@8.5.3) + postcss-nested: 6.2.0(postcss@8.5.3) + postcss-selector-parser: 6.1.2 + resolve: 1.22.10 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + + /tailwindcss@4.1.11: + resolution: {integrity: sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==} + dev: false + + /tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + /tar@7.4.3: + resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} + engines: {node: '>=18'} + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.0.2 + mkdirp: 3.0.1 + yallist: 5.0.0 + dev: false + + /terser-webpack-plugin@5.3.13(webpack@5.98.0): + resolution: {integrity: sha512-JG3pBixF6kx2o0Yfz2K6pqh72DpwTI08nooHd06tcj5WyIt5SsSiUYqRT+kemrGUNSuSzVhwfZ28aO8gogajNQ==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 4.3.0 + serialize-javascript: 6.0.2 + terser: 5.39.0 + webpack: 5.98.0 + + /terser@5.39.0: + resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.14.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + /text-segmentation@1.0.3: + resolution: {integrity: sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==} + dependencies: + utrie: 1.0.2 + dev: false + + /thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + + /tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + /tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + dev: true + + /tinyglobby@0.2.12: + resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} + engines: {node: '>=12.0.0'} + dependencies: + fdir: 6.4.3(picomatch@4.0.2) + picomatch: 4.0.2 + dev: true + + /tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + engines: {node: '>=14.0.0'} + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + + /tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + dependencies: + punycode: 2.3.1 + dev: true + + /tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + dev: true + + /ts-api-utils@2.0.1(typescript@5.6.3): + resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + dependencies: + typescript: 5.6.3 + dev: true + + /ts-api-utils@2.0.1(typescript@5.7.3): + resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + dependencies: + typescript: 5.7.3 + dev: true + + /ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + dev: true + + /ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + /tsconfck@3.1.5(typescript@5.6.3): + resolution: {integrity: sha512-CLDfGgUp7XPswWnezWwsCRxNmgQjhYq3VXHM0/XIRxhVrKw0M1if9agzryh1QS3nxjCROvV+xWxoJO1YctzzWg==} + engines: {node: ^18 || >=20} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + typescript: 5.6.3 + dev: true + + /tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + /tsup@8.3.6(postcss@8.5.3)(typescript@5.6.3): + resolution: {integrity: sha512-XkVtlDV/58S9Ye0JxUUTcrQk4S+EqlOHKzg6Roa62rdjL1nGWNUstG0xgI4vanHdfIpjP448J8vlN0oK6XOJ5g==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + dependencies: + bundle-require: 5.1.0(esbuild@0.24.2) + cac: 6.7.14 + chokidar: 4.0.3 + consola: 3.4.0 + debug: 4.4.0 + esbuild: 0.24.2 + joycon: 3.1.1 + picocolors: 1.1.1 + postcss: 8.5.3 + postcss-load-config: 6.0.1(postcss@8.5.3) + resolve-from: 5.0.0 + rollup: 4.34.8 + source-map: 0.8.0-beta.0 + sucrase: 3.35.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.12 + tree-kill: 1.2.2 + typescript: 5.6.3 + transitivePeerDependencies: + - jiti + - supports-color + - tsx + - yaml + dev: true + + /turbo-darwin-64@2.4.2: + resolution: {integrity: sha512-HFfemyWB60CJtEvVQj9yby5rkkWw9fLAdLtAPGtPQoU3tKh8t/uzCAZKso2aPVbib9vGUuGbPGoGpaRXdVhj5g==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /turbo-darwin-arm64@2.4.2: + resolution: {integrity: sha512-uwSx1dsBSSFeEC0nxyx2O219FEsS/haiESaWwE9JI8mHkQK61s6w6fN2G586krKxyNam4AIxRltleL+O2Em94g==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /turbo-linux-64@2.4.2: + resolution: {integrity: sha512-Fy/uL8z/LAYcPbm7a1LwFnTY9pIi5FAi12iuHsgB7zHjdh4eeIKS2NIg4nroAmTcUTUZ0/cVTo4bDOCUcS3aKw==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /turbo-linux-arm64@2.4.2: + resolution: {integrity: sha512-AEA0d8h5W/K6iiXfEgiNwWt0yqRL1NpBs8zQCLdc4/L7WeYeJW3sORWX8zt7xhutF/KW9gTm8ehKpiK6cCIsAA==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /turbo-windows-64@2.4.2: + resolution: {integrity: sha512-CybtIZ9wRgnnNFVN9En9G+rxsO+mwU81fvW4RpE8BWyNEkhQ8J28qYf4PaimueMxGHHp/28i/G7Kcdn2GAWG0g==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /turbo-windows-arm64@2.4.2: + resolution: {integrity: sha512-7V0yneVPL8Y3TgrkUIjw7Odmwu1tHnyIiPHFM7eFcA7U+H6hPXyCxge7nC3wOKfjhKCQqUm+Vf/k6kjmLz5G4g==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /turbo@2.4.2: + resolution: {integrity: sha512-Qxi0ioQCxMRUCcHKHZkTnYH8e7XCpNfg9QiJcyfWIc+ZXeaCjzV5rCGlbQlTXMAtI8qgfP8fZADv3CFtPwqdPQ==} + hasBin: true + optionalDependencies: + turbo-darwin-64: 2.4.2 + turbo-darwin-arm64: 2.4.2 + turbo-linux-64: 2.4.2 + turbo-linux-arm64: 2.4.2 + turbo-windows-64: 2.4.2 + turbo-windows-arm64: 2.4.2 + dev: true + + /tus-js-client@4.3.1: + resolution: {integrity: sha512-ZLeYmjrkaU1fUsKbIi8JML52uAocjEZtBx4DKjRrqzrZa0O4MYwT6db+oqePlspV+FxXJAyFBc/L5gwUi2OFsg==} + engines: {node: '>=18'} + dependencies: + buffer-from: 1.1.2 + combine-errors: 3.0.3 + is-stream: 2.0.1 + js-base64: 3.7.7 + lodash.throttle: 4.1.1 + proper-lockfile: 4.1.2 + url-parse: 1.5.10 + dev: false + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + dev: true + + /typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + dev: true + + /typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + dev: true + + /typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + dev: true + + /typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + dev: true + + /typescript-eslint@8.25.0(eslint@9.21.0)(typescript@5.6.3): + resolution: {integrity: sha512-TxRdQQLH4g7JkoFlYG3caW5v1S6kEkz8rqt80iQJZUYPq1zD1Ra7HfQBJJ88ABRaMvHAXnwRvRB4V+6sQ9xN5Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + dependencies: + '@typescript-eslint/eslint-plugin': 8.25.0(@typescript-eslint/parser@8.25.0)(eslint@9.21.0)(typescript@5.6.3) + '@typescript-eslint/parser': 8.25.0(eslint@9.21.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.25.0(eslint@9.21.0)(typescript@5.6.3) + eslint: 9.21.0 + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + dev: true + + /typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} + engines: {node: '>=14.17'} + hasBin: true + + /typescript@5.7.3: + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + + /unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + dev: true + + /undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + dev: true + + /undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + + /unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + dev: true + + /unplugin@1.16.1: + resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==} + engines: {node: '>=14.0.0'} + dependencies: + acorn: 8.14.0 + webpack-virtual-modules: 0.6.2 + dev: true + + /update-browserslist-db@1.1.3(browserslist@4.24.4): + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.24.4 + escalade: 3.2.0 + picocolors: 1.1.1 + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + dev: true + + /url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: false + + /use-callback-ref@1.3.3(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^18.3.18 + react: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.18 + react: 18.3.1 + tslib: 2.8.1 + dev: false + + /use-sidecar@1.1.3(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^18.3.18 + react: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.18 + detect-node-es: 1.1.0 + react: 18.3.1 + tslib: 2.8.1 + dev: false + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + /util@0.10.4: + resolution: {integrity: sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==} + dependencies: + inherits: 2.0.3 + dev: false + + /util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + dependencies: + inherits: 2.0.4 + is-arguments: 1.2.0 + is-generator-function: 1.1.0 + is-typed-array: 1.1.15 + which-typed-array: 1.1.18 + dev: true + + /utrie@1.0.2: + resolution: {integrity: sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==} + dependencies: + base64-arraybuffer: 1.0.2 + dev: false + + /uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + dev: true + + /victory-vendor@36.9.2: + resolution: {integrity: sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==} + dependencies: + '@types/d3-array': 3.2.1 + '@types/d3-ease': 3.0.2 + '@types/d3-interpolate': 3.0.4 + '@types/d3-scale': 4.0.9 + '@types/d3-shape': 3.1.7 + '@types/d3-time': 3.0.4 + '@types/d3-timer': 3.0.2 + d3-array: 3.2.4 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-scale: 4.0.2 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-timer: 3.0.1 + dev: false + + /vite-tsconfig-paths@5.1.4(typescript@5.6.3)(vite@6.2.0): + resolution: {integrity: sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==} + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true + dependencies: + debug: 4.4.0 + globrex: 0.1.2 + tsconfck: 3.1.5(typescript@5.6.3) + vite: 6.2.0(@types/node@22.13.5) + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /vite@5.4.18(@types/node@22.13.9): + resolution: {integrity: sha512-1oDcnEp3lVyHCuQ2YFelM4Alm2o91xNoMncRm1U7S+JdYfYOvbiGZ3/CxGttrOu2M/KcGz7cRC2DoNUA6urmMA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 22.13.9 + esbuild: 0.21.5 + postcss: 8.5.3 + rollup: 4.34.8 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /vite@6.2.0(@types/node@22.13.5): + resolution: {integrity: sha512-7dPxoo+WsT/64rDcwoOjk76XHj+TqNTIvHKcuMQ1k4/SeHDaQt5GFAeLYzrimZrMpn/O6DtdI03WUjdxuPM0oQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + dependencies: + '@types/node': 22.13.5 + esbuild: 0.25.0 + postcss: 8.5.3 + rollup: 4.34.8 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /vite@6.2.0(@types/node@22.13.9): + resolution: {integrity: sha512-7dPxoo+WsT/64rDcwoOjk76XHj+TqNTIvHKcuMQ1k4/SeHDaQt5GFAeLYzrimZrMpn/O6DtdI03WUjdxuPM0oQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + dependencies: + '@types/node': 22.13.9 + esbuild: 0.25.0 + postcss: 8.5.3 + rollup: 4.34.8 + optionalDependencies: + fsevents: 2.3.3 + + /void-elements@3.1.0: + resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} + engines: {node: '>=0.10.0'} + dev: false + + /watchpack@2.4.2: + resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} + engines: {node: '>=10.13.0'} + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + /web-worker@1.5.0: + resolution: {integrity: sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==} + dev: false + + /webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + dev: true + + /webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + /webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + dev: true + + /webpack@5.98.0: + resolution: {integrity: sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.6 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.14.0 + browserslist: 4.24.4 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.18.1 + es-module-lexer: 1.6.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 4.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.13(webpack@5.98.0) + watchpack: 2.4.2 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + /whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + dev: true + + /which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + dev: true + + /which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.18 + dev: true + + /which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + dev: true + + /which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + dev: false + + /which-typed-array@1.1.18: + resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 + for-each: 0.3.5 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + + /wkt-parser@1.4.0: + resolution: {integrity: sha512-qpwO7Ihds/YYDTi1aADFTI1Sm9YC/tTe3SHD24EeIlZxy7Ik6a1b4HOz7jAi0xdUAw487duqpo8OGu+Tf4nwlQ==} + dev: false + + /wmf@1.0.2: + resolution: {integrity: sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==} + engines: {node: '>=0.8'} + dev: false + + /word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + dev: true + + /word@0.3.0: + resolution: {integrity: sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==} + engines: {node: '>=0.8'} + dev: false + + /wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: false + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + /ws@8.18.1: + resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + + /xlsx-populate@1.21.0: + resolution: {integrity: sha512-8v2Gm8BehXo6LU7KT802QoXTPkYY1SKk5V8g/UuYZnNB3JzXqud/P99Pxr2yXeKyt+sKlCatmidz6jQNie1hRw==} + dependencies: + cfb: 1.2.2 + jszip: 3.10.1 + lodash: 4.17.21 + sax: 1.4.1 + dev: false + + /xlsx@0.18.5: + resolution: {integrity: sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==} + engines: {node: '>=0.8'} + hasBin: true + dependencies: + adler-32: 1.3.1 + cfb: 1.2.2 + codepage: 1.15.0 + crc-32: 1.2.2 + ssf: 0.11.2 + wmf: 1.0.2 + word: 0.3.0 + dev: false + + /xml-utils@1.10.2: + resolution: {integrity: sha512-RqM+2o1RYs6T8+3DzDSoTRAUfrvaejbVHcp3+thnAtDKo8LskR+HomLajEy5UjTz24rpka7AxVBRR3g2wTUkJA==} + dev: false + + /y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + dev: false + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true + + /yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + dev: false + + /yaml@2.7.0: + resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} + engines: {node: '>= 14'} + hasBin: true + + /yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + dev: false + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + + /yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + dev: false + + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true + + /zod-validation-error@3.4.0(zod@3.24.2): + resolution: {integrity: sha512-ZOPR9SVY6Pb2qqO5XHt+MkkTRxGXb4EVtnjc9JpXUOtUB1T9Ru7mZOT361AN3MsetVe7R0a1KZshJDZdgp9miQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + zod: ^3.18.0 + dependencies: + zod: 3.24.2 + dev: true + + /zod@3.24.2: + resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} + + /zstddec@0.1.0: + resolution: {integrity: sha512-w2NTI8+3l3eeltKAdK8QpiLo/flRAr2p8AGeakfMZOXBxOg9HIu4LVDxBi81sYgVhFhdJjv1OrB5ssI8uFPoLg==} + dev: false + + /zustand@5.0.3(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': ^18.3.18 + immer: '>=9.0.6' + react: ^18.3.1 + use-sync-external-store: '>=1.2.0' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true + dependencies: + '@types/react': 18.3.18 + react: 18.3.1 + dev: false From 5a3eb041dc7fa9e9e104a3662ed72474f9de0e4c Mon Sep 17 00:00:00 2001 From: bicochan Date: Wed, 30 Jul 2025 16:02:59 +0900 Subject: [PATCH 02/37] =?UTF-8?q?[apps/cs]=20chore:=20InputDateRangePicker?= =?UTF-8?q?=20=EA=B2=BD=EA=B3=A0=20=EB=AC=B8=EA=B5=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/cs/src/shared/ui/input-date-range-picker.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/cs/src/shared/ui/input-date-range-picker.tsx b/apps/cs/src/shared/ui/input-date-range-picker.tsx index 9f574661e..1ee2bc5e1 100644 --- a/apps/cs/src/shared/ui/input-date-range-picker.tsx +++ b/apps/cs/src/shared/ui/input-date-range-picker.tsx @@ -20,7 +20,7 @@ function InputDateRangePicker({ useEffect(() => { if (dateRange.from && dateRange.to && dateRange.from > dateRange.to) { - alert("시작일보다 종료일이 커야 합니다."); + alert("종료일이 시작일보다 이전일 수 없습니다."); setDateRange({ ...dateRange, to: dateRange.from }); } }, [dateRange]); From 1f33f55079fbad386053ff0117895f0550429e1b Mon Sep 17 00:00:00 2001 From: bicochan Date: Wed, 30 Jul 2025 16:04:51 +0900 Subject: [PATCH 03/37] =?UTF-8?q?[apps/cs]=20design:=20=EA=B2=8C=EC=8B=9C?= =?UTF-8?q?=ED=8C=90=20=ED=86=B5=EA=B3=84=20=EB=A0=88=EC=9D=B4=EC=95=84?= =?UTF-8?q?=EC=9B=83=20=EC=9E=91=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../board-statistics/page.tsx | 2 + .../api/board-statistics-service.ts | 57 +++ apps/cs/src/pages/board-statistics/index.ts | 1 + .../model/board-statistics-interface.ts | 42 ++ .../board-statistics/model/chart-data.ts | 130 +++++++ .../ui/board-statistics-page.tsx | 358 ++++++++++++++++++ 6 files changed, 590 insertions(+) create mode 100644 apps/cs/app/(with-base-layout)/board-statistics/page.tsx create mode 100644 apps/cs/src/pages/board-statistics/api/board-statistics-service.ts create mode 100644 apps/cs/src/pages/board-statistics/index.ts create mode 100644 apps/cs/src/pages/board-statistics/model/board-statistics-interface.ts create mode 100644 apps/cs/src/pages/board-statistics/model/chart-data.ts create mode 100644 apps/cs/src/pages/board-statistics/ui/board-statistics-page.tsx diff --git a/apps/cs/app/(with-base-layout)/board-statistics/page.tsx b/apps/cs/app/(with-base-layout)/board-statistics/page.tsx new file mode 100644 index 000000000..02821377f --- /dev/null +++ b/apps/cs/app/(with-base-layout)/board-statistics/page.tsx @@ -0,0 +1,2 @@ +import { BoardStatisticsPage } from "@/pages/board-statistics"; +export default BoardStatisticsPage; diff --git a/apps/cs/src/pages/board-statistics/api/board-statistics-service.ts b/apps/cs/src/pages/board-statistics/api/board-statistics-service.ts new file mode 100644 index 000000000..1897e39ba --- /dev/null +++ b/apps/cs/src/pages/board-statistics/api/board-statistics-service.ts @@ -0,0 +1,57 @@ +import { client } from "@/shared/api"; +import { ENDPOINT } from "@/shared/config"; +import { + type BoardStatisticsParams, + type BoardStatistics, + type BoardStatisticsService, +} from "../model/board-statistics-interface"; + +// 임시 모의 데이터 +const mockBoardStatisticsData: BoardStatistics = { + totalPosts: 2456, + totalComments: 156, + averageRating: 4.2, + totalViews: 45678, + dayList: [ + { date: "1월", posts: 10, comments: 5, views: 800 }, + { date: "2월", posts: 15, comments: 8, views: 1200 }, + { date: "3월", posts: 12, comments: 10, views: 1000 }, + { date: "4월", posts: 18, comments: 15, views: 1500 }, + { date: "5월", posts: 22, comments: 20, views: 1800 }, + { date: "6월", posts: 20, comments: 18, views: 1600 }, + { date: "7월", posts: 25, comments: 22, views: 2000 }, + ], + boardList: [ + { boardType: "notice", boardName: "공지사항", count: 45 }, + { boardType: "faq", boardName: "FAQ", count: 120 }, + { boardType: "qna", boardName: "Q&A", count: 180 }, + { boardType: "free", boardName: "자유게시판", count: 95 }, + ], + statusList: [ + { status: "completed", statusName: "답변완료", count: 75 }, + { status: "waiting", statusName: "답변대기", count: 25 }, + ], +}; + +class BoardStatisticsApiService implements BoardStatisticsService { + async getBoardStatistics( + params: BoardStatisticsParams, + ): Promise { + try { + // 실제 API 연동 시 아래 코드 사용 + // const response = await client.get( + // `${ENDPOINT.CMS_SERVICE.BOARD_STATISTICS}`, + // { params }, + // ); + // return response.data; + + // 임시 모의 데이터 반환 + return Promise.resolve(mockBoardStatisticsData); + } catch (error) { + console.error("게시판 통계 데이터 조회 실패:", error); + throw error; + } + } +} + +export const BoardStatisticsApi = new BoardStatisticsApiService(); diff --git a/apps/cs/src/pages/board-statistics/index.ts b/apps/cs/src/pages/board-statistics/index.ts new file mode 100644 index 000000000..8ed0e1033 --- /dev/null +++ b/apps/cs/src/pages/board-statistics/index.ts @@ -0,0 +1 @@ +export { BoardStatisticsPage } from "./ui/board-statistics-page"; diff --git a/apps/cs/src/pages/board-statistics/model/board-statistics-interface.ts b/apps/cs/src/pages/board-statistics/model/board-statistics-interface.ts new file mode 100644 index 000000000..8ec52dabf --- /dev/null +++ b/apps/cs/src/pages/board-statistics/model/board-statistics-interface.ts @@ -0,0 +1,42 @@ +import type { PageableList, PageableParams } from "@/shared/model"; + +export interface BoardStatisticsParams extends PageableParams { + keywordType?: string; + keyword?: string; + siteId?: string; + startDate?: string; + endDate?: string; +} + +export interface BoardStatistics { + totalPosts: number; + totalComments: number; + averageRating: number; + totalViews: number; + dayList: DayStatistics[]; + boardList: BoardTypeStatistics[]; + statusList: StatusStatistics[]; +} + +interface DayStatistics { + date: string; + posts: number; + comments: number; + views: number; +} + +interface BoardTypeStatistics { + boardType: string; + boardName: string; + count: number; +} + +interface StatusStatistics { + status: string; + statusName: string; + count: number; +} + +export interface BoardStatisticsService { + getBoardStatistics(params: BoardStatisticsParams): Promise; +} diff --git a/apps/cs/src/pages/board-statistics/model/chart-data.ts b/apps/cs/src/pages/board-statistics/model/chart-data.ts new file mode 100644 index 000000000..2a9b6671f --- /dev/null +++ b/apps/cs/src/pages/board-statistics/model/chart-data.ts @@ -0,0 +1,130 @@ +import type { ChartData, ChartOptions } from "chart.js"; +import { getCssVariableValue } from "@common/components"; +import type { BoardStatistics } from "./board-statistics-interface"; + +export const chartData = { + day: ( + data: BoardStatistics, + ): { + data: ChartData<"line">; + options: ChartOptions<"line">; + } => { + return { + data: { + labels: data.dayList.map((item) => item.date), + datasets: [ + { + type: "line", + label: "신규게시물", + data: data.dayList.map((item) => item.posts), + borderColor: getCssVariableValue("--chart-1"), + backgroundColor: "rgba(59, 130, 246, 0.1)", + tension: 0.4, + }, + { + type: "line", + label: "답변대기", + data: data.dayList.map((item) => item.comments), + borderColor: getCssVariableValue("--chart-2"), + backgroundColor: "rgba(236, 72, 153, 0.1)", + tension: 0.4, + }, + { + type: "line", + label: "조회수", + data: data.dayList.map((item) => item.views), + borderColor: getCssVariableValue("--chart-3"), + backgroundColor: "rgba(168, 85, 247, 0.1)", + tension: 0.4, + hidden: true, + }, + ], + }, + options: { + maintainAspectRatio: false, + responsive: true, + plugins: { + legend: { + position: "bottom", + }, + }, + scales: { + y: { + ticks: { + precision: 0, + }, + }, + }, + }, + }; + }, + + board: ( + data: BoardStatistics, + ): { + data: ChartData<"bar">; + options: ChartOptions<"bar">; + } => { + return { + data: { + labels: data.boardList.map((item) => item.boardName), + datasets: [ + { + type: "bar", + label: "게시판별 분포", + data: data.boardList.map((item) => item.count), + backgroundColor: data.boardList.map((_, index) => + getCssVariableValue(`--chart-${(index % 5) + 1}`), + ), + }, + ], + }, + options: { + maintainAspectRatio: false, + indexAxis: "y", + scales: { + x: { + ticks: { + precision: 0, + }, + }, + }, + plugins: { + legend: { + display: false, + }, + }, + }, + }; + }, + + status: ( + data: BoardStatistics, + ): { + data: ChartData<"doughnut">; + options: ChartOptions<"doughnut">; + } => { + return { + data: { + labels: data.statusList.map((item) => item.statusName), + datasets: [ + { + type: "doughnut", + data: data.statusList.map((item) => item.count), + backgroundColor: data.statusList.map((_, index) => + getCssVariableValue(`--chart-${(index % 5) + 1}`), + ), + }, + ], + }, + options: { + maintainAspectRatio: false, + plugins: { + legend: { + position: "bottom", + }, + }, + }, + }; + }, +}; diff --git a/apps/cs/src/pages/board-statistics/ui/board-statistics-page.tsx b/apps/cs/src/pages/board-statistics/ui/board-statistics-page.tsx new file mode 100644 index 000000000..d879c34d6 --- /dev/null +++ b/apps/cs/src/pages/board-statistics/ui/board-statistics-page.tsx @@ -0,0 +1,358 @@ +"use client"; + +import dayjs from "dayjs"; +import { useState } from "react"; +import { keepPreviousData, useQuery } from "@tanstack/react-query"; +import { + Chart as ChartJS, + CategoryScale, + LinearScale, + PointElement, + LineElement, + BarElement, + ArcElement, + Filler, + Legend, + Tooltip, +} from "chart.js"; +import { Bar, Doughnut, Line } from "react-chartjs-2"; +import { + Button, + Label, + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@common/components"; +import { SiteSelect } from "@/entities/site"; +import { ENDPOINT } from "@/shared/config"; +import { NoData } from "@/shared/ui/no-data"; +import { InputDateRangePicker } from "@/shared/ui/input-date-range-picker"; +import { BoardStatisticsApi } from "../api/board-statistics-service"; +import { chartData } from "../model/chart-data"; +import type { BoardStatisticsParams } from "../model/board-statistics-interface"; + +ChartJS.register( + CategoryScale, + LinearScale, + PointElement, + LineElement, + BarElement, + ArcElement, + Filler, + Legend, + Tooltip, +); + +type DateRange = { + from?: Date | undefined; + to?: Date | undefined; +}; + +function BoardStatisticsPage() { + const defaultDateRange: DateRange = { + from: dayjs().subtract(7, "day").toDate(), + to: dayjs().toDate(), + }; + + const [siteId, setSiteId] = useState(""); + const [presetDateRange, setPresetDateRange] = useState("1W"); + const [dateRange, setDateRange] = useState(defaultDateRange); + const [searchParams, setSearchParams] = useState({ + siteId: "", + startDate: dayjs(defaultDateRange.from).format("YYYY-MM-DD"), + endDate: dayjs(defaultDateRange.to).format("YYYY-MM-DD"), + }); + + const { data: boardStatisticsData } = useQuery({ + queryKey: ["board-statistics", searchParams], + queryFn: () => + BoardStatisticsApi.getBoardStatistics({ + ...searchParams, + }), + placeholderData: keepPreviousData, + }); + + const handlePresetDateRange = (value: string) => { + let presetDateRange: DateRange; + switch (value) { + case "1W": + presetDateRange = { + from: dayjs().subtract(7, "day").toDate(), + to: dayjs().toDate(), + }; + break; + case "1M": + presetDateRange = { + from: dayjs().subtract(30, "day").toDate(), + to: dayjs().toDate(), + }; + break; + case "3M": + presetDateRange = { + from: dayjs().subtract(90, "day").toDate(), + to: dayjs().toDate(), + }; + break; + default: + presetDateRange = defaultDateRange; + } + setPresetDateRange(value); + setDateRange(presetDateRange); + }; + + const handleDateRangeChange = (dateRange: DateRange) => { + setDateRange(dateRange); + setPresetDateRange(""); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + const params: BoardStatisticsParams = { + siteId, + startDate: dateRange.from + ? dayjs(dateRange.from).format("YYYY-MM-DD") + : "", + endDate: dateRange.to ? dayjs(dateRange.to).format("YYYY-MM-DD") : "", + }; + setSearchParams(params); + }; + + const handleReset = () => { + setSiteId(""); + setDateRange(defaultDateRange); + setPresetDateRange("1W"); + setSearchParams({ + siteId: "", + startDate: dayjs(defaultDateRange.from).format("YYYY-MM-DD"), + endDate: dayjs(defaultDateRange.to).format("YYYY-MM-DD"), + }); + }; + + return ( +
+
+
+ + + + + setSiteId(value)} + /> + + + +
+ + {/* 주요 지표 카드 */} +
+
+
+

총 게시물

+
+
+ {boardStatisticsData?.totalPosts.toLocaleString() || 0} +
+
+ +
+
+
+
+ +
+
+

답변대기

+
+
+ {boardStatisticsData?.totalComments.toLocaleString() || 0} +
+
+ +
+
+
+
+ +
+
+

평균평점

+
+
+ {boardStatisticsData?.averageRating.toFixed(1) || 0} +
+
+ +
+
+
+
+ +
+
+

총 조회수

+
+
+ {boardStatisticsData?.totalViews.toLocaleString() || 0} +
+
+ +
+
+
+
+
+ + {/* 차트 영역 */} +
+
+
+

일별 게시물 현황

+
+
+ {boardStatisticsData?.dayList?.length ? ( + + ) : ( + + )} +
+
+ +
+
+
+

답변상태

+
+
+ {boardStatisticsData?.statusList?.length ? ( + + ) : ( + + )} +
+
+ +
+
+

게시판별 분포

+
+
+ {boardStatisticsData?.boardList?.length ? ( + + ) : ( + + )} +
+
+
+
+
+ ); +} + +export { BoardStatisticsPage }; From 713928e7947602142c2853abb8894a39d28634ea Mon Sep 17 00:00:00 2001 From: bicochan Date: Thu, 31 Jul 2025 10:37:47 +0900 Subject: [PATCH 04/37] =?UTF-8?q?[apps/cs]=20refactor:=20=EB=A9=94?= =?UTF-8?q?=EB=89=B4=20=EB=AF=B8=EB=A6=AC=EB=B3=B4=EA=B8=B0=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EC=A1=B0=EA=B1=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/common/components/src/ui/lnb/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/common/components/src/ui/lnb/index.tsx b/packages/common/components/src/ui/lnb/index.tsx index d7fabd39b..dee4356f6 100644 --- a/packages/common/components/src/ui/lnb/index.tsx +++ b/packages/common/components/src/ui/lnb/index.tsx @@ -67,7 +67,7 @@ export function LNB({ const { data: previewTreeMenuListData } = useQuery({ queryKey: [ENDPOINT.CMS_SERVICE.MENUS, siteId, "preview"], queryFn: () => getPreviewTreeMenuList(siteId), - enabled: isLoggedIn && previewMode, + enabled: isLoggedIn && !!previewMode, }); const { data: anonymousMenuListData } = useQuery({ From 26f222525d8a671e0ddcac0729c893e575da07b3 Mon Sep 17 00:00:00 2001 From: bicochan Date: Thu, 31 Jul 2025 11:48:27 +0900 Subject: [PATCH 05/37] =?UTF-8?q?[apps/cs]=20refactor:=20=EC=A0=91?= =?UTF-8?q?=EC=86=8D=20=EB=A1=9C=EA=B7=B8=20=EB=8F=84=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=EC=97=94=ED=8B=B0=ED=8B=B0=EB=A1=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/cs/src/app/index.tsx | 2 +- apps/cs/src/app/providers/index.ts | 1 - .../api/connection-log-service.ts | 20 +++++++++++++++---- apps/cs/src/entities/connection-log/index.ts | 6 ++++++ .../model/connection-log-interface.ts | 20 +++++++++++++++++-- .../pages/user-statistics/model/chart-data.ts | 2 +- .../user-statistics/model/table-columns.ts | 2 +- .../ui/user-statistics-page.tsx | 8 +++++--- 8 files changed, 48 insertions(+), 13 deletions(-) delete mode 100644 apps/cs/src/app/providers/index.ts rename apps/cs/src/{pages/user-statistics => entities/connection-log}/api/connection-log-service.ts (63%) create mode 100644 apps/cs/src/entities/connection-log/index.ts rename apps/cs/src/{pages/user-statistics => entities/connection-log}/model/connection-log-interface.ts (74%) diff --git a/apps/cs/src/app/index.tsx b/apps/cs/src/app/index.tsx index 692b55ef0..6ba1e325a 100644 --- a/apps/cs/src/app/index.tsx +++ b/apps/cs/src/app/index.tsx @@ -2,8 +2,8 @@ import "./styles/base.css"; import "./styles/components.css"; import "@fontsource-variable/noto-sans-kr"; -import { AppProvider } from "./providers"; import { cookies } from "next/headers"; +import { AppProvider } from "./providers/app-provider"; const App = async ({ children }: Readonly<{ children: React.ReactNode }>) => { const theme = (await cookies()).get("site-theme-key"); diff --git a/apps/cs/src/app/providers/index.ts b/apps/cs/src/app/providers/index.ts deleted file mode 100644 index 15f99b7fd..000000000 --- a/apps/cs/src/app/providers/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { AppProvider } from "./app-provider"; diff --git a/apps/cs/src/pages/user-statistics/api/connection-log-service.ts b/apps/cs/src/entities/connection-log/api/connection-log-service.ts similarity index 63% rename from apps/cs/src/pages/user-statistics/api/connection-log-service.ts rename to apps/cs/src/entities/connection-log/api/connection-log-service.ts index 0e2daeb5b..0b4cc55ad 100644 --- a/apps/cs/src/pages/user-statistics/api/connection-log-service.ts +++ b/apps/cs/src/entities/connection-log/api/connection-log-service.ts @@ -2,17 +2,19 @@ import { client } from "@/shared/api"; import { ENDPOINT } from "@/shared/config"; import { type ConnectionLogParams, - type ConnectionLogList, type ConnectionStatisticsParams, type ConnectionStatistics, type ConnectionLogService, + type ConnectionLogPageList, + type ConnectionLogPayload, + type ConnectionLog, } from "../model/connection-log-interface"; class ConnectionLogApiService implements ConnectionLogService { - async getConnectionLog( + async getConnectionLogPage( params: ConnectionLogParams, - ): Promise { - const response = await client.get( + ): Promise { + const response = await client.get( `${ENDPOINT.CMS_SERVICE.CONNECTION_LOG}`, { params }, ); @@ -28,6 +30,16 @@ class ConnectionLogApiService implements ConnectionLogService { ); return response.data; } + + async saveConnectionLog( + payload: ConnectionLogPayload, + ): Promise { + const response = await client.post( + `${ENDPOINT.CMS_SERVICE.CONNECTION_LOG}`, + payload, + ); + return response.data; + } } export const ConnectionLogApi = new ConnectionLogApiService(); diff --git a/apps/cs/src/entities/connection-log/index.ts b/apps/cs/src/entities/connection-log/index.ts new file mode 100644 index 000000000..d9c61a988 --- /dev/null +++ b/apps/cs/src/entities/connection-log/index.ts @@ -0,0 +1,6 @@ +export { ConnectionLogApi } from "./api/connection-log-service"; +export type { + ConnectionLog, + ConnectionStatistics, + ConnectionStatisticsParams, +} from "./model/connection-log-interface"; diff --git a/apps/cs/src/pages/user-statistics/model/connection-log-interface.ts b/apps/cs/src/entities/connection-log/model/connection-log-interface.ts similarity index 74% rename from apps/cs/src/pages/user-statistics/model/connection-log-interface.ts rename to apps/cs/src/entities/connection-log/model/connection-log-interface.ts index 6fbf4dc15..aed70873f 100644 --- a/apps/cs/src/pages/user-statistics/model/connection-log-interface.ts +++ b/apps/cs/src/entities/connection-log/model/connection-log-interface.ts @@ -22,11 +22,24 @@ export interface ConnectionLog { menuCd: number; siteId: string; urlPath: string; +} + +export interface ConnectionLogList extends ConnectionLog { siteNm: string; menuNm: string; wbsrKndNm: string; } +export interface ConnectionLogPayload { + cntnId?: string; + cntnIp?: string; + cntnRgn?: string; + wbsrKnd?: string; + menuCd?: number; + siteId?: string; + urlPath: string; +} + export interface ConnectionStatisticsParams { keywordType?: string; keyword?: string; @@ -62,11 +75,14 @@ export interface ConnectionStatistics { browserList: BrowserConnectionStatistics[]; } -export type ConnectionLogList = PageableList; +export type ConnectionLogPageList = PageableList; export interface ConnectionLogService { - getConnectionLog(params: ConnectionLogParams): Promise; + getConnectionLogPage( + params: ConnectionLogParams, + ): Promise; getConnectionStatistics( params: ConnectionStatisticsParams, ): Promise; + saveConnectionLog(payload: ConnectionLogPayload): Promise; } diff --git a/apps/cs/src/pages/user-statistics/model/chart-data.ts b/apps/cs/src/pages/user-statistics/model/chart-data.ts index 455dcac56..87a5322c1 100644 --- a/apps/cs/src/pages/user-statistics/model/chart-data.ts +++ b/apps/cs/src/pages/user-statistics/model/chart-data.ts @@ -1,6 +1,6 @@ import type { ChartData, ChartOptions } from "chart.js"; import { getCssVariableValue } from "@common/components"; -import type { ConnectionStatistics } from "./connection-log-interface"; +import type { ConnectionStatistics } from "@/entities/connection-log"; export const chartData = { day: ( diff --git a/apps/cs/src/pages/user-statistics/model/table-columns.ts b/apps/cs/src/pages/user-statistics/model/table-columns.ts index 09fe58adf..8530345d3 100644 --- a/apps/cs/src/pages/user-statistics/model/table-columns.ts +++ b/apps/cs/src/pages/user-statistics/model/table-columns.ts @@ -1,5 +1,5 @@ import type { ColumnDef } from "@tanstack/react-table"; -import type { ConnectionLog } from "./connection-log-interface"; +import type { ConnectionLog } from "@/entities/connection-log"; import dayjs from "dayjs"; export const columns: ColumnDef[] = [ diff --git a/apps/cs/src/pages/user-statistics/ui/user-statistics-page.tsx b/apps/cs/src/pages/user-statistics/ui/user-statistics-page.tsx index 801ca5eb0..9ddfdd124 100644 --- a/apps/cs/src/pages/user-statistics/ui/user-statistics-page.tsx +++ b/apps/cs/src/pages/user-statistics/ui/user-statistics-page.tsx @@ -27,15 +27,17 @@ import { SelectTrigger, SelectValue, } from "@common/components"; +import { + ConnectionLogApi, + type ConnectionStatisticsParams, +} from "@/entities/connection-log"; import { SiteSelect } from "@/entities/site"; import { useDataTable } from "@/shared/lib"; import { ENDPOINT } from "@/shared/config"; import { NoData } from "@/shared/ui/no-data"; import { InputDateRangePicker } from "@/shared/ui/input-date-range-picker"; -import { ConnectionLogApi } from "../api/connection-log-service"; import { chartData } from "../model/chart-data"; import { columns } from "../model/table-columns"; -import type { ConnectionStatisticsParams } from "../model/connection-log-interface"; ChartJS.register( CategoryScale, @@ -80,7 +82,7 @@ function UserStatisticsPage() { const query = useQuery({ queryKey: [ENDPOINT.CMS_SERVICE.CONNECTION_LOG, searchParams], queryFn: () => - ConnectionLogApi.getConnectionLog({ + ConnectionLogApi.getConnectionLogPage({ ...searchParams, }), placeholderData: keepPreviousData, From 3f85aa676c722d92b4d34cd4e368d857aa666e41 Mon Sep 17 00:00:00 2001 From: bicochan Date: Thu, 31 Jul 2025 12:45:01 +0900 Subject: [PATCH 06/37] =?UTF-8?q?[common/components]=20feat:=20=EC=A0=91?= =?UTF-8?q?=EC=86=8D=20=EB=A1=9C=EA=B7=B8=20=EC=A0=80=EC=9E=A5=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=9E=91=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/src/api/connection-log.ts | 34 +++++++++++++++++++ packages/common/components/src/api/index.ts | 1 + packages/common/components/src/config/api.ts | 1 + .../common/components/src/ui/lnb/index.tsx | 15 +++++++- 4 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 packages/common/components/src/api/connection-log.ts diff --git a/packages/common/components/src/api/connection-log.ts b/packages/common/components/src/api/connection-log.ts new file mode 100644 index 000000000..b421b7cb3 --- /dev/null +++ b/packages/common/components/src/api/connection-log.ts @@ -0,0 +1,34 @@ +import { ENDPOINT } from "../config"; +import { getApiClient } from "./client"; + +export interface ConnectionLog { + cntnSn: number; + cntnDt: string; + cntnId: string; + cntnIp: string; + cntnRgn: string; + wbsrKnd: string; + menuCd: number; + siteId: string; + urlPath: string; +} + +export interface ConnectionLogPayload { + cntnId?: string; + cntnIp?: string; + cntnRgn?: string; + wbsrKnd?: string; + menuCd?: number | null; + siteId?: string; + urlPath: string; +} + +const client = getApiClient(); + +export const saveConnectionLog = async (payload: ConnectionLogPayload) => { + const response = await client.post( + `${ENDPOINT.CMS_SERVICE.CONNECTION_LOG}`, + payload, + ); + return response.data; +}; diff --git a/packages/common/components/src/api/index.ts b/packages/common/components/src/api/index.ts index 10d68732c..d569765c2 100644 --- a/packages/common/components/src/api/index.ts +++ b/packages/common/components/src/api/index.ts @@ -1,4 +1,5 @@ export * from "./client"; +export * from "./connection-log"; export * from "./menu"; export * from "./popup"; export * from "./site"; diff --git a/packages/common/components/src/config/api.ts b/packages/common/components/src/config/api.ts index 6772182fb..a12ff5887 100644 --- a/packages/common/components/src/config/api.ts +++ b/packages/common/components/src/config/api.ts @@ -6,6 +6,7 @@ export const ENDPOINT = { SITES: "/cms-service/api/v1/sites", POPUPS: "/cms-service/api/v1/popups", IPS: "/cms-service/api/v1/site-ips", + CONNECTION_LOG: "/cms-service/api/v1/cntnlog", }, USER_SERVICE: { USERS: "/user-service/api/v1/users", diff --git a/packages/common/components/src/ui/lnb/index.tsx b/packages/common/components/src/ui/lnb/index.tsx index dee4356f6..8e3c2aebf 100644 --- a/packages/common/components/src/ui/lnb/index.tsx +++ b/packages/common/components/src/ui/lnb/index.tsx @@ -3,6 +3,7 @@ import { useState, useEffect, useRef } from "react"; import { useQuery } from "@tanstack/react-query"; import { ChevronRight } from "lucide-react"; +import { useDetectDevice } from "@frontend-opensource/use-react-hooks"; import { getConfig } from "@common/config"; import { getParentIds } from "./lib"; import { @@ -24,9 +25,10 @@ import { import { ENDPOINT } from "../../config"; import { cn, getCookie, setCookie } from "../../lib"; import { - getAnonymouseMenuList, getMenuList, getPreviewTreeMenuList, + getAnonymouseMenuList, + saveConnectionLog, type MenuItem, } from "../../api"; @@ -55,6 +57,7 @@ export function LNB({ const [defaultOpenMenuIds, setDefaultOpenMenuIds] = useState([]); const [currentMenuCode, setCurrentMenuCode] = useState(null); const prevPathRef = useRef(currentPath); + const { browser } = useDetectDevice(); const siteId = propSiteId ?? appSiteId; @@ -125,6 +128,16 @@ export function LNB({ } if (matchedMenuCode) setCurrentMenuCode(matchedMenuCode); + + // 접속 로그 저장 + saveConnectionLog({ + cntnId: userId, + cntnRgn: navigator.language, + wbsrKnd: browser, + menuCd: matchedMenuCode, + siteId, + urlPath: currentPath, + }); }, [menuList, currentPath]); function MenuItem({ From 8bb3253aa585a40f23e040fbe2c632a067f9bd73 Mon Sep 17 00:00:00 2001 From: bicochan Date: Thu, 31 Jul 2025 12:45:27 +0900 Subject: [PATCH 07/37] =?UTF-8?q?[apps/cs]=20chore:=20=EC=A0=91=EC=86=8D?= =?UTF-8?q?=EC=9E=90=20=ED=86=B5=EA=B3=84=20=ED=85=8C=EC=9D=B4=EB=B8=94=20?= =?UTF-8?q?=EC=BF=BC=EB=A6=AC=20=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/cs/src/pages/user-statistics/ui/user-statistics-page.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/cs/src/pages/user-statistics/ui/user-statistics-page.tsx b/apps/cs/src/pages/user-statistics/ui/user-statistics-page.tsx index 9ddfdd124..b4c821551 100644 --- a/apps/cs/src/pages/user-statistics/ui/user-statistics-page.tsx +++ b/apps/cs/src/pages/user-statistics/ui/user-statistics-page.tsx @@ -80,10 +80,12 @@ function UserStatisticsPage() { }); const query = useQuery({ - queryKey: [ENDPOINT.CMS_SERVICE.CONNECTION_LOG, searchParams], + queryKey: [ENDPOINT.CMS_SERVICE.CONNECTION_LOG, searchParams, pagination], queryFn: () => ConnectionLogApi.getConnectionLogPage({ ...searchParams, + page: pagination.pageIndex, + size: pagination.pageSize, }), placeholderData: keepPreviousData, }); From 312c06be3149251faab90fa11bb430c00573f760 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=B5=9C=EC=A7=80=EC=B2=A0?= Date: Fri, 1 Aug 2025 14:29:58 +0900 Subject: [PATCH 08/37] =?UTF-8?q?=EB=A9=94=EB=89=B4=20INFO=20=EB=B0=8F=20?= =?UTF-8?q?=EA=B0=9C=EC=9D=B8=EC=A0=95=EB=B3=B4=EC=A0=9C=EA=B3=B5=EB=8F=99?= =?UTF-8?q?=EC=9D=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/cs/src/pages/menu/ui/base-menu-form.tsx | 18 +++++- apps/cs/src/pages/menu/ui/type-menu-form.tsx | 58 +++++++++++++++---- .../pages/survey/ui/view-survey-article.tsx | 23 ++++++++ apps/cs/src/shared/ui/info-tooltip.tsx | 9 ++- 4 files changed, 94 insertions(+), 14 deletions(-) diff --git a/apps/cs/src/pages/menu/ui/base-menu-form.tsx b/apps/cs/src/pages/menu/ui/base-menu-form.tsx index ff27db932..b36179ac8 100644 --- a/apps/cs/src/pages/menu/ui/base-menu-form.tsx +++ b/apps/cs/src/pages/menu/ui/base-menu-form.tsx @@ -64,7 +64,10 @@ function BaseMenuForm({ form, menuCd }: BaseMenuFormProps) { - 메뉴 영문명 + + 메뉴 영문명 + + - 메뉴 유형 + + 메뉴 유형 + + {menuType === "CONTENTS" && ( - 콘텐츠 + + 콘텐츠 + +
@@ -92,7 +96,10 @@ function TypeMenuForm({ form, menuType }: TypeMenuFormProps) { )} {menuType === "BOARD" && ( - 게시판 + + 게시판 + +
@@ -110,7 +117,10 @@ function TypeMenuForm({ form, menuType }: TypeMenuFormProps) { menuType === "INSIDE" || menuType === "OUTSIDE") && ( - 연결 URL + + 연결 URL + + - 연결 형태 + + 연결 형태 + + - 메뉴 평가 사용 여부 + + 메뉴 평가 사용 여부 + + - 메뉴 서브명 + + 메뉴 서브명 + + - 메뉴 아이콘 + + 메뉴 아이콘 + +
@@ -237,7 +261,10 @@ function TypeMenuForm({ form, menuType }: TypeMenuFormProps) { - 출력 여부 + + 사이트맵 출력 여부 + + - 사용 여부 + + 사용 여부 + + - QR코드 + + QR코드 + + - 담당자 + + 담당자 + +
diff --git a/apps/cs/src/pages/survey/ui/view-survey-article.tsx b/apps/cs/src/pages/survey/ui/view-survey-article.tsx index 58f52d090..5caf6d129 100644 --- a/apps/cs/src/pages/survey/ui/view-survey-article.tsx +++ b/apps/cs/src/pages/survey/ui/view-survey-article.tsx @@ -187,8 +187,31 @@ function ViewSurveyArticle({ srvySn }: { srvySn: string }) { )} />
+
+ + {/* 개인정보제공동의 */} +
+
+ +
+ +

+ 본 설문조사에서 수집된 개인정보는 설문조사 목적으로만 사용되며, + 통계 처리 및 연구 목적으로 활용됩니다. 제공된 정보는 안전하게 보호되며, + 동의하지 않으시면 설문 참여가 제한됩니다. +

+
+
+
+
{userSurvey?.srvyWrtGdCn} diff --git a/apps/cs/src/shared/ui/info-tooltip.tsx b/apps/cs/src/shared/ui/info-tooltip.tsx index 11cb33e07..2c43ecf9c 100644 --- a/apps/cs/src/shared/ui/info-tooltip.tsx +++ b/apps/cs/src/shared/ui/info-tooltip.tsx @@ -7,7 +7,14 @@ function InfoTooltip({ text }: { text: string }) { -

{text}

+

+ {text.split("\n").map((line, idx) => ( + + {line} + {idx !== text.split("\n").length - 1 &&
} +
+ ))} +

); From f5a49a44c476118f8445dab36e5814cd96b51718 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=B5=9C=EC=A7=80=EC=B2=A0?= Date: Fri, 1 Aug 2025 14:34:19 +0900 Subject: [PATCH 09/37] =?UTF-8?q?=EA=B3=B5=ED=86=B5=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=20=EB=B6=84=EB=A6=AC=20=EB=B0=8F=202FA=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/cm/.env.example | 7 + apps/cm/.gitignore | 41 +++ apps/cm/.prettierrc | 3 + apps/cm/app/api/auth/logout/route.ts | 17 + apps/cm/app/api/proxy/[...url]/route.ts | 145 ++++++++ apps/cm/app/auth/login/page.tsx | 2 + apps/cm/app/dashboard/page.tsx | 2 + apps/cm/app/layout.tsx | 8 + apps/cm/eslint.config.mjs | 21 ++ apps/cm/middleware.ts | 79 +++++ apps/cm/next.config.ts | 40 +++ apps/cm/package.json | 63 ++++ apps/cm/pages/.gitkeep | 0 apps/cm/postcss.config.mjs | 8 + apps/cm/public/favicon.ico | Bin 0 -> 4286 bytes apps/cm/public/images/bg_login.jpg | Bin 0 -> 135228 bytes apps/cm/public/images/img_cc_by.png | Bin 0 -> 4498 bytes apps/cm/public/images/img_cc_by_nc.png | Bin 0 -> 5637 bytes apps/cm/public/images/img_cc_by_nc_nd.png | Bin 0 -> 6651 bytes apps/cm/public/images/img_cc_by_nc_sa.png | Bin 0 -> 6694 bytes apps/cm/public/images/img_cc_by_nd.png | Bin 0 -> 5510 bytes apps/cm/public/images/img_cc_by_sa.png | Bin 0 -> 5668 bytes apps/cm/public/images/img_opentype01.png | Bin 0 -> 3246 bytes apps/cm/public/images/img_opentype02.png | Bin 0 -> 3628 bytes apps/cm/public/images/img_opentype03.png | Bin 0 -> 3605 bytes apps/cm/public/images/img_opentype04.png | Bin 0 -> 4117 bytes apps/cm/src/app/index.tsx | 20 ++ apps/cm/src/app/providers/app-provider.tsx | 49 +++ apps/cm/src/app/providers/index.ts | 1 + apps/cm/src/app/styles/base.css | 21 ++ apps/cm/src/app/styles/components.css | 129 ++++++++ .../cm/src/entities/auth/api/login-service.ts | 85 +++++ apps/cm/src/entities/auth/index.ts | 2 + .../cm/src/entities/auth/lib/auth-wrapper.tsx | 49 +++ .../cm/src/entities/auth/lib/token-manager.ts | 59 ++++ .../entities/auth/model/login-interface.ts | 9 + .../cm/src/entities/menu-authority/@x/menu.ts | 1 + .../src/entities/menu-authority/@x/posting.ts | 1 + .../api/menu-authority-service.ts | 50 +++ apps/cm/src/entities/menu-authority/index.ts | 9 + .../model/menu-authority-interface.ts | 51 +++ .../model/menu-authority-table-columns.tsx | 117 +++++++ .../menu-authority/ui/authority-button.tsx | 26 ++ .../ui/management-authority-dialog.tsx | 101 ++++++ apps/cm/src/entities/menu/api/menu-service.ts | 79 +++++ apps/cm/src/entities/menu/index.ts | 12 + .../cm/src/entities/menu/lib/menu-wrapper.tsx | 58 ++++ apps/cm/src/entities/menu/lib/utils.ts | 20 ++ .../src/entities/menu/model/menu-interface.ts | 107 ++++++ apps/cm/src/pages/auth/login/index.ts | 1 + apps/cm/src/pages/auth/login/ui/OtpModal.tsx | 153 +++++++++ .../cm/src/pages/auth/login/ui/TwoFAModal.tsx | 198 +++++++++++ .../cm/src/pages/auth/login/ui/login-page.tsx | 276 ++++++++++++++++ apps/cm/src/pages/auth/login/ui/login.css | 311 ++++++++++++++++++ apps/cm/src/pages/dashboard/index.ts | 1 + .../src/pages/dashboard/ui/dashboard-page.tsx | 94 ++++++ apps/cm/src/shared/api/client.ts | 11 + apps/cm/src/shared/api/index.ts | 1 + apps/cm/src/shared/config/api.ts | 73 ++++ apps/cm/src/shared/config/env.ts | 11 + apps/cm/src/shared/config/index.ts | 2 + apps/cm/src/shared/lib/cookie.ts | 29 ++ apps/cm/src/shared/lib/index.ts | 8 + apps/cm/src/shared/lib/match-query-status.ts | 65 ++++ apps/cm/src/shared/lib/use-alert-store.ts | 14 + .../cm/src/shared/lib/use-attachment-store.ts | 14 + apps/cm/src/shared/lib/use-data-table.tsx | 42 +++ apps/cm/src/shared/lib/use-menu-store.ts | 14 + .../src/shared/lib/use-mutation-wrapper.tsx | 29 ++ apps/cm/src/shared/lib/use-prompt.tsx | 26 ++ apps/cm/src/shared/lib/use-select-prompt.tsx | 48 +++ apps/cm/src/shared/lib/use-tus.ts | 90 +++++ apps/cm/src/shared/lib/use-user-store.ts | 14 + apps/cm/src/shared/model/api-interface.ts | 34 ++ apps/cm/src/shared/model/index.ts | 1 + apps/cm/src/shared/providers/index.ts | 2 + .../src/shared/providers/prompt-provider.tsx | 61 ++++ .../src/shared/providers/store-provider.tsx | 38 +++ apps/cm/src/shared/store/alert-store.ts | 25 ++ apps/cm/src/shared/store/attachment-store.ts | 25 ++ apps/cm/src/shared/store/index.ts | 4 + apps/cm/src/shared/store/menu-store.ts | 93 ++++++ apps/cm/src/shared/store/user-store.ts | 57 ++++ apps/cm/src/shared/ui/alert-dialog.tsx | 34 ++ apps/cm/src/shared/ui/confirm-dialog.tsx | 48 +++ apps/cm/src/shared/ui/form.tsx | 175 ++++++++++ .../cm/src/shared/ui/grid-view-data-table.tsx | 158 +++++++++ apps/cm/src/shared/ui/info-tooltip.tsx | 23 ++ .../src/shared/ui/input-date-range-picker.tsx | 47 +++ apps/cm/src/shared/ui/no-data.tsx | 17 + apps/cm/src/shared/ui/page-layout.tsx | 22 ++ apps/cm/src/shared/ui/prompt-dialog.tsx | 49 +++ .../cm/src/shared/ui/select-prompt-dialog.tsx | 68 ++++ apps/cm/src/shared/ui/skeleton-page.tsx | 14 + apps/cm/src/shared/ui/sonner.tsx | 25 ++ apps/cm/src/shared/ui/tooltip.tsx | 61 ++++ apps/cm/src/widgets/dnd-tree/index.ts | 2 + .../src/widgets/dnd-tree/ui/custom-node.tsx | 105 ++++++ apps/cm/src/widgets/dnd-tree/ui/dnd-tree.tsx | 138 ++++++++ .../src/widgets/dnd-tree/ui/editable-node.tsx | 44 +++ apps/cm/src/widgets/form-wrapper/index.ts | 1 + .../widgets/form-wrapper/ui/form-wrapper.tsx | 63 ++++ apps/cm/start_cs.sh | 25 ++ apps/cm/tailwind.config.ts | 27 ++ apps/cm/tsconfig.json | 47 +++ pnpm-lock.yaml | 162 ++++++++- 106 files changed, 4705 insertions(+), 7 deletions(-) create mode 100644 apps/cm/.env.example create mode 100644 apps/cm/.gitignore create mode 100644 apps/cm/.prettierrc create mode 100644 apps/cm/app/api/auth/logout/route.ts create mode 100644 apps/cm/app/api/proxy/[...url]/route.ts create mode 100644 apps/cm/app/auth/login/page.tsx create mode 100644 apps/cm/app/dashboard/page.tsx create mode 100644 apps/cm/app/layout.tsx create mode 100644 apps/cm/eslint.config.mjs create mode 100644 apps/cm/middleware.ts create mode 100644 apps/cm/next.config.ts create mode 100644 apps/cm/package.json create mode 100644 apps/cm/pages/.gitkeep create mode 100644 apps/cm/postcss.config.mjs create mode 100644 apps/cm/public/favicon.ico create mode 100644 apps/cm/public/images/bg_login.jpg create mode 100644 apps/cm/public/images/img_cc_by.png create mode 100644 apps/cm/public/images/img_cc_by_nc.png create mode 100644 apps/cm/public/images/img_cc_by_nc_nd.png create mode 100644 apps/cm/public/images/img_cc_by_nc_sa.png create mode 100644 apps/cm/public/images/img_cc_by_nd.png create mode 100644 apps/cm/public/images/img_cc_by_sa.png create mode 100644 apps/cm/public/images/img_opentype01.png create mode 100644 apps/cm/public/images/img_opentype02.png create mode 100644 apps/cm/public/images/img_opentype03.png create mode 100644 apps/cm/public/images/img_opentype04.png create mode 100644 apps/cm/src/app/index.tsx create mode 100644 apps/cm/src/app/providers/app-provider.tsx create mode 100644 apps/cm/src/app/providers/index.ts create mode 100644 apps/cm/src/app/styles/base.css create mode 100644 apps/cm/src/app/styles/components.css create mode 100644 apps/cm/src/entities/auth/api/login-service.ts create mode 100644 apps/cm/src/entities/auth/index.ts create mode 100644 apps/cm/src/entities/auth/lib/auth-wrapper.tsx create mode 100644 apps/cm/src/entities/auth/lib/token-manager.ts create mode 100644 apps/cm/src/entities/auth/model/login-interface.ts create mode 100644 apps/cm/src/entities/menu-authority/@x/menu.ts create mode 100644 apps/cm/src/entities/menu-authority/@x/posting.ts create mode 100644 apps/cm/src/entities/menu-authority/api/menu-authority-service.ts create mode 100644 apps/cm/src/entities/menu-authority/index.ts create mode 100644 apps/cm/src/entities/menu-authority/model/menu-authority-interface.ts create mode 100644 apps/cm/src/entities/menu-authority/model/menu-authority-table-columns.tsx create mode 100644 apps/cm/src/entities/menu-authority/ui/authority-button.tsx create mode 100644 apps/cm/src/entities/menu-authority/ui/management-authority-dialog.tsx create mode 100644 apps/cm/src/entities/menu/api/menu-service.ts create mode 100644 apps/cm/src/entities/menu/index.ts create mode 100644 apps/cm/src/entities/menu/lib/menu-wrapper.tsx create mode 100644 apps/cm/src/entities/menu/lib/utils.ts create mode 100644 apps/cm/src/entities/menu/model/menu-interface.ts create mode 100644 apps/cm/src/pages/auth/login/index.ts create mode 100644 apps/cm/src/pages/auth/login/ui/OtpModal.tsx create mode 100644 apps/cm/src/pages/auth/login/ui/TwoFAModal.tsx create mode 100644 apps/cm/src/pages/auth/login/ui/login-page.tsx create mode 100644 apps/cm/src/pages/auth/login/ui/login.css create mode 100644 apps/cm/src/pages/dashboard/index.ts create mode 100644 apps/cm/src/pages/dashboard/ui/dashboard-page.tsx create mode 100644 apps/cm/src/shared/api/client.ts create mode 100644 apps/cm/src/shared/api/index.ts create mode 100644 apps/cm/src/shared/config/api.ts create mode 100644 apps/cm/src/shared/config/env.ts create mode 100644 apps/cm/src/shared/config/index.ts create mode 100644 apps/cm/src/shared/lib/cookie.ts create mode 100644 apps/cm/src/shared/lib/index.ts create mode 100644 apps/cm/src/shared/lib/match-query-status.ts create mode 100644 apps/cm/src/shared/lib/use-alert-store.ts create mode 100644 apps/cm/src/shared/lib/use-attachment-store.ts create mode 100644 apps/cm/src/shared/lib/use-data-table.tsx create mode 100644 apps/cm/src/shared/lib/use-menu-store.ts create mode 100644 apps/cm/src/shared/lib/use-mutation-wrapper.tsx create mode 100644 apps/cm/src/shared/lib/use-prompt.tsx create mode 100644 apps/cm/src/shared/lib/use-select-prompt.tsx create mode 100644 apps/cm/src/shared/lib/use-tus.ts create mode 100644 apps/cm/src/shared/lib/use-user-store.ts create mode 100644 apps/cm/src/shared/model/api-interface.ts create mode 100644 apps/cm/src/shared/model/index.ts create mode 100644 apps/cm/src/shared/providers/index.ts create mode 100644 apps/cm/src/shared/providers/prompt-provider.tsx create mode 100644 apps/cm/src/shared/providers/store-provider.tsx create mode 100644 apps/cm/src/shared/store/alert-store.ts create mode 100644 apps/cm/src/shared/store/attachment-store.ts create mode 100644 apps/cm/src/shared/store/index.ts create mode 100644 apps/cm/src/shared/store/menu-store.ts create mode 100644 apps/cm/src/shared/store/user-store.ts create mode 100644 apps/cm/src/shared/ui/alert-dialog.tsx create mode 100644 apps/cm/src/shared/ui/confirm-dialog.tsx create mode 100644 apps/cm/src/shared/ui/form.tsx create mode 100644 apps/cm/src/shared/ui/grid-view-data-table.tsx create mode 100644 apps/cm/src/shared/ui/info-tooltip.tsx create mode 100644 apps/cm/src/shared/ui/input-date-range-picker.tsx create mode 100644 apps/cm/src/shared/ui/no-data.tsx create mode 100644 apps/cm/src/shared/ui/page-layout.tsx create mode 100644 apps/cm/src/shared/ui/prompt-dialog.tsx create mode 100644 apps/cm/src/shared/ui/select-prompt-dialog.tsx create mode 100644 apps/cm/src/shared/ui/skeleton-page.tsx create mode 100644 apps/cm/src/shared/ui/sonner.tsx create mode 100644 apps/cm/src/shared/ui/tooltip.tsx create mode 100644 apps/cm/src/widgets/dnd-tree/index.ts create mode 100644 apps/cm/src/widgets/dnd-tree/ui/custom-node.tsx create mode 100644 apps/cm/src/widgets/dnd-tree/ui/dnd-tree.tsx create mode 100644 apps/cm/src/widgets/dnd-tree/ui/editable-node.tsx create mode 100644 apps/cm/src/widgets/form-wrapper/index.ts create mode 100644 apps/cm/src/widgets/form-wrapper/ui/form-wrapper.tsx create mode 100644 apps/cm/start_cs.sh create mode 100644 apps/cm/tailwind.config.ts create mode 100644 apps/cm/tsconfig.json diff --git a/apps/cm/.env.example b/apps/cm/.env.example new file mode 100644 index 000000000..9f786831b --- /dev/null +++ b/apps/cm/.env.example @@ -0,0 +1,7 @@ +# apps/cs/src/shared/config/env.ts 참고 +NEXT_PUBLIC_PORT=3000 +NEXT_PUBLIC_PROXY_HOST=http://localhost:3000 +NEXT_PUBLIC_SITE_ID=CS +NEXT_PUBLIC_SUB_DOMAIN=http://localhost:3000 +NEXT_PUBLIC_SERVER_API_URL=http://192.168.0.102:8000 +NEXT_PUBLIC_TINY_API_KEY=t9nc4z6inquvvd5pq1vea8wcp7lb01qmqseh6egms9vpaju2 \ No newline at end of file diff --git a/apps/cm/.gitignore b/apps/cm/.gitignore new file mode 100644 index 000000000..b63718b61 --- /dev/null +++ b/apps/cm/.gitignore @@ -0,0 +1,41 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +.env* +!.env.example \ No newline at end of file diff --git a/apps/cm/.prettierrc b/apps/cm/.prettierrc new file mode 100644 index 000000000..b4bfed357 --- /dev/null +++ b/apps/cm/.prettierrc @@ -0,0 +1,3 @@ +{ + "plugins": ["prettier-plugin-tailwindcss"] +} diff --git a/apps/cm/app/api/auth/logout/route.ts b/apps/cm/app/api/auth/logout/route.ts new file mode 100644 index 000000000..fdcc9df7c --- /dev/null +++ b/apps/cm/app/api/auth/logout/route.ts @@ -0,0 +1,17 @@ +import { cookies } from "next/headers"; +import { NextResponse } from "next/server"; +import { + ACCESS_TOKEN, + AUTH_USER_ID, + CLAIM_NAME, + REFRESH_TOKEN, +} from "@/shared/config"; + +export async function POST() { + const cookieStore = await cookies(); + cookieStore.delete(ACCESS_TOKEN); + cookieStore.delete(REFRESH_TOKEN); + cookieStore.delete(AUTH_USER_ID); + cookieStore.delete(CLAIM_NAME); + return NextResponse.json({ message: "Logged out" }, { status: 200 }); +} diff --git a/apps/cm/app/api/proxy/[...url]/route.ts b/apps/cm/app/api/proxy/[...url]/route.ts new file mode 100644 index 000000000..761991e39 --- /dev/null +++ b/apps/cm/app/api/proxy/[...url]/route.ts @@ -0,0 +1,145 @@ +import { + ACCESS_TOKEN, + AUTH_USER_ID, + CLAIM_NAME, + REFRESH_TOKEN, + SERVER_API_URL, + SITE_ID, +} from "@/shared/config"; +import { cookies } from "next/headers"; +import { NextResponse } from "next/server"; + +async function handler( + request: Request, + params: { url: string[] }, + method: "GET" | "POST" | "PUT" | "DELETE", +) { + const cookieStore = await cookies(); + const headers: Record = { + "Content-Type": "application/json", + "X-Site-Id": SITE_ID, + }; + let body = {}; + const isRefreshHandler = params.url.includes("refresh"); + + console.log(`[Proxy] ${method} ${params.url.join("/")}`); + console.log(`[Proxy] Server API URL: ${SERVER_API_URL}`); + + // silent refresh + if (isRefreshHandler) { + const refreshToken = cookieStore.get(REFRESH_TOKEN); + headers[CLAIM_NAME] = refreshToken?.value ?? ""; + + if (!headers[CLAIM_NAME]) { + return NextResponse.json({ message: "Can't refresh" }, { status: 401 }); + } + } + + try { + if (!isRefreshHandler) { + body = await request.json(); + console.log(`[Proxy] Request body:`, body); + } + + const targetUrl = `${SERVER_API_URL}/${params.url.join("/")}`; + console.log(`[Proxy] Target URL: ${targetUrl}`); + + const result = await fetch(targetUrl, { + method, + headers, + body: JSON.stringify(body), + }); + + console.log(`[Proxy] Response status: ${result.status}`); + console.log(`[Proxy] Response headers:`, Object.fromEntries(result.headers.entries())); + + // 2FA 관련 엔드포인트인 경우 응답 본문도 확인 + const is2FAEndpoint = params.url.includes("2fa") || params.url.includes("auth"); + let responseData = {}; + + if (is2FAEndpoint) { + try { + responseData = await result.json(); + console.log(`[Proxy] 2FA Response data:`, responseData); + } catch { + // JSON 파싱 실패 시 빈 객체 사용 + console.log(`[Proxy] Failed to parse JSON response`); + } + } + + const accessToken = result.headers.get(ACCESS_TOKEN) || result.headers.get('ss-token'); + const refreshToken = result.headers.get(REFRESH_TOKEN); + const userId = result.headers.get(AUTH_USER_ID); + + console.log(`[Proxy] Tokens - accessToken: ${!!accessToken}, userId: ${!!userId}, refreshToken: ${!!refreshToken}`); + console.log(`[Proxy] Available headers:`, Array.from(result.headers.keys())); + + // 2FA 엔드포인트이고 실패한 경우 실제 오류 메시지 반환 + if (!result.ok && is2FAEndpoint) { + console.log(`[Proxy] 2FA endpoint failed, returning actual error`); + return NextResponse.json(responseData, { status: result.status }); + } + + // 2FA 엔드포인트이고 성공한 경우 (토큰이 헤더에 없을 수 있음) + if (result.ok && is2FAEndpoint) { + console.log(`[Proxy] 2FA endpoint succeeded, returning response data`); + return NextResponse.json(responseData, { status: result.status }); + } + + // 일반적인 실패 처리 + if (!result.ok) { + console.log(`[Proxy] General endpoint failed`); + return NextResponse.json( + { message: "Invalid Credentials" }, + { status: 401 }, + ); + } + + if (accessToken && userId) { + const response = NextResponse.json({ + [ACCESS_TOKEN]: accessToken, + [AUTH_USER_ID]: userId, + ...responseData, // 2FA 관련 추가 데이터 포함 + }); + + if (refreshToken) { + cookieStore.set(REFRESH_TOKEN, refreshToken, { + httpOnly: true, + sameSite: "lax", + path: "/", + }); + } + + console.log(`[Proxy] Success response sent`); + return response; + } + + console.log(`[Proxy] Missing tokens in response`); + return NextResponse.json( + { message: "Invalid Credentials" }, + { status: 401 }, + ); + } catch (error) { + console.error(`[Proxy] Error:`, error); + return NextResponse.json( + { message: "Server Error", error }, + { status: 500 }, + ); + } +} + +export async function POST( + request: Request, + props: { params: Promise<{ url: string[] }> }, +) { + const params = await props.params; + return handler(request, params, "POST"); +} + +export async function PUT( + request: Request, + props: { params: Promise<{ url: string[] }> }, +) { + const params = await props.params; + return handler(request, params, "PUT"); +} diff --git a/apps/cm/app/auth/login/page.tsx b/apps/cm/app/auth/login/page.tsx new file mode 100644 index 000000000..8f9e6adc6 --- /dev/null +++ b/apps/cm/app/auth/login/page.tsx @@ -0,0 +1,2 @@ +import { LoginPage } from "@/pages/auth/login"; +export default LoginPage; diff --git a/apps/cm/app/dashboard/page.tsx b/apps/cm/app/dashboard/page.tsx new file mode 100644 index 000000000..53d564ac6 --- /dev/null +++ b/apps/cm/app/dashboard/page.tsx @@ -0,0 +1,2 @@ +import { DashboardPage } from "@/pages/dashboard"; +export default DashboardPage; diff --git a/apps/cm/app/layout.tsx b/apps/cm/app/layout.tsx new file mode 100644 index 000000000..aa2049dcc --- /dev/null +++ b/apps/cm/app/layout.tsx @@ -0,0 +1,8 @@ +import type { Metadata } from "next"; +import { App } from "@/app"; + +export const metadata: Metadata = { + title: "유역하수도 통합 정보플랫폼", +}; + +export default App; diff --git a/apps/cm/eslint.config.mjs b/apps/cm/eslint.config.mjs new file mode 100644 index 000000000..9109635e9 --- /dev/null +++ b/apps/cm/eslint.config.mjs @@ -0,0 +1,21 @@ +import { dirname } from "path"; +import { fileURLToPath } from "url"; +import { FlatCompat } from "@eslint/eslintrc"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +const compat = new FlatCompat({ + baseDirectory: __dirname, +}); + +const eslintConfig = [ + ...compat.extends("next/core-web-vitals", "next/typescript"), + { + rules: { + "react-hooks/exhaustive-deps": "off", + }, + }, +]; + +export default eslintConfig; diff --git a/apps/cm/middleware.ts b/apps/cm/middleware.ts new file mode 100644 index 000000000..e0316fa9f --- /dev/null +++ b/apps/cm/middleware.ts @@ -0,0 +1,79 @@ +import { NextRequest, NextResponse } from "next/server"; +import { + CLAIM_NAME, + AUTH_USER_ID, + PORT, + PROXY_HOST, + SERVER_API_URL, + SITE_ID, +} from "./src/shared/config"; + +const serverApiUrl = + process.env.NEXT_PUBLIC_SERVER_API_URL ?? "http://localhost:3000"; + +export function middleware(req: NextRequest) { + const pathname = req.nextUrl.pathname; + const searchParams = req.nextUrl.searchParams; + + const logMessages: string[] = [ + `[Middleware Request] ${new Date().toISOString()}`, + `[Environment]\n Mode: ${process.env.NODE_ENV}\n Port: ${PORT}\n Proxy Host: ${PROXY_HOST}\n Server API URL: ${SERVER_API_URL}\n Site ID: ${SITE_ID}`, + `[Request]\n Original Pathname: ${pathname}`, + ]; + + if (pathname.startsWith("/server")) { + const queryParams = searchParams.toString(); + const newUrl = `${serverApiUrl}${pathname.replace("/server", "")}${ + queryParams ? `?${queryParams}` : "" + }`; + + logMessages.push(` Rewritten URL: ${newUrl}`); + logMessages.push("\n--------------------------------\n"); + console.log(logMessages.join("\n")); + + return NextResponse.rewrite(new URL(newUrl)); + } + + if (pathname.startsWith("/attach-service")) { + const requestHeaders = new Headers(req.headers); + const token = req.cookies.get(CLAIM_NAME)?.value; + const userId = req.cookies.get(AUTH_USER_ID)?.value; + const newUrl = `${serverApiUrl}${pathname}`; + + if (token) requestHeaders.set(CLAIM_NAME, token); + if (userId) requestHeaders.set(AUTH_USER_ID, userId); + + logMessages.push(` Rewritten URL: ${newUrl}`); + logMessages.push("\n--------------------------------\n"); + console.log(logMessages.join("\n")); + + return NextResponse.rewrite(new URL(newUrl), { + headers: requestHeaders, + }); + } + + if (pathname.startsWith("/user-service")) { + const queryParams = searchParams.toString(); + const newUrl = `${serverApiUrl}${pathname}${ + queryParams ? `?${queryParams}` : "" + }`; + + logMessages.push(` User Service Rewritten URL: ${newUrl}`); + logMessages.push("\n--------------------------------\n"); + console.log(logMessages.join("\n")); + + return NextResponse.rewrite(new URL(newUrl)); + } + + if (pathname === "/") { + return NextResponse.redirect(new URL("/dashboard", req.url)); + } + + logMessages.push("\n--------------------------------\n"); + console.log(logMessages.join("\n")); + return NextResponse.next(); +} + +export const config = { + matcher: ["/server/:path*", "/attach-service/:path*", "/user-service/:path*", "/"], +}; diff --git a/apps/cm/next.config.ts b/apps/cm/next.config.ts new file mode 100644 index 000000000..679528324 --- /dev/null +++ b/apps/cm/next.config.ts @@ -0,0 +1,40 @@ +import type { NextConfig } from "next"; + +const subDomain = + process.env.NEXT_PUBLIC_SUB_DOMAIN || "http://localhost:13000"; + +const backendUrl = process.env.NEXT_PUBLIC_SERVER_API_URL || "http://192.168.0.102:8000"; + +const nextConfig: NextConfig = { + output: "standalone", + async rewrites() { + return { + beforeFiles: [ + { + source: "/_next/static/:path*", + destination: `${subDomain}/_next/static/:path*`, + has: [ + { + type: "header", + key: "referer", + value: "(.*)/cms(.*)", + }, + ], + }, + ], + afterFiles: [ + { + source: "/cms/:path*", + destination: `${subDomain}/cms/:path*`, + }, + { + source: "/user-service/:path*", + destination: `${backendUrl}/user-service/:path*`, + }, + ], + fallback: [], + }; + }, +}; + +export default nextConfig; diff --git a/apps/cm/package.json b/apps/cm/package.json new file mode 100644 index 000000000..81f22f095 --- /dev/null +++ b/apps/cm/package.json @@ -0,0 +1,63 @@ +{ + "name": "cm", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@common/assets": "workspace:*", + "@common/components": "workspace:*", + "@common/config": "workspace:*", + "@fontsource-variable/noto-sans-kr": "^5.2.5", + "@frontend-opensource/use-react-hooks": "^1.1.4", + "@fullcalendar/core": "^6.1.17", + "@fullcalendar/daygrid": "^6.1.17", + "@fullcalendar/interaction": "^6.1.17", + "@fullcalendar/react": "^6.1.17", + "@fullcalendar/timegrid": "^6.1.17", + "@hookform/resolvers": "^4.1.3", + "@minoru/react-dnd-treeview": "3.5.1-alpha.1", + "@radix-ui/react-icons": "^1.3.2", + "@radix-ui/react-label": "^2.1.2", + "@radix-ui/react-slot": "^1.1.2", + "@radix-ui/react-tooltip": "^1.1.8", + "@tanstack/react-query": "^5.67.1", + "@tanstack/react-query-devtools": "^5.75.5", + "@tanstack/react-table": "^8.21.2", + "@tinymce/tinymce-react": "^6.1.0", + "axios": "^1.8.1", + "chart.js": "^4.4.8", + "dayjs": "^1.11.13", + "js-cookie": "^3.0.5", + "lucide-react": "^0.474.0", + "next": "15.3.0", + "next-qrcode": "^2.5.1", + "next-themes": "^0.4.6", + "react-chartjs-2": "^5.3.0", + "react-dnd": "^16.0.1", + "react-hook-form": "^7.54.2", + "sonner": "^2.0.1", + "tailwindcss-animate": "^1.0.7", + "tus-js-client": "^4.3.1", + "zod": "^3.24.2", + "zustand": "^5.0.3" + }, + "devDependencies": { + "@eslint/eslintrc": "^3", + "@types/js-cookie": "^3.0.6", + "@types/node": "^22.13.1", + "@types/webpack": "^5.28.5", + "eslint": "^9", + "eslint-config-next": "15.1.7", + "postcss": "^8", + "prettier": "^3.4.2", + "prettier-plugin-tailwindcss": "^0.6.11", + "steiger": "^0.5.5", + "tailwindcss": "^3.4.1", + "typescript": "^5" + } +} diff --git a/apps/cm/pages/.gitkeep b/apps/cm/pages/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/apps/cm/postcss.config.mjs b/apps/cm/postcss.config.mjs new file mode 100644 index 000000000..1a69fd2a4 --- /dev/null +++ b/apps/cm/postcss.config.mjs @@ -0,0 +1,8 @@ +/** @type {import('postcss-load-config').Config} */ +const config = { + plugins: { + tailwindcss: {}, + }, +}; + +export default config; diff --git a/apps/cm/public/favicon.ico b/apps/cm/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..d304b69814b2d79060a24f36f667a7f53b768103 GIT binary patch literal 4286 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 z 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 literal 0 HcmV?d00001 diff --git a/apps/cm/public/images/img_cc_by.png b/apps/cm/public/images/img_cc_by.png new file mode 100644 index 0000000000000000000000000000000000000000..628cc2bfd3fdd655056b888ff2e516eb66c45812 GIT binary patch literal 4498 zcmaJ_c|4Te+aD==S)w#b(@>-sGh-}cCWf&UVyu;&VT74!7DLvuL}eMWmkBAMtV#AI zq(YW#k*!5kCdQH_@AUkhp5Ob&`@Hw(zVEYquIqbU*E!#Fu5;h97Uo8~g@8f;0ARO? zF&4)y1GtZpzz*(vRaYR8TO6Pn*wd^?o-~Fl1rNY@klgSf6F*lkJPz;b5qPN+j{*RA z!QR&PGKh zM%Kp@yp1nY@K%@2t=%vCxNCWUbxwg$0Z1-@AD-q43h?tKQjq~@@L#w{ZvA&R1PuC1 zgyw?=|HmnNGYgPDiGl|qRN%_)s!%9MU0nsLhEP|Bo&>>Ep)iOl_f}Visv!~TNSFrb z?+eVeM)B}O;;@E)+v2v+U;>RsMnWJA21A7bS0PcnAW$tWt=||hm@-#FnHor>xdtc` zsd9f1uz0FF#hXm?CJ{lu5nbI#bQ&7W_4Gd>_>upCB~t$$ChmYi0$j-usEX?Ekp2jo znf?Ewet!Q*Q)xK-fBpSGfvMJkWIP0ir;_LtckaY_%KbJ)M(R`Wt~3(Gnnd#bGl~`j z5{*P9kjNl?D|L{foj1{g#GoGkOWw>3X+osZT#4>@6D%6cMNskf_COlKRrO&A4TOOn zR2>R6(9(n<4E4C9uBV1I)G$!f|D%f~xzqjdMA{!+kN@hb|EunAD)^DPma%w>w?E#) zkV5hU{S`9O``>+m|0~|#x*q@Ti`u{HLb%RAeoyTGn&>}WT=x8~{zF@C;~(PViCnf* zxU@F+&4dB~d-zPS80&!1uNU~Ot?huGO0NO%TW`d%x`|-W)fh=k0@US340@IaHT9ys z#@^L&uZ;9b``)gyyUdtf`2ud|q$DvlipElJ0Q)XODkjLuBb~Yf@~;!e*Jd)P6ZIuy z8xz~16RQ)e_j)oBCy>bV=1%co1Lis*!Vh)aiE0JEZJL97cq+7EC4O&BEi!QXL0&$a zAEnll4^LlR$PZ?4oN4M=ehY+>;^Kkv@vSM1ro&;^6(wa8hF;BoJbQ4V2VtfLjBEC| zo3I)GU(4onl_xcJ*PW6Gd?BeqB@|?%A_0!~Mr%zvxZkMCe==Q$0MnOg- zQi;bpuXA%JM^sBnC6&qa_VerN>h9`(trTkOU}rZpILhY?PdBYPdBMraoKgLqa6%YP zg&)Nq75S=BoPcpCl)Nr-=2PIv(uw_f{kVSMoXk2ak91duK5FeX6l?13>1Fib!}>7@ zBM~dd5UOD1yz}EWm z`EA5PECK6t$@S9O6#GE}OJJy|sEGQ^Vb`u*w91BthN`Nnygc6Jl8ep;28QDefkC}} zZOQjdTSS&ujNPJkoDl22wtDz<%$cT~yu6wAI2lI=hf=Yqvqc33n)JDWhL8;**1k=5 z{Wo*;qK?tgn0G@92?X|sh+7-{D+dX_1bM{1efuiBda_~o>p3|`4#s`a!&_PPzey7n+4#mrA>b)>CGUBgaU0mGpwr-|@ zyt?x3U2;;=i<}v3M+#5Tq(B)={>3-X>8_C4)!bnABql5@4AZ~0v8rI29^Udg1I|teKLtZ()tUKA6vY~9nz`BYGDuq&BQnFB6Z`y5Y zYAPZkB7bf5SIEL}j(fN{CODQibAEoVQ72^IN2wFG0zn7(?B$~7<}SLnOp-NqHrcJE zuB}eC^)dAl!m<+DQIiK)HDN+MLLc_jowKogwlsg}k#aD5eRHV?;!qu)xJ{m8(CNE& zwLO16S$eNvXWvU&<#FqH`<9Hh>y5xPiUxj-JvIBlSP?KSDJAu!vQkf9KP4q4Dr?e5 z&G8u}zr3#HQtsX}sZlpw*qsrlckw$UoV~Zg*ej99)}Nx2=E(#fpP+S)cj*c#1ke)p zuFCIT@Fy(RAaIv6;RdGX3dw5WK@vGNIe9M;9lE*J5+%$!6>@#KmioCH|0*>lElrpO zm~1x%7-pkFTRc?TPUv9cG5rkEL}%wq%z-21?_*lb_hHq3@9VVS@TI=|GZxnS!H{C7 z#+o8(Vnn9lgSU0X?YS7x*(`OlYC&N&dHH+Q)%MkW+y&gxVMG=%%|g=RCm*!hX6++EMPx!>V9fIRoEifo?(z|5zkJzp z)40~bTgY+d0V4(n2iG1wdKk4&>@YJ12`rL1=j@6(q7%_KO_bh5ZG2v)s^Z6 zk7SHQ?nR+ckvTu7+itjTh}5(U4@=Yddy#jJ*ln^rIwMI=|=oMUVH6+N5bJ`AE<@}NYUEX_6WH^Z4|U3 ztNVJ2vgXrRRn=HnR$eY4f7~T(Cr_-iYirb6%4afQHR%Q++|kkT5c3o}6R=O+Z!|K) z=puFLQ`gt8z8*ZOsj1E(%TlV0*67`vy%fzBvm)C^+*JZjn^6J?2tDdj7DEnT+A!FH z^6Rj4HaE8X{Cw~_5(bkvkP3q9Ue^p+r!lormpKBB7cX9<0Ue9A;WY7w0|UcY4&M=| z^rD@jyyUU7*&<}!=CQGZli^b-w{D36FgTSy`Are9%cZ4HpFHWimz(L8H8nLkOxIAS zQy$tGmQ&)rk^3yR>jWM3E=RQxUiG?7#QluQ(?*Vtu5CC82?_0ZdF+O8H0pFfPg-LX zXHE)(=0?f9|0~{bQvdUn2EMY@7)*7~`(D|PrKP3O(a~3qta;rQ_l}E+3I8>tL^gYE zI!P1M0*2(mrR5Jq8SNBpA61CbAia-qc>R%L!t-TQJG*yafYa|;R{8oaq-Q1GKdtj| z=J`zS5}Y4=w80kUL0~YL&90J+e(M2i`3K0!9Xs<-*A@n!k|vVg9FvG63s|I2f-GdT zq{3yW0I8VF`Js~JW2T~s->*VivxFfc!N?tso`kIvF_zL&)IxV1EQ z=JfgWj#zo=b|VmocTY(QZ#05de8V+A0Z!O7^>}-GpGiI0tXK*jB5rEqoXay*o|zpz z`K`RK{Hnq(GQWf}KR-VuslFb)lNS{u7*34n;CboQeH&va{PX5*p<9ZCtLfU8rgx?% zJ7i^L)%pynj9J(v9M*QbY<2Ba_?v+GdY85VE>ni>BcE~8UTkcvJ1g$6j_kY?OtMpn zBeDLl@P5rHa;xzrqMPHRy#F>c!@JDawChAobv39@ zaFO_~YBx_(QWDPDSrn3I62KC13vXhL5U8ew=}ulQ;4)eRdj&T%pt&{v@b>M4AZant zOLz0~0L{cYl{z=Z?CYTl zQf&(LU-5szck~n9(kQQlvRKYCqiTn)N$+{;J92fC&5foxJjMQ=qW$@EzymU|7xa#l zzB~U;GDVV`OjpuBTjH!8ES)Uv>=FPwI_1tpPDh{0fzP_=2!_RgYsCBC51#tjZ(<@i z^y9P-(IeXoRnG3pE z6Q+JVR%V+QsG7qiOdu*96WzAnH?hFVstUi+xgiVSkm@0eXT0TY$2)Ha-oD9tz7|>fMwL>PmbU+{ZQ`xQ zp_bNGyJCAxcuUJmFnb;Zyc7K-Nt!j>``$dqBL5f6FdsKLyH@lgcXyS4m0d}PLrlGN zkQ}jjzwpjw?r}xmwk3$gJvAsh)>xBMVjr43{|Qgqn>#~ngE*8M&p~{1gCZb>PKt_3 znVDHvZHkLK$WoeG=d=V?_CuVoSgfw3yRz=j8>;eZ&J+qvY-D1>x%2?Kmp+{t=fktV z`a|c80{3_Xlpt>=4+CNZRY&R&Z$<}ep5&)&k2kk+^7!Lzh4TjzJNfwdxVzotrNw1a z1J>5+9#~(t@Tbe&tp4%-*6q@q6&n}byJVb-ZA7rThK53x`U?p-3|3iLX=-N1+zApl zIw}D*)mqHVVKiRN)nmV(tj_xJxx}zdzAgJY>Kk+@qNr(0>??!pKTIV+5*3s_?XZ}A zzN)|sF)3f-?%cdFu1?U^$=K3T)emKfY?nRL_)0Fz{AcAdrJG#e*1TQWvl6K$4icE- z3~+85W%RsyDgFZVl*P{0`=~^DQu!qD`0(&ZysC8b{KwDUfVjTtzVUbZO4)YC6l3FZ zQ0mQ_H?z64S^Qwa{eUg5L--6vMn@yHv_dw%J(U)Q8489uZK{+RgxV;U~~5TFn#Q{qp7cQWu_S zpx{MaU0ocm@5fBX(S?tznwj<{mrPz%iRD?go2$gTx1TR6dj?cD-WcgtY>6 z34Ew|N)LP%c$|^c-!J<^ei^+5xKT-x^X$xNCHI6YmWeZ4eHB f6CDZLDGk8K%l%M0lF9!4m&C-t9Q#<$s>Qz_B{(TefrBhm&wS;=nV}(R-_U` zdc>(OlHNyJ)L2r%jRHHMtOLDKXpdkhnKmTQ6ACayc=$lApdJux&=6FejEtNgX5)Zz zFf~#23PebG{E?BuAdn<&GBR~d4AR334n+Yxp+2wx4gTHsZhim^qQP&kU@BvZ)P?%O z48nt<*5PJ0Ug2;r6$roPO@KN^l>~r*qC5Z?gnvMYDn^6Ma=Jt!f3*`*&ZYFAaWQ6bh*-EsaK_rO>4-0?>~k~cL~H4F$rc?5Vt4M7_GBm^lK45BKdAg`mX zqpSkf0V)B3U=?K*Js=3Iq^KyTE29h2QT$sM6zCO-fCixc)`k36SNk7z|4;#eB=rn} z2E)Rj5WV0)1mLeBtHS=-7Nvj0`?oISpKVe8M_p->G17k=`@bChcN2*{f2#kXE$QPw z#D@lu*d9!xb(q8hM=~-NtRYC-1~a=|KxJb~m?B&fvjQ<``xjf`*qC`8?!Jh1!TF}@ z0mmFX@kPSIED;gdV&NPLFKIv(Ajb#q@cil1_{*XnD93+A=iXA;?Vw%iv_Ggls)e8) zE1=g3qr87^pDmtiguLg`2tQ1u=S@vbYY_LfCAMdy#hzJY|5BWI_s-nd$thxzOY&YH{OD-S+WLCUafeMqBe$)k$A0(I zrC@KN*8J4{ClfYNHqLuS55-qkR_42~C!4D`fM~Dr z3AvZD^$Soa&_Y*0mt0r3hUWvX5^R2Cw9)k}+#%d7EDYNwM=n#9ot?qOb0txvqOv@< zgD^YLR&T#<=K7f1+$`+AxaSLAy5+$y0!ccI{R=S`2b6YWwdGE`(NUXoAM`5*u9fEL ztiE|@Pl3bP)y|$s@Thq{S$|tdOUuw1ak4|D4z?$JsKrVbxxSTp>!7Wz{h9#JZ-nFv zFz8Vrj=%k=nQoYwnQ8Fa4EaY{K&iKb@lNTIXSsujue5L zX)!!4!k?$ooRW(uDF^*$o|im)$o}L}Mg|i*d+6?hMt}Im79-buOziHf_@$>(sIrO* zv#Uz0?;fju8jmgBRpXZiX7B4nWv-M<_{t!2blAp*O7sDyq9Uix)=Iwg zUKCS%@P2Zo`IBT0C#N|+-9!u)tALnggJjJ^aKkc^BQ#gC zSuc%eI7gC}mX`c0@z>I?6tJd*k+E^sh=ru@z_n(71|93JuCB$XqsJXbqXkOwG#!|I zojN0l&&`X`@bNMlvnKSkt4X^cmtLa&Qnj9*Uia_gn)34U4kcmXHIk2yb{AuadnFxb z_3v&LXvW-p_-PIe6w{{oP+(RKV)t=tg$NP*&F42s}-jYtqeemE# zjGJiaQz4o;bIr5t%%{j(4v*8*8MD$-Qq(Ye?#lyd`&`U);CwkBhOHygVlYM1X2n1X z0}`pb&`OD_iLL0}h1o`U&5dTuQazA}mzURO%lTNZ{;La(f*BN#HA9|U_PDJ70L{mp zdQqOsPfP0+r(0yu$xnpPQIZZ*QYqeLI!lblJVCjz>i$ti_H^3_I-JwBc$bC`v9Od*JI!(v=EVXioqns3wB zesb!HDwos*E5k5^`tZQjH8$zt`V+p@9ti_5wG2h znBy2OuOS7j#kK-`%78I!dxrUX*}>=EWQGF1w?uwkX$#WBVq z@zi@sl8gSzx4GtY|GPQ7N&%_YH5Z14Xd;rn4TZW$fVN8GJ;2|REx?w$W2H%xW_v;% z)DCP|@hiUbEkSe5fk_J!U}qMWJ}p4{$P&p_9Pd~dZ*hs=%D+YPj>XnSK6SK8Im6Ss zhjKLmnvTO3qRC0*^wVEqtU16|6LBoABvSnN&^$sc2FKx0W zuO(|Fv$N#zNh8-up*27tSQF5a5)vRsi{=2AyMXz^p(Xqt+{NYUcfU2iZ_MKL3|8EYZD4po&;|@%p0ynvo{k)^G&@<3;1Vt#VL$8Z&X8L8QvoU*7!v{1heQ1GW{_l+j`)@tSIqk|)nZqwdM0Pv;KF*K!ZM_-}4n_g2-{KX!S1HbAUBgMB+#9R}K3nLg0ZC@b;Y<6O>Y zGBjK-rjiNQ@_I8;z0tP9AZh+0I?LPSSJBrHck80a0~$G&HU7(d+FjTl+z@Zf>AwCY z)~$(&_DXcM6aKo{>y^1O5La2DdbCb4)$JTvel8)_S0l?yO8^a=c-+O#dKuDYm!6!g zL+e0g$LN}MG4lJUQszq}gpU3l*JriZ8pl5BIoM2DkkD@Rz_sD!{5EY?1z5sTgpcN@s=mZnU6D`+071ZJ0&2}0tBC3pqcO70Gkl5Sao zOMBRUeZ=lHfo`6JlPZO1SizyD;_uhKjv`TKrjC9*yX|4$9B)(7uUMos_7r7L zvgD8d`o3PIj*Y+4wj!8Y)?}P3Wy7O{=s;G-+zhDm=CU+dc)zz@EmtrV7`cC%fK;>N zyiRq1CQLRrCp6_s{!H&J4drKDlN^1dAOL=qxMy5(&qTX92*gwx zvAffugRnd5V&%XI>|Ku|rMp%lYm}ERMXlVs-i2Md(*r&oxW6-jH|Hi8UstCfv+eC= zczilt-RDCiL{I37yNzbVH(i}2oinO1(ZZN7t0}p?@x40>ty#G>9fpuwpI$cV!r!%3M8 z_HfVgw3L{ddRSQKoR{C4(AwGQBDpnt9Da;sZ|osUrhNbXJ8dQl%ML*u5Fp@YZ$3RT z*>FFtv9?oED?1lYto)cK1inF~dkBa7Y<;Sq``yV`^#qANK7_&HaQcM{PCRO1xT+Jn zZGxkp|67)(uHo<`F=bViHu(^3eI!@yWyb_?!V)2XwsDjwqh%z86x{Mv8DB;XvV;& z{6N!BrudgAn-MnlaIxQS4Q@}ol!aWT%3Lqvaca=ciOV4p2ftgJU*fii^srr7S(+d3 z6xupf-~Tla3mG3DZz*8Xb_L-qERVnRCV5EkXJ#axJ%^N(KNPwaCA$6odtcdQ$Cwhl zSVrf?p zUya@V&iNL<$0@~b9Ppz;u(IKYe^G9MQ@x$3k9}@?^UkaIpvb#C@*FN+zc*ZVp2_R% z8Watr@p5u=i{*K<5-LKv3Y-XS4DLs=%d4{I7JhU|GJ>36b`lY7rgsgAD9 zv`eci3woYUew^6mjU;AsNXiF}ou2e-#;Qj!?$9zYe!SXL+39nVew{H$XZuygqouGG zPFJuCEc)^(=Eiy8D{is6w_)3r`X`O6T$AqW=GYQW^gJvKJBHH}Yl)9$pxyQX!{ z&CK)-42VayTR(ZfzuWu3TPoV?Y;*488pNlbxI$a@RoTYdTR5A;Urbzl5^r-a59aB~ z-xWVPJZv2~h^qOzKTfg%hrH8?0LDoWk;Zkf*2!=zu$Xk1Tph^NNkK)JS% zy;fNdThJOYS69lc?-$z$-BGhDdw0Q!2K)dY~ePAYZR1}Zwr(dH~R3s zy}b$WWmo=3unOokk%6~QG}Hh9vQeEPGH6W9c^o;Fj+aa^bU5eiE7#egwM;YVkfZz6 z!cKGYzZLiN^AV+`S^|y~99_+uR iVsg8OW3tcL-N{^L^e2Xm^44m1J&uc$NvvikWI?~ literal 0 HcmV?d00001 diff --git a/apps/cm/public/images/img_cc_by_nc_nd.png b/apps/cm/public/images/img_cc_by_nc_nd.png new file mode 100644 index 0000000000000000000000000000000000000000..9d8ccb18dc00d7898c8a25181af55e2ed2143ed0 GIT binary patch literal 6651 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 z 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 C&0xI% literal 0 HcmV?d00001 diff --git a/apps/cm/public/images/img_cc_by_nc_sa.png b/apps/cm/public/images/img_cc_by_nc_sa.png new file mode 100644 index 0000000000000000000000000000000000000000..00f402c9e1a34e5d88e949b5cf5d31cd17b20fc5 GIT binary patch literal 6694 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 literal 0 HcmV?d00001 diff --git a/apps/cm/public/images/img_cc_by_nd.png b/apps/cm/public/images/img_cc_by_nd.png new file mode 100644 index 0000000000000000000000000000000000000000..0da64acd8a24fed8fd21782589ba77e69fab6d8b GIT binary patch literal 5510 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 Ow^dWtR4RRB5%OP9)_QaR literal 0 HcmV?d00001 diff --git a/apps/cm/public/images/img_opentype01.png b/apps/cm/public/images/img_opentype01.png new file mode 100644 index 0000000000000000000000000000000000000000..456c7c6bb211a83deb3ca26e155020c6a1ac1c53 GIT binary patch literal 3246 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 NfwytQmZFcG{2yPxrMmzC literal 0 HcmV?d00001 diff --git a/apps/cm/public/images/img_opentype02.png b/apps/cm/public/images/img_opentype02.png new file mode 100644 index 0000000000000000000000000000000000000000..a6c5bfb3229e319b6d8e4a61982061f7aecc7145 GIT binary patch literal 3628 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 MMwYmHhNq+c58HlKYXATM literal 0 HcmV?d00001 diff --git a/apps/cm/public/images/img_opentype04.png b/apps/cm/public/images/img_opentype04.png new file mode 100644 index 0000000000000000000000000000000000000000..41d284cabcdccc032c0fee538260079c4d75d374 GIT binary patch literal 4117 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 E0FhT$uK)l5 literal 0 HcmV?d00001 diff --git a/apps/cm/src/app/index.tsx b/apps/cm/src/app/index.tsx new file mode 100644 index 000000000..692b55ef0 --- /dev/null +++ b/apps/cm/src/app/index.tsx @@ -0,0 +1,20 @@ +import "./styles/base.css"; +import "./styles/components.css"; +import "@fontsource-variable/noto-sans-kr"; + +import { AppProvider } from "./providers"; +import { cookies } from "next/headers"; + +const App = async ({ children }: Readonly<{ children: React.ReactNode }>) => { + const theme = (await cookies()).get("site-theme-key"); + + return ( + + + {children} + + + ); +}; + +export { App }; diff --git a/apps/cm/src/app/providers/app-provider.tsx b/apps/cm/src/app/providers/app-provider.tsx new file mode 100644 index 000000000..efd1f308e --- /dev/null +++ b/apps/cm/src/app/providers/app-provider.tsx @@ -0,0 +1,49 @@ +"use client"; + +import { DndProvider } from "react-dnd"; +import { MultiBackend, getBackendOptions } from "@minoru/react-dnd-treeview"; +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import { ReactQueryDevtools } from "@tanstack/react-query-devtools"; +import { ConfirmProvider } from "@frontend-opensource/use-react-hooks"; +import { AuthWrapper } from "@/entities/auth"; +import { MenuWrapper } from "@/entities/menu"; +import { Toaster } from "@/shared/ui/sonner"; +import { AlertDialog } from "@/shared/ui/alert-dialog"; +import { PromptDialog } from "@/shared/ui/prompt-dialog"; +import { ConfirmDialog } from "@/shared/ui/confirm-dialog"; +import { SelectPromptDialog } from "@/shared/ui/select-prompt-dialog"; +import { PromptProvider, StoreProvider } from "@/shared/providers"; + +const AppProvider = ({ children }: Readonly<{ children: React.ReactNode }>) => { + const queryClient = new QueryClient(); + return ( + + + + + + + + {children} + + + + + + + + + + + +
+ +
+
+ ); +}; + +export { AppProvider }; diff --git a/apps/cm/src/app/providers/index.ts b/apps/cm/src/app/providers/index.ts new file mode 100644 index 000000000..15f99b7fd --- /dev/null +++ b/apps/cm/src/app/providers/index.ts @@ -0,0 +1 @@ +export { AppProvider } from "./app-provider"; diff --git a/apps/cm/src/app/styles/base.css b/apps/cm/src/app/styles/base.css new file mode 100644 index 000000000..7a5263bc4 --- /dev/null +++ b/apps/cm/src/app/styles/base.css @@ -0,0 +1,21 @@ +@import "@common/assets/styles/base.css"; +@import "@common/assets/styles/diveicon.css"; +@import "@common/components/index.css"; + +@tailwind base; +@tailwind utilities; + +@layer base { + :root { + --secondary-background: rgba(0, 0, 0, 0.04); + } + [data-theme="black"] { + --secondary-background: rgba(255, 255, 255, 0.09); + } + + html, + body { + font-family: "Noto Sans KR", sans-serif; + font-size: 10px; + } +} diff --git a/apps/cm/src/app/styles/components.css b/apps/cm/src/app/styles/components.css new file mode 100644 index 000000000..5b9742c0f --- /dev/null +++ b/apps/cm/src/app/styles/components.css @@ -0,0 +1,129 @@ +.card { + position: relative; + margin: 0.6rem; + box-sizing: border-box; + min-height: 2rem; + border-radius: 0.5rem; + padding: 0.6rem; + font-size: 1.3rem; + color: #666; +} + +.card_width10 { + width: calc(10% - 12px); +} + +.card_width20 { + width: calc(20% - 12px); +} + +.card_width25 { + width: calc(25% - 12px); +} + +.card_width30 { + width: calc(30% - 12px); +} + +.card_width33 { + width: calc(33.333% - 12px); +} + +.card_width40 { + width: calc(40% - 12px); +} + +.card_width45 { + width: calc(45% - 12px); +} + +.card_width50 { + width: calc(50% - 12px); +} + +.card_width60 { + width: calc(60% - 12px); +} + +.card_width66 { + width: calc(66.666% - 12px); +} + +.card_width70 { + width: calc(70% - 12px); +} + +.card_width75 { + width: calc(75% - 12px); +} + +.card_width80 { + width: calc(80% - 12px); +} + +.card_width90 { + width: calc(90% - 12px); +} + +.card_width100 { + width: calc(100% - 12px); +} + +.card_nopadding { + padding: 0 !important; +} + +.card_nomargin { + width: 100%; + margin: 0 !important; + padding: 0 !important; +} + +.topline { + border-top: 1px solid #ccc; +} + +.bottomline { + border-bottom: 1px solid #e6eef3; + background: #fff; +} + +.card-border { + border: 1px solid #dbe2e6; + background-color: rgba(255, 255, 255, 0.6); + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); +} + +.card-header { + margin-top: -0.6rem; + margin-left: -0.6rem; + margin-right: -0.6rem; + display: flex; + align-items: center; + justify-content: space-between; + border-bottom: 1px solid #e1e7eb; + padding: 1rem; +} + +.card-footer { + margin-left: -0.6rem; + margin-right: -0.6rem; + margin-top: 0.5rem; + display: flex; + align-items: center; + justify-content: center; + border-top: 1px solid #e1e7eb; + padding-top: 1rem; + padding-bottom: 1rem; +} + +/* 블랙 테마 */ +[data-theme="black"] { + .card-border { + background-color: rgba(255, 255, 255, 0.065); + border-color: #38383a; + } + .card-header { + border-bottom-color: #3f4042; + } +} diff --git a/apps/cm/src/entities/auth/api/login-service.ts b/apps/cm/src/entities/auth/api/login-service.ts new file mode 100644 index 000000000..c1968fe36 --- /dev/null +++ b/apps/cm/src/entities/auth/api/login-service.ts @@ -0,0 +1,85 @@ +import { AxiosError } from "axios"; +import { + ENDPOINT, + JWT_EXPIRATION_TIME, + ACCESS_TOKEN, + AUTH_USER_ID, + CLAIM_NAME, +} from "@/shared/config"; +import type { LoginService, ILogin } from "../model/login-interface"; +import { tokenManager } from "../lib/token-manager"; + +export class LoginApiService implements LoginService { + private static instance: LoginApiService; + + private constructor() {} + + public static getInstance(): LoginApiService { + if (!LoginApiService.instance) { + LoginApiService.instance = new LoginApiService(); + } + return LoginApiService.instance; + } + + public async login(payload: ILogin): Promise { + try { + const response = await fetch(`/api/proxy${ENDPOINT.USER_SERVICE.LOGIN}`, { + method: "POST", + body: JSON.stringify({ + userId: payload.userId, + password: payload.password, + }), + }); + + const data = await response.json(); + const accessToken = data[ACCESS_TOKEN]; + const tokenId = data[AUTH_USER_ID]; + + if (!accessToken || !tokenId) { + throw new Error("Missing required authentication tokens"); + } + + tokenManager.setToken(CLAIM_NAME, accessToken); + tokenManager.setToken(AUTH_USER_ID, tokenId); + tokenManager.setupRefreshTimer( + () => this.silentRefresh(), + JWT_EXPIRATION_TIME, + ); + } catch (error) { + if (error instanceof AxiosError) { + throw new Error(`Login failed: ${error.response?.data?.message}`); + } + throw new Error(`Login failed: ${error}`); + } + } + + public async silentRefresh(): Promise { + try { + const response = await fetch( + `/api/proxy${ENDPOINT.USER_SERVICE.SILENT_REFRESH}`, + { method: "PUT" }, + ); + + const data = await response.json(); + const accessToken = data[ACCESS_TOKEN]; + const tokenId = data[AUTH_USER_ID]; + + if (!accessToken || !tokenId) { + throw new Error("Missing required authentication tokens"); + } + + tokenManager.setToken(CLAIM_NAME, accessToken); + tokenManager.setToken(AUTH_USER_ID, tokenId); + } catch (error) { + tokenManager.clearAuthToken(); + if (error instanceof AxiosError) { + throw new Error( + `Silent refresh failed: ${error.response?.data?.message}`, + ); + } + throw new Error(`Silent refresh failed: ${error}`); + } + } +} + +export const LoginApi = LoginApiService.getInstance(); diff --git a/apps/cm/src/entities/auth/index.ts b/apps/cm/src/entities/auth/index.ts new file mode 100644 index 000000000..97e142225 --- /dev/null +++ b/apps/cm/src/entities/auth/index.ts @@ -0,0 +1,2 @@ +export { LoginApi } from "./api/login-service"; +export { AuthWrapper } from "./lib/auth-wrapper"; diff --git a/apps/cm/src/entities/auth/lib/auth-wrapper.tsx b/apps/cm/src/entities/auth/lib/auth-wrapper.tsx new file mode 100644 index 000000000..c0be4c2dd --- /dev/null +++ b/apps/cm/src/entities/auth/lib/auth-wrapper.tsx @@ -0,0 +1,49 @@ +"use client"; + +import { useEffect } from "react"; +import { useRouter } from "next/navigation"; +import { client } from "@/shared/api"; +import type { IUserInfo } from "@/shared/store"; +import { getCookie, useUserStore } from "@/shared/lib"; +import { ENDPOINT, AUTH_USER_ID } from "@/shared/config"; +import { LoginApi } from "../api/login-service"; + +const AuthWrapper = ({ children }: { children: React.ReactNode }) => { + const router = useRouter(); + const { userInfo, setUserInfo } = useUserStore((state) => state); + + async function authCheck() { + const userId = getCookie(AUTH_USER_ID); + if (!userId) { + throw new Error("Missing required authentication tokens"); + } + + const response = await client.get( + `${ENDPOINT.USER_SERVICE.USERS}/info/me`, + ); + if (!userInfo) setUserInfo(response.data); + } + + useEffect(() => { + (async () => { + try { + await authCheck(); + } catch (error) { + console.error(error); + + try { + await LoginApi.silentRefresh(); + await authCheck(); + } catch (refreshError) { + console.error("Token refresh failed:", refreshError); + setUserInfo(null); + router.push("/auth/login"); + } + } + })(); + }, []); + + return <>{children}; +}; + +export { AuthWrapper }; diff --git a/apps/cm/src/entities/auth/lib/token-manager.ts b/apps/cm/src/entities/auth/lib/token-manager.ts new file mode 100644 index 000000000..0e761486a --- /dev/null +++ b/apps/cm/src/entities/auth/lib/token-manager.ts @@ -0,0 +1,59 @@ +import { AUTH_USER_ID, CLAIM_NAME } from "@/shared/config"; +import { getCookie, setCookie, removeCookie } from "@/shared/lib"; + +export class TokenManager { + private static instance: TokenManager; + private refreshTimer: NodeJS.Timeout | null = null; + + private constructor() {} + + public static getInstance(): TokenManager { + if (!TokenManager.instance) { + TokenManager.instance = new TokenManager(); + } + return TokenManager.instance; + } + + public getToken(key: string): string | undefined { + return getCookie(key); + } + + public setToken(key: string, value: string): void { + setCookie(key, value, { + secure: window.location.protocol === "https:", + sameSite: "lax", + }); + } + + public removeToken(key: string): void { + removeCookie(key); + } + + public setupRefreshTimer( + callback: () => Promise, + expirationTime: number, + ): void { + if (this.refreshTimer) { + clearTimeout(this.refreshTimer); + } + + this.refreshTimer = setTimeout(() => { + callback().catch((error) => { + console.error("Silent refresh failed:", error); + this.clearAuthToken(); + }); + }, expirationTime - 60000); + } + + public clearAuthToken(): void { + if (this.refreshTimer) { + clearTimeout(this.refreshTimer); + this.refreshTimer = null; + } + + this.removeToken(CLAIM_NAME); + this.removeToken(AUTH_USER_ID); + } +} + +export const tokenManager = TokenManager.getInstance(); diff --git a/apps/cm/src/entities/auth/model/login-interface.ts b/apps/cm/src/entities/auth/model/login-interface.ts new file mode 100644 index 000000000..5aaf53044 --- /dev/null +++ b/apps/cm/src/entities/auth/model/login-interface.ts @@ -0,0 +1,9 @@ +export interface ILogin { + userId: string; + password: string; +} + +export interface LoginService { + login(payload: ILogin): Promise; + silentRefresh(): Promise; +} diff --git a/apps/cm/src/entities/menu-authority/@x/menu.ts b/apps/cm/src/entities/menu-authority/@x/menu.ts new file mode 100644 index 000000000..86479f859 --- /dev/null +++ b/apps/cm/src/entities/menu-authority/@x/menu.ts @@ -0,0 +1 @@ +export { MenuAuthorityApi } from "../api/menu-authority-service"; diff --git a/apps/cm/src/entities/menu-authority/@x/posting.ts b/apps/cm/src/entities/menu-authority/@x/posting.ts new file mode 100644 index 000000000..bfe84fa0d --- /dev/null +++ b/apps/cm/src/entities/menu-authority/@x/posting.ts @@ -0,0 +1 @@ +export { AuthorityButton } from "../ui/authority-button"; diff --git a/apps/cm/src/entities/menu-authority/api/menu-authority-service.ts b/apps/cm/src/entities/menu-authority/api/menu-authority-service.ts new file mode 100644 index 000000000..ec07d88ad --- /dev/null +++ b/apps/cm/src/entities/menu-authority/api/menu-authority-service.ts @@ -0,0 +1,50 @@ +import { client } from "@/shared/api"; +import { ENDPOINT } from "@/shared/config"; +import type { + MenuAuthorityList, + MenuAuthorityParams, + MenuAuthorityPayload, + MenuAuthorityService, + PageMenuAuthority, +} from "../model/menu-authority-interface"; + +export class MenuAuthorityApiService implements MenuAuthorityService { + public async getMenuAuthorityList( + params: MenuAuthorityParams, + ): Promise { + const response = await client.get( + `${ENDPOINT.CMS_SERVICE.MENU_AUTHRTS}`, + { params }, + ); + return response.data; + } + + public async getPageMenuAuthority( + menuCd: number, + ): Promise { + const response = await client.get( + `${ENDPOINT.CMS_SERVICE.MENU_AUTHRTS}/pageinfo/${menuCd}`, + ); + return response.data; + } + + public async saveMenuAuthority(data: MenuAuthorityPayload[]): Promise { + const response = await client.post( + `${ENDPOINT.CMS_SERVICE.MENU_AUTHRTS}`, + data, + ); + return response.data; + } + + public async getGroupMenuAuthorityList( + params: MenuAuthorityParams, + ): Promise { + const response = await client.get( + `${ENDPOINT.CMS_SERVICE.MENU_AUTHRTS}/group`, + { params }, + ); + return response.data; + } +} + +export const MenuAuthorityApi = new MenuAuthorityApiService(); diff --git a/apps/cm/src/entities/menu-authority/index.ts b/apps/cm/src/entities/menu-authority/index.ts new file mode 100644 index 000000000..5a1b11606 --- /dev/null +++ b/apps/cm/src/entities/menu-authority/index.ts @@ -0,0 +1,9 @@ +export { MenuAuthorityApi } from "./api/menu-authority-service"; +export { + menuAuthorityFormSchema, + type MenuAuthority, + type MenuAuthorityPayload, + type MenuAuthorityFormData, +} from "./model/menu-authority-interface"; +export { AuthorityButton } from "./ui/authority-button"; +export { ManagementAuthorityDialog } from "./ui/management-authority-dialog"; diff --git a/apps/cm/src/entities/menu-authority/model/menu-authority-interface.ts b/apps/cm/src/entities/menu-authority/model/menu-authority-interface.ts new file mode 100644 index 000000000..7f5401872 --- /dev/null +++ b/apps/cm/src/entities/menu-authority/model/menu-authority-interface.ts @@ -0,0 +1,51 @@ +import { z } from "zod"; +import type { PageableList, PageableParams } from "@/shared/model"; + +export interface MenuAuthorityParams extends PageableParams { + groupId?: string; + menuCd?: number; + useYn?: string; +} + +export interface PageMenuAuthority { + mngAuthrtYn: string; + inqAuthrtYn: string; + regAuthrtYn: string; + mdfcnAuthrtYn: string; + delAuthrtYn: string; +} + +export const menuAuthoritySchema = z.object({ + groupId: z.string(), + groupNm: z.string(), + menuCd: z.number(), + mngAuthrtYn: z.string(), + inqAuthrtYn: z.string(), + regAuthrtYn: z.string(), + mdfcnAuthrtYn: z.string(), + delAuthrtYn: z.string(), + useYn: z.string(), + mode: z.string(), +}); + +export const menuAuthorityPayloadSchema = menuAuthoritySchema.omit({ + groupNm: true, +}); + +export const menuAuthorityFormSchema = z.object({ + menuAuthority: z.array(menuAuthorityPayloadSchema), +}); + +export type MenuAuthority = z.infer; +export type MenuAuthorityList = PageableList; +export type MenuAuthorityPayload = z.infer; +export type MenuAuthorityFormData = z.infer; + +export interface MenuAuthorityService { + getMenuAuthorityList(params: MenuAuthorityParams): Promise; + getGroupMenuAuthorityList( + params: MenuAuthorityParams, + ): Promise; + getPageMenuAuthority(menuCd: number): Promise; + saveMenuAuthority(data: MenuAuthorityPayload[]): Promise; +} diff --git a/apps/cm/src/entities/menu-authority/model/menu-authority-table-columns.tsx b/apps/cm/src/entities/menu-authority/model/menu-authority-table-columns.tsx new file mode 100644 index 000000000..6969a85e9 --- /dev/null +++ b/apps/cm/src/entities/menu-authority/model/menu-authority-table-columns.tsx @@ -0,0 +1,117 @@ +import type { ColumnDef } from "@tanstack/react-table"; +import type { UseFormReturn } from "react-hook-form"; +import { Checkbox } from "@common/components"; +import type { + MenuAuthority, + MenuAuthorityFormData, + MenuAuthorityPayload, +} from "./menu-authority-interface"; + +export const createColumns = ( + form: UseFormReturn, +): ColumnDef[] => { + const getCurrentRow = (i: number) => form.watch("menuAuthority")[i]; + + const handleCheckedChange = + (i: number, key: keyof MenuAuthorityPayload) => (checked: boolean) => { + if (getCurrentRow(i)?.mode === "R") { + form.setValue(`menuAuthority.${i}.mode`, "U"); + } + form.setValue(`menuAuthority.${i}.${key}`, checked ? "Y" : "N"); + }; + + return [ + { + accessorKey: "groupNm", + header: "그룹명", + }, + { + accessorKey: "mngAuthrtYn", + header: "관리권한", + cell: ({ row }) => { + return ( + { + if (checked) { + handleCheckedChange( + row.index, + "regAuthrtYn", + )(checked as boolean); + handleCheckedChange( + row.index, + "mdfcnAuthrtYn", + )(checked as boolean); + handleCheckedChange( + row.index, + "delAuthrtYn", + )(checked as boolean); + handleCheckedChange( + row.index, + "inqAuthrtYn", + )(checked as boolean); + } + handleCheckedChange(row.index, "mngAuthrtYn")(checked as boolean); + }} + /> + ); + }, + }, + { + accessorKey: "regAuthrtYn", + header: "등록권한", + cell: ({ row }) => { + return ( + { + if (checked) { + handleCheckedChange( + row.index, + "inqAuthrtYn", + )(checked as boolean); + } + handleCheckedChange(row.index, "regAuthrtYn")(checked as boolean); + }} + /> + ); + }, + }, + { + accessorKey: "mdfcnAuthrtYn", + header: "수정권한 ", + cell: ({ row }) => { + return ( + + ); + }, + }, + { + accessorKey: "delAuthrtYn", + header: "삭제권한", + cell: ({ row }) => { + return ( + + ); + }, + }, + { + accessorKey: "inqAuthrtYn", + header: "조회권한", + cell: ({ row }) => { + return ( + + ); + }, + }, + ]; +}; diff --git a/apps/cm/src/entities/menu-authority/ui/authority-button.tsx b/apps/cm/src/entities/menu-authority/ui/authority-button.tsx new file mode 100644 index 000000000..257ab6e5d --- /dev/null +++ b/apps/cm/src/entities/menu-authority/ui/authority-button.tsx @@ -0,0 +1,26 @@ +import { useMenuStore } from "@/shared/lib"; +import { Button, cn, type ButtonProps } from "@common/components"; +import type { PageMenuAuthority } from "../model/menu-authority-interface"; + +type AuthorityButtonProps = { + authority: keyof PageMenuAuthority; +} & ButtonProps; + +function AuthorityButton({ + authority, + className, + children, + ...props +}: AuthorityButtonProps) { + const pageMenuAuthority = useMenuStore((state) => state.pageMenuAuthority); + + const isAuthority = pageMenuAuthority?.[authority] === "Y"; + + return ( + + ); +} + +export { AuthorityButton }; diff --git a/apps/cm/src/entities/menu-authority/ui/management-authority-dialog.tsx b/apps/cm/src/entities/menu-authority/ui/management-authority-dialog.tsx new file mode 100644 index 000000000..2d4f6a176 --- /dev/null +++ b/apps/cm/src/entities/menu-authority/ui/management-authority-dialog.tsx @@ -0,0 +1,101 @@ +import { useState } from "react"; +import { useForm } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { useQuery } from "@tanstack/react-query"; +import { getCoreRowModel } from "@tanstack/react-table"; +import { useConfirm } from "@frontend-opensource/use-react-hooks"; +import { + Button, + Dialog, + DialogClose, + DialogContent, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "@common/components"; +import { ENDPOINT } from "@/shared/config"; +import { useAlertStore, useDataTable, useMutationWrapper } from "@/shared/lib"; +import { + menuAuthorityFormSchema, + type MenuAuthorityFormData, + type MenuAuthorityPayload, +} from "../model/menu-authority-interface"; +import { createColumns } from "../model/menu-authority-table-columns"; +import { MenuAuthorityApi } from "../api/menu-authority-service"; + +type ManagementAuthorityDialogProps = { + menuCd?: number; +} & React.ComponentProps; + +function ManagementAuthorityDialog({ menuCd }: ManagementAuthorityDialogProps) { + const { confirm } = useConfirm(); + const alert = useAlertStore((state) => state.setMessage); + const [open, setOpen] = useState(false); + + const query = useQuery({ + queryKey: [ENDPOINT.CMS_SERVICE.MENU_AUTHRTS, menuCd], + queryFn: () => MenuAuthorityApi.getMenuAuthorityList({ menuCd }), + enabled: !!menuCd, + }); + + const { mutateAsync: saveMenuAuthority } = useMutationWrapper({ + mutationFn: (data: MenuAuthorityPayload[]) => + MenuAuthorityApi.saveMenuAuthority(data), + onSuccess: () => { + alert("저장되었습니다.", () => setOpen(false)); + }, + }); + + const form = useForm({ + resolver: zodResolver(menuAuthorityFormSchema), + values: { + menuAuthority: query.data?.content ?? [], + }, + }); + + const { tableComponent } = useDataTable({ + query, + tableOptions: { + columns: createColumns(form), + getCoreRowModel: getCoreRowModel(), + }, + }); + + const handleSave = async () => { + if (await confirm("저장하시겠습니까?")) { + const data = form.getValues("menuAuthority"); + const filteredData = data.filter((item) => item.mode !== "R"); + await saveMenuAuthority(filteredData); + } + }; + + return ( + + + + + + + 그룹별 메뉴 권한 + +
{tableComponent}
+ + + + + + +
+
+ ); +} + +export { ManagementAuthorityDialog }; diff --git a/apps/cm/src/entities/menu/api/menu-service.ts b/apps/cm/src/entities/menu/api/menu-service.ts new file mode 100644 index 000000000..07e9e552a --- /dev/null +++ b/apps/cm/src/entities/menu/api/menu-service.ts @@ -0,0 +1,79 @@ +import { client } from "@/shared/api"; +import { ENDPOINT } from "@/shared/config"; +import type { + MenuService, + Menu, + MenuItem, + MenuFormData, + MenuTemporarilyStoredData, + SiteMapFormData, +} from "../model/menu-interface"; + +export class MenuApiService implements MenuService { + async getMenuRoles(siteId: string): Promise { + const response = await client.get( + `${ENDPOINT.CMS_SERVICE.MENU_ROLES}/${siteId}`, + ); + return response.data; + } + + public async getMenuInfo(menuCd: number): Promise { + const response = await client.get( + `${ENDPOINT.CMS_SERVICE.MENUS}/${menuCd}`, + ); + return response.data; + } + + public async createMenu(data: MenuFormData): Promise { + const response = await client.post( + `${ENDPOINT.CMS_SERVICE.MENUS}`, + data, + ); + return response.data; + } + + public async updateMenu( + menuCd: number, + data: Omit, + ): Promise { + const response = await client.put( + `${ENDPOINT.CMS_SERVICE.MENUS}/${menuCd}`, + data, + ); + return response.data; + } + + public async deleteMenu(menuCd: number): Promise { + await client.delete(`${ENDPOINT.CMS_SERVICE.MENUS}/${menuCd}`); + } + + public async menuTemporaryStorage( + menuCd: number, + data: MenuFormData, + ): Promise { + const response = await client.post( + `${ENDPOINT.CMS_SERVICE.MENU_TEMPORARY_STORAGE}/${menuCd}`, + data, + ); + return response.data; + } + + public async getMenuTemporarilyStoredData( + menuCd: number, + ): Promise { + const response = await client.get( + `${ENDPOINT.CMS_SERVICE.MENU_TEMPORARY_STORAGE}/menu/${menuCd}/user`, + ); + return response.data; + } + + public async publishSiteMap(data: SiteMapFormData["siteMap"]): Promise { + const response = await client.post( + `${ENDPOINT.CMS_SERVICE.MENUS}/sitemap/publish`, + data, + ); + return response.data; + } +} + +export const MenuApi = new MenuApiService(); diff --git a/apps/cm/src/entities/menu/index.ts b/apps/cm/src/entities/menu/index.ts new file mode 100644 index 000000000..e4c61dbb7 --- /dev/null +++ b/apps/cm/src/entities/menu/index.ts @@ -0,0 +1,12 @@ +export { MenuApi } from "./api/menu-service"; +export { + MENU_TYPE, + menuFormSchema, + siteMapFormSchema, + type MenuType, + type MenuItem, + type MenuFormData, + type SiteMapFormData, + type SiteMapPayloadData, +} from "./model/menu-interface"; +export { MenuWrapper } from "./lib/menu-wrapper"; diff --git a/apps/cm/src/entities/menu/lib/menu-wrapper.tsx b/apps/cm/src/entities/menu/lib/menu-wrapper.tsx new file mode 100644 index 000000000..1f1080cac --- /dev/null +++ b/apps/cm/src/entities/menu/lib/menu-wrapper.tsx @@ -0,0 +1,58 @@ +"use client"; + +import { useEffect } from "react"; +import { usePathname, useRouter } from "next/navigation"; +import { MenuAuthorityApi } from "@/entities/menu-authority/@x/menu"; +import { getCookie, useAlertStore, useMenuStore } from "@/shared/lib"; +import { SITE_ID } from "@/shared/config"; +import { MenuApi } from "../api/menu-service"; +import { getCurrentMenu } from "./utils"; + +const MenuWrapper = ({ children }: { children: React.ReactNode }) => { + const router = useRouter(); + const pathname = usePathname(); + + const alert = useAlertStore((state) => state.setMessage); + const { pageMenuAuthority, setCurrentMenuInfo, setPageMenuAuthority } = + useMenuStore((state) => state); + + const getCurrentMenuInfo = async () => { + const menuRoles = await MenuApi.getMenuRoles(SITE_ID); + if (!menuRoles) return; + return getCurrentMenu(menuRoles, pathname ?? ""); + }; + + const getPageMenuAuthority = async () => { + const menuCd = getCookie("menu-code-key"); + if (!menuCd) return; + const response = await MenuAuthorityApi.getPageMenuAuthority( + parseInt(menuCd), + ); + return response; + }; + + const checkInquiryAuthority = () => { + return pageMenuAuthority?.inqAuthrtYn === "Y"; + }; + + useEffect(() => { + (async () => { + const currentMenu = await getCurrentMenuInfo(); + if (currentMenu) setCurrentMenuInfo(currentMenu); + + const response = await getPageMenuAuthority(); + if (response?.length) setPageMenuAuthority(response[0]!); + })(); + }, [pathname]); + + useEffect(() => { + if (!pageMenuAuthority) return; + const inquiryAuthority = checkInquiryAuthority(); + if (!inquiryAuthority) + alert("페이지에 대한 조회 권한이 없습니다.", () => router.push("/")); + }, [pageMenuAuthority]); + + return <>{children}; +}; + +export { MenuWrapper }; diff --git a/apps/cm/src/entities/menu/lib/utils.ts b/apps/cm/src/entities/menu/lib/utils.ts new file mode 100644 index 000000000..1cf4514d9 --- /dev/null +++ b/apps/cm/src/entities/menu/lib/utils.ts @@ -0,0 +1,20 @@ +import type { MenuItem } from "../model/menu-interface"; + +export const getCurrentMenu = ( + menus: MenuItem[], + pathname: string, +): MenuItem | null => { + for (const menu of menus) { + if ( + menu.urlPath !== "" && + (menu.urlPath === pathname || pathname.startsWith(menu.urlPath)) + ) + return menu; + + if (menu.children) { + const children = getCurrentMenu(menu.children, pathname); + if (children) return children; + } + } + return null; +}; diff --git a/apps/cm/src/entities/menu/model/menu-interface.ts b/apps/cm/src/entities/menu/model/menu-interface.ts new file mode 100644 index 000000000..0c5f4b54c --- /dev/null +++ b/apps/cm/src/entities/menu/model/menu-interface.ts @@ -0,0 +1,107 @@ +import { z } from "zod"; + +export const MENU_TYPE = { + EMPTY: "EMPTY", + CONTENTS: "CONTENTS", + BOARD: "BOARD", + INSIDE: "INSIDE", + OUTSIDE: "OUTSIDE", + BOTTOM: "BOTTOM", +} as const; + +export type MenuType = (typeof MENU_TYPE)[keyof typeof MENU_TYPE]; + +export interface MenuItem { + menuCd: number; + menuKornNm: string; + menuEngNm: string; + parentId: number | null; + sortSeq: number; + iconNm?: string; + children: MenuItem[] | null; + levelNo: number; + urlPath: string; + menuLnkgTypeCd: string; + menuLnkgSn: number; + menuPath: string; + qrcd: string; + useYn: string; + otptYn: string; + newWndwYn: string; + requiredUrlPath: boolean; +} + +export interface MenuTemporarilyStoredData { + tmprStrgSn: number; + menuCd: number; + menuTmprStrg: string; + regDt: string; + rgtr: string; + mdfcnDt: string; + mdfr: string; +} + +export const menuFormSchema = z.object({ + siteId: z.string(), + menuKornNm: z.string(), + menuSubKornNm: z.string().nullish(), + menuEngNm: z.string().nullish(), + menuSubEngNm: z.string().nullish(), + levelNo: z.number(), + urlPath: z.string().nullish(), + iconNm: z.string().nullish(), + menuLnkgTypeCd: z.enum([ + MENU_TYPE.EMPTY, + MENU_TYPE.CONTENTS, + MENU_TYPE.BOARD, + MENU_TYPE.INSIDE, + MENU_TYPE.OUTSIDE, + MENU_TYPE.BOTTOM, + ]), + menuLnkgSn: z.number().nullish(), + otptYn: z.string().default("Y"), + prntMenuCd: z.number().nullish(), + sortSeq: z.number(), + evlUseYn: z.string().default("Y"), + qrcd: z.string().nullish(), + useYn: z.string().default("Y"), + newWndwYn: z.string().nullish(), + menuLnkgSnNm: z.string().nullish(), + menuPicUserUnqId: z.string().nullish(), + menuPicUserUnqIdNm: z.string().nullish(), + menuPicDsgnYmd: z.string().nullish(), +}); + +export const siteMapPayloadSchema = z.object({ + menuCd: z.number(), + menuSubKornNm: z.string(), + otptYn: z.string(), +}); + +export const siteMapFormSchema = z.object({ + siteMap: z.array(siteMapPayloadSchema), +}); + +export type MenuFormData = z.infer; +export type SiteMapFormData = z.infer; +export type SiteMapPayloadData = z.infer; +export type Menu = Omit & { + menuCd: number; + iconName?: string; +}; + +export interface MenuService { + getMenuRoles(siteId: string): Promise; + getMenuInfo: (menuCd: number) => Promise; + createMenu: (data: MenuFormData) => Promise; + updateMenu: ( + menuCd: number, + data: Omit, + ) => Promise; + deleteMenu: (menuCd: number) => Promise; + menuTemporaryStorage: (menuCd: number, data: MenuFormData) => Promise; + getMenuTemporarilyStoredData: ( + menuCd: number, + ) => Promise; + publishSiteMap: (data: SiteMapFormData["siteMap"]) => Promise; +} diff --git a/apps/cm/src/pages/auth/login/index.ts b/apps/cm/src/pages/auth/login/index.ts new file mode 100644 index 000000000..2093c3d8d --- /dev/null +++ b/apps/cm/src/pages/auth/login/index.ts @@ -0,0 +1 @@ +export { LoginPage } from "./ui/login-page"; diff --git a/apps/cm/src/pages/auth/login/ui/OtpModal.tsx b/apps/cm/src/pages/auth/login/ui/OtpModal.tsx new file mode 100644 index 000000000..7c6aeb9af --- /dev/null +++ b/apps/cm/src/pages/auth/login/ui/OtpModal.tsx @@ -0,0 +1,153 @@ +import { useState } from "react"; +import { ACCESS_TOKEN, AUTH_USER_ID, REFRESH_TOKEN, CLAIM_NAME } from "@/shared/config"; +import { tokenManager } from "@/entities/auth/lib/token-manager"; +import { + Button, + Dialog, + DialogContent, +} from "@common/components"; + +interface OtpModalProps { + onClose: () => void; + onSuccess: () => void; + open: boolean; + onOpenChange: (open: boolean) => void; +} + +export default function OtpModal({ onClose, onSuccess, open, onOpenChange }: OtpModalProps) { + const [otp, setOtp] = useState(""); + const [error, setError] = useState(""); + const [isLoading, setIsLoading] = useState(false); + + const handleSubmit = async () => { + try { + setIsLoading(true); + setError(""); + + const tempToken = localStorage.getItem("tempToken"); + console.log("tempToken from localStorage:", tempToken); + + if (!tempToken) { + setError("임시 토큰이 없습니다. 로그인을 다시 시도해주세요."); + return; + } + + // Proxy를 통해 OTP 인증 처리 + const response = await fetch(`/api/proxy/user-service/api/v1/auth/2fa/verify`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + otpCode: otp, + tempToken + }), + }); + + if (!response.ok) { + const errorData = await response.json(); + let errorMsg = errorData.message || 'OTP 인증 실패'; + if (Array.isArray(errorData.errors) && errorData.errors.length > 0) { + errorMsg = errorData.errors.map((e: { message: string }) => e.message).join(', '); + } + throw new Error(errorMsg); + } + + const data = await response.json(); + console.log("OTP verification response:", data); + console.log("Response headers:", Object.fromEntries(response.headers.entries())); + console.log("Response data keys:", Object.keys(data)); + console.log("Full response data:", JSON.stringify(data, null, 2)); + + // 2FA 응답에서는 access-token만 있고 token-id는 없을 수 있음 + const accessToken = data[ACCESS_TOKEN] || data.accessToken || data.access_token || data.token || data['ss-token']; + + console.log("Extracted accessToken:", !!accessToken); + console.log("Token value - accessToken:", accessToken?.substring(0, 20) + "..."); + + // access-token이 있는 경우 저장 + if (accessToken) { + console.log("Saving access token from OTP verification"); + tokenManager.setToken(CLAIM_NAME, accessToken); // Authorization으로 저장 + + // 리프레시 토큰도 확인 + const refreshToken = data[REFRESH_TOKEN] || data.refreshToken || data.refresh_token; + if (refreshToken) { + console.log("Saving refresh token"); + tokenManager.setToken(REFRESH_TOKEN, refreshToken); + } + + // userId는 원래 로그인 응답에서 가져온 값 사용 + const originalUserId = data.userId; + if (originalUserId) { + console.log("Saving userId from original login response"); + tokenManager.setToken(AUTH_USER_ID, originalUserId); + } + + console.log("All tokens saved successfully"); + } else { + console.log("No access token in OTP response"); + console.log("Available data keys:", Object.keys(data)); + console.log("Data values:", Object.entries(data).map(([k, v]) => `${k}: ${typeof v === 'string' ? v.substring(0, 20) + '...' : v}`)); + } + + onSuccess(); + } catch (error: unknown) { + console.error("OTP verification error:", error); + if (error instanceof Error) { + setError(error.message); + } else { + setError("OTP 인증 실패"); + } + } finally { + setIsLoading(false); + } + }; + + const handleClose = () => { + onOpenChange(false); + onClose(); + }; + + return ( + + +
+

OTP 인증

+ +
+ setOtp(e.target.value)} + disabled={isLoading} + /> + + {error && ( +
+ {error} +
+ )} + +
+ + +
+
+
+
+
+ ); +} diff --git a/apps/cm/src/pages/auth/login/ui/TwoFAModal.tsx b/apps/cm/src/pages/auth/login/ui/TwoFAModal.tsx new file mode 100644 index 000000000..d66747b0c --- /dev/null +++ b/apps/cm/src/pages/auth/login/ui/TwoFAModal.tsx @@ -0,0 +1,198 @@ +import { useEffect, useState } from "react"; +import Image from "next/image"; +import { + Button, + Dialog, + DialogContent, +} from "@common/components"; + +interface TwoFAModalProps { + onClose: () => void; + onSuccess: () => void; + open: boolean; + onOpenChange: (open: boolean) => void; +} + +export default function TwoFAModal({ onClose, onSuccess, open, onOpenChange }: TwoFAModalProps) { + const [qrImage, setQrImage] = useState(""); + const [secret, setSecret] = useState(""); + const [otp, setOtp] = useState(""); + const [error, setError] = useState(""); + const [isLoading, setIsLoading] = useState(false); + const [isSetupLoading, setIsSetupLoading] = useState(true); + + useEffect(() => { + const fetchQR = async () => { + try { + setIsSetupLoading(true); + setError(""); + + const tempToken = localStorage.getItem("tempToken"); + if (!tempToken) { + setError("임시 토큰이 없습니다"); + return; + } + + // Proxy를 통해 2FA setup 처리 + const response = await fetch(`/api/proxy/user-service/api/v1/auth/2fa/setup`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ tempToken }), + }); + + if (!response.ok) { + const errorData = await response.json(); + let errorMsg = errorData.message || 'QR코드 발급 실패'; + if (Array.isArray(errorData.errors) && errorData.errors.length > 0) { + errorMsg = errorData.errors.map((e: { message: string }) => e.message).join(', '); + } + throw new Error(errorMsg); + } + + const data = await response.json(); + console.log("2FA setup response:", data); + console.log("Response headers:", Object.fromEntries(response.headers.entries())); + + // Proxy 응답에서 QR 데이터 추출 + setQrImage(data.qrImage); + setSecret(data.secret); + } catch (error: unknown) { + console.error("2FA setup error:", error); + if (error instanceof Error) { + setError(error.message); + } else { + setError("QR코드 발급 실패"); + } + } finally { + setIsSetupLoading(false); + } + }; + + if (open) { + fetchQR(); + } + }, [open]); + + const handleEnable2FA = async () => { + try { + setIsLoading(true); + setError(""); + + const tempToken = localStorage.getItem("tempToken"); + if (!tempToken) { + setError("임시 토큰이 없습니다"); + return; + } + + // Proxy를 통해 2FA enable 처리 + const response = await fetch(`/api/proxy/user-service/api/v1/auth/2fa/enable`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': tempToken, + }, + body: JSON.stringify({ + otpCode: otp, + tempToken: tempToken, + secret: secret, + }), + }); + + if (!response.ok) { + const errorData = await response.json(); + let errorMsg = errorData.message || '2FA 등록 실패'; + if (Array.isArray(errorData.errors) && errorData.errors.length > 0) { + errorMsg = errorData.errors.map((e: { message: string }) => e.message).join(', '); + } + throw new Error(errorMsg); + } + + const data = await response.json(); + console.log("2FA enable response:", data); + console.log("Response headers:", Object.fromEntries(response.headers.entries())); + console.log("Response data keys:", Object.keys(data)); + + // 2FA 설정 완료 후에는 토큰을 저장하지 않음 (실제 로그인은 OTP에서 처리) + console.log("2FA setup completed successfully"); + + onSuccess(); + } catch (error: unknown) { + console.error("2FA enable error:", error); + if (error instanceof Error) { + setError(error.message); + } else { + setError("2FA 등록 실패"); + } + } finally { + setIsLoading(false); + } + }; + + const handleClose = () => { + onOpenChange(false); + onClose(); + }; + + return ( + + +
+

2FA 등록

+ + {isSetupLoading ? ( +
+
QR코드 로딩 중...
+
+ ) : ( + <> + {qrImage && ( +
+ QR코드 +
+ )} + +
+ setOtp(e.target.value)} + disabled={isLoading} + /> + + {error && ( +
+ {error} +
+ )} + +
+ + +
+
+ + )} +
+
+
+ ); +} diff --git a/apps/cm/src/pages/auth/login/ui/login-page.tsx b/apps/cm/src/pages/auth/login/ui/login-page.tsx new file mode 100644 index 000000000..251cd2819 --- /dev/null +++ b/apps/cm/src/pages/auth/login/ui/login-page.tsx @@ -0,0 +1,276 @@ +"use client"; + +import { useState, useEffect } from "react"; +import Image from "next/image"; +import { images } from "@common/assets"; +import { LoginApi } from "@/entities/auth"; +import { ENDPOINT } from "@/shared/config"; +import OtpModal from "./OtpModal"; +import TwoFAModal from "./TwoFAModal"; +import "./login.css"; +import { useRouter } from "next/navigation"; + +function LoginPage() { + const [isOtpEnabled, setIsOtpEnabled] = useState(false); + const [showOtpModal, setShowOtpModal] = useState(false); + const [showTwoFAModal, setShowTwoFAModal] = useState(false); + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(""); + const router = useRouter(); + + // 모달 상태 디버깅 + useEffect(() => { + console.log("Modal states - OTP:", showOtpModal, "2FA:", showTwoFAModal); + }, [showOtpModal, showTwoFAModal]); + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + setIsLoading(true); + setError(""); + + try { + const formData = new FormData(e.target as HTMLFormElement); + const userId = formData.get("id") as string; + const password = formData.get("password") as string; + + console.log("Login attempt - OTP enabled:", isOtpEnabled); + console.log("User ID:", userId); + + if (isOtpEnabled) { + // 2FA 로그인 - Proxy를 통해 처리 (2FA 전용 엔드포인트 사용) + console.log("Starting 2FA login..."); + + const response = await fetch(`/api/proxy${ENDPOINT.USER_SERVICE.LOGIN_2FA}`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + userId, + password, + provider: 'password' + }), + }); + + if (!response.ok) { + const errorData = await response.json(); + let errorMsg = errorData.message || '로그인 실패'; + if (Array.isArray(errorData.errors) && errorData.errors.length > 0) { + errorMsg = errorData.errors.map((e: { message: string }) => e.message).join(', '); + } + throw new Error(errorMsg); + } + + const data = await response.json(); + console.log("2FA login response:", data); + console.log("Response headers:", Object.fromEntries(response.headers.entries())); + + // 2FA 로그인 응답에는 tempToken과 registered2FA만 포함됨 + if (!data.tempToken) { + throw new Error("Missing tempToken in 2FA login response"); + } + + // 임시 토큰을 localStorage에 저장 (OTP 인증용) + localStorage.setItem('tempToken', data.tempToken); + console.log("tempToken saved:", data.tempToken); + + if (data.registered2FA) { + console.log("User has 2FA registered, showing OTP modal"); + setShowOtpModal(true); + } else { + console.log("User doesn't have 2FA registered, showing 2FA setup modal"); + setShowTwoFAModal(true); + } + } else { + // 기본 로그인 - proxy를 통해 처리 + console.log("Starting basic login..."); + await LoginApi.login({ userId, password }); + window.location.href = "/dashboard"; + } + } catch (error: unknown) { + console.error("Login error:", error); + + // 에러 처리 + if (error instanceof Error) { + setError(error.message); + } else { + setError("로그인에 실패했습니다. 아이디와 비밀번호를 확인해주세요."); + } + } finally { + setIsLoading(false); + } + }; + + const handleOtpSuccess = () => { + console.log("OTP authentication successful, redirecting to dashboard"); + localStorage.removeItem("tempToken"); // 임시 토큰 제거 + router.push("/dashboard"); + }; + + const handleTwoFASuccess = () => { + console.log("2FA setup successful, redirecting to dashboard"); + localStorage.removeItem("tempToken"); // 임시 토큰 제거 + router.push("/dashboard"); + }; + + const handleOtpClose = () => { + console.log("OTP modal closed"); + setShowOtpModal(false); + localStorage.removeItem("tempToken"); + }; + + const handleTwoFAClose = () => { + console.log("2FA modal closed"); + setShowTwoFAModal(false); + localStorage.removeItem("tempToken"); + }; + + return ( + <> +
+
+
+

+ 유역하수도 통합플랫폼 +
+ 통합관리시스템 +

+

유역하수도 통합플랫폼에 오신 것을 환영합니다.

+
+
+ logo +
+
+
+
+
    +
  • +

    ID

    +
    + + +
    +
  • +
  • +

    PASSWORD

    +
    + + +
    +
  • +
+
+
+ + +
+
+ setIsOtpEnabled(e.target.checked)} + disabled={isLoading} + /> + +
+
+ + {error && ( +
+ {error} +
+ )} +
+
+

copyright © 2023 KECO. All rights reserved.

+
+ +

+ + 주소 : (22689) 인천광역시 서구 환경로 42(경서동 + 종합환경연구단지) + + + 전화 : (시스템) 032-590-4321, 3752, 4314 / (통 계) 032-590-3723, + 3722 + + 팩스 :032-590-3729 +

+
+
+ +
+ + {/* OTP 인증 모달 */} + + + {/* 2FA 등록 모달 */} + + + ); +} + +export { LoginPage }; diff --git a/apps/cm/src/pages/auth/login/ui/login.css b/apps/cm/src/pages/auth/login/ui/login.css new file mode 100644 index 000000000..831cc13a9 --- /dev/null +++ b/apps/cm/src/pages/auth/login/ui/login.css @@ -0,0 +1,311 @@ +/** +* OLYM Cascading Style Sheets +* File Name : login.css +* Description : 로그인 스타일시트 +* Author : Web business Team / Choi Hyun Mi +* Email : desingtj@olym.co.kr +* Date : 2023.07.20 +* Update : 2023.07.26 +* Copyright(c) 2023 OLYM Communications. All Rights Reserved. +*/ +html, +body { + background: #fff; +} +.fx { + display: flex; + -ms-display: flex; + -webkit-display: flex; + box-sizing: border-box; +} +.login { + width: 100%; + height: 100vh; +} +.login .left_box { + width: 100%; + background: url(../../../../../public/images/bg_login.jpg) no-repeat + center/cover; + flex-direction: column; + justify-content: space-between; + padding: 7% 5% 5% 5%; +} +.login .left_box .text h1 { + font-size: 53px; + color: #fff; +} +.login .left_box .text h1 span { + font-weight: 800; +} +.login .left_box .text p { + margin-top: 40px; + font-size: 18px; + color: #fff; +} +.login .login_box { + width: 100%; + flex-direction: column; + justify-content: center; + padding: 4% 12% 4% 6%; +} +.login .login_box > ul { + flex-direction: column; + gap: 40px; +} +.login .login_box > ul > li h2 { + font-size: 22px; + font-weight: 600; + color: #2640a5; + margin-bottom: 14px; +} +.login .login_box > ul > li .input_st { + position: relative; +} +.login .login_box > ul > li .input_st .diveicon { + position: absolute; + top: 50%; + left: 28px; + transform: translateY(-50%); + font-family: "Xeicon"; + font-size: 25px; + color: #003288; +} +.login .login_box > ul > li input { + width: 100%; + padding: 20px 20px 20px 70px; + background: #f7f7f7; + box-sizing: border-box; + border: none; + border-radius: 5px; + font-size: 18px; + font-weight: 700; + color: #000; + height: auto; +} +.login .login_box > ul > li input:focus { + outline: 1px solid #3c5fe5; +} +.login .login_box > ul > li input::placeholder { + color: #afabab; + font-weight: 500; +} +.login .login_box .bottom_box { + justify-content: space-between; + gap: 20px; + padding: 50px 0 45px 0; +} +.login .login_box .bottom_box .checks { + display: flex; + align-items: center; + gap: 8px; +} +.login .login_box .bottom_box .checks input[type="checkbox"] { + width: 18px; + height: 18px; +} +.login .login_box .bottom_box .checks label { + font-size: 14px; +} +.login .login_box .bottom_box .pw_message { + align-items: center; + gap: 5px; + color: #636363; + font-weight: 500; + border-bottom: 1px solid #ccc; + padding-bottom: 5px; +} +.login .login_box .bottom_box .pw_message i { + color: #327af5; + font-size: 20px; +} +.login .login_box .login_btn { + position: relative; + border-radius: 5px; + padding: 24px 15px; + background: linear-gradient( + to left, + #1d3969 0%, + #264078 10%, + #172558 40%, + #162254 50%, + #111c43 60%, + #111c42 100% + ); + overflow: hidden; + justify-content: center; + align-items: center; + gap: 10px; + color: #fff; + cursor: pointer; +} +.login .login_box .login_btn span { + font-family: "Montserrat"; + font-size: 19px; + font-weight: 700; + position: relative; +} +.login .login_box .login_btn i { + font-size: 22px; + transform: translateY(-2px); +} +.login .login_box .login_btn:before { + display: block; + content: ""; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + opacity: 0; + background: linear-gradient( + to right, + #1d3969 0%, + #264078 10%, + #172558 40%, + #162254 50%, + #111c43 60%, + #111c42 100% + ); + transition: opacity 0.5s; +} +.login .login_box .login_btn:hover::before { + opacity: 1; +} +.login .footer .copy { + margin-top: 36px; + justify-content: space-between; + align-items: center; + gap: 3%; +} +.login .footer .copy p { + font-size: 13px; + color: #d4d4d4; + width: 44%; + text-align: center; +} +.login .footer .copy::before, +.login .login_box .copy::after { + content: ""; + width: 20%; + height: 1px; + background: #d4d4d4; +} +.login .footer .fot_btn { + gap: 20px; + margin: 30px 0 10px 0; +} +.login .footer .fot_btn a { + color: #333; + font-weight: 700; + font-size: 13px; +} +.login .footer .fot_btn a:hover { + color: #003288; +} +.login .footer .addr { + color: #666; + font-size: 13px; + gap: 3px 20px; + flex-wrap: wrap; +} +/* 비밀번호 변경 팝업창 */ +.login .modal .modal_container { + width: 750px; +} +.login .pw_desc { + padding: 10px 10px 30px 10px; + color: #666; +} +.login .pw_desc p { + font-size: 1.25rem; + color: #000; + font-weight: 700; + margin-bottom: 10px; +} +.login .pw_desc span { + color: #f60; + font-weight: 700; +} +.login .modal .form_write { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + padding: 20px 50px; +} +@media (max-width: 1024px) { + .login { + flex-direction: column; + height: auto; + } + .login .left_box { + padding: 30px; + flex-direction: column-reverse; + gap: 20px; + } + .login .left_box .text h1 { + font-size: 30px; + line-height: 1.2em; + } + .login .left_box .text p { + margin-top: 20px; + font-size: 14px; + } + .login .left_box .img img { + height: 40px; + } + .login .login_box { + padding: 30px; + } + .login .login_box > ul { + gap: 20px; + } + .login .login_box > ul > li h2 { + margin-bottom: 7px; + } + .login .login_box > ul > li .input_st::after { + left: 15px; + font-size: 20px; + } + .login .login_box > ul > li input { + padding: 15px 10px 15px 50px; + font-size: 16px; + } + .login .login_box .bottom_box { + flex-direction: column; + align-items: flex-start; + padding: 30px 0; + } + .login .login_box .bottom_box .id_save label { + font-size: 14px; + } + .login .login_box .login_btn { + padding: 15px; + } + .login .login_box .login_btn span { + font-size: 16px; + } + .login .login_box .login_btn i { + font-size: 18px; + transform: translateY(-1px); + } + .login .login_box .copy p { + width: 100%; + } + .login .login_box .copy::before, + .login .login_box .copy::after { + display: none; + } + .login .footer .addr { + font-size: 11px; + gap: 3px 10px; + } + .login .modal .modal_container { + width: 90%; + } + .login .pw_desc { + padding: 0 0 20px 0; + } + .login .modal .form_write { + padding: 10px; + } +} +/* // login */ diff --git a/apps/cm/src/pages/dashboard/index.ts b/apps/cm/src/pages/dashboard/index.ts new file mode 100644 index 000000000..5b787c2e2 --- /dev/null +++ b/apps/cm/src/pages/dashboard/index.ts @@ -0,0 +1 @@ +export { DashboardPage } from "./ui/dashboard-page"; diff --git a/apps/cm/src/pages/dashboard/ui/dashboard-page.tsx b/apps/cm/src/pages/dashboard/ui/dashboard-page.tsx new file mode 100644 index 000000000..3b59d4a23 --- /dev/null +++ b/apps/cm/src/pages/dashboard/ui/dashboard-page.tsx @@ -0,0 +1,94 @@ +"use client"; +import { useEffect, useState } from 'react'; +import { useRouter } from 'next/navigation'; +import { tokenManager } from '@/entities/auth/lib/token-manager'; +import { client } from '@/shared/api'; +import { ENDPOINT } from '@/shared/config'; + +interface UserInfo { + email?: string; + userId?: string; + userName?: string; + twoFactorEnabled?: boolean; +} + +function DashboardPage() { + const [userInfo, setUserInfo] = useState(null); + const [error, setError] = useState(''); + const router = useRouter(); + + useEffect(() => { + const fetchUserInfo = async () => { + console.log('fetchUserInfo called'); + + try { + // tokenManager를 통해 토큰 확인 + const accessToken = tokenManager.getToken('Authorization'); + const userId = tokenManager.getToken('token-id'); + + if (!accessToken || !userId) { + console.log('No tokens found, redirecting to login'); + setError('로그인이 필요합니다.'); + router.push('/login'); + return; + } + + console.log('Fetching user info with userId:', userId); + + // client를 사용하여 API 호출 (자동 토큰 처리) + const response = await client.get(`${ENDPOINT.USER_SERVICE.USERS}/${userId}`); + + if (response.data) { + console.log('User info received:', response.data); + setUserInfo(response.data); + } else { + setError('사용자 정보를 불러올 수 없습니다.'); + } + } catch (error) { + console.error('Error fetching user info:', error); + if (error instanceof Error && error.message.includes('401')) { + setError('인증이 만료되었습니다. 다시 로그인해주세요.'); + tokenManager.clearAuthToken(); + router.push('/login'); + } else { + setError('네트워크 오류가 발생했습니다.'); + } + } + }; + + fetchUserInfo(); + }, [router]); + + const handleLogout = () => { + console.log('Logging out...'); + // localStorage 정리 + localStorage.removeItem('tempToken'); + // tokenManager를 통해 쿠키 정리 + tokenManager.clearAuthToken(); + router.push('/login'); + }; + + const handleChangePassword = () => { + router.push('/otp?next=change-password'); + }; + + return ( +
+

대시보드

+ {error &&
{error}
} + {userInfo ? ( +
+
이메일: {userInfo.email || userInfo.userId}
+
이름: {userInfo.userName || '-'}
+
2FA 활성화: {userInfo.twoFactorEnabled ? '예' : '아니오'}
+
+ ) : ( + !error &&
사용자 정보를 불러오는 중...
+ )} + + +
+ ); +} + +export { DashboardPage }; \ No newline at end of file diff --git a/apps/cm/src/shared/api/client.ts b/apps/cm/src/shared/api/client.ts new file mode 100644 index 000000000..cf37e6671 --- /dev/null +++ b/apps/cm/src/shared/api/client.ts @@ -0,0 +1,11 @@ +import { Client } from "@common/network"; +import { BASE_URL } from "../config/api"; +import { SITE_ID } from "../config/env"; +import { setCookie } from "../lib"; + +setCookie("site-id-key", SITE_ID); + +export const client = Client.getInstance({ + baseURL: BASE_URL, + siteId: SITE_ID, +}); diff --git a/apps/cm/src/shared/api/index.ts b/apps/cm/src/shared/api/index.ts new file mode 100644 index 000000000..b7b9d6121 --- /dev/null +++ b/apps/cm/src/shared/api/index.ts @@ -0,0 +1 @@ +export { client } from "./client"; diff --git a/apps/cm/src/shared/config/api.ts b/apps/cm/src/shared/config/api.ts new file mode 100644 index 000000000..d6065bfc7 --- /dev/null +++ b/apps/cm/src/shared/config/api.ts @@ -0,0 +1,73 @@ +import { PROXY_HOST } from "./env"; + +export const BASE_URL = `${PROXY_HOST}/server`; + +export const ENDPOINT = { + ATTACH_SERVICE: { + TUS_UPLOAD: "/attach-service/api/v1/tus/upload", + EDITOR_UPLOAD: "/attach-service/api/v1/upload/editor", + IMAGES: "/attach-service/api/v1/images", + MOVIE_THUMBNAIL: "/attach-service/api/v1/movie/thumbnail", + ATTACHMENTS: "/attach-service/api/v1/atfl/attachments", + DOWNLOAD: "/attach-service/api/v1/atflcd/download", + STREAM_VIDEO: "/attach-service/api/v1/stream/video", + }, + USER_SERVICE: { + LOGIN: "/user-service/login", + LOGIN_2FA: "/user-service/api/v1/auth/login", + USERS: "/user-service/api/v1/users", + SILENT_REFRESH: "/user-service/api/v1/users/token/refresh", + AUTHORIZATIONS: "/user-service/api/v1/authorizations", + ROLE_AUTHORIZATIONS: "/user-service/api/v1/role-authorizations", + ROLES: "/user-service/api/v1/roles", + LOGINLOG: "/user-service/api/v1/login-logs", + PRIVACYLOG: "/user-service//api/v1/prvc-inq-logs", + OTP_VERIFY: "/user-service/api/v1/auth/2fa/verify", + TWOFA_SETUP: "/user-service/api/v1/auth/2fa/setup", + TWOFA_ENABLE: "/user-service/api/v1/auth/2fa/enable", + }, + CMS_SERVICE: { + DASHBOARD: "/cms-service/api/v1/dashboard", + SITES: "/cms-service/api/v1/sites", + IPS: "/cms-service/api/v1/site-ips", + DOMAINS: "/cms-service/api/v1/site-dmns", + POSTINGS: "/cms-service/api/v1/site-pstgs", + CODE: "/cms-service/api/v1/code/cache", + MENUS: "/cms-service/api/v1/menus", + MENU_ROLES: "/cms-service/api/v1/menu-roles", + MENU_AUTHRTS: "/cms-service/api/v1/menu-authrts", + MENU_TEMPORARY_STORAGE: "/cms-service/api/v1/menu-tmpr-strg", + MENU_HISTORY: "/cms-service/api/v1/menu-hstry", + CONTENTS: "/cms-service/api/v1/contents", + CONTENTS_DETAILS: "/cms-service/api/v1/contents-details", + ORGANIZATIONS: "/cms-service/api/v1/ognzs", + USER_ORGANIZATION: "/cms-service/api/v1/user-ognz", + IMAGES: "/cms-service/api/v1/images", + BANNERS: "/cms-service/api/v1/bnrs", + TEMPLATE: "/cms-service/api/v1/tmplt", + TERMS: "/cms-service/api/v1/trms", + LWPO_CODE: "/cms-service/api/v1/lwpo-cds", + UP_CODE: "/cms-service/api/v1/up-codes", + POPUPS: "/cms-service/api/v1/popups", + SCHEDULES: "/cms-service/api/v1/schdls", + SURVEY: "/cms-service/api/v1/srvy", + SURVEY_QUESTION: "/cms-service/api/v1/srvy-qitem", + SURVEY_ARTICLE: "/cms-service/api/v1/srvy-artcl", + ZIPS: "/cms-service/api/v1/zips", + GROUPS: "/cms-service/api/v1/groups", + GROUP_USERS: "/cms-service/api/v1/group-users", + MANAGER_IP: "/cms-service/api/v1/mgrip", + APILOG: "/cms-service/api/v1/api-logs", + SITE_AUTHORITY: "/cms-service/api/v1/site-authrt", + CONNECTION_LOG: "/cms-service/api/v1/cntnlog", + }, + BOARD_SERVICE: { + BBS: "/board-service/api/v1/bbs", + BBS_TEMPLATES: "/board-service/api/v1/bbsTmplt", + POSTS: "/board-service/api/v1/posts", + POSTS_COMMENTS: "/board-service/api/v1/posts-cmnts", + POST_EVALUATION: "/board-service/api/v1/pstEvl", + }, +}; + +export const JWT_EXPIRATION_TIME = 1800000; diff --git a/apps/cm/src/shared/config/env.ts b/apps/cm/src/shared/config/env.ts new file mode 100644 index 000000000..c6373724f --- /dev/null +++ b/apps/cm/src/shared/config/env.ts @@ -0,0 +1,11 @@ +export const PORT = process.env.NEXT_PUBLIC_PORT || "3000"; +export const PROXY_HOST = + process.env.NEXT_PUBLIC_PROXY_HOST || `http://localhost:${PORT}`; +export const SERVER_API_URL = process.env.NEXT_PUBLIC_SERVER_API_URL; +export const SITE_ID = process.env.NEXT_PUBLIC_SITE_ID || "CS"; +export const CLAIM_NAME = process.env.NEXT_PUBLIC_CLAIM_NAME || "Authorization"; +export const ACCESS_TOKEN = + process.env.NEXT_PUBLIC_ACCESS_TOKEN || "access-token"; +export const REFRESH_TOKEN = + process.env.NEXT_PUBLIC_REFRESH_TOKEN || "refresh-token"; +export const AUTH_USER_ID = process.env.NEXT_PUBLIC_AUTH_USER_ID || "token-id"; diff --git a/apps/cm/src/shared/config/index.ts b/apps/cm/src/shared/config/index.ts new file mode 100644 index 000000000..cd83447d5 --- /dev/null +++ b/apps/cm/src/shared/config/index.ts @@ -0,0 +1,2 @@ +export * from "./api"; +export * from "./env"; diff --git a/apps/cm/src/shared/lib/cookie.ts b/apps/cm/src/shared/lib/cookie.ts new file mode 100644 index 000000000..8f5d0011b --- /dev/null +++ b/apps/cm/src/shared/lib/cookie.ts @@ -0,0 +1,29 @@ +import Cookies from "js-cookie"; + +export function getCookie(name: string): string | undefined { + if (typeof window === "undefined") { + return undefined; + } + return Cookies.get(name); +} + +export function setCookie( + name: string, + value: string, + options?: Cookies.CookieAttributes, +): void { + if (typeof window === "undefined") { + return; + } + Cookies.set(name, value, options); +} + +export function removeCookie( + name: string, + options?: Cookies.CookieAttributes, +): void { + if (typeof window === "undefined") { + return; + } + Cookies.remove(name, options); +} diff --git a/apps/cm/src/shared/lib/index.ts b/apps/cm/src/shared/lib/index.ts new file mode 100644 index 000000000..5ac79bf08 --- /dev/null +++ b/apps/cm/src/shared/lib/index.ts @@ -0,0 +1,8 @@ +export { getCookie, setCookie, removeCookie } from "./cookie"; +export { useMutationWrapper } from "./use-mutation-wrapper"; +export { useAlertStore } from "./use-alert-store"; +export { useDataTable } from "./use-data-table"; +export { useMenuStore } from "./use-menu-store"; +export { useUserStore } from "./use-user-store"; +export { usePrompt } from "./use-prompt"; +export { useSelectPrompt } from "./use-select-prompt"; diff --git a/apps/cm/src/shared/lib/match-query-status.ts b/apps/cm/src/shared/lib/match-query-status.ts new file mode 100644 index 000000000..0e5f45829 --- /dev/null +++ b/apps/cm/src/shared/lib/match-query-status.ts @@ -0,0 +1,65 @@ +import { type UseQueryResult } from "@tanstack/react-query"; +import type { PageableList } from "../model"; + +/** + * Match the state of a query to a set of components. + * + * Useful for rendering different UI based on the state of a query. + */ +export function matchQueryStatus( + query: UseQueryResult>, + options: { + Loading?: JSX.Element; + Errored?: JSX.Element | ((error: unknown) => JSX.Element); + Empty?: JSX.Element; + Success: ( + data: UseQueryResult> & { + data: NonNullable["data"]>; + }, + ) => JSX.Element; + }, +): JSX.Element; +export function matchQueryStatus( + query: UseQueryResult>, + options: { + Loading?: JSX.Element; + Errored?: JSX.Element | ((error: unknown) => JSX.Element); + Success: (data: UseQueryResult>) => JSX.Element; + }, +): JSX.Element; +export function matchQueryStatus( + query: UseQueryResult>, + { + Loading, + Errored, + Empty, + Success, + }: { + Loading?: JSX.Element; + Errored?: JSX.Element | ((error: unknown) => JSX.Element); + Empty?: JSX.Element; + Success: (data: UseQueryResult>) => JSX.Element; + }, +): JSX.Element { + if (query.isLoading && Loading) { + return Loading; + } + + if (query.isError && Errored) { + if (typeof Errored === "function") { + return Errored(query.error); + } + return Errored; + } + + const isEmpty = + query.data?.content === undefined || + query.data?.content === null || + (Array.isArray(query.data?.content) && query.data?.content.length === 0); + + if (isEmpty && Empty) { + return Empty; + } + + return Success(query); +} diff --git a/apps/cm/src/shared/lib/use-alert-store.ts b/apps/cm/src/shared/lib/use-alert-store.ts new file mode 100644 index 000000000..c21a00ed3 --- /dev/null +++ b/apps/cm/src/shared/lib/use-alert-store.ts @@ -0,0 +1,14 @@ +import { useStore } from "zustand"; +import { useContext } from "react"; +import type { AlertStore } from "../store/alert-store"; +import { StoreContext } from "../providers/store-provider"; + +export const useAlertStore = (selector: (store: AlertStore) => T): T => { + const storeContext = useContext(StoreContext); + + if (!storeContext) { + throw new Error("useAlertStore must be used within StoreProvider"); + } + + return useStore(storeContext.alertStore, selector); +}; diff --git a/apps/cm/src/shared/lib/use-attachment-store.ts b/apps/cm/src/shared/lib/use-attachment-store.ts new file mode 100644 index 000000000..285699cc6 --- /dev/null +++ b/apps/cm/src/shared/lib/use-attachment-store.ts @@ -0,0 +1,14 @@ +import { useStore } from "zustand"; +import { useContext } from "react"; +import type { AttachmentStore } from "../store/attachment-store"; +import { StoreContext } from "../providers/store-provider"; + +export const useAttachmentStore = ( + selector: (store: AttachmentStore) => T, +): T => { + const store = useContext(StoreContext); + if (!store) { + throw new Error("useAttachmentStore must be used within StoreProvider"); + } + return useStore(store.attachmentStore, selector); +}; diff --git a/apps/cm/src/shared/lib/use-data-table.tsx b/apps/cm/src/shared/lib/use-data-table.tsx new file mode 100644 index 000000000..51638f746 --- /dev/null +++ b/apps/cm/src/shared/lib/use-data-table.tsx @@ -0,0 +1,42 @@ +import type { HTMLAttributes } from "react"; +import type { UseQueryResult } from "@tanstack/react-query"; +import { useReactTable, type TableOptions } from "@tanstack/react-table"; +import { DataTable } from "@common/components"; +import { NoData } from "../ui/no-data"; +import type { PageableList } from "../model"; +import { matchQueryStatus } from "./match-query-status"; + +type UseDataTableOptions = { + query: UseQueryResult>; + tableOptions: Omit, "data" | "rowCount">; + dataTableOptions?: DataTableOptions; +}; + +type DataTableOptions = { + variant?: "default" | "secondary" | "line"; + className?: HTMLAttributes["className"]; + viewPagination?: boolean; + onRowClick?: (row: T) => void; +}; + +export const useDataTable = ({ + query, + tableOptions, + dataTableOptions, +}: UseDataTableOptions) => { + const table = useReactTable({ + ...tableOptions, + data: query.data?.content ?? [], + rowCount: query.data?.totalElements ?? 0, + }); + + return { + tableComponent: matchQueryStatus(query, { + Empty: , + Success: () => { + return ; + }, + }), + tableInstance: table, + }; +}; diff --git a/apps/cm/src/shared/lib/use-menu-store.ts b/apps/cm/src/shared/lib/use-menu-store.ts new file mode 100644 index 000000000..66e41c76c --- /dev/null +++ b/apps/cm/src/shared/lib/use-menu-store.ts @@ -0,0 +1,14 @@ +import { useStore } from "zustand"; +import { useContext } from "react"; +import type { MenuStore } from "../store/menu-store"; +import { StoreContext } from "../providers/store-provider"; + +export const useMenuStore = (selector: (store: MenuStore) => T): T => { + const storeContext = useContext(StoreContext); + + if (!storeContext) { + throw new Error("useMenuStore must be used within StoreProvider"); + } + + return useStore(storeContext.menuStore, selector); +}; diff --git a/apps/cm/src/shared/lib/use-mutation-wrapper.tsx b/apps/cm/src/shared/lib/use-mutation-wrapper.tsx new file mode 100644 index 000000000..cea1a8f83 --- /dev/null +++ b/apps/cm/src/shared/lib/use-mutation-wrapper.tsx @@ -0,0 +1,29 @@ +import { AxiosError } from "axios"; +import { useMutation, type UseMutationOptions } from "@tanstack/react-query"; +import { useAlertStore } from "./use-alert-store"; + +export const useMutationWrapper = < + TData = unknown, + TError = unknown, + TVariables = void, + TContext = unknown, +>( + mutationOptions: UseMutationOptions, +) => { + const alert = useAlertStore((state) => state.setMessage); + return useMutation({ + ...mutationOptions, + onError: (error) => { + let errorMessage = ""; + + if (error instanceof AxiosError) { + if (error.response?.data?.message) + errorMessage += `${error.response.data.message}\n`; + if (error.response?.data?.errors[0]?.message) + errorMessage += `${error.response.data.errors[0].message}\n`; + } + + alert(`${errorMessage}`); + }, + }); +}; diff --git a/apps/cm/src/shared/lib/use-prompt.tsx b/apps/cm/src/shared/lib/use-prompt.tsx new file mode 100644 index 000000000..f36858eb0 --- /dev/null +++ b/apps/cm/src/shared/lib/use-prompt.tsx @@ -0,0 +1,26 @@ +import { useContext } from "react"; +import { PromptContext } from "../providers/prompt-provider"; + +export const usePrompt = () => { + const { message, resolve, setMessage, setResolve } = + useContext(PromptContext); + + const prompt = (message: string) => { + setMessage(message); + return new Promise<{ resolved: boolean; value?: string }>((resolve) => { + setResolve(() => resolve); + }); + }; + + const onSubmit = (value: string) => { + resolve?.({ resolved: true, value }); + setMessage(""); + }; + + const onCancel = () => { + resolve?.({ resolved: false }); + setMessage(""); + }; + + return { message, isOpen: !!message, prompt, onSubmit, onCancel }; +}; diff --git a/apps/cm/src/shared/lib/use-select-prompt.tsx b/apps/cm/src/shared/lib/use-select-prompt.tsx new file mode 100644 index 000000000..357be7a36 --- /dev/null +++ b/apps/cm/src/shared/lib/use-select-prompt.tsx @@ -0,0 +1,48 @@ +import { useContext, useEffect } from "react"; +import { PromptContext } from "../providers/prompt-provider"; + +type SelectData = { + label: string; + value: string; +}; + +export const useSelectPrompt = (data?: SelectData[]) => { + const { + selectData, + selectionGuide, + resolve, + setResolve, + setSelectData, + setSelectionGuide, + } = useContext(PromptContext); + + const prompt = (message: string) => { + setSelectionGuide(message); + return new Promise<{ resolved: boolean; value?: string }>((resolve) => { + setResolve(() => resolve); + }); + }; + + const onSubmit = (value: string) => { + resolve?.({ resolved: true, value }); + setSelectionGuide(""); + }; + + const onCancel = () => { + resolve?.({ resolved: false }); + setSelectionGuide(""); + }; + + useEffect(() => { + if (data) setSelectData(data); + }, [data]); + + return { + selectData, + selectionGuide, + isOpen: !!selectionGuide, + prompt, + onSubmit, + onCancel, + }; +}; diff --git a/apps/cm/src/shared/lib/use-tus.ts b/apps/cm/src/shared/lib/use-tus.ts new file mode 100644 index 000000000..9d4bc7c00 --- /dev/null +++ b/apps/cm/src/shared/lib/use-tus.ts @@ -0,0 +1,90 @@ +import { useEffect, useState } from "react"; +import { type HttpResponse, Upload } from "tus-js-client"; +import { AUTH_USER_ID, CLAIM_NAME, ENDPOINT } from "../config"; +import { useAttachmentStore } from "./use-attachment-store"; +import { useAlertStore } from "./use-alert-store"; +import { getCookie } from "./cookie"; + +type TusProps = { + accept?: string; +}; + +export const useTus = ({ accept }: TusProps = {}) => { + const alert = useAlertStore((state) => state.setMessage); + const { attachmentFileCode, setAttachmentFileCode } = useAttachmentStore( + (state) => state, + ); + + const [file, setFile] = useState(null); + const [upload, setUpload] = useState(null); + const [response, setResponse] = useState(null); + const [progress, setProgress] = useState(0); + const [isValid, setIsValid] = useState(false); + + const metadata = { + filename: file?.name ?? "", + filetype: file?.type ?? "", + atflCd: attachmentFileCode, + }; + + const validFileType = (file: File) => { + const allowedExtensions = accept?.split(",") ?? []; + const fileName = file.name; + const fileExtension = fileName + .substring(fileName.lastIndexOf(".")) + .toLowerCase(); + + if (!allowedExtensions.includes(fileExtension)) { + alert("파일 형식이 올바르지 않습니다."); + setIsValid(false); + return false; + } + + setIsValid(true); + return true; + }; + + const createUpload = () => { + return new Upload(file!, { + endpoint: `${ENDPOINT.ATTACH_SERVICE.TUS_UPLOAD}`, + chunkSize: 10 * 1024 * 1024, + headers: { + [CLAIM_NAME]: getCookie(CLAIM_NAME) ?? "", + [AUTH_USER_ID]: getCookie(AUTH_USER_ID) ?? "", + }, + metadata, + onError(error) { + throw new Error(`Failed because: ${error}`); + }, + onProgress(bytesUploaded, bytesTotal) { + const percentage = ((bytesUploaded / bytesTotal) * 100).toFixed(2); + setProgress(parseInt(percentage)); + }, + onAfterResponse(req, res) { + const fileInfo = res.getHeader("X-File-Info"); + if (fileInfo === undefined || fileInfo === null) return; + + setAttachmentFileCode(JSON.parse(fileInfo)?.atflCd ?? ""); + setResponse(res); + }, + }); + }; + + useEffect(() => { + if (!file) return; + if (!validFileType(file)) return; + + const upload = createUpload(); + upload.start(); + setUpload(upload); + }, [file]); + + return { + file, + upload, + response, + progress, + isValid, + setFile, + }; +}; diff --git a/apps/cm/src/shared/lib/use-user-store.ts b/apps/cm/src/shared/lib/use-user-store.ts new file mode 100644 index 000000000..748caed4c --- /dev/null +++ b/apps/cm/src/shared/lib/use-user-store.ts @@ -0,0 +1,14 @@ +import { useStore } from "zustand"; +import { useContext } from "react"; +import type { UserStore } from "../store/user-store"; +import { StoreContext } from "../providers/store-provider"; + +export const useUserStore = (selector: (store: UserStore) => T): T => { + const storeContext = useContext(StoreContext); + + if (!storeContext) { + throw new Error("useUserStore must be used within StoreProvider"); + } + + return useStore(storeContext.userStore, selector); +}; diff --git a/apps/cm/src/shared/model/api-interface.ts b/apps/cm/src/shared/model/api-interface.ts new file mode 100644 index 000000000..8218bfb0d --- /dev/null +++ b/apps/cm/src/shared/model/api-interface.ts @@ -0,0 +1,34 @@ +interface SortConfig { + empty: boolean; + sorted: boolean; + unsorted: boolean; +} + +interface PageableConfig { + sort: SortConfig; + offset: number; + pageNumber: number; + pageSize: number; + paged: boolean; + unpaged: boolean; +} + +export interface PageableList { + content: T[]; + pageable: PageableConfig; + sort: SortConfig; + totalPages: number; + totalElements: number; + number: number; + numberOfElements: number; + size: number; + first: boolean; + last: boolean; + empty: boolean; +} + +export interface PageableParams { + page?: number; + size?: number; + sort?: string; +} diff --git a/apps/cm/src/shared/model/index.ts b/apps/cm/src/shared/model/index.ts new file mode 100644 index 000000000..cf589d200 --- /dev/null +++ b/apps/cm/src/shared/model/index.ts @@ -0,0 +1 @@ +export * from "./api-interface"; diff --git a/apps/cm/src/shared/providers/index.ts b/apps/cm/src/shared/providers/index.ts new file mode 100644 index 000000000..fa8320fe7 --- /dev/null +++ b/apps/cm/src/shared/providers/index.ts @@ -0,0 +1,2 @@ +export { StoreProvider } from "./store-provider"; +export { PromptProvider } from "./prompt-provider"; diff --git a/apps/cm/src/shared/providers/prompt-provider.tsx b/apps/cm/src/shared/providers/prompt-provider.tsx new file mode 100644 index 000000000..71b86388c --- /dev/null +++ b/apps/cm/src/shared/providers/prompt-provider.tsx @@ -0,0 +1,61 @@ +import { createContext, useState } from "react"; + +type SelectData = { + label: string; + value: string; +}; + +interface PromptContext { + message?: string; + selectData?: SelectData[]; + selectionGuide?: string; + resolve?: ({ + resolved, + value, + }: { + resolved: boolean; + value?: string; + }) => void; + setMessage: (message: string) => void; + setSelectData: (selectData: SelectData[]) => void; + setSelectionGuide: (message: string) => void; + setResolve: (resolve: () => void) => void; +} + +export const PromptContext = createContext({ + message: "", + selectData: [], + selectionGuide: "", + resolve() {}, + setMessage() {}, + setSelectData() {}, + setSelectionGuide() {}, + setResolve() {}, +}); + +export const PromptProvider = ({ children }: { children: React.ReactNode }) => { + const [message, setMessage] = useState(); + const [selectData, setSelectData] = useState([]); + const [selectionGuide, setSelectionGuide] = useState(); + const [resolve, setResolve] = + useState< + ({ resolved, value }: { resolved: boolean; value?: string }) => void + >(); + + return ( + + {children} + + ); +}; diff --git a/apps/cm/src/shared/providers/store-provider.tsx b/apps/cm/src/shared/providers/store-provider.tsx new file mode 100644 index 000000000..a0ec17b61 --- /dev/null +++ b/apps/cm/src/shared/providers/store-provider.tsx @@ -0,0 +1,38 @@ +"use client"; + +import { createContext, useRef } from "react"; +import { + createAlertStore, + createAttachmentStore, + createMenuStore, + createUserStore, +} from "../store"; + +type StoreContextType = { + alertStore: ReturnType; + attachmentStore: ReturnType; + menuStore: ReturnType; + userStore: ReturnType; +}; + +export const StoreContext = createContext( + undefined, +); + +export const StoreProvider = ({ children }: { children: React.ReactNode }) => { + const storeRef = useRef(null); + if (storeRef.current === null) { + storeRef.current = { + alertStore: createAlertStore(), + attachmentStore: createAttachmentStore(), + menuStore: createMenuStore(), + userStore: createUserStore(), + }; + } + + return ( + + {children} + + ); +}; diff --git a/apps/cm/src/shared/store/alert-store.ts b/apps/cm/src/shared/store/alert-store.ts new file mode 100644 index 000000000..3bba65848 --- /dev/null +++ b/apps/cm/src/shared/store/alert-store.ts @@ -0,0 +1,25 @@ +import { createStore } from "zustand/vanilla"; + +export type AlertState = { + message: string; + callback?: () => void; +}; + +export type AlertActions = { + setMessage: (message: string, callback?: () => void) => void; +}; + +export type AlertStore = AlertState & AlertActions; + +export const defaultInitState: AlertState = { + message: "", + callback: undefined, +}; + +export const createAlertStore = (initState: AlertState = defaultInitState) => { + return createStore()((set) => ({ + ...initState, + setMessage: (message: string, callback?: () => void) => + set(() => ({ message, callback })), + })); +}; diff --git a/apps/cm/src/shared/store/attachment-store.ts b/apps/cm/src/shared/store/attachment-store.ts new file mode 100644 index 000000000..faa700949 --- /dev/null +++ b/apps/cm/src/shared/store/attachment-store.ts @@ -0,0 +1,25 @@ +import { createStore } from "zustand/vanilla"; + +export type AttachmentState = { + attachmentFileCode: string; +}; + +export type AttachmentActions = { + setAttachmentFileCode: (attachmentFileCode: string) => void; +}; + +export type AttachmentStore = AttachmentState & AttachmentActions; + +export const defaultInitState: AttachmentState = { + attachmentFileCode: "", +}; + +export const createAttachmentStore = ( + initState: AttachmentState = defaultInitState, +) => { + return createStore()((set) => ({ + ...initState, + setAttachmentFileCode: (attachmentFileCode: string) => + set({ attachmentFileCode }), + })); +}; diff --git a/apps/cm/src/shared/store/index.ts b/apps/cm/src/shared/store/index.ts new file mode 100644 index 000000000..a41d6f928 --- /dev/null +++ b/apps/cm/src/shared/store/index.ts @@ -0,0 +1,4 @@ +export { createAlertStore } from "./alert-store"; +export { createAttachmentStore } from "./attachment-store"; +export { createMenuStore, type BbsType } from "./menu-store"; +export { createUserStore, type IUserInfo } from "./user-store"; diff --git a/apps/cm/src/shared/store/menu-store.ts b/apps/cm/src/shared/store/menu-store.ts new file mode 100644 index 000000000..8536011ee --- /dev/null +++ b/apps/cm/src/shared/store/menu-store.ts @@ -0,0 +1,93 @@ +import { createStore } from "zustand/vanilla"; + +export const BBS_TYPE = { + BBSNOTICE: "BBSNOTICE", + BBSNORMAL: "BBSNORMAL", + BBSFAQ: "BBSFAQ", + BBSIMAGE: "BBSIMAGE", + BBSMOVIE: "BBSMOVIE", +} as const; + +export type BbsType = (typeof BBS_TYPE)[keyof typeof BBS_TYPE]; + +export interface IBbs { + bbsId: number; + bbsTypeCd: BbsType; + bbsTypeNm: string; + bbsNm: string; + bbsExpln: string; + rfrncUseYn: string; + atflUseYn: string; + atflMaxCnt: number; + atflMaxFileSz: number; + ansUseYn: string; + ansUseAuthrt: string; + cmntUseYn: string; + dgstfnEvlUseYn: string; + smsUseYn: string; + upndFixUseYn: string; + pstgPrdUseYn: string; + popupUseYn: string; + delYn: string; + useYn: string; + mdfcnDt: string; + mdfrNm: string; +} + +interface IMenu { + menuCd: number; + menuKornNm: string; + menuEngNm: string; + parentId: number | null; + sortSeq: number; + iconNm?: string; + children: IMenu[] | null; + levelNo: number; + urlPath: string; + menuLnkgTypeCd: string; + menuLnkgSn: number; + menuPath: string; + qrcd: string; + useYn: string; + otptYn: string; + newWndwYn: string; + requiredUrlPath: boolean; +} + +interface IAuthority { + mngAuthrtYn: string; + inqAuthrtYn: string; + regAuthrtYn: string; + mdfcnAuthrtYn: string; + delAuthrtYn: string; +} + +export type MenuState = { + bbsInfo: IBbs | null; + currentMenuInfo: IMenu | null; + pageMenuAuthority: IAuthority | null; +}; + +export type MenuActions = { + setBbsInfo: (bbs: IBbs) => void; + setCurrentMenuInfo: (menu: IMenu) => void; + setPageMenuAuthority: (authority: IAuthority) => void; +}; + +export type MenuStore = MenuState & MenuActions; + +export const defaultInitState: MenuState = { + currentMenuInfo: null, + bbsInfo: null, + pageMenuAuthority: null, +}; + +export const createMenuStore = (initState: MenuState = defaultInitState) => { + return createStore()((set) => ({ + ...initState, + setBbsInfo: (bbs: IBbs) => set({ bbsInfo: bbs }), + setCurrentMenuInfo: (menu: IMenu) => set({ currentMenuInfo: menu }), + setPageMenuAuthority: (authority: IAuthority) => + set({ pageMenuAuthority: authority }), + })); +}; diff --git a/apps/cm/src/shared/store/user-store.ts b/apps/cm/src/shared/store/user-store.ts new file mode 100644 index 000000000..65d897cf1 --- /dev/null +++ b/apps/cm/src/shared/store/user-store.ts @@ -0,0 +1,57 @@ +import { createStore } from "zustand/vanilla"; + +export interface IUserInfo { + regDt: string; + mdfcnDt: string; + rgtr: string; + mdfr: string; + adminRoleYn: string; + userUnqId: string; + userId: string; + userName: string; + email: string; + encryptedPassword: string; + refreshToken: string; + userStateCode: string; + lastLoginDate: string; + loginFailCount: number; + pswdHnt: string; + pswdAns: string; + mphn: string; + telno: string; + zip: string; + addr: string; + daddr: string; + laeSeCd: string; + ogdpSeCd: string; + aprvYn: string; + autzrId: string; + expryYmd: string; + lastPswdChgDt: string; + googleId: string; + kakaoId: string; + naverId: string; + isSocialUser: boolean; + hasPassword: boolean; +} + +export type UserState = { + userInfo: IUserInfo | null; +}; + +export type UserActions = { + setUserInfo: (userInfo: IUserInfo | null) => void; +}; + +export type UserStore = UserState & UserActions; + +export const defaultInitState: UserState = { + userInfo: null, +}; + +export const createUserStore = (initState: UserState = defaultInitState) => { + return createStore()((set) => ({ + ...initState, + setUserInfo: (userInfo: IUserInfo | null) => set(() => ({ userInfo })), + })); +}; diff --git a/apps/cm/src/shared/ui/alert-dialog.tsx b/apps/cm/src/shared/ui/alert-dialog.tsx new file mode 100644 index 000000000..6160d5301 --- /dev/null +++ b/apps/cm/src/shared/ui/alert-dialog.tsx @@ -0,0 +1,34 @@ +import { + Dialog, + DialogContent, + DialogFooter, + DialogClose, + Button, +} from "@common/components"; +import { useAlertStore } from "../lib/use-alert-store"; + +function AlertDialog() { + const { message, callback, setMessage } = useAlertStore((state) => state); + const handleOpenChange = () => { + setMessage(""); + callback?.(); + }; + return ( + + +
+

+ {message} +

+
+ + + + + +
+
+ ); +} + +export { AlertDialog }; diff --git a/apps/cm/src/shared/ui/confirm-dialog.tsx b/apps/cm/src/shared/ui/confirm-dialog.tsx new file mode 100644 index 000000000..6a4996bfb --- /dev/null +++ b/apps/cm/src/shared/ui/confirm-dialog.tsx @@ -0,0 +1,48 @@ +import { useConfirm } from "@frontend-opensource/use-react-hooks"; +import { + Dialog, + DialogContent, + DialogFooter, + DialogClose, + Button, + type ButtonProps, +} from "@common/components"; + +type ConfirmDialogProps = { + isOpen?: boolean; + confirmButtonProps?: ButtonProps & { label?: string }; + cancelButtonProps?: ButtonProps & { label?: string }; +}; + +function ConfirmDialog({ + isOpen, + confirmButtonProps, + cancelButtonProps, +}: ConfirmDialogProps) { + const { message, isOpen: isGlobalOpen, onConfirm, onCancel } = useConfirm(); + return ( + + +
+

+ {message} +

+
+ + + + + + + + +
+
+ ); +} + +export { ConfirmDialog }; diff --git a/apps/cm/src/shared/ui/form.tsx b/apps/cm/src/shared/ui/form.tsx new file mode 100644 index 000000000..bd579d263 --- /dev/null +++ b/apps/cm/src/shared/ui/form.tsx @@ -0,0 +1,175 @@ +import * as React from "react"; +import * as LabelPrimitive from "@radix-ui/react-label"; +import { Slot } from "@radix-ui/react-slot"; +import { + Controller, + FormProvider, + useFormContext, + type ControllerProps, + type FieldPath, + type FieldValues, +} from "react-hook-form"; +import { cn, Label } from "@common/components"; + +const Form = FormProvider; + +type FormFieldContextValue< + TFieldValues extends FieldValues = FieldValues, + TName extends FieldPath = FieldPath, +> = { + name: TName; +}; + +const FormFieldContext = React.createContext( + {} as FormFieldContextValue, +); + +const FormField = < + TFieldValues extends FieldValues = FieldValues, + TName extends FieldPath = FieldPath, +>({ + ...props +}: ControllerProps) => { + return ( + + + + ); +}; + +const useFormField = () => { + const fieldContext = React.useContext(FormFieldContext); + const itemContext = React.useContext(FormItemContext); + const { getFieldState, formState } = useFormContext(); + + const fieldState = getFieldState(fieldContext.name, formState); + + if (!fieldContext) { + throw new Error("useFormField should be used within "); + } + + const { id } = itemContext; + + return { + id, + name: fieldContext.name, + formItemId: `${id}-form-item`, + formDescriptionId: `${id}-form-item-description`, + formMessageId: `${id}-form-item-message`, + ...fieldState, + }; +}; + +type FormItemContextValue = { + id: string; +}; + +const FormItemContext = React.createContext( + {} as FormItemContextValue, +); + +const FormItem = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => { + const id = React.useId(); + + return ( + +
+ + ); +}); +FormItem.displayName = "FormItem"; + +const FormLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => { + const { error, formItemId } = useFormField(); + + return ( +