From fdf9d2edb864877433f2ed934ad57baef6591926 Mon Sep 17 00:00:00 2001 From: Berkay Date: Mon, 19 May 2025 23:12:23 +0300 Subject: [PATCH] client frontend added --- .../auth_service/events/auth/events.py | 147 +- .../validations/request/auth/validations.py | 23 +- .../endpoints/pages/router.py | 8 +- .../api_middlewares/token_provider.py | 14 +- .../api_modules/redis/redis_handlers.py | 20 +- docker-compose.yml | 31 +- .../client_frontend/package-lock.json | 90 +- web_services/client_frontend/package.json | 1 + .../src/apifetchers/api-fetcher.ts | 153 + .../client_frontend/src/apifetchers/basics.ts | 80 + .../src/apifetchers/custom/login/login.tsx | 218 + .../mutual/context/complete/fetch.tsx | 32 + .../mutual/context/dash/selection/fetch.tsx | 32 + .../mutual/context/dash/settings/fetch.tsx | 30 + .../mutual/context/dash/user/fetch.tsx | 30 + .../mutual/context/page/config/fetch.tsx | 31 + .../mutual/context/page/menu/fetch.tsx | 30 + .../mutual/context/page/online/fetch.tsx | 82 + .../src/apifetchers/mutual/cookies/token.tsx | 57 + .../client_frontend/src/apifetchers/utils.tsx | 33 + .../app/(AuthLayout)/auth/[...page]/page.tsx | 17 + .../panel/{en => }/[...page]/page.tsx | 0 .../auth/authentication/token/check/route.ts | 33 + .../app/api/context/dash/selection/route.ts | 22 + .../app/api/context/dash/settings/route.ts | 16 + .../src/app/api/context/dash/user/route.ts | 16 + .../src/app/api/context/page/config/route.ts | 16 + .../src/app/api/context/page/menu/route.ts | 22 + .../src/app/api/context/page/online/route.ts | 22 + .../src/app/api/login/email/route.ts | 3 +- .../client_frontend/src/app/api/menu/route.ts | 26 +- .../src/app/api/selection/employee/route.ts | 6 +- .../src/app/api/selection/occupant/route.ts | 7 +- .../src/app/api/utils/apiOperations.ts | 4 - .../custom/content/PageToBeChildrendMulti.tsx | 5 +- .../components/custom/content/component.tsx | 19 +- .../components/custom/footer/component.tsx | 17 +- .../components/custom/header/component.tsx | 30 +- .../src/components/custom/menu/component.tsx | 172 +- .../mutual/context/config/context.ts | 35 + .../components/mutual/context/menu/context.ts | 34 + .../mutual/context/online/context.ts | 29 + .../mutual/context/selection/context.ts | 37 + .../components/mutual/context/user/context.ts | 33 + .../mutual/languageSelection/component.tsx | 28 +- .../mutual/languageSelection/languageItem.tsx | 17 +- .../src/languages/custom/index.ts | 22 +- .../src/languages/mutual/menu/english.ts | 34 +- .../src/languages/mutual/menu/turkish.ts | 25 +- .../src/layouts/dashboard/layout.tsx | 25 +- .../client_frontend/src/pages/multi/index.ts | 28 +- .../src/types/mutual/context/validations.ts | 187 + .../src/types/mutual/fecther/validations.ts | 44 + .../src/validations/mutual/dashboard/props.ts | 16 +- .../src/webPages/auth/login/hook.ts | 4 +- .../webPages/auth/select/LoginEmployee.tsx | 69 +- .../webPages/auth/select/LoginOccupant.tsx | 61 +- .../src/webPages/auth/select/hook.ts | 8 +- .../src/webPages/auth/select/page.tsx | 33 +- .../src/webPages/auth/select/serverPage.tsx | 15 +- .../src/webPages/auth/select/types.ts | 8 +- .../src/apicalls/api-fetcher.ts | 6 - .../apicalls/custom/application/apicall.tsx | 17 +- .../src/apicalls/custom/events/endpoints.tsx | 11 +- .../src/apicalls/mutual/cookies/token.tsx | 2 - y-trash/client_frontend copy/.gitignore | 41 + y-trash/client_frontend copy/Dockerfile | 21 + y-trash/client_frontend copy/README.md | 36 + y-trash/client_frontend copy/components.json | 21 + .../client_frontend copy/eslint.config.mjs | 16 + y-trash/client_frontend copy/next.config.ts | 7 + .../client_frontend copy/package-lock.json | 8377 +++++++++++++++++ y-trash/client_frontend copy/package.json | 67 + .../client_frontend copy/postcss.config.mjs | 5 + .../src/apicalls/api-fetcher.ts | 0 .../src/apicalls/basics.ts | 0 .../src/apicalls/custom/login/login.tsx | 0 .../src/apicalls/mutual/cookies/token.tsx | 0 .../(AuthLayout)/auth/en/[...page]/page.tsx | 0 .../(AuthLayout)/auth/tr/[...page]/page.tsx | 0 .../panel/en/[...page]/page.tsx | 15 + .../app/(DashboardLayout)/panel/en/page.tsx | 0 .../panel/tr/[...page]/page.tsx | 0 .../src/app/api/cookies/selection/route.ts | 0 .../src/app/api/login/email/route.ts | 39 + .../src/app/api/menu/route.ts | 31 + .../src/app/api/pages/route.ts | 15 + .../src/app/api/selection/employee/route.ts | 41 + .../src/app/api/selection/occupant/route.ts | 41 + .../src/app/api/utils/apiOperations.ts | 169 + .../src/app/api/utils/index.ts | 4 + .../src/app/api/utils/requestHandlers.ts | 70 + .../src/app/api/utils/responseHandlers.ts | 91 + .../src/app/api/utils/types.ts | 119 + .../client_frontend copy/src/app/favicon.ico | Bin 0 -> 25931 bytes .../client_frontend copy/src/app/globals.css | 122 + .../client_frontend copy/src/app/layout.tsx | 34 + y-trash/client_frontend copy/src/app/page.tsx | 32 + .../custom/content/PageToBeChildrendMulti.tsx | 11 + .../content/PageToBeChildrendSingle.tsx | 13 + .../components/custom/content/component.tsx | 17 + .../components/custom/footer/component.tsx | 14 + .../components/custom/header/component.tsx | 20 + .../src/components/custom/menu/component.tsx | 141 + .../custom/menu/firstLayerComponent.tsx | 41 + .../custom/menu/secondLayerComponent.tsx | 41 + .../custom/menu/thirdLayerComponent.tsx | 50 + .../src/components/custom/menu/type.ts | 5 + .../mutual/languageSelection/component.tsx | 39 + .../mutual/languageSelection/languageItem.tsx | 38 + .../components/mutual/loader/component.tsx | 10 + .../mutual/navigators/component.tsx | 7 + .../components/mutual/shadcnui/accordion.tsx | 66 + .../mutual/shadcnui/alert-dialog.tsx | 157 + .../src/components/mutual/shadcnui/alert.tsx | 66 + .../mutual/shadcnui/aspect-ratio.tsx | 11 + .../src/components/mutual/shadcnui/avatar.tsx | 53 + .../src/components/mutual/shadcnui/badge.tsx | 46 + .../src/components/mutual/shadcnui/button.tsx | 59 + .../components/mutual/shadcnui/calendar.tsx | 75 + .../src/components/mutual/shadcnui/card.tsx | 92 + .../components/mutual/shadcnui/checkbox.tsx | 32 + .../mutual/shadcnui/collapsible.tsx | 33 + .../components/mutual/shadcnui/command.tsx | 177 + .../mutual/shadcnui/context-menu.tsx | 252 + .../src/components/mutual/shadcnui/dialog.tsx | 135 + .../mutual/shadcnui/dropdown-menu.tsx | 257 + .../src/components/mutual/shadcnui/form.tsx | 167 + .../components/mutual/shadcnui/hover-card.tsx | 44 + .../src/components/mutual/shadcnui/input.tsx | 23 + .../src/components/mutual/shadcnui/label.tsx | 24 + .../components/mutual/shadcnui/menubar.tsx | 276 + .../mutual/shadcnui/navigation-menu.tsx | 168 + .../components/mutual/shadcnui/popover.tsx | 48 + .../components/mutual/shadcnui/progress.tsx | 31 + .../mutual/shadcnui/radio-group.tsx | 45 + .../mutual/shadcnui/scroll-area.tsx | 58 + .../src/components/mutual/shadcnui/select.tsx | 185 + .../components/mutual/shadcnui/separator.tsx | 28 + .../src/components/mutual/shadcnui/sheet.tsx | 139 + .../components/mutual/shadcnui/skeleton.tsx | 13 + .../src/components/mutual/shadcnui/slider.tsx | 63 + .../src/components/mutual/shadcnui/sonner.tsx | 25 + .../src/components/mutual/shadcnui/switch.tsx | 31 + .../src/components/mutual/shadcnui/table.tsx | 116 + .../src/components/mutual/shadcnui/tabs.tsx | 66 + .../components/mutual/shadcnui/textarea.tsx | 18 + .../src/components/mutual/shadcnui/toggle.tsx | 47 + .../components/mutual/shadcnui/tooltip.tsx | 61 + .../tableView/FullCardTableComp/component.tsx | 88 + .../tableView/FullTableComp/component.tsx | 104 + .../mutual/tableView/mutual/CreateForm.tsx | 40 + .../tableView/mutual/LowerPagination.tsx | 24 + .../tableView/mutual/PaginationDetails.tsx | 34 + .../tableView/mutual/PaginationShow.tsx | 15 + .../mutual/tableView/mutual/Search.tsx | 24 + .../tableView/mutual/TableCardPlain.tsx | 47 + .../mutual/tableView/mutual/TablePlain.tsx | 60 + .../mutual/tableView/mutual/UpdateForm.tsx | 46 + .../tableView/mutual/UpperPagination.tsx | 21 + .../mutual/tableView/mutual/ViewForm.tsx | 30 + .../src/components/mutual/ui/accordion.tsx | 66 + .../src/components/mutual/ui/alert-dialog.tsx | 157 + .../src/components/mutual/ui/alert.tsx | 66 + .../src/components/mutual/ui/aspect-ratio.tsx | 11 + .../src/components/mutual/ui/avatar.tsx | 53 + .../src/components/mutual/ui/badge.tsx | 46 + .../src/components/mutual/ui/button.tsx | 59 + .../src/components/mutual/ui/calendar.tsx | 75 + .../src/components/mutual/ui/card.tsx | 92 + .../src/components/mutual/ui/checkbox.tsx | 32 + .../src/components/mutual/ui/collapsible.tsx | 33 + .../src/components/mutual/ui/command.tsx | 177 + .../src/components/mutual/ui/context-menu.tsx | 252 + .../src/components/mutual/ui/dialog.tsx | 135 + .../components/mutual/ui/dropdown-menu.tsx | 257 + .../src/components/mutual/ui/form.tsx | 167 + .../src/components/mutual/ui/hover-card.tsx | 44 + .../src/components/mutual/ui/input.tsx | 21 + .../src/components/mutual/ui/label.tsx | 24 + .../src/components/mutual/ui/menubar.tsx | 276 + .../components/mutual/ui/navigation-menu.tsx | 168 + .../src/components/mutual/ui/popover.tsx | 48 + .../src/components/mutual/ui/progress.tsx | 31 + .../src/components/mutual/ui/radio-group.tsx | 45 + .../src/components/mutual/ui/scroll-area.tsx | 58 + .../src/components/mutual/ui/select.tsx | 185 + .../src/components/mutual/ui/separator.tsx | 28 + .../src/components/mutual/ui/sheet.tsx | 139 + .../src/components/mutual/ui/skeleton.tsx | 13 + .../src/components/mutual/ui/slider.tsx | 63 + .../src/components/mutual/ui/sonner.tsx | 25 + .../src/components/mutual/ui/switch.tsx | 31 + .../src/components/mutual/ui/table.tsx | 116 + .../src/components/mutual/ui/tabs.tsx | 66 + .../src/components/mutual/ui/textarea.tsx | 18 + .../src/components/mutual/ui/toggle.tsx | 47 + .../src/components/mutual/ui/tooltip.tsx | 61 + .../client_frontend copy/src/config/config.ts | 4 + y-trash/client_frontend copy/src/hooks/a.txt | 0 .../src/hooks/application/hook.tsx | 29 + .../client_frontend copy/src/languages/a.txt | 0 .../src/languages/custom/building/english.ts | 24 + .../src/languages/custom/building/turkish.ts | 23 + .../src/languages/custom/index.ts | 24 + .../src/languages/custom/management/a.txt | 0 .../custom/management/account/a copy.txt | 0 .../account/tenantSomething/english.ts | 39 + .../account/tenantSomething/index.ts | 9 + .../account/tenantSomething/turkish.ts | 36 + .../account/tenantSomethingSecond/english.ts | 40 + .../account/tenantSomethingSecond/index.ts | 9 + .../account/tenantSomethingSecond/turkish.ts | 37 + .../languages/custom/management/english.ts | 23 + .../languages/custom/management/turkish.ts | 22 + .../src/languages/mutual/content/english.ts | 8 + .../src/languages/mutual/content/index.ts | 9 + .../src/languages/mutual/content/turkish.ts | 8 + .../src/languages/mutual/dashboard/english.ts | 5 + .../src/languages/mutual/dashboard/index.ts | 7 + .../src/languages/mutual/dashboard/turkish.ts | 5 + .../src/languages/mutual/footer/english.ts | 6 + .../src/languages/mutual/footer/turkish.ts | 6 + .../src/languages/mutual/header/english.ts | 5 + .../src/languages/mutual/header/turkish.ts | 5 + .../mutual/languageSelection/english.ts | 7 + .../mutual/languageSelection/index.ts | 7 + .../mutual/languageSelection/turkish.ts | 7 + .../src/languages/mutual/menu/english.ts | 27 + .../src/languages/mutual/menu/index.ts | 7 + .../src/languages/mutual/menu/turkish.ts | 26 + .../languages/mutual/pagination/english.ts | 5 + .../src/languages/mutual/pagination/index.ts | 7 + .../languages/mutual/pagination/turkish.ts | 5 + .../src/layouts/auth/layout.tsx | 23 + .../src/layouts/dashboard/layout.tsx | 36 + .../src/pages/multi/index.ts | 21 + .../account/tenantSomething/page.tsx | 94 + .../account/tenantSomethingSecond/page.tsx | 46 + .../src/pages/mutual/noContent/page.tsx | 5 + .../src/pages/resolver/index.ts | 0 .../src/pages/resolver/mock.tsx | 43 + .../src/pages/resolver/resolver.tsx | 30 + .../src/pages/single/index.ts | 12 + .../account/tenantSomething/page.tsx | 27 + .../account/tenantSomethingSecond/page.tsx | 27 + .../client_frontend copy/src/public/file.svg | 1 + .../client_frontend copy/src/public/globe.svg | 1 + .../client_frontend copy/src/public/next.svg | 1 + .../src/public/vercel.svg | 1 + .../src/public/window.svg | 1 + .../src/schemas/custom/a.txt | 0 .../src/schemas/custom/building/a.txt | 0 .../src/validations/mutual/a.txt | 0 .../mutual/api/requests/validations.ts | 14 + .../mutual/api/responses/validations.ts | 31 + .../src/validations/mutual/auth/props.ts | 13 + .../src/validations/mutual/dashboard/props.ts | 53 + .../validations/mutual/fecther/validations.ts | 44 + .../src/validations/mutual/forms/type.ts | 20 + .../mutual/language/validations.ts | 3 + .../src/validations/mutual/menu/menu.tsx | 19 + .../src/validations/mutual/pages/props.ts | 7 + .../src/validations/mutual/pagination/type.ts | 29 + .../mutual/resolvers/validations.ts | 5 + .../src/validations/mutual/table/type.ts | 34 + .../src/webPages/auth/login/hook.ts | 44 + .../src/webPages/auth/login/language.ts | 22 + .../src/webPages/auth/login/page.tsx | 62 + .../src/webPages/auth/login/schemas.ts | 15 + .../src/webPages/auth/login/serverPage.tsx | 8 + .../src/webPages/auth/login/types.ts | 13 + .../webPages/auth/select/LoginEmployee.tsx | 99 + .../webPages/auth/select/LoginOccupant.tsx | 109 + .../src/webPages/auth/select/hook.ts | 81 + .../src/webPages/auth/select/language.ts | 44 + .../src/webPages/auth/select/page.tsx | 43 + .../src/webPages/auth/select/serverPage.tsx | 20 + .../src/webPages/auth/select/types.ts | 60 + .../src/webPages/getPage.tsx | 15 + y-trash/management_frontend copy/.gitignore | 41 + y-trash/management_frontend copy/Dockerfile | 21 + y-trash/management_frontend copy/README.md | 36 + .../management_frontend copy/components.json | 21 + .../eslint.config.mjs | 16 + .../management_frontend copy/next.config.ts | 7 + .../package-lock.json | 8377 +++++++++++++++++ y-trash/management_frontend copy/package.json | 67 + .../postcss.config.mjs | 5 + .../src/apicalls/api-fetcher.ts | 177 + .../src/apicalls/basics.ts | 79 + .../apicalls/custom/application/apicall.tsx | 257 + .../src/apicalls/custom/events/endpoints.tsx | 153 + .../src/apicalls/custom/login/login.tsx | 182 + .../apicalls/custom/services/endpoints.tsx | 157 + .../src/apicalls/mutual/cookies/token.tsx | 148 + .../src/apicalls/schemas/list.tsx | 19 + .../appenders/applications/create/route.ts | 22 + .../appenders/applications/delete/route.ts | 22 + .../api/appenders/applications/list/route.ts | 4 + .../app/api/appenders/events/create/route.ts | 22 + .../app/api/appenders/events/delete/route.ts | 22 + .../app/api/appenders/events/list/route.ts | 4 + .../src/app/api/applications/bind/route.ts | 4 + .../src/app/api/applications/create/route.ts | 4 + .../src/app/api/applications/list/route.ts | 4 + .../src/app/api/applications/pages/route.ts | 4 + .../src/app/api/applications/unbind/route.ts | 4 + .../src/app/api/applications/update/route.ts | 4 + .../src/app/api/cookies/selection/route.ts | 20 + .../src/app/api/events/list/route.ts | 4 + .../src/app/api/login/email/route.ts | 39 + .../src/app/api/menu/route.ts | 20 + .../src/app/api/pages/route.ts | 15 + .../src/app/api/selection/employee/route.ts | 41 + .../src/app/api/selection/occupant/route.ts | 41 + .../src/app/api/services/list/route.ts | 4 + .../src/app/api/tst/[...id]/route.ts | 138 + .../src/app/api/tst/route.ts | 139 + .../src/app/api/utils/apiOperations.ts | 169 + .../src/app/api/utils/index.ts | 4 + .../src/app/api/utils/requestHandlers.ts | 70 + .../src/app/api/utils/responseHandlers.ts | 91 + .../src/app/api/utils/types.ts | 119 + .../src/app/auth/en/[...page]/page.tsx | 15 + .../src/app/auth/tr/[...page]/page.tsx | 15 + .../src/app/favicon.ico | Bin 0 -> 25931 bytes .../src/app/globals.css | 122 + .../src/app/layout.tsx | 34 + .../management_frontend copy/src/app/page.tsx | 32 + .../src/app/panel/en/[...page]/page.tsx | 15 + .../src/app/panel/en/page.tsx | 15 + .../src/app/panel/tr/[...page]/page.tsx | 15 + .../custom/content/PageToBeChildrendMulti.tsx | 11 + .../content/PageToBeChildrendSingle.tsx | 11 + .../components/custom/content/component.tsx | 19 + .../components/custom/footer/component.tsx | 14 + .../components/custom/header/component.tsx | 20 + .../src/components/custom/menu/component.tsx | 172 + .../custom/menu/firstLayerComponent.tsx | 41 + .../custom/menu/secondLayerComponent.tsx | 41 + .../custom/menu/single/component.tsx | 33 + .../custom/menu/thirdLayerComponent.tsx | 50 + .../src/components/custom/menu/type.ts | 5 + .../mutual/languageSelection/component.tsx | 39 + .../mutual/languageSelection/languageItem.tsx | 38 + .../components/mutual/loader/component.tsx | 10 + .../mutual/navigators/component.tsx | 7 + .../components/mutual/shadcnui/accordion.tsx | 66 + .../mutual/shadcnui/alert-dialog.tsx | 157 + .../src/components/mutual/shadcnui/alert.tsx | 66 + .../mutual/shadcnui/aspect-ratio.tsx | 11 + .../src/components/mutual/shadcnui/avatar.tsx | 53 + .../src/components/mutual/shadcnui/badge.tsx | 46 + .../src/components/mutual/shadcnui/button.tsx | 59 + .../components/mutual/shadcnui/calendar.tsx | 75 + .../src/components/mutual/shadcnui/card.tsx | 92 + .../components/mutual/shadcnui/checkbox.tsx | 32 + .../mutual/shadcnui/collapsible.tsx | 33 + .../components/mutual/shadcnui/command.tsx | 177 + .../mutual/shadcnui/context-menu.tsx | 252 + .../src/components/mutual/shadcnui/dialog.tsx | 135 + .../mutual/shadcnui/dropdown-menu.tsx | 257 + .../src/components/mutual/shadcnui/form.tsx | 167 + .../components/mutual/shadcnui/hover-card.tsx | 44 + .../src/components/mutual/shadcnui/input.tsx | 23 + .../src/components/mutual/shadcnui/label.tsx | 24 + .../components/mutual/shadcnui/menubar.tsx | 276 + .../mutual/shadcnui/navigation-menu.tsx | 168 + .../components/mutual/shadcnui/popover.tsx | 48 + .../components/mutual/shadcnui/progress.tsx | 31 + .../mutual/shadcnui/radio-group.tsx | 45 + .../mutual/shadcnui/scroll-area.tsx | 58 + .../src/components/mutual/shadcnui/select.tsx | 185 + .../components/mutual/shadcnui/separator.tsx | 28 + .../src/components/mutual/shadcnui/sheet.tsx | 139 + .../components/mutual/shadcnui/skeleton.tsx | 13 + .../src/components/mutual/shadcnui/slider.tsx | 63 + .../src/components/mutual/shadcnui/sonner.tsx | 25 + .../src/components/mutual/shadcnui/switch.tsx | 31 + .../src/components/mutual/shadcnui/table.tsx | 116 + .../src/components/mutual/shadcnui/tabs.tsx | 66 + .../components/mutual/shadcnui/textarea.tsx | 18 + .../src/components/mutual/shadcnui/toggle.tsx | 47 + .../components/mutual/shadcnui/tooltip.tsx | 61 + .../tableView/FullCardTableComp/component.tsx | 88 + .../tableView/FullTableComp/component.tsx | 107 + .../mutual/tableView/mutual/CreateForm.tsx | 40 + .../tableView/mutual/LowerPagination.tsx | 24 + .../tableView/mutual/PaginationDetails.tsx | 34 + .../tableView/mutual/PaginationShow.tsx | 15 + .../mutual/tableView/mutual/Search.tsx | 24 + .../tableView/mutual/TableCardPlain.tsx | 47 + .../mutual/tableView/mutual/TablePlain.tsx | 46 + .../mutual/tableView/mutual/UpdateForm.tsx | 46 + .../tableView/mutual/UpperPagination.tsx | 21 + .../mutual/tableView/mutual/ViewForm.tsx | 30 + .../src/components/mutual/ui/accordion.tsx | 66 + .../src/components/mutual/ui/alert-dialog.tsx | 157 + .../src/components/mutual/ui/alert.tsx | 66 + .../src/components/mutual/ui/aspect-ratio.tsx | 11 + .../src/components/mutual/ui/avatar.tsx | 53 + .../src/components/mutual/ui/badge.tsx | 46 + .../src/components/mutual/ui/button.tsx | 59 + .../src/components/mutual/ui/calendar.tsx | 75 + .../src/components/mutual/ui/card.tsx | 92 + .../src/components/mutual/ui/checkbox.tsx | 32 + .../src/components/mutual/ui/collapsible.tsx | 33 + .../src/components/mutual/ui/command.tsx | 177 + .../src/components/mutual/ui/context-menu.tsx | 252 + .../src/components/mutual/ui/dialog.tsx | 135 + .../components/mutual/ui/dropdown-menu.tsx | 257 + .../src/components/mutual/ui/form.tsx | 167 + .../src/components/mutual/ui/hover-card.tsx | 44 + .../src/components/mutual/ui/input.tsx | 21 + .../src/components/mutual/ui/label.tsx | 24 + .../src/components/mutual/ui/menubar.tsx | 276 + .../components/mutual/ui/navigation-menu.tsx | 168 + .../src/components/mutual/ui/popover.tsx | 48 + .../src/components/mutual/ui/progress.tsx | 31 + .../src/components/mutual/ui/radio-group.tsx | 45 + .../src/components/mutual/ui/scroll-area.tsx | 58 + .../src/components/mutual/ui/select.tsx | 185 + .../src/components/mutual/ui/separator.tsx | 28 + .../src/components/mutual/ui/sheet.tsx | 139 + .../src/components/mutual/ui/skeleton.tsx | 13 + .../src/components/mutual/ui/slider.tsx | 63 + .../src/components/mutual/ui/sonner.tsx | 25 + .../src/components/mutual/ui/switch.tsx | 31 + .../src/components/mutual/ui/table.tsx | 116 + .../src/components/mutual/ui/tabs.tsx | 66 + .../src/components/mutual/ui/textarea.tsx | 18 + .../src/components/mutual/ui/toggle.tsx | 47 + .../src/components/mutual/ui/tooltip.tsx | 61 + .../src/config/config.ts | 4 + .../management_frontend copy/src/hooks/a.txt | 0 .../src/hooks/application/hook.tsx | 29 + .../src/languages/a.txt | 0 .../languages/custom/application/english.ts | 52 + .../src/languages/custom/application/index.ts | 9 + .../languages/custom/application/turkish.ts | 51 + .../src/languages/custom/index.ts | 11 + .../src/languages/mutual/content/english.ts | 8 + .../src/languages/mutual/content/index.ts | 9 + .../src/languages/mutual/content/turkish.ts | 8 + .../src/languages/mutual/dashboard/english.ts | 5 + .../src/languages/mutual/dashboard/index.ts | 7 + .../src/languages/mutual/dashboard/turkish.ts | 5 + .../src/languages/mutual/footer/english.ts | 6 + .../src/languages/mutual/footer/turkish.ts | 6 + .../src/languages/mutual/header/english.ts | 5 + .../src/languages/mutual/header/turkish.ts | 5 + .../mutual/languageSelection/english.ts | 7 + .../mutual/languageSelection/index.ts | 7 + .../mutual/languageSelection/turkish.ts | 7 + .../src/languages/mutual/menu/english.ts | 8 + .../src/languages/mutual/menu/index.ts | 7 + .../src/languages/mutual/menu/turkish.ts | 3 + .../languages/mutual/pagination/english.ts | 5 + .../src/languages/mutual/pagination/index.ts | 7 + .../languages/mutual/pagination/turkish.ts | 5 + .../src/layouts/auth/layout.tsx | 23 + .../src/layouts/dashboard/layout.tsx | 50 + .../src/pages/multi/index.ts | 8 + .../src/pages/mutual/noContent/page.tsx | 5 + .../src/pages/resolver/index.ts | 0 .../src/pages/resolver/mock.tsx | 43 + .../src/pages/resolver/resolver.tsx | 32 + .../src/pages/single/application/page.tsx | 73 + .../src/pages/single/dashboard/page.tsx | 74 + .../src/pages/single/index.ts | 12 + .../src/pages/single/services/page.tsx | 74 + .../src/public/file.svg | 1 + .../src/public/globe.svg | 1 + .../src/public/next.svg | 1 + .../src/public/vercel.svg | 1 + .../src/public/window.svg | 1 + .../src/schemas/custom/a.txt | 0 .../src/schemas/custom/application/schemas.ts | 136 + .../src/validations/mutual/a.txt | 0 .../mutual/api/requests/validations.ts | 14 + .../mutual/api/responses/validations.ts | 31 + .../src/validations/mutual/auth/props.ts | 13 + .../src/validations/mutual/dashboard/props.ts | 71 + .../validations/mutual/fecther/validations.ts | 44 + .../src/validations/mutual/forms/type.ts | 20 + .../mutual/language/validations.ts | 3 + .../src/validations/mutual/menu/menu.tsx | 19 + .../src/validations/mutual/pages/props.ts | 7 + .../src/validations/mutual/pagination/type.ts | 29 + .../mutual/resolvers/validations.ts | 5 + .../src/validations/mutual/table/type.ts | 34 + .../src/webPages/auth/login/hook.ts | 44 + .../src/webPages/auth/login/language.ts | 22 + .../src/webPages/auth/login/page.tsx | 62 + .../src/webPages/auth/login/schemas.ts | 15 + .../src/webPages/auth/login/serverPage.tsx | 8 + .../src/webPages/auth/login/types.ts | 13 + .../webPages/auth/select/LoginEmployee.tsx | 99 + .../webPages/auth/select/LoginOccupant.tsx | 109 + .../src/webPages/auth/select/hook.ts | 72 + .../src/webPages/auth/select/language.ts | 44 + .../src/webPages/auth/select/page.tsx | 43 + .../src/webPages/auth/select/serverPage.tsx | 20 + .../src/webPages/auth/select/types.ts | 60 + .../src/webPages/getPage.tsx | 15 + .../management_frontend copy/tsconfig.json | 27 + 507 files changed, 40655 insertions(+), 510 deletions(-) create mode 100644 web_services/client_frontend/src/apifetchers/api-fetcher.ts create mode 100644 web_services/client_frontend/src/apifetchers/basics.ts create mode 100644 web_services/client_frontend/src/apifetchers/custom/login/login.tsx create mode 100644 web_services/client_frontend/src/apifetchers/mutual/context/complete/fetch.tsx create mode 100644 web_services/client_frontend/src/apifetchers/mutual/context/dash/selection/fetch.tsx create mode 100644 web_services/client_frontend/src/apifetchers/mutual/context/dash/settings/fetch.tsx create mode 100644 web_services/client_frontend/src/apifetchers/mutual/context/dash/user/fetch.tsx create mode 100644 web_services/client_frontend/src/apifetchers/mutual/context/page/config/fetch.tsx create mode 100644 web_services/client_frontend/src/apifetchers/mutual/context/page/menu/fetch.tsx create mode 100644 web_services/client_frontend/src/apifetchers/mutual/context/page/online/fetch.tsx create mode 100644 web_services/client_frontend/src/apifetchers/mutual/cookies/token.tsx create mode 100644 web_services/client_frontend/src/apifetchers/utils.tsx create mode 100644 web_services/client_frontend/src/app/(AuthLayout)/auth/[...page]/page.tsx rename web_services/client_frontend/src/app/(DashboardLayout)/panel/{en => }/[...page]/page.tsx (100%) create mode 100644 web_services/client_frontend/src/app/api/auth/authentication/token/check/route.ts create mode 100644 web_services/client_frontend/src/app/api/context/dash/selection/route.ts create mode 100644 web_services/client_frontend/src/app/api/context/dash/settings/route.ts create mode 100644 web_services/client_frontend/src/app/api/context/dash/user/route.ts create mode 100644 web_services/client_frontend/src/app/api/context/page/config/route.ts create mode 100644 web_services/client_frontend/src/app/api/context/page/menu/route.ts create mode 100644 web_services/client_frontend/src/app/api/context/page/online/route.ts create mode 100644 web_services/client_frontend/src/components/mutual/context/config/context.ts create mode 100644 web_services/client_frontend/src/components/mutual/context/menu/context.ts create mode 100644 web_services/client_frontend/src/components/mutual/context/online/context.ts create mode 100644 web_services/client_frontend/src/components/mutual/context/selection/context.ts create mode 100644 web_services/client_frontend/src/components/mutual/context/user/context.ts create mode 100644 web_services/client_frontend/src/types/mutual/context/validations.ts create mode 100644 web_services/client_frontend/src/types/mutual/fecther/validations.ts create mode 100644 y-trash/client_frontend copy/.gitignore create mode 100644 y-trash/client_frontend copy/Dockerfile create mode 100644 y-trash/client_frontend copy/README.md create mode 100644 y-trash/client_frontend copy/components.json create mode 100644 y-trash/client_frontend copy/eslint.config.mjs create mode 100644 y-trash/client_frontend copy/next.config.ts create mode 100644 y-trash/client_frontend copy/package-lock.json create mode 100644 y-trash/client_frontend copy/package.json create mode 100644 y-trash/client_frontend copy/postcss.config.mjs rename {web_services/client_frontend => y-trash/client_frontend copy}/src/apicalls/api-fetcher.ts (100%) rename {web_services/client_frontend => y-trash/client_frontend copy}/src/apicalls/basics.ts (100%) rename {web_services/client_frontend => y-trash/client_frontend copy}/src/apicalls/custom/login/login.tsx (100%) rename {web_services/client_frontend => y-trash/client_frontend copy}/src/apicalls/mutual/cookies/token.tsx (100%) rename {web_services/client_frontend => y-trash/client_frontend copy}/src/app/(AuthLayout)/auth/en/[...page]/page.tsx (100%) rename {web_services/client_frontend => y-trash/client_frontend copy}/src/app/(AuthLayout)/auth/tr/[...page]/page.tsx (100%) create mode 100644 y-trash/client_frontend copy/src/app/(DashboardLayout)/panel/en/[...page]/page.tsx rename {web_services/client_frontend => y-trash/client_frontend copy}/src/app/(DashboardLayout)/panel/en/page.tsx (100%) rename {web_services/client_frontend => y-trash/client_frontend copy}/src/app/(DashboardLayout)/panel/tr/[...page]/page.tsx (100%) rename {web_services/client_frontend => y-trash/client_frontend copy}/src/app/api/cookies/selection/route.ts (100%) create mode 100644 y-trash/client_frontend copy/src/app/api/login/email/route.ts create mode 100644 y-trash/client_frontend copy/src/app/api/menu/route.ts create mode 100644 y-trash/client_frontend copy/src/app/api/pages/route.ts create mode 100644 y-trash/client_frontend copy/src/app/api/selection/employee/route.ts create mode 100644 y-trash/client_frontend copy/src/app/api/selection/occupant/route.ts create mode 100644 y-trash/client_frontend copy/src/app/api/utils/apiOperations.ts create mode 100644 y-trash/client_frontend copy/src/app/api/utils/index.ts create mode 100644 y-trash/client_frontend copy/src/app/api/utils/requestHandlers.ts create mode 100644 y-trash/client_frontend copy/src/app/api/utils/responseHandlers.ts create mode 100644 y-trash/client_frontend copy/src/app/api/utils/types.ts create mode 100644 y-trash/client_frontend copy/src/app/favicon.ico create mode 100644 y-trash/client_frontend copy/src/app/globals.css create mode 100644 y-trash/client_frontend copy/src/app/layout.tsx create mode 100644 y-trash/client_frontend copy/src/app/page.tsx create mode 100644 y-trash/client_frontend copy/src/components/custom/content/PageToBeChildrendMulti.tsx create mode 100644 y-trash/client_frontend copy/src/components/custom/content/PageToBeChildrendSingle.tsx create mode 100644 y-trash/client_frontend copy/src/components/custom/content/component.tsx create mode 100644 y-trash/client_frontend copy/src/components/custom/footer/component.tsx create mode 100644 y-trash/client_frontend copy/src/components/custom/header/component.tsx create mode 100644 y-trash/client_frontend copy/src/components/custom/menu/component.tsx create mode 100644 y-trash/client_frontend copy/src/components/custom/menu/firstLayerComponent.tsx create mode 100644 y-trash/client_frontend copy/src/components/custom/menu/secondLayerComponent.tsx create mode 100644 y-trash/client_frontend copy/src/components/custom/menu/thirdLayerComponent.tsx create mode 100644 y-trash/client_frontend copy/src/components/custom/menu/type.ts create mode 100644 y-trash/client_frontend copy/src/components/mutual/languageSelection/component.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/languageSelection/languageItem.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/loader/component.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/navigators/component.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/shadcnui/accordion.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/shadcnui/alert-dialog.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/shadcnui/alert.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/shadcnui/aspect-ratio.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/shadcnui/avatar.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/shadcnui/badge.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/shadcnui/button.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/shadcnui/calendar.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/shadcnui/card.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/shadcnui/checkbox.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/shadcnui/collapsible.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/shadcnui/command.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/shadcnui/context-menu.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/shadcnui/dialog.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/shadcnui/dropdown-menu.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/shadcnui/form.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/shadcnui/hover-card.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/shadcnui/input.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/shadcnui/label.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/shadcnui/menubar.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/shadcnui/navigation-menu.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/shadcnui/popover.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/shadcnui/progress.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/shadcnui/radio-group.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/shadcnui/scroll-area.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/shadcnui/select.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/shadcnui/separator.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/shadcnui/sheet.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/shadcnui/skeleton.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/shadcnui/slider.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/shadcnui/sonner.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/shadcnui/switch.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/shadcnui/table.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/shadcnui/tabs.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/shadcnui/textarea.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/shadcnui/toggle.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/shadcnui/tooltip.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/tableView/FullCardTableComp/component.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/tableView/FullTableComp/component.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/tableView/mutual/CreateForm.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/tableView/mutual/LowerPagination.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/tableView/mutual/PaginationDetails.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/tableView/mutual/PaginationShow.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/tableView/mutual/Search.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/tableView/mutual/TableCardPlain.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/tableView/mutual/TablePlain.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/tableView/mutual/UpdateForm.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/tableView/mutual/UpperPagination.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/tableView/mutual/ViewForm.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/ui/accordion.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/ui/alert-dialog.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/ui/alert.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/ui/aspect-ratio.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/ui/avatar.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/ui/badge.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/ui/button.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/ui/calendar.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/ui/card.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/ui/checkbox.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/ui/collapsible.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/ui/command.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/ui/context-menu.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/ui/dialog.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/ui/dropdown-menu.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/ui/form.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/ui/hover-card.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/ui/input.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/ui/label.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/ui/menubar.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/ui/navigation-menu.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/ui/popover.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/ui/progress.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/ui/radio-group.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/ui/scroll-area.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/ui/select.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/ui/separator.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/ui/sheet.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/ui/skeleton.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/ui/slider.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/ui/sonner.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/ui/switch.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/ui/table.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/ui/tabs.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/ui/textarea.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/ui/toggle.tsx create mode 100644 y-trash/client_frontend copy/src/components/mutual/ui/tooltip.tsx create mode 100644 y-trash/client_frontend copy/src/config/config.ts create mode 100644 y-trash/client_frontend copy/src/hooks/a.txt create mode 100644 y-trash/client_frontend copy/src/hooks/application/hook.tsx create mode 100644 y-trash/client_frontend copy/src/languages/a.txt create mode 100644 y-trash/client_frontend copy/src/languages/custom/building/english.ts create mode 100644 y-trash/client_frontend copy/src/languages/custom/building/turkish.ts create mode 100644 y-trash/client_frontend copy/src/languages/custom/index.ts create mode 100644 y-trash/client_frontend copy/src/languages/custom/management/a.txt create mode 100644 y-trash/client_frontend copy/src/languages/custom/management/account/a copy.txt create mode 100644 y-trash/client_frontend copy/src/languages/custom/management/account/tenantSomething/english.ts create mode 100644 y-trash/client_frontend copy/src/languages/custom/management/account/tenantSomething/index.ts create mode 100644 y-trash/client_frontend copy/src/languages/custom/management/account/tenantSomething/turkish.ts create mode 100644 y-trash/client_frontend copy/src/languages/custom/management/account/tenantSomethingSecond/english.ts create mode 100644 y-trash/client_frontend copy/src/languages/custom/management/account/tenantSomethingSecond/index.ts create mode 100644 y-trash/client_frontend copy/src/languages/custom/management/account/tenantSomethingSecond/turkish.ts create mode 100644 y-trash/client_frontend copy/src/languages/custom/management/english.ts create mode 100644 y-trash/client_frontend copy/src/languages/custom/management/turkish.ts create mode 100644 y-trash/client_frontend copy/src/languages/mutual/content/english.ts create mode 100644 y-trash/client_frontend copy/src/languages/mutual/content/index.ts create mode 100644 y-trash/client_frontend copy/src/languages/mutual/content/turkish.ts create mode 100644 y-trash/client_frontend copy/src/languages/mutual/dashboard/english.ts create mode 100644 y-trash/client_frontend copy/src/languages/mutual/dashboard/index.ts create mode 100644 y-trash/client_frontend copy/src/languages/mutual/dashboard/turkish.ts create mode 100644 y-trash/client_frontend copy/src/languages/mutual/footer/english.ts create mode 100644 y-trash/client_frontend copy/src/languages/mutual/footer/turkish.ts create mode 100644 y-trash/client_frontend copy/src/languages/mutual/header/english.ts create mode 100644 y-trash/client_frontend copy/src/languages/mutual/header/turkish.ts create mode 100644 y-trash/client_frontend copy/src/languages/mutual/languageSelection/english.ts create mode 100644 y-trash/client_frontend copy/src/languages/mutual/languageSelection/index.ts create mode 100644 y-trash/client_frontend copy/src/languages/mutual/languageSelection/turkish.ts create mode 100644 y-trash/client_frontend copy/src/languages/mutual/menu/english.ts create mode 100644 y-trash/client_frontend copy/src/languages/mutual/menu/index.ts create mode 100644 y-trash/client_frontend copy/src/languages/mutual/menu/turkish.ts create mode 100644 y-trash/client_frontend copy/src/languages/mutual/pagination/english.ts create mode 100644 y-trash/client_frontend copy/src/languages/mutual/pagination/index.ts create mode 100644 y-trash/client_frontend copy/src/languages/mutual/pagination/turkish.ts create mode 100644 y-trash/client_frontend copy/src/layouts/auth/layout.tsx create mode 100644 y-trash/client_frontend copy/src/layouts/dashboard/layout.tsx create mode 100644 y-trash/client_frontend copy/src/pages/multi/index.ts create mode 100644 y-trash/client_frontend copy/src/pages/multi/management/account/tenantSomething/page.tsx create mode 100644 y-trash/client_frontend copy/src/pages/multi/management/account/tenantSomethingSecond/page.tsx create mode 100644 y-trash/client_frontend copy/src/pages/mutual/noContent/page.tsx create mode 100644 y-trash/client_frontend copy/src/pages/resolver/index.ts create mode 100644 y-trash/client_frontend copy/src/pages/resolver/mock.tsx create mode 100644 y-trash/client_frontend copy/src/pages/resolver/resolver.tsx create mode 100644 y-trash/client_frontend copy/src/pages/single/index.ts create mode 100644 y-trash/client_frontend copy/src/pages/single/management/account/tenantSomething/page.tsx create mode 100644 y-trash/client_frontend copy/src/pages/single/management/account/tenantSomethingSecond/page.tsx create mode 100644 y-trash/client_frontend copy/src/public/file.svg create mode 100644 y-trash/client_frontend copy/src/public/globe.svg create mode 100644 y-trash/client_frontend copy/src/public/next.svg create mode 100644 y-trash/client_frontend copy/src/public/vercel.svg create mode 100644 y-trash/client_frontend copy/src/public/window.svg create mode 100644 y-trash/client_frontend copy/src/schemas/custom/a.txt create mode 100644 y-trash/client_frontend copy/src/schemas/custom/building/a.txt create mode 100644 y-trash/client_frontend copy/src/validations/mutual/a.txt create mode 100644 y-trash/client_frontend copy/src/validations/mutual/api/requests/validations.ts create mode 100644 y-trash/client_frontend copy/src/validations/mutual/api/responses/validations.ts create mode 100644 y-trash/client_frontend copy/src/validations/mutual/auth/props.ts create mode 100644 y-trash/client_frontend copy/src/validations/mutual/dashboard/props.ts create mode 100644 y-trash/client_frontend copy/src/validations/mutual/fecther/validations.ts create mode 100644 y-trash/client_frontend copy/src/validations/mutual/forms/type.ts create mode 100644 y-trash/client_frontend copy/src/validations/mutual/language/validations.ts create mode 100644 y-trash/client_frontend copy/src/validations/mutual/menu/menu.tsx create mode 100644 y-trash/client_frontend copy/src/validations/mutual/pages/props.ts create mode 100644 y-trash/client_frontend copy/src/validations/mutual/pagination/type.ts create mode 100644 y-trash/client_frontend copy/src/validations/mutual/resolvers/validations.ts create mode 100644 y-trash/client_frontend copy/src/validations/mutual/table/type.ts create mode 100644 y-trash/client_frontend copy/src/webPages/auth/login/hook.ts create mode 100644 y-trash/client_frontend copy/src/webPages/auth/login/language.ts create mode 100644 y-trash/client_frontend copy/src/webPages/auth/login/page.tsx create mode 100644 y-trash/client_frontend copy/src/webPages/auth/login/schemas.ts create mode 100644 y-trash/client_frontend copy/src/webPages/auth/login/serverPage.tsx create mode 100644 y-trash/client_frontend copy/src/webPages/auth/login/types.ts create mode 100644 y-trash/client_frontend copy/src/webPages/auth/select/LoginEmployee.tsx create mode 100644 y-trash/client_frontend copy/src/webPages/auth/select/LoginOccupant.tsx create mode 100644 y-trash/client_frontend copy/src/webPages/auth/select/hook.ts create mode 100644 y-trash/client_frontend copy/src/webPages/auth/select/language.ts create mode 100644 y-trash/client_frontend copy/src/webPages/auth/select/page.tsx create mode 100644 y-trash/client_frontend copy/src/webPages/auth/select/serverPage.tsx create mode 100644 y-trash/client_frontend copy/src/webPages/auth/select/types.ts create mode 100644 y-trash/client_frontend copy/src/webPages/getPage.tsx create mode 100644 y-trash/management_frontend copy/.gitignore create mode 100644 y-trash/management_frontend copy/Dockerfile create mode 100644 y-trash/management_frontend copy/README.md create mode 100644 y-trash/management_frontend copy/components.json create mode 100644 y-trash/management_frontend copy/eslint.config.mjs create mode 100644 y-trash/management_frontend copy/next.config.ts create mode 100644 y-trash/management_frontend copy/package-lock.json create mode 100644 y-trash/management_frontend copy/package.json create mode 100644 y-trash/management_frontend copy/postcss.config.mjs create mode 100644 y-trash/management_frontend copy/src/apicalls/api-fetcher.ts create mode 100644 y-trash/management_frontend copy/src/apicalls/basics.ts create mode 100644 y-trash/management_frontend copy/src/apicalls/custom/application/apicall.tsx create mode 100644 y-trash/management_frontend copy/src/apicalls/custom/events/endpoints.tsx create mode 100644 y-trash/management_frontend copy/src/apicalls/custom/login/login.tsx create mode 100644 y-trash/management_frontend copy/src/apicalls/custom/services/endpoints.tsx create mode 100644 y-trash/management_frontend copy/src/apicalls/mutual/cookies/token.tsx create mode 100644 y-trash/management_frontend copy/src/apicalls/schemas/list.tsx create mode 100644 y-trash/management_frontend copy/src/app/api/appenders/applications/create/route.ts create mode 100644 y-trash/management_frontend copy/src/app/api/appenders/applications/delete/route.ts create mode 100644 y-trash/management_frontend copy/src/app/api/appenders/applications/list/route.ts create mode 100644 y-trash/management_frontend copy/src/app/api/appenders/events/create/route.ts create mode 100644 y-trash/management_frontend copy/src/app/api/appenders/events/delete/route.ts create mode 100644 y-trash/management_frontend copy/src/app/api/appenders/events/list/route.ts create mode 100644 y-trash/management_frontend copy/src/app/api/applications/bind/route.ts create mode 100644 y-trash/management_frontend copy/src/app/api/applications/create/route.ts create mode 100644 y-trash/management_frontend copy/src/app/api/applications/list/route.ts create mode 100644 y-trash/management_frontend copy/src/app/api/applications/pages/route.ts create mode 100644 y-trash/management_frontend copy/src/app/api/applications/unbind/route.ts create mode 100644 y-trash/management_frontend copy/src/app/api/applications/update/route.ts create mode 100644 y-trash/management_frontend copy/src/app/api/cookies/selection/route.ts create mode 100644 y-trash/management_frontend copy/src/app/api/events/list/route.ts create mode 100644 y-trash/management_frontend copy/src/app/api/login/email/route.ts create mode 100644 y-trash/management_frontend copy/src/app/api/menu/route.ts create mode 100644 y-trash/management_frontend copy/src/app/api/pages/route.ts create mode 100644 y-trash/management_frontend copy/src/app/api/selection/employee/route.ts create mode 100644 y-trash/management_frontend copy/src/app/api/selection/occupant/route.ts create mode 100644 y-trash/management_frontend copy/src/app/api/services/list/route.ts create mode 100644 y-trash/management_frontend copy/src/app/api/tst/[...id]/route.ts create mode 100644 y-trash/management_frontend copy/src/app/api/tst/route.ts create mode 100644 y-trash/management_frontend copy/src/app/api/utils/apiOperations.ts create mode 100644 y-trash/management_frontend copy/src/app/api/utils/index.ts create mode 100644 y-trash/management_frontend copy/src/app/api/utils/requestHandlers.ts create mode 100644 y-trash/management_frontend copy/src/app/api/utils/responseHandlers.ts create mode 100644 y-trash/management_frontend copy/src/app/api/utils/types.ts create mode 100644 y-trash/management_frontend copy/src/app/auth/en/[...page]/page.tsx create mode 100644 y-trash/management_frontend copy/src/app/auth/tr/[...page]/page.tsx create mode 100644 y-trash/management_frontend copy/src/app/favicon.ico create mode 100644 y-trash/management_frontend copy/src/app/globals.css create mode 100644 y-trash/management_frontend copy/src/app/layout.tsx create mode 100644 y-trash/management_frontend copy/src/app/page.tsx create mode 100644 y-trash/management_frontend copy/src/app/panel/en/[...page]/page.tsx create mode 100644 y-trash/management_frontend copy/src/app/panel/en/page.tsx create mode 100644 y-trash/management_frontend copy/src/app/panel/tr/[...page]/page.tsx create mode 100644 y-trash/management_frontend copy/src/components/custom/content/PageToBeChildrendMulti.tsx create mode 100644 y-trash/management_frontend copy/src/components/custom/content/PageToBeChildrendSingle.tsx create mode 100644 y-trash/management_frontend copy/src/components/custom/content/component.tsx create mode 100644 y-trash/management_frontend copy/src/components/custom/footer/component.tsx create mode 100644 y-trash/management_frontend copy/src/components/custom/header/component.tsx create mode 100644 y-trash/management_frontend copy/src/components/custom/menu/component.tsx create mode 100644 y-trash/management_frontend copy/src/components/custom/menu/firstLayerComponent.tsx create mode 100644 y-trash/management_frontend copy/src/components/custom/menu/secondLayerComponent.tsx create mode 100644 y-trash/management_frontend copy/src/components/custom/menu/single/component.tsx create mode 100644 y-trash/management_frontend copy/src/components/custom/menu/thirdLayerComponent.tsx create mode 100644 y-trash/management_frontend copy/src/components/custom/menu/type.ts create mode 100644 y-trash/management_frontend copy/src/components/mutual/languageSelection/component.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/languageSelection/languageItem.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/loader/component.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/navigators/component.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/shadcnui/accordion.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/shadcnui/alert-dialog.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/shadcnui/alert.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/shadcnui/aspect-ratio.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/shadcnui/avatar.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/shadcnui/badge.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/shadcnui/button.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/shadcnui/calendar.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/shadcnui/card.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/shadcnui/checkbox.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/shadcnui/collapsible.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/shadcnui/command.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/shadcnui/context-menu.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/shadcnui/dialog.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/shadcnui/dropdown-menu.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/shadcnui/form.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/shadcnui/hover-card.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/shadcnui/input.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/shadcnui/label.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/shadcnui/menubar.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/shadcnui/navigation-menu.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/shadcnui/popover.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/shadcnui/progress.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/shadcnui/radio-group.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/shadcnui/scroll-area.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/shadcnui/select.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/shadcnui/separator.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/shadcnui/sheet.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/shadcnui/skeleton.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/shadcnui/slider.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/shadcnui/sonner.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/shadcnui/switch.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/shadcnui/table.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/shadcnui/tabs.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/shadcnui/textarea.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/shadcnui/toggle.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/shadcnui/tooltip.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/tableView/FullCardTableComp/component.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/tableView/FullTableComp/component.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/tableView/mutual/CreateForm.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/tableView/mutual/LowerPagination.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/tableView/mutual/PaginationDetails.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/tableView/mutual/PaginationShow.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/tableView/mutual/Search.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/tableView/mutual/TableCardPlain.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/tableView/mutual/TablePlain.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/tableView/mutual/UpdateForm.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/tableView/mutual/UpperPagination.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/tableView/mutual/ViewForm.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/ui/accordion.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/ui/alert-dialog.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/ui/alert.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/ui/aspect-ratio.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/ui/avatar.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/ui/badge.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/ui/button.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/ui/calendar.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/ui/card.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/ui/checkbox.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/ui/collapsible.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/ui/command.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/ui/context-menu.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/ui/dialog.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/ui/dropdown-menu.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/ui/form.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/ui/hover-card.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/ui/input.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/ui/label.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/ui/menubar.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/ui/navigation-menu.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/ui/popover.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/ui/progress.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/ui/radio-group.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/ui/scroll-area.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/ui/select.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/ui/separator.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/ui/sheet.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/ui/skeleton.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/ui/slider.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/ui/sonner.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/ui/switch.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/ui/table.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/ui/tabs.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/ui/textarea.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/ui/toggle.tsx create mode 100644 y-trash/management_frontend copy/src/components/mutual/ui/tooltip.tsx create mode 100644 y-trash/management_frontend copy/src/config/config.ts create mode 100644 y-trash/management_frontend copy/src/hooks/a.txt create mode 100644 y-trash/management_frontend copy/src/hooks/application/hook.tsx create mode 100644 y-trash/management_frontend copy/src/languages/a.txt create mode 100644 y-trash/management_frontend copy/src/languages/custom/application/english.ts create mode 100644 y-trash/management_frontend copy/src/languages/custom/application/index.ts create mode 100644 y-trash/management_frontend copy/src/languages/custom/application/turkish.ts create mode 100644 y-trash/management_frontend copy/src/languages/custom/index.ts create mode 100644 y-trash/management_frontend copy/src/languages/mutual/content/english.ts create mode 100644 y-trash/management_frontend copy/src/languages/mutual/content/index.ts create mode 100644 y-trash/management_frontend copy/src/languages/mutual/content/turkish.ts create mode 100644 y-trash/management_frontend copy/src/languages/mutual/dashboard/english.ts create mode 100644 y-trash/management_frontend copy/src/languages/mutual/dashboard/index.ts create mode 100644 y-trash/management_frontend copy/src/languages/mutual/dashboard/turkish.ts create mode 100644 y-trash/management_frontend copy/src/languages/mutual/footer/english.ts create mode 100644 y-trash/management_frontend copy/src/languages/mutual/footer/turkish.ts create mode 100644 y-trash/management_frontend copy/src/languages/mutual/header/english.ts create mode 100644 y-trash/management_frontend copy/src/languages/mutual/header/turkish.ts create mode 100644 y-trash/management_frontend copy/src/languages/mutual/languageSelection/english.ts create mode 100644 y-trash/management_frontend copy/src/languages/mutual/languageSelection/index.ts create mode 100644 y-trash/management_frontend copy/src/languages/mutual/languageSelection/turkish.ts create mode 100644 y-trash/management_frontend copy/src/languages/mutual/menu/english.ts create mode 100644 y-trash/management_frontend copy/src/languages/mutual/menu/index.ts create mode 100644 y-trash/management_frontend copy/src/languages/mutual/menu/turkish.ts create mode 100644 y-trash/management_frontend copy/src/languages/mutual/pagination/english.ts create mode 100644 y-trash/management_frontend copy/src/languages/mutual/pagination/index.ts create mode 100644 y-trash/management_frontend copy/src/languages/mutual/pagination/turkish.ts create mode 100644 y-trash/management_frontend copy/src/layouts/auth/layout.tsx create mode 100644 y-trash/management_frontend copy/src/layouts/dashboard/layout.tsx create mode 100644 y-trash/management_frontend copy/src/pages/multi/index.ts create mode 100644 y-trash/management_frontend copy/src/pages/mutual/noContent/page.tsx create mode 100644 y-trash/management_frontend copy/src/pages/resolver/index.ts create mode 100644 y-trash/management_frontend copy/src/pages/resolver/mock.tsx create mode 100644 y-trash/management_frontend copy/src/pages/resolver/resolver.tsx create mode 100644 y-trash/management_frontend copy/src/pages/single/application/page.tsx create mode 100644 y-trash/management_frontend copy/src/pages/single/dashboard/page.tsx create mode 100644 y-trash/management_frontend copy/src/pages/single/index.ts create mode 100644 y-trash/management_frontend copy/src/pages/single/services/page.tsx create mode 100644 y-trash/management_frontend copy/src/public/file.svg create mode 100644 y-trash/management_frontend copy/src/public/globe.svg create mode 100644 y-trash/management_frontend copy/src/public/next.svg create mode 100644 y-trash/management_frontend copy/src/public/vercel.svg create mode 100644 y-trash/management_frontend copy/src/public/window.svg create mode 100644 y-trash/management_frontend copy/src/schemas/custom/a.txt create mode 100644 y-trash/management_frontend copy/src/schemas/custom/application/schemas.ts create mode 100644 y-trash/management_frontend copy/src/validations/mutual/a.txt create mode 100644 y-trash/management_frontend copy/src/validations/mutual/api/requests/validations.ts create mode 100644 y-trash/management_frontend copy/src/validations/mutual/api/responses/validations.ts create mode 100644 y-trash/management_frontend copy/src/validations/mutual/auth/props.ts create mode 100644 y-trash/management_frontend copy/src/validations/mutual/dashboard/props.ts create mode 100644 y-trash/management_frontend copy/src/validations/mutual/fecther/validations.ts create mode 100644 y-trash/management_frontend copy/src/validations/mutual/forms/type.ts create mode 100644 y-trash/management_frontend copy/src/validations/mutual/language/validations.ts create mode 100644 y-trash/management_frontend copy/src/validations/mutual/menu/menu.tsx create mode 100644 y-trash/management_frontend copy/src/validations/mutual/pages/props.ts create mode 100644 y-trash/management_frontend copy/src/validations/mutual/pagination/type.ts create mode 100644 y-trash/management_frontend copy/src/validations/mutual/resolvers/validations.ts create mode 100644 y-trash/management_frontend copy/src/validations/mutual/table/type.ts create mode 100644 y-trash/management_frontend copy/src/webPages/auth/login/hook.ts create mode 100644 y-trash/management_frontend copy/src/webPages/auth/login/language.ts create mode 100644 y-trash/management_frontend copy/src/webPages/auth/login/page.tsx create mode 100644 y-trash/management_frontend copy/src/webPages/auth/login/schemas.ts create mode 100644 y-trash/management_frontend copy/src/webPages/auth/login/serverPage.tsx create mode 100644 y-trash/management_frontend copy/src/webPages/auth/login/types.ts create mode 100644 y-trash/management_frontend copy/src/webPages/auth/select/LoginEmployee.tsx create mode 100644 y-trash/management_frontend copy/src/webPages/auth/select/LoginOccupant.tsx create mode 100644 y-trash/management_frontend copy/src/webPages/auth/select/hook.ts create mode 100644 y-trash/management_frontend copy/src/webPages/auth/select/language.ts create mode 100644 y-trash/management_frontend copy/src/webPages/auth/select/page.tsx create mode 100644 y-trash/management_frontend copy/src/webPages/auth/select/serverPage.tsx create mode 100644 y-trash/management_frontend copy/src/webPages/auth/select/types.ts create mode 100644 y-trash/management_frontend copy/src/webPages/getPage.tsx create mode 100644 y-trash/management_frontend copy/tsconfig.json diff --git a/api_services/api_builds/auth_service/events/auth/events.py b/api_services/api_builds/auth_service/events/auth/events.py index 78fd611..e7e5ea8 100644 --- a/api_services/api_builds/auth_service/events/auth/events.py +++ b/api_services/api_builds/auth_service/events/auth/events.py @@ -68,8 +68,14 @@ class LoginHandler: return str(email).split("@")[1] == api_config.ACCESS_EMAIL_EXT @classmethod + # headers: CommonHeaders def do_employee_login(cls, headers: CommonHeaders, data: Any, db_session): """Handle employee login.""" + + language = headers.request.headers.get("language", "tr") + domain = headers.request.headers.get("domain", None) + timezone = headers.request.headers.get("tz", None) or "GMT+3" + user_handler, other_domains_list, main_domain = UserHandlers(), [], "" found_user = user_handler.check_user_exists(access_key=data.access_key, db_session=db_session) with mongo_handler.collection(f"{str(found_user.related_company)}*Domain") as collection: @@ -78,7 +84,7 @@ class LoginHandler: raise ValueError("EYS_00087") other_domains_list = result.get("other_domains_list", []) main_domain = result.get("main_domain", None) - if headers.domain not in other_domains_list or not main_domain: + if domain not in other_domains_list or not main_domain: raise ValueError("EYS_00088") if not user_handler.check_password_valid(domain=main_domain, id_=str(found_user.uu_id), password=data.password, password_hashed=found_user.hash_password): @@ -115,24 +121,24 @@ class LoginHandler: duty_uu_id_list.append(str(list_employee["Duty.uu_id"])) duty_id_list.append(int(list_employee["Duty.id"])) companies_list.append({ - "uu_id": str(list_employee["Companies.uu_id"]), "public_name": list_employee["Companies.public_name"], - "company_type": list_employee["Companies.company_type"], "company_address": list_employee["Addresses.letter_address"], - "duty": list_employee["Duty.duty_name"] + "uu_id": str(list_employee["Employees.uu_id"]), + "public_name": list_employee["Companies.public_name"], + "company_type": list_employee["Companies.company_type"], + "company_address": list_employee["Addresses.letter_address"], + "duty": list_employee["Duty.duty_name"], + "company_uuid": str(list_employee["Companies.uu_id"]) }) model_value = EmployeeTokenObject( - user_type=UserType.employee.value, - user_uu_id=str(found_user.uu_id), - user_id=found_user.id, - person_id=found_user.person_id, - person_uu_id=str(list_employees[0]["People.uu_id"]), - request=dict(headers.request.headers), - domain_list=other_domains_list, - companies_uu_id_list=companies_uu_id_list, - companies_id_list=companies_id_list, - duty_uu_id_list=duty_uu_id_list, - duty_id_list=duty_id_list, + user_type=UserType.employee.value, user_uu_id=str(found_user.uu_id), user_id=found_user.id, person_id=found_user.person_id, + person_uu_id=str(list_employees[0]["People.uu_id"]), request=dict(headers.request.headers), domain_list=other_domains_list, + companies_uu_id_list=companies_uu_id_list, companies_id_list=companies_id_list, duty_uu_id_list=duty_uu_id_list, duty_id_list=duty_id_list, ).model_dump() - set_to_redis_dict = dict(user=found_user, token=model_value, header_info=dict(language=headers.language, domain=headers.domain, timezone=headers.timezone)) + employee_uuid = str(companies_list[0]["uu_id"]) + print('employee_uuid', employee_uuid) + set_to_redis_dict = dict( + user=found_user, token=model_value, add_uuid=employee_uuid, + header_info=dict(language=headers.language, domain=headers.domain, timezone=headers.timezone), + ) user_dict = found_user.get_dict() person_dict = found_user.person.get_dict() if access_token := RedisHandlers().set_object_to_redis(**set_to_redis_dict): @@ -140,21 +146,12 @@ class LoginHandler: "access_token": access_token, "user_type": UserType.employee.name, "user": { - "uuid": user_dict["uu_id"], - "avatar": user_dict["avatar"], - "email": user_dict["email"], - "phone_number": user_dict["phone_number"], - "user_tag": user_dict["user_tag"], + "uuid": user_dict["uu_id"], "avatar": user_dict["avatar"], "email": user_dict["email"], "phone_number": user_dict["phone_number"], "user_tag": user_dict["user_tag"], "password_expiry_begins": str(arrow.get(user_dict["password_expiry_begins"]).shift(days=int(user_dict["password_expires_day"]))), "person": { - "uuid": person_dict["uu_id"], - "firstname": person_dict["firstname"], - "surname": person_dict["surname"], - "middle_name": person_dict["middle_name"], - "sex_code": person_dict["sex_code"], - "person_tag": person_dict["person_tag"], - "country_code": person_dict["country_code"], - "birth_date": person_dict["birth_date"], + "uuid": person_dict["uu_id"], "firstname": person_dict["firstname"], "surname": person_dict["surname"], + "middle_name": person_dict["middle_name"], "sex_code": person_dict["sex_code"], "person_tag": person_dict["person_tag"], + "country_code": person_dict["country_code"], "birth_date": person_dict["birth_date"], }, }, "selection_list": companies_list, @@ -162,22 +159,21 @@ class LoginHandler: raise ValueError("Something went wrong") @classmethod - def do_occupant_login(cls, request: Any, data: Any, db_session, extra_dict: Optional[Dict[str, Any]] = None): + # headers=headers, data=data, db_session=db_session + def do_occupant_login(cls, headers: CommonHeaders, data: Any, db_session): """ Handle occupant login. """ - language = extra_dict.get("language", "tr") - domain = extra_dict.get("domain", None) - timezone = extra_dict.get("tz", None) or "GMT+3" + language = headers.request.headers.get("language", "tr") + domain = headers.request.headers.get("domain", None) + timezone = headers.request.headers.get("tz", None) or "GMT+3" + BuildParts.set_session(db_session) + OccupantTypes.set_session(db_session) user_handler = UserHandlers() - found_user = user_handler.check_user_exists( - access_key=data.access_key, db_session=db_session - ) + found_user = user_handler.check_user_exists(access_key=data.access_key, db_session=db_session) other_domains_list, main_domain = [], "" - with mongo_handler.collection( - f"{str(found_user.related_company)}*Domain" - ) as collection: + with mongo_handler.collection(f"{str(found_user.related_company)}*Domain") as collection: result = collection.find_one({"user_uu_id": str(found_user.uu_id)}) if not result: raise ValueError("EYS_00087") @@ -186,78 +182,43 @@ class LoginHandler: if domain not in other_domains_list or not main_domain: raise ValueError("EYS_00088") - if not user_handler.check_password_valid( - domain=main_domain, - id_=str(found_user.uu_id), - password=data.password, - password_hashed=found_user.hash_password, - ): + if not user_handler.check_password_valid(domain=main_domain, id_=str(found_user.uu_id), password=data.password, password_hashed=found_user.hash_password): raise ValueError("EYS_0005") occupants_selection_dict: Dict[str, Any] = {} - living_spaces: list[BuildLivingSpace] = BuildLivingSpace.filter_all( - BuildLivingSpace.person_id == found_user.person_id, db=db_session - ).data + living_spaces: list[BuildLivingSpace] = BuildLivingSpace.query.filter(BuildLivingSpace.person_id == found_user.person_id).all() if not living_spaces: raise ValueError("EYS_0006") for living_space in living_spaces: - build_part = BuildParts.filter_one( - BuildParts.id == living_space.build_parts_id, - db=db_session, - ).data + build_part = BuildParts.query.filter(BuildParts.id == living_space.build_parts_id).first() if not build_part: raise ValueError("EYS_0007") build = build_part.buildings - occupant_type = OccupantTypes.filter_by_one( - id=living_space.occupant_type_id, - db=db_session, - system=True, - ).data + occupant_type = OccupantTypes.query.filter(OccupantTypes.id == living_space.occupant_type_id).first() occupant_data = { - "build_living_space_uu_id": str(living_space.uu_id), - "part_uu_id": str(build_part.uu_id), - "part_name": build_part.part_name(db=db_session), - "part_level": build_part.part_level, - "occupant_uu_id": str(occupant_type.uu_id), - "description": occupant_type.occupant_description, - "code": occupant_type.occupant_code, + "build_living_space_uu_id": str(living_space.uu_id), "part_uu_id": str(build_part.uu_id), "part_name": build_part.part_name(), "part_level": build_part.part_level, + "occupant_uu_id": str(occupant_type.uu_id), "description": occupant_type.occupant_description, "code": occupant_type.occupant_code, } build_key = str(build.uu_id) if build_key not in occupants_selection_dict: - occupants_selection_dict[build_key] = { - "build_uu_id": build_key, - "build_name": build.build_name, - "build_no": build.build_no, - "occupants": [occupant_data], - } + occupants_selection_dict[build_key] = {"build_uu_id": build_key, "build_name": build.build_name, "build_no": build.build_no, "occupants": [occupant_data],} else: occupants_selection_dict[build_key]["occupants"].append(occupant_data) person = found_user.person model_value = OccupantTokenObject( - user_type=UserType.occupant.value, - user_uu_id=str(found_user.uu_id), - user_id=found_user.id, - person_id=person.id, - person_uu_id=str(person.uu_id), - domain_list=other_domains_list, - request=dict(request.headers), - available_occupants=occupants_selection_dict, + user_type=UserType.occupant.value, user_uu_id=str(found_user.uu_id), user_id=found_user.id, person_id=person.id, + person_uu_id=str(person.uu_id), domain_list=other_domains_list, request=dict(request.headers), available_occupants=occupants_selection_dict, ).model_dump() redis_handler = RedisHandlers() if access_token := redis_handler.set_object_to_redis( - user=found_user, - token=model_value, - header_info=dict(language=language, domain=domain, timezone=timezone), + user=found_user, token=model_value, add_uuid=living_space.uu_id, + header_info=dict(language=language, domain=domain, timezone=timezone) ): - return { - "access_token": access_token, - "user_type": UserType.occupant.name, - "selection_list": occupants_selection_dict, - } + return {"access_token": access_token, "user_type": UserType.occupant.name, "selection_list": occupants_selection_dict} raise ValueError("Something went wrong") @classmethod @@ -302,7 +263,7 @@ class LoginHandler: @classmethod def handle_employee_selection(cls, access_token: str, data: Any, token_dict: TokenDictType): with Users.new_session() as db_session: - if data.company_uu_id not in token_dict.companies_uu_id_list: + if data.uuid not in token_dict.companies_uu_id_list: ValueError("EYS_0011") list_of_returns = ( Employees.id, Employees.uu_id, People.id, People.uu_id, Users.id, Users.uu_id, Companies.id, Companies.uu_id, @@ -319,7 +280,7 @@ class LoginHandler: ).join(Companies, Companies.id == Departments.company_id ).join(Users, Users.person_id == People.id ).outerjoin(Addresses, Addresses.id == Companies.official_address_id - ).filter(Companies.uu_id == data.company_uu_id, Users.id == token_dict.user_id) + ).filter(Employees.uu_id == data.uuid, Users.id == token_dict.user_id) selected_company_first = selected_company_query.first() if not selected_company_first: @@ -357,8 +318,10 @@ class LoginHandler: reachable_app_codes=reachable_app_codes, ) redis_handler = RedisHandlers() - redis_result = redis_handler.update_token_at_redis(token=access_token, add_payload=company_token) - return {"selected_uu_id": data.company_uu_id} + redis_result = redis_handler.update_token_at_redis( + token=access_token, add_payload=company_token, add_uuid=str(result_with_keys_dict['Employees.uu_id']) + ) + return {"selected_uu_id": data.uuid} @classmethod def handle_occupant_selection(cls, access_token: str, data: Any, token_dict: TokenDictType): @@ -408,7 +371,9 @@ class LoginHandler: reachable_app_codes=reachable_app_codes, ) redis_handler = RedisHandlers() - redis_handler.update_token_at_redis(token=access_token, add_payload=occupant_token) + redis_handler.update_token_at_redis( + token=access_token, add_payload=occupant_token, add_uuid=occupant_token.living_space_uu_id + ) return {"selected_uu_id": occupant_token.living_space_uu_id} @classmethod # Requires auth context diff --git a/api_services/api_builds/auth_service/validations/request/auth/validations.py b/api_services/api_builds/auth_service/validations/request/auth/validations.py index 214bd7b..0d22e37 100644 --- a/api_services/api_builds/auth_service/validations/request/auth/validations.py +++ b/api_services/api_builds/auth_service/validations/request/auth/validations.py @@ -15,16 +15,7 @@ class RequestVerifyOTP(BaseModel): class RequestSelectEmployee(BaseModel): - - company_uu_id: str - - @property - def is_employee(self): - return True - - @property - def is_occupant(self): - return False + uuid: str class RequestResetPassword(BaseModel): @@ -34,17 +25,7 @@ class RequestResetPassword(BaseModel): class RequestSelectLiving(BaseModel): - - build_living_space_uu_id: str - - @property - def is_employee(self): - return False - - @property - def is_occupant(self): - return True - + uuid: str class RequestCreatePassword(BaseModel): password_token: str diff --git a/api_services/api_builds/restriction_service/endpoints/pages/router.py b/api_services/api_builds/restriction_service/endpoints/pages/router.py index cc84f55..64963a1 100644 --- a/api_services/api_builds/restriction_service/endpoints/pages/router.py +++ b/api_services/api_builds/restriction_service/endpoints/pages/router.py @@ -22,7 +22,9 @@ def authentication_page_valid(data: RequestApplication, headers: CommonHeaders = Verify if page is valid returns application that can user reach page: { url = /building/create} | result: { "application": "4c11f5ef-0bbd-41ac-925e-f79d9aac2b0e" } """ - return PageHandlers.retrieve_valid_page_via_token(access_token=headers.token, page_url=data.page) + list_of = PageHandlers.retrieve_valid_page_via_token(access_token=headers.token, page_url=data.page) + print('list_of', list_of) + return {"completed": True, "application": list_of} application_retrieve_all_sites = "ApplicationRetrieveAllSites" @@ -36,4 +38,6 @@ def authentication_get_all_sites_list(headers: CommonHeaders = Depends(CommonHea """ Verify if page is valid returns application that can user reach result: { "sites": ['/dashboard', '/building/create'] } """ - return PageHandlers.retrieve_valid_sites_via_token(access_token=headers.token) + list_of_application_url = PageHandlers.retrieve_valid_sites_via_token(access_token=headers.token) + print('list_of_application_url', list(list_of_application_url)) + return {"completed": True, "sites": list(list_of_application_url)} diff --git a/api_services/api_middlewares/token_provider.py b/api_services/api_middlewares/token_provider.py index 4293164..eecb821 100644 --- a/api_services/api_middlewares/token_provider.py +++ b/api_services/api_middlewares/token_provider.py @@ -27,16 +27,14 @@ class TokenProvider: raise ValueError("Invalid user type") @classmethod - def get_dict_from_redis(cls, token: Optional[str] = None, user_uu_id: Optional[str] = None) -> Union[TokenDictType, List[TokenDictType]]: + def get_dict_from_redis( + cls, token: Optional[str] = None, user_uu_id: Optional[str] = None + ) -> Union[TokenDictType, List[TokenDictType]]: """ Retrieve token object from Redis using token and user_uu_id """ token_to_use, user_uu_id_to_use = token or "*", user_uu_id or "*" - list_of_token_dict, auth_key_list = [], [ - cls.AUTH_TOKEN, - token_to_use, - user_uu_id_to_use, - ] + list_of_token_dict, auth_key_list = [], [cls.AUTH_TOKEN, token_to_use, user_uu_id_to_use, "*"] if token: result = RedisActions.get_json(list_keys=auth_key_list, limit=1) if first_record := result.first: @@ -47,9 +45,7 @@ class TokenProvider: for all_record in all_records: list_of_token_dict.append(cls.convert_redis_object_to_token(all_record)) return list_of_token_dict - raise ValueError( - "Token not found in Redis. Please check the token or user_uu_id." - ) + raise ValueError("Token not found in Redis. Please check the token or user_uu_id.") @classmethod def retrieve_application_codes(cls, page_url: str, token: TokenDictType): diff --git a/api_services/api_modules/redis/redis_handlers.py b/api_services/api_modules/redis/redis_handlers.py index be0e1d6..7409224 100644 --- a/api_services/api_modules/redis/redis_handlers.py +++ b/api_services/api_modules/redis/redis_handlers.py @@ -33,7 +33,7 @@ class RedisHandlers: @classmethod def get_object_from_redis(cls, access_token: str) -> TokenDictType: - redis_response = RedisActions.get_json(list_keys=[cls.AUTH_TOKEN, access_token, "*"]) + redis_response = RedisActions.get_json(list_keys=[cls.AUTH_TOKEN, access_token, "*", "*"]) if not redis_response.status: raise ValueError("EYS_0001") if redis_object := redis_response.first: @@ -41,22 +41,30 @@ class RedisHandlers: raise ValueError("EYS_0002") @classmethod - def set_object_to_redis(cls, user: Users, token, header_info): - result_delete = RedisActions.delete(list_keys=[cls.AUTH_TOKEN, "*", str(user.uu_id)]) + def set_object_to_redis(cls, user: Users, token, header_info, add_uuid: str): + result_delete = RedisActions.delete(list_keys=[cls.AUTH_TOKEN, "*", str(user.uu_id), add_uuid]) generated_access_token = PasswordModule.generate_access_token() keys = [cls.AUTH_TOKEN, generated_access_token, str(user.uu_id)] + if add_uuid: + keys.append(add_uuid) + RedisActions.set_json(list_keys=keys, value={**token, **header_info}, expires={"hours": 1, "minutes": 30}) + return generated_access_token RedisActions.set_json(list_keys=keys, value={**token, **header_info}, expires={"hours": 1, "minutes": 30}) return generated_access_token @classmethod - def update_token_at_redis(cls, token: str, add_payload: Union[CompanyToken, OccupantToken]): - if already_token_data := RedisActions.get_json(list_keys=[cls.AUTH_TOKEN, token, "*"]).first: + def update_token_at_redis(cls, token: str, add_payload: Union[CompanyToken, OccupantToken], add_uuid: str): + if already_token_data := RedisActions.get_json(list_keys=[cls.AUTH_TOKEN, token, '*', add_uuid]).first: already_token = cls.process_redis_object(already_token_data) if already_token.is_employee and isinstance(add_payload, CompanyToken): already_token.selected_company = add_payload + list_keys = [cls.AUTH_TOKEN, token, str(already_token.user_uu_id), str(add_uuid)] + print('is_employee: ', list_keys) elif already_token.is_occupant and isinstance(add_payload, OccupantToken): already_token.selected_occupant = add_payload - list_keys = [cls.AUTH_TOKEN, token, str(already_token.user_uu_id)] + list_keys = [cls.AUTH_TOKEN, token, str(already_token.user_uu_id), str(add_uuid)] + print('is_occupant: ', list_keys) result = RedisActions.set_json(list_keys=list_keys, value=already_token.model_dump(), expires={"hours": 1, "minutes": 30}) + RedisActions.delete(list_keys=[cls.AUTH_TOKEN, token, str(already_token.user_uu_id)]) return result.first raise ValueError("Something went wrong") diff --git a/docker-compose.yml b/docker-compose.yml index a9f1d44..094f3c8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,20 +1,19 @@ services: - - # client_frontend: - # container_name: client_frontend - # build: - # context: . - # dockerfile: web_services/client_frontend/Dockerfile - # networks: - # - wag-services - # ports: - # - "3000:3000" - # environment: - # - NODE_ENV=development - # - WEB_BASE_URL=http://localhost:3000 - # - API_BASE_URL=http://localhost:3000/api - # cpus: 1.5 - # mem_limit: 2048m + client_frontend: + container_name: client_frontend + build: + context: . + dockerfile: web_services/client_frontend/Dockerfile + networks: + - wag-services + ports: + - "3000:3000" + environment: + - NODE_ENV=development + - WEB_BASE_URL=http://localhost:3000 + - API_BASE_URL=http://localhost:3000/api + cpus: 1.5 + mem_limit: 2048m # management_frontend: # container_name: management_frontend diff --git a/web_services/client_frontend/package-lock.json b/web_services/client_frontend/package-lock.json index 160596c..abd5024 100644 --- a/web_services/client_frontend/package-lock.json +++ b/web_services/client_frontend/package-lock.json @@ -39,6 +39,7 @@ "cmdk": "^1.1.1", "date-fns": "^4.1.0", "flatpickr": "^4.6.13", + "ioredis": "^5.6.1", "lucide-react": "^0.487.0", "next": "^15.2.4", "next-crypto": "^1.0.8", @@ -739,6 +740,12 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/@ioredis/commands": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", + "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==", + "license": "MIT" + }, "node_modules/@isaacs/fs-minipass": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", @@ -3700,6 +3707,15 @@ "node": ">=6" } }, + "node_modules/cluster-key-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/cmdk": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.1.1.tgz", @@ -3922,7 +3938,6 @@ "version": "4.4.0", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -3979,6 +3994,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10" + } + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -5358,6 +5382,30 @@ "node": ">= 0.4" } }, + "node_modules/ioredis": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.6.1.tgz", + "integrity": "sha512-UxC0Yv1Y4WRJiGQxQkP0hfdL0/5/6YvdfOOClRgJ0qppSarkhneSa6UvkMkms0AkdGimSH3Ikqm+6mkMmX7vGA==", + "license": "MIT", + "dependencies": { + "@ioredis/commands": "^1.1.1", + "cluster-key-slot": "^1.1.0", + "debug": "^4.3.4", + "denque": "^2.1.0", + "lodash.defaults": "^4.2.0", + "lodash.isarguments": "^3.1.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0", + "standard-as-callback": "^2.1.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ioredis" + } + }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -6181,6 +6229,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", + "license": "MIT" + }, + "node_modules/lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", + "license": "MIT" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -6366,7 +6426,6 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, "license": "MIT" }, "node_modules/nanoid": { @@ -7096,6 +7155,27 @@ } } }, + "node_modules/redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", + "license": "MIT", + "dependencies": { + "redis-errors": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", @@ -7605,6 +7685,12 @@ "dev": true, "license": "MIT" }, + "node_modules/standard-as-callback": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", + "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==", + "license": "MIT" + }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", diff --git a/web_services/client_frontend/package.json b/web_services/client_frontend/package.json index 0e059ee..93395fd 100644 --- a/web_services/client_frontend/package.json +++ b/web_services/client_frontend/package.json @@ -40,6 +40,7 @@ "cmdk": "^1.1.1", "date-fns": "^4.1.0", "flatpickr": "^4.6.13", + "ioredis": "^5.6.1", "lucide-react": "^0.487.0", "next": "^15.2.4", "next-crypto": "^1.0.8", diff --git a/web_services/client_frontend/src/apifetchers/api-fetcher.ts b/web_services/client_frontend/src/apifetchers/api-fetcher.ts new file mode 100644 index 0000000..2683bb6 --- /dev/null +++ b/web_services/client_frontend/src/apifetchers/api-fetcher.ts @@ -0,0 +1,153 @@ +"use server"; +import { retrieveAccessToken } from "@/apifetchers/mutual/cookies/token"; +import { + DEFAULT_RESPONSE, + defaultHeaders, + FetchOptions, + HttpMethod, + ApiResponse, + DEFAULT_TIMEOUT, +} from "./basics"; + +/** + * Creates a promise that rejects after a specified timeout + * @param ms Timeout in milliseconds + * @param controller AbortController to abort the fetch request + * @returns A promise that rejects after the timeout + */ +const createTimeoutPromise = ( + ms: number, + controller: AbortController +): Promise => { + return new Promise((_, reject) => { + setTimeout(() => { + controller.abort(); + reject(new Error(`Request timed out after ${ms}ms`)); + }, ms); + }); +}; + +/** + * Core fetch function with timeout and error handling + * @param url The URL to fetch + * @param options Fetch options + * @param headers Request headers + * @param payload Request payload + * @returns API response + */ +async function coreFetch( + url: string, + options: FetchOptions = {}, + headers: Record = defaultHeaders, + payload?: any +): Promise> { + const { method = "POST", cache = false, timeout = DEFAULT_TIMEOUT } = options; + + try { + // Setup controller for timeout handling + const controller = new AbortController(); + + // Prepare fetch options + const fetchOptions: RequestInit = { + method, + headers, + cache: cache ? "force-cache" : "no-cache", + signal: controller.signal, + }; + + // Add body for non-GET requests with payload + if (method !== "GET" && payload) { + fetchOptions.body = JSON.stringify( + payload.payload ? payload.payload : payload + ); + } + + // Create timeout promise + const timeoutPromise = createTimeoutPromise(timeout, controller); + + // Execute request with timeout + const response = await Promise.race([ + fetch(url, fetchOptions), + timeoutPromise, + ]); + + // Parse response + const responseData = await response.json(); + + // Return standardized response + return { + status: response.status, + data: responseData || ({} as T), + }; + } catch (error) { + console.error(`API Error (${url}):`, error); + return { + ...DEFAULT_RESPONSE, + error: error instanceof Error ? error.message : "Network error", + } as ApiResponse; + } +} + +/** + * Fetch data without authentication + */ +async function fetchData( + endpoint: string, + payload?: any, + method: HttpMethod = "POST", + cache: boolean = false, + timeout: number = DEFAULT_TIMEOUT +): Promise> { + return coreFetch( + endpoint, + { method, cache, timeout }, + defaultHeaders, + payload + ); +} + +/** + * Fetch data with authentication token + */ +async function fetchDataWithToken( + endpoint: string, + payload?: any, + method: HttpMethod = "POST", + cache: boolean = false, + timeout: number = DEFAULT_TIMEOUT +): Promise> { + const accessToken = (await retrieveAccessToken()) || ""; + const headers = { + ...defaultHeaders, + "eys-acs-tkn": accessToken, + }; + + return coreFetch(endpoint, { method, cache, timeout }, headers, payload); +} + +/** + * Update data with authentication token and UUID + */ +async function updateDataWithToken( + endpoint: string, + uuid: string, + payload?: any, + method: HttpMethod = "POST", + cache: boolean = false, + timeout: number = DEFAULT_TIMEOUT +): Promise> { + const accessToken = (await retrieveAccessToken()) || ""; + const headers = { + ...defaultHeaders, + "eys-acs-tkn": accessToken, + }; + + return coreFetch( + `${endpoint}/${uuid}`, + { method, cache, timeout }, + headers, + payload + ); +} + +export { fetchData, fetchDataWithToken, updateDataWithToken }; diff --git a/web_services/client_frontend/src/apifetchers/basics.ts b/web_services/client_frontend/src/apifetchers/basics.ts new file mode 100644 index 0000000..89ea274 --- /dev/null +++ b/web_services/client_frontend/src/apifetchers/basics.ts @@ -0,0 +1,80 @@ +const formatServiceUrl = (url: string) => { + if (!url) return ""; + return url.startsWith("http") ? url : `http://${url}`; +}; + +const baseUrlAuth = formatServiceUrl( + process.env.NEXT_PUBLIC_AUTH_SERVICE_URL || "auth_service:8001" +); +const baseUrlRestriction = formatServiceUrl( + process.env.NEXT_PUBLIC_RESTRICTION_SERVICE_URL || "restriction_service:8002" +); +const baseUrlApplication = formatServiceUrl( + process.env.NEXT_PUBLIC_MANAGEMENT_SERVICE_URL || "management_service:8003" +); +const baseUrlAccount = formatServiceUrl( + process.env.NEXT_PUBLIC_ACCOUNT_SERVICE_URL || "account_service:8004" +); +const baseUrlBuilding = formatServiceUrl( + process.env.NEXT_PUBLIC_BUILDING_SERVICE_URL || "building_service:8006" +); +const baseUrlPeople = formatServiceUrl( + process.env.NEXT_PUBLIC_VALIDATION_SERVICE_URL || "validation_service:8009" +); + +// Types for better type safety +type HttpMethod = "GET" | "POST" | "PUT" | "DELETE" | "PATCH"; + +interface ApiResponse { + status: number; + data: T; + error?: string; +} + +interface FetchOptions { + method?: HttpMethod; + cache?: boolean; + timeout?: number; +} + +const tokenSecret = + process.env.TOKENSECRET_90 || "787a4a44-2a27-454d-8918-35ceab50592d"; + +const cookieObject: any = { + httpOnly: true, + path: "/", + sameSite: "none", + secure: true, + maxAge: 3600, + priority: "high", +}; + +// Constants +const DEFAULT_TIMEOUT = 10000; // 10 seconds +const defaultHeaders = { + accept: "application/json", + language: "tr", + domain: "evyos.com.tr", + tz: "GMT+3", + "Content-type": "application/json", +}; +const DEFAULT_RESPONSE: ApiResponse = { + error: "Hata tipi belirtilmedi", + status: 500, + data: {}, +}; + +export type { HttpMethod, ApiResponse, FetchOptions }; +export { + DEFAULT_TIMEOUT, + DEFAULT_RESPONSE, + defaultHeaders, + baseUrlAuth, + baseUrlPeople, + baseUrlApplication, + baseUrlAccount, + baseUrlBuilding, + baseUrlRestriction, + tokenSecret, + cookieObject, +}; diff --git a/web_services/client_frontend/src/apifetchers/custom/login/login.tsx b/web_services/client_frontend/src/apifetchers/custom/login/login.tsx new file mode 100644 index 0000000..20f9345 --- /dev/null +++ b/web_services/client_frontend/src/apifetchers/custom/login/login.tsx @@ -0,0 +1,218 @@ +"use server"; +import NextCrypto from "next-crypto"; +import { fetchData, fetchDataWithToken } from "@/apifetchers/api-fetcher"; +import { baseUrlAuth, cookieObject, tokenSecret } from "@/apifetchers/basics"; +import { cookies } from "next/headers"; +import { setNewCompleteToRedis, getCompleteFromRedis } from "@/apifetchers/mutual/context/complete/fetch"; +import { + defaultClientHeader, + defaultClientMenu, + defaultClientOnline, + defaultClientPageConfig, + defaultLinkList +} from "@/types/mutual/context/validations"; +import { retrievePageList } from "@/apifetchers/mutual/cookies/token"; +import { setMenuToRedis } from "@/apifetchers/mutual/context/page/menu/fetch"; + +const loginEndpoint = `${baseUrlAuth}/authentication/login`; +const loginSelectEndpoint = `${baseUrlAuth}/authentication/select`; +const logoutEndpoint = `${baseUrlAuth}/authentication/logout`; + +interface LoginViaAccessKeys { + accessKey: string; + password: string; + rememberMe: boolean; +} + +interface LoginSelect { + uuid: string; +} + +interface LoginSelectOccupant { + uuid: any; +} + +async function logoutActiveSession() { + const cookieStore = await cookies(); + const response = await fetchDataWithToken(logoutEndpoint, {}, "GET", false); + cookieStore.delete("eys-zzz"); + cookieStore.delete("eys-yyy"); + cookieStore.delete("eys-sel"); + return response; +} + +async function initRedis(loginRespone: any, firstSelection: any, accessToken: string, redisKey: string) { + let alreadyAtRedis = null + try { + const redisData = await getCompleteFromRedis(); + alreadyAtRedis = redisData; + } catch (error) { } + if (!alreadyAtRedis) { + const loginObjectToRedis = { + online: { + ...defaultClientOnline, + lastLogin: new Date(), + userType: `${loginRespone.user_type}`.toUpperCase(), + lang: loginRespone.user.person.country_code.toLowerCase(), + }, + pageConfig: defaultClientPageConfig, + menu: defaultClientMenu, + header: defaultClientHeader, + selection: { selectionList: loginRespone.selection_list, activeSelection: firstSelection }, + user: loginRespone.user, + settings: { lastOnline: new Date(), token: accessToken }, + chatRoom: defaultLinkList, + notifications: defaultLinkList, + messages: defaultLinkList, + } + await setNewCompleteToRedis(loginObjectToRedis, redisKey); + } +} + +async function loginViaAccessKeys(payload: LoginViaAccessKeys) { + const cookieStore = await cookies(); + try { + const response = await fetchData( + loginEndpoint, + { + access_key: payload.accessKey, + password: payload.password, + remember_me: payload.rememberMe, + }, + "POST", + false + ); + if (response.status === 200 || response.status === 202) { + + const loginRespone: any = response?.data; + const firstSelection = loginRespone.selection_list.find((item: any) => item.uu_id === loginRespone.selection_list[0].uu_id); + + const nextCrypto = new NextCrypto(tokenSecret); + const accessToken = await nextCrypto.encrypt(loginRespone.access_token); + + const redisKey = `CLIENT:${loginRespone.user_type.toUpperCase()}:${firstSelection.uu_id}`; + const redisKeyAccess = await nextCrypto.encrypt(redisKey); + const usersSelection = await nextCrypto.encrypt( + JSON.stringify({ + selected: firstSelection.uu_id, + userType: loginRespone.user_type.toUpperCase(), + redisKey, + }) + ); + + await initRedis(loginRespone, firstSelection, accessToken, redisKey); + cookieStore.set({ + name: "eys-zzz", + value: accessToken, + ...cookieObject, + }); + cookieStore.set({ + name: "eys-yyy", + value: redisKeyAccess, + ...cookieObject, + }); + cookieStore.set({ + name: "eys-sel", + value: usersSelection, + ...cookieObject, + }); + try { + return { + completed: true, + message: "Login successful", + status: 200, + data: loginRespone, + }; + } catch (error) { + console.error("JSON parse error:", error); + return { + completed: false, + message: "Login NOT successful", + status: 401, + data: "{}", + }; + } + } + + return { + completed: false, + // error: response.error || "Login failed", + // message: response.message || "Authentication failed", + status: response.status || 500, + }; + } catch (error) { + console.error("Login error:", error); + return { + completed: false, + // error: error instanceof Error ? error.message : "Login error", + // message: "An error occurred during login", + status: 500, + }; + } +} + +async function loginSelectEmployee(payload: LoginSelect) { + const cookieStore = await cookies(); + const nextCrypto = new NextCrypto(tokenSecret); + const employeeUUID = payload.uuid; + const redisKey = `CLIENT:EMPLOYEE:${employeeUUID}`; + const selectResponse: any = await fetchDataWithToken(loginSelectEndpoint, { uuid: employeeUUID }, "POST", false); + + cookieStore.delete("eys-sel"); + + if (selectResponse.status === 200 || selectResponse.status === 202) { + const usersSelection = await nextCrypto.encrypt( + JSON.stringify({ + selected: employeeUUID, + userType: "employee", + redisKey, + }) + ); + cookieStore.set({ + name: "eys-sel", + value: usersSelection, + ...cookieObject, + }); + try { + const pageList = await retrievePageList() + await setMenuToRedis({ + selectionList: pageList, + activeSelection: "/dashboard" + }) + } catch (error) { } + } + return selectResponse; +} + +async function loginSelectOccupant(payload: LoginSelectOccupant) { + const livingSpaceUUID = payload.uuid; + const cookieStore = await cookies(); + const nextCrypto = new NextCrypto(tokenSecret); + + const selectResponse: any = await fetchDataWithToken(loginSelectEndpoint, { uuid: livingSpaceUUID }, "POST", false); + const redisKey = `CLIENT:OCCUPANT:${livingSpaceUUID}`; + cookieStore.delete("eys-sel"); + + if (selectResponse.status === 200 || selectResponse.status === 202) { + const usersSelection = await nextCrypto.encrypt( + JSON.stringify({ + selected: livingSpaceUUID, + userType: "OCCUPANT", + redisKey, + }) + ); + cookieStore.set({ + name: "eys-sel", + value: usersSelection, + ...cookieObject, + }); + } + return selectResponse; +} + +export { + loginViaAccessKeys, + loginSelectEmployee, + loginSelectOccupant, + logoutActiveSession, +}; diff --git a/web_services/client_frontend/src/apifetchers/mutual/context/complete/fetch.tsx b/web_services/client_frontend/src/apifetchers/mutual/context/complete/fetch.tsx new file mode 100644 index 0000000..4ac8002 --- /dev/null +++ b/web_services/client_frontend/src/apifetchers/mutual/context/complete/fetch.tsx @@ -0,0 +1,32 @@ +"use server"; +import { redis } from "@/lib/redis"; +import { functionRetrieveUserSelection } from "@/apifetchers/utils"; +import { ClientRedisToken } from "@/types/mutual/context/validations"; + +const getCompleteFromRedis = async (): Promise => { + const decrpytUserSelection = await functionRetrieveUserSelection() + const redisKey = decrpytUserSelection?.redisKey; + if (!redisKey) throw new Error("No redis key found"); + const result = await redis.get(`${redisKey}`); + if (!result) throw new Error("No data found in redis"); + return JSON.parse(result); +} + +const setCompleteToRedis = async (completeObject: ClientRedisToken) => { + const decrpytUserSelection = await functionRetrieveUserSelection() + if (!decrpytUserSelection) throw new Error("No user selection found"); + const redisKey = decrpytUserSelection?.redisKey; + if (!redisKey) throw new Error("No redis key found"); + if (!completeObject) throw new Error("No complete object provided"); + await redis.set(redisKey, JSON.stringify(completeObject)); + return true; +} + +const setNewCompleteToRedis = async (completeObject: ClientRedisToken, redisKey: string) => { + if (!redisKey) throw new Error("No redis key found"); + if (!completeObject) throw new Error("No complete object provided"); + await redis.set(redisKey, JSON.stringify(completeObject)); + return true; +} + +export { getCompleteFromRedis, setCompleteToRedis, setNewCompleteToRedis }; diff --git a/web_services/client_frontend/src/apifetchers/mutual/context/dash/selection/fetch.tsx b/web_services/client_frontend/src/apifetchers/mutual/context/dash/selection/fetch.tsx new file mode 100644 index 0000000..863e4e0 --- /dev/null +++ b/web_services/client_frontend/src/apifetchers/mutual/context/dash/selection/fetch.tsx @@ -0,0 +1,32 @@ +"use server"; +import { redis } from "@/lib/redis"; +import { functionRetrieveUserSelection } from "@/apifetchers/utils"; +import { ClientSelection } from "@/types/mutual/context/validations"; +import { getCompleteFromRedis, setCompleteToRedis } from "@/apifetchers/mutual/context/complete/fetch"; + +const getSelectionFromRedis = async (): Promise => { + try { + const decrpytUserSelection = await functionRetrieveUserSelection(); + const redisKey = decrpytUserSelection?.redisKey; + if (redisKey === "default") { return { selectionList: [], activeSelection: {} } } + const result = await redis.get(`${redisKey}`); + if (!result) { return { selectionList: [], activeSelection: {} } } + const parsedResult = JSON.parse(result); + if (!parsedResult.selection) { return { selectionList: [], activeSelection: {} } } + return parsedResult.selection; + } catch (error) { return { selectionList: [], activeSelection: {} } } +} + +const setSelectionToRedis = async (selectionObject: ClientSelection) => { + const decrpytUserSelection = await functionRetrieveUserSelection() + if (!decrpytUserSelection) throw new Error("No user selection found"); + const redisKey = decrpytUserSelection?.redisKey; + if (!redisKey) throw new Error("No redis key found"); + if (!selectionObject) throw new Error("No selection object provided"); + const oldData = await getCompleteFromRedis(); + if (!oldData) throw new Error("No old data found in redis"); + await setCompleteToRedis({ ...oldData, selection: selectionObject }) + return true; +} + +export { getSelectionFromRedis, setSelectionToRedis }; diff --git a/web_services/client_frontend/src/apifetchers/mutual/context/dash/settings/fetch.tsx b/web_services/client_frontend/src/apifetchers/mutual/context/dash/settings/fetch.tsx new file mode 100644 index 0000000..5731b1a --- /dev/null +++ b/web_services/client_frontend/src/apifetchers/mutual/context/dash/settings/fetch.tsx @@ -0,0 +1,30 @@ +"use server"; +import { redis } from "@/lib/redis"; +import { functionRetrieveUserSelection } from "@/apifetchers/utils"; +import { ClientSettings } from "@/types/mutual/context/validations"; +import { getCompleteFromRedis, setCompleteToRedis } from "@/apifetchers/mutual/context/complete/fetch"; + +const getSettingsFromRedis = async (): Promise => { + const decrpytUserSelection = await functionRetrieveUserSelection() + const redisKey = decrpytUserSelection?.redisKey; + if (!redisKey) throw new Error("No redis key found"); + const result = await redis.get(`${redisKey}`); + if (!result) throw new Error("No data found in redis"); + const parsedResult = JSON.parse(result); + if (!parsedResult.settings) throw new Error("No settings found in redis"); + return parsedResult.settings; +} + +const setSettingsToRedis = async (settingsObject: ClientSettings) => { + const decrpytUserSelection = await functionRetrieveUserSelection() + if (!decrpytUserSelection) throw new Error("No user selection found"); + const redisKey = decrpytUserSelection?.redisKey; + if (!redisKey) throw new Error("No redis key found"); + if (!settingsObject) throw new Error("No settings object provided"); + const oldData = await getCompleteFromRedis(); + if (!oldData) throw new Error("No old data found in redis"); + await setCompleteToRedis({ ...oldData, settings: settingsObject }) + return true; +} + +export { getSettingsFromRedis, setSettingsToRedis }; diff --git a/web_services/client_frontend/src/apifetchers/mutual/context/dash/user/fetch.tsx b/web_services/client_frontend/src/apifetchers/mutual/context/dash/user/fetch.tsx new file mode 100644 index 0000000..e6c20f4 --- /dev/null +++ b/web_services/client_frontend/src/apifetchers/mutual/context/dash/user/fetch.tsx @@ -0,0 +1,30 @@ +"use server"; +import { redis } from "@/lib/redis"; +import { functionRetrieveUserSelection } from "@/apifetchers/utils"; +import { ClientUser } from "@/types/mutual/context/validations"; +import { getCompleteFromRedis, setCompleteToRedis } from "@/apifetchers/mutual/context/complete/fetch"; + +const getUserFromRedis = async (): Promise => { + const decrpytUserSelection = await functionRetrieveUserSelection() + const redisKey = decrpytUserSelection?.redisKey; + if (!redisKey) throw new Error("No redis key found"); + const result = await redis.get(`${redisKey}`); + if (!result) throw new Error("No data found in redis"); + const parsedResult = JSON.parse(result); + if (!parsedResult.user) throw new Error("No user found in redis"); + return parsedResult.user; +} + +const setUserToRedis = async (userObject: ClientUser) => { + const decrpytUserSelection = await functionRetrieveUserSelection() + if (!decrpytUserSelection) throw new Error("No user selection found"); + const redisKey = decrpytUserSelection?.redisKey; + if (!redisKey) throw new Error("No redis key found"); + if (!userObject) throw new Error("No user object provided"); + const oldData = await getCompleteFromRedis(); + if (!oldData) throw new Error("No old data found in redis"); + await setCompleteToRedis({ ...oldData, user: userObject }); + return true; +} + +export { getUserFromRedis, setUserToRedis }; diff --git a/web_services/client_frontend/src/apifetchers/mutual/context/page/config/fetch.tsx b/web_services/client_frontend/src/apifetchers/mutual/context/page/config/fetch.tsx new file mode 100644 index 0000000..19c66ab --- /dev/null +++ b/web_services/client_frontend/src/apifetchers/mutual/context/page/config/fetch.tsx @@ -0,0 +1,31 @@ +"use server"; +import { redis } from "@/lib/redis"; +import { functionRetrieveUserSelection } from "@/apifetchers/utils"; +import { ClientSettings } from "@/types/mutual/context/validations"; +import { getCompleteFromRedis, setCompleteToRedis } from "@/apifetchers/mutual/context/complete/fetch"; + +const getConfigFromRedis = async (): Promise => { + const decrpytUserSelection = await functionRetrieveUserSelection() + const redisKey = decrpytUserSelection?.redisKey; + if (!redisKey) throw new Error("No redis key found"); + const result = await redis.get(`${redisKey}`); + if (!result) throw new Error("No data found in redis"); + const parsedResult = JSON.parse(result); + if (!parsedResult.settings) throw new Error("No settings found in redis"); + return parsedResult.settings; +} + +const setConfigToRedis = async (settingsObject: ClientSettings) => { + const decrpytUserSelection = await functionRetrieveUserSelection() + if (!decrpytUserSelection) throw new Error("No user selection found"); + const redisKey = decrpytUserSelection?.redisKey; + if (!redisKey) throw new Error("No redis key found"); + if (!settingsObject) throw new Error("No settings object provided"); + const oldData = await getCompleteFromRedis(); + if (!oldData) throw new Error("No old data found in redis"); + await setCompleteToRedis({ ...oldData, settings: settingsObject }); + return true; +} + + +export { getConfigFromRedis, setConfigToRedis }; diff --git a/web_services/client_frontend/src/apifetchers/mutual/context/page/menu/fetch.tsx b/web_services/client_frontend/src/apifetchers/mutual/context/page/menu/fetch.tsx new file mode 100644 index 0000000..67170f9 --- /dev/null +++ b/web_services/client_frontend/src/apifetchers/mutual/context/page/menu/fetch.tsx @@ -0,0 +1,30 @@ +"use server"; +import { redis } from "@/lib/redis"; +import { functionRetrieveUserSelection } from "@/apifetchers/utils"; +import { ClientMenu } from "@/types/mutual/context/validations"; +import { getCompleteFromRedis, setCompleteToRedis } from "@/apifetchers/mutual/context/complete/fetch"; + +const getMenuFromRedis = async (): Promise => { + const decrpytUserSelection = await functionRetrieveUserSelection() + const redisKey = decrpytUserSelection?.redisKey; + if (!redisKey) throw new Error("No redis key found"); + const result = await redis.get(`${redisKey}`); + if (!result) throw new Error("No data found in redis"); + const parsedResult = JSON.parse(result); + if (!parsedResult.menu) throw new Error("No menu found in redis"); + return parsedResult.menu; +} + +const setMenuToRedis = async (menuObject: ClientMenu) => { + const decrpytUserSelection = await functionRetrieveUserSelection() + if (!decrpytUserSelection) throw new Error("No user selection found"); + const redisKey = decrpytUserSelection?.redisKey; + if (!redisKey) throw new Error("No redis key found"); + if (!menuObject) throw new Error("No menu object provided"); + const oldData = await getCompleteFromRedis(); + if (!oldData) throw new Error("No old data found in redis"); + await setCompleteToRedis({ ...oldData, menu: menuObject }); + return true; +} + +export { getMenuFromRedis, setMenuToRedis }; diff --git a/web_services/client_frontend/src/apifetchers/mutual/context/page/online/fetch.tsx b/web_services/client_frontend/src/apifetchers/mutual/context/page/online/fetch.tsx new file mode 100644 index 0000000..a602fdf --- /dev/null +++ b/web_services/client_frontend/src/apifetchers/mutual/context/page/online/fetch.tsx @@ -0,0 +1,82 @@ +"use server"; +import { redis } from "@/lib/redis"; +import { functionRetrieveUserSelection } from "@/apifetchers/utils"; +import { ClientOnline } from "@/types/mutual/context/validations"; +import { getCompleteFromRedis, setCompleteToRedis } from "@/apifetchers/mutual/context/complete/fetch"; + +const getOnlineFromRedis = async (): Promise => { + try { + // Get user selection with default fallback + const decrpytUserSelection = await functionRetrieveUserSelection(); + const redisKey = decrpytUserSelection?.redisKey; + + // If we have a default redisKey, return a default online object + if (redisKey === "default") { + return { + lang: "en", + userType: "occupant", + lastLogin: new Date(), + lastLogout: new Date(), + lastAction: new Date(), + lastPage: "/auth/login", + timezone: "GMT+3" + }; + } + + // Try to get data from Redis + const result = await redis.get(`${redisKey}`); + if (!result) { + return { + lang: "en", + userType: "occupant", + lastLogin: new Date(), + lastLogout: new Date(), + lastAction: new Date(), + lastPage: "/auth/login", + timezone: "GMT+3" + }; + } + + // Parse the result + const parsedResult = JSON.parse(result); + if (!parsedResult.online) { + return { + lang: "en", + userType: "occupant", + lastLogin: new Date(), + lastLogout: new Date(), + lastAction: new Date(), + lastPage: "/auth/login", + timezone: "GMT+3" + }; + } + + return parsedResult.online; + } catch (error) { + console.error("Error getting online from Redis:", error); + // Return default online object in case of any error + return { + lang: "en", + userType: "occupant", + lastLogin: new Date(), + lastLogout: new Date(), + lastAction: new Date(), + lastPage: "/auth/login", + timezone: "GMT+3" + }; + } +} + +const setOnlineToRedis = async (onlineObject: ClientOnline) => { + const decrpytUserSelection = await functionRetrieveUserSelection() + if (!decrpytUserSelection) throw new Error("No user selection found"); + const redisKey = decrpytUserSelection?.redisKey; + if (!redisKey) throw new Error("No redis key found"); + if (!onlineObject) throw new Error("No online object provided"); + const oldData = await getCompleteFromRedis(); + if (!oldData) throw new Error("No old data found in redis"); + await setCompleteToRedis({ ...oldData, online: onlineObject }); + return true; +} + +export { getOnlineFromRedis, setOnlineToRedis }; diff --git a/web_services/client_frontend/src/apifetchers/mutual/cookies/token.tsx b/web_services/client_frontend/src/apifetchers/mutual/cookies/token.tsx new file mode 100644 index 0000000..e38700e --- /dev/null +++ b/web_services/client_frontend/src/apifetchers/mutual/cookies/token.tsx @@ -0,0 +1,57 @@ +"use server"; +import NextCrypto from "next-crypto"; + +import { fetchDataWithToken } from "@/apifetchers/api-fetcher"; +import { baseUrlAuth, baseUrlRestriction, tokenSecret } from "@/apifetchers/basics"; +import { cookies } from "next/headers"; + +const checkToken = `${baseUrlAuth}/authentication/token/check`; +const pageValid = `${baseUrlRestriction}/restrictions/page/valid`; +const siteUrls = `${baseUrlRestriction}/restrictions/sites/list`; + +const nextCrypto = new NextCrypto(tokenSecret); + +function fetchResponseStatus(response: any) { + return 199 < response?.status && response?.status < 300; +} + +async function checkAccessTokenIsValid() { + try { + const response = await fetchDataWithToken(checkToken, {}, "GET", false); + return fetchResponseStatus(response) ? true : false; + } catch (error) { + console.error("Error checking token validity:", error); + return false; + } +} + +async function retrievePageList() { + const response: any = await fetchDataWithToken(siteUrls, {}, "GET", false); + return fetchResponseStatus(response) ? response.data?.sites : null; +} + +async function retrieveApplicationbyUrl(pageUrl: string) { + const response: any = await fetchDataWithToken(pageValid, { page_url: pageUrl }, "POST", false); + return fetchResponseStatus(response) ? response.data?.application : null; +} + +async function retrieveAccessToken() { + const cookieStore = await cookies(); + const encrpytAccessToken = cookieStore.get("eys-zzz")?.value || ""; + return encrpytAccessToken ? await nextCrypto.decrypt(encrpytAccessToken) : null; +} + +async function retrieveAccessObjects() { + const cookieStore = await cookies(); + const encrpytAccessObject = cookieStore.get("eys-yyy")?.value || ""; + const decrpytAccessObject = await nextCrypto.decrypt(encrpytAccessObject); + return decrpytAccessObject ? JSON.parse(decrpytAccessObject) : null; +} + +export { + checkAccessTokenIsValid, + retrieveAccessToken, + retrieveAccessObjects, + retrieveApplicationbyUrl, + retrievePageList, +}; diff --git a/web_services/client_frontend/src/apifetchers/utils.tsx b/web_services/client_frontend/src/apifetchers/utils.tsx new file mode 100644 index 0000000..00957b6 --- /dev/null +++ b/web_services/client_frontend/src/apifetchers/utils.tsx @@ -0,0 +1,33 @@ +"use server"; +import NextCrypto from "next-crypto"; +import { cookieObject, tokenSecret } from "@/apifetchers/basics"; +import { cookies } from "next/headers"; + +const nextCrypto = new NextCrypto(tokenSecret); + +const functionRetrieveUserSelection = async () => { + const cookieStore = await cookies(); + const encrpytUserSelection = cookieStore.get("eys-sel")?.value || ""; + if (!encrpytUserSelection) throw new Error("No user selection found"); + const decrpytUserSelection = await nextCrypto.decrypt(encrpytUserSelection); + if (!decrpytUserSelection) throw new Error("No user selection found"); + return JSON.parse(decrpytUserSelection); +} + +const functionSetUserSelection = async (userSelection: any) => { + const cookieStore = await cookies(); + const encrpytUserSelection = await nextCrypto.encrypt(JSON.stringify(userSelection)); + if (!encrpytUserSelection) throw new Error("No user selection found"); + cookieStore.set({ + name: "eys-sel", + value: encrpytUserSelection, + ...cookieObject, + }); +} + +const functionRemoveUserSelection = async () => { + const cookieStore = await cookies(); + cookieStore.delete("eys-sel"); +} + +export { functionRetrieveUserSelection, functionSetUserSelection, functionRemoveUserSelection }; \ No newline at end of file diff --git a/web_services/client_frontend/src/app/(AuthLayout)/auth/[...page]/page.tsx b/web_services/client_frontend/src/app/(AuthLayout)/auth/[...page]/page.tsx new file mode 100644 index 0000000..aed3e40 --- /dev/null +++ b/web_services/client_frontend/src/app/(AuthLayout)/auth/[...page]/page.tsx @@ -0,0 +1,17 @@ +'use server'; +import { AuthLayout } from "@/layouts/auth/layout"; +import { AuthServerProps } from "@/validations/mutual/pages/props"; +import { checkContextPageOnline } from "@/components/mutual/context/online/context"; +import getPage from "@/webPages/getPage"; + +const AuthPageEn = async ({ params, searchParams }: AuthServerProps) => { + const online = await checkContextPageOnline(); + const lang = online?.lang || "en"; + const awaitedParams = await params; + const awaitedSearchParams = await searchParams; + const pageUrlFromParams = `/${awaitedParams.page?.join("/")}` || "/login"; + const FoundPage = getPage(pageUrlFromParams, { language: lang, query: awaitedSearchParams }); + return +} + +export default AuthPageEn; diff --git a/web_services/client_frontend/src/app/(DashboardLayout)/panel/en/[...page]/page.tsx b/web_services/client_frontend/src/app/(DashboardLayout)/panel/[...page]/page.tsx similarity index 100% rename from web_services/client_frontend/src/app/(DashboardLayout)/panel/en/[...page]/page.tsx rename to web_services/client_frontend/src/app/(DashboardLayout)/panel/[...page]/page.tsx diff --git a/web_services/client_frontend/src/app/api/auth/authentication/token/check/route.ts b/web_services/client_frontend/src/app/api/auth/authentication/token/check/route.ts new file mode 100644 index 0000000..5337329 --- /dev/null +++ b/web_services/client_frontend/src/app/api/auth/authentication/token/check/route.ts @@ -0,0 +1,33 @@ +import { NextResponse } from "next/server"; +import { retrieveAccessToken } from "@/apifetchers/mutual/cookies/token"; + +export async function GET() { + try { + // Check if token exists + const token = await retrieveAccessToken(); + + if (!token) { + return NextResponse.json({ + status: 401, + data: null, + error: "No token found", + }); + } + + // In a real implementation, you would validate the token + // For now, just return success if a token exists + return NextResponse.json({ + status: 200, + data: { + valid: true, + }, + }); + } catch (error) { + console.error("Error checking token:", error); + return NextResponse.json({ + status: 500, + data: null, + error: "Error validating token", + }); + } +} diff --git a/web_services/client_frontend/src/app/api/context/dash/selection/route.ts b/web_services/client_frontend/src/app/api/context/dash/selection/route.ts new file mode 100644 index 0000000..63ce31b --- /dev/null +++ b/web_services/client_frontend/src/app/api/context/dash/selection/route.ts @@ -0,0 +1,22 @@ +import { + getSelectionFromRedis, + setSelectionToRedis, +} from "@/apifetchers/mutual/context/dash/selection/fetch"; +import { NextResponse } from "next/server"; + +export async function GET() { + const selection = await getSelectionFromRedis(); + return NextResponse.json({ + status: 200, + data: selection || null, + }); +} + +export async function POST(request: Request) { + const selection = await request.json(); + await setSelectionToRedis(selection); + return NextResponse.json({ + status: 200, + data: selection || null, + }); +} diff --git a/web_services/client_frontend/src/app/api/context/dash/settings/route.ts b/web_services/client_frontend/src/app/api/context/dash/settings/route.ts new file mode 100644 index 0000000..8174841 --- /dev/null +++ b/web_services/client_frontend/src/app/api/context/dash/settings/route.ts @@ -0,0 +1,16 @@ +import { + getSettingsFromRedis, + setSettingsToRedis, +} from "@/apifetchers/mutual/context/dash/settings/fetch"; +import { NextResponse } from "next/server"; + +export async function GET() { + const settings = await getSettingsFromRedis(); + return NextResponse.json(settings); +} + +export async function POST(request: Request) { + const settings = await request.json(); + await setSettingsToRedis(settings); + return NextResponse.json(settings); +} diff --git a/web_services/client_frontend/src/app/api/context/dash/user/route.ts b/web_services/client_frontend/src/app/api/context/dash/user/route.ts new file mode 100644 index 0000000..29e9a94 --- /dev/null +++ b/web_services/client_frontend/src/app/api/context/dash/user/route.ts @@ -0,0 +1,16 @@ +import { + getUserFromRedis, + setUserToRedis, +} from "@/apifetchers/mutual/context/dash/user/fetch"; +import { NextResponse } from "next/server"; + +export async function GET() { + const user = await getUserFromRedis(); + return NextResponse.json(user); +} + +export async function POST(request: Request) { + const user = await request.json(); + await setUserToRedis(user); + return NextResponse.json(user); +} diff --git a/web_services/client_frontend/src/app/api/context/page/config/route.ts b/web_services/client_frontend/src/app/api/context/page/config/route.ts new file mode 100644 index 0000000..61b7eb2 --- /dev/null +++ b/web_services/client_frontend/src/app/api/context/page/config/route.ts @@ -0,0 +1,16 @@ +import { + getConfigFromRedis, + setConfigToRedis, +} from "@/apifetchers/mutual/context/page/config/fetch"; +import { NextResponse } from "next/server"; + +export async function GET() { + const config = await getConfigFromRedis(); + return NextResponse.json(config); +} + +export async function POST(request: Request) { + const config = await request.json(); + await setConfigToRedis(config); + return NextResponse.json(config); +} diff --git a/web_services/client_frontend/src/app/api/context/page/menu/route.ts b/web_services/client_frontend/src/app/api/context/page/menu/route.ts new file mode 100644 index 0000000..1c8a9dd --- /dev/null +++ b/web_services/client_frontend/src/app/api/context/page/menu/route.ts @@ -0,0 +1,22 @@ +import { + getMenuFromRedis, + setMenuToRedis, +} from "@/apifetchers/mutual/context/page/menu/fetch"; +import { NextResponse } from "next/server"; + +export async function GET() { + const menu = await getMenuFromRedis(); + return NextResponse.json({ + status: 200, + data: menu, + }); +} + +export async function POST(request: Request) { + const menu = await request.json(); + await setMenuToRedis(menu); + return NextResponse.json({ + status: 200, + data: menu, + }); +} diff --git a/web_services/client_frontend/src/app/api/context/page/online/route.ts b/web_services/client_frontend/src/app/api/context/page/online/route.ts new file mode 100644 index 0000000..359f6a3 --- /dev/null +++ b/web_services/client_frontend/src/app/api/context/page/online/route.ts @@ -0,0 +1,22 @@ +import { + getOnlineFromRedis, + setOnlineToRedis, +} from "@/apifetchers/mutual/context/page/online/fetch"; +import { NextResponse } from "next/server"; + +export async function GET() { + const online = await getOnlineFromRedis(); + return NextResponse.json({ + status: 200, + data: online, + }); +} + +export async function POST(request: Request) { + const online = await request.json(); + await setOnlineToRedis(online); + return NextResponse.json({ + status: 200, + data: online, + }); +} diff --git a/web_services/client_frontend/src/app/api/login/email/route.ts b/web_services/client_frontend/src/app/api/login/email/route.ts index 1edf11b..15e5b5a 100644 --- a/web_services/client_frontend/src/app/api/login/email/route.ts +++ b/web_services/client_frontend/src/app/api/login/email/route.ts @@ -1,11 +1,10 @@ -import { loginViaAccessKeys } from "@/apicalls/custom/login/login"; import { NextResponse } from "next/server"; +import { loginViaAccessKeys } from "@/apifetchers/custom/login/login"; import { loginSchemaEmail } from "@/webPages/auth/login/schemas"; export async function POST(req: Request): Promise { try { const headers = req.headers; - console.log("headers", Object.entries(headers)); const body = await req.json(); const dataValidated = { accessKey: body.email, diff --git a/web_services/client_frontend/src/app/api/menu/route.ts b/web_services/client_frontend/src/app/api/menu/route.ts index 63a4a72..a1e0abc 100644 --- a/web_services/client_frontend/src/app/api/menu/route.ts +++ b/web_services/client_frontend/src/app/api/menu/route.ts @@ -1,20 +1,16 @@ +import { API_BASE_URL } from "@/config/config"; import { NextResponse } from "next/server"; export async function POST() { - async function retrieveAvailableApplication(): Promise { - return new Promise((resolve) => { - const mockList = [ - "management/account/tenant/something", - "management/account/tenant/somethingSecond", - "building/parts/tenant/something", - ]; - resolve(mockList); - }); - } - - const availableApplications = await retrieveAvailableApplication(); - return NextResponse.json({ - status: 200, - data: availableApplications, + const result = await fetch(`${API_BASE_URL}/context/page/menu`, { + method: "GET", + headers: { "Content-Type": "application/json" }, }); + try { + const data = await result.json(); + return NextResponse.json({ status: 200, data: data }); + } catch (error) { + console.log(error); + return NextResponse.json({ status: 500, message: "No data is found" }); + } } diff --git a/web_services/client_frontend/src/app/api/selection/employee/route.ts b/web_services/client_frontend/src/app/api/selection/employee/route.ts index 3ab32d5..4d5b844 100644 --- a/web_services/client_frontend/src/app/api/selection/employee/route.ts +++ b/web_services/client_frontend/src/app/api/selection/employee/route.ts @@ -1,9 +1,9 @@ import { z } from "zod"; -import { loginSelectEmployee } from "@/apicalls/custom/login/login"; +import { loginSelectEmployee } from "@/apifetchers/custom/login/login"; import { NextResponse } from "next/server"; const loginSchemaEmployee = z.object({ - company_uu_id: z.string(), + uuid: z.string(), }); export async function POST(req: Request): Promise { @@ -12,7 +12,7 @@ export async function POST(req: Request): Promise { console.log("headers", Object.entries(headers)); const body = await req.json(); const dataValidated = { - company_uu_id: body.company_uu_id, + uuid: body.uuid, }; const validatedLoginBody = loginSchemaEmployee.safeParse(body); if (!validatedLoginBody.success) { diff --git a/web_services/client_frontend/src/app/api/selection/occupant/route.ts b/web_services/client_frontend/src/app/api/selection/occupant/route.ts index 405c361..95fa05b 100644 --- a/web_services/client_frontend/src/app/api/selection/occupant/route.ts +++ b/web_services/client_frontend/src/app/api/selection/occupant/route.ts @@ -1,18 +1,17 @@ import { z } from "zod"; -import { loginSelectOccupant } from "@/apicalls/custom/login/login"; +import { loginSelectOccupant } from "@/apifetchers/custom/login/login"; import { NextResponse } from "next/server"; const loginSchemaOccupant = z.object({ - build_living_space_uu_id: z.string(), + uuid: z.string(), }); export async function POST(req: Request): Promise { try { const headers = req.headers; - console.log("headers", Object.entries(headers)); const body = await req.json(); const dataValidated = { - build_living_space_uu_id: body.build_living_space_uu_id, + uuid: body.uuid, }; const validatedLoginBody = loginSchemaOccupant.safeParse(body); if (!validatedLoginBody.success) { diff --git a/web_services/client_frontend/src/app/api/utils/apiOperations.ts b/web_services/client_frontend/src/app/api/utils/apiOperations.ts index 69a90fb..01c55d7 100644 --- a/web_services/client_frontend/src/app/api/utils/apiOperations.ts +++ b/web_services/client_frontend/src/app/api/utils/apiOperations.ts @@ -63,7 +63,6 @@ export async function handleCreateOperation( } if (createFunction) { - console.log("Body:", body); const result = await createFunction(body); return createResponse(result); } @@ -90,7 +89,6 @@ export async function handleUpdateOperation( return errorResponse("UUID not found", 400); } if (updateFunction) { - console.log("Body:", body); const result = await updateFunction(body, uuid); return updateResponse(result); } @@ -136,12 +134,10 @@ export function createCreateHandler( createFunction?: CreateFunction, requiredFields: string[] = [] ) { - console.log("Required fields:", requiredFields); // This handler only takes the body parameter, not the request return withErrorHandling((body: any) => { // Ensure we're only passing the actual body data to the create function if (body && typeof body === 'object' && body.body) { - console.log("Extracting body from request body"); return handleCreateOperation(body.body, createFunction, requiredFields); } return handleCreateOperation(body, createFunction, requiredFields); diff --git a/web_services/client_frontend/src/components/custom/content/PageToBeChildrendMulti.tsx b/web_services/client_frontend/src/components/custom/content/PageToBeChildrendMulti.tsx index 092d2c8..49e0e57 100644 --- a/web_services/client_frontend/src/components/custom/content/PageToBeChildrendMulti.tsx +++ b/web_services/client_frontend/src/components/custom/content/PageToBeChildrendMulti.tsx @@ -2,10 +2,11 @@ import { ContentProps } from "@/validations/mutual/dashboard/props"; import { resolveWhichPageToRenderMulti } from "@/pages/resolver/resolver"; import ContentToRenderNoPage from "@/pages/mutual/noContent/page"; -const PageToBeChildrendMulti: React.FC = async ({ lang, translations, activePageUrl, mode }) => { + +const PageToBeChildrendMulti: React.FC = async ({ lang, activePageUrl, mode }) => { const ApplicationToRender = await resolveWhichPageToRenderMulti({ activePageUrl }) if (!ApplicationToRender) return - return + return } export default PageToBeChildrendMulti diff --git a/web_services/client_frontend/src/components/custom/content/component.tsx b/web_services/client_frontend/src/components/custom/content/component.tsx index 144b836..d4f9ba5 100644 --- a/web_services/client_frontend/src/components/custom/content/component.tsx +++ b/web_services/client_frontend/src/components/custom/content/component.tsx @@ -2,18 +2,23 @@ import { FC, Suspense } from "react"; import { ContentProps, ModeTypes, ModeTypesList } from "@/validations/mutual/dashboard/props"; import LoadingContent from "@/components/mutual/loader/component"; -import PageToBeChildrendSingle from "./PageToBeChildrendSingle"; import PageToBeChildrendMulti from "./PageToBeChildrendMulti"; -const ContentComponent: FC = async ({ lang, translations, activePageUrl, isMulti, mode }) => { +// const ContentComponent: FC = async ({ lang, translations, activePageUrl, isMulti, mode }) => { +// const modeFromQuery = ModeTypesList.includes(mode || '') ? mode : 'shortList' +// const renderProps = { lang, translations, activePageUrl, mode: modeFromQuery as ModeTypes } +// const PageToBeChildrend = isMulti ? PageToBeChildrendMulti : PageToBeChildrendSingle +// const loadingContent = +// const classNameDiv = "fixed top-24 left-80 right-0 py-10 px-15 border-emerald-150 border-l-2 overflow-y-auto h-[calc(100vh-64px)]" +// return
+// }; + +const ContentComponent: FC = async ({ lang, activePageUrl, mode }) => { const modeFromQuery = ModeTypesList.includes(mode || '') ? mode : 'shortList' - const renderProps = { lang, translations, activePageUrl, mode: modeFromQuery as ModeTypes } - const PageToBeChildrend = isMulti ? PageToBeChildrendMulti : PageToBeChildrendSingle + const renderProps = { lang, activePageUrl, mode: modeFromQuery as ModeTypes } const loadingContent = const classNameDiv = "fixed top-24 left-80 right-0 py-10 px-15 border-emerald-150 border-l-2 overflow-y-auto h-[calc(100vh-64px)]" - return ( -
- ); + return
}; export default ContentComponent; diff --git a/web_services/client_frontend/src/components/custom/footer/component.tsx b/web_services/client_frontend/src/components/custom/footer/component.tsx index ee6bf0e..db86e4f 100644 --- a/web_services/client_frontend/src/components/custom/footer/component.tsx +++ b/web_services/client_frontend/src/components/custom/footer/component.tsx @@ -1,12 +1,23 @@ 'use server'; import { FC } from "react"; import { langGetKey } from "@/lib/langGet"; -import { FooterProps } from "@/validations/mutual/dashboard/props"; +import { AllProps } from "@/validations/mutual/dashboard/props"; -const FooterComponent: FC = ({ translations }) => { +const translations = { + en: { + footer: "footer", + page: "page" + }, + tr: { + footer: "footer", + page: "sayfa" + } +} + +const FooterComponent: FC = ({ lang, activePageUrl, prefix, mode }) => { return (
-

{langGetKey(translations, "footer")}: {langGetKey(translations, "page")}

+

{langGetKey(translations[lang], "footer")}: {langGetKey(translations[lang], "page")}

); }; diff --git a/web_services/client_frontend/src/components/custom/header/component.tsx b/web_services/client_frontend/src/components/custom/header/component.tsx index 6c484a0..ac384d2 100644 --- a/web_services/client_frontend/src/components/custom/header/component.tsx +++ b/web_services/client_frontend/src/components/custom/header/component.tsx @@ -1,17 +1,35 @@ -'use server'; -import { FC } from "react"; -import { HeaderProps } from "@/validations/mutual/dashboard/props"; +'use client'; +import { FC, useState, useEffect } from "react"; +import { AllProps } from "@/validations/mutual/dashboard/props"; import LanguageSelectionComponent from "@/components/mutual/languageSelection/component"; import { langGetKey } from "@/lib/langGet"; +import { checkContextPageOnline } from "@/components/mutual/context/online/context"; -const HeaderComponent: FC = ({ translations, lang, activePageUrl, prefix }) => { +const translations = { + en: { + selectedPage: "selectedPage", + page: "page" + }, + tr: { + selectedPage: "seçiliSayfa", + page: "sayfa" + } +} +const HeaderComponent: FC = ({ lang, activePageUrl, prefix, mode }) => { + const [online, setOnline] = useState(false); + useEffect(() => { + checkContextPageOnline().then((online) => { + setOnline(online); + }); + }, []); return (
-

{langGetKey(translations, 'selectedPage')} :

-

{langGetKey(translations, 'page')}

+

{langGetKey(translations[lang], 'selectedPage')} :

+

{langGetKey(translations[lang], 'page')}

+
{JSON.stringify(online)}
); diff --git a/web_services/client_frontend/src/components/custom/menu/component.tsx b/web_services/client_frontend/src/components/custom/menu/component.tsx index 27d5351..c8fd70c 100644 --- a/web_services/client_frontend/src/components/custom/menu/component.tsx +++ b/web_services/client_frontend/src/components/custom/menu/component.tsx @@ -1,11 +1,12 @@ 'use client'; import { FC, useState, useEffect } from "react"; -import { MenuProps } from "@/validations/mutual/dashboard/props"; -import { langGetKey } from "@/lib/langGet"; +import { AllProps } from "@/validations/mutual/dashboard/props"; import { parseURlFormString } from "@/lib/menuGet"; +import { menuTranslation } from "@/languages/mutual/menu" import FirstLayerDropdown from "./firstLayerComponent"; import SecondLayerDropdown from "./secondLayerComponent"; import ThirdLayerDropdown from "./thirdLayerComponent"; +import { checkContextPageMenu } from "@/components/mutual/context/menu/context"; // Define types for menu structure type ThirdLayerItem = Record; @@ -13,146 +14,109 @@ type SecondLayerItems = Record; type FirstLayerItems = Record; type MenuStructure = FirstLayerItems; -const MenuComponent: FC = ({ lang, menuItems, menuTranslationsFlatten, activePageUrl }) => { - // State for tracking expanded menu items +// Helper function to get translation for a URL path +const getMenuTranslation = (translations: any, urlPath: string) => { + if (translations[urlPath]) { + return translations[urlPath]; + } + const cleanPath = urlPath.startsWith('/') ? urlPath.substring(1) : urlPath; + if (translations[cleanPath]) { + return translations[cleanPath]; + } + const pathWithSlash = urlPath.startsWith('/') ? urlPath : `/${urlPath}`; + if (translations[pathWithSlash]) { + return translations[pathWithSlash]; + } + const keys = Object.keys(translations); + for (const key of keys) { + const cleanKey = key.startsWith('/') ? key.substring(1) : key; + const cleanUrlPath = urlPath.startsWith('/') ? urlPath.substring(1) : urlPath; + + if (cleanUrlPath.includes(cleanKey) || cleanKey.includes(cleanUrlPath)) { + return translations[key]; + } + } + const parts = urlPath.split('/'); + return parts[parts.length - 1] || urlPath; +}; + +const MenuComponent: FC = ({ lang, activePageUrl, prefix, mode }) => { + const [availableApplications, setAvailableApplications] = useState([]); + useEffect(() => { + checkContextPageMenu().then((apps) => { + console.log('apps', apps); + setAvailableApplications(apps?.selectionList || []); + }); + }, []); + const [expandedFirstLayer, setExpandedFirstLayer] = useState(null); const [expandedSecondLayer, setExpandedSecondLayer] = useState(null); const [menuStructure, setMenuStructure] = useState({}); - // Parse active URL to determine which menu items should be active + const menuTranslationWLang = menuTranslation[lang]; const activePathLayers = parseURlFormString(activePageUrl).data; const activeFirstLayer = activePathLayers[0] || null; const activeSecondLayer = activePathLayers[1] || null; - const activeThirdLayer = activePathLayers[2] || null; + const activeThirdLayer = activePathLayers.slice(2, activePathLayers.length).join("/"); - // Initialize expanded state based on active path useEffect(() => { - if (activeFirstLayer) { - setExpandedFirstLayer(activeFirstLayer); - if (activeSecondLayer) { - setExpandedSecondLayer(activeSecondLayer); + const newMenuStructure: MenuStructure = {}; + availableApplications.forEach((appPath: string) => { + const cleanPath = appPath.startsWith('/') ? appPath.substring(1) : appPath; + const pathParts = cleanPath.split('/'); + if (pathParts.length >= 3) { + const firstLayer = pathParts[0]; + const secondLayer = pathParts[1]; + const thirdLayer = pathParts.slice(2).join('/'); + if (!newMenuStructure[firstLayer]) { newMenuStructure[firstLayer] = {} } + if (!newMenuStructure[firstLayer][secondLayer]) { newMenuStructure[firstLayer][secondLayer] = {} } + newMenuStructure[firstLayer][secondLayer][thirdLayer] = true; } - } - }, [activeFirstLayer, activeSecondLayer]); - - // Process menu items into a hierarchical structure - useEffect(() => { - const processedStructure: MenuStructure = {}; - - Object.entries(menuItems).forEach(([path, _]: [string, any]) => { - const layers = parseURlFormString(path).data; - const firstLayer = layers[0]; - const secondLayer = layers[1]; - const thirdLayer = layers[2]; - - // Create first layer if it doesn't exist - if (!processedStructure[firstLayer]) { - processedStructure[firstLayer] = {}; - } - - // Create second layer if it doesn't exist - if (!processedStructure[firstLayer][secondLayer]) { - processedStructure[firstLayer][secondLayer] = {}; - } - - // Add third layer - processedStructure[firstLayer][secondLayer][thirdLayer] = {}; }); + setMenuStructure(newMenuStructure); + }, [availableApplications]); - setMenuStructure(processedStructure); - }, [menuItems]); + useEffect(() => { if (activeFirstLayer) { setExpandedFirstLayer(activeFirstLayer); if (activeSecondLayer) { setExpandedSecondLayer(activeSecondLayer) } } }, [activeFirstLayer, activeSecondLayer]); - // Handle click on first layer menu item - const handleFirstLayerClick = (key: string) => { - if (expandedFirstLayer === key) { - // If already expanded, collapse it - setExpandedFirstLayer(null); - setExpandedSecondLayer(null); - } else { - // Otherwise expand it - setExpandedFirstLayer(key); - setExpandedSecondLayer(null); - } - }; + const handleFirstLayerClick = (key: string) => { if (expandedFirstLayer === key) { setExpandedFirstLayer(null); setExpandedSecondLayer(null) } else { setExpandedFirstLayer(key); setExpandedSecondLayer(null) } }; + const handleSecondLayerClick = (key: string) => { if (expandedSecondLayer === key) { setExpandedSecondLayer(null) } else { setExpandedSecondLayer(key) } }; - // Handle click on second layer menu item - const handleSecondLayerClick = (key: string) => { - if (expandedSecondLayer === key) { - // If already expanded, collapse it - setExpandedSecondLayer(null); - } else { - // Otherwise expand it - setExpandedSecondLayer(key); - } - }; - - // Render third layer menu items const renderThirdLayerItems = (firstLayerKey: string, secondLayerKey: string, thirdLayerItems: ThirdLayerItem) => { const baseUrl = `/${firstLayerKey}/${secondLayerKey}`; - return Object.keys(thirdLayerItems).map(thirdLayerKey => { - const isActive = - activeFirstLayer === firstLayerKey && - activeSecondLayer === secondLayerKey && - activeThirdLayer === thirdLayerKey; - + const isActive = activeFirstLayer === firstLayerKey && activeSecondLayer === secondLayerKey && activeThirdLayer === thirdLayerKey; + const mergeUrl = `${baseUrl}/${thirdLayerKey}`; const url = `/${lang}${baseUrl}/${thirdLayerKey}`; - - return ( -
- -
- ); + console.log('mergeUrl', mergeUrl); + return
}); }; - // Render second layer menu items const renderSecondLayerItems = (firstLayerKey: string, secondLayerItems: SecondLayerItems) => { return Object.entries(secondLayerItems).map(([secondLayerKey, thirdLayerItems]) => { const isActive = activeFirstLayer === firstLayerKey && activeSecondLayer === secondLayerKey; const isExpanded = expandedSecondLayer === secondLayerKey; - + const mergeUrl = `/${firstLayerKey}/${secondLayerKey}`; + console.log('mergeUrl', mergeUrl); return (
- handleSecondLayerClick(secondLayerKey)} - /> - {isExpanded && ( -
- {renderThirdLayerItems(firstLayerKey, secondLayerKey, thirdLayerItems)} -
- )} + handleSecondLayerClick(secondLayerKey)} /> + {isExpanded && (
{renderThirdLayerItems(firstLayerKey, secondLayerKey, thirdLayerItems)}
)}
); }); }; - // Render first layer menu items const renderFirstLayerItems = () => { return Object.entries(menuStructure).map(([firstLayerKey, secondLayerItems]) => { const isActive = activeFirstLayer === firstLayerKey; const isExpanded = expandedFirstLayer === firstLayerKey; - + const mergeUrl = `/${firstLayerKey}`; + console.log('mergeUrl', mergeUrl); return (
- handleFirstLayerClick(firstLayerKey)} - /> - {isExpanded && ( -
- {renderSecondLayerItems(firstLayerKey, secondLayerItems)} -
- )} + handleFirstLayerClick(firstLayerKey)} /> + {isExpanded && (
{renderSecondLayerItems(firstLayerKey, secondLayerItems)}
)}
); }); diff --git a/web_services/client_frontend/src/components/mutual/context/config/context.ts b/web_services/client_frontend/src/components/mutual/context/config/context.ts new file mode 100644 index 0000000..93bff8a --- /dev/null +++ b/web_services/client_frontend/src/components/mutual/context/config/context.ts @@ -0,0 +1,35 @@ +import { ClientPageConfig } from "@/types/mutual/context/validations"; +import { API_BASE_URL } from "@/config/config"; + +async function checkContextPageConfig(): Promise { + const result = await fetch(`${API_BASE_URL}/context/page/config`, { + method: "GET", + headers: { "Content-Type": "application/json" }, + }); + try { + const data = await result.json(); + return data; + } catch (error) { + throw new Error("No data is found"); + } +} + +async function setContextPageConfig({ + pageConfig, +}: { + pageConfig: ClientPageConfig; +}) { + const result = await fetch(`${API_BASE_URL}/context/page/config`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(pageConfig), + }); + try { + const data = await result.json(); + return data; + } catch (error) { + throw new Error("No data is set"); + } +} + +export { checkContextPageConfig, setContextPageConfig }; diff --git a/web_services/client_frontend/src/components/mutual/context/menu/context.ts b/web_services/client_frontend/src/components/mutual/context/menu/context.ts new file mode 100644 index 0000000..d27392a --- /dev/null +++ b/web_services/client_frontend/src/components/mutual/context/menu/context.ts @@ -0,0 +1,34 @@ +import { ClientMenu } from "@/types/mutual/context/validations"; +import { API_BASE_URL } from "@/config/config"; + +async function checkContextPageMenu() { + const result = await fetch(`${API_BASE_URL}/context/page/menu`, { + method: "GET", + headers: { "Content-Type": "application/json" }, + }); + try { + const data = await result.json(); + console.log("checkContextPageMenu ", data); + if (data.status == 200) return data.data; + } catch (error) { + console.log(error); + throw new Error("No data is found"); + } +} + +async function setContextPageMenu(setMenu: ClientMenu) { + const result = await fetch(`${API_BASE_URL}/context/page/menu`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(setMenu), + }); + try { + const data = await result.json(); + return data; + } catch (error) { + console.log(error); + throw new Error("No data is set"); + } +} + +export { checkContextPageMenu, setContextPageMenu }; diff --git a/web_services/client_frontend/src/components/mutual/context/online/context.ts b/web_services/client_frontend/src/components/mutual/context/online/context.ts new file mode 100644 index 0000000..169ecb8 --- /dev/null +++ b/web_services/client_frontend/src/components/mutual/context/online/context.ts @@ -0,0 +1,29 @@ +import { ClientOnline } from "@/types/mutual/context/validations"; +import { API_BASE_URL } from "@/config/config"; + +async function checkContextPageOnline() { + const result = await fetch(`${API_BASE_URL}/context/page/online`, { + method: "GET", + headers: { "Content-Type": "application/json" }, + }); + try { + const data = await result.json(); + if (data.status == 200) return data.data; + } catch (error) {} + return null; +} + +async function setContextPageOnline(setOnline: ClientOnline) { + const result = await fetch(`${API_BASE_URL}/context/page/online`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(setOnline), + }); + try { + const data = await result.json(); + if (data.status == 200) return data.data; + } catch (error) {} + return null; +} + +export { checkContextPageOnline, setContextPageOnline }; diff --git a/web_services/client_frontend/src/components/mutual/context/selection/context.ts b/web_services/client_frontend/src/components/mutual/context/selection/context.ts new file mode 100644 index 0000000..719978e --- /dev/null +++ b/web_services/client_frontend/src/components/mutual/context/selection/context.ts @@ -0,0 +1,37 @@ +import { ClientSelection } from "@/types/mutual/context/validations"; +import { API_BASE_URL } from "@/config/config"; + +async function checkContextDashSelection() { + try { + const result = await fetch(`${API_BASE_URL}/context/dash/selection`, { + method: "GET", + headers: { "Content-Type": "application/json" }, + }); + + const data = await result.json(); + if (data.status === 200) return data.data; + } catch (error) {} + return null; +} + +async function setContextDashUserSelection({ + userSet, +}: { + userSet: ClientSelection; +}) { + try { + const result = await fetch(`${API_BASE_URL}/context/dash/selection`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(userSet), + }); + + const data = await result.json(); + if (data.status === 200) return data.data; + } catch (error) { + console.error("Error setting dash selection:", error); + } + return null; +} + +export { checkContextDashSelection, setContextDashUserSelection }; diff --git a/web_services/client_frontend/src/components/mutual/context/user/context.ts b/web_services/client_frontend/src/components/mutual/context/user/context.ts new file mode 100644 index 0000000..307d9e4 --- /dev/null +++ b/web_services/client_frontend/src/components/mutual/context/user/context.ts @@ -0,0 +1,33 @@ +import { ClientUser } from "@/types/mutual/context/validations"; +import { API_BASE_URL } from "@/config/config"; + +async function checkContextDashUserInfo(): Promise { + const result = await fetch(`${API_BASE_URL}/context/dash/user`, { + method: "GET", + headers: { "Content-Type": "application/json" }, + }); + try { + const data = await result.json(); + return data; + } catch (error) { + console.log(error); + throw new Error("No data is found"); + } +} + +async function setContextDashUserInfo({ userSet }: { userSet: ClientUser }) { + const result = await fetch(`${API_BASE_URL}/context/dash/user`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(userSet), + }); + try { + const data = await result.json(); + return data; + } catch (error) { + console.log(error); + throw new Error("No data is set"); + } +} + +export { checkContextDashUserInfo, setContextDashUserInfo }; diff --git a/web_services/client_frontend/src/components/mutual/languageSelection/component.tsx b/web_services/client_frontend/src/components/mutual/languageSelection/component.tsx index 1a83e57..abd0bd0 100644 --- a/web_services/client_frontend/src/components/mutual/languageSelection/component.tsx +++ b/web_services/client_frontend/src/components/mutual/languageSelection/component.tsx @@ -1,31 +1,25 @@ -'use server'; -import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent } from "@/components/mutual/shadcnui/dropdown-menu"; +'use client'; +import { useState, useEffect } from "react"; + +import { DropdownMenu, DropdownMenuTrigger } from "@/components/mutual/shadcnui/dropdown-menu"; import { Button } from "@/components/mutual/shadcnui/button"; import { languageSelectionTranslation } from "@/languages/mutual/languageSelection"; import { langGetKey, langGet } from "@/lib/langGet"; import { LanguageTypes } from "@/validations/mutual/language/validations"; - +import { checkContextPageOnline, setContextPageOnline } from "@/components/mutual/context/online/context"; import LanguageSelectionItem from "./languageItem"; const LanguageSelectionComponent: React.FC<{ lang: LanguageTypes, activePage: string, prefix: string }> = ({ lang, activePage, prefix }) => { const translations = langGet(lang, languageSelectionTranslation); - const getPageWithLocale = (locale: LanguageTypes): string => { return `${prefix}/${locale}/${activePage}` } - - const englishButtonProps = { - activeLang: lang, - buttonsLang: "en", - refUrl: getPageWithLocale("en"), - innerText: langGetKey(translations, "english") - } - const turkishButtonProps = { - activeLang: lang, - buttonsLang: "tr", - refUrl: getPageWithLocale("tr"), - innerText: langGetKey(translations, "turkish") - } + const getPageWithLocale = (locale: LanguageTypes): string => { return `${prefix}/${activePage}` } + const [online, setOnline] = useState({}); + useEffect(() => { const online = checkContextPageOnline(); setOnline({ ...online, lang: lang }) }, []); + const englishButtonProps = { activeLang: lang, buttonsLang: "en", refUrl: getPageWithLocale("en"), innerText: langGetKey(translations, "english") } + const turkishButtonProps = { activeLang: lang, buttonsLang: "tr", refUrl: getPageWithLocale("tr"), innerText: langGetKey(translations, "turkish") } return (
+
{JSON.stringify(online)}
diff --git a/web_services/client_frontend/src/components/mutual/languageSelection/languageItem.tsx b/web_services/client_frontend/src/components/mutual/languageSelection/languageItem.tsx index 9c44293..4641006 100644 --- a/web_services/client_frontend/src/components/mutual/languageSelection/languageItem.tsx +++ b/web_services/client_frontend/src/components/mutual/languageSelection/languageItem.tsx @@ -3,10 +3,21 @@ import { useState, FC } from "react"; import { DropdownMenuContent, DropdownMenuLabel } from "@/components/mutual/shadcnui/dropdown-menu"; import Link from "next/link"; import LoadingContent from "@/components/mutual/loader/component"; +import { setContextPageOnline, checkContextPageOnline } from "@/components/mutual/context/online/context"; -const RenderLinkComponent: FC<{ refUrl: string, innerText: string, setisL: (isLoading: boolean) => void }> = ({ refUrl, innerText, setisL }) => { +const RenderLinkComponent: FC<{ refUrl: string, innerText: string, setisL: (isLoading: boolean) => void, buttonsLang: string }> = ( + { refUrl, innerText, setisL, buttonsLang }) => { + const setOnline = async () => { + setisL(true); + const oldOnline = await checkContextPageOnline(); + await setContextPageOnline({ + ...oldOnline, + lang: buttonsLang, + }); + setisL(false); + } return ( - setisL(true)}> + { setOnline() }}> {innerText} @@ -29,7 +40,7 @@ const LanguageSelectionItem: React.FC<{ }> = ({ activeLang, buttonsLang, refUrl, innerText }) => { const [isL, setisL] = useState(false); const isC = buttonsLang !== activeLang - const RenderLinkProp = { refUrl, innerText, setisL } + const RenderLinkProp = { refUrl, innerText, setisL, buttonsLang } return ( <>{isC && <>{isL ? : }} ) diff --git a/web_services/client_frontend/src/languages/custom/index.ts b/web_services/client_frontend/src/languages/custom/index.ts index 854fd2f..f1ea90c 100644 --- a/web_services/client_frontend/src/languages/custom/index.ts +++ b/web_services/client_frontend/src/languages/custom/index.ts @@ -1,14 +1,24 @@ import { LanguageTypes } from "@/validations/mutual/language/validations"; import { DynamicPage } from "@/validations/mutual/menu/menu"; import { managementAccountTenantMain } from "./management/account/tenantSomething/index"; -import { managementAccountTenantMainSecond } from "./management/account/tenantSomethingSecond/index"; -import { buildingPartsTenantSomething } from "./building/parts/tenantSomething/index"; +// import { managementAccountTenantMainSecond } from "./management/account/tenantSomethingSecond/index"; +// import { buildingPartsTenantSomething } from "./building/parts/tenantSomething/index"; const dynamicPagesIndex: Record> = { - "main/pages/user/dashboard": managementAccountTenantMain, - "management/account/tenant/something": managementAccountTenantMain, - "management/account/tenant/somethingSecond": managementAccountTenantMainSecond, - "building/parts/tenant/something": buildingPartsTenantSomething, + "/main/pages/user/dashboard": managementAccountTenantMain, + "/definitions/identifications/people": managementAccountTenantMain, + "/definitions/identifications/users": managementAccountTenantMain, + "/definitions/building/parts": managementAccountTenantMain, + "/definitions/building/areas": managementAccountTenantMain, + "/building/accounts/managment/accounts": managementAccountTenantMain, + "/building/accounts/managment/budgets": managementAccountTenantMain, + "/building/accounts/parts/accounts": managementAccountTenantMain, + "/building/accounts/parts/budgets": managementAccountTenantMain, + "/building/meetings/regular/actions": managementAccountTenantMain, + "/building/meetings/regular/accounts": managementAccountTenantMain, + "/building/meetings/ergunt/actions": managementAccountTenantMain, + "/building/meetings/ergunt/accounts": managementAccountTenantMain, + "/building/meetings/invited/attendance": managementAccountTenantMain, }; export { dynamicPagesIndex }; diff --git a/web_services/client_frontend/src/languages/mutual/menu/english.ts b/web_services/client_frontend/src/languages/mutual/menu/english.ts index 48a9d4e..d9b00dd 100644 --- a/web_services/client_frontend/src/languages/mutual/menu/english.ts +++ b/web_services/client_frontend/src/languages/mutual/menu/english.ts @@ -1,11 +1,27 @@ const menuTranslationEn = { - "/management/account/something/something/something": "Account Third Layer", - "/management/account": "Account Second Layer", - "/management": "Management First Layer", -}; -const menuIndex = [ - "/management/account/something/something/something", - "/building/parts/something/something/something", -]; + "/definitions": "Definitions", + "/definitions/identifications": "Identifications", + "/definitions/identifications/people": "People", + "/definitions/identifications/users": "Users", -export { menuTranslationEn, menuIndex }; + "/definitions/building": "Building", + "/definitions/building/parts": "Build Parts", + "/definitions/building/areas": "Building Areas", + + "/building": "Building", + "/building/accounts": "Account Actions", + "/building/accounts/managment/accounts": "Management Accounts", + "/building/accounts/managment/budgets": "Management Budgets", + "/building/accounts/parts/accounts": "Parts Accounts", + "/building/accounts/parts/budgets": "Parts Budgets", + + "/building/meetings": "Meetings", + "/building/meetings/regular/actions": "Regular Meeting Actions", + "/building/meetings/regular/accounts": "Regular Meeting Accounts", + "/building/meetings/ergunt/actions": "Ergunt Meeting Actions", + "/building/meetings/ergunt/accounts": "Ergunt Meeting Accounts", + "/building/meetings/invited/attendance": "Meeting Invited Attendance", +}; + +export { menuTranslationEn }; +// export { menuTranslationEn, menuIndex }; diff --git a/web_services/client_frontend/src/languages/mutual/menu/turkish.ts b/web_services/client_frontend/src/languages/mutual/menu/turkish.ts index 181ce69..d4ec7cf 100644 --- a/web_services/client_frontend/src/languages/mutual/menu/turkish.ts +++ b/web_services/client_frontend/src/languages/mutual/menu/turkish.ts @@ -1,3 +1,26 @@ -const menuTranslationTr = {}; +const menuTranslationTr = { + "/definitions": "Tanımlamalar", + "/definitions/identifications": "Tanımlamalar", + "/definitions/identifications/people": "Kişiler", + "/definitions/identifications/users": "Kullanıcılar", + + "/definitions/building": "Bina", + "/definitions/building/parts": "Daireler", + "/definitions/building/areas": "Bina Alanları", + + "/building": "Bina", + "/building/accounts": "Account Eylemleri", + "/building/accounts/managment/accounts": "Bina Hesapları", + "/building/accounts/managment/budgets": "Bina Bütçesi", + "/building/accounts/parts/accounts": "Daire Hesapları", + "/building/accounts/parts/budgets": "Daire Bütçesi", + + "/building/meetings": "Toplantılar", + "/building/meetings/regular/actions": "Düzenli Toplantı Eylemleri", + "/building/meetings/regular/accounts": "Düzenli Toplantı Accounts", + "/building/meetings/ergunt/actions": "Ergunt Toplantı Eylemleri", + "/building/meetings/ergunt/accounts": "Ergunt Toplantı Accounts", + "/building/meetings/invited/attendance": "Toplantı Davetli Katılımlar", +}; export { menuTranslationTr }; diff --git a/web_services/client_frontend/src/layouts/dashboard/layout.tsx b/web_services/client_frontend/src/layouts/dashboard/layout.tsx index 2e96722..6a3e5c7 100644 --- a/web_services/client_frontend/src/layouts/dashboard/layout.tsx +++ b/web_services/client_frontend/src/layouts/dashboard/layout.tsx @@ -1,8 +1,5 @@ 'use server'; import { FC } from "react"; -import { joinPageUrlFromLayersArray, retrieveLayersOfUrlFromParams } from "@/lib/menuGet"; -import { dynamicPagesIndex } from "@/languages/custom"; -import { dynamicPageMenuWithLayersGet, dynamicRetrieveMenuFlattenGet, langDynamicPagesGet, langGet } from "@/lib/langGet"; import { DashboardLayoutProps, ModeTypes } from "@/validations/mutual/dashboard/props"; import HeaderComponent from "@/components/custom/header/component"; @@ -11,26 +8,18 @@ import ContentComponent from "@/components/custom/content/component"; import FooterComponent from "@/components/custom/footer/component"; const DashboardLayout: FC = async ({ params, searchParams, lang }) => { - const layersItems = retrieveLayersOfUrlFromParams(params.page); - const activePageUrl = joinPageUrlFromLayersArray(layersItems.data); const mode = (searchParams?.mode as ModeTypes) || 'shortList'; - - const menuItems = await dynamicPageMenuWithLayersGet(lang); - const translations = langGet(lang, langDynamicPagesGet(activePageUrl, dynamicPagesIndex)); - const menuTranslationsFlatten = dynamicRetrieveMenuFlattenGet(menuItems); - - const headerProps = { translations: translations.header, lang, activePageUrl, prefix: "/panel" } - const menuProps = { lang, activePageUrl, menuTranslationsFlatten, menuItems } - const contentProps = { translations: translations.content, lang, activePageUrl, mode, isMulti: true } + const activePageUrl = `/${params.page?.join('/')}`; + const allProps = { lang, activePageUrl, mode, prefix: "/panel" } return (
- - - - + + + +
); } -export { DashboardLayout }; \ No newline at end of file +export { DashboardLayout }; diff --git a/web_services/client_frontend/src/pages/multi/index.ts b/web_services/client_frontend/src/pages/multi/index.ts index a02f952..d66aef4 100644 --- a/web_services/client_frontend/src/pages/multi/index.ts +++ b/web_services/client_frontend/src/pages/multi/index.ts @@ -1,21 +1,21 @@ import { ContentProps } from "@/validations/mutual/dashboard/props"; import superUserTenantSomething from "./management/account/tenantSomething/page"; -import superUserTenantSomethingSecond from "./management/account/tenantSomethingSecond/page"; -import superUserBuildingPartsTenantSomething from "./building/parts/tenantSomething/page"; const pageIndexMulti: Record>> = { - "main/pages/user/dashboard": { - superUserTenantSomething: superUserTenantSomething, - }, - "management/account/tenant/something": { - superUserTenantSomething: superUserTenantSomething, - }, - "management/account/tenant/somethingSecond": { - superUserTenantSomething: superUserTenantSomethingSecond, - }, - "building/parts/tenant/something": { - superUserTenantSomething: superUserBuildingPartsTenantSomething, - }, + "/main/pages/user/dashboard": { superUserTenantSomething }, + "/definitions/identifications/people": { superUserTenantSomething }, + "/definitions/identifications/users": { superUserTenantSomething }, + "/definitions/building/parts": { superUserTenantSomething }, + "/definitions/building/areas": { superUserTenantSomething }, + "/building/accounts/managment/accounts": { superUserTenantSomething }, + "/building/accounts/managment/budgets": { superUserTenantSomething }, + "/building/accounts/parts/accounts": { superUserTenantSomething }, + "/building/accounts/parts/budgets": { superUserTenantSomething }, + "/building/meetings/regular/actions": { superUserTenantSomething }, + "/building/meetings/regular/accounts": { superUserTenantSomething }, + "/building/meetings/ergunt/actions": { superUserTenantSomething }, + "/building/meetings/ergunt/accounts": { superUserTenantSomething }, + "/building/meetings/invited/attendance": { superUserTenantSomething }, }; export default pageIndexMulti; diff --git a/web_services/client_frontend/src/types/mutual/context/validations.ts b/web_services/client_frontend/src/types/mutual/context/validations.ts new file mode 100644 index 0000000..2efaea9 --- /dev/null +++ b/web_services/client_frontend/src/types/mutual/context/validations.ts @@ -0,0 +1,187 @@ +// From Redis objects + +interface ClientOnline { + lastLogin: Date; + lastLogout: Date; + lastAction: Date; + lastPage: string; + userType: string; + lang: string; + timezone: string; +} + +interface ClientPageConfig { + mode: string; + textFont: number; + theme: string; +} + +interface ClientHeader { + header: any[]; + activeDomain: string; + listOfDomains: string[]; + connections: any[]; +} + +interface ClientMenu { + selectionList: string[]; + activeSelection: string; +} + +interface ClientSelection { + selectionList: any[]; + activeSelection: Record; +} + +interface ClientUser { + uuid: string; + avatar: string; + email: string; + phone_number: string; + user_tag: string; + password_expiry_begins: string; + person: { + uuid: string; + firstname: string; + surname: string; + middle_name: string; + sex_code: string; + person_tag: string; + country_code: string; + birth_date: string; + }; +} + +interface ClientSettings { + lastOnline: Date; + token: string; +} + +interface LinkList { + linkList: any[]; +} + +interface ClientRedisToken { + online: ClientOnline; + pageConfig: ClientPageConfig; + menu: ClientMenu; + header: ClientHeader; + selection: ClientSelection; + user: ClientUser; + settings: ClientSettings; + chatRoom: LinkList; + notifications: LinkList; + messages: LinkList; +} + +const defaultClientOnline: ClientOnline = { + lastLogin: new Date(), + lastLogout: new Date(), + lastAction: new Date(), + lastPage: "/dashboard", + userType: "employee", + lang: "tr", + timezone: "GMT+3", +}; + +const defaultClientPageConfig: ClientPageConfig = { + mode: "light", + textFont: 14, + theme: "default", +}; + +const defaultClientMenu: ClientMenu = { + selectionList: [], + activeSelection: "/dashboard", +}; + +const defaultClientHeader: ClientHeader = { + header: [], + activeDomain: "", + listOfDomains: [], + connections: [], +}; + +const defaultClientSelection: ClientSelection = { + selectionList: [], + activeSelection: {}, +}; + +const defaultClientUser: ClientUser = { + uuid: "", + avatar: "", + email: "", + phone_number: "", + user_tag: "", + password_expiry_begins: new Date().toISOString(), + person: { + uuid: "", + firstname: "", + surname: "", + middle_name: "", + sex_code: "", + person_tag: "", + country_code: "", + birth_date: "", + }, +}; + +const defaultClientSettings: ClientSettings = { + lastOnline: new Date(), + token: "", +}; + +const defaultLinkList: LinkList = { + linkList: [], +}; + +const defaultClientRedisToken: ClientRedisToken = { + online: defaultClientOnline, + pageConfig: defaultClientPageConfig, + menu: defaultClientMenu, + header: defaultClientHeader, + selection: defaultClientSelection, + user: defaultClientUser, + settings: defaultClientSettings, + chatRoom: defaultLinkList, + notifications: defaultLinkList, + messages: defaultLinkList, +}; + +const generateRedisKey = (userType: string, uuId: string) => { + const userTypeToUpper = userType.toUpperCase(); + if (!userTypeToUpper || !uuId) throw new Error("Invalid user type or uuId"); + return `CLIENT:${userTypeToUpper}:${uuId}`; +}; + +const readRedisKey = (redisKey: string) => { + if (redisKey.split(":").length !== 2) throw new Error("Invalid redis key"); + const userTypeToUpper = redisKey.split(":")[1]; + const uuId = redisKey.split(":")[2]; + if (!userTypeToUpper || !uuId) throw new Error("Invalid user type or uuId"); + return { userType: userTypeToUpper.toLowerCase(), uuId }; +}; + +export { + defaultClientOnline, + defaultClientPageConfig, + defaultClientMenu, + defaultClientHeader, + defaultClientSelection, + defaultClientUser, + defaultClientSettings, + defaultLinkList, + defaultClientRedisToken, +}; +export type { + ClientOnline, + ClientPageConfig, + ClientMenu, + ClientHeader, + ClientSelection, + ClientUser, + ClientSettings, + LinkList, + ClientRedisToken, +}; +export { generateRedisKey, readRedisKey }; diff --git a/web_services/client_frontend/src/types/mutual/fecther/validations.ts b/web_services/client_frontend/src/types/mutual/fecther/validations.ts new file mode 100644 index 0000000..394dd2d --- /dev/null +++ b/web_services/client_frontend/src/types/mutual/fecther/validations.ts @@ -0,0 +1,44 @@ +interface FetcherRequest { + url: string; + isNoCache: boolean; +} + +interface PostFetcherRequest extends FetcherRequest { + body: Record; +} + +interface GetFetcherRequest extends FetcherRequest { + url: string; +} + +interface DeleteFetcherRequest extends GetFetcherRequest {} +interface PutFetcherRequest extends PostFetcherRequest {} +interface PatchFetcherRequest extends PostFetcherRequest {} + +interface FetcherRespose { + success: boolean; +} +interface PaginationResponse { + onPage: number; + onPageCount: number; + totalPage: number; + totalCount: number; + next: boolean; + back: boolean; +} + +interface FetcherDataResponse extends FetcherRespose { + data: Record | null; + pagination?: PaginationResponse; +} + +export type { + FetcherRequest, + PostFetcherRequest, + GetFetcherRequest, + DeleteFetcherRequest, + PutFetcherRequest, + PatchFetcherRequest, + FetcherRespose, + FetcherDataResponse, +}; diff --git a/web_services/client_frontend/src/validations/mutual/dashboard/props.ts b/web_services/client_frontend/src/validations/mutual/dashboard/props.ts index 18eef56..c95b230 100644 --- a/web_services/client_frontend/src/validations/mutual/dashboard/props.ts +++ b/web_services/client_frontend/src/validations/mutual/dashboard/props.ts @@ -17,28 +17,24 @@ const ModeTypesList = ["shortList", "fullList", "create", "update", "view"]; interface ContentProps { lang: LanguageTypes; - translations: Record; activePageUrl: string; - isMulti?: boolean; mode?: ModeTypes; } interface MenuProps { lang: LanguageTypes; - menuItems: Record>; + availableApplications: string[]; activePageUrl: string; - menuTranslationsFlatten: Record>; } -interface FooterProps { - translations: Record; -} +interface FooterProps {} -interface HeaderProps { - translations: Record; +interface AllProps { lang: LanguageTypes; activePageUrl: string; prefix: string; + mode?: ModeTypes; + } export type { @@ -47,7 +43,7 @@ export type { ContentProps, MenuProps, FooterProps, - HeaderProps, + AllProps, ModeTypes, }; diff --git a/web_services/client_frontend/src/webPages/auth/login/hook.ts b/web_services/client_frontend/src/webPages/auth/login/hook.ts index b87ae9a..5a10918 100644 --- a/web_services/client_frontend/src/webPages/auth/login/hook.ts +++ b/web_services/client_frontend/src/webPages/auth/login/hook.ts @@ -19,14 +19,12 @@ export function loginHook( .then((response) => { if (response.status === 200) { response.json().then((data) => { - console.log("data", data); // setJsonText(JSON.stringify(data)); setTimeout(() => { const userType = data?.data?.user_type.toLowerCase() === "employee" ? "employee" : "occupant"; - const rediretUrl = `/auth/${lang}/select?type=${userType}`; - console.log("rediretUrl", rediretUrl); + const rediretUrl = `/auth/select?type=${userType}`; Router.push(rediretUrl); }, 100); }); diff --git a/web_services/client_frontend/src/webPages/auth/select/LoginEmployee.tsx b/web_services/client_frontend/src/webPages/auth/select/LoginEmployee.tsx index 6a24c64..d287e68 100644 --- a/web_services/client_frontend/src/webPages/auth/select/LoginEmployee.tsx +++ b/web_services/client_frontend/src/webPages/auth/select/LoginEmployee.tsx @@ -1,30 +1,57 @@ "use client"; -import React, { useTransition, useState } from "react"; +import React, { useTransition, useState, useEffect } from "react"; import { useRouter } from "next/navigation"; import { Company } from "./types"; import { LoginEmployeeProps } from "./types"; import { selectEmployeeHook } from "./hook"; +import { checkContextDashSelection } from "@/components/mutual/context/selection/context"; +import { ClientSelection } from "@/types/mutual/context/validations"; + +const translation = { + en: { + companySelection: "Company Selection", + loggedInAs: "Logged in as", + duty: "Duty", + id: "ID", + noSelections: "No selections", + continue: "Continue", + select: "Select" + }, + tr: { + companySelection: "Şirket Seçimi", + loggedInAs: "Giriş Yapan", + duty: "Görev", + id: "ID", + noSelections: "Seçim Yok", + continue: "Devam Et", + select: "Seç" + } +} function LoginEmployee({ - selectionList, - translation, lang }: LoginEmployeeProps) { - const isArrayLengthOne = Array.isArray(selectionList) && selectionList.length === 1; - const isArrayLengthZero = Array.isArray(selectionList) && selectionList.length === 0; - const isArrayMoreThanOne = Array.isArray(selectionList) && selectionList.length > 1; + const [selectionListCopy, setSelectionListCopy] = useState({ selectionList: [], activeSelection: {} }); + useEffect(() => { + checkContextDashSelection().then((selectionList) => { + if (!selectionList) throw new Error("No selection list found"); + setSelectionListCopy(selectionList) + }) + }, []) + + const isArrayLengthOne = Array.isArray(selectionListCopy.selectionList) && selectionListCopy.selectionList.length === 1; + const isArrayLengthZero = Array.isArray(selectionListCopy.selectionList) && selectionListCopy.selectionList.length === 0; + const isArrayMoreThanOne = Array.isArray(selectionListCopy.selectionList) && selectionListCopy.selectionList.length > 1; const Router = useRouter(); const [isPending, startTransition] = useTransition(); const [error, setError] = useState(null); const [jsonText, setJsonText] = useState(null); - const onSubmitEmployee = async (uu_id: string) => { - selectEmployeeHook(startTransition, { company_uu_id: uu_id }, setError, setJsonText, Router, lang) - }; + const onSubmitEmployee = async (uu_id: string) => { selectEmployeeHook(startTransition, { uuid: uu_id }, setError, setJsonText, Router, lang) }; // Render a company card with consistent styling - const CompanyCard = ({ company, showButton = false }: { company: Company, showButton?: boolean }) => ( + const CompanyCard = ({ company }: { company: Company }) => (
onSubmitEmployee(company.uu_id)}> {/* Company name and type */} @@ -40,13 +67,13 @@ function LoginEmployee({ {/* Duty information */} {company.duty && (
- {translation.duty}: {company.duty} + {translation[lang].duty}: {company.duty}
)} {/* ID information */}
- {translation.id}: {company.uu_id} + {translation[lang].id}: {company.uu_id}
@@ -55,30 +82,26 @@ function LoginEmployee({ return (
-

{translation.companySelection}

-

{translation.loggedInAs}

+

{translation[lang].companySelection}

+

{translation[lang].loggedInAs}

{/* No companies available */} {isArrayLengthZero && (
-

{translation.noSelections}

+

{translation[lang].noSelections}

)} {/* Single company */} - {isArrayLengthOne && } + {isArrayLengthOne && } {/* Multiple companies */} {isArrayMoreThanOne && (
- {selectionList.map((company, index) => ( -
onSubmitEmployee(company.uu_id)} + {selectionListCopy.selectionList.map((company, index) => ( +
onSubmitEmployee(company.uu_id)} className="cursor-pointer hover:translate-x-1 transition-transform" - > - -
+ >
))}
)} diff --git a/web_services/client_frontend/src/webPages/auth/select/LoginOccupant.tsx b/web_services/client_frontend/src/webPages/auth/select/LoginOccupant.tsx index 5f5edd5..5515369 100644 --- a/web_services/client_frontend/src/webPages/auth/select/LoginOccupant.tsx +++ b/web_services/client_frontend/src/webPages/auth/select/LoginOccupant.tsx @@ -3,24 +3,38 @@ import React, { useState, useTransition, useEffect } from "react"; import { useRouter } from "next/navigation"; import { LoginOccupantProps } from "./types"; import { selectOccupantHook } from "./hook"; +import { checkContextDashSelection } from "@/components/mutual/context/selection/context"; +import { ClientSelection } from "@/types/mutual/context/validations"; -function LoginOccupant({ - selectionList, - translation, - lang -}: LoginOccupantProps) { +const translation = { + en: { + occupantSelection: "Occupant Selection", + loggedInAs: "Logged in as", + level: "Level", + noSelections: "No selections" + }, + tr: { + occupantSelection: "İşçi Seçimi", + loggedInAs: "Giriş Yapan", + level: "Seviye", + noSelections: "Seçim Yok" + } +} +function LoginOccupant({ lang }: LoginOccupantProps) { const Router = useRouter(); const [isPending, startTransition] = useTransition(); const [error, setError] = useState(null); const [jsonText, setJsonText] = useState(null); + const [selectionList, setSelectionList] = useState({ selectionList: [], activeSelection: {} }); - const onSubmitOccupant = async (data: any) => { - selectOccupantHook(startTransition, data, setError, setJsonText, Router, lang) - }; - const isArrayLengthZero = Array.isArray(selectionList) && selectionList.length === 0; - - // Render an occupant card with consistent styling + useEffect(() => { + checkContextDashSelection().then((selectionList) => { + if (!selectionList) throw new Error("No selection list found"); setSelectionList(selectionList); + }) + }, []) + const onSubmitOccupant = async (data: any) => { selectOccupantHook(startTransition, data, setError, setJsonText, Router, lang) }; + const isArrayLengthZero = Array.isArray(selectionList.selectionList) && selectionList.selectionList.length === 0; const OccupantCard = ({ occupant, buildKey, idx }: { occupant: any, buildKey: string, idx: number }) => (
onSubmitOccupant({ build_living_space_uu_id: occupant.build_living_space_uu_id })} >
- {/* Occupant description and code */}

{occupant.description}

{occupant.code}
- - {/* Part name */}
{occupant.part_name}
- - {/* Level information */}
- {translation.level}: {occupant.part_level} + {translation[lang].level}: {occupant.part_level}
); - - // Render a building section with its occupants const BuildingSection = ({ building, buildKey }: { building: any, buildKey: string }) => (
@@ -72,31 +79,25 @@ function LoginOccupant({ return (
-

{translation.occupantSelection}

-

{translation.loggedInAs}

+

{translation[lang].occupantSelection}

+

{translation[lang].loggedInAs}

- {/* No occupants available */} {!isArrayLengthZero ? (
-

{translation.noSelections}

+

{translation[lang].noSelections}

) : ( - /* Building sections with occupants */
- {Object.keys(selectionList).map((buildKey: string) => ( + {Object.keys(selectionList.selectionList).map((buildKey: string) => ( ))}
)} - - {/* Show error if any */} {error &&

{error}

} - - {/* Loading indicator */} {isPending && (
diff --git a/web_services/client_frontend/src/webPages/auth/select/hook.ts b/web_services/client_frontend/src/webPages/auth/select/hook.ts index c71e5e9..5a902ae 100644 --- a/web_services/client_frontend/src/webPages/auth/select/hook.ts +++ b/web_services/client_frontend/src/webPages/auth/select/hook.ts @@ -1,7 +1,7 @@ import { LanguageTypes } from "@/validations/mutual/language/validations"; -const afterLoginDirectUrl = (lang: LanguageTypes) => { - return `/panel/${lang}/main/pages/user/dashboard`; +const afterLoginDirectUrl = () => { + return `/panel/dashboard`; }; function selectEmployeeHook( @@ -25,7 +25,7 @@ function selectEmployeeHook( response.json().then((data) => { console.log("data", data); setTimeout(() => { - Router.push(afterLoginDirectUrl(lang)); + Router.push(afterLoginDirectUrl()); }, 100); }); } else { @@ -62,7 +62,7 @@ function selectOccupantHook( response.json().then((data) => { console.log("data", data); setTimeout(() => { - Router.push(afterLoginDirectUrl(lang)); + Router.push(afterLoginDirectUrl()); }, 100); }); } else { diff --git a/web_services/client_frontend/src/webPages/auth/select/page.tsx b/web_services/client_frontend/src/webPages/auth/select/page.tsx index d277116..432e6dc 100644 --- a/web_services/client_frontend/src/webPages/auth/select/page.tsx +++ b/web_services/client_frontend/src/webPages/auth/select/page.tsx @@ -1,39 +1,18 @@ "use client"; -import { useState, useEffect } from "react"; import LoginOccupant from "./LoginOccupant"; import LoginEmployee from "./LoginEmployee"; -import { Company, SelectListProps, BuildingMap } from "./types"; -import { selectEmployeeTranslation, selectOccupantTranslation } from "./language"; - -const Select: React.FC = ({ selectionList, isEmployee, isOccupant, language, query }) => { - const isEmployeee = query?.isEmployee == "true"; - const isOccupante = query?.isOccupant == "true"; - const userType = isEmployeee || isOccupante ? isEmployeee ? "employee" : "occupant" : "employee"; - - const isEmployeeTrue = userType == "employee" && Array.isArray(selectionList) - const isOccupantTrue = userType == "occupant" && !Array.isArray(selectionList) - const initTranslation = userType == "employee" ? selectEmployeeTranslation[language] : selectOccupantTranslation[language] - - const [translation, setTranslation] = useState(initTranslation); - const [listEmployeeSelection, setListEmployeeSelection] = useState(selectionList as Company[]); - const [listOccupantSelection, setListOccupantSelection] = useState(selectionList as BuildingMap); - - useEffect(() => { - if (isEmployee) { setListEmployeeSelection(selectionList as Company[]) } - else if (isOccupant) { setListOccupantSelection(selectionList as BuildingMap) } - }, []); - - useEffect(() => { - setTranslation(isEmployee ? selectEmployeeTranslation[language] : selectOccupantTranslation[language]); - }, [language]); +import { SelectListProps } from "./types"; +const Select: React.FC = ({ language, query }) => { + const isEmployeee = query?.type == "employee"; + const isOccupante = query?.type == "occupant"; return ( <>
- {isEmployeeTrue && } - {isOccupantTrue && } + {isEmployeee && } + {isOccupante && }
diff --git a/web_services/client_frontend/src/webPages/auth/select/serverPage.tsx b/web_services/client_frontend/src/webPages/auth/select/serverPage.tsx index e5d4507..56f6ba7 100644 --- a/web_services/client_frontend/src/webPages/auth/select/serverPage.tsx +++ b/web_services/client_frontend/src/webPages/auth/select/serverPage.tsx @@ -3,18 +3,15 @@ import React, { FC } from "react"; import Select from "./page"; import { redirect } from "next/navigation"; -import { checkAccessTokenIsValid, retrieveUserType } from "@/apicalls/mutual/cookies/token"; import { AuthPageProps } from "@/validations/mutual/auth/props"; const SelectPage: FC = async ({ query, language }) => { - const token_is_valid = await checkAccessTokenIsValid(); - const selection = await retrieveUserType(); - const isEmployee = selection?.userType == "employee"; - const isOccupant = selection?.userType == "occupant"; - const selectionList = selection?.selectionList; - - if (!selectionList || !token_is_valid) { redirect("/auth/en/login") } - return ; + } catch (error) { + redirect("/auth/login"); + return null; + } } export default SelectPage; diff --git a/web_services/client_frontend/src/webPages/auth/select/types.ts b/web_services/client_frontend/src/webPages/auth/select/types.ts index 100b302..e333a73 100644 --- a/web_services/client_frontend/src/webPages/auth/select/types.ts +++ b/web_services/client_frontend/src/webPages/auth/select/types.ts @@ -1,3 +1,4 @@ +import { ClientSelection } from "@/types/mutual/context/validations"; import { LanguageTypes } from "@/validations/mutual/language/validations"; interface Company { @@ -30,22 +31,15 @@ interface BuildingMap { } interface SelectListProps { - selectionList: Company[] | BuildingMap; - isEmployee: boolean; - isOccupant: boolean; language: LanguageTypes; query?: { [key: string]: string | string[] | undefined }; } interface LoginOccupantProps { - selectionList: BuildingMap; - translation: any; lang: LanguageTypes; } interface LoginEmployeeProps { - selectionList: Company[]; - translation: any; lang: LanguageTypes; } diff --git a/web_services/management_frontend/src/apicalls/api-fetcher.ts b/web_services/management_frontend/src/apicalls/api-fetcher.ts index a37c7a8..5549001 100644 --- a/web_services/management_frontend/src/apicalls/api-fetcher.ts +++ b/web_services/management_frontend/src/apicalls/api-fetcher.ts @@ -97,14 +97,8 @@ async function coreFetch( const responseJson = await response.json(); - if (process.env.NODE_ENV !== "production") { - console.log("Fetching:", url, fetchOptions); - console.log("Response:", responseJson); - } - return prepareResponse(responseJson, response.status); } catch (error) { - console.error(`Fetch error (${url}):`, error); return { ...DEFAULT_RESPONSE, error: error instanceof Error ? error.message : "Network error", diff --git a/web_services/management_frontend/src/apicalls/custom/application/apicall.tsx b/web_services/management_frontend/src/apicalls/custom/application/apicall.tsx index adc7fcd..c1279f3 100644 --- a/web_services/management_frontend/src/apicalls/custom/application/apicall.tsx +++ b/web_services/management_frontend/src/apicalls/custom/application/apicall.tsx @@ -44,9 +44,6 @@ async function listApplicationsAvailable(payload: PaginationParams): Promise; - console.log('list_events_available responseData:', JSON.stringify(responseData, null, 2)); return { data: responseData.data || [], pagination: collectPaginationFromApiResponse(responseData) @@ -93,9 +89,6 @@ async function listApplicationsAppended(payload: PaginationParams): Promise; - console.log('list_events_available responseData:', JSON.stringify(responseData, null, 2)); return { data: responseData.data || [], pagination: collectPaginationFromApiResponse(responseData) @@ -116,7 +108,6 @@ async function listApplicationsAppended(payload: PaginationParams): Promise; - console.log('list_events_available responseData:', JSON.stringify(responseData, null, 2)); return { data: responseData.data || [], pagination: collectPaginationFromApiResponse(responseData) @@ -59,7 +55,6 @@ async function list_events_available(payload: PaginationParams): Promise=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.3.tgz", + "integrity": "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.0.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", + "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.2.tgz", + "integrity": "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", + "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.2.tgz", + "integrity": "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", + "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "9.26.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.26.0.tgz", + "integrity": "sha512-I9XlJawFdSMvWjDt6wksMCrgns5ggLNfFwFvnShsleWruvXM514Qxk8V246efTw+eo9JABvVz+u3q2RiAowKxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", + "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.13.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.0.tgz", + "integrity": "sha512-FRdBLykrPPA6P76GGGqlex/e7fbe0F1ykgxHYNXQsH/iTEtjMj/f9bpY5oQqbjt5VgZvgz/uKXbGuROijh3VLA==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.9" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.0.tgz", + "integrity": "sha512-lGTor4VlXcesUMh1cupTUTDoCxMb0V6bm3CnxHzQcw8Eaf1jQbgQX4i02fYgT0vJ82tb5MZ4CZk1LRGkktJCzg==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.0", + "@floating-ui/utils": "^0.2.9" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", + "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", + "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==", + "license": "MIT" + }, + "node_modules/@hookform/resolvers": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-5.0.1.tgz", + "integrity": "sha512-u/+Jp83luQNx9AdyW2fIPGY6Y7NG68eN2ZW8FOJYL+M0i4s49+refdJdOp/A9n9HFQtQs3HIDHQvX3ZET2o7YA==", + "license": "MIT", + "dependencies": { + "@standard-schema/utils": "^0.3.0" + }, + "peerDependencies": { + "react-hook-form": "^7.55.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", + "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", + "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", + "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", + "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", + "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", + "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", + "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", + "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", + "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", + "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", + "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.5" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", + "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", + "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", + "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", + "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", + "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", + "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.2.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", + "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", + "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.11.2.tgz", + "integrity": "sha512-H9vwztj5OAqHg9GockCQC06k1natgcxWQSRpQcPJf6i5+MWBzfKkRtxGbjQf0X2ihii0ffLZCRGbYV2f2bjNCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.3", + "eventsource": "^3.0.2", + "express": "^5.0.1", + "express-rate-limit": "^7.5.0", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.24.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.9.tgz", + "integrity": "sha512-OKRBiajrrxB9ATokgEQoG87Z25c67pCpYcCwmXYX8PBftC9pBfN18gnm/fh1wurSLEKIAt+QRFLFCQISrb66Jg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.0", + "@emnapi/runtime": "^1.4.0", + "@tybys/wasm-util": "^0.9.0" + } + }, + "node_modules/@next/env": { + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.2.4.tgz", + "integrity": "sha512-+SFtMgoiYP3WoSswuNmxJOCwi06TdWE733D+WPjpXIe4LXGULwEaofiiAy6kbS0+XjM5xF5n3lKuBwN2SnqD9g==", + "license": "MIT" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "15.3.2", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-15.3.2.tgz", + "integrity": "sha512-ijVRTXBgnHT33aWnDtmlG+LJD+5vhc9AKTJPquGG5NKXjpKNjc62woIhFtrAcWdBobt8kqjCoaJ0q6sDQoX7aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "3.3.1" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.2.4.tgz", + "integrity": "sha512-1AnMfs655ipJEDC/FHkSr0r3lXBgpqKo4K1kiwfUf3iE68rDFXZ1TtHdMvf7D0hMItgDZ7Vuq3JgNMbt/+3bYw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.2.4.tgz", + "integrity": "sha512-3qK2zb5EwCwxnO2HeO+TRqCubeI/NgCe+kL5dTJlPldV/uwCnUgC7VbEzgmxbfrkbjehL4H9BPztWOEtsoMwew==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.2.4.tgz", + "integrity": "sha512-HFN6GKUcrTWvem8AZN7tT95zPb0GUGv9v0d0iyuTb303vbXkkbHDp/DxufB04jNVD+IN9yHy7y/6Mqq0h0YVaQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.2.4.tgz", + "integrity": "sha512-Oioa0SORWLwi35/kVB8aCk5Uq+5/ZIumMK1kJV+jSdazFm2NzPDztsefzdmzzpx5oGCJ6FkUC7vkaUseNTStNA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.2.4.tgz", + "integrity": "sha512-yb5WTRaHdkgOqFOZiu6rHV1fAEK0flVpaIN2HB6kxHVSy/dIajWbThS7qON3W9/SNOH2JWkVCyulgGYekMePuw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.2.4.tgz", + "integrity": "sha512-Dcdv/ix6srhkM25fgXiyOieFUkz+fOYkHlydWCtB0xMST6X9XYI3yPDKBZt1xuhOytONsIFJFB08xXYsxUwJLw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.2.4.tgz", + "integrity": "sha512-dW0i7eukvDxtIhCYkMrZNQfNicPDExt2jPb9AZPpL7cfyUo7QSNl1DjsHjmmKp6qNAqUESyT8YFl/Aw91cNJJg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.2.4.tgz", + "integrity": "sha512-SbnWkJmkS7Xl3kre8SdMF6F/XDh1DTFEhp0jRTj/uB8iPKoU2bb2NDfcu+iifv1+mxQEd1g2vvSxcZbXSKyWiQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/@radix-ui/number": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", + "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==", + "license": "MIT" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz", + "integrity": "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-accordion": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.10.tgz", + "integrity": "sha512-x+URzV1siKmeXPSUIQ22L81qp2eOhjpy3tgteF+zOr4d1u0qJnFuyBF4MoQRhmKP6ivDxlvDAvqaF77gh7DOIw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-collapsible": "1.1.10", + "@radix-ui/react-collection": "1.1.6", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-alert-dialog": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.13.tgz", + "integrity": "sha512-/uPs78OwxGxslYOG5TKeUsv9fZC0vo376cXSADdKirTmsLJU2au6L3n34c3p6W26rFDDDze/hwy4fYeNd0qdGA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dialog": "1.1.13", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-slot": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.6.tgz", + "integrity": "sha512-2JMfHJf/eVnwq+2dewT3C0acmCWD3XiVA1Da+jTDqo342UlU13WvXtqHhG+yJw5JeQmu4ue2eMy6gcEArLBlcw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-aspect-ratio": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.6.tgz", + "integrity": "sha512-cZvNiIKqWQjf3DsQk1+wktF3DD73kUbWQ2E/XSh8m2IcpFGwg4IiIvGlVNdovxuozK/9+4QXd2zVlzUMiexSDg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-avatar": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.9.tgz", + "integrity": "sha512-10tQokfvZdFvnvDkcOJPjm2pWiP8A0R4T83MoD7tb15bC/k2GU7B1YBuzJi8lNQ8V1QqhP8ocNqp27ByZaNagQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-is-hydrated": "0.1.0", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-checkbox": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.1.tgz", + "integrity": "sha512-xTaLKAO+XXMPK/BpVTSaAAhlefmvMSACjIhK9mGsImvX2ljcTDm8VGR1CuS1uYcNdR5J+oiOhoJZc5un6bh3VQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.10.tgz", + "integrity": "sha512-O2mcG3gZNkJ/Ena34HurA3llPOEA/M4dJtIRMa6y/cknRDC8XY5UZBInKTsUwW5cUue9A4k0wi1XU5fKBzKe1w==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.6.tgz", + "integrity": "sha512-PbhRFK4lIEw9ADonj48tiYWzkllz81TM7KVYyyMMw2cwHO7D5h4XKEblL8NlaRisTK3QTe6tBEhDccFUryxHBQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-slot": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context-menu": { + "version": "2.2.14", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.2.14.tgz", + "integrity": "sha512-RUHvrJE2qKAd9pQ50HZZsePio4SMWEh8v6FWQwg/4t6K1fuxfb4Ec40VEVvni6V7nFxmj9srU4UZc7aYp8x0LQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-menu": "2.1.14", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.13.tgz", + "integrity": "sha512-ARFmqUyhIVS3+riWzwGTe7JLjqwqgnODBUZdqpWar/z1WFs9z76fuOs/2BOWCR+YboRn4/WN9aoaGVwqNRr8VA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.9", + "@radix-ui/react-focus-guards": "1.1.2", + "@radix-ui/react-focus-scope": "1.1.6", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.8", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-slot": "1.2.2", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", + "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.9.tgz", + "integrity": "sha512-way197PiTvNp+WBP7svMJasHl+vibhWGQDb6Mgf5mhEWJkgb85z7Lfl9TUdkqpWsf8GRNmoopx9ZxCyDzmgRMQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dropdown-menu": { + "version": "2.1.14", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.14.tgz", + "integrity": "sha512-lzuyNjoWOoaMFE/VC5FnAAYM16JmQA8ZmucOXtlhm2kKR5TSU95YLAueQ4JYuRmUJmBvSqXaVFGIfuukybwZJQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-menu": "2.1.14", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.2.tgz", + "integrity": "sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.6.tgz", + "integrity": "sha512-r9zpYNUQY+2jWHWZGyddQLL9YHkM/XvSFHVcWs7bdVuxMAnCwTAuy6Pf47Z4nw7dYcUou1vg/VgjjrrH03VeBw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-hover-card": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.13.tgz", + "integrity": "sha512-Wtjvx0d/6Bgd/jAYS1mW6IPSUQ25y0hkUSOS1z5/4+U8+DJPwKroqJlM/AlVFl3LywGoruiPmcvB9Aks9mSOQw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.9", + "@radix-ui/react-popper": "1.2.6", + "@radix-ui/react-portal": "1.1.8", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", + "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-label": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.6.tgz", + "integrity": "sha512-S/hv1mTlgcPX2gCTJrWuTjSXf7ER3Zf7zWGtOprxhIIY93Qin3n5VgNA0Ez9AgrK/lEtlYgzLd4f5x6AVar4Yw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu": { + "version": "2.1.14", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.14.tgz", + "integrity": "sha512-0zSiBAIFq9GSKoSH5PdEaQeRB3RnEGxC+H2P0egtnKoKKLNBH8VBHyVO6/jskhjAezhOIplyRUj7U2lds9A+Yg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-collection": "1.1.6", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.9", + "@radix-ui/react-focus-guards": "1.1.2", + "@radix-ui/react-focus-scope": "1.1.6", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.6", + "@radix-ui/react-portal": "1.1.8", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-roving-focus": "1.1.9", + "@radix-ui/react-slot": "1.2.2", + "@radix-ui/react-use-callback-ref": "1.1.1", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menubar": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.14.tgz", + "integrity": "sha512-nWLOS7EG3iYhT/zlE/Pbip17rrMnV/0AS7ueb3pKHTSAnpA6/N9rXQYowulZw4owZ9P+qSilHsFzSx/kU7yplQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-collection": "1.1.6", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-menu": "2.1.14", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-roving-focus": "1.1.9", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-navigation-menu": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.12.tgz", + "integrity": "sha512-iExvawdu7n6DidDJRU5pMTdi+Z3DaVPN4UZbAGuTs7nJA8P4RvvkEz+XYI2UJjb/Hh23RrH19DakgZNLdaq9Bw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-collection": "1.1.6", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.9", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.13.tgz", + "integrity": "sha512-84uqQV3omKDR076izYgcha6gdpN8m3z6w/AeJ83MSBJYVG/AbOHdLjAgsPZkeC/kt+k64moXFCnio8BbqXszlw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.9", + "@radix-ui/react-focus-guards": "1.1.2", + "@radix-ui/react-focus-scope": "1.1.6", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.6", + "@radix-ui/react-portal": "1.1.8", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-slot": "1.2.2", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.6.tgz", + "integrity": "sha512-7iqXaOWIjDBfIG7aq8CUEeCSsQMLFdn7VEE8TaFz704DtEzpPHR7w/uuzRflvKgltqSAImgcmxQ7fFX3X7wasg==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.6", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-rect": "1.1.1", + "@radix-ui/react-use-size": "1.1.1", + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.8.tgz", + "integrity": "sha512-hQsTUIn7p7fxCPvao/q6wpbxmCwgLrlz+nOrJgC+RwfZqWY/WN+UMqkXzrtKbPrF82P43eCTl3ekeKuyAQbFeg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.4.tgz", + "integrity": "sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.2.tgz", + "integrity": "sha512-uHa+l/lKfxuDD2zjN/0peM/RhhSmRjr5YWdk/37EnSv1nJ88uvG85DPexSm8HdFQROd2VdERJ6ynXbkCFi+APw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-progress": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.6.tgz", + "integrity": "sha512-QzN9a36nKk2eZKMf9EBCia35x3TT+SOgZuzQBVIHyRrmYYi73VYBRK3zKwdJ6az/F5IZ6QlacGJBg7zfB85liA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-radio-group": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.3.6.tgz", + "integrity": "sha512-1tfTAqnYZNVwSpFhCT273nzK8qGBReeYnNTPspCggqk1fvIrfVxJekIuBFidNivzpdiMqDwVGnQvHqXrRPM4Og==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-roving-focus": "1.1.9", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.9.tgz", + "integrity": "sha512-ZzrIFnMYHHCNqSNCsuN6l7wlewBEq0O0BCSBkabJMFXVO51LRUTq71gLP1UxFvmrXElqmPjA5VX7IqC9VpazAQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-collection": "1.1.6", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-scroll-area": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.8.tgz", + "integrity": "sha512-K5h1RkYA6M0Sn61BV5LQs686zqBsSC0sGzL4/Gw4mNnjzrQcGSc6YXfC6CRFNaGydSdv5+M8cb0eNsOGo0OXtQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.4.tgz", + "integrity": "sha512-/OOm58Gil4Ev5zT8LyVzqfBcij4dTHYdeyuF5lMHZ2bIp0Lk9oETocYiJ5QC0dHekEQnK6L/FNJCceeb4AkZ6Q==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-collection": "1.1.6", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.9", + "@radix-ui/react-focus-guards": "1.1.2", + "@radix-ui/react-focus-scope": "1.1.6", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.6", + "@radix-ui/react-portal": "1.1.8", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-slot": "1.2.2", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-separator": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.6.tgz", + "integrity": "sha512-Izof3lPpbCfTM7WDta+LRkz31jem890VjEvpVRoWQNKpDUMMVffuyq854XPGP1KYGWWmjmYvHvPFeocWhFCy1w==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slider": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.3.4.tgz", + "integrity": "sha512-Cp6hEmQtRJFci285vkdIJ+HCDLTRDk+25VhFwa1fcubywjMUE3PynBgtN5RLudOgSCYMlT4jizCXdmV+8J7Y2w==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-collection": "1.1.6", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.2.tgz", + "integrity": "sha512-y7TBO4xN4Y94FvcWIOIh18fM4R1A8S4q1jhoz4PNzOoHsFcN8pogcFmZrTYAm4F9VRUrWP/Mw7xSKybIeRI+CQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-switch": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.2.4.tgz", + "integrity": "sha512-yZCky6XZFnR7pcGonJkr9VyNRu46KcYAbyg1v/gVVCZUr8UJ4x+RpncC27hHtiZ15jC+3WS8Yg/JSgyIHnYYsQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.11.tgz", + "integrity": "sha512-4FiKSVoXqPP/KfzlB7lwwqoFV6EPwkrrqGp9cUYXjwDYHhvpnqq79P+EPHKcdoTE7Rl8w/+6s9rTlsfXHES9GA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-roving-focus": "1.1.9", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.8.tgz", + "integrity": "sha512-hrpa59m3zDnsa35LrTOH5s/a3iGv/VD+KKQjjiCTo/W4r0XwPpiWQvAv6Xl1nupSoaZeNNxW6sJH9ZydsjKdYQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.6.tgz", + "integrity": "sha512-zYb+9dc9tkoN2JjBDIIPLQtk3gGyz8FMKoqYTb8EMVQ5a5hBcdHPECrsZVI4NpPAUOixhkoqg7Hj5ry5USowfA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.9", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.6", + "@radix-ui/react-portal": "1.1.8", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-slot": "1.2.2", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-visually-hidden": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", + "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", + "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", + "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", + "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-is-hydrated": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.0.tgz", + "integrity": "sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==", + "license": "MIT", + "dependencies": { + "use-sync-external-store": "^1.5.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz", + "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", + "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", + "license": "MIT", + "dependencies": { + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", + "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.2.tgz", + "integrity": "sha512-ORCmRUbNiZIv6uV5mhFrhsIKw4UX/N3syZtyqvry61tbGm4JlgQuSn0hk5TwCARsCjkcnuRkSdCE3xfb+ADHew==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", + "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", + "license": "MIT" + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.11.0.tgz", + "integrity": "sha512-zxnHvoMQVqewTJr/W4pKjF0bMGiKJv1WX7bSrkl46Hg0QjESbzBROWK0Wg4RphzSOS5Jiy7eFimmM3UgMrMZbQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@standard-schema/utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", + "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", + "license": "MIT" + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "license": "Apache-2.0" + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.6.tgz", + "integrity": "sha512-ed6zQbgmKsjsVvodAS1q1Ld2BolEuxJOSyyNc+vhkjdmfNUDCmQnlXBfQkHrlzNmslxHsQU/bFmzcEbv4xXsLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "enhanced-resolve": "^5.18.1", + "jiti": "^2.4.2", + "lightningcss": "1.29.2", + "magic-string": "^0.30.17", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.6" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.6.tgz", + "integrity": "sha512-0bpEBQiGx+227fW4G0fLQ8vuvyy5rsB1YIYNapTq3aRsJ9taF3f5cCaovDjN5pUGKKzcpMrZst/mhNaKAPOHOA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.4", + "tar": "^7.4.3" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.6", + "@tailwindcss/oxide-darwin-arm64": "4.1.6", + "@tailwindcss/oxide-darwin-x64": "4.1.6", + "@tailwindcss/oxide-freebsd-x64": "4.1.6", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.6", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.6", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.6", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.6", + "@tailwindcss/oxide-linux-x64-musl": "4.1.6", + "@tailwindcss/oxide-wasm32-wasi": "4.1.6", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.6", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.6" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.6.tgz", + "integrity": "sha512-VHwwPiwXtdIvOvqT/0/FLH/pizTVu78FOnI9jQo64kSAikFSZT7K4pjyzoDpSMaveJTGyAKvDjuhxJxKfmvjiQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.6.tgz", + "integrity": "sha512-weINOCcqv1HVBIGptNrk7c6lWgSFFiQMcCpKM4tnVi5x8OY2v1FrV76jwLukfT6pL1hyajc06tyVmZFYXoxvhQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.6.tgz", + "integrity": "sha512-3FzekhHG0ww1zQjQ1lPoq0wPrAIVXAbUkWdWM8u5BnYFZgb9ja5ejBqyTgjpo5mfy0hFOoMnMuVDI+7CXhXZaQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.6.tgz", + "integrity": "sha512-4m5F5lpkBZhVQJq53oe5XgJ+aFYWdrgkMwViHjRsES3KEu2m1udR21B1I77RUqie0ZYNscFzY1v9aDssMBZ/1w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.6.tgz", + "integrity": "sha512-qU0rHnA9P/ZoaDKouU1oGPxPWzDKtIfX7eOGi5jOWJKdxieUJdVV+CxWZOpDWlYTd4N3sFQvcnVLJWJ1cLP5TA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.6.tgz", + "integrity": "sha512-jXy3TSTrbfgyd3UxPQeXC3wm8DAgmigzar99Km9Sf6L2OFfn/k+u3VqmpgHQw5QNfCpPe43em6Q7V76Wx7ogIQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.6.tgz", + "integrity": "sha512-8kjivE5xW0qAQ9HX9reVFmZj3t+VmljDLVRJpVBEoTR+3bKMnvC7iLcoSGNIUJGOZy1mLVq7x/gerVg0T+IsYw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.6.tgz", + "integrity": "sha512-A4spQhwnWVpjWDLXnOW9PSinO2PTKJQNRmL/aIl2U/O+RARls8doDfs6R41+DAXK0ccacvRyDpR46aVQJJCoCg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.6.tgz", + "integrity": "sha512-YRee+6ZqdzgiQAHVSLfl3RYmqeeaWVCk796MhXhLQu2kJu2COHBkqlqsqKYx3p8Hmk5pGCQd2jTAoMWWFeyG2A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.6.tgz", + "integrity": "sha512-qAp4ooTYrBQ5pk5jgg54/U1rCJ/9FLYOkkQ/nTE+bVMseMfB6O7J8zb19YTpWuu4UdfRf5zzOrNKfl6T64MNrQ==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@emnapi/wasi-threads": "^1.0.2", + "@napi-rs/wasm-runtime": "^0.2.9", + "@tybys/wasm-util": "^0.9.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.6.tgz", + "integrity": "sha512-nqpDWk0Xr8ELO/nfRUDjk1pc9wDJ3ObeDdNMHLaymc4PJBWj11gdPCWZFKSK2AVKjJQC7J2EfmSmf47GN7OuLg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.6.tgz", + "integrity": "sha512-5k9xF33xkfKpo9wCvYcegQ21VwIBU1/qEbYlVukfEIyQbEA47uK8AAwS7NVjNE3vHzcmxMYwd0l6L4pPjjm1rQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.6.tgz", + "integrity": "sha512-ELq+gDMBuRXPJlpE3PEen+1MhnHAQQrh2zF0dI1NXOlEWfr2qWf2CQdr5jl9yANv8RErQaQ2l6nIFO9OSCVq/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.6", + "@tailwindcss/oxide": "4.1.6", + "postcss": "^8.4.41", + "tailwindcss": "4.1.6" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", + "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.17.46", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.46.tgz", + "integrity": "sha512-0PQHLhZPWOxGW4auogW0eOQAuNIlCYvibIpG67ja0TOJ6/sehu+1en7sfceUn+QQtx4Rk3GxbLNwPh0Cav7TWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@types/react": { + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.4.tgz", + "integrity": "sha512-EB1yiiYdvySuIITtD5lhW4yPyJ31RkJkkDw794LaQYrxCSaQV/47y5o1FMC4zF9ZyjUjzJMZwbovEnT5yHTW6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.1.5", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.5.tgz", + "integrity": "sha512-CMCjrWucUBZvohgZxkjd6S9h0nZxXjzus6yDfUb+xLxYM7VvjKNH1tQrE9GWLql1XoOP4/Ds3bwFqShHUYraGg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.32.1.tgz", + "integrity": "sha512-6u6Plg9nP/J1GRpe/vcjjabo6Uc5YQPAMxsgQyGC/I0RuukiG1wIe3+Vtg3IrSCVJDmqK3j8adrtzXSENRtFgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.32.1", + "@typescript-eslint/type-utils": "8.32.1", + "@typescript-eslint/utils": "8.32.1", + "@typescript-eslint/visitor-keys": "8.32.1", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.4.tgz", + "integrity": "sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.32.1.tgz", + "integrity": "sha512-LKMrmwCPoLhM45Z00O1ulb6jwyVr2kr3XJp+G+tSEZcbauNnScewcQwtJqXDhXeYPDEjZ8C1SjXm015CirEmGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.32.1", + "@typescript-eslint/types": "8.32.1", + "@typescript-eslint/typescript-estree": "8.32.1", + "@typescript-eslint/visitor-keys": "8.32.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.32.1.tgz", + "integrity": "sha512-7IsIaIDeZn7kffk7qXC3o6Z4UblZJKV3UBpkvRNpr5NSyLji7tvTcvmnMNYuYLyh26mN8W723xpo3i4MlD33vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.32.1", + "@typescript-eslint/visitor-keys": "8.32.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.32.1.tgz", + "integrity": "sha512-mv9YpQGA8iIsl5KyUPi+FGLm7+bA4fgXaeRcFKRDRwDMu4iwrSHeDPipwueNXhdIIZltwCJv+NkxftECbIZWfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.32.1", + "@typescript-eslint/utils": "8.32.1", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.32.1.tgz", + "integrity": "sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.32.1.tgz", + "integrity": "sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.32.1", + "@typescript-eslint/visitor-keys": "8.32.1", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.32.1.tgz", + "integrity": "sha512-DsSFNIgLSrc89gpq1LJB7Hm1YpuhK086DRDJSNrewcGvYloWW1vZLHBTIvarKZDcAORIy/uWNx8Gad+4oMpkSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.32.1", + "@typescript-eslint/types": "8.32.1", + "@typescript-eslint/typescript-estree": "8.32.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.32.1.tgz", + "integrity": "sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.32.1", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.7.2.tgz", + "integrity": "sha512-vxtBno4xvowwNmO/ASL0Y45TpHqmNkAaDtz4Jqb+clmcVSSl8XCG/PNFFkGsXXXS6AMjP+ja/TtNCFFa1QwLRg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.7.2.tgz", + "integrity": "sha512-qhVa8ozu92C23Hsmv0BF4+5Dyyd5STT1FolV4whNgbY6mj3kA0qsrGPe35zNR3wAN7eFict3s4Rc2dDTPBTuFQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.7.2.tgz", + "integrity": "sha512-zKKdm2uMXqLFX6Ac7K5ElnnG5VIXbDlFWzg4WJ8CGUedJryM5A3cTgHuGMw1+P5ziV8CRhnSEgOnurTI4vpHpg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.7.2.tgz", + "integrity": "sha512-8N1z1TbPnHH+iDS/42GJ0bMPLiGK+cUqOhNbMKtWJ4oFGzqSJk/zoXFzcQkgtI63qMcUI7wW1tq2usZQSb2jxw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.7.2.tgz", + "integrity": "sha512-tjYzI9LcAXR9MYd9rO45m1s0B/6bJNuZ6jeOxo1pq1K6OBuRMMmfyvJYval3s9FPPGmrldYA3mi4gWDlWuTFGA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.7.2.tgz", + "integrity": "sha512-jon9M7DKRLGZ9VYSkFMflvNqu9hDtOCEnO2QAryFWgT6o6AXU8du56V7YqnaLKr6rAbZBWYsYpikF226v423QA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.7.2.tgz", + "integrity": "sha512-c8Cg4/h+kQ63pL43wBNaVMmOjXI/X62wQmru51qjfTvI7kmCy5uHTJvK/9LrF0G8Jdx8r34d019P1DVJmhXQpA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.7.2.tgz", + "integrity": "sha512-A+lcwRFyrjeJmv3JJvhz5NbcCkLQL6Mk16kHTNm6/aGNc4FwPHPE4DR9DwuCvCnVHvF5IAd9U4VIs/VvVir5lg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.7.2.tgz", + "integrity": "sha512-hQQ4TJQrSQW8JlPm7tRpXN8OCNP9ez7PajJNjRD1ZTHQAy685OYqPrKjfaMw/8LiHCt8AZ74rfUVHP9vn0N69Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.7.2.tgz", + "integrity": "sha512-NoAGbiqrxtY8kVooZ24i70CjLDlUFI7nDj3I9y54U94p+3kPxwd2L692YsdLa+cqQ0VoqMWoehDFp21PKRUoIQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.7.2.tgz", + "integrity": "sha512-KaZByo8xuQZbUhhreBTW+yUnOIHUsv04P8lKjQ5otiGoSJ17ISGYArc+4vKdLEpGaLbemGzr4ZeUbYQQsLWFjA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.7.2.tgz", + "integrity": "sha512-dEidzJDubxxhUCBJ/SHSMJD/9q7JkyfBMT77Px1npl4xpg9t0POLvnWywSk66BgZS/b2Hy9Y1yFaoMTFJUe9yg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.7.2.tgz", + "integrity": "sha512-RvP+Ux3wDjmnZDT4XWFfNBRVG0fMsc+yVzNFUqOflnDfZ9OYujv6nkh+GOr+watwrW4wdp6ASfG/e7bkDradsw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.7.2.tgz", + "integrity": "sha512-y797JBmO9IsvXVRCKDXOxjyAE4+CcZpla2GSoBQ33TVb3ILXuFnMrbR/QQZoauBYeOFuu4w3ifWLw52sdHGz6g==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.9" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.7.2.tgz", + "integrity": "sha512-gtYTh4/VREVSLA+gHrfbWxaMO/00y+34htY7XpioBTy56YN2eBjkPrY1ML1Zys89X3RJDKVaogzwxlM1qU7egg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.7.2.tgz", + "integrity": "sha512-Ywv20XHvHTDRQs12jd3MY8X5C8KLjDbg/jyaal/QLKx3fAShhJyD4blEANInsjxW3P7isHx1Blt56iUDDJO3jg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.7.2.tgz", + "integrity": "sha512-friS8NEQfHaDbkThxopGk+LuE5v3iY0StruifjQEt7SLbA46OnfgMO15sOTkbpJkol6RB+1l1TYPXh0sCddpvA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-hidden": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz", + "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.10.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.3.tgz", + "integrity": "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001718", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001718.tgz", + "integrity": "sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cmdk": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.1.1.tgz", + "integrity": "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "^1.1.1", + "@radix-ui/react-dialog": "^1.1.6", + "@radix-ui/react-id": "^1.1.0", + "@radix-ui/react-primitive": "^2.0.2" + }, + "peerDependencies": { + "react": "^18 || ^19 || ^19.0.0-rc", + "react-dom": "^18 || ^19 || ^19.0.0-rc" + } + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "license": "MIT", + "optional": true, + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "optional": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/date-fns": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", + "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-abstract": { + "version": "1.23.9", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", + "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", + "dev": true, + "license": "MIT", + "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.0.0", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.0", + "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.0", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.3", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "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.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.26.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.26.0.tgz", + "integrity": "sha512-Hx0MOjPh6uK9oq9nVsATZKE/Wlbai7KFjfCuw9UHaguDW3x+HF0O5nIi3ud39TWgrTjTO5nHxmL3R1eANinWHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.20.0", + "@eslint/config-helpers": "^0.2.1", + "@eslint/core": "^0.13.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.26.0", + "@eslint/plugin-kit": "^0.2.8", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@modelcontextprotocol/sdk": "^1.8.0", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.3.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "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.3", + "zod": "^3.24.2" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-next": { + "version": "15.3.2", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-15.3.2.tgz", + "integrity": "sha512-FerU4DYccO4FgeYFFglz0SnaKRe1ejXQrDb8kWUkTAg036YWi+jUsgg4sIGNCDhAsDITsZaL4MzBWKB6f4G1Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@next/eslint-plugin-next": "15.3.2", + "@rushstack/eslint-patch": "^1.10.3", + "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-jsx-a11y": "^6.10.0", + "eslint-plugin-react": "^7.37.0", + "eslint-plugin-react-hooks": "^5.0.0" + }, + "peerDependencies": { + "eslint": "^7.23.0 || ^8.0.0 || ^9.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", + "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.4.0", + "get-tsconfig": "^4.10.0", + "is-bun-module": "^2.0.0", + "stable-hash": "^0.0.5", + "tinyglobby": "^0.2.13", + "unrs-resolver": "^1.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "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.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "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", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "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" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "dev": true, + "license": "MIT", + "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" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", + "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.1.tgz", + "integrity": "sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/express": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.0.tgz", + "integrity": "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": "^4.11 || 5 || ^5.0.0-beta.1" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fdir": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatpickr": { + "version": "4.6.13", + "resolved": "https://registry.npmjs.org/flatpickr/-/flatpickr-4.6.13.tgz", + "integrity": "sha512-97PMG/aywoYpB4IvbvUJi0RQi8vearvU0oov1WW3k0WZPBMrTQVqekSX5CjSG/M4Q3i6A/0FKXC7RyAoAUUSPw==", + "license": "MIT" + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz", + "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "license": "MIT", + "optional": true + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bun-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jiti": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.2.tgz", + "integrity": "sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.29.2", + "lightningcss-darwin-x64": "1.29.2", + "lightningcss-freebsd-x64": "1.29.2", + "lightningcss-linux-arm-gnueabihf": "1.29.2", + "lightningcss-linux-arm64-gnu": "1.29.2", + "lightningcss-linux-arm64-musl": "1.29.2", + "lightningcss-linux-x64-gnu": "1.29.2", + "lightningcss-linux-x64-musl": "1.29.2", + "lightningcss-win32-arm64-msvc": "1.29.2", + "lightningcss-win32-x64-msvc": "1.29.2" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.2.tgz", + "integrity": "sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.2.tgz", + "integrity": "sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.2.tgz", + "integrity": "sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.2.tgz", + "integrity": "sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.2.tgz", + "integrity": "sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.2.tgz", + "integrity": "sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.2.tgz", + "integrity": "sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.2.tgz", + "integrity": "sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.2.tgz", + "integrity": "sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.2.tgz", + "integrity": "sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lucide-react": { + "version": "0.487.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.487.0.tgz", + "integrity": "sha512-aKqhOQ+YmFnwq8dWgGjOuLc8V1R9/c/yOd+zDY4+ohsR2Jo05lSGc3WsstYPIzcTpeosN7LoCkLReUUITvaIvw==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-postinstall": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.2.4.tgz", + "integrity": "sha512-ZEzHJwBhZ8qQSbknHqYcdtQVr8zUgGyM/q6h6qAyhtyVMNrSgDhrC4disf03dYW0e+czXyLnZINnCTEkWy0eJg==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/next": { + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/next/-/next-15.2.4.tgz", + "integrity": "sha512-VwL+LAaPSxEkd3lU2xWbgEOtrM8oedmyhBqaVNmgKB+GvZlCy9rgaEc+y2on0wv+l0oSFqLtYD6dcC1eAedUaQ==", + "license": "MIT", + "dependencies": { + "@next/env": "15.2.4", + "@swc/counter": "0.1.3", + "@swc/helpers": "0.5.15", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "15.2.4", + "@next/swc-darwin-x64": "15.2.4", + "@next/swc-linux-arm64-gnu": "15.2.4", + "@next/swc-linux-arm64-musl": "15.2.4", + "@next/swc-linux-x64-gnu": "15.2.4", + "@next/swc-linux-x64-musl": "15.2.4", + "@next/swc-win32-arm64-msvc": "15.2.4", + "@next/swc-win32-x64-msvc": "15.2.4", + "sharp": "^0.33.5" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.41.2", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next-crypto": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/next-crypto/-/next-crypto-1.0.8.tgz", + "integrity": "sha512-6VcrH+xFuuCRGCdDMjFFibhJ97c4s+J/6SEV73RUYJhh38MDW4WXNZNTWIMZBq0B29LOIfAQ0XA37xGUZZCCjA==", + "license": "MIT" + }, + "node_modules/next-themes": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz", + "integrity": "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkce-challenge": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", + "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.6.3", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", + "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-day-picker": { + "version": "8.10.1", + "resolved": "https://registry.npmjs.org/react-day-picker/-/react-day-picker-8.10.1.tgz", + "integrity": "sha512-TMx7fNbhLk15eqcMt+7Z7S2KF7mfTId/XJDjKE8f+IUcFn0l08/kI4FiYTL/0yuOLmEcbR4Fwe3GJf/NiiMnPA==", + "license": "MIT", + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/gpbl" + }, + "peerDependencies": { + "date-fns": "^2.28.0 || ^3.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-dom": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz", + "integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.25.0" + }, + "peerDependencies": { + "react": "^19.0.0" + } + }, + "node_modules/react-hook-form": { + "version": "7.56.3", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.56.3.tgz", + "integrity": "sha512-IK18V6GVbab4TAo1/cz3kqajxbDPGofdF0w7VHdCo0Nt8PrPlOZcuuDq9YYIV1BtjcX78x0XsldbQRQnQXWXmw==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18 || ^19" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-remove-scroll": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.6.3.tgz", + "integrity": "sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "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.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz", + "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "devOptional": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "license": "ISC" + }, + "node_modules/sharp": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", + "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "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" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "license": "MIT", + "optional": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/sonner": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/sonner/-/sonner-2.0.3.tgz", + "integrity": "sha512-njQ4Hht92m0sMqqHVDL32V2Oun9W1+PHO9NDv9FHfJjT3JT22IG4Jpo3FPQy+mouRKCXFWO+r67v6MrHX2zeIA==", + "license": "MIT", + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", + "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stable-hash": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", + "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwind-merge": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.3.0.tgz", + "integrity": "sha512-fyW/pEfcQSiigd5SNn0nApUOxx0zB/dm6UDU/rEwc2c3sX2smWUNbapHv+QRqLGVp9GWX3THIa7MUGPo+YkDzQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.6.tgz", + "integrity": "sha512-j0cGLTreM6u4OWzBeLBpycK0WIh8w7kSwcUsQZoGLHZ7xDTdM69lN64AgoIEEwFi0tnhs4wSykUa5YWxAzgFYg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", + "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tw-animate-css": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.2.9.tgz", + "integrity": "sha512-9O4k1at9pMQff9EAcCEuy1UNO43JmaPQvq+0lwza9Y0BQ6LB38NiMj+qHqjoQf40355MX+gs6wtlR6H9WsSXFg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Wombosvideo" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unrs-resolver": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.7.2.tgz", + "integrity": "sha512-BBKpaylOW8KbHsu378Zky/dGh4ckT/4NW/0SHRABdqRLcQJ2dAOjDo9g97p04sWflm0kqPqpUatxReNV/dqI5A==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/JounQin" + }, + "optionalDependencies": { + "@unrs/resolver-binding-darwin-arm64": "1.7.2", + "@unrs/resolver-binding-darwin-x64": "1.7.2", + "@unrs/resolver-binding-freebsd-x64": "1.7.2", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.7.2", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.7.2", + "@unrs/resolver-binding-linux-arm64-gnu": "1.7.2", + "@unrs/resolver-binding-linux-arm64-musl": "1.7.2", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.7.2", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.7.2", + "@unrs/resolver-binding-linux-riscv64-musl": "1.7.2", + "@unrs/resolver-binding-linux-s390x-gnu": "1.7.2", + "@unrs/resolver-binding-linux-x64-gnu": "1.7.2", + "@unrs/resolver-binding-linux-x64-musl": "1.7.2", + "@unrs/resolver-binding-wasm32-wasi": "1.7.2", + "@unrs/resolver-binding-win32-arm64-msvc": "1.7.2", + "@unrs/resolver-binding-win32-ia32-msvc": "1.7.2", + "@unrs/resolver-binding-win32-x64-msvc": "1.7.2" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", + "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.24.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.4.tgz", + "integrity": "sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.24.5", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz", + "integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==", + "dev": true, + "license": "ISC", + "peerDependencies": { + "zod": "^3.24.1" + } + } + } +} diff --git a/y-trash/client_frontend copy/package.json b/y-trash/client_frontend copy/package.json new file mode 100644 index 0000000..0e059ee --- /dev/null +++ b/y-trash/client_frontend copy/package.json @@ -0,0 +1,67 @@ +{ + "name": "client-frontend", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev --turbopack", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@hookform/resolvers": "^5.0.1", + "@radix-ui/react-accordion": "^1.2.10", + "@radix-ui/react-alert-dialog": "^1.1.13", + "@radix-ui/react-aspect-ratio": "^1.1.6", + "@radix-ui/react-avatar": "^1.1.9", + "@radix-ui/react-checkbox": "^1.3.1", + "@radix-ui/react-collapsible": "^1.1.10", + "@radix-ui/react-context-menu": "^2.2.14", + "@radix-ui/react-dialog": "^1.1.13", + "@radix-ui/react-dropdown-menu": "^2.1.14", + "@radix-ui/react-hover-card": "^1.1.13", + "@radix-ui/react-label": "^2.1.6", + "@radix-ui/react-menubar": "^1.1.14", + "@radix-ui/react-navigation-menu": "^1.2.12", + "@radix-ui/react-popover": "^1.1.13", + "@radix-ui/react-progress": "^1.1.6", + "@radix-ui/react-radio-group": "^1.3.6", + "@radix-ui/react-scroll-area": "^1.2.8", + "@radix-ui/react-select": "^2.2.4", + "@radix-ui/react-separator": "^1.1.6", + "@radix-ui/react-slider": "^1.3.4", + "@radix-ui/react-slot": "^1.2.2", + "@radix-ui/react-switch": "^1.2.4", + "@radix-ui/react-tabs": "^1.1.11", + "@radix-ui/react-toggle": "^1.1.8", + "@radix-ui/react-tooltip": "^1.2.6", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "cmdk": "^1.1.1", + "date-fns": "^4.1.0", + "flatpickr": "^4.6.13", + "lucide-react": "^0.487.0", + "next": "^15.2.4", + "next-crypto": "^1.0.8", + "next-themes": "^0.4.6", + "react": "^19.0.0", + "react-day-picker": "^8.10.1", + "react-dom": "^19.0.0", + "react-hook-form": "^7.56.3", + "sonner": "^2.0.3", + "tailwind-merge": "^3.3.0", + "zod": "^3.24.4" + }, + "devDependencies": { + "@eslint/eslintrc": "^3", + "@tailwindcss/postcss": "^4.1.6", + "@types/node": "^20.17.46", + "@types/react": "^19.1.4", + "@types/react-dom": "^19.1.5", + "eslint": "^9", + "eslint-config-next": "15.3.2", + "tailwindcss": "^4.1.6", + "tw-animate-css": "^1.2.9", + "typescript": "^5.8.3" + } +} diff --git a/y-trash/client_frontend copy/postcss.config.mjs b/y-trash/client_frontend copy/postcss.config.mjs new file mode 100644 index 0000000..c7bcb4b --- /dev/null +++ b/y-trash/client_frontend copy/postcss.config.mjs @@ -0,0 +1,5 @@ +const config = { + plugins: ["@tailwindcss/postcss"], +}; + +export default config; diff --git a/web_services/client_frontend/src/apicalls/api-fetcher.ts b/y-trash/client_frontend copy/src/apicalls/api-fetcher.ts similarity index 100% rename from web_services/client_frontend/src/apicalls/api-fetcher.ts rename to y-trash/client_frontend copy/src/apicalls/api-fetcher.ts diff --git a/web_services/client_frontend/src/apicalls/basics.ts b/y-trash/client_frontend copy/src/apicalls/basics.ts similarity index 100% rename from web_services/client_frontend/src/apicalls/basics.ts rename to y-trash/client_frontend copy/src/apicalls/basics.ts diff --git a/web_services/client_frontend/src/apicalls/custom/login/login.tsx b/y-trash/client_frontend copy/src/apicalls/custom/login/login.tsx similarity index 100% rename from web_services/client_frontend/src/apicalls/custom/login/login.tsx rename to y-trash/client_frontend copy/src/apicalls/custom/login/login.tsx diff --git a/web_services/client_frontend/src/apicalls/mutual/cookies/token.tsx b/y-trash/client_frontend copy/src/apicalls/mutual/cookies/token.tsx similarity index 100% rename from web_services/client_frontend/src/apicalls/mutual/cookies/token.tsx rename to y-trash/client_frontend copy/src/apicalls/mutual/cookies/token.tsx diff --git a/web_services/client_frontend/src/app/(AuthLayout)/auth/en/[...page]/page.tsx b/y-trash/client_frontend copy/src/app/(AuthLayout)/auth/en/[...page]/page.tsx similarity index 100% rename from web_services/client_frontend/src/app/(AuthLayout)/auth/en/[...page]/page.tsx rename to y-trash/client_frontend copy/src/app/(AuthLayout)/auth/en/[...page]/page.tsx diff --git a/web_services/client_frontend/src/app/(AuthLayout)/auth/tr/[...page]/page.tsx b/y-trash/client_frontend copy/src/app/(AuthLayout)/auth/tr/[...page]/page.tsx similarity index 100% rename from web_services/client_frontend/src/app/(AuthLayout)/auth/tr/[...page]/page.tsx rename to y-trash/client_frontend copy/src/app/(AuthLayout)/auth/tr/[...page]/page.tsx diff --git a/y-trash/client_frontend copy/src/app/(DashboardLayout)/panel/en/[...page]/page.tsx b/y-trash/client_frontend copy/src/app/(DashboardLayout)/panel/en/[...page]/page.tsx new file mode 100644 index 0000000..dc50f06 --- /dev/null +++ b/y-trash/client_frontend copy/src/app/(DashboardLayout)/panel/en/[...page]/page.tsx @@ -0,0 +1,15 @@ +'use server'; +import { MaindasboardPageProps } from "@/validations/mutual/dashboard/props"; +import { DashboardLayout } from "@/layouts/dashboard/layout"; + +const MainEnPage: React.FC = async ({ params, searchParams }) => { + const parameters = await params; + const searchParameters = await searchParams; + return ( +
+ +
+ ); +} + +export default MainEnPage; diff --git a/web_services/client_frontend/src/app/(DashboardLayout)/panel/en/page.tsx b/y-trash/client_frontend copy/src/app/(DashboardLayout)/panel/en/page.tsx similarity index 100% rename from web_services/client_frontend/src/app/(DashboardLayout)/panel/en/page.tsx rename to y-trash/client_frontend copy/src/app/(DashboardLayout)/panel/en/page.tsx diff --git a/web_services/client_frontend/src/app/(DashboardLayout)/panel/tr/[...page]/page.tsx b/y-trash/client_frontend copy/src/app/(DashboardLayout)/panel/tr/[...page]/page.tsx similarity index 100% rename from web_services/client_frontend/src/app/(DashboardLayout)/panel/tr/[...page]/page.tsx rename to y-trash/client_frontend copy/src/app/(DashboardLayout)/panel/tr/[...page]/page.tsx diff --git a/web_services/client_frontend/src/app/api/cookies/selection/route.ts b/y-trash/client_frontend copy/src/app/api/cookies/selection/route.ts similarity index 100% rename from web_services/client_frontend/src/app/api/cookies/selection/route.ts rename to y-trash/client_frontend copy/src/app/api/cookies/selection/route.ts diff --git a/y-trash/client_frontend copy/src/app/api/login/email/route.ts b/y-trash/client_frontend copy/src/app/api/login/email/route.ts new file mode 100644 index 0000000..1edf11b --- /dev/null +++ b/y-trash/client_frontend copy/src/app/api/login/email/route.ts @@ -0,0 +1,39 @@ +import { loginViaAccessKeys } from "@/apicalls/custom/login/login"; +import { NextResponse } from "next/server"; +import { loginSchemaEmail } from "@/webPages/auth/login/schemas"; + +export async function POST(req: Request): Promise { + try { + const headers = req.headers; + console.log("headers", Object.entries(headers)); + const body = await req.json(); + const dataValidated = { + accessKey: body.email, + password: body.password, + rememberMe: body.rememberMe, + }; + const validatedLoginBody = loginSchemaEmail.safeParse(body); + if (!validatedLoginBody.success) { + return NextResponse.json({ + status: 422, + message: validatedLoginBody.error.message, + }); + } + + const userLogin = await loginViaAccessKeys(dataValidated); + if (userLogin.status === 200 || userLogin.status === 202) { + return NextResponse.json({ + status: 200, + message: "Login successfully completed", + data: userLogin.data, + }); + } else { + return NextResponse.json({ + status: userLogin.status, + message: userLogin.message, + }); + } + } catch (error) { + return NextResponse.json({ status: 401, message: "Invalid credentials" }); + } +} diff --git a/y-trash/client_frontend copy/src/app/api/menu/route.ts b/y-trash/client_frontend copy/src/app/api/menu/route.ts new file mode 100644 index 0000000..7b8ce2f --- /dev/null +++ b/y-trash/client_frontend copy/src/app/api/menu/route.ts @@ -0,0 +1,31 @@ +import { NextResponse } from "next/server"; + +export async function POST() { + async function retrieveAvailableApplication(): Promise { + return new Promise((resolve) => { + const mockList = [ + "/definitions/identifications/people", + "/definitions/identifications/users", + "/definitions/building/parts", + "/definitions/building/areas", + "/building/accounts/managment/accounts", + "/building/accounts/managment/budgets", + "/building/accounts/parts/accounts", + "/building/accounts/parts/budgets", + "/building/meetings/regular/actions", + "/building/meetings/regular/accounts", + "/building/meetings/ergunt/actions", + "/building/meetings/ergunt/accounts", + "/building/meetings/invited/attendance", + "/main/pages/user/dashboard", + ]; + resolve(mockList); + }); + } + + const availableApplications = await retrieveAvailableApplication(); + return NextResponse.json({ + status: 200, + data: availableApplications, + }); +} diff --git a/y-trash/client_frontend copy/src/app/api/pages/route.ts b/y-trash/client_frontend copy/src/app/api/pages/route.ts new file mode 100644 index 0000000..5cfeb99 --- /dev/null +++ b/y-trash/client_frontend copy/src/app/api/pages/route.ts @@ -0,0 +1,15 @@ +import { NextResponse } from "next/server"; + +export async function POST(): Promise { + async function retrievePageToRender(): Promise { + return new Promise((resolve) => { + resolve("superUserTenantSomething"); + }); + } + + const pageToRender = await retrievePageToRender(); + return NextResponse.json({ + status: 200, + data: pageToRender, + }); +} diff --git a/y-trash/client_frontend copy/src/app/api/selection/employee/route.ts b/y-trash/client_frontend copy/src/app/api/selection/employee/route.ts new file mode 100644 index 0000000..3ab32d5 --- /dev/null +++ b/y-trash/client_frontend copy/src/app/api/selection/employee/route.ts @@ -0,0 +1,41 @@ +import { z } from "zod"; +import { loginSelectEmployee } from "@/apicalls/custom/login/login"; +import { NextResponse } from "next/server"; + +const loginSchemaEmployee = z.object({ + company_uu_id: z.string(), +}); + +export async function POST(req: Request): Promise { + try { + const headers = req.headers; + console.log("headers", Object.entries(headers)); + const body = await req.json(); + const dataValidated = { + company_uu_id: body.company_uu_id, + }; + const validatedLoginBody = loginSchemaEmployee.safeParse(body); + if (!validatedLoginBody.success) { + return NextResponse.json({ + status: 422, + message: validatedLoginBody.error.message, + }); + } + + const userLogin = await loginSelectEmployee(dataValidated); + if (userLogin.status === 200 || userLogin.status === 202) { + return NextResponse.json({ + status: 200, + message: "Selection successfully completed", + data: userLogin.data, + }); + } else { + return NextResponse.json({ + status: userLogin.status, + message: userLogin.message, + }); + } + } catch (error) { + return NextResponse.json({ status: 401, message: "Invalid credentials" }); + } +} diff --git a/y-trash/client_frontend copy/src/app/api/selection/occupant/route.ts b/y-trash/client_frontend copy/src/app/api/selection/occupant/route.ts new file mode 100644 index 0000000..405c361 --- /dev/null +++ b/y-trash/client_frontend copy/src/app/api/selection/occupant/route.ts @@ -0,0 +1,41 @@ +import { z } from "zod"; +import { loginSelectOccupant } from "@/apicalls/custom/login/login"; +import { NextResponse } from "next/server"; + +const loginSchemaOccupant = z.object({ + build_living_space_uu_id: z.string(), +}); + +export async function POST(req: Request): Promise { + try { + const headers = req.headers; + console.log("headers", Object.entries(headers)); + const body = await req.json(); + const dataValidated = { + build_living_space_uu_id: body.build_living_space_uu_id, + }; + const validatedLoginBody = loginSchemaOccupant.safeParse(body); + if (!validatedLoginBody.success) { + return NextResponse.json({ + status: 422, + message: validatedLoginBody.error.message, + }); + } + + const userLogin = await loginSelectOccupant(dataValidated); + if (userLogin.status === 200 || userLogin.status === 202) { + return NextResponse.json({ + status: 200, + message: "Selection successfully completed", + data: userLogin.data, + }); + } else { + return NextResponse.json({ + status: userLogin.status, + message: userLogin.message, + }); + } + } catch (error) { + return NextResponse.json({ status: 401, message: "Invalid credentials" }); + } +} diff --git a/y-trash/client_frontend copy/src/app/api/utils/apiOperations.ts b/y-trash/client_frontend copy/src/app/api/utils/apiOperations.ts new file mode 100644 index 0000000..69a90fb --- /dev/null +++ b/y-trash/client_frontend copy/src/app/api/utils/apiOperations.ts @@ -0,0 +1,169 @@ +import { NextRequest } from "next/server"; +import { + successResponse, + errorResponse, + paginationResponse, + createResponse, + updateResponse, + deleteResponse, +} from "./responseHandlers"; +import { withErrorHandling, validateRequiredFields } from "./requestHandlers"; +import { + ApiHandler, + PaginationParams, + ListFunction, + CreateFunction, + UpdateFunction, + DeleteFunction, +} from "./types"; + +/** + * Generic list operation handler + * @param request NextRequest object + * @param body Request body + * @param listFunction The function to call to get the list data + */ +export async function handleListOperation( + request: NextRequest, + body: any, + listFunction: ListFunction +) { + const page = body.page || 1; + const size = body.size || 10; + const orderField = body.orderField || ["uu_id"]; + const orderType = body.orderType || ["asc"]; + const query = body.query || {}; + const response = await listFunction({ + page, + size, + orderField, + orderType, + query, + } as PaginationParams); + return paginationResponse(response.data, response.pagination); +} + +/** + * Generic create operation handler + * @param request NextRequest object + * @param body Request body + * @param createFunction The function to call to create the item + * @param requiredFields Array of required field names + */ +export async function handleCreateOperation( + body: any, + createFunction?: CreateFunction, + requiredFields: string[] = [] +) { + if (requiredFields.length > 0) { + const validation = validateRequiredFields(body, requiredFields); + if (!validation.valid) { + return errorResponse(validation.error as string, 400); + } + } + + if (createFunction) { + console.log("Body:", body); + const result = await createFunction(body); + return createResponse(result); + } + + return createResponse({ + uuid: Math.floor(Math.random() * 1000), + ...body, + }); +} + +/** + * Generic update operation handler + * @param request NextRequest object + * @param body Request body + * @param updateFunction The function to call to update the item + */ +export async function handleUpdateOperation( + request: NextRequest, + body: any, + updateFunction?: UpdateFunction +) { + const uuid = request.nextUrl.searchParams.get("uuid"); + if (!uuid) { + return errorResponse("UUID not found", 400); + } + if (updateFunction) { + console.log("Body:", body); + const result = await updateFunction(body, uuid); + return updateResponse(result); + } + return updateResponse(body); +} + +/** + * Generic delete operation handler + * @param request NextRequest object + * @param deleteFunction The function to call to delete the item + */ +export async function handleDeleteOperation( + request: NextRequest, + deleteFunction?: DeleteFunction +) { + const uuid = request.nextUrl.searchParams.get("uuid"); + if (!uuid) { + return errorResponse("UUID not found", 400); + } + + if (deleteFunction) { + await deleteFunction(uuid); + } + return deleteResponse(); +} + +/** + * Create a wrapped list handler with error handling + * @param listFunction The function to call to get the list data + */ +export function createListHandler(listFunction: ListFunction) { + return withErrorHandling((request: NextRequest, body: any) => + handleListOperation(request, body, listFunction) + ); +} + +/** + * Create a wrapped create handler with error handling + * @param createFunction The function to call to create the item + * @param requiredFields Array of required field names + */ +export function createCreateHandler( + createFunction?: CreateFunction, + requiredFields: string[] = [] +) { + console.log("Required fields:", requiredFields); + // This handler only takes the body parameter, not the request + return withErrorHandling((body: any) => { + // Ensure we're only passing the actual body data to the create function + if (body && typeof body === 'object' && body.body) { + console.log("Extracting body from request body"); + return handleCreateOperation(body.body, createFunction, requiredFields); + } + return handleCreateOperation(body, createFunction, requiredFields); + }); +} + +/** + * Create a wrapped update handler with error handling + * @param updateFunction The function to call to update the item + */ +export function createUpdateHandler(updateFunction?: UpdateFunction) { + return withErrorHandling((request: NextRequest, body: any) => + handleUpdateOperation(request, body, updateFunction) + ); +} + +/** + * Create a wrapped delete handler with error handling + * @param deleteFunction The function to call to delete the item + */ +export function createDeleteHandler(deleteFunction?: DeleteFunction) { + return withErrorHandling((request: NextRequest) => + handleDeleteOperation(request, deleteFunction) + ); +} diff --git a/y-trash/client_frontend copy/src/app/api/utils/index.ts b/y-trash/client_frontend copy/src/app/api/utils/index.ts new file mode 100644 index 0000000..373c546 --- /dev/null +++ b/y-trash/client_frontend copy/src/app/api/utils/index.ts @@ -0,0 +1,4 @@ +// Export all utility functions from a single entry point +export * from './responseHandlers'; +export * from './requestHandlers'; +export * from './apiOperations'; diff --git a/y-trash/client_frontend copy/src/app/api/utils/requestHandlers.ts b/y-trash/client_frontend copy/src/app/api/utils/requestHandlers.ts new file mode 100644 index 0000000..ec8ecda --- /dev/null +++ b/y-trash/client_frontend copy/src/app/api/utils/requestHandlers.ts @@ -0,0 +1,70 @@ +import { NextRequest } from "next/server"; +import { errorResponse } from "./responseHandlers"; +import { ValidationResult, ApiHandler, ApiHandlerBodyOnly, ApiHandlerWithRequest } from "./types"; + +/** + * Safely parse JSON request body with error handling + * @param request NextRequest object + * @returns Parsed request body or null if parsing fails + */ +export async function parseRequestBody(request: NextRequest) { + try { + return await request.json(); + } catch (error) { + return null; + } +} + +/** + * Wrapper for API route handlers with built-in error handling + * @param handler The handler function to wrap + */ +export function withErrorHandling( + handler: ApiHandler +) { + return async (request: NextRequest) => { + try { + const body = await parseRequestBody(request); + + if (body === null) { + return errorResponse("Invalid request body", 400); + } + + // Check handler parameter count to determine if it needs request object + // If handler has only 1 parameter, it's likely a create operation that only needs body + if (handler.length === 1) { + // Cast to the appropriate handler type + return await (handler as ApiHandlerBodyOnly)(body); + } else { + // Otherwise pass both request and body (for list, update, delete operations) + return await (handler as ApiHandlerWithRequest)(request, body); + } + } catch (error: any) { + return errorResponse( + error.message || "Internal Server Error", + error.status || 500 + ); + } + }; +} + +/** + * Validate that required fields are present in the request body + * @param body Request body + * @param requiredFields Array of required field names + * @returns Object with validation result and error message if validation fails + */ +export function validateRequiredFields(body: any, requiredFields: string[]): ValidationResult { + const missingFields = requiredFields.filter(field => + body[field] === undefined || body[field] === null || body[field] === '' + ); + + if (missingFields.length > 0) { + return { + valid: false, + error: `Missing required fields: ${missingFields.join(', ')}` + }; + } + + return { valid: true }; +} diff --git a/y-trash/client_frontend copy/src/app/api/utils/responseHandlers.ts b/y-trash/client_frontend copy/src/app/api/utils/responseHandlers.ts new file mode 100644 index 0000000..45cfc42 --- /dev/null +++ b/y-trash/client_frontend copy/src/app/api/utils/responseHandlers.ts @@ -0,0 +1,91 @@ +import { NextResponse } from "next/server"; +import { ApiResponse, PaginationResponse, PaginatedApiResponse } from "./types"; + +/** + * Standard success response handler + * @param data The data to return in the response + * @param status HTTP status code (default: 200) + */ +export function successResponse(data: T, status: number = 200) { + return NextResponse.json( + { + success: true, + data, + } as ApiResponse, + { status } + ); +} + +/** + * Standard error response handler + * @param message Error message + * @param status HTTP status code (default: 500) + */ +export function errorResponse(message: string, status: number = 500) { + console.error(`API error: ${message}`); + return NextResponse.json( + { + success: false, + error: message + } as ApiResponse, + { status } + ); +} + +/** + * Standard pagination response format + * @param data Array of items to return + * @param pagination Pagination information + */ +export function paginationResponse(data: T[], pagination: PaginationResponse | null) { + return NextResponse.json({ + data: data || [], + pagination: pagination || { + page: 1, + size: 10, + totalCount: 0, + totalItems: 0, + totalPages: 0, + pageCount: 0, + orderField: ["name"], + orderType: ["asc"], + query: {}, + next: false, + back: false, + }, + } as PaginatedApiResponse); +} + +/** + * Create response handler + * @param data The created item data + */ +export function createResponse(data: T) { + return successResponse( + { + ...data as any, + createdAt: new Date().toISOString(), + } as T, + 201 + ); +} + +/** + * Update response handler + * @param data The updated item data + */ +export function updateResponse(data: T) { + return successResponse( + { + ...data as any, + updatedAt: new Date().toISOString(), + } as T + ); +} + +/** + * Delete response handler + */ +export function deleteResponse() { + return successResponse({ message: "Item deleted successfully" }, 204); +} diff --git a/y-trash/client_frontend copy/src/app/api/utils/types.ts b/y-trash/client_frontend copy/src/app/api/utils/types.ts new file mode 100644 index 0000000..990bf90 --- /dev/null +++ b/y-trash/client_frontend copy/src/app/api/utils/types.ts @@ -0,0 +1,119 @@ +/** + * Type definitions for API utilities + */ + +import { NextRequest } from "next/server"; + +/** + * Validation result interface + */ +export interface ValidationResult { + valid: boolean; + error?: string; +} + +/** + * Pagination parameters interface + */ +export interface PaginationParams { + page: number; + size: number; + orderField: string[]; + orderType: string[]; + query: Record; +} + +/** + * Pagination response interface + */ +export interface PaginationResponse { + page: number; + size: number; + totalCount: number; + totalItems: number; + totalPages: number; + pageCount: number; + orderField: string[]; + orderType: string[]; + query: Record; + next: boolean; + back: boolean; +} + +export const defaultPaginationResponse: PaginationResponse = { + page: 1, + size: 10, + totalCount: 0, + totalItems: 0, + totalPages: 0, + pageCount: 0, + orderField: ["uu_id"], + orderType: ["asc"], + query: {}, + next: false, + back: false, +}; + +/** + * API response interface + */ +export interface ApiResponse { + success: boolean; + data?: T; + error?: string; +} + +/** + * Paginated API response interface + */ +export interface PaginatedApiResponse { + data: T[]; + pagination: PaginationResponse; +} + +export const collectPaginationFromApiResponse = ( + response: PaginatedApiResponse +): PaginationResponse => { + return { + page: response.pagination?.page || 1, + size: response.pagination?.size || 10, + totalCount: response.pagination?.totalCount || 0, + totalItems: response.pagination?.totalItems || 0, + totalPages: response.pagination?.totalPages || 0, + pageCount: response.pagination?.pageCount || 0, + orderField: response.pagination?.orderField || ["uu_id"], + orderType: response.pagination?.orderType || ["asc"], + query: response.pagination?.query || {}, + next: response.pagination?.next || false, + back: response.pagination?.back || false, + }; +}; + +/** + * API handler function types + */ +export type ApiHandlerWithRequest = (request: NextRequest, body: any) => Promise; +export type ApiHandlerBodyOnly = (body: any) => Promise; +export type ApiHandler = ApiHandlerWithRequest | ApiHandlerBodyOnly; + +/** + * List function type + */ +export type ListFunction = ( + params: PaginationParams +) => Promise>; + +/** + * Create function type + */ +export type CreateFunction = (data: any) => Promise; + +/** + * Update function type + */ +export type UpdateFunction = (id: any, data: any) => Promise; + +/** + * Delete function type + */ +export type DeleteFunction = (id: any) => Promise; diff --git a/y-trash/client_frontend copy/src/app/favicon.ico b/y-trash/client_frontend copy/src/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c GIT binary patch literal 25931 zcmeHv30#a{`}aL_*G&7qml|y<+KVaDM2m#dVr!KsA!#An?kSQM(q<_dDNCpjEux83 zLb9Z^XxbDl(w>%i@8hT6>)&Gu{h#Oeyszu?xtw#Zb1mO{pgX9699l+Qppw7jXaYf~-84xW z)w4x8?=youko|}Vr~(D$UXIbiXABHh`p1?nn8Po~fxRJv}|0e(BPs|G`(TT%kKVJAdg5*Z|x0leQq0 zkdUBvb#>9F()jo|T~kx@OM8$9wzs~t2l;K=woNssA3l6|sx2r3+kdfVW@e^8e*E}v zA1y5{bRi+3Z`uD3{F7LgFJDdvm;nJilkzDku>BwXH(8ItVCXk*-lSJnR?-2UN%hJ){&rlvg`CDTj z)Bzo!3v7Ou#83zEDEFcKt(f1E0~=rqeEbTnMvWR#{+9pg%7G8y>u1OVRUSoox-ovF z2Ydma(;=YuBY(eI|04{hXzZD6_f(v~H;C~y5=DhAC{MMS>2fm~1H_t2$56pc$NH8( z5bH|<)71dV-_oCHIrzrT`2s-5w_+2CM0$95I6X8p^r!gHp+j_gd;9O<1~CEQQGS8) zS9Qh3#p&JM-G8rHekNmKVewU;pJRcTAog68KYo^dRo}(M>36U4Us zfgYWSiHZL3;lpWT=zNAW>Dh#mB!_@Lg%$ms8N-;aPqMn+C2HqZgz&9~Eu z4|Kp<`$q)Uw1R?y(~S>ePdonHxpV1#eSP1B;Ogo+-Pk}6#0GsZZ5!||ev2MGdh}_m z{DeR7?0-1^zVs&`AV6Vt;r3`I`OI_wgs*w=eO%_#7Kepl{B@xiyCANc(l zzIyd4y|c6PXWq9-|KM8(zIk8LPk(>a)zyFWjhT!$HJ$qX1vo@d25W<fvZQ2zUz5WRc(UnFMKHwe1| zWmlB1qdbiA(C0jmnV<}GfbKtmcu^2*P^O?MBLZKt|As~ge8&AAO~2K@zbXelK|4T<{|y4`raF{=72kC2Kn(L4YyenWgrPiv z@^mr$t{#X5VuIMeL!7Ab6_kG$&#&5p*Z{+?5U|TZ`B!7llpVmp@skYz&n^8QfPJzL z0G6K_OJM9x+Wu2gfN45phANGt{7=C>i34CV{Xqlx(fWpeAoj^N0Biu`w+MVcCUyU* zDZuzO0>4Z6fbu^T_arWW5n!E45vX8N=bxTVeFoep_G#VmNlQzAI_KTIc{6>c+04vr zx@W}zE5JNSU>!THJ{J=cqjz+4{L4A{Ob9$ZJ*S1?Ggg3klFp!+Y1@K+pK1DqI|_gq z5ZDXVpge8-cs!o|;K73#YXZ3AShj50wBvuq3NTOZ`M&qtjj#GOFfgExjg8Gn8>Vq5 z`85n+9|!iLCZF5$HJ$Iu($dm?8~-ofu}tEc+-pyke=3!im#6pk_Wo8IA|fJwD&~~F zc16osQ)EBo58U7XDuMexaPRjU@h8tXe%S{fA0NH3vGJFhuyyO!Uyl2^&EOpX{9As0 zWj+P>{@}jxH)8|r;2HdupP!vie{sJ28b&bo!8`D^x}TE$%zXNb^X1p@0PJ86`dZyj z%ce7*{^oo+6%&~I!8hQy-vQ7E)0t0ybH4l%KltWOo~8cO`T=157JqL(oq_rC%ea&4 z2NcTJe-HgFjNg-gZ$6!Y`SMHrlj}Etf7?r!zQTPPSv}{so2e>Fjs1{gzk~LGeesX%r(Lh6rbhSo_n)@@G-FTQy93;l#E)hgP@d_SGvyCp0~o(Y;Ee8{ zdVUDbHm5`2taPUOY^MAGOw*>=s7=Gst=D+p+2yON!0%Hk` zz5mAhyT4lS*T3LS^WSxUy86q&GnoHxzQ6vm8)VS}_zuqG?+3td68_x;etQAdu@sc6 zQJ&5|4(I?~3d-QOAODHpZ=hlSg(lBZ!JZWCtHHSj`0Wh93-Uk)_S%zsJ~aD>{`A0~ z9{AG(e|q3g5B%wYKRxiL2Y$8(4w6bzchKuloQW#e&S3n+P- z8!ds-%f;TJ1>)v)##>gd{PdS2Oc3VaR`fr=`O8QIO(6(N!A?pr5C#6fc~Ge@N%Vvu zaoAX2&(a6eWy_q&UwOhU)|P3J0Qc%OdhzW=F4D|pt0E4osw;%<%Dn58hAWD^XnZD= z>9~H(3bmLtxpF?a7su6J7M*x1By7YSUbxGi)Ot0P77`}P3{)&5Un{KD?`-e?r21!4vTTnN(4Y6Lin?UkSM z`MXCTC1@4A4~mvz%Rh2&EwY))LeoT=*`tMoqcEXI>TZU9WTP#l?uFv+@Dn~b(>xh2 z;>B?;Tz2SR&KVb>vGiBSB`@U7VIWFSo=LDSb9F{GF^DbmWAfpms8Sx9OX4CnBJca3 zlj9(x!dIjN?OG1X4l*imJNvRCk}F%!?SOfiOq5y^mZW)jFL@a|r-@d#f7 z2gmU8L3IZq0ynIws=}~m^#@&C%J6QFo~Mo4V`>v7MI-_!EBMMtb%_M&kvAaN)@ZVw z+`toz&WG#HkWDjnZE!6nk{e-oFdL^$YnbOCN}JC&{$#$O27@|Tn-skXr)2ml2~O!5 zX+gYoxhoc7qoU?C^3~&!U?kRFtnSEecWuH0B0OvLodgUAi}8p1 zrO6RSXHH}DMc$&|?D004DiOVMHV8kXCP@7NKB zgaZq^^O<7PoKEp72kby@W0Z!Y*Ay{&vfg#C&gG@YVR9g?FEocMUi1gSN$+V+ayF45{a zuDZDTN}mS|;BO%gEf}pjBfN2-gIrU#G5~cucA;dokXW89%>AyXJJI z9X4UlIWA|ZYHgbI z5?oFk@A=Ik7lrEQPDH!H+b`7_Y~aDb_qa=B2^Y&Ow41cU=4WDd40dp5(QS-WMN-=Y z9g;6_-JdNU;|6cPwf$ak*aJIcwL@1n$#l~zi{c{EW?T;DaW*E8DYq?Umtz{nJ&w-M zEMyTDrC&9K$d|kZe2#ws6)L=7K+{ zQw{XnV6UC$6-rW0emqm8wJoeZK)wJIcV?dST}Z;G0Arq{dVDu0&4kd%N!3F1*;*pW zR&qUiFzK=@44#QGw7k1`3t_d8&*kBV->O##t|tonFc2YWrL7_eqg+=+k;!F-`^b8> z#KWCE8%u4k@EprxqiV$VmmtiWxDLgnGu$Vs<8rppV5EajBXL4nyyZM$SWVm!wnCj-B!Wjqj5-5dNXukI2$$|Bu3Lrw}z65Lc=1G z^-#WuQOj$hwNGG?*CM_TO8Bg-1+qc>J7k5c51U8g?ZU5n?HYor;~JIjoWH-G>AoUP ztrWWLbRNqIjW#RT*WqZgPJXU7C)VaW5}MiijYbABmzoru6EmQ*N8cVK7a3|aOB#O& zBl8JY2WKfmj;h#Q!pN%9o@VNLv{OUL?rixHwOZuvX7{IJ{(EdPpuVFoQqIOa7giLVkBOKL@^smUA!tZ1CKRK}#SSM)iQHk)*R~?M!qkCruaS!#oIL1c z?J;U~&FfH#*98^G?i}pA{ z9Jg36t4=%6mhY(quYq*vSxptes9qy|7xSlH?G=S@>u>Ebe;|LVhs~@+06N<4CViBk zUiY$thvX;>Tby6z9Y1edAMQaiH zm^r3v#$Q#2T=X>bsY#D%s!bhs^M9PMAcHbCc0FMHV{u-dwlL;a1eJ63v5U*?Q_8JO zT#50!RD619#j_Uf))0ooADz~*9&lN!bBDRUgE>Vud-i5ck%vT=r^yD*^?Mp@Q^v+V zG#-?gKlr}Eeqifb{|So?HM&g91P8|av8hQoCmQXkd?7wIJwb z_^v8bbg`SAn{I*4bH$u(RZ6*xUhuA~hc=8czK8SHEKTzSxgbwi~9(OqJB&gwb^l4+m`k*Q;_?>Y-APi1{k zAHQ)P)G)f|AyjSgcCFps)Fh6Bca*Xznq36!pV6Az&m{O8$wGFD? zY&O*3*J0;_EqM#jh6^gMQKpXV?#1?>$ml1xvh8nSN>-?H=V;nJIwB07YX$e6vLxH( zqYwQ>qxwR(i4f)DLd)-$P>T-no_c!LsN@)8`e;W@)-Hj0>nJ-}Kla4-ZdPJzI&Mce zv)V_j;(3ERN3_@I$N<^|4Lf`B;8n+bX@bHbcZTopEmDI*Jfl)-pFDvo6svPRoo@(x z);_{lY<;);XzT`dBFpRmGrr}z5u1=pC^S-{ce6iXQlLGcItwJ^mZx{m$&DA_oEZ)B{_bYPq-HA zcH8WGoBG(aBU_j)vEy+_71T34@4dmSg!|M8Vf92Zj6WH7Q7t#OHQqWgFE3ARt+%!T z?oLovLVlnf?2c7pTc)~cc^($_8nyKwsN`RA-23ed3sdj(ys%pjjM+9JrctL;dy8a( z@en&CQmnV(()bu|Y%G1-4a(6x{aLytn$T-;(&{QIJB9vMox11U-1HpD@d(QkaJdEb zG{)+6Dos_L+O3NpWo^=gR?evp|CqEG?L&Ut#D*KLaRFOgOEK(Kq1@!EGcTfo+%A&I z=dLbB+d$u{sh?u)xP{PF8L%;YPPW53+@{>5W=Jt#wQpN;0_HYdw1{ksf_XhO4#2F= zyPx6Lx2<92L-;L5PD`zn6zwIH`Jk($?Qw({erA$^bC;q33hv!d!>%wRhj# zal^hk+WGNg;rJtb-EB(?czvOM=H7dl=vblBwAv>}%1@{}mnpUznfq1cE^sgsL0*4I zJ##!*B?=vI_OEVis5o+_IwMIRrpQyT_Sq~ZU%oY7c5JMIADzpD!Upz9h@iWg_>>~j zOLS;wp^i$-E?4<_cp?RiS%Rd?i;f*mOz=~(&3lo<=@(nR!_Rqiprh@weZlL!t#NCc zO!QTcInq|%#>OVgobj{~ixEUec`E25zJ~*DofsQdzIa@5^nOXj2T;8O`l--(QyU^$t?TGY^7#&FQ+2SS3B#qK*k3`ye?8jUYSajE5iBbJls75CCc(m3dk{t?- zopcER9{Z?TC)mk~gpi^kbbu>b-+a{m#8-y2^p$ka4n60w;Sc2}HMf<8JUvhCL0B&Btk)T`ctE$*qNW8L$`7!r^9T+>=<=2qaq-;ll2{`{Rg zc5a0ZUI$oG&j-qVOuKa=*v4aY#IsoM+1|c4Z)<}lEDvy;5huB@1RJPquU2U*U-;gu z=En2m+qjBzR#DEJDO`WU)hdd{Vj%^0V*KoyZ|5lzV87&g_j~NCjwv0uQVqXOb*QrQ zy|Qn`hxx(58c70$E;L(X0uZZ72M1!6oeg)(cdKO ze0gDaTz+ohR-#d)NbAH4x{I(21yjwvBQfmpLu$)|m{XolbgF!pmsqJ#D}(ylp6uC> z{bqtcI#hT#HW=wl7>p!38sKsJ`r8}lt-q%Keqy%u(xk=yiIJiUw6|5IvkS+#?JTBl z8H5(Q?l#wzazujH!8o>1xtn8#_w+397*_cy8!pQGP%K(Ga3pAjsaTbbXJlQF_+m+-UpUUent@xM zg%jqLUExj~o^vQ3Gl*>wh=_gOr2*|U64_iXb+-111aH}$TjeajM+I20xw(((>fej-@CIz4S1pi$(#}P7`4({6QS2CaQS4NPENDp>sAqD z$bH4KGzXGffkJ7R>V>)>tC)uax{UsN*dbeNC*v}#8Y#OWYwL4t$ePR?VTyIs!wea+ z5Urmc)X|^`MG~*dS6pGSbU+gPJoq*^a=_>$n4|P^w$sMBBy@f*Z^Jg6?n5?oId6f{ z$LW4M|4m502z0t7g<#Bx%X;9<=)smFolV&(V^(7Cv2-sxbxopQ!)*#ZRhTBpx1)Fc zNm1T%bONzv6@#|dz(w02AH8OXe>kQ#1FMCzO}2J_mST)+ExmBr9cva-@?;wnmWMOk z{3_~EX_xadgJGv&H@zK_8{(x84`}+c?oSBX*Ge3VdfTt&F}yCpFP?CpW+BE^cWY0^ zb&uBN!Ja3UzYHK-CTyA5=L zEMW{l3Usky#ly=7px648W31UNV@K)&Ub&zP1c7%)`{);I4b0Q<)B}3;NMG2JH=X$U zfIW4)4n9ZM`-yRj67I)YSLDK)qfUJ_ij}a#aZN~9EXrh8eZY2&=uY%2N0UFF7<~%M zsB8=erOWZ>Ct_#^tHZ|*q`H;A)5;ycw*IcmVxi8_0Xk}aJA^ath+E;xg!x+As(M#0=)3!NJR6H&9+zd#iP(m0PIW8$ z1Y^VX`>jm`W!=WpF*{ioM?C9`yOR>@0q=u7o>BP-eSHqCgMDj!2anwH?s%i2p+Q7D zzszIf5XJpE)IG4;d_(La-xenmF(tgAxK`Y4sQ}BSJEPs6N_U2vI{8=0C_F?@7<(G; zo$~G=8p+076G;`}>{MQ>t>7cm=zGtfbdDXm6||jUU|?X?CaE?(<6bKDYKeHlz}DA8 zXT={X=yp_R;HfJ9h%?eWvQ!dRgz&Su*JfNt!Wu>|XfU&68iRikRrHRW|ZxzRR^`eIGt zIeiDgVS>IeExKVRWW8-=A=yA`}`)ZkWBrZD`hpWIxBGkh&f#ijr449~m`j6{4jiJ*C!oVA8ZC?$1RM#K(_b zL9TW)kN*Y4%^-qPpMP7d4)o?Nk#>aoYHT(*g)qmRUb?**F@pnNiy6Fv9rEiUqD(^O zzyS?nBrX63BTRYduaG(0VVG2yJRe%o&rVrLjbxTaAFTd8s;<<@Qs>u(<193R8>}2_ zuwp{7;H2a*X7_jryzriZXMg?bTuegABb^87@SsKkr2)0Gyiax8KQWstw^v#ix45EVrcEhr>!NMhprl$InQMzjSFH54x5k9qHc`@9uKQzvL4ihcq{^B zPrVR=o_ic%Y>6&rMN)hTZsI7I<3&`#(nl+3y3ys9A~&^=4?PL&nd8)`OfG#n zwAMN$1&>K++c{^|7<4P=2y(B{jJsQ0a#U;HTo4ZmWZYvI{+s;Td{Yzem%0*k#)vjpB zia;J&>}ICate44SFYY3vEelqStQWFihx%^vQ@Do(sOy7yR2@WNv7Y9I^yL=nZr3mb zXKV5t@=?-Sk|b{XMhA7ZGB@2hqsx}4xwCW!in#C zI@}scZlr3-NFJ@NFaJlhyfcw{k^vvtGl`N9xSo**rDW4S}i zM9{fMPWo%4wYDG~BZ18BD+}h|GQKc-g^{++3MY>}W_uq7jGHx{mwE9fZiPCoxN$+7 zrODGGJrOkcPQUB(FD5aoS4g~7#6NR^ma7-!>mHuJfY5kTe6PpNNKC9GGRiu^L31uG z$7v`*JknQHsYB!Tm_W{a32TM099djW%5e+j0Ve_ct}IM>XLF1Ap+YvcrLV=|CKo6S zb+9Nl3_YdKP6%Cxy@6TxZ>;4&nTneadr z_ES90ydCev)LV!dN=#(*f}|ZORFdvkYBni^aLbUk>BajeWIOcmHP#8S)*2U~QKI%S zyrLmtPqb&TphJ;>yAxri#;{uyk`JJqODDw%(Z=2`1uc}br^V%>j!gS)D*q*f_-qf8&D;W1dJgQMlaH5er zN2U<%Smb7==vE}dDI8K7cKz!vs^73o9f>2sgiTzWcwY|BMYHH5%Vn7#kiw&eItCqa zIkR2~Q}>X=Ar8W|^Ms41Fm8o6IB2_j60eOeBB1Br!boW7JnoeX6Gs)?7rW0^5psc- zjS16yb>dFn>KPOF;imD}e!enuIniFzv}n$m2#gCCv4jM#ArwlzZ$7@9&XkFxZ4n!V zj3dyiwW4Ki2QG{@i>yuZXQizw_OkZI^-3otXC{!(lUpJF33gI60ak;Uqitp74|B6I zgg{b=Iz}WkhCGj1M=hu4#Aw173YxIVbISaoc z-nLZC*6Tgivd5V`K%GxhBsp@SUU60-rfc$=wb>zdJzXS&-5(NRRodFk;Kxk!S(O(a0e7oY=E( zAyS;Ow?6Q&XA+cnkCb{28_1N8H#?J!*$MmIwLq^*T_9-z^&UE@A(z9oGYtFy6EZef LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/y-trash/client_frontend copy/src/app/globals.css b/y-trash/client_frontend copy/src/app/globals.css new file mode 100644 index 0000000..dc98be7 --- /dev/null +++ b/y-trash/client_frontend copy/src/app/globals.css @@ -0,0 +1,122 @@ +@import "tailwindcss"; +@import "tw-animate-css"; + +@custom-variant dark (&:is(.dark *)); + +@theme inline { + --color-background: var(--background); + --color-foreground: var(--foreground); + --font-sans: var(--font-geist-sans); + --font-mono: var(--font-geist-mono); + --color-sidebar-ring: var(--sidebar-ring); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar: var(--sidebar); + --color-chart-5: var(--chart-5); + --color-chart-4: var(--chart-4); + --color-chart-3: var(--chart-3); + --color-chart-2: var(--chart-2); + --color-chart-1: var(--chart-1); + --color-ring: var(--ring); + --color-input: var(--input); + --color-border: var(--border); + --color-destructive: var(--destructive); + --color-accent-foreground: var(--accent-foreground); + --color-accent: var(--accent); + --color-muted-foreground: var(--muted-foreground); + --color-muted: var(--muted); + --color-secondary-foreground: var(--secondary-foreground); + --color-secondary: var(--secondary); + --color-primary-foreground: var(--primary-foreground); + --color-primary: var(--primary); + --color-popover-foreground: var(--popover-foreground); + --color-popover: var(--popover); + --color-card-foreground: var(--card-foreground); + --color-card: var(--card); + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); +} + +:root { + --radius: 0.625rem; + --background: oklch(1 0 0); + --foreground: oklch(0.145 0 0); + --card: oklch(1 0 0); + --card-foreground: oklch(0.145 0 0); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.145 0 0); + --primary: oklch(0.205 0 0); + --primary-foreground: oklch(0.985 0 0); + --secondary: oklch(0.97 0 0); + --secondary-foreground: oklch(0.205 0 0); + --muted: oklch(0.97 0 0); + --muted-foreground: oklch(0.556 0 0); + --accent: oklch(0.97 0 0); + --accent-foreground: oklch(0.205 0 0); + --destructive: oklch(0.577 0.245 27.325); + --border: oklch(0.922 0 0); + --input: oklch(0.922 0 0); + --ring: oklch(0.708 0 0); + --chart-1: oklch(0.646 0.222 41.116); + --chart-2: oklch(0.6 0.118 184.704); + --chart-3: oklch(0.398 0.07 227.392); + --chart-4: oklch(0.828 0.189 84.429); + --chart-5: oklch(0.769 0.188 70.08); + --sidebar: oklch(0.985 0 0); + --sidebar-foreground: oklch(0.145 0 0); + --sidebar-primary: oklch(0.205 0 0); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.97 0 0); + --sidebar-accent-foreground: oklch(0.205 0 0); + --sidebar-border: oklch(0.922 0 0); + --sidebar-ring: oklch(0.708 0 0); +} + +.dark { + --background: oklch(0.145 0 0); + --foreground: oklch(0.985 0 0); + --card: oklch(0.205 0 0); + --card-foreground: oklch(0.985 0 0); + --popover: oklch(0.205 0 0); + --popover-foreground: oklch(0.985 0 0); + --primary: oklch(0.922 0 0); + --primary-foreground: oklch(0.205 0 0); + --secondary: oklch(0.269 0 0); + --secondary-foreground: oklch(0.985 0 0); + --muted: oklch(0.269 0 0); + --muted-foreground: oklch(0.708 0 0); + --accent: oklch(0.269 0 0); + --accent-foreground: oklch(0.985 0 0); + --destructive: oklch(0.704 0.191 22.216); + --border: oklch(1 0 0 / 10%); + --input: oklch(1 0 0 / 15%); + --ring: oklch(0.556 0 0); + --chart-1: oklch(0.488 0.243 264.376); + --chart-2: oklch(0.696 0.17 162.48); + --chart-3: oklch(0.769 0.188 70.08); + --chart-4: oklch(0.627 0.265 303.9); + --chart-5: oklch(0.645 0.246 16.439); + --sidebar: oklch(0.205 0 0); + --sidebar-foreground: oklch(0.985 0 0); + --sidebar-primary: oklch(0.488 0.243 264.376); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.269 0 0); + --sidebar-accent-foreground: oklch(0.985 0 0); + --sidebar-border: oklch(1 0 0 / 10%); + --sidebar-ring: oklch(0.556 0 0); +} + +@layer base { + * { + @apply border-border outline-ring/50; + } + body { + @apply bg-background text-foreground; + } +} diff --git a/y-trash/client_frontend copy/src/app/layout.tsx b/y-trash/client_frontend copy/src/app/layout.tsx new file mode 100644 index 0000000..f7fa87e --- /dev/null +++ b/y-trash/client_frontend copy/src/app/layout.tsx @@ -0,0 +1,34 @@ +import type { Metadata } from "next"; +import { Geist, Geist_Mono } from "next/font/google"; +import "./globals.css"; + +const geistSans = Geist({ + variable: "--font-geist-sans", + subsets: ["latin"], +}); + +const geistMono = Geist_Mono({ + variable: "--font-geist-mono", + subsets: ["latin"], +}); + +export const metadata: Metadata = { + title: "Create Next App", + description: "Generated by create next app", +}; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + + {children} + + + ); +} diff --git a/y-trash/client_frontend copy/src/app/page.tsx b/y-trash/client_frontend copy/src/app/page.tsx new file mode 100644 index 0000000..1236d6c --- /dev/null +++ b/y-trash/client_frontend copy/src/app/page.tsx @@ -0,0 +1,32 @@ +"use server"; +import Link from "next/link"; + +export default async function Home() { + const currentDate = new Date().toLocaleString("tr-TR", { timeZone: "Europe/Istanbul" }); + + return ( +
+
+ +
+

Welcome to EVYOS

+

Enterprise Management System

+

Server Time: {currentDate}

+
+ +
+
+ Go to Sign In +
+ +
+

© {new Date().getFullYear()} EVYOS. All rights reserved.

+
+
+
+
+ ); +} \ No newline at end of file diff --git a/y-trash/client_frontend copy/src/components/custom/content/PageToBeChildrendMulti.tsx b/y-trash/client_frontend copy/src/components/custom/content/PageToBeChildrendMulti.tsx new file mode 100644 index 0000000..092d2c8 --- /dev/null +++ b/y-trash/client_frontend copy/src/components/custom/content/PageToBeChildrendMulti.tsx @@ -0,0 +1,11 @@ +import { ContentProps } from "@/validations/mutual/dashboard/props"; +import { resolveWhichPageToRenderMulti } from "@/pages/resolver/resolver"; +import ContentToRenderNoPage from "@/pages/mutual/noContent/page"; + +const PageToBeChildrendMulti: React.FC = async ({ lang, translations, activePageUrl, mode }) => { + const ApplicationToRender = await resolveWhichPageToRenderMulti({ activePageUrl }) + if (!ApplicationToRender) return + return +} + +export default PageToBeChildrendMulti diff --git a/y-trash/client_frontend copy/src/components/custom/content/PageToBeChildrendSingle.tsx b/y-trash/client_frontend copy/src/components/custom/content/PageToBeChildrendSingle.tsx new file mode 100644 index 0000000..4cf93a8 --- /dev/null +++ b/y-trash/client_frontend copy/src/components/custom/content/PageToBeChildrendSingle.tsx @@ -0,0 +1,13 @@ +import { ContentProps } from "@/validations/mutual/dashboard/props"; +import ContentToRenderNoPage from "@/pages/mutual/noContent/page"; +import { resolveWhichPageToRenderSingle } from "@/pages/resolver/resolver"; + +const PageToBeChildrendSingle: React.FC = async ({ lang, translations, activePageUrl, mode }) => { + const ApplicationToRender = await resolveWhichPageToRenderSingle({ activePageUrl }) + if (ApplicationToRender) { + return + } + return +} + +export default PageToBeChildrendSingle diff --git a/y-trash/client_frontend copy/src/components/custom/content/component.tsx b/y-trash/client_frontend copy/src/components/custom/content/component.tsx new file mode 100644 index 0000000..69ed7aa --- /dev/null +++ b/y-trash/client_frontend copy/src/components/custom/content/component.tsx @@ -0,0 +1,17 @@ +'use server'; +import { FC, Suspense } from "react"; +import { ContentProps, ModeTypes, ModeTypesList } from "@/validations/mutual/dashboard/props"; +import LoadingContent from "@/components/mutual/loader/component"; +import PageToBeChildrendSingle from "./PageToBeChildrendSingle"; +import PageToBeChildrendMulti from "./PageToBeChildrendMulti"; + +const ContentComponent: FC = async ({ lang, translations, activePageUrl, isMulti, mode }) => { + const modeFromQuery = ModeTypesList.includes(mode || '') ? mode : 'shortList' + const renderProps = { lang, translations, activePageUrl, mode: modeFromQuery as ModeTypes } + const PageToBeChildrend = isMulti ? PageToBeChildrendMulti : PageToBeChildrendSingle + const loadingContent = + const classNameDiv = "fixed top-24 left-80 right-0 py-10 px-15 border-emerald-150 border-l-2 overflow-y-auto h-[calc(100vh-64px)]" + return
+}; + +export default ContentComponent; diff --git a/y-trash/client_frontend copy/src/components/custom/footer/component.tsx b/y-trash/client_frontend copy/src/components/custom/footer/component.tsx new file mode 100644 index 0000000..ee6bf0e --- /dev/null +++ b/y-trash/client_frontend copy/src/components/custom/footer/component.tsx @@ -0,0 +1,14 @@ +'use server'; +import { FC } from "react"; +import { langGetKey } from "@/lib/langGet"; +import { FooterProps } from "@/validations/mutual/dashboard/props"; + +const FooterComponent: FC = ({ translations }) => { + return ( +
+

{langGetKey(translations, "footer")}: {langGetKey(translations, "page")}

+
+ ); +}; + +export default FooterComponent; diff --git a/y-trash/client_frontend copy/src/components/custom/header/component.tsx b/y-trash/client_frontend copy/src/components/custom/header/component.tsx new file mode 100644 index 0000000..6c484a0 --- /dev/null +++ b/y-trash/client_frontend copy/src/components/custom/header/component.tsx @@ -0,0 +1,20 @@ +'use server'; +import { FC } from "react"; +import { HeaderProps } from "@/validations/mutual/dashboard/props"; +import LanguageSelectionComponent from "@/components/mutual/languageSelection/component"; +import { langGetKey } from "@/lib/langGet"; + +const HeaderComponent: FC = ({ translations, lang, activePageUrl, prefix }) => { + + return ( +
+
+

{langGetKey(translations, 'selectedPage')} :

+

{langGetKey(translations, 'page')}

+
+ +
+ ); +}; + +export default HeaderComponent; diff --git a/y-trash/client_frontend copy/src/components/custom/menu/component.tsx b/y-trash/client_frontend copy/src/components/custom/menu/component.tsx new file mode 100644 index 0000000..9ef0f44 --- /dev/null +++ b/y-trash/client_frontend copy/src/components/custom/menu/component.tsx @@ -0,0 +1,141 @@ +'use client'; +import { FC, useState, useEffect } from "react"; +import { MenuProps } from "@/validations/mutual/dashboard/props"; +import { langGetKey } from "@/lib/langGet"; +import { parseURlFormString } from "@/lib/menuGet"; +import { menuTranslation } from "@/languages/mutual/menu" +import FirstLayerDropdown from "./firstLayerComponent"; +import SecondLayerDropdown from "./secondLayerComponent"; +import ThirdLayerDropdown from "./thirdLayerComponent"; + +// Define types for menu structure +type ThirdLayerItem = Record; +type SecondLayerItems = Record; +type FirstLayerItems = Record; +type MenuStructure = FirstLayerItems; + + + +// Helper function to get translation for a URL path +const getMenuTranslation = (translations: any, urlPath: string) => { + // Try exact match first + if (translations[urlPath]) { + return translations[urlPath]; + } + + // Remove leading slash if present for lookup + const cleanPath = urlPath.startsWith('/') ? urlPath.substring(1) : urlPath; + if (translations[cleanPath]) { + return translations[cleanPath]; + } + + // Add leading slash if not present for lookup + const pathWithSlash = urlPath.startsWith('/') ? urlPath : `/${urlPath}`; + if (translations[pathWithSlash]) { + return translations[pathWithSlash]; + } + + // Try to find the closest matching path + const keys = Object.keys(translations); + for (const key of keys) { + // Remove leading slash for comparison + const cleanKey = key.startsWith('/') ? key.substring(1) : key; + const cleanUrlPath = urlPath.startsWith('/') ? urlPath.substring(1) : urlPath; + + if (cleanUrlPath.includes(cleanKey) || cleanKey.includes(cleanUrlPath)) { + return translations[key]; + } + } + + // If no match found, return the last part of the URL as fallback + const parts = urlPath.split('/'); + return parts[parts.length - 1] || urlPath; +}; + +const MenuComponent: FC = ({ lang, availableApplications, activePageUrl }) => { + + const [expandedFirstLayer, setExpandedFirstLayer] = useState(null); + const [expandedSecondLayer, setExpandedSecondLayer] = useState(null); + const [menuStructure, setMenuStructure] = useState({}); + + const menuTranslationWLang = menuTranslation[lang]; + const activePathLayers = parseURlFormString(activePageUrl).data; + const activeFirstLayer = activePathLayers[0] || null; + const activeSecondLayer = activePathLayers[1] || null; + const activeThirdLayer = activePathLayers.slice(2, activePathLayers.length).join("/"); + + useEffect(() => { + const newMenuStructure: MenuStructure = {}; + availableApplications.forEach(appPath => { + const cleanPath = appPath.startsWith('/') ? appPath.substring(1) : appPath; + const pathParts = cleanPath.split('/'); + if (pathParts.length >= 3) { + const firstLayer = pathParts[0]; + const secondLayer = pathParts[1]; + const thirdLayer = pathParts.slice(2).join('/'); + if (!newMenuStructure[firstLayer]) { newMenuStructure[firstLayer] = {} } + if (!newMenuStructure[firstLayer][secondLayer]) { newMenuStructure[firstLayer][secondLayer] = {} } + newMenuStructure[firstLayer][secondLayer][thirdLayer] = true; + } + }); + setMenuStructure(newMenuStructure); + }, [availableApplications]); + + useEffect(() => { if (activeFirstLayer) { setExpandedFirstLayer(activeFirstLayer); if (activeSecondLayer) { setExpandedSecondLayer(activeSecondLayer) } } }, [activeFirstLayer, activeSecondLayer]); + + const handleFirstLayerClick = (key: string) => { if (expandedFirstLayer === key) { setExpandedFirstLayer(null); setExpandedSecondLayer(null) } else { setExpandedFirstLayer(key); setExpandedSecondLayer(null) } }; + const handleSecondLayerClick = (key: string) => { if (expandedSecondLayer === key) { setExpandedSecondLayer(null) } else { setExpandedSecondLayer(key) } }; + + const renderThirdLayerItems = (firstLayerKey: string, secondLayerKey: string, thirdLayerItems: ThirdLayerItem) => { + const baseUrl = `/${firstLayerKey}/${secondLayerKey}`; + return Object.keys(thirdLayerItems).map(thirdLayerKey => { + const isActive = activeFirstLayer === firstLayerKey && activeSecondLayer === secondLayerKey && activeThirdLayer === thirdLayerKey; + const mergeUrl = `${baseUrl}/${thirdLayerKey}`; + const url = `/${lang}${baseUrl}/${thirdLayerKey}`; + console.log('mergeUrl', mergeUrl); + return
+ }); + }; + + const renderSecondLayerItems = (firstLayerKey: string, secondLayerItems: SecondLayerItems) => { + return Object.entries(secondLayerItems).map(([secondLayerKey, thirdLayerItems]) => { + const isActive = activeFirstLayer === firstLayerKey && activeSecondLayer === secondLayerKey; + const isExpanded = expandedSecondLayer === secondLayerKey; + const mergeUrl = `/${firstLayerKey}/${secondLayerKey}`; + console.log('mergeUrl', mergeUrl); + return ( +
+ handleSecondLayerClick(secondLayerKey)} /> + {isExpanded && (
{renderThirdLayerItems(firstLayerKey, secondLayerKey, thirdLayerItems)}
)} +
+ ); + }); + }; + + const renderFirstLayerItems = () => { + return Object.entries(menuStructure).map(([firstLayerKey, secondLayerItems]) => { + const isActive = activeFirstLayer === firstLayerKey; + const isExpanded = expandedFirstLayer === firstLayerKey; + const mergeUrl = `/${firstLayerKey}`; + console.log('mergeUrl', mergeUrl); + return ( +
+ handleFirstLayerClick(firstLayerKey)} /> + {isExpanded && (
{renderSecondLayerItems(firstLayerKey, secondLayerItems)}
)} +
+ ); + }); + }; + + return ( +
+
+ {renderFirstLayerItems()} +
+
+ ); +}; + + + +export default MenuComponent; diff --git a/y-trash/client_frontend copy/src/components/custom/menu/firstLayerComponent.tsx b/y-trash/client_frontend copy/src/components/custom/menu/firstLayerComponent.tsx new file mode 100644 index 0000000..8101850 --- /dev/null +++ b/y-trash/client_frontend copy/src/components/custom/menu/firstLayerComponent.tsx @@ -0,0 +1,41 @@ +'use client'; +import { FC } from "react"; + +interface FirstLayerDropdownProps { + isActive: boolean; + isExpanded: boolean; + innerText: string; + onClick: () => void; +} + +const FirstLayerDropdown: FC = ({ isActive, isExpanded, innerText, onClick }) => { + // Base styles + const baseClassName = "py-3 px-4 text-sm rounded-xl cursor-pointer transition-colors duration-200 flex justify-between items-center w-full"; + + // Determine the appropriate class based on active and expanded states + let className = baseClassName; + if (isActive) { + className += " bg-emerald-700 text-white font-medium"; + } else if (isExpanded) { + className += " bg-emerald-600 text-white"; + } else { + className += " bg-emerald-800 text-white hover:bg-emerald-700"; + } + + return ( +
+ {innerText} + {isExpanded ? ( + + + + ) : ( + + + + )} +
+ ); +}; + +export default FirstLayerDropdown; diff --git a/y-trash/client_frontend copy/src/components/custom/menu/secondLayerComponent.tsx b/y-trash/client_frontend copy/src/components/custom/menu/secondLayerComponent.tsx new file mode 100644 index 0000000..b6abf98 --- /dev/null +++ b/y-trash/client_frontend copy/src/components/custom/menu/secondLayerComponent.tsx @@ -0,0 +1,41 @@ +'use client'; +import { FC } from "react"; + +interface SecondLayerDropdownProps { + isActive: boolean; + isExpanded: boolean; + innerText: string; + onClick: () => void; +} + +const SecondLayerDropdown: FC = ({ isActive, isExpanded, innerText, onClick }) => { + // Base styles + const baseClassName = "py-2 my-1 px-3 text-sm rounded-lg cursor-pointer transition-colors duration-200 flex justify-between items-center w-full"; + + // Determine the appropriate class based on active and expanded states + let className = baseClassName; + if (isActive) { + className += " bg-emerald-600 text-white font-medium"; + } else if (isExpanded) { + className += " bg-emerald-500 text-white"; + } else { + className += " bg-emerald-700 text-white hover:bg-emerald-600"; + } + + return ( +
+ {innerText} + {isExpanded ? ( + + + + ) : ( + + + + )} +
+ ); +}; + +export default SecondLayerDropdown; \ No newline at end of file diff --git a/y-trash/client_frontend copy/src/components/custom/menu/thirdLayerComponent.tsx b/y-trash/client_frontend copy/src/components/custom/menu/thirdLayerComponent.tsx new file mode 100644 index 0000000..304a69e --- /dev/null +++ b/y-trash/client_frontend copy/src/components/custom/menu/thirdLayerComponent.tsx @@ -0,0 +1,50 @@ +'use client' +import { FC, useState } from "react"; +import Link from "next/link"; +import LoadingContent from "@/components/mutual/loader/component"; + +interface ThirdLayerDropdownProps { + isActive: boolean, + innerText: string, + url: string, +} + +const ThirdLayerDropdown: FC = ({ isActive, innerText, url }) => { + const [isLoading, setIsLoading] = useState(false); + + // Base styles + const baseClassName = "py-2 my-1 px-3 text-sm rounded-lg bg-black transition-colors duration-200 flex items-center w-full"; + + // Determine the appropriate class based on active state + let className = baseClassName; + if (isActive) { + className += " bg-emerald-500 text-white font-medium"; + } else { + className += " bg-emerald-600 text-white hover:bg-emerald-500"; + } + + if (isActive) { + return ( +
+ {innerText} +
+ ); + } else if (isLoading) { + return ( +
+ + {innerText} +
+ ); + } else { + return ( + setIsLoading(true)} className="block"> +
+ {innerText} +
+ + ); + } +}; + +export default ThirdLayerDropdown; diff --git a/y-trash/client_frontend copy/src/components/custom/menu/type.ts b/y-trash/client_frontend copy/src/components/custom/menu/type.ts new file mode 100644 index 0000000..6f5c88c --- /dev/null +++ b/y-trash/client_frontend copy/src/components/custom/menu/type.ts @@ -0,0 +1,5 @@ +interface IntrerfaceLayerDropdown { + isActive: boolean; + innerText: string; + onClick: () => void; +} diff --git a/y-trash/client_frontend copy/src/components/mutual/languageSelection/component.tsx b/y-trash/client_frontend copy/src/components/mutual/languageSelection/component.tsx new file mode 100644 index 0000000..1a83e57 --- /dev/null +++ b/y-trash/client_frontend copy/src/components/mutual/languageSelection/component.tsx @@ -0,0 +1,39 @@ +'use server'; +import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent } from "@/components/mutual/shadcnui/dropdown-menu"; +import { Button } from "@/components/mutual/shadcnui/button"; +import { languageSelectionTranslation } from "@/languages/mutual/languageSelection"; +import { langGetKey, langGet } from "@/lib/langGet"; +import { LanguageTypes } from "@/validations/mutual/language/validations"; + +import LanguageSelectionItem from "./languageItem"; + +const LanguageSelectionComponent: React.FC<{ lang: LanguageTypes, activePage: string, prefix: string }> = ({ lang, activePage, prefix }) => { + const translations = langGet(lang, languageSelectionTranslation); + const getPageWithLocale = (locale: LanguageTypes): string => { return `${prefix}/${locale}/${activePage}` } + + const englishButtonProps = { + activeLang: lang, + buttonsLang: "en", + refUrl: getPageWithLocale("en"), + innerText: langGetKey(translations, "english") + } + const turkishButtonProps = { + activeLang: lang, + buttonsLang: "tr", + refUrl: getPageWithLocale("tr"), + innerText: langGetKey(translations, "turkish") + } + + return ( +
+ + + + + + +
+ ); +}; + +export default LanguageSelectionComponent; diff --git a/y-trash/client_frontend copy/src/components/mutual/languageSelection/languageItem.tsx b/y-trash/client_frontend copy/src/components/mutual/languageSelection/languageItem.tsx new file mode 100644 index 0000000..9c44293 --- /dev/null +++ b/y-trash/client_frontend copy/src/components/mutual/languageSelection/languageItem.tsx @@ -0,0 +1,38 @@ +'use client'; +import { useState, FC } from "react"; +import { DropdownMenuContent, DropdownMenuLabel } from "@/components/mutual/shadcnui/dropdown-menu"; +import Link from "next/link"; +import LoadingContent from "@/components/mutual/loader/component"; + +const RenderLinkComponent: FC<{ refUrl: string, innerText: string, setisL: (isLoading: boolean) => void }> = ({ refUrl, innerText, setisL }) => { + return ( + setisL(true)}> + + {innerText} + + + ) +} + +const RenderLoadingComponent: FC<{ setisL: (isLoading: boolean) => void }> = ({ setisL }) => { + return ( + + + + + + ) +} + +const LanguageSelectionItem: React.FC<{ + activeLang: string, buttonsLang: string, refUrl: string, innerText: string +}> = ({ activeLang, buttonsLang, refUrl, innerText }) => { + const [isL, setisL] = useState(false); + const isC = buttonsLang !== activeLang + const RenderLinkProp = { refUrl, innerText, setisL } + return ( + <>{isC && <>{isL ? : }} + ) +} + +export default LanguageSelectionItem diff --git a/y-trash/client_frontend copy/src/components/mutual/loader/component.tsx b/y-trash/client_frontend copy/src/components/mutual/loader/component.tsx new file mode 100644 index 0000000..8f74631 --- /dev/null +++ b/y-trash/client_frontend copy/src/components/mutual/loader/component.tsx @@ -0,0 +1,10 @@ +import { Loader2 } from "lucide-react"; + +const LoadingContent: React.FC<{ height: string, size: string, plane: string }> = ({ height = "h-16", size = "w-36 h-48", plane = "h-full w-full" }) => { + return <> +
+
+
+} + +export default LoadingContent \ No newline at end of file diff --git a/y-trash/client_frontend copy/src/components/mutual/navigators/component.tsx b/y-trash/client_frontend copy/src/components/mutual/navigators/component.tsx new file mode 100644 index 0000000..63ab044 --- /dev/null +++ b/y-trash/client_frontend copy/src/components/mutual/navigators/component.tsx @@ -0,0 +1,7 @@ +import Link from "next/link" + +const renderLastRowComponent = (reDirectUrl: string, IconToWrap: any, key: string) => { + return +} + +export { renderLastRowComponent } diff --git a/y-trash/client_frontend copy/src/components/mutual/shadcnui/accordion.tsx b/y-trash/client_frontend copy/src/components/mutual/shadcnui/accordion.tsx new file mode 100644 index 0000000..4a8cca4 --- /dev/null +++ b/y-trash/client_frontend copy/src/components/mutual/shadcnui/accordion.tsx @@ -0,0 +1,66 @@ +"use client" + +import * as React from "react" +import * as AccordionPrimitive from "@radix-ui/react-accordion" +import { ChevronDownIcon } from "lucide-react" + +import { cn } from "@/lib/utils" + +function Accordion({ + ...props +}: React.ComponentProps) { + return +} + +function AccordionItem({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AccordionTrigger({ + className, + children, + ...props +}: React.ComponentProps) { + return ( + + svg]:rotate-180", + className + )} + {...props} + > + {children} + + + + ) +} + +function AccordionContent({ + className, + children, + ...props +}: React.ComponentProps) { + return ( + +
{children}
+
+ ) +} + +export { Accordion, AccordionItem, AccordionTrigger, AccordionContent } diff --git a/y-trash/client_frontend copy/src/components/mutual/shadcnui/alert-dialog.tsx b/y-trash/client_frontend copy/src/components/mutual/shadcnui/alert-dialog.tsx new file mode 100644 index 0000000..18c2e90 --- /dev/null +++ b/y-trash/client_frontend copy/src/components/mutual/shadcnui/alert-dialog.tsx @@ -0,0 +1,157 @@ +"use client" + +import * as React from "react" +import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog" + +import { cn } from "@/lib/utils" +import { buttonVariants } from "@/components/mutual/shadcnui/button" + +function AlertDialog({ + ...props +}: React.ComponentProps) { + return +} + +function AlertDialogTrigger({ + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AlertDialogPortal({ + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AlertDialogOverlay({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AlertDialogContent({ + className, + ...props +}: React.ComponentProps) { + return ( + + + + + ) +} + +function AlertDialogHeader({ + className, + ...props +}: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function AlertDialogFooter({ + className, + ...props +}: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function AlertDialogTitle({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AlertDialogDescription({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AlertDialogAction({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AlertDialogCancel({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +export { + AlertDialog, + AlertDialogPortal, + AlertDialogOverlay, + AlertDialogTrigger, + AlertDialogContent, + AlertDialogHeader, + AlertDialogFooter, + AlertDialogTitle, + AlertDialogDescription, + AlertDialogAction, + AlertDialogCancel, +} diff --git a/y-trash/client_frontend copy/src/components/mutual/shadcnui/alert.tsx b/y-trash/client_frontend copy/src/components/mutual/shadcnui/alert.tsx new file mode 100644 index 0000000..1421354 --- /dev/null +++ b/y-trash/client_frontend copy/src/components/mutual/shadcnui/alert.tsx @@ -0,0 +1,66 @@ +import * as React from "react" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const alertVariants = cva( + "relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current", + { + variants: { + variant: { + default: "bg-card text-card-foreground", + destructive: + "text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +function Alert({ + className, + variant, + ...props +}: React.ComponentProps<"div"> & VariantProps) { + return ( +
+ ) +} + +function AlertTitle({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function AlertDescription({ + className, + ...props +}: React.ComponentProps<"div">) { + return ( +
+ ) +} + +export { Alert, AlertTitle, AlertDescription } diff --git a/y-trash/client_frontend copy/src/components/mutual/shadcnui/aspect-ratio.tsx b/y-trash/client_frontend copy/src/components/mutual/shadcnui/aspect-ratio.tsx new file mode 100644 index 0000000..3df3fd0 --- /dev/null +++ b/y-trash/client_frontend copy/src/components/mutual/shadcnui/aspect-ratio.tsx @@ -0,0 +1,11 @@ +"use client" + +import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio" + +function AspectRatio({ + ...props +}: React.ComponentProps) { + return +} + +export { AspectRatio } diff --git a/y-trash/client_frontend copy/src/components/mutual/shadcnui/avatar.tsx b/y-trash/client_frontend copy/src/components/mutual/shadcnui/avatar.tsx new file mode 100644 index 0000000..71e428b --- /dev/null +++ b/y-trash/client_frontend copy/src/components/mutual/shadcnui/avatar.tsx @@ -0,0 +1,53 @@ +"use client" + +import * as React from "react" +import * as AvatarPrimitive from "@radix-ui/react-avatar" + +import { cn } from "@/lib/utils" + +function Avatar({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AvatarImage({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AvatarFallback({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +export { Avatar, AvatarImage, AvatarFallback } diff --git a/y-trash/client_frontend copy/src/components/mutual/shadcnui/badge.tsx b/y-trash/client_frontend copy/src/components/mutual/shadcnui/badge.tsx new file mode 100644 index 0000000..0205413 --- /dev/null +++ b/y-trash/client_frontend copy/src/components/mutual/shadcnui/badge.tsx @@ -0,0 +1,46 @@ +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const badgeVariants = cva( + "inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden", + { + variants: { + variant: { + default: + "border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90", + secondary: + "border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90", + destructive: + "border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60", + outline: + "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +function Badge({ + className, + variant, + asChild = false, + ...props +}: React.ComponentProps<"span"> & + VariantProps & { asChild?: boolean }) { + const Comp = asChild ? Slot : "span" + + return ( + + ) +} + +export { Badge, badgeVariants } diff --git a/y-trash/client_frontend copy/src/components/mutual/shadcnui/button.tsx b/y-trash/client_frontend copy/src/components/mutual/shadcnui/button.tsx new file mode 100644 index 0000000..a2df8dc --- /dev/null +++ b/y-trash/client_frontend copy/src/components/mutual/shadcnui/button.tsx @@ -0,0 +1,59 @@ +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const buttonVariants = cva( + "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", + { + variants: { + variant: { + default: + "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90", + destructive: + "bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60", + outline: + "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50", + secondary: + "bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80", + ghost: + "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-9 px-4 py-2 has-[>svg]:px-3", + sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5", + lg: "h-10 rounded-md px-6 has-[>svg]:px-4", + icon: "size-9", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + } +) + +function Button({ + className, + variant, + size, + asChild = false, + ...props +}: React.ComponentProps<"button"> & + VariantProps & { + asChild?: boolean + }) { + const Comp = asChild ? Slot : "button" + + return ( + + ) +} + +export { Button, buttonVariants } diff --git a/y-trash/client_frontend copy/src/components/mutual/shadcnui/calendar.tsx b/y-trash/client_frontend copy/src/components/mutual/shadcnui/calendar.tsx new file mode 100644 index 0000000..d729e16 --- /dev/null +++ b/y-trash/client_frontend copy/src/components/mutual/shadcnui/calendar.tsx @@ -0,0 +1,75 @@ +"use client" + +import * as React from "react" +import { ChevronLeft, ChevronRight } from "lucide-react" +import { DayPicker } from "react-day-picker" + +import { cn } from "@/lib/utils" +import { buttonVariants } from "@/components/mutual/shadcnui/button" + +function Calendar({ + className, + classNames, + showOutsideDays = true, + ...props +}: React.ComponentProps) { + return ( + .day-range-end)]:rounded-r-md [&:has(>.day-range-start)]:rounded-l-md first:[&:has([aria-selected])]:rounded-l-md last:[&:has([aria-selected])]:rounded-r-md" + : "[&:has([aria-selected])]:rounded-md" + ), + day: cn( + buttonVariants({ variant: "ghost" }), + "size-8 p-0 font-normal aria-selected:opacity-100" + ), + day_range_start: + "day-range-start aria-selected:bg-primary aria-selected:text-primary-foreground", + day_range_end: + "day-range-end aria-selected:bg-primary aria-selected:text-primary-foreground", + day_selected: + "bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground focus:bg-primary focus:text-primary-foreground", + day_today: "bg-accent text-accent-foreground", + day_outside: + "day-outside text-muted-foreground aria-selected:text-muted-foreground", + day_disabled: "text-muted-foreground opacity-50", + day_range_middle: + "aria-selected:bg-accent aria-selected:text-accent-foreground", + day_hidden: "invisible", + ...classNames, + }} + components={{ + IconLeft: ({ className, ...props }) => ( + + ), + IconRight: ({ className, ...props }) => ( + + ), + }} + {...props} + /> + ) +} + +export { Calendar } diff --git a/y-trash/client_frontend copy/src/components/mutual/shadcnui/card.tsx b/y-trash/client_frontend copy/src/components/mutual/shadcnui/card.tsx new file mode 100644 index 0000000..d05bbc6 --- /dev/null +++ b/y-trash/client_frontend copy/src/components/mutual/shadcnui/card.tsx @@ -0,0 +1,92 @@ +import * as React from "react" + +import { cn } from "@/lib/utils" + +function Card({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function CardHeader({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function CardTitle({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function CardDescription({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function CardAction({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function CardContent({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function CardFooter({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +export { + Card, + CardHeader, + CardFooter, + CardTitle, + CardAction, + CardDescription, + CardContent, +} diff --git a/y-trash/client_frontend copy/src/components/mutual/shadcnui/checkbox.tsx b/y-trash/client_frontend copy/src/components/mutual/shadcnui/checkbox.tsx new file mode 100644 index 0000000..fa0e4b5 --- /dev/null +++ b/y-trash/client_frontend copy/src/components/mutual/shadcnui/checkbox.tsx @@ -0,0 +1,32 @@ +"use client" + +import * as React from "react" +import * as CheckboxPrimitive from "@radix-ui/react-checkbox" +import { CheckIcon } from "lucide-react" + +import { cn } from "@/lib/utils" + +function Checkbox({ + className, + ...props +}: React.ComponentProps) { + return ( + + + + + + ) +} + +export { Checkbox } diff --git a/y-trash/client_frontend copy/src/components/mutual/shadcnui/collapsible.tsx b/y-trash/client_frontend copy/src/components/mutual/shadcnui/collapsible.tsx new file mode 100644 index 0000000..ae9fad0 --- /dev/null +++ b/y-trash/client_frontend copy/src/components/mutual/shadcnui/collapsible.tsx @@ -0,0 +1,33 @@ +"use client" + +import * as CollapsiblePrimitive from "@radix-ui/react-collapsible" + +function Collapsible({ + ...props +}: React.ComponentProps) { + return +} + +function CollapsibleTrigger({ + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function CollapsibleContent({ + ...props +}: React.ComponentProps) { + return ( + + ) +} + +export { Collapsible, CollapsibleTrigger, CollapsibleContent } diff --git a/y-trash/client_frontend copy/src/components/mutual/shadcnui/command.tsx b/y-trash/client_frontend copy/src/components/mutual/shadcnui/command.tsx new file mode 100644 index 0000000..bcf961a --- /dev/null +++ b/y-trash/client_frontend copy/src/components/mutual/shadcnui/command.tsx @@ -0,0 +1,177 @@ +"use client" + +import * as React from "react" +import { Command as CommandPrimitive } from "cmdk" +import { SearchIcon } from "lucide-react" + +import { cn } from "@/lib/utils" +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, +} from "@/components/mutual/shadcnui/dialog" + +function Command({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function CommandDialog({ + title = "Command Palette", + description = "Search for a command to run...", + children, + ...props +}: React.ComponentProps & { + title?: string + description?: string +}) { + return ( + + + {title} + {description} + + + + {children} + + + + ) +} + +function CommandInput({ + className, + ...props +}: React.ComponentProps) { + return ( +
+ + +
+ ) +} + +function CommandList({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function CommandEmpty({ + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function CommandGroup({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function CommandSeparator({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function CommandItem({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function CommandShortcut({ + className, + ...props +}: React.ComponentProps<"span">) { + return ( + + ) +} + +export { + Command, + CommandDialog, + CommandInput, + CommandList, + CommandEmpty, + CommandGroup, + CommandItem, + CommandShortcut, + CommandSeparator, +} diff --git a/y-trash/client_frontend copy/src/components/mutual/shadcnui/context-menu.tsx b/y-trash/client_frontend copy/src/components/mutual/shadcnui/context-menu.tsx new file mode 100644 index 0000000..e29ad05 --- /dev/null +++ b/y-trash/client_frontend copy/src/components/mutual/shadcnui/context-menu.tsx @@ -0,0 +1,252 @@ +"use client" + +import * as React from "react" +import * as ContextMenuPrimitive from "@radix-ui/react-context-menu" +import { CheckIcon, ChevronRightIcon, CircleIcon } from "lucide-react" + +import { cn } from "@/lib/utils" + +function ContextMenu({ + ...props +}: React.ComponentProps) { + return +} + +function ContextMenuTrigger({ + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function ContextMenuGroup({ + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function ContextMenuPortal({ + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function ContextMenuSub({ + ...props +}: React.ComponentProps) { + return +} + +function ContextMenuRadioGroup({ + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function ContextMenuSubTrigger({ + className, + inset, + children, + ...props +}: React.ComponentProps & { + inset?: boolean +}) { + return ( + + {children} + + + ) +} + +function ContextMenuSubContent({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function ContextMenuContent({ + className, + ...props +}: React.ComponentProps) { + return ( + + + + ) +} + +function ContextMenuItem({ + className, + inset, + variant = "default", + ...props +}: React.ComponentProps & { + inset?: boolean + variant?: "default" | "destructive" +}) { + return ( + + ) +} + +function ContextMenuCheckboxItem({ + className, + children, + checked, + ...props +}: React.ComponentProps) { + return ( + + + + + + + {children} + + ) +} + +function ContextMenuRadioItem({ + className, + children, + ...props +}: React.ComponentProps) { + return ( + + + + + + + {children} + + ) +} + +function ContextMenuLabel({ + className, + inset, + ...props +}: React.ComponentProps & { + inset?: boolean +}) { + return ( + + ) +} + +function ContextMenuSeparator({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function ContextMenuShortcut({ + className, + ...props +}: React.ComponentProps<"span">) { + return ( + + ) +} + +export { + ContextMenu, + ContextMenuTrigger, + ContextMenuContent, + ContextMenuItem, + ContextMenuCheckboxItem, + ContextMenuRadioItem, + ContextMenuLabel, + ContextMenuSeparator, + ContextMenuShortcut, + ContextMenuGroup, + ContextMenuPortal, + ContextMenuSub, + ContextMenuSubContent, + ContextMenuSubTrigger, + ContextMenuRadioGroup, +} diff --git a/y-trash/client_frontend copy/src/components/mutual/shadcnui/dialog.tsx b/y-trash/client_frontend copy/src/components/mutual/shadcnui/dialog.tsx new file mode 100644 index 0000000..7d7a9d3 --- /dev/null +++ b/y-trash/client_frontend copy/src/components/mutual/shadcnui/dialog.tsx @@ -0,0 +1,135 @@ +"use client" + +import * as React from "react" +import * as DialogPrimitive from "@radix-ui/react-dialog" +import { XIcon } from "lucide-react" + +import { cn } from "@/lib/utils" + +function Dialog({ + ...props +}: React.ComponentProps) { + return +} + +function DialogTrigger({ + ...props +}: React.ComponentProps) { + return +} + +function DialogPortal({ + ...props +}: React.ComponentProps) { + return +} + +function DialogClose({ + ...props +}: React.ComponentProps) { + return +} + +function DialogOverlay({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function DialogContent({ + className, + children, + ...props +}: React.ComponentProps) { + return ( + + + + {children} + + + Close + + + + ) +} + +function DialogHeader({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function DialogFooter({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function DialogTitle({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function DialogDescription({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +export { + Dialog, + DialogClose, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogOverlay, + DialogPortal, + DialogTitle, + DialogTrigger, +} diff --git a/y-trash/client_frontend copy/src/components/mutual/shadcnui/dropdown-menu.tsx b/y-trash/client_frontend copy/src/components/mutual/shadcnui/dropdown-menu.tsx new file mode 100644 index 0000000..ec51e9c --- /dev/null +++ b/y-trash/client_frontend copy/src/components/mutual/shadcnui/dropdown-menu.tsx @@ -0,0 +1,257 @@ +"use client" + +import * as React from "react" +import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu" +import { CheckIcon, ChevronRightIcon, CircleIcon } from "lucide-react" + +import { cn } from "@/lib/utils" + +function DropdownMenu({ + ...props +}: React.ComponentProps) { + return +} + +function DropdownMenuPortal({ + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function DropdownMenuTrigger({ + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function DropdownMenuContent({ + className, + sideOffset = 4, + ...props +}: React.ComponentProps) { + return ( + + + + ) +} + +function DropdownMenuGroup({ + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function DropdownMenuItem({ + className, + inset, + variant = "default", + ...props +}: React.ComponentProps & { + inset?: boolean + variant?: "default" | "destructive" +}) { + return ( + + ) +} + +function DropdownMenuCheckboxItem({ + className, + children, + checked, + ...props +}: React.ComponentProps) { + return ( + + + + + + + {children} + + ) +} + +function DropdownMenuRadioGroup({ + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function DropdownMenuRadioItem({ + className, + children, + ...props +}: React.ComponentProps) { + return ( + + + + + + + {children} + + ) +} + +function DropdownMenuLabel({ + className, + inset, + ...props +}: React.ComponentProps & { + inset?: boolean +}) { + return ( + + ) +} + +function DropdownMenuSeparator({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function DropdownMenuShortcut({ + className, + ...props +}: React.ComponentProps<"span">) { + return ( + + ) +} + +function DropdownMenuSub({ + ...props +}: React.ComponentProps) { + return +} + +function DropdownMenuSubTrigger({ + className, + inset, + children, + ...props +}: React.ComponentProps & { + inset?: boolean +}) { + return ( + + {children} + + + ) +} + +function DropdownMenuSubContent({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +export { + DropdownMenu, + DropdownMenuPortal, + DropdownMenuTrigger, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuLabel, + DropdownMenuItem, + DropdownMenuCheckboxItem, + DropdownMenuRadioGroup, + DropdownMenuRadioItem, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuSub, + DropdownMenuSubTrigger, + DropdownMenuSubContent, +} diff --git a/y-trash/client_frontend copy/src/components/mutual/shadcnui/form.tsx b/y-trash/client_frontend copy/src/components/mutual/shadcnui/form.tsx new file mode 100644 index 0000000..eb79684 --- /dev/null +++ b/y-trash/client_frontend copy/src/components/mutual/shadcnui/form.tsx @@ -0,0 +1,167 @@ +"use client" + +import * as React from "react" +import * as LabelPrimitive from "@radix-ui/react-label" +import { Slot } from "@radix-ui/react-slot" +import { + Controller, + FormProvider, + useFormContext, + useFormState, + type ControllerProps, + type FieldPath, + type FieldValues, +} from "react-hook-form" + +import { cn } from "@/lib/utils" +import { Label } from "@/components/mutual/shadcnui/label" + +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 } = useFormContext() + const formState = useFormState({ name: fieldContext.name }) + 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 +) + +function FormItem({ className, ...props }: React.ComponentProps<"div">) { + const id = React.useId() + + return ( + +
+ + ) +} + +function FormLabel({ + className, + ...props +}: React.ComponentProps) { + const { error, formItemId } = useFormField() + + return ( +