From dc8c653bc783c94731b0576b9bd066ce86c04520 Mon Sep 17 00:00:00 2001 From: kastov Date: Wed, 27 Nov 2024 15:11:46 +0300 Subject: [PATCH] init Co-authored-by: Ivan <84693047+exact01@users.noreply.github.com> --- .gitignore | 133 + .npmrc | 1 + .prettierrc.mjs | 36 + .stylelintignore | 1 + .stylelintrc.json | 28 + .vscode/extensions.json | 3 + .vscode/settings.json | 10 + .yarnrc.yml | 3 + client.d.ts | 2 + eslint.config.js | 7 + index.html | 26 + package-lock.json | 14199 ++++++++++++++++ package.json | 110 + postcss.config.cjs | 19 + src/app.tsx | 37 + src/app/layouts/auth/index.tsx | 12 + .../dashboard/header/header.module.css | 40 + src/app/layouts/dashboard/header/index.tsx | 19 + .../dashboard/header/sidebar-button.tsx | 33 + src/app/layouts/dashboard/index.ts | 3 + src/app/layouts/dashboard/root/index.tsx | 28 + .../layouts/dashboard/root/root.module.css | 80 + src/app/layouts/dashboard/sidebar/index.tsx | 57 + .../dashboard/sidebar/interfaces/index.ts | 1 + .../sidebar/interfaces/menu-item.interface.ts | 15 + .../dashboard/sidebar/menu-sections.ts | 96 + .../dashboard/sidebar/sidebar.module.css | 53 + src/app/router/index.ts | 1 + src/app/router/router.tsx | 36 + src/config.ts | 5 + src/entitites/auth/auth-store/auth-store.ts | 60 + .../auth-store/interfaces/action.interface.ts | 8 + .../auth/auth-store/interfaces/index.ts | 2 + .../auth-store/interfaces/state.interface.ts | 6 + src/entitites/auth/index.ts | 1 + src/entitites/auth/session-store/index.ts | 2 + .../interfaces/action.interface.ts | 8 + .../auth/session-store/interfaces/index.ts | 3 + .../interfaces/set-token-action.interface.ts | 3 + .../interfaces/state.interface.ts | 3 + .../auth/session-store/use-session-store.ts | 42 + .../dashboard-store/dashboard-store.ts | 136 + .../interfaces/action.interface.ts | 10 + .../dashboard-store/interfaces/index.ts | 3 + .../interfaces/state.interface.ts | 16 + .../interfaces/users-params.interface.ts | 10 + .../interfaces/action.interface.ts | 15 + .../user-modal-store/interfaces/index.ts | 2 + .../interfaces/state.interface.ts | 13 + .../user-modal-store/user-modal-store.ts | 96 + src/entitites/dashboard/users/models/index.ts | 2 + .../interfaces/get-tab-data.interface.ts | 7 + .../users/models/interfaces/index.ts | 2 + .../users/models/interfaces/user.type.ts | 3 + .../dashboard/users/models/tabs.entity.ts | 41 + src/entitites/dashboard/users/ui/index.ts | 1 + .../data-usage/data-usage.column.tsx | 42 + .../ui/table-columns/data-usage/index.ts | 2 + .../ui/table-columns/data-usage/interface.ts | 5 + .../dashboard/users/ui/table-columns/index.ts | 3 + .../ui/table-columns/short-uuid/index.ts | 2 + .../ui/table-columns/short-uuid/interface.ts | 5 + .../short-uuid/short-uuid.column.tsx | 23 + .../users/ui/table-columns/status/index.ts | 2 + .../ui/table-columns/status/interface.ts | 5 + .../ui/table-columns/status/status.column.tsx | 19 + .../users/ui/table-columns/username/index.ts | 2 + .../ui/table-columns/username/interface.ts | 5 + .../username/username.column.tsx | 24 + src/features/auth/index.ts | 1 + src/features/auth/login-form.feature.tsx | 65 + .../header-buttons/header-buttons.feature.tsx | 30 + .../dashboard/header-buttons/index.ts | 1 + src/global.css | 10 + src/main.tsx | 4 + src/pages/auth/login/login.page.tsx | 36 + .../dashboard/home/components/home.module.css | 7 + .../dashboard/home/components/home.page.tsx | 115 + src/pages/dashboard/home/components/index.ts | 2 + .../home/components/interfaces/index.ts | 1 + .../components/interfaces/props.interface.ts | 7 + .../home/connectores/constant/constants.ts | 3 + .../home/connectores/constant/index.ts | 1 + .../home/connectores/home.page.connector.tsx | 27 + src/pages/dashboard/home/connectores/index.ts | 1 + .../ui/components/constants/constants.ts | 7 + .../users/ui/components/constants/index.ts | 1 + .../users/ui/components/interfaces/index.ts | 1 + .../components/interfaces/props.interface.ts | 19 + .../users/ui/components/users.page.tsx | 53 + .../interfaces/data-table-return.type.ts | 25 + .../users/ui/connectors/interfaces/index.ts | 1 + .../ui/connectors/users.page.connector.tsx | 209 + src/shared/api/axios.ts | 24 + src/shared/api/index.ts | 1 + src/shared/constants/index.ts | 1 + src/shared/constants/routes.ts | 11 + src/shared/hocs/guards/auth-guard.tsx | 32 + src/shared/hooks/api/auth/auth.ts | 18 + .../get-system-info/get-system-info.query.ts | 8 + src/shared/hooks/api/get-system-info/index.ts | 1 + src/shared/hooks/index.ts | 1 + src/shared/hooks/use-auth.ts | 9 + .../interfaces/breadcrumbds.interface.ts | 4 + src/shared/interfaces/index.ts | 1 + src/shared/providers/auth-provider.tsx | 47 + src/shared/providers/index.ts | 2 + src/shared/providers/mdx-provider.tsx | 14 + src/shared/theme/index.ts | 32 + src/shared/theme/overrides/badge.ts | 9 + src/shared/theme/overrides/breadcrumbs.tsx | 12 + src/shared/theme/overrides/buttons.ts | 15 + .../theme/overrides/card/card.module.css | 3 + src/shared/theme/overrides/card/index.ts | 13 + src/shared/theme/overrides/charts.ts | 11 + src/shared/theme/overrides/drawer.ts | 10 + src/shared/theme/overrides/index.ts | 29 + src/shared/theme/overrides/inputs.ts | 14 + src/shared/theme/overrides/loading-overlay.ts | 13 + src/shared/theme/overrides/menu.ts | 11 + src/shared/theme/overrides/notification.ts | 9 + src/shared/theme/overrides/ring-progress.ts | 10 + src/shared/theme/overrides/table.ts | 9 + src/shared/theme/overrides/tooltip.ts | 10 + src/shared/ui/color-scheme-toggler.tsx | 47 + .../hamburger-button.module.css | 16 + src/shared/ui/hamburger-button/index.tsx | 28 + src/shared/ui/index.ts | 7 + src/shared/ui/loading-screen/index.ts | 1 + .../ui/loading-screen/loading-screen.tsx | 9 + src/shared/ui/logo.tsx | 27 + src/shared/ui/metric-card/index.ts | 17 + .../ui/metric-card/metric-card-bar-chart.tsx | 7 + .../metric-card/metric-card-ring-progress.tsx | 44 + .../ui/metric-card/metric-card-root.tsx | 7 + .../metric-card/metric-card-text-emphasis.tsx | 7 + .../ui/metric-card/metric-card-text-icon.tsx | 17 + .../ui/metric-card/metric-card-text-muted.tsx | 8 + .../ui/metric-card/metric-card-text-trend.tsx | 32 + src/shared/ui/money-input.tsx | 77 + src/shared/ui/page-header.tsx | 54 + src/shared/ui/page/index.ts | 1 + src/shared/ui/page/page.tsx | 32 + src/shared/ui/sticky-header/index.tsx | 25 + .../ui/sticky-header/sticky-header.module.css | 20 + src/shared/ui/stuff/add-button.tsx | 11 + src/shared/ui/stuff/card-title.tsx | 33 + .../stuff/data-table/data-table-actions.tsx | 63 + .../stuff/data-table/data-table-container.tsx | 7 + .../stuff/data-table/data-table-content.tsx | 7 + .../stuff/data-table/data-table-filters.tsx | 59 + .../ui/stuff/data-table/data-table-tabs.tsx | 77 + .../data-table-text-input-filter.tsx | 24 + src/shared/ui/stuff/data-table/index.ts | 28 + .../ui/stuff/data-table/use-data-table.ts | 91 + src/shared/ui/stuff/export-button.tsx | 11 + src/shared/ui/stuff/link-chip.tsx | 21 + .../customers/customer-status-badge.tsx | 26 + .../ui/stuff/resources/customers/index.ts | 1 + .../spotlight-search-bar-button/index.tsx | 60 + .../spotlight-search-bar-button.module.css | 30 + src/shared/ui/stuff/table-container.tsx | 25 + src/shared/ui/underline-shape.tsx | 27 + src/shared/utils/boolean.ts | 5 + .../bytes/bytes-to-gb/bytes-to-gb.util.ts | 18 + src/shared/utils/bytes/bytes-to-gb/index.ts | 1 + .../bytes/gb-to-bytes/gb-to-bytes.util.ts | 12 + src/shared/utils/bytes/gb-to-bytes/index.ts | 1 + src/shared/utils/bytes/index.ts | 3 + src/shared/utils/bytes/pretty-bytes/index.ts | 1 + .../bytes/pretty-bytes/pretty-bytes.util.ts | 18 + src/shared/utils/date.ts | 32 + src/shared/utils/factory.ts | 3 + src/shared/utils/form.ts | 20 + src/shared/utils/format.ts | 12 + src/shared/utils/index.ts | 12 + src/shared/utils/is.ts | 3 + src/shared/utils/match.ts | 20 + src/shared/utils/money.ts | 106 + src/shared/utils/number.ts | 64 + src/shared/utils/phone-number.ts | 13 + src/shared/utils/pipe.ts | 297 + src/shared/utils/text.ts | 10 + .../get-connection-status-color.util.ts | 17 + .../get-connection-status-color/index.ts | 1 + .../get-expiration-text.util.ts | 12 + .../time-utils/get-expiration-text/index.ts | 1 + .../get-time-ago/get-time-ago.util.ts | 10 + .../utils/time-utils/get-time-ago/index.ts | 1 + src/shared/utils/time-utils/index.ts | 12 + src/shared/utils/uid.ts | 5 + src/vite-env.d.ts | 1 + .../dashboard/home/metric-with-icons/index.ts | 1 + .../metric-with-icons/interfaces/iprops.ts | 6 + .../metric-with-icons.widget.tsx | 17 + .../dashboard/home/metric-with-pb/index.ts | 1 + .../home/metric-with-pb/interfaces/iprops.ts | 6 + .../metric-with-pb/metric-with-pb.widget.tsx | 58 + .../users/user-status-badge/index.ts | 1 + .../user-status-badge/interfaces/index.ts | 1 + .../user-status-badge-props.interface.ts | 6 + .../user-status-badge.widget.tsx | 40 + .../dashboard/users/users-metrics/index.ts | 1 + .../users-metrics/users-metrics.widget.tsx | 71 + .../dashboard/users/users-table/index.ts | 1 + .../users/users-table/interfaces/index.ts | 1 + .../users-table/interfaces/props.interface.ts | 18 + .../users/users-table/user-table.widget.tsx | 134 + .../users/view-user-modal/Checkbox.module.css | 28 + .../dashboard/users/view-user-modal/index.ts | 1 + .../view-user-modal.widget.tsx | 290 + tsconfig.json | 42 + vite.config.mjs | 29 + 213 files changed, 19287 insertions(+) create mode 100644 .gitignore create mode 100644 .npmrc create mode 100644 .prettierrc.mjs create mode 100644 .stylelintignore create mode 100644 .stylelintrc.json create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json create mode 100644 .yarnrc.yml create mode 100644 client.d.ts create mode 100644 eslint.config.js create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 postcss.config.cjs create mode 100644 src/app.tsx create mode 100644 src/app/layouts/auth/index.tsx create mode 100644 src/app/layouts/dashboard/header/header.module.css create mode 100644 src/app/layouts/dashboard/header/index.tsx create mode 100644 src/app/layouts/dashboard/header/sidebar-button.tsx create mode 100644 src/app/layouts/dashboard/index.ts create mode 100644 src/app/layouts/dashboard/root/index.tsx create mode 100644 src/app/layouts/dashboard/root/root.module.css create mode 100644 src/app/layouts/dashboard/sidebar/index.tsx create mode 100644 src/app/layouts/dashboard/sidebar/interfaces/index.ts create mode 100644 src/app/layouts/dashboard/sidebar/interfaces/menu-item.interface.ts create mode 100644 src/app/layouts/dashboard/sidebar/menu-sections.ts create mode 100644 src/app/layouts/dashboard/sidebar/sidebar.module.css create mode 100644 src/app/router/index.ts create mode 100644 src/app/router/router.tsx create mode 100644 src/config.ts create mode 100644 src/entitites/auth/auth-store/auth-store.ts create mode 100644 src/entitites/auth/auth-store/interfaces/action.interface.ts create mode 100644 src/entitites/auth/auth-store/interfaces/index.ts create mode 100644 src/entitites/auth/auth-store/interfaces/state.interface.ts create mode 100644 src/entitites/auth/index.ts create mode 100644 src/entitites/auth/session-store/index.ts create mode 100644 src/entitites/auth/session-store/interfaces/action.interface.ts create mode 100644 src/entitites/auth/session-store/interfaces/index.ts create mode 100644 src/entitites/auth/session-store/interfaces/set-token-action.interface.ts create mode 100644 src/entitites/auth/session-store/interfaces/state.interface.ts create mode 100644 src/entitites/auth/session-store/use-session-store.ts create mode 100644 src/entitites/dashboard/dashboard-store/dashboard-store.ts create mode 100644 src/entitites/dashboard/dashboard-store/interfaces/action.interface.ts create mode 100644 src/entitites/dashboard/dashboard-store/interfaces/index.ts create mode 100644 src/entitites/dashboard/dashboard-store/interfaces/state.interface.ts create mode 100644 src/entitites/dashboard/dashboard-store/interfaces/users-params.interface.ts create mode 100644 src/entitites/dashboard/user-modal-store/interfaces/action.interface.ts create mode 100644 src/entitites/dashboard/user-modal-store/interfaces/index.ts create mode 100644 src/entitites/dashboard/user-modal-store/interfaces/state.interface.ts create mode 100644 src/entitites/dashboard/user-modal-store/user-modal-store.ts create mode 100644 src/entitites/dashboard/users/models/index.ts create mode 100644 src/entitites/dashboard/users/models/interfaces/get-tab-data.interface.ts create mode 100644 src/entitites/dashboard/users/models/interfaces/index.ts create mode 100644 src/entitites/dashboard/users/models/interfaces/user.type.ts create mode 100644 src/entitites/dashboard/users/models/tabs.entity.ts create mode 100644 src/entitites/dashboard/users/ui/index.ts create mode 100644 src/entitites/dashboard/users/ui/table-columns/data-usage/data-usage.column.tsx create mode 100644 src/entitites/dashboard/users/ui/table-columns/data-usage/index.ts create mode 100644 src/entitites/dashboard/users/ui/table-columns/data-usage/interface.ts create mode 100644 src/entitites/dashboard/users/ui/table-columns/index.ts create mode 100644 src/entitites/dashboard/users/ui/table-columns/short-uuid/index.ts create mode 100644 src/entitites/dashboard/users/ui/table-columns/short-uuid/interface.ts create mode 100644 src/entitites/dashboard/users/ui/table-columns/short-uuid/short-uuid.column.tsx create mode 100644 src/entitites/dashboard/users/ui/table-columns/status/index.ts create mode 100644 src/entitites/dashboard/users/ui/table-columns/status/interface.ts create mode 100644 src/entitites/dashboard/users/ui/table-columns/status/status.column.tsx create mode 100644 src/entitites/dashboard/users/ui/table-columns/username/index.ts create mode 100644 src/entitites/dashboard/users/ui/table-columns/username/interface.ts create mode 100644 src/entitites/dashboard/users/ui/table-columns/username/username.column.tsx create mode 100644 src/features/auth/index.ts create mode 100644 src/features/auth/login-form.feature.tsx create mode 100644 src/features/dashboard/header-buttons/header-buttons.feature.tsx create mode 100644 src/features/dashboard/header-buttons/index.ts create mode 100644 src/global.css create mode 100644 src/main.tsx create mode 100644 src/pages/auth/login/login.page.tsx create mode 100644 src/pages/dashboard/home/components/home.module.css create mode 100644 src/pages/dashboard/home/components/home.page.tsx create mode 100644 src/pages/dashboard/home/components/index.ts create mode 100644 src/pages/dashboard/home/components/interfaces/index.ts create mode 100644 src/pages/dashboard/home/components/interfaces/props.interface.ts create mode 100644 src/pages/dashboard/home/connectores/constant/constants.ts create mode 100644 src/pages/dashboard/home/connectores/constant/index.ts create mode 100644 src/pages/dashboard/home/connectores/home.page.connector.tsx create mode 100644 src/pages/dashboard/home/connectores/index.ts create mode 100644 src/pages/dashboard/users/ui/components/constants/constants.ts create mode 100644 src/pages/dashboard/users/ui/components/constants/index.ts create mode 100644 src/pages/dashboard/users/ui/components/interfaces/index.ts create mode 100644 src/pages/dashboard/users/ui/components/interfaces/props.interface.ts create mode 100644 src/pages/dashboard/users/ui/components/users.page.tsx create mode 100644 src/pages/dashboard/users/ui/connectors/interfaces/data-table-return.type.ts create mode 100644 src/pages/dashboard/users/ui/connectors/interfaces/index.ts create mode 100644 src/pages/dashboard/users/ui/connectors/users.page.connector.tsx create mode 100644 src/shared/api/axios.ts create mode 100644 src/shared/api/index.ts create mode 100644 src/shared/constants/index.ts create mode 100644 src/shared/constants/routes.ts create mode 100644 src/shared/hocs/guards/auth-guard.tsx create mode 100644 src/shared/hooks/api/auth/auth.ts create mode 100644 src/shared/hooks/api/get-system-info/get-system-info.query.ts create mode 100644 src/shared/hooks/api/get-system-info/index.ts create mode 100644 src/shared/hooks/index.ts create mode 100644 src/shared/hooks/use-auth.ts create mode 100644 src/shared/interfaces/breadcrumbds.interface.ts create mode 100644 src/shared/interfaces/index.ts create mode 100644 src/shared/providers/auth-provider.tsx create mode 100644 src/shared/providers/index.ts create mode 100644 src/shared/providers/mdx-provider.tsx create mode 100644 src/shared/theme/index.ts create mode 100644 src/shared/theme/overrides/badge.ts create mode 100644 src/shared/theme/overrides/breadcrumbs.tsx create mode 100644 src/shared/theme/overrides/buttons.ts create mode 100644 src/shared/theme/overrides/card/card.module.css create mode 100644 src/shared/theme/overrides/card/index.ts create mode 100644 src/shared/theme/overrides/charts.ts create mode 100644 src/shared/theme/overrides/drawer.ts create mode 100644 src/shared/theme/overrides/index.ts create mode 100644 src/shared/theme/overrides/inputs.ts create mode 100644 src/shared/theme/overrides/loading-overlay.ts create mode 100644 src/shared/theme/overrides/menu.ts create mode 100644 src/shared/theme/overrides/notification.ts create mode 100644 src/shared/theme/overrides/ring-progress.ts create mode 100644 src/shared/theme/overrides/table.ts create mode 100644 src/shared/theme/overrides/tooltip.ts create mode 100644 src/shared/ui/color-scheme-toggler.tsx create mode 100644 src/shared/ui/hamburger-button/hamburger-button.module.css create mode 100644 src/shared/ui/hamburger-button/index.tsx create mode 100644 src/shared/ui/index.ts create mode 100644 src/shared/ui/loading-screen/index.ts create mode 100644 src/shared/ui/loading-screen/loading-screen.tsx create mode 100644 src/shared/ui/logo.tsx create mode 100644 src/shared/ui/metric-card/index.ts create mode 100644 src/shared/ui/metric-card/metric-card-bar-chart.tsx create mode 100644 src/shared/ui/metric-card/metric-card-ring-progress.tsx create mode 100644 src/shared/ui/metric-card/metric-card-root.tsx create mode 100644 src/shared/ui/metric-card/metric-card-text-emphasis.tsx create mode 100644 src/shared/ui/metric-card/metric-card-text-icon.tsx create mode 100644 src/shared/ui/metric-card/metric-card-text-muted.tsx create mode 100644 src/shared/ui/metric-card/metric-card-text-trend.tsx create mode 100644 src/shared/ui/money-input.tsx create mode 100644 src/shared/ui/page-header.tsx create mode 100644 src/shared/ui/page/index.ts create mode 100644 src/shared/ui/page/page.tsx create mode 100644 src/shared/ui/sticky-header/index.tsx create mode 100644 src/shared/ui/sticky-header/sticky-header.module.css create mode 100644 src/shared/ui/stuff/add-button.tsx create mode 100644 src/shared/ui/stuff/card-title.tsx create mode 100644 src/shared/ui/stuff/data-table/data-table-actions.tsx create mode 100644 src/shared/ui/stuff/data-table/data-table-container.tsx create mode 100644 src/shared/ui/stuff/data-table/data-table-content.tsx create mode 100644 src/shared/ui/stuff/data-table/data-table-filters.tsx create mode 100644 src/shared/ui/stuff/data-table/data-table-tabs.tsx create mode 100644 src/shared/ui/stuff/data-table/data-table-text-input-filter.tsx create mode 100644 src/shared/ui/stuff/data-table/index.ts create mode 100644 src/shared/ui/stuff/data-table/use-data-table.ts create mode 100644 src/shared/ui/stuff/export-button.tsx create mode 100644 src/shared/ui/stuff/link-chip.tsx create mode 100644 src/shared/ui/stuff/resources/customers/customer-status-badge.tsx create mode 100644 src/shared/ui/stuff/resources/customers/index.ts create mode 100644 src/shared/ui/stuff/spotlight-search-bar-button/index.tsx create mode 100644 src/shared/ui/stuff/spotlight-search-bar-button/spotlight-search-bar-button.module.css create mode 100644 src/shared/ui/stuff/table-container.tsx create mode 100644 src/shared/ui/underline-shape.tsx create mode 100644 src/shared/utils/boolean.ts create mode 100644 src/shared/utils/bytes/bytes-to-gb/bytes-to-gb.util.ts create mode 100644 src/shared/utils/bytes/bytes-to-gb/index.ts create mode 100644 src/shared/utils/bytes/gb-to-bytes/gb-to-bytes.util.ts create mode 100644 src/shared/utils/bytes/gb-to-bytes/index.ts create mode 100644 src/shared/utils/bytes/index.ts create mode 100644 src/shared/utils/bytes/pretty-bytes/index.ts create mode 100644 src/shared/utils/bytes/pretty-bytes/pretty-bytes.util.ts create mode 100644 src/shared/utils/date.ts create mode 100644 src/shared/utils/factory.ts create mode 100644 src/shared/utils/form.ts create mode 100644 src/shared/utils/format.ts create mode 100644 src/shared/utils/index.ts create mode 100644 src/shared/utils/is.ts create mode 100644 src/shared/utils/match.ts create mode 100644 src/shared/utils/money.ts create mode 100644 src/shared/utils/number.ts create mode 100644 src/shared/utils/phone-number.ts create mode 100644 src/shared/utils/pipe.ts create mode 100644 src/shared/utils/text.ts create mode 100644 src/shared/utils/time-utils/get-connection-status-color/get-connection-status-color.util.ts create mode 100644 src/shared/utils/time-utils/get-connection-status-color/index.ts create mode 100644 src/shared/utils/time-utils/get-expiration-text/get-expiration-text.util.ts create mode 100644 src/shared/utils/time-utils/get-expiration-text/index.ts create mode 100644 src/shared/utils/time-utils/get-time-ago/get-time-ago.util.ts create mode 100644 src/shared/utils/time-utils/get-time-ago/index.ts create mode 100644 src/shared/utils/time-utils/index.ts create mode 100644 src/shared/utils/uid.ts create mode 100644 src/vite-env.d.ts create mode 100644 src/widgets/dashboard/home/metric-with-icons/index.ts create mode 100644 src/widgets/dashboard/home/metric-with-icons/interfaces/iprops.ts create mode 100644 src/widgets/dashboard/home/metric-with-icons/metric-with-icons.widget.tsx create mode 100644 src/widgets/dashboard/home/metric-with-pb/index.ts create mode 100644 src/widgets/dashboard/home/metric-with-pb/interfaces/iprops.ts create mode 100644 src/widgets/dashboard/home/metric-with-pb/metric-with-pb.widget.tsx create mode 100644 src/widgets/dashboard/users/user-status-badge/index.ts create mode 100644 src/widgets/dashboard/users/user-status-badge/interfaces/index.ts create mode 100644 src/widgets/dashboard/users/user-status-badge/interfaces/user-status-badge-props.interface.ts create mode 100644 src/widgets/dashboard/users/user-status-badge/user-status-badge.widget.tsx create mode 100644 src/widgets/dashboard/users/users-metrics/index.ts create mode 100644 src/widgets/dashboard/users/users-metrics/users-metrics.widget.tsx create mode 100644 src/widgets/dashboard/users/users-table/index.ts create mode 100644 src/widgets/dashboard/users/users-table/interfaces/index.ts create mode 100644 src/widgets/dashboard/users/users-table/interfaces/props.interface.ts create mode 100644 src/widgets/dashboard/users/users-table/user-table.widget.tsx create mode 100644 src/widgets/dashboard/users/view-user-modal/Checkbox.module.css create mode 100644 src/widgets/dashboard/users/view-user-modal/index.ts create mode 100644 src/widgets/dashboard/users/view-user-modal/view-user-modal.widget.tsx create mode 100644 tsconfig.json create mode 100644 vite.config.mjs diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..8f384d85 --- /dev/null +++ b/.gitignore @@ -0,0 +1,133 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp +.cache + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +.DS_Store +.vercel diff --git a/.npmrc b/.npmrc new file mode 100644 index 00000000..521a9f7c --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +legacy-peer-deps=true diff --git a/.prettierrc.mjs b/.prettierrc.mjs new file mode 100644 index 00000000..5367319a --- /dev/null +++ b/.prettierrc.mjs @@ -0,0 +1,36 @@ +/** @type {import("@ianvs/prettier-plugin-sort-imports").PrettierConfig} */ +const config = { + printWidth: 100, + singleQuote: true, + tabWidth: 4, + trailingComma: 'es5', + plugins: ['@ianvs/prettier-plugin-sort-imports'], + importOrder: [ + '.*styles.css$', + '', + 'dayjs', + '^react$', + '^next$', + '^next/.*$', + '', + '', + '^@mantine/(.*)$', + '^@mantinex/(.*)$', + '^@mantine-tests/(.*)$', + '^@docs/(.*)$', + '^@/.*$', + '^../(?!.*.css$).*$', + '^./(?!.*.css$).*$', + '\\.css$', + ], + overrides: [ + { + files: '*.mdx', + options: { + printWidth: 70, + }, + }, + ], +}; + +export default config; diff --git a/.stylelintignore b/.stylelintignore new file mode 100644 index 00000000..1521c8b7 --- /dev/null +++ b/.stylelintignore @@ -0,0 +1 @@ +dist diff --git a/.stylelintrc.json b/.stylelintrc.json new file mode 100644 index 00000000..4ea6506d --- /dev/null +++ b/.stylelintrc.json @@ -0,0 +1,28 @@ +{ + "extends": ["stylelint-config-standard-scss"], + "rules": { + "custom-property-pattern": null, + "selector-class-pattern": null, + "scss/no-duplicate-mixins": null, + "declaration-empty-line-before": null, + "declaration-block-no-redundant-longhand-properties": null, + "alpha-value-notation": null, + "custom-property-empty-line-before": null, + "property-no-vendor-prefix": null, + "color-function-notation": null, + "length-zero-no-unit": null, + "selector-not-notation": null, + "no-descending-specificity": null, + "comment-empty-line-before": null, + "scss/at-mixin-pattern": null, + "scss/at-rule-no-unknown": null, + "value-keyword-case": null, + "media-feature-range-notation": null, + "selector-pseudo-class-no-unknown": [ + true, + { + "ignorePseudoClasses": ["global"] + } + ] + } +} diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000..361c4b2a --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["vunguyentuan.vscode-postcss"] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..26962a58 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,10 @@ +{ + "typescript.tsdk": "node_modules/typescript/lib", + "cssVariables.lookupFiles": [ + "**/*.css", + "**/*.scss", + "**/*.sass", + "**/*.less", + "node_modules/@mantine/core/styles.css" + ] +} diff --git a/.yarnrc.yml b/.yarnrc.yml new file mode 100644 index 00000000..ebe8f83b --- /dev/null +++ b/.yarnrc.yml @@ -0,0 +1,3 @@ +nodeLinker: node-modules + +yarnPath: .yarn/releases/yarn-4.1.1.cjs diff --git a/client.d.ts b/client.d.ts new file mode 100644 index 00000000..637db79d --- /dev/null +++ b/client.d.ts @@ -0,0 +1,2 @@ +declare const __DOMAIN_BACKEND__: string; +declare const __NODE_ENV__: string; diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 00000000..81d246bf --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,7 @@ +import mantine from 'eslint-config-mantine'; +import tseslint from 'typescript-eslint'; + +export default tseslint.config( + ...mantine, + { ignores: ['**/*.{mjs,cjs,js,d.ts,d.mts}', './.storybook/main.ts'] }, +); \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 00000000..46318b27 --- /dev/null +++ b/index.html @@ -0,0 +1,26 @@ + + + + + + + + + + + Remnawave Dashboard + + +
+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..ecd2d502 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,14199 @@ +{ + "name": "@remnawave/frontend", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@remnawave/frontend", + "version": "0.0.0", + "dependencies": { + "@dnd-kit/core": "^6.1.0", + "@emotion/react": "^11.13.5", + "@mantine/carousel": "^7.12.2", + "@mantine/charts": "^7.12.2", + "@mantine/code-highlight": "^7.12.2", + "@mantine/core": "^7.12.2", + "@mantine/dates": "^7.12.2", + "@mantine/dropzone": "^7.12.2", + "@mantine/form": "^7.12.2", + "@mantine/hooks": "^7.12.2", + "@mantine/modals": "^7.12.2", + "@mantine/notifications": "^7.12.2", + "@mantine/nprogress": "^7.12.2", + "@mantine/spotlight": "^7.12.2", + "@mantine/tiptap": "^7.12.2", + "@mdx-js/react": "^3.0.1", + "@mdx-js/rollup": "^3.0.1", + "@paralleldrive/cuid2": "github:paralleldrive/cuid2", + "@remnawave/backend-contract": "^0.0.12", + "@tabler/icons-react": "^3.14.0", + "@tanstack/react-query": "^5.54.1", + "@tanstack/react-query-devtools": "^5.54.1", + "@tiptap/extension-link": "^2.6.6", + "@tiptap/react": "^2.6.6", + "@tiptap/starter-kit": "^2.6.6", + "@tsmx/human-readable": "^2.0.3", + "axios": "^1.7.7", + "byte-size": "^9.0.0", + "bytes": "^3.1.2", + "clsx": "^2.1.1", + "dayjs": "^1.11.13", + "dinero.js": "^2.0.0-alpha.14", + "dotenv": "^16.4.5", + "embla-carousel-react": "^8.2.1", + "framer-motion": "^11.5.2", + "libphonenumber-js": "^1.11.7", + "mantine-datatable": "^7.12.4", + "msw": "^2.4.2", + "nanoid": "^5.0.7", + "pretty-bytes": "^6.1.1", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-helmet-async": "^2.0.5", + "react-icons": "^5.3.0", + "react-imask": "^7.6.1", + "react-router-dom": "^6.26.1", + "recharts": "^2.12.7", + "tiny-invariant": "^1.3.3", + "xbytes": "^1.9.1", + "zod": "^3.23.8", + "zustand": "^5.0.1" + }, + "devDependencies": { + "@eslint/js": "^9.9.1", + "@ianvs/prettier-plugin-sort-imports": "^4.3.1", + "@types/byte-size": "^8.1.2", + "@types/bytes": "^3.1.4", + "@types/mdx": "^2.0.13", + "@types/react": "^18.3.5", + "@types/react-dom": "^18.3.0", + "@typescript-eslint/eslint-plugin": "^8.4.0", + "@typescript-eslint/parser": "^8.4.0", + "@vitejs/plugin-react": "^4.3.1", + "eslint": "^9.9.1", + "eslint-config-airbnb": "19.0.4", + "eslint-config-airbnb-typescript": "^18.0.0", + "eslint-config-mantine": "4.0.2", + "eslint-plugin-import": "^2.30.0", + "eslint-plugin-jsx-a11y": "^6.10.0", + "eslint-plugin-react": "^7.35.2", + "eslint-plugin-react-hooks": "^4.6.2", + "identity-obj-proxy": "^3.0.0", + "jsdom": "^25.0.0", + "postcss": "^8.4.45", + "postcss-preset-mantine": "1.17.0", + "postcss-simple-vars": "^7.0.1", + "prettier": "^3.3.3", + "prop-types": "^15.8.1", + "storybook": "^8.2.9", + "storybook-dark-mode": "^4.0.2", + "stylelint": "^16.9.0", + "stylelint-config-standard-scss": "^13.1.0", + "typescript": "^5.5.4", + "vite": "^5.4.3", + "vite-tsconfig-paths": "^5.0.1", + "vitest": "^2.0.5" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "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/@babel/code-frame": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.25.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.24.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.24.5", + "@babel/helpers": "^7.24.5", + "@babel/parser": "^7.24.5", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.25.6", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.6", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.25.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/helper-replace-supers": "^7.25.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/traverse": "^7.25.4", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.25.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.24.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.8", + "@babel/types": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.25.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.8", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.25.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-wrap-function": "^7.25.0", + "@babel/traverse": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.25.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/traverse": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.8", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.24.8", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.25.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.0", + "@babel/types": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.24.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.25.6", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.6" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.25.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.25.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.25.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-flow": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.25.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.25.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.25.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-remap-async-to-generator": "^7.25.0", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/traverse": "^7.25.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.25.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.25.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.4", + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.25.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-replace-supers": "^7.25.0", + "@babel/traverse": "^7.25.4", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/template": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.24.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.25.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/plugin-syntax-flow": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.25.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.25.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.24.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-simple-access": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.25.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.24.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.25.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.4", + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.24.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.24.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.24.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.25.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-syntax-typescript": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.25.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.2", + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.25.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.25.4", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-validator-option": "^7.24.8", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.3", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.24.7", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.4", + "@babel/plugin-transform-async-to-generator": "^7.24.7", + "@babel/plugin-transform-block-scoped-functions": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.25.0", + "@babel/plugin-transform-class-properties": "^7.25.4", + "@babel/plugin-transform-class-static-block": "^7.24.7", + "@babel/plugin-transform-classes": "^7.25.4", + "@babel/plugin-transform-computed-properties": "^7.24.7", + "@babel/plugin-transform-destructuring": "^7.24.8", + "@babel/plugin-transform-dotall-regex": "^7.24.7", + "@babel/plugin-transform-duplicate-keys": "^7.24.7", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0", + "@babel/plugin-transform-dynamic-import": "^7.24.7", + "@babel/plugin-transform-exponentiation-operator": "^7.24.7", + "@babel/plugin-transform-export-namespace-from": "^7.24.7", + "@babel/plugin-transform-for-of": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.25.1", + "@babel/plugin-transform-json-strings": "^7.24.7", + "@babel/plugin-transform-literals": "^7.25.2", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", + "@babel/plugin-transform-member-expression-literals": "^7.24.7", + "@babel/plugin-transform-modules-amd": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/plugin-transform-modules-systemjs": "^7.25.0", + "@babel/plugin-transform-modules-umd": "^7.24.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", + "@babel/plugin-transform-new-target": "^7.24.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", + "@babel/plugin-transform-numeric-separator": "^7.24.7", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-object-super": "^7.24.7", + "@babel/plugin-transform-optional-catch-binding": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.8", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.25.4", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-property-literals": "^7.24.7", + "@babel/plugin-transform-regenerator": "^7.24.7", + "@babel/plugin-transform-reserved-words": "^7.24.7", + "@babel/plugin-transform-shorthand-properties": "^7.24.7", + "@babel/plugin-transform-spread": "^7.24.7", + "@babel/plugin-transform-sticky-regex": "^7.24.7", + "@babel/plugin-transform-template-literals": "^7.24.7", + "@babel/plugin-transform-typeof-symbol": "^7.24.8", + "@babel/plugin-transform-unicode-escapes": "^7.24.7", + "@babel/plugin-transform-unicode-property-regex": "^7.24.7", + "@babel/plugin-transform-unicode-regex": "^7.24.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.4", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.37.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-flow": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-transform-flow-strip-types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-syntax-jsx": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.7", + "@babel/plugin-transform-typescript": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/register": { + "version": "7.24.6", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "find-cache-dir": "^2.0.0", + "make-dir": "^2.1.0", + "pirates": "^4.0.6", + "source-map-support": "^0.5.16" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/register/node_modules/find-cache-dir": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/register/node_modules/find-up": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/register/node_modules/locate-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/register/node_modules/make-dir": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/register/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/register/node_modules/p-locate": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/register/node_modules/path-exists": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/register/node_modules/pkg-dir": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/register/node_modules/semver": { + "version": "5.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/runtime": { + "version": "7.24.5", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.25.6", + "license": "MIT", + "dependencies": { + "core-js-pure": "^3.30.2", + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.0", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.25.6", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.6", + "@babel/parser": "^7.25.6", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.6", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.25.6", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bundled-es-modules/cookie": { + "version": "2.0.0", + "license": "ISC", + "dependencies": { + "cookie": "^0.5.0" + } + }, + "node_modules/@bundled-es-modules/cookie/node_modules/cookie": { + "version": "0.5.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@bundled-es-modules/statuses": { + "version": "1.0.1", + "license": "ISC", + "dependencies": { + "statuses": "^2.0.1" + } + }, + "node_modules/@bundled-es-modules/tough-cookie": { + "version": "0.1.6", + "license": "ISC", + "dependencies": { + "@types/tough-cookie": "^4.0.5", + "tough-cookie": "^4.1.4" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.1" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/media-query-list-parser": { + "version": "3.0.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.1", + "@csstools/css-tokenizer": "^3.0.1" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "4.0.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^6.1.0" + } + }, + "node_modules/@dinero.js/calculator-number": { + "version": "2.0.0-alpha.14", + "license": "MIT", + "dependencies": { + "@dinero.js/core": "2.0.0-alpha.14" + } + }, + "node_modules/@dinero.js/core": { + "version": "2.0.0-alpha.14", + "license": "MIT", + "dependencies": { + "@dinero.js/currencies": "2.0.0-alpha.14" + } + }, + "node_modules/@dinero.js/currencies": { + "version": "2.0.0-alpha.14", + "license": "MIT" + }, + "node_modules/@dnd-kit/accessibility": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@dnd-kit/accessibility/node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" + }, + "node_modules/@dnd-kit/core": { + "version": "6.1.0", + "license": "MIT", + "dependencies": { + "@dnd-kit/accessibility": "^3.1.0", + "@dnd-kit/utilities": "^3.2.2", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@dnd-kit/core/node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" + }, + "node_modules/@dnd-kit/utilities": { + "version": "3.2.2", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@dnd-kit/utilities/node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" + }, + "node_modules/@dual-bundle/import-meta-resolve": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", + "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.3.3", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/@emotion/babel-plugin/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==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.13.5.tgz", + "integrity": "sha512-Z3xbtJ+UcK76eWkagZ1onvn/wAVb1GOMuR15s30Fm2wrMgC7jzpnO2JZXr4eujTTqoQFUrZIw/rT0c6Zzjca1g==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.5.tgz", + "integrity": "sha512-6zeCUxUH+EPF1s+YF/2hPVODeV/7V07YU5x+2tfuRL8MdW6rv5vb2+CBEGTGwBdux0OIERcOS+RzxeK80k2DsQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.13.5", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.2", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "license": "MIT" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz", + "integrity": "sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", + "license": "MIT" + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.18.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.1.0", + "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/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "9.9.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.6.2", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.0" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.5", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.0.0", + "@floating-ui/utils": "^0.2.0" + } + }, + "node_modules/@floating-ui/react": { + "version": "0.26.16", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.1.0", + "@floating-ui/utils": "^0.2.0", + "tabbable": "^6.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.0", + "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.2", + "license": "MIT" + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "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.3.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@ianvs/prettier-plugin-sort-imports": { + "version": "4.3.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@babel/core": "^7.24.0", + "@babel/generator": "^7.23.6", + "@babel/parser": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0", + "semver": "^7.5.2" + }, + "peerDependencies": { + "@vue/compiler-sfc": "2.7.x || 3.x", + "prettier": "2 || 3" + }, + "peerDependenciesMeta": { + "@vue/compiler-sfc": { + "optional": true + } + } + }, + "node_modules/@ianvs/prettier-plugin-sort-imports/node_modules/semver": { + "version": "7.6.3", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@inquirer/confirm": { + "version": "3.1.8", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^8.2.1", + "@inquirer/type": "^1.3.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/core": { + "version": "8.2.1", + "license": "MIT", + "dependencies": { + "@inquirer/figures": "^1.0.2", + "@inquirer/type": "^1.3.2", + "@types/mute-stream": "^0.0.4", + "@types/node": "^20.12.12", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/core/node_modules/@types/node": { + "version": "20.12.12", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@inquirer/core/node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@inquirer/core/node_modules/chalk": { + "version": "4.1.2", + "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/@inquirer/core/node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "node_modules/@inquirer/core/node_modules/has-flag": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/core/node_modules/signal-exit": { + "version": "4.1.0", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@inquirer/core/node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/core/node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/core/node_modules/wrap-ansi": { + "version": "6.2.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.2", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/type": { + "version": "1.3.2", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "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", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mantine/carousel": { + "version": "7.12.2", + "license": "MIT", + "peerDependencies": { + "@mantine/core": "7.12.2", + "@mantine/hooks": "7.12.2", + "embla-carousel-react": ">=7.0.0", + "react": "^18.2.0", + "react-dom": "^18.2.0" + } + }, + "node_modules/@mantine/charts": { + "version": "7.12.2", + "license": "MIT", + "peerDependencies": { + "@mantine/core": "7.12.2", + "@mantine/hooks": "7.12.2", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "recharts": "^2.10.3" + } + }, + "node_modules/@mantine/code-highlight": { + "version": "7.12.2", + "license": "MIT", + "dependencies": { + "clsx": "^2.1.1", + "highlight.js": "^11.9.0" + }, + "peerDependencies": { + "@mantine/core": "7.12.2", + "@mantine/hooks": "7.12.2", + "react": "^18.2.0", + "react-dom": "^18.2.0" + } + }, + "node_modules/@mantine/core": { + "version": "7.12.2", + "license": "MIT", + "dependencies": { + "@floating-ui/react": "^0.26.9", + "clsx": "^2.1.1", + "react-number-format": "^5.3.1", + "react-remove-scroll": "^2.5.7", + "react-textarea-autosize": "8.5.3", + "type-fest": "^4.12.0" + }, + "peerDependencies": { + "@mantine/hooks": "7.12.2", + "react": "^18.2.0", + "react-dom": "^18.2.0" + } + }, + "node_modules/@mantine/dates": { + "version": "7.12.2", + "license": "MIT", + "dependencies": { + "clsx": "^2.1.1" + }, + "peerDependencies": { + "@mantine/core": "7.12.2", + "@mantine/hooks": "7.12.2", + "dayjs": ">=1.0.0", + "react": "^18.2.0", + "react-dom": "^18.2.0" + } + }, + "node_modules/@mantine/dropzone": { + "version": "7.12.2", + "license": "MIT", + "dependencies": { + "react-dropzone-esm": "15.0.1" + }, + "peerDependencies": { + "@mantine/core": "7.12.2", + "@mantine/hooks": "7.12.2", + "react": "^18.2.0", + "react-dom": "^18.2.0" + } + }, + "node_modules/@mantine/form": { + "version": "7.12.2", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "klona": "^2.0.6" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/@mantine/hooks": { + "version": "7.12.2", + "license": "MIT", + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/@mantine/modals": { + "version": "7.12.2", + "license": "MIT", + "peerDependencies": { + "@mantine/core": "7.12.2", + "@mantine/hooks": "7.12.2", + "react": "^18.2.0", + "react-dom": "^18.2.0" + } + }, + "node_modules/@mantine/notifications": { + "version": "7.12.2", + "license": "MIT", + "dependencies": { + "@mantine/store": "7.12.2", + "react-transition-group": "4.4.5" + }, + "peerDependencies": { + "@mantine/core": "7.12.2", + "@mantine/hooks": "7.12.2", + "react": "^18.2.0", + "react-dom": "^18.2.0" + } + }, + "node_modules/@mantine/nprogress": { + "version": "7.12.2", + "license": "MIT", + "dependencies": { + "@mantine/store": "7.12.2" + }, + "peerDependencies": { + "@mantine/core": "7.12.2", + "@mantine/hooks": "7.12.2", + "react": "^18.2.0", + "react-dom": "^18.2.0" + } + }, + "node_modules/@mantine/spotlight": { + "version": "7.12.2", + "license": "MIT", + "dependencies": { + "@mantine/store": "7.12.2" + }, + "peerDependencies": { + "@mantine/core": "7.12.2", + "@mantine/hooks": "7.12.2", + "react": "^18.2.0", + "react-dom": "^18.2.0" + } + }, + "node_modules/@mantine/store": { + "version": "7.12.2", + "license": "MIT", + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/@mantine/tiptap": { + "version": "7.12.2", + "license": "MIT", + "peerDependencies": { + "@mantine/core": "7.12.2", + "@mantine/hooks": "7.12.2", + "@tiptap/extension-link": ">=2.1.12", + "@tiptap/react": ">=2.1.12", + "react": "^18.2.0", + "react-dom": "^18.2.0" + } + }, + "node_modules/@mdx-js/mdx": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-to-js": "^2.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-estree": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "periscopic": "^3.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/@types/estree": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/@mdx-js/mdx/node_modules/estree-walker": { + "version": "3.0.3", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/@mdx-js/mdx/node_modules/source-map": { + "version": "0.7.4", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@mdx-js/react": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "@types/mdx": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" + } + }, + "node_modules/@mdx-js/rollup": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@rollup/pluginutils": "^5.0.0", + "source-map": "^0.7.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "rollup": ">=2" + } + }, + "node_modules/@mdx-js/rollup/node_modules/source-map": { + "version": "0.7.4", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@mswjs/interceptors": { + "version": "0.29.1", + "license": "MIT", + "dependencies": { + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/logger": "^0.3.0", + "@open-draft/until": "^2.0.0", + "is-node-process": "^1.2.0", + "outvariant": "^1.2.1", + "strict-event-emitter": "^0.5.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@noble/hashes": { + "version": "1.4.0", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@open-draft/deferred-promise": { + "version": "2.2.0", + "license": "MIT" + }, + "node_modules/@open-draft/logger": { + "version": "0.3.0", + "license": "MIT", + "dependencies": { + "is-node-process": "^1.2.0", + "outvariant": "^1.4.0" + } + }, + "node_modules/@open-draft/until": { + "version": "2.1.0", + "license": "MIT" + }, + "node_modules/@paralleldrive/cuid2": { + "version": "2.2.2", + "resolved": "git+ssh://git@github.com/paralleldrive/cuid2.git#768d132d559c712c26d6ccc26a2895c3c180b60c", + "license": "MIT", + "dependencies": { + "@noble/hashes": "^1.1.5" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@remirror/core-constants": { + "version": "2.0.2", + "license": "MIT" + }, + "node_modules/@remix-run/router": { + "version": "1.19.1", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@remnawave/backend-contract": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@remnawave/backend-contract/-/backend-contract-0.0.12.tgz", + "integrity": "sha512-84zhXHOsJe18GeiNIlN9CvPHkt+gVOKA/IgRgv5oBAJM/q9tDZ3+/+hdvmDPdpzZlK6ZbfLi6Th5si5lsSoA7w==", + "license": "ISC", + "dependencies": { + "zod": "^3.22.4" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/@types/estree": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.21.2", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/codemod": { + "version": "8.2.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/preset-env": "^7.24.4", + "@babel/types": "^7.24.0", + "@storybook/core": "8.2.9", + "@storybook/csf": "0.1.11", + "@types/cross-spawn": "^6.0.2", + "cross-spawn": "^7.0.3", + "globby": "^14.0.1", + "jscodeshift": "^0.15.1", + "lodash": "^4.17.21", + "prettier": "^3.1.1", + "recast": "^0.23.5", + "tiny-invariant": "^1.3.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/codemod/node_modules/globby": { + "version": "14.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.2", + "ignore": "^5.2.4", + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/codemod/node_modules/path-type": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/codemod/node_modules/slash": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/components": { + "version": "8.2.9", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.9" + } + }, + "node_modules/@storybook/core": { + "version": "8.2.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/csf": "0.1.11", + "@types/express": "^4.17.21", + "@types/node": "^18.0.0", + "browser-assert": "^1.2.1", + "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0", + "esbuild-register": "^3.5.0", + "express": "^4.19.2", + "process": "^0.11.10", + "recast": "^0.23.5", + "util": "^0.12.4", + "ws": "^8.2.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/core-events": { + "version": "8.2.9", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.9" + } + }, + "node_modules/@storybook/csf": { + "version": "0.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^2.19.0" + } + }, + "node_modules/@storybook/csf/node_modules/type-fest": { + "version": "2.19.0", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/global": { + "version": "5.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@storybook/icons": { + "version": "1.2.9", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/manager-api": { + "version": "8.2.9", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.9" + } + }, + "node_modules/@storybook/theming": { + "version": "8.2.9", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.9" + } + }, + "node_modules/@tabler/icons": { + "version": "3.14.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/codecalm" + } + }, + "node_modules/@tabler/icons-react": { + "version": "3.14.0", + "license": "MIT", + "dependencies": { + "@tabler/icons": "3.14.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/codecalm" + }, + "peerDependencies": { + "react": ">= 16" + } + }, + "node_modules/@tanstack/query-core": { + "version": "5.54.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/query-devtools": { + "version": "5.54.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.54.1", + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "5.54.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" + } + }, + "node_modules/@tanstack/react-query-devtools": { + "version": "5.54.1", + "license": "MIT", + "dependencies": { + "@tanstack/query-devtools": "5.54.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "@tanstack/react-query": "^5.54.1", + "react": "^18 || ^19" + } + }, + "node_modules/@tiptap/core": { + "version": "2.6.6", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/pm": "^2.6.6" + } + }, + "node_modules/@tiptap/extension-blockquote": { + "version": "2.6.6", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.6.6" + } + }, + "node_modules/@tiptap/extension-bold": { + "version": "2.6.6", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.6.6" + } + }, + "node_modules/@tiptap/extension-bubble-menu": { + "version": "2.6.6", + "license": "MIT", + "dependencies": { + "tippy.js": "^6.3.7" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.6.6", + "@tiptap/pm": "^2.6.6" + } + }, + "node_modules/@tiptap/extension-bullet-list": { + "version": "2.6.6", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.6.6" + } + }, + "node_modules/@tiptap/extension-code": { + "version": "2.6.6", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.6.6" + } + }, + "node_modules/@tiptap/extension-code-block": { + "version": "2.6.6", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.6.6", + "@tiptap/pm": "^2.6.6" + } + }, + "node_modules/@tiptap/extension-document": { + "version": "2.6.6", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.6.6" + } + }, + "node_modules/@tiptap/extension-dropcursor": { + "version": "2.6.6", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.6.6", + "@tiptap/pm": "^2.6.6" + } + }, + "node_modules/@tiptap/extension-floating-menu": { + "version": "2.6.6", + "license": "MIT", + "dependencies": { + "tippy.js": "^6.3.7" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.6.6", + "@tiptap/pm": "^2.6.6" + } + }, + "node_modules/@tiptap/extension-gapcursor": { + "version": "2.6.6", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.6.6", + "@tiptap/pm": "^2.6.6" + } + }, + "node_modules/@tiptap/extension-hard-break": { + "version": "2.6.6", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.6.6" + } + }, + "node_modules/@tiptap/extension-heading": { + "version": "2.6.6", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.6.6" + } + }, + "node_modules/@tiptap/extension-history": { + "version": "2.6.6", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.6.6", + "@tiptap/pm": "^2.6.6" + } + }, + "node_modules/@tiptap/extension-horizontal-rule": { + "version": "2.6.6", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.6.6", + "@tiptap/pm": "^2.6.6" + } + }, + "node_modules/@tiptap/extension-italic": { + "version": "2.6.6", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.6.6" + } + }, + "node_modules/@tiptap/extension-link": { + "version": "2.6.6", + "license": "MIT", + "dependencies": { + "linkifyjs": "^4.1.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.6.6", + "@tiptap/pm": "^2.6.6" + } + }, + "node_modules/@tiptap/extension-list-item": { + "version": "2.6.6", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.6.6" + } + }, + "node_modules/@tiptap/extension-ordered-list": { + "version": "2.6.6", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.6.6" + } + }, + "node_modules/@tiptap/extension-paragraph": { + "version": "2.6.6", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.6.6" + } + }, + "node_modules/@tiptap/extension-strike": { + "version": "2.6.6", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.6.6" + } + }, + "node_modules/@tiptap/extension-text": { + "version": "2.6.6", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.6.6" + } + }, + "node_modules/@tiptap/pm": { + "version": "2.6.6", + "license": "MIT", + "dependencies": { + "prosemirror-changeset": "^2.2.1", + "prosemirror-collab": "^1.3.1", + "prosemirror-commands": "^1.5.2", + "prosemirror-dropcursor": "^1.8.1", + "prosemirror-gapcursor": "^1.3.2", + "prosemirror-history": "^1.4.1", + "prosemirror-inputrules": "^1.4.0", + "prosemirror-keymap": "^1.2.2", + "prosemirror-markdown": "^1.13.0", + "prosemirror-menu": "^1.2.4", + "prosemirror-model": "^1.22.2", + "prosemirror-schema-basic": "^1.2.3", + "prosemirror-schema-list": "^1.4.1", + "prosemirror-state": "^1.4.3", + "prosemirror-tables": "^1.4.0", + "prosemirror-trailing-node": "^2.0.9", + "prosemirror-transform": "^1.9.0", + "prosemirror-view": "^1.33.9" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + } + }, + "node_modules/@tiptap/react": { + "version": "2.6.6", + "license": "MIT", + "dependencies": { + "@tiptap/extension-bubble-menu": "^2.6.6", + "@tiptap/extension-floating-menu": "^2.6.6", + "@types/use-sync-external-store": "^0.0.6", + "use-sync-external-store": "^1.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.6.6", + "@tiptap/pm": "^2.6.6", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + } + }, + "node_modules/@tiptap/starter-kit": { + "version": "2.6.6", + "license": "MIT", + "dependencies": { + "@tiptap/core": "^2.6.6", + "@tiptap/extension-blockquote": "^2.6.6", + "@tiptap/extension-bold": "^2.6.6", + "@tiptap/extension-bullet-list": "^2.6.6", + "@tiptap/extension-code": "^2.6.6", + "@tiptap/extension-code-block": "^2.6.6", + "@tiptap/extension-document": "^2.6.6", + "@tiptap/extension-dropcursor": "^2.6.6", + "@tiptap/extension-gapcursor": "^2.6.6", + "@tiptap/extension-hard-break": "^2.6.6", + "@tiptap/extension-heading": "^2.6.6", + "@tiptap/extension-history": "^2.6.6", + "@tiptap/extension-horizontal-rule": "^2.6.6", + "@tiptap/extension-italic": "^2.6.6", + "@tiptap/extension-list-item": "^2.6.6", + "@tiptap/extension-ordered-list": "^2.6.6", + "@tiptap/extension-paragraph": "^2.6.6", + "@tiptap/extension-strike": "^2.6.6", + "@tiptap/extension-text": "^2.6.6", + "@tiptap/pm": "^2.6.6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + } + }, + "node_modules/@tsmx/human-readable": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@tsmx/human-readable/-/human-readable-2.0.3.tgz", + "integrity": "sha512-GA9l10PLqYPAEj95HfMI/HMJism0seBKfOlob4o/c4ws3xmrEZJcJZ/EtS9bOYXrO0UeeJ4TGEyuJWaBa2Dcsg==", + "license": "MIT", + "engines": { + "node": ">=14.0.0", + "npm": ">=6.0.0" + } + }, + "node_modules/@types/acorn": { + "version": "4.0.6", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/byte-size": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@types/byte-size/-/byte-size-8.1.2.tgz", + "integrity": "sha512-jGyVzYu6avI8yuqQCNTZd65tzI8HZrLjKX9sdMqZrGWVlNChu0rf6p368oVEDCYJe5BMx2Ov04tD1wqtgTwGSA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/bytes": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/bytes/-/bytes-3.1.4.tgz", + "integrity": "sha512-A0uYgOj3zNc4hNjHc5lYUfJQ/HVyBXiUMKdXd7ysclaE6k9oJdavQzODHuwjpUu2/boCP8afjQYi8z/GtvNCWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "license": "MIT" + }, + "node_modules/@types/cross-spawn": { + "version": "6.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.1", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.0", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.8", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-shape": { + "version": "3.1.6", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.3", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "license": "MIT" + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/emscripten": { + "version": "1.39.13", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "0.0.51", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.21", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdx": { + "version": "2.0.13", + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "license": "MIT" + }, + "node_modules/@types/mute-stream": { + "version": "0.0.4", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "18.19.33", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.12", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.9.15", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/statuses": { + "version": "2.0.5", + "license": "MIT" + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "license": "MIT" + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "license": "MIT" + }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.6", + "license": "MIT" + }, + "node_modules/@types/wrap-ansi": { + "version": "3.0.0", + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.4.0", + "@typescript-eslint/type-utils": "8.4.0", + "@typescript-eslint/utils": "8.4.0", + "@typescript-eslint/visitor-keys": "8.4.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.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" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.4.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "8.4.0", + "@typescript-eslint/types": "8.4.0", + "@typescript-eslint/typescript-estree": "8.4.0", + "@typescript-eslint/visitor-keys": "8.4.0", + "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" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.4.0", + "@typescript-eslint/visitor-keys": "8.4.0" + }, + "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.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.4.0", + "@typescript-eslint/utils": "8.4.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.4.0", + "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.4.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "8.4.0", + "@typescript-eslint/visitor-keys": "8.4.0", + "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": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.6.3", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.4.0", + "@typescript-eslint/types": "8.4.0", + "@typescript-eslint/typescript-estree": "8.4.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" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.4.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "license": "ISC" + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.5", + "@babel/plugin-transform-react-jsx-self": "^7.24.5", + "@babel/plugin-transform-react-jsx-source": "^7.24.1", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0" + } + }, + "node_modules/@vitest/pretty-format": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "2.0.5", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner/node_modules/@types/estree": { + "version": "1.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitest/runner/node_modules/@vitest/utils": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.0.5", + "estree-walker": "^3.0.3", + "loupe": "^3.1.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner/node_modules/estree-walker": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/@vitest/runner/node_modules/loupe": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/@vitest/snapshot": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.0.5", + "magic-string": "^0.30.10", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@yarnpkg/fslib": { + "version": "2.10.3", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@yarnpkg/libzip": "^2.3.0", + "tslib": "^1.13.0" + }, + "engines": { + "node": ">=12 <14 || 14.2 - 14.9 || >14.10.0" + } + }, + "node_modules/@yarnpkg/libzip": { + "version": "2.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@types/emscripten": "^1.39.6", + "tslib": "^1.13.0" + }, + "engines": { + "node": ">=12 <14 || 14.2 - 14.9 || >14.10.0" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "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-escapes": { + "version": "4.3.2", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-styles/node_modules/color-convert": { + "version": "1.9.3", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/ansi-styles/node_modules/color-name": { + "version": "1.1.3", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "license": "Python-2.0" + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/array-includes": { + "version": "3.1.8", + "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-union": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "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.5", + "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.flat": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "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.3", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ast-types": { + "version": "0.16.1", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/ast-types/node_modules/tslib": { + "version": "2.7.0", + "dev": true, + "license": "0BSD" + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/astring": { + "version": "1.9.0", + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "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.0", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axios": { + "version": "1.7.7", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/babel-core": { + "version": "7.0.0-bridge.0", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/babel-plugin-macros/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.2", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.10.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "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/bl": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/body-parser": { + "version": "1.20.2", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-assert": { + "version": "1.2.1", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.23.3", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "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": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/byte-size": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-9.0.0.tgz", + "integrity": "sha512-xrJ8Hki7eQ6xew55mM6TG9zHI852OoAHcPfduWWtR6yxk2upTuIZy13VioRBDyHReHDdbeDPifUboeNkK/sXXA==", + "license": "MIT", + "engines": { + "node": ">=12.17" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001655", + "dev": true, + "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/ccount": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/citty": { + "version": "0.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "consola": "^3.2.3" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-deep/node_modules/is-plain-object": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.9.3", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "6.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/confbox": { + "version": "0.1.7", + "dev": true, + "license": "MIT" + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "dev": true, + "license": "MIT" + }, + "node_modules/consola": { + "version": "3.2.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.6.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/core-js-compat": { + "version": "3.38.1", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-pure": { + "version": "3.38.1", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/crelt": { + "version": "1.0.6", + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/css-functions-list": { + "version": "3.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12 || >=16" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssstyle": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "rrweb-cssom": "^0.6.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "license": "MIT" + }, + "node_modules/d3-array": { + "version": "3.2.4", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/data-urls": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/dayjs": { + "version": "1.11.13", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.3.6", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "dev": true, + "license": "MIT" + }, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "license": "MIT" + }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/deep-equal": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/defaults": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "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", + "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/defu": { + "version": "6.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-indent": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/devlop": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dinero.js": { + "version": "2.0.0-alpha.14", + "license": "MIT", + "dependencies": { + "@dinero.js/calculator-number": "2.0.0-alpha.14", + "@dinero.js/core": "2.0.0-alpha.14", + "@dinero.js/currencies": "2.0.0-alpha.14" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.13", + "dev": true, + "license": "ISC" + }, + "node_modules/embla-carousel": { + "version": "8.2.1", + "license": "MIT" + }, + "node_modules/embla-carousel-react": { + "version": "8.2.1", + "license": "MIT", + "dependencies": { + "embla-carousel": "8.2.1", + "embla-carousel-reactive-utils": "8.2.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.1 || ^18.0.0" + } + }, + "node_modules/embla-carousel-reactive-utils": { + "version": "8.2.1", + "license": "MIT", + "peerDependencies": { + "embla-carousel": "8.2.1" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/envinfo": { + "version": "7.13.0", + "dev": true, + "license": "MIT", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.0.19", + "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-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/esbuild-register": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "peerDependencies": { + "esbuild": ">=0.12 <1" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "9.9.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.11.0", + "@eslint/config-array": "^0.18.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.9.1", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.3.0", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.0.2", + "eslint-visitor-keys": "^4.0.0", + "espree": "^10.1.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", + "is-path-inside": "^3.0.3", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "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-airbnb": { + "version": "19.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-config-airbnb-base": "^15.0.0", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5" + }, + "engines": { + "node": "^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.28.0", + "eslint-plugin-react-hooks": "^4.3.0" + } + }, + "node_modules/eslint-config-airbnb-base": { + "version": "15.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.2" + } + }, + "node_modules/eslint-config-airbnb-typescript": { + "version": "18.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-config-airbnb-base": "^15.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^7.0.0", + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + } + }, + "node_modules/eslint-config-mantine": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@eslint/js": "^9.9.1", + "eslint": "^9.9.1", + "eslint-plugin-jsx-a11y": "^6.9.0", + "eslint-plugin-react": "^7.35.0", + "typescript-eslint": "^8.3.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.9.0", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.30.0", + "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.9.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", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/json5": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-import/node_modules/tsconfig-paths": { + "version": "3.15.0", + "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/eslint-plugin-jsx-a11y": { + "version": "6.10.0", + "dev": true, + "license": "MIT", + "dependencies": { + "aria-query": "~5.1.3", + "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", + "es-iterator-helpers": "^1.0.19", + "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.0" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { + "version": "5.1.3", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.35.2", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.19", + "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.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.0", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.11", + "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": "4.6.2", + "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" + } + }, + "node_modules/eslint-plugin-react/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "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-scope": { + "version": "8.0.2", + "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": "3.4.3", + "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/node_modules/ansi-styles": { + "version": "4.3.0", + "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/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "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/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.0.0", + "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/eslint/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "10.1.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.12.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/acorn": { + "version": "8.12.1", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.0.0", + "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/esprima": { + "version": "4.0.1", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-attach-comments/node_modules/@types/estree": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx/node_modules/@types/estree": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/estree-util-build-jsx/node_modules/estree-walker": { + "version": "3.0.3", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js/node_modules/source-map": { + "version": "0.7.4", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "license": "MIT" + }, + "node_modules/execa": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/express": { + "version": "4.19.2", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/extend": { + "version": "3.0.2", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "license": "MIT" + }, + "node_modules/fast-equals": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "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", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fd-package-json": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "walk-up-path": "^3.0.1" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "license": "MIT" + }, + "node_modules/find-up": { + "version": "5.0.0", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "dev": true, + "license": "ISC" + }, + "node_modules/flow-parser": { + "version": "0.245.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/framer-motion": { + "version": "11.5.2", + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/framer-motion/node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" + }, + "node_modules/fresh": { + "version": "0.5.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-minipass/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/giget": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.2.3", + "defu": "^6.1.4", + "node-fetch-native": "^1.6.3", + "nypm": "^0.3.8", + "ohash": "^1.1.3", + "pathe": "^1.1.2", + "tar": "^6.2.0" + }, + "bin": { + "giget": "dist/cli.mjs" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "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/globby": { + "version": "11.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globjoin": { + "version": "0.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/globrex": { + "version": "0.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/gopd": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/harmony-reflect": { + "version": "1.6.2", + "dev": true, + "license": "(Apache-2.0 OR MPL-1.1)" + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "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", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-to-estree": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-attach-comments": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^0.4.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree/node_modules/@types/estree": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.0", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/@types/estree": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/inline-style-parser": { + "version": "0.2.3", + "license": "MIT" + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/style-to-object": { + "version": "1.0.7", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.3" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/headers-polyfill": { + "version": "4.0.3", + "license": "MIT" + }, + "node_modules/highlight.js": { + "version": "11.9.0", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/html-tags": { + "version": "3.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "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/http-proxy-agent": { + "version": "7.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/identity-obj-proxy": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "harmony-reflect": "^1.4.6" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "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": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/imask": { + "version": "7.6.1", + "license": "MIT", + "dependencies": { + "@babel/runtime-corejs3": "^7.24.4" + }, + "engines": { + "npm": ">=4.0.0" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "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/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "dev": true, + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "dev": true, + "license": "ISC" + }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "license": "MIT" + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/internmap": { + "version": "2.0.3", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.15.1", + "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.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-node-process": { + "version": "1.2.0", + "license": "MIT" + }, + "node_modules/is-number": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/is-reference": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jscodeshift": { + "version": "0.15.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.0", + "@babel/parser": "^7.23.0", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.23.0", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", + "@babel/plugin-transform-optional-chaining": "^7.23.0", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/preset-flow": "^7.22.15", + "@babel/preset-typescript": "^7.23.0", + "@babel/register": "^7.22.15", + "babel-core": "^7.0.0-bridge.0", + "chalk": "^4.1.2", + "flow-parser": "0.*", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.4", + "neo-async": "^2.5.0", + "node-dir": "^0.1.17", + "recast": "^0.23.3", + "temp": "^0.8.4", + "write-file-atomic": "^2.3.0" + }, + "bin": { + "jscodeshift": "bin/jscodeshift.js" + }, + "peerDependencies": { + "@babel/preset-env": "^7.1.6" + }, + "peerDependenciesMeta": { + "@babel/preset-env": { + "optional": true + } + } + }, + "node_modules/jscodeshift/node_modules/ansi-styles": { + "version": "4.3.0", + "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/jscodeshift/node_modules/chalk": { + "version": "4.1.2", + "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/jscodeshift/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jscodeshift/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jsdom": { + "version": "25.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cssstyle": "^4.0.1", + "data-urls": "^5.0.0", + "decimal.js": "^10.4.3", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.12", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.7.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.4", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^2.11.2" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/rrweb-cssom": { + "version": "0.7.1", + "dev": true, + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "2.5.2", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/known-css-properties": { + "version": "0.30.0", + "dev": true, + "license": "MIT" + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/libphonenumber-js": { + "version": "1.11.7", + "license": "MIT" + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "license": "MIT" + }, + "node_modules/linkify-it": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/linkifyjs": { + "version": "4.1.3", + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "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/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "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/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "node_modules/mantine-datatable": { + "version": "7.12.4", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/icflorescu" + }, + "peerDependencies": { + "@mantine/core": ">=7.11", + "@mantine/hooks": ">=7.11", + "clsx": ">=2", + "react": ">=18.2" + } + }, + "node_modules/map-or-similar": { + "version": "1.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-it": { + "version": "14.1.0", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/mathml-tag-names": { + "version": "2.1.3", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.1.3", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/mdurl": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memoizerific": { + "version": "1.11.3", + "dev": true, + "license": "MIT", + "dependencies": { + "map-or-similar": "^1.5.0" + } + }, + "node_modules/meow": { + "version": "13.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromark": { + "version": "4.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/@types/estree": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "@types/acorn": "^4.0.0", + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/@types/estree": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm/node_modules/@types/estree": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/micromark-extension-mdxjs/node_modules/acorn": { + "version": "8.12.1", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.2", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/@types/estree": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/micromark-factory-space": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.2", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/acorn": "^4.0.0", + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-util-events-to-acorn/node_modules/@types/estree": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "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/minimist": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mlly": { + "version": "1.7.1", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.3", + "pathe": "^1.1.2", + "pkg-types": "^1.1.1", + "ufo": "^1.5.3" + } + }, + "node_modules/mlly/node_modules/acorn": { + "version": "8.12.1", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/msw": { + "version": "2.4.2", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@bundled-es-modules/cookie": "^2.0.0", + "@bundled-es-modules/statuses": "^1.0.1", + "@bundled-es-modules/tough-cookie": "^0.1.6", + "@inquirer/confirm": "^3.0.0", + "@mswjs/interceptors": "^0.29.0", + "@open-draft/until": "^2.1.0", + "@types/cookie": "^0.6.0", + "@types/statuses": "^2.0.4", + "chalk": "^4.1.2", + "headers-polyfill": "^4.0.2", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.2", + "path-to-regexp": "^6.2.0", + "strict-event-emitter": "^0.5.1", + "type-fest": "^4.9.0", + "yargs": "^17.7.2" + }, + "bin": { + "msw": "cli/index.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mswjs" + }, + "peerDependencies": { + "graphql": ">= 16.8.x", + "typescript": ">= 4.8.x" + }, + "peerDependenciesMeta": { + "graphql": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/msw/node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/msw/node_modules/chalk": { + "version": "4.1.2", + "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/msw/node_modules/has-flag": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/msw/node_modules/path-to-regexp": { + "version": "6.2.2", + "license": "MIT" + }, + "node_modules/msw/node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mute-stream": { + "version": "1.0.0", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/nanoid": { + "version": "5.0.7", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/node-dir": { + "version": "0.1.17", + "dev": true, + "license": "MIT", + "dependencies": { + "minimatch": "^3.0.2" + }, + "engines": { + "node": ">= 0.10.5" + } + }, + "node_modules/node-dir/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/node-dir/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/node-fetch-native": { + "version": "1.6.4", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.18", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nwsapi": { + "version": "2.2.12", + "dev": true, + "license": "MIT" + }, + "node_modules/nypm": { + "version": "0.3.11", + "dev": true, + "license": "MIT", + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.2.3", + "execa": "^8.0.1", + "pathe": "^1.1.2", + "pkg-types": "^1.2.0", + "ufo": "^1.5.4" + }, + "bin": { + "nypm": "dist/cli.mjs" + }, + "engines": { + "node": "^14.16.0 || >=16.10.0" + } + }, + "node_modules/nypm/node_modules/execa": { + "version": "8.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/nypm/node_modules/get-stream": { + "version": "8.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nypm/node_modules/human-signals": { + "version": "5.0.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/nypm/node_modules/is-stream": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nypm/node_modules/mimic-fn": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nypm/node_modules/npm-run-path": { + "version": "5.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nypm/node_modules/onetime": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nypm/node_modules/path-key": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nypm/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/nypm/node_modules/strip-final-newline": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.8", + "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" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "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", + "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.0", + "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/ohash": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "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/ora": { + "version": "5.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-styles": { + "version": "4.3.0", + "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/ora/node_modules/chalk": { + "version": "4.1.2", + "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/ora/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/orderedmap": { + "version": "2.1.1", + "license": "MIT" + }, + "node_modules/outvariant": { + "version": "1.4.2", + "license": "MIT" + }, + "node_modules/p-limit": { + "version": "3.1.0", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "license": "MIT" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "dev": true, + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/periscopic": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^3.0.0", + "is-reference": "^3.0.0" + } + }, + "node_modules/periscopic/node_modules/@types/estree": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/periscopic/node_modules/estree-walker": { + "version": "3.0.3", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/picocolors": { + "version": "1.0.1", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-types": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.7", + "mlly": "^1.7.1", + "pathe": "^1.1.2" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.45", + "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.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-media-query-parser": { + "version": "0.2.3", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-mixins": { + "version": "9.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "^3.2.11", + "postcss-js": "^4.0.0", + "postcss-simple-vars": "^7.0.0", + "sugarss": "^4.0.1" + }, + "engines": { + "node": ">=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-preset-mantine": { + "version": "1.17.0", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-mixins": "^9.0.4", + "postcss-nested": "^6.0.1" + }, + "peerDependencies": { + "postcss": ">=8.0.0" + } + }, + "node_modules/postcss-resolve-nested-selector": { + "version": "0.1.6", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-safe-parser": { + "version": "7.0.0", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-scss": { + "version": "4.0.9", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-scss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.4.29" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-simple-vars": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.1" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss/node_modules/nanoid": { + "version": "3.3.7", + "dev": true, + "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/prelude-ls": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.3.3", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pretty-bytes": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.1.tgz", + "integrity": "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==", + "license": "MIT", + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/process": { + "version": "0.11.10", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/property-information": { + "version": "6.5.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/prosemirror-changeset": { + "version": "2.2.1", + "license": "MIT", + "dependencies": { + "prosemirror-transform": "^1.0.0" + } + }, + "node_modules/prosemirror-collab": { + "version": "1.3.1", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0" + } + }, + "node_modules/prosemirror-commands": { + "version": "1.6.0", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "node_modules/prosemirror-dropcursor": { + "version": "1.8.1", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0", + "prosemirror-view": "^1.1.0" + } + }, + "node_modules/prosemirror-gapcursor": { + "version": "1.3.2", + "license": "MIT", + "dependencies": { + "prosemirror-keymap": "^1.0.0", + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-view": "^1.0.0" + } + }, + "node_modules/prosemirror-history": { + "version": "1.4.1", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.2.2", + "prosemirror-transform": "^1.0.0", + "prosemirror-view": "^1.31.0", + "rope-sequence": "^1.3.0" + } + }, + "node_modules/prosemirror-inputrules": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "node_modules/prosemirror-keymap": { + "version": "1.2.2", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "w3c-keyname": "^2.2.0" + } + }, + "node_modules/prosemirror-markdown": { + "version": "1.13.0", + "license": "MIT", + "dependencies": { + "markdown-it": "^14.0.0", + "prosemirror-model": "^1.20.0" + } + }, + "node_modules/prosemirror-menu": { + "version": "1.2.4", + "license": "MIT", + "dependencies": { + "crelt": "^1.0.0", + "prosemirror-commands": "^1.0.0", + "prosemirror-history": "^1.0.0", + "prosemirror-state": "^1.0.0" + } + }, + "node_modules/prosemirror-model": { + "version": "1.22.3", + "license": "MIT", + "dependencies": { + "orderedmap": "^2.0.0" + } + }, + "node_modules/prosemirror-schema-basic": { + "version": "1.2.3", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.19.0" + } + }, + "node_modules/prosemirror-schema-list": { + "version": "1.4.1", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.7.3" + } + }, + "node_modules/prosemirror-state": { + "version": "1.4.3", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-transform": "^1.0.0", + "prosemirror-view": "^1.27.0" + } + }, + "node_modules/prosemirror-tables": { + "version": "1.5.0", + "license": "MIT", + "dependencies": { + "prosemirror-keymap": "^1.1.2", + "prosemirror-model": "^1.8.1", + "prosemirror-state": "^1.3.1", + "prosemirror-transform": "^1.2.1", + "prosemirror-view": "^1.13.3" + } + }, + "node_modules/prosemirror-trailing-node": { + "version": "2.0.9", + "license": "MIT", + "dependencies": { + "@remirror/core-constants": "^2.0.2", + "escape-string-regexp": "^4.0.0" + }, + "peerDependencies": { + "prosemirror-model": "^1.22.1", + "prosemirror-state": "^1.4.2", + "prosemirror-view": "^1.33.8" + } + }, + "node_modules/prosemirror-trailing-node/node_modules/escape-string-regexp": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/prosemirror-transform": { + "version": "1.10.0", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.21.0" + } + }, + "node_modules/prosemirror-view": { + "version": "1.34.2", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.20.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/psl": { + "version": "1.9.0", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react": { + "version": "18.3.1", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-dropzone-esm": { + "version": "15.0.1", + "license": "MIT", + "dependencies": { + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "react": ">= 16.8 || 18.0.0" + } + }, + "node_modules/react-fast-compare": { + "version": "3.2.2", + "license": "MIT" + }, + "node_modules/react-helmet-async": { + "version": "2.0.5", + "license": "Apache-2.0", + "dependencies": { + "invariant": "^2.2.4", + "react-fast-compare": "^3.2.2", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": "^16.6.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-icons": { + "version": "5.3.0", + "license": "MIT", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-imask": { + "version": "7.6.1", + "license": "MIT", + "dependencies": { + "imask": "^7.6.1", + "prop-types": "^15.8.1" + }, + "engines": { + "npm": ">=4.0.0" + }, + "peerDependencies": { + "react": ">=0.14.0" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/react-number-format": { + "version": "5.3.4", + "license": "MIT", + "dependencies": { + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-refresh": { + "version": "0.14.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.5.10", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.6", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.6", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar/node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" + }, + "node_modules/react-remove-scroll/node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" + }, + "node_modules/react-router": { + "version": "6.26.1", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.19.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.26.1", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.19.1", + "react-router": "6.26.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/react-smooth": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "fast-equals": "^5.0.1", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.1", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton/node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" + }, + "node_modules/react-textarea-autosize": { + "version": "8.5.3", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.13", + "use-composed-ref": "^1.3.0", + "use-latest": "^1.2.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/recast": { + "version": "0.23.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ast-types": "^0.16.1", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tiny-invariant": "^1.3.3", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/recast/node_modules/tslib": { + "version": "2.7.0", + "dev": true, + "license": "0BSD" + }, + "node_modules/recharts": { + "version": "2.12.7", + "license": "MIT", + "dependencies": { + "clsx": "^2.0.0", + "eventemitter3": "^4.0.1", + "lodash": "^4.17.21", + "react-is": "^16.10.2", + "react-smooth": "^4.0.0", + "recharts-scale": "^0.4.4", + "tiny-invariant": "^1.3.1", + "victory-vendor": "^36.6.8" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/recharts-scale": { + "version": "0.4.5", + "license": "MIT", + "dependencies": { + "decimal.js-light": "^2.4.1" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "license": "MIT" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/remark-mdx": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.0", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.8", + "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/resolve-from": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "2.6.3", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/rollup": { + "version": "4.21.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.21.2", + "@rollup/rollup-android-arm64": "4.21.2", + "@rollup/rollup-darwin-arm64": "4.21.2", + "@rollup/rollup-darwin-x64": "4.21.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.21.2", + "@rollup/rollup-linux-arm-musleabihf": "4.21.2", + "@rollup/rollup-linux-arm64-gnu": "4.21.2", + "@rollup/rollup-linux-arm64-musl": "4.21.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.21.2", + "@rollup/rollup-linux-riscv64-gnu": "4.21.2", + "@rollup/rollup-linux-s390x-gnu": "4.21.2", + "@rollup/rollup-linux-x64-gnu": "4.21.2", + "@rollup/rollup-linux-x64-musl": "4.21.2", + "@rollup/rollup-win32-arm64-msvc": "4.21.2", + "@rollup/rollup-win32-ia32-msvc": "4.21.2", + "@rollup/rollup-win32-x64-msvc": "4.21.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup/node_modules/@types/estree": { + "version": "1.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/rope-sequence": { + "version": "1.3.4", + "license": "MIT" + }, + "node_modules/rrweb-cssom": { + "version": "0.6.0", + "dev": true, + "license": "MIT" + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "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.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "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-regex-test": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/saxes": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.18.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "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", + "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/setprototypeof": { + "version": "1.2.0", + "dev": true, + "license": "ISC" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "dev": true, + "license": "ISC" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "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/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/statuses": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.7.0", + "dev": true, + "license": "MIT" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/storybook": { + "version": "8.2.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/types": "^7.24.0", + "@storybook/codemod": "8.2.9", + "@storybook/core": "8.2.9", + "@types/semver": "^7.3.4", + "@yarnpkg/fslib": "2.10.3", + "@yarnpkg/libzip": "2.3.0", + "chalk": "^4.1.0", + "commander": "^6.2.1", + "cross-spawn": "^7.0.3", + "detect-indent": "^6.1.0", + "envinfo": "^7.7.3", + "execa": "^5.0.0", + "fd-package-json": "^1.2.0", + "find-up": "^5.0.0", + "fs-extra": "^11.1.0", + "giget": "^1.0.0", + "globby": "^14.0.1", + "jscodeshift": "^0.15.1", + "leven": "^3.1.0", + "ora": "^5.4.1", + "prettier": "^3.1.1", + "prompts": "^2.4.0", + "semver": "^7.3.7", + "strip-json-comments": "^3.0.1", + "tempy": "^3.1.0", + "tiny-invariant": "^1.3.1", + "ts-dedent": "^2.0.0" + }, + "bin": { + "getstorybook": "bin/index.cjs", + "sb": "bin/index.cjs", + "storybook": "bin/index.cjs" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/storybook-dark-mode": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/components": "^8.0.0", + "@storybook/core-events": "^8.0.0", + "@storybook/global": "^5.0.0", + "@storybook/icons": "^1.2.5", + "@storybook/manager-api": "^8.0.0", + "@storybook/theming": "^8.0.0", + "fast-deep-equal": "^3.1.3", + "memoizerific": "^1.11.3" + } + }, + "node_modules/storybook/node_modules/ansi-styles": { + "version": "4.3.0", + "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/storybook/node_modules/chalk": { + "version": "4.1.2", + "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/storybook/node_modules/globby": { + "version": "14.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.2", + "ignore": "^5.2.4", + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/storybook/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/storybook/node_modules/path-type": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/storybook/node_modules/semver": { + "version": "7.6.3", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/storybook/node_modules/slash": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/storybook/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strict-event-emitter": { + "version": "0.5.1", + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string.prototype.includes": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.11", + "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", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "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/stringify-entities": { + "version": "4.0.4", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-to-object": { + "version": "0.4.4", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, + "node_modules/stylelint": { + "version": "16.9.0", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.1", + "@csstools/css-tokenizer": "^3.0.1", + "@csstools/media-query-list-parser": "^3.0.1", + "@csstools/selector-specificity": "^4.0.0", + "@dual-bundle/import-meta-resolve": "^4.1.0", + "balanced-match": "^2.0.0", + "colord": "^2.9.3", + "cosmiconfig": "^9.0.0", + "css-functions-list": "^3.2.2", + "css-tree": "^2.3.1", + "debug": "^4.3.6", + "fast-glob": "^3.3.2", + "fastest-levenshtein": "^1.0.16", + "file-entry-cache": "^9.0.0", + "global-modules": "^2.0.0", + "globby": "^11.1.0", + "globjoin": "^0.1.4", + "html-tags": "^3.3.1", + "ignore": "^5.3.2", + "imurmurhash": "^0.1.4", + "is-plain-object": "^5.0.0", + "known-css-properties": "^0.34.0", + "mathml-tag-names": "^2.1.3", + "meow": "^13.2.0", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "picocolors": "^1.0.1", + "postcss": "^8.4.41", + "postcss-resolve-nested-selector": "^0.1.6", + "postcss-safe-parser": "^7.0.0", + "postcss-selector-parser": "^6.1.2", + "postcss-value-parser": "^4.2.0", + "resolve-from": "^5.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^7.1.0", + "supports-hyperlinks": "^3.1.0", + "svg-tags": "^1.0.0", + "table": "^6.8.2", + "write-file-atomic": "^5.0.1" + }, + "bin": { + "stylelint": "bin/stylelint.mjs" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/stylelint-config-recommended": { + "version": "14.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "stylelint": "^16.0.0" + } + }, + "node_modules/stylelint-config-recommended-scss": { + "version": "14.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-scss": "^4.0.9", + "stylelint-config-recommended": "^14.0.0", + "stylelint-scss": "^6.0.0" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "postcss": "^8.3.3", + "stylelint": "^16.0.2" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + } + } + }, + "node_modules/stylelint-config-standard": { + "version": "36.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "stylelint-config-recommended": "^14.0.0" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "stylelint": "^16.1.0" + } + }, + "node_modules/stylelint-config-standard-scss": { + "version": "13.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "stylelint-config-recommended-scss": "^14.0.0", + "stylelint-config-standard": "^36.0.0" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "postcss": "^8.3.3", + "stylelint": "^16.3.1" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + } + } + }, + "node_modules/stylelint-scss": { + "version": "6.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "known-css-properties": "^0.30.0", + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-selector-parser": "^6.0.15", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "stylelint": "^16.0.2" + } + }, + "node_modules/stylelint/node_modules/balanced-match": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/stylelint/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/stylelint/node_modules/file-entry-cache": { + "version": "9.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/stylelint/node_modules/flat-cache": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.3.1", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/stylelint/node_modules/known-css-properties": { + "version": "0.34.0", + "dev": true, + "license": "MIT" + }, + "node_modules/stylelint/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/stylelint/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint/node_modules/string-width/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/stylelint/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/stylelint/node_modules/write-file-atomic": { + "version": "5.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "license": "MIT" + }, + "node_modules/sugarss": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.3.3" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-hyperlinks": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-hyperlinks/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "dev": true + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "dev": true, + "license": "MIT" + }, + "node_modules/tabbable": { + "version": "6.2.0", + "license": "MIT" + }, + "node_modules/table": { + "version": "6.8.2", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.13.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/table/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "dev": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/temp": { + "version": "0.8.4", + "dev": true, + "license": "MIT", + "dependencies": { + "rimraf": "~2.6.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/temp-dir": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/tempy": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-stream": "^3.0.0", + "temp-dir": "^3.0.0", + "type-fest": "^2.12.2", + "unique-string": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/is-stream": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "2.19.0", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "license": "MIT" + }, + "node_modules/tinybench": { + "version": "2.8.0", + "dev": true, + "license": "MIT" + }, + "node_modules/tinypool": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tippy.js": { + "version": "6.3.7", + "license": "MIT", + "dependencies": { + "@popperjs/core": "^2.9.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tr46": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.10" + } + }, + "node_modules/tsconfck": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "4.18.2", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "dev": true, + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.5.4", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "license": "MIT" + }, + "node_modules/ufo": { + "version": "1.5.4", + "dev": true, + "license": "MIT" + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unified": { + "version": "11.0.5", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unique-string": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "crypto-random-string": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position-from-estree": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.0", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.2", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-callback-ref/node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" + }, + "node_modules/use-composed-ref": { + "version": "1.3.0", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/use-isomorphic-layout-effect": { + "version": "1.1.2", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-latest": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "use-isomorphic-layout-effect": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.2", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar/node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" + }, + "node_modules/use-sync-external-store": { + "version": "1.2.2", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/util": { + "version": "0.12.5", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/victory-vendor": { + "version": "36.9.2", + "license": "MIT AND ISC", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" + } + }, + "node_modules/vite": { + "version": "5.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.5", + "pathe": "^1.1.2", + "tinyrainbow": "^1.2.0", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-tsconfig-paths": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^3.0.3" + }, + "peerDependencies": { + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vitest": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "@vitest/expect": "2.0.5", + "@vitest/pretty-format": "^2.0.5", + "@vitest/runner": "2.0.5", + "@vitest/snapshot": "2.0.5", + "@vitest/spy": "2.0.5", + "@vitest/utils": "2.0.5", + "chai": "^5.1.1", + "debug": "^4.3.5", + "execa": "^8.0.1", + "magic-string": "^0.30.10", + "pathe": "^1.1.2", + "std-env": "^3.7.0", + "tinybench": "^2.8.0", + "tinypool": "^1.0.0", + "tinyrainbow": "^1.2.0", + "vite": "^5.0.0", + "vite-node": "2.0.5", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "2.0.5", + "@vitest/ui": "2.0.5", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/@types/estree": { + "version": "1.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/vitest/node_modules/@vitest/expect": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.0.5", + "@vitest/utils": "2.0.5", + "chai": "^5.1.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest/node_modules/@vitest/spy": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest/node_modules/@vitest/utils": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.0.5", + "estree-walker": "^3.0.3", + "loupe": "^3.1.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest/node_modules/assertion-error": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/chai": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/check-error": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "node_modules/vitest/node_modules/deep-eql": { + "version": "5.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/vitest/node_modules/estree-walker": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/vitest/node_modules/execa": { + "version": "8.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/vitest/node_modules/get-stream": { + "version": "8.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/human-signals": { + "version": "5.0.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/vitest/node_modules/is-stream": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/loupe": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/vitest/node_modules/mimic-fn": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/npm-run-path": { + "version": "5.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/onetime": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/path-key": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/pathval": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/vitest/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/vitest/node_modules/strip-final-newline": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/tinyspy": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "license": "MIT" + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/walk-up-path": { + "version": "3.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "14.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^5.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/which": { + "version": "2.0.2", + "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.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "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.15", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "2.4.3", + "dev": true, + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "node_modules/ws": { + "version": "8.18.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xbytes": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/xbytes/-/xbytes-1.9.1.tgz", + "integrity": "sha512-29E0ygMFWrM5JW2W1ypmezjyR2FOS5aCszdLe620ymSJBoZzL0/RCLJKCoUFu3DfQGhZ/FWykEBp5dfEy6+hjA==", + "license": "Apache-2.0", + "engines": { + "node": ">=1" + } + }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/y18n": { + "version": "5.0.8", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.23.8", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zustand": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.1.tgz", + "integrity": "sha512-pRET7Lao2z+n5R/HduXMio35TncTlSW68WsYBq2Lg1ASspsNGjpwLAsij3RpouyV6+kHMwwwzP0bZPD70/Jx/w==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..0b39714b --- /dev/null +++ b/package.json @@ -0,0 +1,110 @@ +{ + "name": "@remnawave/frontend", + "private": true, + "type": "module", + "version": "0.0.0", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview", + "typecheck": "tsc --noEmit", + "lint": "npm run lint:eslint && npm run lint:stylelint", + "lint:eslint": "eslint . --ext .ts,.tsx --cache", + "lint:stylelint": "stylelint '**/*.css' --cache", + "prettier": "prettier --check \"**/*.{ts,tsx}\"", + "prettier:write": "prettier --write \"**/*.{ts,tsx}\"", + "vitest": "vitest run", + "vitest:watch": "vitest", + "test": "npm run typecheck && npm run prettier && npm run lint && npm run vitest && npm run build", + "storybook": "storybook dev -p 6006", + "storybook:build": "storybook build" + }, + "dependencies": { + "@dnd-kit/core": "^6.1.0", + "@emotion/react": "^11.13.5", + "@mantine/carousel": "^7.12.2", + "@mantine/charts": "^7.12.2", + "@mantine/code-highlight": "^7.12.2", + "@mantine/core": "^7.12.2", + "@mantine/dates": "^7.12.2", + "@mantine/dropzone": "^7.12.2", + "@mantine/form": "^7.12.2", + "@mantine/hooks": "^7.12.2", + "@mantine/modals": "^7.12.2", + "@mantine/notifications": "^7.12.2", + "@mantine/nprogress": "^7.12.2", + "@mantine/spotlight": "^7.12.2", + "@mantine/tiptap": "^7.12.2", + "@mdx-js/react": "^3.0.1", + "@mdx-js/rollup": "^3.0.1", + "@paralleldrive/cuid2": "github:paralleldrive/cuid2", + "@remnawave/backend-contract": "^0.0.12", + "@tabler/icons-react": "^3.14.0", + "@tanstack/react-query": "^5.54.1", + "@tanstack/react-query-devtools": "^5.54.1", + "@tiptap/extension-link": "^2.6.6", + "@tiptap/react": "^2.6.6", + "@tiptap/starter-kit": "^2.6.6", + "@tsmx/human-readable": "^2.0.3", + "axios": "^1.7.7", + "byte-size": "^9.0.0", + "bytes": "^3.1.2", + "clsx": "^2.1.1", + "dayjs": "^1.11.13", + "dinero.js": "^2.0.0-alpha.14", + "dotenv": "^16.4.5", + "embla-carousel-react": "^8.2.1", + "framer-motion": "^11.5.2", + "libphonenumber-js": "^1.11.7", + "mantine-datatable": "^7.12.4", + "msw": "^2.4.2", + "nanoid": "^5.0.7", + "pretty-bytes": "^6.1.1", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-helmet-async": "^2.0.5", + "react-icons": "^5.3.0", + "react-imask": "^7.6.1", + "react-router-dom": "^6.26.1", + "recharts": "^2.12.7", + "tiny-invariant": "^1.3.3", + "xbytes": "^1.9.1", + "zod": "^3.23.8", + "zustand": "^5.0.1" + }, + "devDependencies": { + "@eslint/js": "^9.9.1", + "@ianvs/prettier-plugin-sort-imports": "^4.3.1", + "@types/byte-size": "^8.1.2", + "@types/bytes": "^3.1.4", + "@types/mdx": "^2.0.13", + "@types/react": "^18.3.5", + "@types/react-dom": "^18.3.0", + "@typescript-eslint/eslint-plugin": "^8.4.0", + "@typescript-eslint/parser": "^8.4.0", + "@vitejs/plugin-react": "^4.3.1", + "eslint": "^9.9.1", + "eslint-config-airbnb": "19.0.4", + "eslint-config-airbnb-typescript": "^18.0.0", + "eslint-config-mantine": "4.0.2", + "eslint-plugin-import": "^2.30.0", + "eslint-plugin-jsx-a11y": "^6.10.0", + "eslint-plugin-react": "^7.35.2", + "eslint-plugin-react-hooks": "^4.6.2", + "identity-obj-proxy": "^3.0.0", + "jsdom": "^25.0.0", + "postcss": "^8.4.45", + "postcss-preset-mantine": "1.17.0", + "postcss-simple-vars": "^7.0.1", + "prettier": "^3.3.3", + "prop-types": "^15.8.1", + "storybook": "^8.2.9", + "storybook-dark-mode": "^4.0.2", + "stylelint": "^16.9.0", + "stylelint-config-standard-scss": "^13.1.0", + "typescript": "^5.5.4", + "vite": "^5.4.3", + "vite-tsconfig-paths": "^5.0.1", + "vitest": "^2.0.5" + } +} \ No newline at end of file diff --git a/postcss.config.cjs b/postcss.config.cjs new file mode 100644 index 00000000..0ab521f6 --- /dev/null +++ b/postcss.config.cjs @@ -0,0 +1,19 @@ +module.exports = { + plugins: { + 'postcss-preset-mantine': { + autoRem: true, + }, + 'postcss-simple-vars': { + variables: { + 'mantine-breakpoint-xs': '30em', + 'mantine-breakpoint-sm': '40em', + 'mantine-breakpoint-md': '48em', + 'mantine-breakpoint-lg': '64em', + 'mantine-breakpoint-xl': '80em', + 'mantine-breakpoint-2xl': '96em', + 'mantine-breakpoint-3xl': '120em', + 'mantine-breakpoint-4xl': '160em', + }, + }, + }, +}; diff --git a/src/app.tsx b/src/app.tsx new file mode 100644 index 00000000..3da92bc3 --- /dev/null +++ b/src/app.tsx @@ -0,0 +1,37 @@ +import '@mantine/carousel/styles.layer.css'; +import '@mantine/charts/styles.layer.css'; +import '@mantine/code-highlight/styles.layer.css'; +import '@mantine/core/styles.layer.css'; +import '@mantine/dates/styles.layer.css'; +import '@mantine/dropzone/styles.layer.css'; +import '@mantine/notifications/styles.layer.css'; +import '@mantine/nprogress/styles.layer.css'; +import '@mantine/spotlight/styles.layer.css'; +import '@mantine/tiptap/styles.layer.css'; +import 'mantine-datatable/styles.layer.css'; +import './global.css'; + +import { HelmetProvider } from 'react-helmet-async'; +import { MantineProvider } from '@mantine/core'; +import { ModalsProvider } from '@mantine/modals'; +import { Notifications } from '@mantine/notifications'; +import { NavigationProgress } from '@mantine/nprogress'; +import { Router } from '@/app/router/router'; +import { AuthProvider } from '@/shared/providers/auth-provider'; +import { theme } from '@/shared/theme'; + +export function App() { + return ( + + + + + + + + + + + + ); +} diff --git a/src/app/layouts/auth/index.tsx b/src/app/layouts/auth/index.tsx new file mode 100644 index 00000000..1e768375 --- /dev/null +++ b/src/app/layouts/auth/index.tsx @@ -0,0 +1,12 @@ +import { Outlet } from 'react-router-dom'; +import { Box, Center } from '@mantine/core'; + +export function AuthLayout() { + return ( +
+ + + +
+ ); +} diff --git a/src/app/layouts/dashboard/header/header.module.css b/src/app/layouts/dashboard/header/header.module.css new file mode 100644 index 00000000..9a12a62f --- /dev/null +++ b/src/app/layouts/dashboard/header/header.module.css @@ -0,0 +1,40 @@ +.root { + z-index: 198; + display: flex; + justify-content: space-between; + + @media (min-width: $mantine-breakpoint-2xl) { + padding-top: 1.25rem; + padding-bottom: 1.25rem; + } + + @media (min-width: $mantine-breakpoint-3xl) { + padding-left: 2rem; + padding-right: 2rem; + } + + @media (min-width: $mantine-breakpoint-4xl) { + padding-left: 2.5rem; + padding-right: 2.5rem; + } +} + +.rightContent { + display: flex; + align-items: center; +} + +.logo { + margin-inline-end: 1rem; + width: 2.25rem; + flex-shrink: 0; + color: inherit; + + @media (min-width: $mantine-breakpoint-lg) { + margin-inline-end: 1.25rem; + } + + @media (min-width: $mantine-breakpoint-xl) { + display: none; + } +} diff --git a/src/app/layouts/dashboard/header/index.tsx b/src/app/layouts/dashboard/header/index.tsx new file mode 100644 index 00000000..16a1d312 --- /dev/null +++ b/src/app/layouts/dashboard/header/index.tsx @@ -0,0 +1,19 @@ +import { StickyHeader } from '@shared/ui/sticky-header'; +import { Group } from '@mantine/core'; +import { HeaderButtons } from '../../../../features/dashboard/header-buttons'; +import { SidebarButton } from './sidebar-button'; +import classes from './header.module.css'; + +export function Header() { + return ( + +
+ +
+ + + + +
+ ); +} diff --git a/src/app/layouts/dashboard/header/sidebar-button.tsx b/src/app/layouts/dashboard/header/sidebar-button.tsx new file mode 100644 index 00000000..c763baa7 --- /dev/null +++ b/src/app/layouts/dashboard/header/sidebar-button.tsx @@ -0,0 +1,33 @@ +import { useEffect } from 'react'; +import { HamburgerButton } from '@shared/ui/hamburger-button'; +import { Logo } from '@shared/ui/logo'; +import { useLocation } from 'react-router-dom'; +import { Drawer } from '@mantine/core'; +import { useDisclosure } from '@mantine/hooks'; +import { Sidebar } from '../sidebar'; + +export function SidebarButton() { + const location = useLocation(); + const [opened, { open, close }] = useDisclosure(false); + + useEffect(() => { + close(); + }, [location.pathname]); + + return ( + <> + + + + + + + + + + + + + + ); +} diff --git a/src/app/layouts/dashboard/index.ts b/src/app/layouts/dashboard/index.ts new file mode 100644 index 00000000..d88906a5 --- /dev/null +++ b/src/app/layouts/dashboard/index.ts @@ -0,0 +1,3 @@ +export * from './root'; +export * from './sidebar'; +export * from './header'; diff --git a/src/app/layouts/dashboard/root/index.tsx b/src/app/layouts/dashboard/root/index.tsx new file mode 100644 index 00000000..b06c6a01 --- /dev/null +++ b/src/app/layouts/dashboard/root/index.tsx @@ -0,0 +1,28 @@ +import { Logo } from '@shared/ui/logo'; +import { Outlet } from 'react-router-dom'; +import { Paper, ScrollArea } from '@mantine/core'; +import { Header } from '../header'; +import { Sidebar } from '../sidebar'; +import classes from './root.module.css'; + +export function DashboardLayout() { + return ( +
+ +
+ +
+ + + +
+
+
+ +
+ +
+
+
+ ); +} diff --git a/src/app/layouts/dashboard/root/root.module.css b/src/app/layouts/dashboard/root/root.module.css new file mode 100644 index 00000000..ae8160ed --- /dev/null +++ b/src/app/layouts/dashboard/root/root.module.css @@ -0,0 +1,80 @@ +:root { + --sidebar-width-xl: 270px; + --sidebar-width-2xl: 288px; +} + +.root { + display: flex; + flex-grow: 1; + min-height: 100vh; +} + +.content { + display: flex; + flex-direction: column; + width: 100%; + + @media (min-width: $mantine-breakpoint-xl) { + margin-inline-start: var(--sidebar-width-xl); + width: calc(100% - var(--sidebar-width-xl)); + } + + @media (min-width: $mantine-breakpoint-2xl) { + margin-inline-start: var(--sidebar-width-2xl); + width: calc(100% - var(--sidebar-width-2xl)); + } +} + +.main { + display: flex; + flex-grow: 1; + flex-direction: column; + padding: 0.5rem 1rem 1.5rem; + + @media (min-width: $mantine-breakpoint-md) { + padding-left: 1.25rem; + padding-right: 1.25rem; + } + + @media (min-width: $mantine-breakpoint-lg) { + padding-left: 1.5rem; + padding-right: 1.5rem; + padding-bottom: 2rem; + } + + @media (min-width: $mantine-breakpoint-3xl) { + padding-left: 2rem; + padding-right: 2rem; + padding-top: 1rem; + } + + @media (min-width: $mantine-breakpoint-4xl) { + padding-left: 2.5rem; + padding-right: 2.5rem; + padding-bottom: 2.25rem; + } +} + +.sidebarWrapper { + position: fixed; + display: none; + bottom: 0; + z-index: 50; + height: 100%; + padding-bottom: var(--mantine-spacing-md); + + @media (min-width: $mantine-breakpoint-xl) { + display: flex; + flex-direction: column; + width: var(--sidebar-width-xl); + } + + @media (min-width: $mantine-breakpoint-2xl) { + width: var(--sidebar-width-2xl); + } +} + +.logoWrapper { + padding: var(--mantine-spacing-md) var(--mantine-spacing-xl); + margin-bottom: var(--mantine-spacing-md); +} diff --git a/src/app/layouts/dashboard/sidebar/index.tsx b/src/app/layouts/dashboard/sidebar/index.tsx new file mode 100644 index 00000000..e3b57a88 --- /dev/null +++ b/src/app/layouts/dashboard/sidebar/index.tsx @@ -0,0 +1,57 @@ +import { NavLink as RouterLink, useLocation } from 'react-router-dom'; +import { NavLink, Stack, Title } from '@mantine/core'; +import { menu } from './menu-sections'; +import classes from './sidebar.module.css'; + +export function Sidebar() { + const { pathname } = useLocation(); + + return ( + + {menu.map((item) => ( +
+ + {item.header} + + + {item.section.map((subItem) => + subItem.dropdownItems ? ( + } + > + {subItem.dropdownItems?.map((dropdownItem) => ( + } + /> + ))} + + ) : ( + } + /> + ) + )} +
+ ))} +
+ ); +} diff --git a/src/app/layouts/dashboard/sidebar/interfaces/index.ts b/src/app/layouts/dashboard/sidebar/interfaces/index.ts new file mode 100644 index 00000000..4a891c8b --- /dev/null +++ b/src/app/layouts/dashboard/sidebar/interfaces/index.ts @@ -0,0 +1 @@ +export * from './menu-item.interface'; diff --git a/src/app/layouts/dashboard/sidebar/interfaces/menu-item.interface.ts b/src/app/layouts/dashboard/sidebar/interfaces/menu-item.interface.ts new file mode 100644 index 00000000..4fc99830 --- /dev/null +++ b/src/app/layouts/dashboard/sidebar/interfaces/menu-item.interface.ts @@ -0,0 +1,15 @@ +import { ElementType } from 'react'; + +export interface MenuItem { + header: string; + section: { + name: string; + href: string; + icon: ElementType; + dropdownItems?: { + name: string; + href: string; + badge?: string; + }[]; + }[]; +} diff --git a/src/app/layouts/dashboard/sidebar/menu-sections.ts b/src/app/layouts/dashboard/sidebar/menu-sections.ts new file mode 100644 index 00000000..832e8a91 --- /dev/null +++ b/src/app/layouts/dashboard/sidebar/menu-sections.ts @@ -0,0 +1,96 @@ +import { ElementType } from 'react'; +import { ROUTES } from '@shared/constants'; +import { PiStarDuotone, PiUsersDuotone } from 'react-icons/pi'; +import { MenuItem } from './interfaces'; + +export const menu: MenuItem[] = [ + { + header: 'Overview', + section: [ + { + name: 'Home', + href: ROUTES.DASHBOARD.HOME, + icon: PiStarDuotone, + }, + ], + }, + { + header: 'Users', + section: [{ name: 'Users', href: ROUTES.DASHBOARD.USERS, icon: PiUsersDuotone }], + }, + + // { + // header: 'Apps', + // section: [ + // { + // name: 'Kanban', + // href: paths.dashboard.apps.kanban, + // icon: PiKanbanDuotone, + // }, + // ], + // }, + + // { + // header: 'Management', + // section: [ + // { + // name: 'Customers', + // icon: PiUsersDuotone, + // href: paths.dashboard.management.customers.root, + // dropdownItems: [ + // { + // name: 'List', + // href: paths.dashboard.management.customers.list, + // }, + // ], + // }, + // ], + // }, + + // { + // header: 'Widgets', + // section: [ + // { + // name: 'Charts', + // href: paths.dashboard.widgets.charts, + // icon: PiChartLineUpDuotone, + // }, + // { + // name: 'Metrics', + // href: paths.dashboard.widgets.metrics, + // icon: PiSquaresFourDuotone, + // }, + // { + // name: 'Tables', + // href: paths.dashboard.widgets.tables, + // icon: PiTableDuotone, + // }, + // ], + // }, + + // { + // header: 'Authentication', + // section: [ + // { + // name: 'Register', + // href: paths.auth.register, + // icon: PiUserPlusDuotone, + // }, + // { + // name: 'Login', + // href: paths.auth.login, + // icon: PiShieldCheckDuotone, + // }, + // { + // name: 'Forgot Password', + // href: paths.auth.forgotPassword, + // icon: PiLockKeyDuotone, + // }, + // { + // name: 'OTP', + // href: paths.auth.otp, + // icon: PiChatCenteredDotsDuotone, + // }, + // ], + // }, +]; diff --git a/src/app/layouts/dashboard/sidebar/sidebar.module.css b/src/app/layouts/dashboard/sidebar/sidebar.module.css new file mode 100644 index 00000000..bd759518 --- /dev/null +++ b/src/app/layouts/dashboard/sidebar/sidebar.module.css @@ -0,0 +1,53 @@ +.sectionTitle { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-size: 0.75rem; + line-height: 1rem; + font-weight: 400; + text-transform: uppercase; + letter-spacing: 0.1em; + color: var(--mantine-color-dimmed); + margin-bottom: var(--mantine-spacing-sm); + padding-left: var(--mantine-spacing-md); +} + +.sectionLink { + border-radius: var(--mantine-radius-md); + + & svg { + height: 1.25rem; + width: 1.25rem; + } +} + +.sectionDropdownItemLink { + border-radius: var(--mantine-radius-md); + + & [data-position='left'] { + width: 20px; + } + + & :global(.dot) { + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + } + + & :global(.dot)::before { + content: ''; + display: inline-block; + background-color: var(--mantine-color-dimmed); + height: 0.3rem; + width: 0.3rem; + border-radius: 100%; + } + + &[data-active='true'] :global(.dot)::before { + background-color: var(--mantine-primary-color-filled); + height: 0.4rem; + width: 0.4rem; + } +} diff --git a/src/app/router/index.ts b/src/app/router/index.ts new file mode 100644 index 00000000..164ab508 --- /dev/null +++ b/src/app/router/index.ts @@ -0,0 +1 @@ +export * from './router'; diff --git a/src/app/router/router.tsx b/src/app/router/router.tsx new file mode 100644 index 00000000..19c3eda8 --- /dev/null +++ b/src/app/router/router.tsx @@ -0,0 +1,36 @@ +import { + createBrowserRouter, + createRoutesFromElements, + Navigate, + Route, + RouterProvider, +} from 'react-router-dom'; +import { AuthLayout } from '@/app/layouts/auth'; +import { DashboardLayout } from '@/app/layouts/dashboard'; +import { LoginPage } from '@/pages/auth/login/login.page'; +import { HomePageConnectior } from '@/pages/dashboard/home/connectores/home.page.connector'; +import { UsersPageConnector } from '@/pages/dashboard/users/ui/connectors/users.page.connector'; +import { AuthGuard } from '@/shared/hocs/guards/auth-guard'; +import { ROUTES } from '../../shared/constants'; + +const router = createBrowserRouter( + createRoutesFromElements( + }> + } /> + }> + } /> + } /> + + + }> + } /> + } /> + } /> + + + ) +); + +export function Router() { + return ; +} diff --git a/src/config.ts b/src/config.ts new file mode 100644 index 00000000..3edb037c --- /dev/null +++ b/src/config.ts @@ -0,0 +1,5 @@ +export const app = { + name: 'Remnawave Dashboard', + redirectQueryParamName: 'r', + accessTokenStoreKey: 'access_token', +}; diff --git a/src/entitites/auth/auth-store/auth-store.ts b/src/entitites/auth/auth-store/auth-store.ts new file mode 100644 index 00000000..59da4ee2 --- /dev/null +++ b/src/entitites/auth/auth-store/auth-store.ts @@ -0,0 +1,60 @@ +import { LoginCommand } from '@remnawave/backend-contract'; +import { instance } from '@shared/api'; +import { AxiosError } from 'axios'; +import { create } from 'zustand'; +import { devtools } from 'zustand/middleware'; +import { notifications } from '@mantine/notifications'; +import { removeToken, setToken } from '../session-store/use-session-store'; +import type { IActions, IState } from './interfaces'; + +const initialState: IState = { + isLoading: false, + loginResponse: null, +}; + +const useAuthStore = create()( + devtools( + (set, getState) => ({ + ...initialState, + actions: { + login: async (data: LoginCommand.Request): Promise => { + try { + set({ isLoading: true }); + const response = await instance.post(LoginCommand.url, data); + const { + data: { response: dataResponse }, + } = response; + const { accessToken } = dataResponse; + setToken({ token: accessToken }); + set({ loginResponse: dataResponse }); + + notifications.show({ + title: 'Welcome back!', + message: 'You have successfully logged in', + }); + } catch (e) { + if (e instanceof AxiosError) { + notifications.show({ message: e.message, color: 'red' }); + + throw e; + } + } finally { + set({ isLoading: false }); + } + }, + resetState: async () => { + removeToken(); + set({ ...initialState }); + }, + }, + }), + { + name: 'loginPageStore', + anonymousActionType: 'loginPageStore', + } + ) +); + +export const useAuthStoreIsLoading = () => useAuthStore((store) => store.isLoading); +export const useLoginResponse = () => useAuthStore((state) => state.loginResponse); +export const useLoginPageStoreActions = () => useAuthStore((store) => store.actions); diff --git a/src/entitites/auth/auth-store/interfaces/action.interface.ts b/src/entitites/auth/auth-store/interfaces/action.interface.ts new file mode 100644 index 00000000..7a886819 --- /dev/null +++ b/src/entitites/auth/auth-store/interfaces/action.interface.ts @@ -0,0 +1,8 @@ +import { LoginCommand } from '@remnawave/backend-contract'; + +export interface IActions { + actions: { + login: (data: LoginCommand.Request) => Promise; + resetState: () => Promise; + }; +} diff --git a/src/entitites/auth/auth-store/interfaces/index.ts b/src/entitites/auth/auth-store/interfaces/index.ts new file mode 100644 index 00000000..6f6e6d5c --- /dev/null +++ b/src/entitites/auth/auth-store/interfaces/index.ts @@ -0,0 +1,2 @@ +export * from './action.interface.js'; +export * from './state.interface.js'; diff --git a/src/entitites/auth/auth-store/interfaces/state.interface.ts b/src/entitites/auth/auth-store/interfaces/state.interface.ts new file mode 100644 index 00000000..ee77a63d --- /dev/null +++ b/src/entitites/auth/auth-store/interfaces/state.interface.ts @@ -0,0 +1,6 @@ +import { LoginCommand } from '@remnawave/backend-contract' + +export interface IState { + isLoading: boolean + loginResponse: LoginCommand.Response['response'] | null +} diff --git a/src/entitites/auth/index.ts b/src/entitites/auth/index.ts new file mode 100644 index 00000000..8974523b --- /dev/null +++ b/src/entitites/auth/index.ts @@ -0,0 +1 @@ +export * from './session-store'; diff --git a/src/entitites/auth/session-store/index.ts b/src/entitites/auth/session-store/index.ts new file mode 100644 index 00000000..d2ef8e57 --- /dev/null +++ b/src/entitites/auth/session-store/index.ts @@ -0,0 +1,2 @@ +export * from './interfaces'; +export * from './use-session-store'; diff --git a/src/entitites/auth/session-store/interfaces/action.interface.ts b/src/entitites/auth/session-store/interfaces/action.interface.ts new file mode 100644 index 00000000..1752a846 --- /dev/null +++ b/src/entitites/auth/session-store/interfaces/action.interface.ts @@ -0,0 +1,8 @@ +import type { ISetTokenAction } from './set-token-action.interface.ts' + +export interface IActions { + actions: { + setToken: (dto: ISetTokenAction) => void + removeToken: () => void + } +} diff --git a/src/entitites/auth/session-store/interfaces/index.ts b/src/entitites/auth/session-store/interfaces/index.ts new file mode 100644 index 00000000..b27aa943 --- /dev/null +++ b/src/entitites/auth/session-store/interfaces/index.ts @@ -0,0 +1,3 @@ +export * from './action.interface'; +export * from './set-token-action.interface'; +export * from './state.interface'; diff --git a/src/entitites/auth/session-store/interfaces/set-token-action.interface.ts b/src/entitites/auth/session-store/interfaces/set-token-action.interface.ts new file mode 100644 index 00000000..9eaaf591 --- /dev/null +++ b/src/entitites/auth/session-store/interfaces/set-token-action.interface.ts @@ -0,0 +1,3 @@ +export interface ISetTokenAction { + token: string +} diff --git a/src/entitites/auth/session-store/interfaces/state.interface.ts b/src/entitites/auth/session-store/interfaces/state.interface.ts new file mode 100644 index 00000000..e174d2db --- /dev/null +++ b/src/entitites/auth/session-store/interfaces/state.interface.ts @@ -0,0 +1,3 @@ +export interface IState { + token: string +} diff --git a/src/entitites/auth/session-store/use-session-store.ts b/src/entitites/auth/session-store/use-session-store.ts new file mode 100644 index 00000000..d8887fbf --- /dev/null +++ b/src/entitites/auth/session-store/use-session-store.ts @@ -0,0 +1,42 @@ +import { create } from 'zustand'; +import { createJSONStorage, devtools, persist } from 'zustand/middleware'; +import { setAuthorizationToken } from '@/shared/api'; +import { IActions, ISetTokenAction, IState } from './interfaces'; + +export const useSessionStore = create()( + persist( + devtools( + (set) => ({ + token: '', + actions: { + setToken: (dto: ISetTokenAction) => { + set({ token: dto.token }); + }, + removeToken: () => { + set({ token: '' }); + }, + }, + }), + { name: 'sessionStore', anonymousActionType: 'sessionStore' } + ), + { + name: 'sessionStore', + partialize: (state) => ({ + token: state.token, + }), + storage: createJSONStorage(() => localStorage), + } + ) +); + +useSessionStore.subscribe((state) => { + setAuthorizationToken(state.token); +}); + +setAuthorizationToken(useSessionStore.getState().token); + +export const useToken = () => useSessionStore((state) => state.token); +export const useSessionStoreActions = () => useSessionStore((state) => state.actions); + +export const setToken = (dto: ISetTokenAction) => useSessionStore.setState({ ...dto }); +export const removeToken = () => useSessionStore.getState().actions.removeToken(); diff --git a/src/entitites/dashboard/dashboard-store/dashboard-store.ts b/src/entitites/dashboard/dashboard-store/dashboard-store.ts new file mode 100644 index 00000000..85a76acf --- /dev/null +++ b/src/entitites/dashboard/dashboard-store/dashboard-store.ts @@ -0,0 +1,136 @@ +import { + GetAllUsersCommand, + GetInboundsCommand, + GetStatsCommand, +} from '@remnawave/backend-contract'; +import { instance } from '@shared/api'; +import { AxiosError } from 'axios'; +import { create } from 'zustand'; +import { devtools } from 'zustand/middleware'; +import { notifications } from '@mantine/notifications'; +import { IActions, IState, IUsersParams } from './interfaces'; + +const initialState: IState = { + isLoading: false, + systemInfo: null, + users: null, + usersParams: { + limit: 10, + offset: 0, + orderBy: 'createdAt', + orderDir: 'desc', + }, + totalUsers: 0, + inbounds: null, + isInboundsLoading: false, +}; + +export const useDashboardStore = create()( + devtools( + (set, getState) => ({ + ...initialState, + actions: { + getSystemInfo: async (): Promise => { + try { + set({ isLoading: true }); + const response = await instance.get(GetStatsCommand.url); + const { + data: { response: dataResponse }, + } = response; + + set({ systemInfo: dataResponse }); + + return true; + } catch (e) { + if (e instanceof AxiosError) { + throw e; + } + return false; + } finally { + set({ isLoading: false }); + } + }, + getUsers: async (params?: Partial): Promise => { + try { + set({ isLoading: true }); + const currentParams = getState().usersParams; + const newParams = { ...currentParams, ...params }; + + const response = await instance.get( + GetAllUsersCommand.url, + { + params: { + limit: newParams.limit, + offset: newParams.offset, + orderBy: newParams.orderBy, + orderDir: newParams.orderDir, + search: newParams.search, + searchBy: newParams.searchBy, + }, + } + ); + + const { + data: { response: dataResponse }, + } = response; + + set({ + users: dataResponse.users, + totalUsers: dataResponse.total, + usersParams: newParams, + }); + + return true; + } catch (e) { + if (e instanceof AxiosError) { + throw e; + } + return false; + } finally { + set({ isLoading: false }); + } + }, + getInbounds: async (): Promise => { + try { + set({ isInboundsLoading: true }); + const response = await instance.get( + GetInboundsCommand.url + ); + const { + data: { response: dataResponse }, + } = response; + + set({ inbounds: dataResponse }); + + return true; + } catch (e) { + if (e instanceof AxiosError) { + throw e; + } + return false; + } finally { + set({ isInboundsLoading: false }); + } + }, + resetState: async () => { + set({ ...initialState }); + }, + }, + }), + { + name: 'dashboardStore', + anonymousActionType: 'dashboardStore', + } + ) +); + +export const useDashboardStoreIsLoading = () => useDashboardStore((store) => store.isLoading); +export const useDashboardStoreSystemInfo = () => useDashboardStore((state) => state.systemInfo); +export const useDashboardStoreActions = () => useDashboardStore((store) => store.actions); +export const useDashboardStoreUsers = () => useDashboardStore((state) => state.users); +export const useDashboardStoreTotalUsers = () => useDashboardStore((state) => state.totalUsers); +export const useDashboardStoreParams = () => useDashboardStore((state) => state.usersParams); + +// Inbounds +export const useDSInbounds = () => useDashboardStore((state) => state.inbounds); +export const useDSInboundsLoading = () => useDashboardStore((state) => state.isInboundsLoading); diff --git a/src/entitites/dashboard/dashboard-store/interfaces/action.interface.ts b/src/entitites/dashboard/dashboard-store/interfaces/action.interface.ts new file mode 100644 index 00000000..a3e51dc7 --- /dev/null +++ b/src/entitites/dashboard/dashboard-store/interfaces/action.interface.ts @@ -0,0 +1,10 @@ +import { IUsersParams } from './users-params.interface'; + +export interface IActions { + actions: { + getSystemInfo: () => Promise; + getUsers: (params?: Partial) => Promise; + getInbounds: () => Promise; + resetState: () => Promise; + }; +} diff --git a/src/entitites/dashboard/dashboard-store/interfaces/index.ts b/src/entitites/dashboard/dashboard-store/interfaces/index.ts new file mode 100644 index 00000000..0cfdac84 --- /dev/null +++ b/src/entitites/dashboard/dashboard-store/interfaces/index.ts @@ -0,0 +1,3 @@ +export * from './action.interface'; +export * from './state.interface'; +export * from './users-params.interface'; diff --git a/src/entitites/dashboard/dashboard-store/interfaces/state.interface.ts b/src/entitites/dashboard/dashboard-store/interfaces/state.interface.ts new file mode 100644 index 00000000..1db60dc6 --- /dev/null +++ b/src/entitites/dashboard/dashboard-store/interfaces/state.interface.ts @@ -0,0 +1,16 @@ +import { + GetAllUsersCommand, + GetInboundsCommand, + GetStatsCommand, +} from '@remnawave/backend-contract'; +import { IUsersParams } from '../interfaces'; + +export interface IState { + isLoading: boolean; + isInboundsLoading: boolean; + systemInfo: GetStatsCommand.Response['response'] | null; + users: GetAllUsersCommand.Response['response']['users'] | null; + usersParams: IUsersParams; + totalUsers: number; + inbounds: GetInboundsCommand.Response['response'] | null; +} diff --git a/src/entitites/dashboard/dashboard-store/interfaces/users-params.interface.ts b/src/entitites/dashboard/dashboard-store/interfaces/users-params.interface.ts new file mode 100644 index 00000000..912b3ac6 --- /dev/null +++ b/src/entitites/dashboard/dashboard-store/interfaces/users-params.interface.ts @@ -0,0 +1,10 @@ +import { GetAllUsersCommand } from '@remnawave/backend-contract'; + +export interface IUsersParams { + limit: number; + offset: number; + orderBy?: GetAllUsersCommand.SortableField; + orderDir?: 'asc' | 'desc'; + search?: string; + searchBy?: GetAllUsersCommand.SearchableField; +} diff --git a/src/entitites/dashboard/user-modal-store/interfaces/action.interface.ts b/src/entitites/dashboard/user-modal-store/interfaces/action.interface.ts new file mode 100644 index 00000000..e2a009a2 --- /dev/null +++ b/src/entitites/dashboard/user-modal-store/interfaces/action.interface.ts @@ -0,0 +1,15 @@ +import { + GetUserByUuidCommand, + RevokeUserSubscriptionCommand, + UpdateUserCommand, +} from '@remnawave/backend-contract'; + +export interface IActions { + actions: { + getUser: () => Promise; + updateUser: (body: UpdateUserCommand.Request) => Promise; + changeModalState: (state: boolean) => void; + setUserUuid: (userUuid: string) => Promise; + resetState: () => Promise; + }; +} diff --git a/src/entitites/dashboard/user-modal-store/interfaces/index.ts b/src/entitites/dashboard/user-modal-store/interfaces/index.ts new file mode 100644 index 00000000..1793d4a9 --- /dev/null +++ b/src/entitites/dashboard/user-modal-store/interfaces/index.ts @@ -0,0 +1,2 @@ +export * from './action.interface'; +export * from './state.interface'; diff --git a/src/entitites/dashboard/user-modal-store/interfaces/state.interface.ts b/src/entitites/dashboard/user-modal-store/interfaces/state.interface.ts new file mode 100644 index 00000000..136c3e55 --- /dev/null +++ b/src/entitites/dashboard/user-modal-store/interfaces/state.interface.ts @@ -0,0 +1,13 @@ +import { + GetAllUsersCommand, + GetInboundsCommand, + GetStatsCommand, + GetUserByUuidCommand, +} from '@remnawave/backend-contract'; + +export interface IState { + isLoading: boolean; + isModalOpen: boolean; + userUuid: string | null; + user: GetUserByUuidCommand.Response['response'] | null; +} diff --git a/src/entitites/dashboard/user-modal-store/user-modal-store.ts b/src/entitites/dashboard/user-modal-store/user-modal-store.ts new file mode 100644 index 00000000..a7d9029b --- /dev/null +++ b/src/entitites/dashboard/user-modal-store/user-modal-store.ts @@ -0,0 +1,96 @@ +import { GetUserByUuidCommand, UpdateUserCommand } from '@remnawave/backend-contract'; +import { instance } from '@shared/api'; +import { AxiosError } from 'axios'; +import { create } from 'zustand'; +import { devtools } from 'zustand/middleware'; +import { IActions, IState } from './interfaces'; + +const initialState: IState = { + isLoading: false, + isModalOpen: false, + userUuid: null, + user: null, +}; + +export const useUserModalStore = create()( + devtools( + (set, getState) => ({ + ...initialState, + actions: { + getUser: async (): Promise => { + try { + set({ isLoading: true }); + + const userUuid = getState().userUuid; + + if (!userUuid) { + throw new Error('User UUID is required'); + } + + const response = await instance.get( + GetUserByUuidCommand.url(userUuid) + ); + + const { + data: { response: dataResponse }, + } = response; + + set({ user: dataResponse }); + + return true; + } catch (e) { + if (e instanceof AxiosError) { + throw e; + } + return false; + } finally { + set({ isLoading: false }); + } + }, + updateUser: async (body: UpdateUserCommand.Request): Promise => { + try { + set({ isLoading: true }); + const response = await instance.patch( + UpdateUserCommand.url, + body + ); + const { + data: { response: dataResponse }, + } = response; + + set({ user: dataResponse }); + + return true; + } catch (e) { + if (e instanceof AxiosError) { + throw e; + } + return false; + } finally { + set({ isLoading: false }); + } + }, + changeModalState: (modalState: boolean) => { + set((state) => ({ isModalOpen: modalState })); + if (!modalState) { + getState().actions.resetState(); + } + }, + setUserUuid: async (userUuid: string): Promise => { + set((state) => ({ userUuid })); + }, + resetState: async (): Promise => { + set({ ...initialState }); + }, + }, + }), + { + name: 'userModalStore', + anonymousActionType: 'userModalStore', + } + ) +); + +export const useUserModalStoreIsModalOpen = () => useUserModalStore((state) => state.isModalOpen); +export const useUserModalStoreActions = () => useUserModalStore((store) => store.actions); +export const useUserModalStoreUser = () => useUserModalStore((state) => state.user); diff --git a/src/entitites/dashboard/users/models/index.ts b/src/entitites/dashboard/users/models/index.ts new file mode 100644 index 00000000..8fc37b3c --- /dev/null +++ b/src/entitites/dashboard/users/models/index.ts @@ -0,0 +1,2 @@ +export * from './interfaces'; +export * from './tabs.entity'; diff --git a/src/entitites/dashboard/users/models/interfaces/get-tab-data.interface.ts b/src/entitites/dashboard/users/models/interfaces/get-tab-data.interface.ts new file mode 100644 index 00000000..a9c3ee25 --- /dev/null +++ b/src/entitites/dashboard/users/models/interfaces/get-tab-data.interface.ts @@ -0,0 +1,7 @@ +export interface IGetTabData { + totalUsers?: number; + activeUsers?: number; + disabledUsers?: number; + expiredUsers?: number; + limitedUsers?: number; +} diff --git a/src/entitites/dashboard/users/models/interfaces/index.ts b/src/entitites/dashboard/users/models/interfaces/index.ts new file mode 100644 index 00000000..1c746273 --- /dev/null +++ b/src/entitites/dashboard/users/models/interfaces/index.ts @@ -0,0 +1,2 @@ +export * from './get-tab-data.interface'; +export * from './user.type'; diff --git a/src/entitites/dashboard/users/models/interfaces/user.type.ts b/src/entitites/dashboard/users/models/interfaces/user.type.ts new file mode 100644 index 00000000..df66d51f --- /dev/null +++ b/src/entitites/dashboard/users/models/interfaces/user.type.ts @@ -0,0 +1,3 @@ +import { GetAllUsersCommand } from '@remnawave/backend-contract'; + +export type User = GetAllUsersCommand.Response['response']['users'][0]; diff --git a/src/entitites/dashboard/users/models/tabs.entity.ts b/src/entitites/dashboard/users/models/tabs.entity.ts new file mode 100644 index 00000000..51848d1b --- /dev/null +++ b/src/entitites/dashboard/users/models/tabs.entity.ts @@ -0,0 +1,41 @@ +import { IGetTabData, User } from '@/entitites/dashboard/users/models/interfaces'; +import { DataTable } from '@/shared/ui/stuff/data-table'; +import { UseDataTableArgs } from '@/shared/ui/stuff/data-table/use-data-table'; + +export function getTabDataUsers(data: IGetTabData) { + return DataTable.useDataTable({ + tabsConfig: { + tabs: [ + { + value: '*', + label: 'All', + counter: data.totalUsers || 0, + }, + { + value: 'ACTIVE', + label: 'Active', + color: 'teal', + counter: data.activeUsers || 0, + }, + { + value: 'DISABLED', + label: 'Disabled', + color: 'gray', + counter: data.disabledUsers || 0, + }, + { + value: 'EXPIRED', + label: 'Expired', + color: 'red', + counter: data.expiredUsers || 0, + }, + { + value: 'LIMITED', + label: 'Limited', + color: 'orange', + counter: data.limitedUsers || 0, + }, + ], + }, + }); +} diff --git a/src/entitites/dashboard/users/ui/index.ts b/src/entitites/dashboard/users/ui/index.ts new file mode 100644 index 00000000..8e301701 --- /dev/null +++ b/src/entitites/dashboard/users/ui/index.ts @@ -0,0 +1 @@ +export * from './table-columns'; diff --git a/src/entitites/dashboard/users/ui/table-columns/data-usage/data-usage.column.tsx b/src/entitites/dashboard/users/ui/table-columns/data-usage/data-usage.column.tsx new file mode 100644 index 00000000..55770681 --- /dev/null +++ b/src/entitites/dashboard/users/ui/table-columns/data-usage/data-usage.column.tsx @@ -0,0 +1,42 @@ +import { RESET_PERIODS } from '@remnawave/backend-contract'; +import { Box, Group, Indicator, Progress, Text } from '@mantine/core'; +import { IProps } from '@/entitites/dashboard/users/ui/table-columns/username/interface'; +import { prettyBytesUtil } from '@/shared/utils/bytes'; + +export function DataUsageColumnEntity(props: IProps) { + const { user } = props; + + const usedTrafficPercentage = (user.usedTrafficBytes / user.trafficLimitBytes) * 100; + const limitBytes = prettyBytesUtil(user.trafficLimitBytes, true); + const totalUsedTraffic = prettyBytesUtil(user.usedTrafficBytes, true); + const lifetimeUsedTraffic = prettyBytesUtil(user.totalUsedBytes, true); + + const strategy = { + [RESET_PERIODS.YEAR]: 'Yearly', + [RESET_PERIODS.MONTH]: 'Montly', + [RESET_PERIODS.WEEK]: 'Weekly', + [RESET_PERIODS.DAY]: 'Daily', + [RESET_PERIODS.NO_RESET]: '∞', + }[user.trafficLimitStrategy]; + + return ( + + 100 ? 'yellow' : 'cyan'} + striped + animated + /> + + + {totalUsedTraffic} / {limitBytes} {strategy} + + + Σ {lifetimeUsedTraffic} + + + + ); +} diff --git a/src/entitites/dashboard/users/ui/table-columns/data-usage/index.ts b/src/entitites/dashboard/users/ui/table-columns/data-usage/index.ts new file mode 100644 index 00000000..4a30a149 --- /dev/null +++ b/src/entitites/dashboard/users/ui/table-columns/data-usage/index.ts @@ -0,0 +1,2 @@ +export * from './interface'; +export * from './data-usage.column'; diff --git a/src/entitites/dashboard/users/ui/table-columns/data-usage/interface.ts b/src/entitites/dashboard/users/ui/table-columns/data-usage/interface.ts new file mode 100644 index 00000000..a78337af --- /dev/null +++ b/src/entitites/dashboard/users/ui/table-columns/data-usage/interface.ts @@ -0,0 +1,5 @@ +import { User } from '@/entitites/dashboard/users/models'; + +export interface IProps { + user: User; +} diff --git a/src/entitites/dashboard/users/ui/table-columns/index.ts b/src/entitites/dashboard/users/ui/table-columns/index.ts new file mode 100644 index 00000000..aa93f6f3 --- /dev/null +++ b/src/entitites/dashboard/users/ui/table-columns/index.ts @@ -0,0 +1,3 @@ +export * from './data-usage'; +export * from './status'; +export * from './username'; diff --git a/src/entitites/dashboard/users/ui/table-columns/short-uuid/index.ts b/src/entitites/dashboard/users/ui/table-columns/short-uuid/index.ts new file mode 100644 index 00000000..d8b2a54e --- /dev/null +++ b/src/entitites/dashboard/users/ui/table-columns/short-uuid/index.ts @@ -0,0 +1,2 @@ +export * from './interface'; +export * from './short-uuid.column'; diff --git a/src/entitites/dashboard/users/ui/table-columns/short-uuid/interface.ts b/src/entitites/dashboard/users/ui/table-columns/short-uuid/interface.ts new file mode 100644 index 00000000..a78337af --- /dev/null +++ b/src/entitites/dashboard/users/ui/table-columns/short-uuid/interface.ts @@ -0,0 +1,5 @@ +import { User } from '@/entitites/dashboard/users/models'; + +export interface IProps { + user: User; +} diff --git a/src/entitites/dashboard/users/ui/table-columns/short-uuid/short-uuid.column.tsx b/src/entitites/dashboard/users/ui/table-columns/short-uuid/short-uuid.column.tsx new file mode 100644 index 00000000..3c2281d8 --- /dev/null +++ b/src/entitites/dashboard/users/ui/table-columns/short-uuid/short-uuid.column.tsx @@ -0,0 +1,23 @@ +import { RESET_PERIODS } from '@remnawave/backend-contract'; +import prettyBytes from 'pretty-bytes'; +import { LuCopy } from 'react-icons/lu'; +import { Box, Button, Chip, CopyButton, Group, Indicator, Progress, Text } from '@mantine/core'; +import { IProps } from '@/entitites/dashboard/users/ui/table-columns/username/interface'; +import { LinkChip } from '@/shared/ui/stuff/link-chip'; + +export function ShortUuidColumnEntity(props: IProps) { + const { user } = props; + const shortDisplay = user.shortUuid.slice(0, 5); + + return ( + + {({ copied, copy }) => ( + }> + {shortDisplay}... + + )} + + ); +} diff --git a/src/entitites/dashboard/users/ui/table-columns/status/index.ts b/src/entitites/dashboard/users/ui/table-columns/status/index.ts new file mode 100644 index 00000000..2032d81a --- /dev/null +++ b/src/entitites/dashboard/users/ui/table-columns/status/index.ts @@ -0,0 +1,2 @@ +export * from './interface'; +export * from './status.column'; diff --git a/src/entitites/dashboard/users/ui/table-columns/status/interface.ts b/src/entitites/dashboard/users/ui/table-columns/status/interface.ts new file mode 100644 index 00000000..a78337af --- /dev/null +++ b/src/entitites/dashboard/users/ui/table-columns/status/interface.ts @@ -0,0 +1,5 @@ +import { User } from '@/entitites/dashboard/users/models'; + +export interface IProps { + user: User; +} diff --git a/src/entitites/dashboard/users/ui/table-columns/status/status.column.tsx b/src/entitites/dashboard/users/ui/table-columns/status/status.column.tsx new file mode 100644 index 00000000..566b3d61 --- /dev/null +++ b/src/entitites/dashboard/users/ui/table-columns/status/status.column.tsx @@ -0,0 +1,19 @@ +import { Group, Text } from '@mantine/core'; +import { IProps } from '@/entitites/dashboard/users/ui/table-columns/username/interface'; +import { getExpirationTextUtil } from '@/shared/utils/time-utils'; +import { UserStatusBadge } from '@/widgets/dashboard/users/user-status-badge'; + +export function StatusColumnEntity(props: IProps) { + const { user } = props; + + const expirationText = getExpirationTextUtil(user.expireAt); + + return ( + + + + {expirationText} + + + ); +} diff --git a/src/entitites/dashboard/users/ui/table-columns/username/index.ts b/src/entitites/dashboard/users/ui/table-columns/username/index.ts new file mode 100644 index 00000000..29830863 --- /dev/null +++ b/src/entitites/dashboard/users/ui/table-columns/username/index.ts @@ -0,0 +1,2 @@ +export * from './interface'; +export * from './username.column'; diff --git a/src/entitites/dashboard/users/ui/table-columns/username/interface.ts b/src/entitites/dashboard/users/ui/table-columns/username/interface.ts new file mode 100644 index 00000000..a78337af --- /dev/null +++ b/src/entitites/dashboard/users/ui/table-columns/username/interface.ts @@ -0,0 +1,5 @@ +import { User } from '@/entitites/dashboard/users/models'; + +export interface IProps { + user: User; +} diff --git a/src/entitites/dashboard/users/ui/table-columns/username/username.column.tsx b/src/entitites/dashboard/users/ui/table-columns/username/username.column.tsx new file mode 100644 index 00000000..4f3d172d --- /dev/null +++ b/src/entitites/dashboard/users/ui/table-columns/username/username.column.tsx @@ -0,0 +1,24 @@ +import { Box, Group, Indicator, Text } from '@mantine/core'; +import { IProps } from '@/entitites/dashboard/users/ui/table-columns/username/interface'; +import { getConnectionStatusColorUtil, getTimeAgoUtil } from '@/shared/utils/time-utils'; + +export function UsernameColumnEntity(props: IProps) { + const { user } = props; + + const color = getConnectionStatusColorUtil(user.onlineAt); + const timeAgo = getTimeAgoUtil(user.onlineAt); + + return ( + + + + + {user.username} + + + {timeAgo} + + + + ); +} diff --git a/src/features/auth/index.ts b/src/features/auth/index.ts new file mode 100644 index 00000000..cdd1411c --- /dev/null +++ b/src/features/auth/index.ts @@ -0,0 +1 @@ +export * from './login-form.feature'; diff --git a/src/features/auth/login-form.feature.tsx b/src/features/auth/login-form.feature.tsx new file mode 100644 index 00000000..735ba375 --- /dev/null +++ b/src/features/auth/login-form.feature.tsx @@ -0,0 +1,65 @@ +import { LoginCommand } from '@remnawave/backend-contract'; +import { useAuth } from '@shared/hooks/use-auth'; +import { PiSignInDuotone, PiSignOutDuotone } from 'react-icons/pi'; +import { Button, Container, Paper, PasswordInput, TextInput } from '@mantine/core'; +import { useForm, zodResolver } from '@mantine/form'; +import { + useAuthStoreIsLoading, + useLoginPageStoreActions, +} from '../../entitites/auth/auth-store/auth-store'; +import { handleFormErrors } from '../../shared/utils/form'; + +export const LoginForm = () => { + const { setIsAuthenticated } = useAuth(); + const { login } = useLoginPageStoreActions(); + const isLoading = useAuthStoreIsLoading(); + + const form = useForm({ + mode: 'uncontrolled', + validate: zodResolver(LoginCommand.RequestSchema), + initialValues: { username: '', password: '' }, + }); + + const handleSubmit = form.onSubmit(async (variables) => { + try { + await login({ username: variables.username, password: variables.password }); + setIsAuthenticated(true); + } catch (error) { + handleFormErrors(form, error); + } + }); + + return ( +
+ + + + + + + +
+ ); +}; diff --git a/src/features/dashboard/header-buttons/header-buttons.feature.tsx b/src/features/dashboard/header-buttons/header-buttons.feature.tsx new file mode 100644 index 00000000..4106a8e2 --- /dev/null +++ b/src/features/dashboard/header-buttons/header-buttons.feature.tsx @@ -0,0 +1,30 @@ +import { PiSignOutDuotone } from 'react-icons/pi'; +import { useNavigate } from 'react-router-dom'; +import { Button, Menu } from '@mantine/core'; +import { removeToken, useSessionStoreActions } from '../../../entitites/auth'; +import { ROUTES } from '../../../shared/constants'; +import { useAuth } from '../../../shared/hooks/use-auth'; + +export const HeaderButtons = () => { + const { setIsAuthenticated } = useAuth(); + + const navigate = useNavigate(); + const handleLogout = () => { + setIsAuthenticated(false); + removeToken(); + navigate(ROUTES.AUTH.LOGIN); + }; + + return ( + + + + ); +}; diff --git a/src/features/dashboard/header-buttons/index.ts b/src/features/dashboard/header-buttons/index.ts new file mode 100644 index 00000000..f858260e --- /dev/null +++ b/src/features/dashboard/header-buttons/index.ts @@ -0,0 +1 @@ +export * from './header-buttons.feature'; diff --git a/src/global.css b/src/global.css new file mode 100644 index 00000000..7a426fe1 --- /dev/null +++ b/src/global.css @@ -0,0 +1,10 @@ +@layer mantine, mantine-datatable; + +html, +body { + min-height: 100vh; +} + +#root { + height: 100vh; +} diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 00000000..ce8f30ca --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,4 @@ +import ReactDOM from 'react-dom/client'; +import { App } from './app'; + +ReactDOM.createRoot(document.getElementById('root')!).render(); diff --git a/src/pages/auth/login/login.page.tsx b/src/pages/auth/login/login.page.tsx new file mode 100644 index 00000000..40bd4041 --- /dev/null +++ b/src/pages/auth/login/login.page.tsx @@ -0,0 +1,36 @@ +import { Page } from '@shared/ui/page'; +import { UnderlineShape } from '@shared/ui/underline-shape'; +import { Box, Group, Stack, Text, Title } from '@mantine/core'; +import { Logo } from '@/shared/ui/logo'; +import { LoginForm } from '../../../features/auth'; + +export const LoginPage = () => { + return ( + + + + + + <Text fz="inherit" fw="inherit" component="span" pos="relative"> + Remnawave + <UnderlineShape + c="red" + left="0" + pos="absolute" + h="0.625rem" + bottom="-1rem" + w="7rem" + /> + </Text> + + + + + + + + + ); +}; + +export default LoginPage; diff --git a/src/pages/dashboard/home/components/home.module.css b/src/pages/dashboard/home/components/home.module.css new file mode 100644 index 00000000..7ea7555b --- /dev/null +++ b/src/pages/dashboard/home/components/home.module.css @@ -0,0 +1,7 @@ +.root { + flex: 1; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} diff --git a/src/pages/dashboard/home/components/home.page.tsx b/src/pages/dashboard/home/components/home.page.tsx new file mode 100644 index 00000000..cbd9ac44 --- /dev/null +++ b/src/pages/dashboard/home/components/home.page.tsx @@ -0,0 +1,115 @@ +import { Page } from '@shared/ui/page'; +import prettyBytes from 'pretty-bytes'; +import { BsFillClipboard2DataFill } from 'react-icons/bs'; +import { + FaBan, + FaCheckCircle, + FaExclamationCircle, + FaRegDotCircle, + FaTimesCircle, + FaUsers, +} from 'react-icons/fa'; +import { LuPieChart } from 'react-icons/lu'; +import { + PiChartBarDuotone, + PiChartPieSliceDuotone, + PiClockCountdownDuotone, + PiClockUserDuotone, + PiDevicesDuotone, + PiMemoryDuotone, + PiProhibitDuotone, + PiPulseDuotone, + PiTimerDuotone, + PiUsersDuotone, +} from 'react-icons/pi'; +import { SimpleGrid, Stack, Text } from '@mantine/core'; +import { LoadingScreen, PageHeader } from '@/shared/ui'; +import { formatInt } from '@/shared/utils'; +import { MetricWithIcon } from '@/widgets/dashboard/home/metric-with-icons'; +import { IProps } from './interfaces'; + +export const HomePage = (props: IProps) => { + const { systemInfo, breadcrumbs } = props; + + if (!systemInfo) { + return ; + } + + const { users, memory } = systemInfo; + + const simpleMetrics = [ + { + icon: PiDevicesDuotone, + title: 'Online users', + value: formatInt(users.onlineLastMinute ?? 0), + color: 'teal', + }, + { + icon: PiUsersDuotone, + title: 'Total users', + value: formatInt(users.totalUsers ?? 0), + color: 'blue', + }, + { + icon: PiChartBarDuotone, + title: 'Total traffic', + value: prettyBytes(Number(users.totalTrafficBytes) ?? 0), + color: 'green', + }, + { + icon: PiMemoryDuotone, + title: 'Available RAM', + value: + prettyBytes(Number(memory.available) ?? 0) + ' / ' + prettyBytes(Number(memory.total) ?? 0), + color: 'cyan', + }, + ]; + + const usersMetrics = [ + { + icon: PiPulseDuotone, + title: 'Active users', + value: users.statusCounts.ACTIVE, + color: 'teal', + }, + { + icon: PiClockUserDuotone, + title: 'Expired users', + value: users.statusCounts.EXPIRED, + color: 'red', + }, + { + icon: PiClockCountdownDuotone, + title: 'Limited users', + value: users.statusCounts.LIMITED, + color: 'orange', + }, + { + icon: PiProhibitDuotone, + title: 'Disabled users', + value: users.statusCounts.DISABLED, + color: 'gray', + }, + ]; + + return ( + + + + + + {simpleMetrics.map((metric) => ( + + ))} + + + Users + + {usersMetrics.map((metric) => ( + + ))} + + + + ); +}; diff --git a/src/pages/dashboard/home/components/index.ts b/src/pages/dashboard/home/components/index.ts new file mode 100644 index 00000000..a6b753d0 --- /dev/null +++ b/src/pages/dashboard/home/components/index.ts @@ -0,0 +1,2 @@ +export * from './home.page'; +export * from './interfaces'; diff --git a/src/pages/dashboard/home/components/interfaces/index.ts b/src/pages/dashboard/home/components/interfaces/index.ts new file mode 100644 index 00000000..f429b6b2 --- /dev/null +++ b/src/pages/dashboard/home/components/interfaces/index.ts @@ -0,0 +1 @@ +export * from './props.interface'; diff --git a/src/pages/dashboard/home/components/interfaces/props.interface.ts b/src/pages/dashboard/home/components/interfaces/props.interface.ts new file mode 100644 index 00000000..fcb7e70f --- /dev/null +++ b/src/pages/dashboard/home/components/interfaces/props.interface.ts @@ -0,0 +1,7 @@ +import { GetStatsCommand } from '@remnawave/backend-contract'; +import { IBreadcrumb } from '@/shared/interfaces'; + +export interface IProps { + systemInfo: GetStatsCommand.Response['response']; + breadcrumbs: IBreadcrumb[]; +} diff --git a/src/pages/dashboard/home/connectores/constant/constants.ts b/src/pages/dashboard/home/connectores/constant/constants.ts new file mode 100644 index 00000000..61a8a928 --- /dev/null +++ b/src/pages/dashboard/home/connectores/constant/constants.ts @@ -0,0 +1,3 @@ +import { IBreadcrumb } from '@/shared/interfaces'; + +export const BREADCRUMBS: IBreadcrumb[] = [{ label: 'Dashboard', href: '/' }, { label: 'Home' }]; diff --git a/src/pages/dashboard/home/connectores/constant/index.ts b/src/pages/dashboard/home/connectores/constant/index.ts new file mode 100644 index 00000000..c94f80f8 --- /dev/null +++ b/src/pages/dashboard/home/connectores/constant/index.ts @@ -0,0 +1 @@ +export * from './constants'; diff --git a/src/pages/dashboard/home/connectores/home.page.connector.tsx b/src/pages/dashboard/home/connectores/home.page.connector.tsx new file mode 100644 index 00000000..4a55f4f6 --- /dev/null +++ b/src/pages/dashboard/home/connectores/home.page.connector.tsx @@ -0,0 +1,27 @@ +import { useEffect } from 'react'; +import { + useDashboardStoreActions, + useDashboardStoreSystemInfo, +} from '@/entitites/dashboard/dashboard-store/dashboard-store'; +import { HomePage } from '@/pages/dashboard/home/components'; +import { LoadingScreen } from '@/shared/ui/loading-screen'; +import { BREADCRUMBS } from './constant'; + +export const HomePageConnectior = () => { + const actions = useDashboardStoreActions(); + const systemInfo = useDashboardStoreSystemInfo(); + + useEffect(() => { + const intervalTime = setInterval(() => { + actions.getSystemInfo(); + }, 5000); + + return () => clearInterval(intervalTime); + }, [actions]); + + if (!systemInfo) { + return ; + } + + return ; +}; diff --git a/src/pages/dashboard/home/connectores/index.ts b/src/pages/dashboard/home/connectores/index.ts new file mode 100644 index 00000000..c57d0c10 --- /dev/null +++ b/src/pages/dashboard/home/connectores/index.ts @@ -0,0 +1 @@ +export * from './home.page.connector'; diff --git a/src/pages/dashboard/users/ui/components/constants/constants.ts b/src/pages/dashboard/users/ui/components/constants/constants.ts new file mode 100644 index 00000000..409b4bc2 --- /dev/null +++ b/src/pages/dashboard/users/ui/components/constants/constants.ts @@ -0,0 +1,7 @@ +import { ROUTES } from '@/shared/constants'; +import { IBreadcrumb } from '@/shared/interfaces'; + +export const BREADCRUMBS: IBreadcrumb[] = [ + { label: 'Dashboard', href: ROUTES.DASHBOARD.HOME }, + { label: 'Users', href: ROUTES.DASHBOARD.USERS }, +]; diff --git a/src/pages/dashboard/users/ui/components/constants/index.ts b/src/pages/dashboard/users/ui/components/constants/index.ts new file mode 100644 index 00000000..c94f80f8 --- /dev/null +++ b/src/pages/dashboard/users/ui/components/constants/index.ts @@ -0,0 +1 @@ +export * from './constants'; diff --git a/src/pages/dashboard/users/ui/components/interfaces/index.ts b/src/pages/dashboard/users/ui/components/interfaces/index.ts new file mode 100644 index 00000000..f429b6b2 --- /dev/null +++ b/src/pages/dashboard/users/ui/components/interfaces/index.ts @@ -0,0 +1 @@ +export * from './props.interface'; diff --git a/src/pages/dashboard/users/ui/components/interfaces/props.interface.ts b/src/pages/dashboard/users/ui/components/interfaces/props.interface.ts new file mode 100644 index 00000000..7714674e --- /dev/null +++ b/src/pages/dashboard/users/ui/components/interfaces/props.interface.ts @@ -0,0 +1,19 @@ +import { Dispatch, SetStateAction } from 'react'; +import { GetAllUsersCommand } from '@remnawave/backend-contract'; +import { DataTableColumn, DataTableSortStatus } from 'mantine-datatable'; +import { User } from '@/entitites/dashboard/users/models'; +import { DataTableReturn } from '@/pages/dashboard/users/ui/connectors/interfaces'; + +export interface IProps { + users: User[]; + tabs: DataTableReturn; + setSearch: Dispatch>; + search: string; + setSearchBy: Dispatch>; + searchBy: string; + columns: DataTableColumn[]; + handleSortStatusChange: (status: { columnAccessor: string; direction: 'asc' | 'desc' }) => void; + handlePageChange: (page: number) => void; + handleRecordsPerPageChange: (recordsPerPage: number) => void; + handleUpdate: () => void; +} diff --git a/src/pages/dashboard/users/ui/components/users.page.tsx b/src/pages/dashboard/users/ui/components/users.page.tsx new file mode 100644 index 00000000..39091918 --- /dev/null +++ b/src/pages/dashboard/users/ui/components/users.page.tsx @@ -0,0 +1,53 @@ +import { Grid } from '@mantine/core'; +import { BREADCRUMBS } from '@/pages/dashboard/users/ui/components/constants'; +import { Page } from '@/shared/ui/page'; +import { PageHeader } from '@/shared/ui/page-header'; +import { UsersMetrics } from '@/widgets/dashboard/users/users-metrics'; +import { UserTableWidget } from '@/widgets/dashboard/users/users-table'; +import { ViewUserModal } from '@/widgets/dashboard/users/view-user-modal'; +import { IProps } from './interfaces'; + +export default function UsersPageComponent(props: IProps) { + const { + users, + tabs, + search, + setSearch, + searchBy, + setSearchBy, + columns, + handleSortStatusChange, + handlePageChange, + handleRecordsPerPageChange, + handleUpdate, + } = props; + + return ( + + + + + + + + + + + + + + + + ); +} diff --git a/src/pages/dashboard/users/ui/connectors/interfaces/data-table-return.type.ts b/src/pages/dashboard/users/ui/connectors/interfaces/data-table-return.type.ts new file mode 100644 index 00000000..ac89882b --- /dev/null +++ b/src/pages/dashboard/users/ui/connectors/interfaces/data-table-return.type.ts @@ -0,0 +1,25 @@ +import { DataTableSortStatus } from 'mantine-datatable'; +import { DataTableFilter } from '@/shared/ui/stuff/data-table/data-table-filters'; +import { DataTableTabsProps } from '@/shared/ui/stuff/data-table/data-table-tabs'; + +export type DataTableReturn = { + readonly tabs: { + readonly value: string | undefined; + readonly change: (value: string) => void; + readonly tabs: DataTableTabsProps['tabs']; + }; + readonly filters: { + readonly filters: Record; + readonly clear: () => void; + readonly change: (filter: Omit) => void; + readonly remove: (name: string) => void; + readonly query: Record; + }; + readonly sort: { + readonly change: (status: DataTableSortStatus) => void; + readonly column: keyof SortableFields; + readonly direction: 'asc' | 'desc'; + readonly status: DataTableSortStatus; + readonly query: `${string}:${'asc' | 'desc'}`; + }; +}; diff --git a/src/pages/dashboard/users/ui/connectors/interfaces/index.ts b/src/pages/dashboard/users/ui/connectors/interfaces/index.ts new file mode 100644 index 00000000..fe083c82 --- /dev/null +++ b/src/pages/dashboard/users/ui/connectors/interfaces/index.ts @@ -0,0 +1 @@ +export * from './data-table-return.type'; diff --git a/src/pages/dashboard/users/ui/connectors/users.page.connector.tsx b/src/pages/dashboard/users/ui/connectors/users.page.connector.tsx new file mode 100644 index 00000000..fdb16416 --- /dev/null +++ b/src/pages/dashboard/users/ui/connectors/users.page.connector.tsx @@ -0,0 +1,209 @@ +import { useEffect, useMemo, useState } from 'react'; +import { GetAllUsersCommand } from '@remnawave/backend-contract'; +import { DataTableColumn } from 'mantine-datatable'; +import prettyBytes from 'pretty-bytes'; +import { Box, Group, Indicator, MultiSelect, Select, Text, TextInput } from '@mantine/core'; +import { useDebouncedValue } from '@mantine/hooks'; +import { + useDashboardStoreActions, + useDashboardStoreIsLoading, + useDashboardStoreParams, + useDashboardStoreSystemInfo, + useDashboardStoreTotalUsers, + useDashboardStoreUsers, +} from '@/entitites/dashboard/dashboard-store/dashboard-store'; +import { + useUserModalStoreActions, + useUserModalStoreIsModalOpen, +} from '@/entitites/dashboard/user-modal-store/user-modal-store'; +import { getTabDataUsers, User } from '@/entitites/dashboard/users/models'; +import { DataUsageColumnEntity } from '@/entitites/dashboard/users/ui'; +import { ShortUuidColumnEntity } from '@/entitites/dashboard/users/ui/table-columns/short-uuid'; +import { StatusColumnEntity } from '@/entitites/dashboard/users/ui/table-columns/status/status.column'; +import { UsernameColumnEntity } from '@/entitites/dashboard/users/ui/table-columns/username/username.column'; +import UsersPage from '@/pages/dashboard/users/ui/components/users.page'; +import UsersPageComponent from '@/pages/dashboard/users/ui/components/users.page'; +import { AddButton } from '@/shared/ui/stuff/add-button'; +import { DataTable } from '@/shared/ui/stuff/data-table'; + +export function UsersPageConnector() { + const users = useDashboardStoreUsers(); + const isLoading = useDashboardStoreIsLoading(); + const totalUsers = useDashboardStoreTotalUsers(); + const params = useDashboardStoreParams(); + const actions = useDashboardStoreActions(); + const systemInfo = useDashboardStoreSystemInfo(); + + const [search, setSearch] = useState(''); + const [debouncedSearch] = useDebouncedValue(search, 300); + const [searchBy, setSearchBy] = useState('username'); + + const dataTab = getTabDataUsers({ + totalUsers: systemInfo?.users.totalUsers, + activeUsers: systemInfo?.users.statusCounts.ACTIVE, + disabledUsers: systemInfo?.users.statusCounts.DISABLED, + expiredUsers: systemInfo?.users.statusCounts.EXPIRED, + limitedUsers: systemInfo?.users.statusCounts.LIMITED, + }); + + const [debouncedFilters] = useDebouncedValue(dataTab.filters.filters, 300); + + useEffect(() => { + actions.getSystemInfo(); + + const filterEntry = Object.entries(debouncedFilters).find(([_, filter]) => filter?.value); + + const searchParams = filterEntry + ? { + search: String(filterEntry[1].value), + searchBy: filterEntry[0] as GetAllUsersCommand.SearchableField, + } + : { + search: dataTab.tabs.value === '*' ? '' : dataTab.tabs.value, + searchBy: dataTab.tabs.value === '*' ? ('username' as const) : ('status' as const), + }; + + actions.getUsers(searchParams); + }, [dataTab.tabs.value, debouncedFilters]); + + // useEffect(() => { + // actions.getSystemInfo(); + // actions.getUsers({ + // search: dataTab.tabs.value === '*' ? debouncedSearch : dataTab.tabs.value, + // searchBy: dataTab.tabs.value === '*' ? searchBy : 'status', + // }); + // }, [debouncedSearch, searchBy, dataTab.tabs.value]); + + const handlePageChange = (page: number) => { + const offset = (page - 1) * params.limit; + actions.getUsers({ offset }); + }; + + const handleRecordsPerPageChange = (limit: number) => { + actions.getUsers({ limit, offset: 0 }); + }; + + const handleSortStatusChange = (status: { + columnAccessor: string; + direction: 'asc' | 'desc'; + }) => { + actions.getUsers({ + orderBy: status.columnAccessor as GetAllUsersCommand.SortableField, + orderDir: status.direction, + }); + }; + + const handleUpdate = () => { + actions.getUsers({ offset: 0 }); + }; + + // User Modal + const isModalOpen = useUserModalStoreIsModalOpen(); + const userModalActions = useUserModalStoreActions(); + + const handleOpenModal = async (userUuid: string) => { + await userModalActions.setUserUuid(userUuid); + console.log('userUuid', userUuid); + userModalActions.changeModalState(true); + // !TODO: Ваня помоги + }; + + const columns = useMemo[]>( + () => [ + { + accessor: 'shortUuid' as const, + title: 'Sub-link', + width: 50, + sortable: true, + filterable: true, + filter: ( + + dataTab.filters.change({ + name: 'shortUuid', + label: 'Sub-link', + value: e.currentTarget.value, + }) + } + /> + ), + render: (user) => , + }, + { + accessor: 'username' as const, + title: 'Username', + width: 100, + sortable: true, + + filter: ( + + dataTab.filters.change({ + name: 'username', + label: 'Username', + value: e.currentTarget.value, + }) + } + /> + ), + render: (user) => , + }, + { + accessor: 'expireAt' as const, + title: 'Status', + width: 100, + sortable: true, + filter: ( + + dataTab.filters.change({ + name: 'status', + label: 'Status', + value, + }) + } + /> + ), + render: (user) => , + }, + { + accessor: 'usedTrafficBytes' as const, + title: 'Data usage', + width: 150, + sortable: true, + render: (user) => , + }, + { + accessor: 'actions', + title: 'Actions', + textAlign: 'right', + width: 100, + render: (user) => handleOpenModal(user.uuid)} />, + }, + ], + [] + ); + + return ( + + ); +} diff --git a/src/shared/api/axios.ts b/src/shared/api/axios.ts new file mode 100644 index 00000000..98ed8126 --- /dev/null +++ b/src/shared/api/axios.ts @@ -0,0 +1,24 @@ +import axios from 'axios'; + +let authorizationToken = ''; + +export const instance = axios.create({ + baseURL: __DOMAIN_BACKEND__, + headers: { + 'Content-type': 'application/json', + Accept: 'application/json', + }, +}); + +instance.interceptors.request.use((config) => { + config.headers.set('Authorization', `Bearer ${authorizationToken}`); + return config; +}); + +export const setAuthorizationToken = (token: string) => { + authorizationToken = token; +}; + +instance.interceptors.response.use((response) => { + return response; +}); diff --git a/src/shared/api/index.ts b/src/shared/api/index.ts new file mode 100644 index 00000000..2466ac84 --- /dev/null +++ b/src/shared/api/index.ts @@ -0,0 +1 @@ +export * from './axios'; diff --git a/src/shared/constants/index.ts b/src/shared/constants/index.ts new file mode 100644 index 00000000..a3820983 --- /dev/null +++ b/src/shared/constants/index.ts @@ -0,0 +1 @@ +export * from './routes'; diff --git a/src/shared/constants/routes.ts b/src/shared/constants/routes.ts new file mode 100644 index 00000000..afeb265b --- /dev/null +++ b/src/shared/constants/routes.ts @@ -0,0 +1,11 @@ +export const ROUTES = { + AUTH: { + ROOT: '/auth', + LOGIN: '/auth/login', + }, + DASHBOARD: { + ROOT: '/dashboard', + HOME: '/dashboard/home', + USERS: '/dashboard/users', + }, +} as const; diff --git a/src/shared/hocs/guards/auth-guard.tsx b/src/shared/hocs/guards/auth-guard.tsx new file mode 100644 index 00000000..447155df --- /dev/null +++ b/src/shared/hocs/guards/auth-guard.tsx @@ -0,0 +1,32 @@ +import { ReactNode } from 'react'; +import { ROUTES } from '@shared/constants/routes'; +import { useAuth } from '@shared/hooks'; +import { LoadingScreen } from '@shared/ui/loading-screen'; +import { Navigate, Outlet, useLocation } from 'react-router-dom'; + +export function AuthGuard() { + console.log('123131'); + const location = useLocation(); + + const { isAuthenticated, isInitialized } = useAuth(); + + if (!isInitialized) { + return ; + } + + if (!isAuthenticated) { + if (location.pathname.includes(ROUTES.AUTH.ROOT)) { + return ; + } + return ; + } + + if (isAuthenticated) { + if (location.pathname.includes(ROUTES.DASHBOARD.ROOT)) { + return ; + } + return ; + } + + return ; +} diff --git a/src/shared/hooks/api/auth/auth.ts b/src/shared/hooks/api/auth/auth.ts new file mode 100644 index 00000000..3cccb114 --- /dev/null +++ b/src/shared/hooks/api/auth/auth.ts @@ -0,0 +1,18 @@ +// import { LoginCommand } from '@remnawave/backend-contract'; +// import { setClientAccessToken } from '@shared/api/axios'; +// import { createPostMutationHook } from '@shared/api/axios-proxy'; +// import { notifications } from '@mantine/notifications'; + +// export const useLogin = createPostMutationHook({ +// endpoint: LoginCommand.url, +// bodySchema: LoginCommand.RequestSchema, +// responseSchema: LoginCommand.ResponseSchema, +// rMutationParams: { +// onSuccess: (data) => { +// setClientAccessToken(data.response.accessToken); +// }, +// onError: (error) => { +// notifications.show({ message: error.message, color: 'red' }); +// }, +// }, +// }); diff --git a/src/shared/hooks/api/get-system-info/get-system-info.query.ts b/src/shared/hooks/api/get-system-info/get-system-info.query.ts new file mode 100644 index 00000000..d928f187 --- /dev/null +++ b/src/shared/hooks/api/get-system-info/get-system-info.query.ts @@ -0,0 +1,8 @@ +import { GetAllUsersCommand } from '@remnawave/backend-contract'; +import { createGetQueryHook } from '@shared/api/axios-proxy'; + +export const useGetSystemInfo = createGetQueryHook({ + endpoint: GetAllUsersCommand.url, + responseSchema: GetAllUsersCommand.ResponseSchema, + rQueryParams: { queryKey: ['system-info'] }, +}); diff --git a/src/shared/hooks/api/get-system-info/index.ts b/src/shared/hooks/api/get-system-info/index.ts new file mode 100644 index 00000000..b299d935 --- /dev/null +++ b/src/shared/hooks/api/get-system-info/index.ts @@ -0,0 +1 @@ +export * from './get-system-info.query'; diff --git a/src/shared/hooks/index.ts b/src/shared/hooks/index.ts new file mode 100644 index 00000000..feaafda6 --- /dev/null +++ b/src/shared/hooks/index.ts @@ -0,0 +1 @@ +export * from './use-auth'; diff --git a/src/shared/hooks/use-auth.ts b/src/shared/hooks/use-auth.ts new file mode 100644 index 00000000..ab40d0c1 --- /dev/null +++ b/src/shared/hooks/use-auth.ts @@ -0,0 +1,9 @@ +import { useContext } from 'react'; +import { AuthContext } from '@shared/providers/auth-provider'; +import invariant from 'tiny-invariant'; + +export function useAuth() { + const context = useContext(AuthContext); + invariant(context, 'useAuth must be used within an AuthProvider'); + return context; +} diff --git a/src/shared/interfaces/breadcrumbds.interface.ts b/src/shared/interfaces/breadcrumbds.interface.ts new file mode 100644 index 00000000..e712303d --- /dev/null +++ b/src/shared/interfaces/breadcrumbds.interface.ts @@ -0,0 +1,4 @@ +export interface IBreadcrumb { + label: string; + href?: string; +} diff --git a/src/shared/interfaces/index.ts b/src/shared/interfaces/index.ts new file mode 100644 index 00000000..29205bd7 --- /dev/null +++ b/src/shared/interfaces/index.ts @@ -0,0 +1 @@ +export * from './breadcrumbds.interface'; diff --git a/src/shared/providers/auth-provider.tsx b/src/shared/providers/auth-provider.tsx new file mode 100644 index 00000000..7a787ee4 --- /dev/null +++ b/src/shared/providers/auth-provider.tsx @@ -0,0 +1,47 @@ +import { createContext, ReactNode, useEffect, useMemo, useState } from 'react'; +import { useToken } from '../../entitites/auth'; +import { useDashboardStoreActions } from '../../entitites/dashboard/dashboard-store/dashboard-store'; + +interface AuthContextValues { + isAuthenticated: boolean; + isInitialized: boolean; + setIsAuthenticated: (isAuthenticated: boolean) => void; +} + +export const AuthContext = createContext(null); + +interface AuthProviderProps { + children: ReactNode; +} + +export function AuthProvider({ children }: AuthProviderProps) { + const [isAuthenticated, setIsAuthenticated] = useState(false); + const [isInitialized, setIsInitialized] = useState(false); + const token = useToken(); + const actions = useDashboardStoreActions(); + + useEffect(() => { + (async () => { + if (!token) { + setIsAuthenticated(false); + setIsInitialized(true); + return; + } + + try { + await actions.getSystemInfo(); + setIsAuthenticated(true); + } catch (error) { + } finally { + setIsInitialized(true); + } + })(); + }, []); + + const value = useMemo( + () => ({ isAuthenticated, isInitialized, setIsAuthenticated }), + [isAuthenticated, isInitialized] + ); + + return {children}; +} diff --git a/src/shared/providers/index.ts b/src/shared/providers/index.ts new file mode 100644 index 00000000..45978bee --- /dev/null +++ b/src/shared/providers/index.ts @@ -0,0 +1,2 @@ +export * from './auth-provider'; +export * from './mdx-provider'; diff --git a/src/shared/providers/mdx-provider.tsx b/src/shared/providers/mdx-provider.tsx new file mode 100644 index 00000000..7bd6ee57 --- /dev/null +++ b/src/shared/providers/mdx-provider.tsx @@ -0,0 +1,14 @@ +import { ComponentProps } from 'react'; +import { MDXProvider as MDXDefaultProvider } from '@mdx-js/react'; + +type MDXDefaultProviderProps = ComponentProps; + +type MDXProviderProps = Omit; + +const components: MDXDefaultProviderProps['components'] = { + em: (props) => , +}; + +export function MDXProvider(props: MDXProviderProps) { + return ; +} diff --git a/src/shared/theme/index.ts b/src/shared/theme/index.ts new file mode 100644 index 00000000..e36d27e2 --- /dev/null +++ b/src/shared/theme/index.ts @@ -0,0 +1,32 @@ +import { createTheme } from '@mantine/core'; +import components from './overrides'; + +export const theme = createTheme({ + components, + cursorType: 'pointer', + fontFamily: 'Inter, sans-serif', + breakpoints: { + xs: '30em', + sm: '40em', + md: '48em', + lg: '64em', + xl: '80em', + '2xl': '96em', + '3xl': '120em', + '4xl': '160em', + }, + colors: { + dark: [ + '#A3B3C9', + '#8494AD', + '#677A96', + '#4B5D7A', + '#364563', + '#252F47', + '#1A2437', + '#111827', + '#0A101C', + '#050913', + ], + }, +}); diff --git a/src/shared/theme/overrides/badge.ts b/src/shared/theme/overrides/badge.ts new file mode 100644 index 00000000..67edcbf7 --- /dev/null +++ b/src/shared/theme/overrides/badge.ts @@ -0,0 +1,9 @@ +import { Badge } from '@mantine/core'; + +export default { + Badge: Badge.extend({ + defaultProps: { + radius: 'md', + }, + }), +}; diff --git a/src/shared/theme/overrides/breadcrumbs.tsx b/src/shared/theme/overrides/breadcrumbs.tsx new file mode 100644 index 00000000..4cef4375 --- /dev/null +++ b/src/shared/theme/overrides/breadcrumbs.tsx @@ -0,0 +1,12 @@ +import { Breadcrumbs } from '@mantine/core'; +import { GoDotFill as BreadcrumbsSeparator } from 'react-icons/go'; + +export default { + Breadcrumbs: Breadcrumbs.extend({ + defaultProps: { + separator: ( + + ), + }, + }), +}; diff --git a/src/shared/theme/overrides/buttons.ts b/src/shared/theme/overrides/buttons.ts new file mode 100644 index 00000000..8da6c491 --- /dev/null +++ b/src/shared/theme/overrides/buttons.ts @@ -0,0 +1,15 @@ +import { ActionIcon, Button } from '@mantine/core'; + +export default { + ActionIcon: ActionIcon.extend({ + defaultProps: { + radius: 'md', + variant: 'subtle', + }, + }), + Button: Button.extend({ + defaultProps: { + radius: 'sm', + }, + }), +}; diff --git a/src/shared/theme/overrides/card/card.module.css b/src/shared/theme/overrides/card/card.module.css new file mode 100644 index 00000000..eac18775 --- /dev/null +++ b/src/shared/theme/overrides/card/card.module.css @@ -0,0 +1,3 @@ +.root { + background-color: var(--mantine-color-body); +} diff --git a/src/shared/theme/overrides/card/index.ts b/src/shared/theme/overrides/card/index.ts new file mode 100644 index 00000000..88bf3a1b --- /dev/null +++ b/src/shared/theme/overrides/card/index.ts @@ -0,0 +1,13 @@ +import { Card } from '@mantine/core'; + +import classes from './card.module.css'; + +export default { + Card: Card.extend({ + classNames: classes, + defaultProps: { + radius: 'md', + withBorder: true, + }, + }), +}; diff --git a/src/shared/theme/overrides/charts.ts b/src/shared/theme/overrides/charts.ts new file mode 100644 index 00000000..7141cb2b --- /dev/null +++ b/src/shared/theme/overrides/charts.ts @@ -0,0 +1,11 @@ +import { BarChart } from '@mantine/charts'; + +export default { + BarChart: BarChart.extend({ + defaultProps: { + barProps: { + radius: 8, + }, + }, + }), +}; diff --git a/src/shared/theme/overrides/drawer.ts b/src/shared/theme/overrides/drawer.ts new file mode 100644 index 00000000..39a20bee --- /dev/null +++ b/src/shared/theme/overrides/drawer.ts @@ -0,0 +1,10 @@ +import { DrawerOverlay } from '@mantine/core'; + +export default { + DrawerOverlay: DrawerOverlay.extend({ + defaultProps: { + backgroundOpacity: 0.5, + blur: 2, + }, + }), +}; diff --git a/src/shared/theme/overrides/index.ts b/src/shared/theme/overrides/index.ts new file mode 100644 index 00000000..01cdb8ef --- /dev/null +++ b/src/shared/theme/overrides/index.ts @@ -0,0 +1,29 @@ +import card from './card'; +import badge from './badge'; +import breadcrumbs from './breadcrumbs'; +import buttons from './buttons'; +import charts from './charts'; +import drawer from './drawer'; +import inputs from './inputs'; +import loadingOverlay from './loading-overlay'; +import menu from './menu'; +import notification from './notification'; +import ringProgress from './ring-progress'; +import table from './table'; +import tooltip from './tooltip'; + +export default { + ...card, + ...badge, + ...breadcrumbs, + ...buttons, + ...charts, + ...drawer, + ...inputs, + ...loadingOverlay, + ...menu, + ...notification, + ...ringProgress, + ...table, + ...tooltip, +}; diff --git a/src/shared/theme/overrides/inputs.ts b/src/shared/theme/overrides/inputs.ts new file mode 100644 index 00000000..c640d634 --- /dev/null +++ b/src/shared/theme/overrides/inputs.ts @@ -0,0 +1,14 @@ +import { InputBase, PasswordInput } from '@mantine/core'; + +export default { + InputBase: InputBase.extend({ + defaultProps: { + radius: 'md', + }, + }), + PasswordInput: PasswordInput.extend({ + defaultProps: { + radius: 'md', + }, + }), +}; diff --git a/src/shared/theme/overrides/loading-overlay.ts b/src/shared/theme/overrides/loading-overlay.ts new file mode 100644 index 00000000..3a912a74 --- /dev/null +++ b/src/shared/theme/overrides/loading-overlay.ts @@ -0,0 +1,13 @@ +import { LoadingOverlay } from '@mantine/core'; + +export default { + LoadingOverlay: LoadingOverlay.extend({ + defaultProps: { + zIndex: 1000, + overlayProps: { + radius: 'sm', + blur: 4, + }, + }, + }), +}; diff --git a/src/shared/theme/overrides/menu.ts b/src/shared/theme/overrides/menu.ts new file mode 100644 index 00000000..773d1c98 --- /dev/null +++ b/src/shared/theme/overrides/menu.ts @@ -0,0 +1,11 @@ +import { Menu } from '@mantine/core'; + +export default { + Menu: Menu.extend({ + defaultProps: { + shadow: 'md', + withArrow: true, + transitionProps: { transition: 'scale', duration: 200 }, + }, + }), +}; diff --git a/src/shared/theme/overrides/notification.ts b/src/shared/theme/overrides/notification.ts new file mode 100644 index 00000000..e0066aa2 --- /dev/null +++ b/src/shared/theme/overrides/notification.ts @@ -0,0 +1,9 @@ +import { Notification } from '@mantine/core'; + +export default { + Notification: Notification.extend({ + defaultProps: { + radius: 'md', + }, + }), +}; diff --git a/src/shared/theme/overrides/ring-progress.ts b/src/shared/theme/overrides/ring-progress.ts new file mode 100644 index 00000000..ef9b2c71 --- /dev/null +++ b/src/shared/theme/overrides/ring-progress.ts @@ -0,0 +1,10 @@ +import { RingProgress } from '@mantine/core'; + +export default { + RingProgress: RingProgress.extend({ + defaultProps: { + thickness: 6, + roundCaps: true, + }, + }), +}; diff --git a/src/shared/theme/overrides/table.ts b/src/shared/theme/overrides/table.ts new file mode 100644 index 00000000..8aa57044 --- /dev/null +++ b/src/shared/theme/overrides/table.ts @@ -0,0 +1,9 @@ +import { Table } from '@mantine/core'; + +export default { + Table: Table.extend({ + defaultProps: { + highlightOnHover: true, + }, + }), +}; diff --git a/src/shared/theme/overrides/tooltip.ts b/src/shared/theme/overrides/tooltip.ts new file mode 100644 index 00000000..5ad4128b --- /dev/null +++ b/src/shared/theme/overrides/tooltip.ts @@ -0,0 +1,10 @@ +import { Tooltip } from '@mantine/core'; + +export default { + Tooltip: Tooltip.extend({ + defaultProps: { + radius: 'md', + withArrow: true, + }, + }), +}; diff --git a/src/shared/ui/color-scheme-toggler.tsx b/src/shared/ui/color-scheme-toggler.tsx new file mode 100644 index 00000000..6a98a76b --- /dev/null +++ b/src/shared/ui/color-scheme-toggler.tsx @@ -0,0 +1,47 @@ +import { match } from '@shared/utils/match'; +import { + PiMoonDuotone as DarkIcon, + PiSunDimDuotone as LightIcon, + PiDesktop as SystemIcon, +} from 'react-icons/pi'; +import { + ActionIcon, + ActionIconProps, + ElementProps, + MantineColorScheme, + Tooltip, + useMantineColorScheme, +} from '@mantine/core'; + +type ColorSchemeTogglerProps = Omit & + ElementProps<'button', keyof ActionIconProps>; + +export function ColorSchemeToggler(props: ColorSchemeTogglerProps) { + const { colorScheme, setColorScheme } = useMantineColorScheme(); + + const { label, icon: Icon } = match( + [colorScheme === 'auto', { label: 'System', icon: SystemIcon }], + [colorScheme === 'dark', { label: 'Dark', icon: DarkIcon }], + [colorScheme === 'light', { label: 'Light', icon: LightIcon }], + [true, { label: 'Dark', icon: DarkIcon }] + ); + + const handleSchemeChange = () => { + const nextColorScheme = match( + [colorScheme === 'auto', 'dark'], + [colorScheme === 'dark', 'light'], + [colorScheme === 'light', 'auto'], + [true, 'dark'] + ); + + setColorScheme(nextColorScheme); + }; + + return ( + + + + + + ); +} diff --git a/src/shared/ui/hamburger-button/hamburger-button.module.css b/src/shared/ui/hamburger-button/hamburger-button.module.css new file mode 100644 index 00000000..7df933f4 --- /dev/null +++ b/src/shared/ui/hamburger-button/hamburger-button.module.css @@ -0,0 +1,16 @@ +.root { + margin-inline-end: 0.75rem; + height: auto; + width: auto; + padding: 0; + color: inherit; + + @media (min-width: $mantine-breakpoint-sm) { + margin-inline-end: 1rem; + } +} + +.icon { + width: 1.5rem; + height: 1.5rem; +} diff --git a/src/shared/ui/hamburger-button/index.tsx b/src/shared/ui/hamburger-button/index.tsx new file mode 100644 index 00000000..1c36e5f0 --- /dev/null +++ b/src/shared/ui/hamburger-button/index.tsx @@ -0,0 +1,28 @@ +import clsx from 'clsx'; +import { ActionIcon, ActionIconProps, ElementProps } from '@mantine/core'; + +import classes from './hamburger-button.module.css'; + +type HamburgerButtonProps = ElementProps<'button', keyof ActionIconProps> & + Omit; + +export function HamburgerButton({ className, ...props }: HamburgerButtonProps) { + return ( + + + + + + ); +} diff --git a/src/shared/ui/index.ts b/src/shared/ui/index.ts new file mode 100644 index 00000000..f7e13f42 --- /dev/null +++ b/src/shared/ui/index.ts @@ -0,0 +1,7 @@ +export * from './color-scheme-toggler'; +export * from './loading-screen'; +export * from './logo'; +export * from './page'; +export * from './page-header'; +export * from './sticky-header'; +export * from './underline-shape'; diff --git a/src/shared/ui/loading-screen/index.ts b/src/shared/ui/loading-screen/index.ts new file mode 100644 index 00000000..28116a5e --- /dev/null +++ b/src/shared/ui/loading-screen/index.ts @@ -0,0 +1 @@ +export * from './loading-screen'; diff --git a/src/shared/ui/loading-screen/loading-screen.tsx b/src/shared/ui/loading-screen/loading-screen.tsx new file mode 100644 index 00000000..f07aaf3a --- /dev/null +++ b/src/shared/ui/loading-screen/loading-screen.tsx @@ -0,0 +1,9 @@ +import { Center, Progress } from '@mantine/core'; + +export function LoadingScreen() { + return ( +
+ +
+ ); +} diff --git a/src/shared/ui/logo.tsx b/src/shared/ui/logo.tsx new file mode 100644 index 00000000..fb604773 --- /dev/null +++ b/src/shared/ui/logo.tsx @@ -0,0 +1,27 @@ +import { Box, BoxProps, ElementProps } from '@mantine/core'; + +interface LogoProps + extends Omit, + ElementProps<'svg', keyof BoxProps> { + size?: string | number; +} + +export function Logo({ size, style, ...props }: LogoProps) { + return ( + + + + ); +} diff --git a/src/shared/ui/metric-card/index.ts b/src/shared/ui/metric-card/index.ts new file mode 100644 index 00000000..be9d5977 --- /dev/null +++ b/src/shared/ui/metric-card/index.ts @@ -0,0 +1,17 @@ +import { MetricCardRoot } from './metric-card-root'; +import { MetricCardIcon } from './metric-card-text-icon'; +import { MetricCardTextMuted } from './metric-card-text-muted'; +import { MetricCardTextTrend } from './metric-card-text-trend'; +import { MetricCardRingProgress } from './metric-card-ring-progress'; +import { MetricCardTextEmphasis } from './metric-card-text-emphasis'; +import { MetricCardBarChart } from './metric-card-bar-chart'; + +export const MetricCard = { + Root: MetricCardRoot, + Icon: MetricCardIcon, + TextMuted: MetricCardTextMuted, + TextTrend: MetricCardTextTrend, + TextEmphasis: MetricCardTextEmphasis, + RingProgress: MetricCardRingProgress, + BarChart: MetricCardBarChart, +}; diff --git a/src/shared/ui/metric-card/metric-card-bar-chart.tsx b/src/shared/ui/metric-card/metric-card-bar-chart.tsx new file mode 100644 index 00000000..10dce4fd --- /dev/null +++ b/src/shared/ui/metric-card/metric-card-bar-chart.tsx @@ -0,0 +1,7 @@ +import { BarChart, BarChartProps } from '@mantine/charts'; + +type MetricBarChartProps = BarChartProps; + +export function MetricCardBarChart(props: MetricBarChartProps) { + return ; +} diff --git a/src/shared/ui/metric-card/metric-card-ring-progress.tsx b/src/shared/ui/metric-card/metric-card-ring-progress.tsx new file mode 100644 index 00000000..1c86086f --- /dev/null +++ b/src/shared/ui/metric-card/metric-card-ring-progress.tsx @@ -0,0 +1,44 @@ +import { + alpha, + ElementProps, + RingProgress, + RingProgressProps, + Text, + TextProps, +} from '@mantine/core'; +import { match } from '@/shared/utils/match'; + +interface MetricRingProgressProps + extends Omit, + ElementProps<'div', keyof RingProgressProps> { + label?: string; + labelProps?: Omit; + baseColor?: string; +} + +export function MetricCardRingProgress({ + label, + baseColor, + labelProps, + sections, + ...props +}: MetricRingProgressProps) { + const color = match( + [!!baseColor, alpha(baseColor!, 0.1)], + [sections.length === 1, alpha(sections[0].color, 0.1)], + [true, alpha('var(--rp-curve-root-color)', 0.6)] + ); + + return ( + + {label} + + } + {...props} + /> + ); +} diff --git a/src/shared/ui/metric-card/metric-card-root.tsx b/src/shared/ui/metric-card/metric-card-root.tsx new file mode 100644 index 00000000..3761ec24 --- /dev/null +++ b/src/shared/ui/metric-card/metric-card-root.tsx @@ -0,0 +1,7 @@ +import { Card, CardProps, ElementProps } from '@mantine/core'; + +type MetricCardRootProps = CardProps & ElementProps<'div', keyof CardProps>; + +export function MetricCardRoot({ ...props }: MetricCardRootProps) { + return ; +} diff --git a/src/shared/ui/metric-card/metric-card-text-emphasis.tsx b/src/shared/ui/metric-card/metric-card-text-emphasis.tsx new file mode 100644 index 00000000..b91b84f7 --- /dev/null +++ b/src/shared/ui/metric-card/metric-card-text-emphasis.tsx @@ -0,0 +1,7 @@ +import { ElementProps, Text, TextProps } from '@mantine/core'; + +type MetricCardTextEmphasis = Omit & ElementProps<'p', keyof TextProps>; + +export function MetricCardTextEmphasis(props: MetricCardTextEmphasis) { + return ; +} diff --git a/src/shared/ui/metric-card/metric-card-text-icon.tsx b/src/shared/ui/metric-card/metric-card-text-icon.tsx new file mode 100644 index 00000000..3bc5e264 --- /dev/null +++ b/src/shared/ui/metric-card/metric-card-text-icon.tsx @@ -0,0 +1,17 @@ +import { Box, BoxProps, ElementProps } from '@mantine/core'; + +type MetricCardIcon = Omit & ElementProps<'div', keyof BoxProps>; + +export function MetricCardIcon({ display = 'flex', ...props }: MetricCardIcon) { + return ( + + ); +} diff --git a/src/shared/ui/metric-card/metric-card-text-muted.tsx b/src/shared/ui/metric-card/metric-card-text-muted.tsx new file mode 100644 index 00000000..31812a90 --- /dev/null +++ b/src/shared/ui/metric-card/metric-card-text-muted.tsx @@ -0,0 +1,8 @@ +import { ElementProps, Text, TextProps } from '@mantine/core'; + +export type MetricCardTextMutedProps = Omit & + ElementProps<'p', keyof TextProps>; + +export function MetricCardTextMuted(props: MetricCardTextMutedProps) { + return ; +} diff --git a/src/shared/ui/metric-card/metric-card-text-trend.tsx b/src/shared/ui/metric-card/metric-card-text-trend.tsx new file mode 100644 index 00000000..834dd440 --- /dev/null +++ b/src/shared/ui/metric-card/metric-card-text-trend.tsx @@ -0,0 +1,32 @@ +import { PiTrendDown, PiTrendUp } from 'react-icons/pi'; +import { Flex, Text } from '@mantine/core'; +import { match } from '@/shared/utils/match'; +import { formatPercentage } from '@/shared/utils/number'; +import { MetricCardTextMuted, MetricCardTextMutedProps } from './metric-card-text-muted'; + +interface MetricCardTextTrendProps extends MetricCardTextMutedProps { + value: number; +} + +export function MetricCardTextTrend({ value, children, ...props }: MetricCardTextTrendProps) { + const { + sign, + color, + icon: Icon, + } = match( + [value > 0, { sign: '+', color: 'var(--mantine-color-teal-6)', icon: PiTrendUp }], + [value > 0, { sign: '', color: 'var(--mantine-color-red-6)', icon: PiTrendDown }] + ); + + return ( + + + + + {formatPercentage(value, { prefix: sign })} + + {children} + + + ); +} diff --git a/src/shared/ui/money-input.tsx b/src/shared/ui/money-input.tsx new file mode 100644 index 00000000..a1ce20c4 --- /dev/null +++ b/src/shared/ui/money-input.tsx @@ -0,0 +1,77 @@ +import { forwardRef } from 'react'; +import { IMaskInput } from 'react-imask'; +import { Input, Text, type InputProps, type InputWrapperProps } from '@mantine/core'; +import { useUncontrolled } from '@mantine/hooks'; + +const maskProps = { + mask: Number, + thousandsSeparator: ' ', + radix: '.', + normalizeZeros: true, +}; + +export interface MoneyInputProps + extends Pick, + InputProps { + name?: string; + value?: string | number; + placeholder?: string; + onChange?: (value: number | string) => void; + currency?: string; +} + +export const MoneyInput = forwardRef( + ( + { + name, + placeholder, + error, + label, + description, + required, + value, + onChange, + currency = 'USD', + ...rest + }, + ref + ) => { + const [uncontrolledValue, handleUncontrolledValueChange] = useUncontrolled({ + value, + defaultValue: value, + onChange, + }); + + const handleChange = (unmaskedNewValue: string) => { + // Since money is typed in major units (100 USD), we need to convert + // it to minor units (10000 cents) before sending it to the backend. + const minorUnits = Math.round(Number(unmaskedNewValue) * 100); + handleUncontrolledValueChange(minorUnits); + }; + + const majorUnitsValue = String(uncontrolledValue ? Number(uncontrolledValue) / 100 : ''); + + return ( + + {currency}} + value={majorUnitsValue} + onAccept={handleChange} + {...maskProps} + {...rest} + /> + + ); + } +); diff --git a/src/shared/ui/page-header.tsx b/src/shared/ui/page-header.tsx new file mode 100644 index 00000000..64cba164 --- /dev/null +++ b/src/shared/ui/page-header.tsx @@ -0,0 +1,54 @@ +import { ReactNode } from 'react'; +import { NavLink } from 'react-router-dom'; +import { GroupProps, ElementProps, Title, Breadcrumbs, Anchor, Text, Group } from '@mantine/core'; + +interface PageHeaderProps + extends Omit, + ElementProps<'header', keyof GroupProps> { + title: ReactNode; + breadcrumbs?: { label: string; href?: string }[]; +} + +export function PageHeader({ + children, + title, + breadcrumbs, + className, + mb = 'xl', + ...props +}: PageHeaderProps) { + return ( + +
+ + {title} + + + {breadcrumbs && ( + + {breadcrumbs.map((breadcrumb) => + breadcrumb.href ? ( + + {breadcrumb.label} + + ) : ( + + {breadcrumb.label} + + ) + )} + + )} +
+ + {children} +
+ ); +} diff --git a/src/shared/ui/page/index.ts b/src/shared/ui/page/index.ts new file mode 100644 index 00000000..c3a84df7 --- /dev/null +++ b/src/shared/ui/page/index.ts @@ -0,0 +1 @@ +export * from './page'; diff --git a/src/shared/ui/page/page.tsx b/src/shared/ui/page/page.tsx new file mode 100644 index 00000000..0abff04c --- /dev/null +++ b/src/shared/ui/page/page.tsx @@ -0,0 +1,32 @@ +import { forwardRef, ReactNode, useEffect } from 'react'; +import { Helmet } from 'react-helmet-async'; +import { Box, BoxProps } from '@mantine/core'; +import { nprogress } from '@mantine/nprogress'; +import { app } from '@/config'; + +interface PageProps extends BoxProps { + children: ReactNode; + meta?: ReactNode; + title: string; +} +export const Page = forwardRef( + ({ children, title = '', meta, ...other }, ref) => { + useEffect(() => { + nprogress.complete(); + return () => nprogress.start(); + }, []); + + return ( + <> + + {`${title} | ${app.name}`} + {meta} + + + + {children} + + + ); + } +); diff --git a/src/shared/ui/sticky-header/index.tsx b/src/shared/ui/sticky-header/index.tsx new file mode 100644 index 00000000..900ad399 --- /dev/null +++ b/src/shared/ui/sticky-header/index.tsx @@ -0,0 +1,25 @@ +import { ReactNode } from 'react'; +import clsx from 'clsx'; +import { Box, BoxProps } from '@mantine/core'; +import { useWindowScroll } from '@mantine/hooks'; +import classes from './sticky-header.module.css'; + +interface StickyHeaderProps extends BoxProps { + offset?: number; + children?: ReactNode; +} + +export function StickyHeader({ children, offset = 2, className, ...rest }: StickyHeaderProps) { + const [scroll] = useWindowScroll(); + + return ( + offset} + {...rest} + > + {children} + + ); +} diff --git a/src/shared/ui/sticky-header/sticky-header.module.css b/src/shared/ui/sticky-header/sticky-header.module.css new file mode 100644 index 00000000..971cbeb7 --- /dev/null +++ b/src/shared/ui/sticky-header/sticky-header.module.css @@ -0,0 +1,20 @@ +.root { + position: sticky; + top: 0; + z-index: 199; + display: flex; + align-items: center; + padding: var(--mantine-spacing-md); + + backdrop-filter: blur(24px); + + @media (min-width: $mantine-breakpoint-md) { + padding-left: 1.25rem; + padding-right: 1.25rem; + } + + @media (min-width: $mantine-breakpoint-lg) { + padding-left: 1.5rem; + padding-right: 1.5rem; + } +} diff --git a/src/shared/ui/stuff/add-button.tsx b/src/shared/ui/stuff/add-button.tsx new file mode 100644 index 00000000..07ecd481 --- /dev/null +++ b/src/shared/ui/stuff/add-button.tsx @@ -0,0 +1,11 @@ +import { forwardRef } from 'react'; +import { Button, type ButtonProps, createPolymorphicComponent } from '@mantine/core'; +import { PiPlus as AddIcon } from 'react-icons/pi'; + +export type AddButtonProps = Omit; + +export const AddButton = createPolymorphicComponent<'button', AddButtonProps>( + forwardRef((props, ref) => ( + + )} + + + ); + } +); diff --git a/src/shared/ui/stuff/data-table/data-table-tabs.tsx b/src/shared/ui/stuff/data-table/data-table-tabs.tsx new file mode 100644 index 00000000..40a1aace --- /dev/null +++ b/src/shared/ui/stuff/data-table/data-table-tabs.tsx @@ -0,0 +1,77 @@ +import { forwardRef, useState } from 'react'; +import { + Badge, + Box, + CardSection, + CardSectionProps, + Indicator, + Tabs, + type IndicatorProps, + type TabsTabProps as MantineTabsTabProps, +} from '@mantine/core'; + +interface TabsTabProps extends Omit { + label: string; + counter?: number; + hasIndicator?: boolean; +} + +export interface DataTableTabsProps extends Omit { + tabs: TabsTabProps[]; + onChange?: (value: string) => void; +} + +function IndicatorWrapper({ children, color }: Pick) { + return ( + + {children} + + ); +} + +export const DataTableTabs = forwardRef( + ({ tabs, onChange, ...props }, ref) => { + const [activeTab, setActiveTab] = useState(tabs[0].value); + + const handleTabChange = (value: string | null) => { + setActiveTab(value); + if (value) onChange?.(value); + }; + + return ( + + + + {tabs.map(({ counter, hasIndicator, rightSection, color, ...tab }) => { + const BadgeWrapper = hasIndicator ? IndicatorWrapper : Box; + + const badge = + counter !== undefined ? ( + + + {counter} + + + ) : null; + + return ( + + {tab.label} + + ); + })} + + + + ); + } +); diff --git a/src/shared/ui/stuff/data-table/data-table-text-input-filter.tsx b/src/shared/ui/stuff/data-table/data-table-text-input-filter.tsx new file mode 100644 index 00000000..8c32f464 --- /dev/null +++ b/src/shared/ui/stuff/data-table/data-table-text-input-filter.tsx @@ -0,0 +1,24 @@ +import { TextInput, type TextInputProps } from '@mantine/core'; +import type { UseDataTableReturn } from './use-data-table'; + +interface DataTableTextInputFilterProps + extends Pick, + Omit { + name: string; + label: string; +} + +export function DataTableTextInputFilter({ + name, + label, + filters, + ...props +}: DataTableTextInputFilterProps) { + return ( + filters.change({ name, label, value: e.currentTarget.value })} + /> + ); +} diff --git a/src/shared/ui/stuff/data-table/index.ts b/src/shared/ui/stuff/data-table/index.ts new file mode 100644 index 00000000..81131d52 --- /dev/null +++ b/src/shared/ui/stuff/data-table/index.ts @@ -0,0 +1,28 @@ +import { DataTable as MantineDataTable } from 'mantine-datatable'; +import { capitalize } from '@/shared/utils/text'; +import { CardTitle } from '../card-title'; +import { DataTableActions } from './data-table-actions'; +import { DataTableContainer } from './data-table-container'; +import { DataTableContent } from './data-table-content'; +import { DataTableFilters } from './data-table-filters'; +import { DataTableTabs } from './data-table-tabs'; +import { DataTableTextInputFilter } from './data-table-text-input-filter'; +import { useDataTable } from './use-data-table'; + +export const DataTable = { + useDataTable, + Title: CardTitle, + Container: DataTableContainer, + Content: DataTableContent, + Tabs: DataTableTabs, + Filters: DataTableFilters, + Actions: DataTableActions, + Table: MantineDataTable, + TextInputFilter: DataTableTextInputFilter, + recordsPerPageLabel: (resource: string) => `${capitalize(resource)} per page`, + noRecordsText: (resource: string) => `No ${resource} found`, + paginationText: + (resource: string) => + ({ from, to, totalRecords }: { from: number; to: number; totalRecords: number }) => + `Showing ${from} to ${to} of ${totalRecords} ${resource}`, +}; diff --git a/src/shared/ui/stuff/data-table/use-data-table.ts b/src/shared/ui/stuff/data-table/use-data-table.ts new file mode 100644 index 00000000..c5fb4fd8 --- /dev/null +++ b/src/shared/ui/stuff/data-table/use-data-table.ts @@ -0,0 +1,91 @@ +import { useMemo, useState } from 'react'; +import { DataTableSortStatus } from 'mantine-datatable'; +import { useDebouncedValue } from '@mantine/hooks'; +import { isDefined } from '@/shared/utils/is'; +import { DataTableFilter } from './data-table-filters'; +import { DataTableTabsProps } from './data-table-tabs'; + +export interface UseDataTableArgs { + tabsConfig?: DataTableTabsProps; + sortConfig?: { + column: DataTableSortStatus['columnAccessor']; + direction: DataTableSortStatus['direction']; + }; +} + +export type UseDataTableReturn = ReturnType< + typeof useDataTable +>; + +export function useDataTable({ + tabsConfig, + sortConfig, +}: UseDataTableArgs) { + const [currentTab, setCurrentTab] = useState(tabsConfig?.tabs[0].value); + const [filters, setFilters] = useState>({}); + const [debouncedFilters] = useDebouncedValue(filters, 500); + const [sortStatus, setSortStatus] = useState>({ + columnAccessor: sortConfig?.column ?? '', + direction: sortConfig?.direction ?? 'asc', + }); + + const handleTabChange = (value: string) => { + setCurrentTab(value); + tabsConfig?.onChange?.(value); + }; + + const handleClearFilters = () => { + setFilters({}); + }; + + const handleRemoveFilter = (name: string) => { + setFilters((prevFilters) => { + const { [name]: removed, ...rest } = prevFilters; + return rest; + }); + }; + + const handleChangeFilter = (filter: Omit) => { + if (isDefined(filter.value)) { + setFilters((prevFilters) => ({ + ...prevFilters, + [filter.name]: { + ...filter, + onRemove: () => handleRemoveFilter(filter.name), + }, + })); + } else { + handleRemoveFilter(filter.name); + } + }; + + const queryFormattedFilters = useMemo( + () => + Object.values(debouncedFilters) + .filter(({ value }) => isDefined(value)) + .reduce((acc, { name, value }) => ({ ...acc, [name]: value }), {}), + [debouncedFilters] + ); + + return { + tabs: { + value: currentTab, + change: handleTabChange, + tabs: tabsConfig?.tabs ?? [], + }, + filters: { + filters, + clear: handleClearFilters, + change: handleChangeFilter, + remove: handleRemoveFilter, + query: queryFormattedFilters, + }, + sort: { + change: setSortStatus as any, // TODO: fix type + column: sortStatus.columnAccessor as keyof SortableFields, + direction: sortStatus.direction, + status: sortStatus, + query: `${sortStatus.columnAccessor.toString()}:${sortStatus.direction}` as const, + }, + } as const; +} diff --git a/src/shared/ui/stuff/export-button.tsx b/src/shared/ui/stuff/export-button.tsx new file mode 100644 index 00000000..e1c84b3a --- /dev/null +++ b/src/shared/ui/stuff/export-button.tsx @@ -0,0 +1,11 @@ +import { forwardRef } from 'react'; +import { Button, type ButtonProps, createPolymorphicComponent } from '@mantine/core'; +import { PiExport as ExportIcon } from 'react-icons/pi'; + +export type ExportButtonProps = Omit; + +export const ExportButton = createPolymorphicComponent<'button', ExportButtonProps>( + forwardRef((props, ref) => ( + + } + /> + + + + } + /> + + {spotlightComponent} + + ); +} diff --git a/src/shared/ui/stuff/spotlight-search-bar-button/spotlight-search-bar-button.module.css b/src/shared/ui/stuff/spotlight-search-bar-button/spotlight-search-bar-button.module.css new file mode 100644 index 00000000..2b34cb35 --- /dev/null +++ b/src/shared/ui/stuff/spotlight-search-bar-button/spotlight-search-bar-button.module.css @@ -0,0 +1,30 @@ +.input { + display: none; + + @media (min-width: $mantine-breakpoint-xl) { + display: inline-block; + } + + & input { + padding-inline-end: 4rem; + pointer-events: none; + } + + & [data-position='right'] { + pointer-events: none; + --section-size: 4rem; + } +} + +.button { + display: inline-block; + + @media (min-width: $mantine-breakpoint-xl) { + display: none; + } + + & [data-position] { + pointer-events: none; + margin-inline-end: 0; + } +} diff --git a/src/shared/ui/stuff/table-container.tsx b/src/shared/ui/stuff/table-container.tsx new file mode 100644 index 00000000..3642a21b --- /dev/null +++ b/src/shared/ui/stuff/table-container.tsx @@ -0,0 +1,25 @@ +import { ReactNode } from 'react'; +import { Card, CardProps } from '@mantine/core'; + +import { CardTitle } from './card-title'; + +interface TableContainerProps extends CardProps { + title?: string; + description?: string; + actions?: ReactNode; +} + +export function TableContainer({ + children, + title, + description, + actions, + ...props +}: TableContainerProps) { + return ( + + {title && } + {children} + + ); +} diff --git a/src/shared/ui/underline-shape.tsx b/src/shared/ui/underline-shape.tsx new file mode 100644 index 00000000..9db7e693 --- /dev/null +++ b/src/shared/ui/underline-shape.tsx @@ -0,0 +1,27 @@ +import { Box, BoxProps, ElementProps } from '@mantine/core'; + +interface UnderlineShape + extends Omit, + ElementProps<'svg', keyof BoxProps> { + size?: string | number; +} + +export function UnderlineShape({ size, style, ...props }: UnderlineShape) { + return ( + + + + ); +} diff --git a/src/shared/utils/boolean.ts b/src/shared/utils/boolean.ts new file mode 100644 index 00000000..5de92e03 --- /dev/null +++ b/src/shared/utils/boolean.ts @@ -0,0 +1,5 @@ +import { z } from 'zod'; + +export const booleanSchema = z + .union([z.boolean(), z.literal('true'), z.literal('false')]) + .transform((value) => value === true || value === 'true'); diff --git a/src/shared/utils/bytes/bytes-to-gb/bytes-to-gb.util.ts b/src/shared/utils/bytes/bytes-to-gb/bytes-to-gb.util.ts new file mode 100644 index 00000000..8b19d1eb --- /dev/null +++ b/src/shared/utils/bytes/bytes-to-gb/bytes-to-gb.util.ts @@ -0,0 +1,18 @@ +import { fromBytes } from '@tsmx/human-readable'; +import prettyBytes from 'pretty-bytes'; +import xbytes from 'xbytes'; + +export function bytesToGbUtil(bytesInput: number | undefined | string): number | undefined { + if (!bytesInput) return undefined; + if (typeof bytesInput === 'string') { + bytesInput = Number(bytesInput); + } + const res = xbytes.parseBytes(bytesInput, { + sticky: true, + prefixIndex: 3, + iec: true, + space: false, + }); + + return Number(res.size.replace('GiB', '')); +} diff --git a/src/shared/utils/bytes/bytes-to-gb/index.ts b/src/shared/utils/bytes/bytes-to-gb/index.ts new file mode 100644 index 00000000..5c8286d0 --- /dev/null +++ b/src/shared/utils/bytes/bytes-to-gb/index.ts @@ -0,0 +1 @@ +export * from './bytes-to-gb.util'; diff --git a/src/shared/utils/bytes/gb-to-bytes/gb-to-bytes.util.ts b/src/shared/utils/bytes/gb-to-bytes/gb-to-bytes.util.ts new file mode 100644 index 00000000..9c1f5d11 --- /dev/null +++ b/src/shared/utils/bytes/gb-to-bytes/gb-to-bytes.util.ts @@ -0,0 +1,12 @@ +import xbytes from 'xbytes'; + +export function gbToBytesUtil(gbInput: number | undefined): number | undefined { + if (!gbInput) return undefined; + if (typeof gbInput === 'string') { + gbInput = Number(gbInput); + } + + const res = xbytes.parse(`${gbInput} GiB`); + + return res.bytes; +} diff --git a/src/shared/utils/bytes/gb-to-bytes/index.ts b/src/shared/utils/bytes/gb-to-bytes/index.ts new file mode 100644 index 00000000..f37249eb --- /dev/null +++ b/src/shared/utils/bytes/gb-to-bytes/index.ts @@ -0,0 +1 @@ +export * from './gb-to-bytes.util'; diff --git a/src/shared/utils/bytes/index.ts b/src/shared/utils/bytes/index.ts new file mode 100644 index 00000000..c2185f97 --- /dev/null +++ b/src/shared/utils/bytes/index.ts @@ -0,0 +1,3 @@ +export * from './bytes-to-gb'; +export * from './gb-to-bytes'; +export * from './pretty-bytes'; diff --git a/src/shared/utils/bytes/pretty-bytes/index.ts b/src/shared/utils/bytes/pretty-bytes/index.ts new file mode 100644 index 00000000..56aa7bb7 --- /dev/null +++ b/src/shared/utils/bytes/pretty-bytes/index.ts @@ -0,0 +1 @@ +export * from './pretty-bytes.util'; diff --git a/src/shared/utils/bytes/pretty-bytes/pretty-bytes.util.ts b/src/shared/utils/bytes/pretty-bytes/pretty-bytes.util.ts new file mode 100644 index 00000000..07f4c823 --- /dev/null +++ b/src/shared/utils/bytes/pretty-bytes/pretty-bytes.util.ts @@ -0,0 +1,18 @@ +import xbytes from 'xbytes'; + +export function prettyBytesUtil( + bytesInput: number | undefined | string, + returnZero: boolean = false +): string | undefined { + if (!bytesInput) { + return returnZero ? '0' : undefined; + } + if (typeof bytesInput === 'string') { + bytesInput = Number(bytesInput); + } + + const res = xbytes.parseBytes(bytesInput, { sticky: true, prefixIndex: 3, iec: true }); + console.log(res); + + return String(res.size); +} diff --git a/src/shared/utils/date.ts b/src/shared/utils/date.ts new file mode 100644 index 00000000..a218fc7a --- /dev/null +++ b/src/shared/utils/date.ts @@ -0,0 +1,32 @@ +import { z } from 'zod'; +import dayjs, { type Dayjs, isDayjs } from 'dayjs'; +import customParseFormat from 'dayjs/plugin/customParseFormat'; +import relativeTime from 'dayjs/plugin/relativeTime'; + +dayjs.extend(customParseFormat); +dayjs.extend(relativeTime); + +export type CustomDate = Dayjs; + +export const date = dayjs; + +export function formatDate(value: Date | CustomDate | string, format = 'DD-MM-YYYY') { + return date(value).format(format); +} + +export function formatRelativeDate(value: Date | CustomDate | string) { + return date(value).fromNow(); +} + +/** Validate and transform date string to dayjs instance */ +export const dateSchema = z.custom((value) => { + if ( + value instanceof Date || + isDayjs(value) || + (typeof value === 'string' && date(value).isValid()) + ) { + return date(value); + } + + throw new Error('Invalid date format'); +}); diff --git a/src/shared/utils/factory.ts b/src/shared/utils/factory.ts new file mode 100644 index 00000000..9d46991f --- /dev/null +++ b/src/shared/utils/factory.ts @@ -0,0 +1,3 @@ +export function generateMany(count: number, factory: (index: number) => T): T[] { + return Array.from({ length: count }, (_, index) => factory(index)); +} diff --git a/src/shared/utils/form.ts b/src/shared/utils/form.ts new file mode 100644 index 00000000..6b28604c --- /dev/null +++ b/src/shared/utils/form.ts @@ -0,0 +1,20 @@ +import { UseFormReturnType } from '@mantine/form'; +import { notifications } from '@mantine/notifications'; + +export function handleFormErrors(form: UseFormReturnType, errors: unknown) { + if (!errors || typeof errors !== 'object') { + return; + } + + if ('formErrors' in errors && Array.isArray(errors.formErrors)) { + errors.formErrors.forEach((error) => { + notifications.show({ message: error, color: 'red' }); + }); + } + + if ('fieldErrors' in errors && typeof errors.fieldErrors === 'object' && errors.fieldErrors) { + Object.entries(errors.fieldErrors).forEach(([fieldName, fieldErrors]) => { + form.setFieldError(fieldName, fieldErrors.join(',')); + }); + } +} diff --git a/src/shared/utils/format.ts b/src/shared/utils/format.ts new file mode 100644 index 00000000..fc44aeb2 --- /dev/null +++ b/src/shared/utils/format.ts @@ -0,0 +1,12 @@ +export function formatBytes(bytes: number): string { + const units = ['B', 'KB', 'MB', 'GB', 'TB']; + let value = bytes; + let unitIndex = 0; + + while (value >= 1024 && unitIndex < units.length - 1) { + value /= 1024; + unitIndex++; + } + + return `${value.toFixed(2)} ${units[unitIndex]}`; +} diff --git a/src/shared/utils/index.ts b/src/shared/utils/index.ts new file mode 100644 index 00000000..e20990a3 --- /dev/null +++ b/src/shared/utils/index.ts @@ -0,0 +1,12 @@ +export * from './boolean'; +export * from './date'; +export * from './factory'; +export * from './form'; +export * from './is'; +export * from './match'; +export * from './money'; +export * from './number'; +export * from './phone-number'; +export * from './pipe'; +export * from './text'; +export * from './uid'; diff --git a/src/shared/utils/is.ts b/src/shared/utils/is.ts new file mode 100644 index 00000000..f255d25d --- /dev/null +++ b/src/shared/utils/is.ts @@ -0,0 +1,3 @@ +export function isDefined(value: unknown): value is NonNullable { + return value !== null && value !== undefined && value !== ''; +} diff --git a/src/shared/utils/match.ts b/src/shared/utils/match.ts new file mode 100644 index 00000000..0476783d --- /dev/null +++ b/src/shared/utils/match.ts @@ -0,0 +1,20 @@ +import invariant from 'tiny-invariant'; + +/** + * PHP like match function + * @param conditions - Array of [condition, value] + * @returns Value of first met condition + * @example + * ```tsx + * const value = match( + * [condition1, value1], + * [condition2, value2], + * [condition3, value3], + * [true, defaultValue] + * ); + */ +export function match(...conditions: Array<[boolean, T]>) { + const foundedCondition = conditions.find(([condition]) => condition) ?? conditions.at(-1); + invariant(foundedCondition, 'No conditions have been met'); + return foundedCondition[1]; +} diff --git a/src/shared/utils/money.ts b/src/shared/utils/money.ts new file mode 100644 index 00000000..a6b100de --- /dev/null +++ b/src/shared/utils/money.ts @@ -0,0 +1,106 @@ +import { + toDecimal, + dinero, + add, + subtract, + multiply, + toSnapshot, + transformScale, + up, + isZero, + isNegative, + isPositive, + equal, + type Dinero, +} from 'dinero.js'; +import { USD } from '@dinero.js/currencies'; +import { formatCurrency } from './number'; + +const CURRENCY = USD; + +export class Money { + private readonly dinero: Dinero; + + amountInCents: number; + + amount: number; + + constructor(amountInCents: number | string) { + this.dinero = dinero({ amount: Number(amountInCents), currency: CURRENCY }); + this.amount = Number(toDecimal(this.dinero)); + this.amountInCents = Number(amountInCents); + } + + add(m: Money) { + const { amount } = toSnapshot(add(this.dinero, m.dinero)); + return new Money(amount); + } + + subtract(m: Money) { + const { amount } = toSnapshot(subtract(this.dinero, m.dinero)); + return new Money(amount); + } + + multiply(multiplier: number, scale = 0) { + const { amount } = toSnapshot( + transformScale(multiply(this.dinero, { amount: multiplier, scale }), CURRENCY.exponent, up) + ); + return new Money(amount); + } + + isGreaterThan(m: Money) { + return this.amountInCents > m.amountInCents; + } + + isGreaterThanOrEqual(m: Money) { + return this.amountInCents >= m.amountInCents; + } + + isLessThan(m: Money) { + return this.amountInCents < m.amountInCents; + } + + isLessThanOrEqual(m: Money) { + return this.amountInCents <= m.amountInCents; + } + + percentage(percentage: number) { + if (percentage < 0 || percentage > 100) { + throw new Error('Percentage must be between 0 and 100'); + } + + const normalize = Math.ceil(percentage * 100); + return this.multiply(normalize, 4); + } + + isZero() { + return isZero(this.dinero); + } + + isNegative() { + return isNegative(this.dinero); + } + + isPositive() { + return isPositive(this.dinero); + } + + equal(m: Money) { + return equal(this.dinero, m.dinero); + } + + format() { + return toDecimal(this.dinero, ({ value, currency }) => + formatCurrency(value, ` ${currency.code}`) + ); + } +} + +interface Options { + minorUnit?: boolean; +} + +export function money(amount: number | string, options: Options = { minorUnit: true }): Money { + const arg = options.minorUnit ? amount : Number(amount) * 100; + return new Money(arg); +} diff --git a/src/shared/utils/number.ts b/src/shared/utils/number.ts new file mode 100644 index 00000000..d55267ec --- /dev/null +++ b/src/shared/utils/number.ts @@ -0,0 +1,64 @@ +interface FormatterOptions { + precision?: number; + full?: boolean; + thousandSeparator?: string; + decimalSeparator?: string; + suffix?: string; + prefix?: string; +} + +const defaultOptions: Required = { + precision: 2, + thousandSeparator: ',', + decimalSeparator: '.', + suffix: '', + prefix: '', + full: true, +}; + +export function formatDecimal(value: number | string, options?: FormatterOptions): string { + const currentValue = typeof value === 'string' ? parseFloat(value) : value; + + if (Number.isNaN(currentValue)) { + throw new Error( + 'Invalid value. Please provide a valid number or string representation of a number.' + ); + } + + const { precision, thousandSeparator, decimalSeparator, prefix, suffix } = { + ...defaultOptions, + ...options, + }; + + const parts = currentValue.toFixed(precision).split('.'); + const integerPart = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, thousandSeparator); + const decimalPart = parts[1]; + + return `${prefix}${integerPart}` + .concat(decimalPart ? `${decimalSeparator}${decimalPart}` : '') + .concat(suffix); +} + +export function formatInt(value: number | string, options?: FormatterOptions) { + return formatDecimal(value, { ...options, precision: 0 }); +} + +export function formatPercentage(value: number | string, options?: FormatterOptions): string { + return formatDecimal(value, { ...options, suffix: '%' }); +} + +export function formatCurrency( + value: number | string, + currency = '$', + options?: FormatterOptions +): string { + return formatDecimal(value, { ...options, prefix: currency }); +} + +export function isNumber(value: unknown): value is number { + return typeof value === 'number' && !Number.isNaN(value); +} + +export function randomInt({ min, max }: { min: number; max: number }) { + return Math.floor(Math.random() * (max - min + 1)) + min; +} diff --git a/src/shared/utils/phone-number.ts b/src/shared/utils/phone-number.ts new file mode 100644 index 00000000..173adef6 --- /dev/null +++ b/src/shared/utils/phone-number.ts @@ -0,0 +1,13 @@ +import { z } from 'zod'; +import parsePhoneNumber, { isValidPhoneNumber as baseIsValidPhoneNumber } from 'libphonenumber-js'; + +export const isValidPhoneNumber = (value: string) => baseIsValidPhoneNumber(value); + +export const phoneNumberSchema = z + .string() + .trim() + .refine(isValidPhoneNumber, 'Invalid phone number'); + +export function formatPhoneNumber(phoneNumber: string) { + return parsePhoneNumber(phoneNumber)?.formatInternational() ?? phoneNumber; +} diff --git a/src/shared/utils/pipe.ts b/src/shared/utils/pipe.ts new file mode 100644 index 00000000..0ee1d0e7 --- /dev/null +++ b/src/shared/utils/pipe.ts @@ -0,0 +1,297 @@ +/* eslint-disable no-plusplus */ +/* eslint-disable prefer-rest-params */ +/** + * @source https://github.com/gcanti/fp-ts/blob/89a772e95e414acee679f42f56527606f7b61f30/src/function.ts#L397 + * + * Pipes the value of an expression into a pipeline of functions. + * + * @example * + * const len = (s: string): number => s.length + * const double = (n: number): number => n * 2 + * + * // without pipe + * assert.strictEqual(double(len('aaa')), 6) + * + * // with pipe + * assert.strictEqual(pipe('aaa', len, double), 6) + */ +export function pipe(a: A): A; +export function pipe(a: A, ab: (a: A) => B): B; +export function pipe(a: A, ab: (a: A) => B, bc: (b: B) => C): C; +export function pipe(a: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D): D; +export function pipe( + a: A, + ab: (a: A) => B, + bc: (b: B) => C, + cd: (c: C) => D, + de: (d: D) => E +): E; +export function pipe( + a: A, + ab: (a: A) => B, + bc: (b: B) => C, + cd: (c: C) => D, + de: (d: D) => E, + ef: (e: E) => F +): F; +export function pipe( + a: A, + ab: (a: A) => B, + bc: (b: B) => C, + cd: (c: C) => D, + de: (d: D) => E, + ef: (e: E) => F, + fg: (f: F) => G +): G; +export function pipe( + a: A, + ab: (a: A) => B, + bc: (b: B) => C, + cd: (c: C) => D, + de: (d: D) => E, + ef: (e: E) => F, + fg: (f: F) => G, + gh: (g: G) => H +): H; +export function pipe( + a: A, + ab: (a: A) => B, + bc: (b: B) => C, + cd: (c: C) => D, + de: (d: D) => E, + ef: (e: E) => F, + fg: (f: F) => G, + gh: (g: G) => H, + hi: (h: H) => I +): I; +export function pipe( + a: A, + ab: (a: A) => B, + bc: (b: B) => C, + cd: (c: C) => D, + de: (d: D) => E, + ef: (e: E) => F, + fg: (f: F) => G, + gh: (g: G) => H, + hi: (h: H) => I, + ij: (i: I) => J +): J; +export function pipe( + a: A, + ab: (a: A) => B, + bc: (b: B) => C, + cd: (c: C) => D, + de: (d: D) => E, + ef: (e: E) => F, + fg: (f: F) => G, + gh: (g: G) => H, + hi: (h: H) => I, + ij: (i: I) => J, + jk: (j: J) => K +): K; +export function pipe( + a: A, + ab: (a: A) => B, + bc: (b: B) => C, + cd: (c: C) => D, + de: (d: D) => E, + ef: (e: E) => F, + fg: (f: F) => G, + gh: (g: G) => H, + hi: (h: H) => I, + ij: (i: I) => J, + jk: (j: J) => K, + kl: (k: K) => L +): L; +export function pipe( + a: A, + ab: (a: A) => B, + bc: (b: B) => C, + cd: (c: C) => D, + de: (d: D) => E, + ef: (e: E) => F, + fg: (f: F) => G, + gh: (g: G) => H, + hi: (h: H) => I, + ij: (i: I) => J, + jk: (j: J) => K, + kl: (k: K) => L, + lm: (l: L) => M +): M; +export function pipe( + a: A, + ab: (a: A) => B, + bc: (b: B) => C, + cd: (c: C) => D, + de: (d: D) => E, + ef: (e: E) => F, + fg: (f: F) => G, + gh: (g: G) => H, + hi: (h: H) => I, + ij: (i: I) => J, + jk: (j: J) => K, + kl: (k: K) => L, + lm: (l: L) => M, + mn: (m: M) => N +): N; +export function pipe( + a: A, + ab: (a: A) => B, + bc: (b: B) => C, + cd: (c: C) => D, + de: (d: D) => E, + ef: (e: E) => F, + fg: (f: F) => G, + gh: (g: G) => H, + hi: (h: H) => I, + ij: (i: I) => J, + jk: (j: J) => K, + kl: (k: K) => L, + lm: (l: L) => M, + mn: (m: M) => N, + no: (n: N) => O +): O; + +export function pipe( + a: A, + ab: (a: A) => B, + bc: (b: B) => C, + cd: (c: C) => D, + de: (d: D) => E, + ef: (e: E) => F, + fg: (f: F) => G, + gh: (g: G) => H, + hi: (h: H) => I, + ij: (i: I) => J, + jk: (j: J) => K, + kl: (k: K) => L, + lm: (l: L) => M, + mn: (m: M) => N, + no: (n: N) => O, + op: (o: O) => P +): P; + +export function pipe( + a: A, + ab: (a: A) => B, + bc: (b: B) => C, + cd: (c: C) => D, + de: (d: D) => E, + ef: (e: E) => F, + fg: (f: F) => G, + gh: (g: G) => H, + hi: (h: H) => I, + ij: (i: I) => J, + jk: (j: J) => K, + kl: (k: K) => L, + lm: (l: L) => M, + mn: (m: M) => N, + no: (n: N) => O, + op: (o: O) => P, + pq: (p: P) => Q +): Q; + +export function pipe( + a: A, + ab: (a: A) => B, + bc: (b: B) => C, + cd: (c: C) => D, + de: (d: D) => E, + ef: (e: E) => F, + fg: (f: F) => G, + gh: (g: G) => H, + hi: (h: H) => I, + ij: (i: I) => J, + jk: (j: J) => K, + kl: (k: K) => L, + lm: (l: L) => M, + mn: (m: M) => N, + no: (n: N) => O, + op: (o: O) => P, + pq: (p: P) => Q, + qr: (q: Q) => R +): R; + +export function pipe( + a: A, + ab: (a: A) => B, + bc: (b: B) => C, + cd: (c: C) => D, + de: (d: D) => E, + ef: (e: E) => F, + fg: (f: F) => G, + gh: (g: G) => H, + hi: (h: H) => I, + ij: (i: I) => J, + jk: (j: J) => K, + kl: (k: K) => L, + lm: (l: L) => M, + mn: (m: M) => N, + no: (n: N) => O, + op: (o: O) => P, + pq: (p: P) => Q, + qr: (q: Q) => R, + rs: (r: R) => S +): S; + +export function pipe( + a: A, + ab: (a: A) => B, + bc: (b: B) => C, + cd: (c: C) => D, + de: (d: D) => E, + ef: (e: E) => F, + fg: (f: F) => G, + gh: (g: G) => H, + hi: (h: H) => I, + ij: (i: I) => J, + jk: (j: J) => K, + kl: (k: K) => L, + lm: (l: L) => M, + mn: (m: M) => N, + no: (n: N) => O, + op: (o: O) => P, + pq: (p: P) => Q, + qr: (q: Q) => R, + rs: (r: R) => S, + st: (s: S) => T +): T; +export function pipe( + a: unknown, + ab?: Function, + bc?: Function, + cd?: Function, + de?: Function, + ef?: Function, + fg?: Function, + gh?: Function, + hi?: Function +): unknown { + switch (arguments.length) { + case 1: + return a; + case 2: + return ab!(a); + case 3: + return bc!(ab!(a)); + case 4: + return cd!(bc!(ab!(a))); + case 5: + return de!(cd!(bc!(ab!(a)))); + case 6: + return ef!(de!(cd!(bc!(ab!(a))))); + case 7: + return fg!(ef!(de!(cd!(bc!(ab!(a)))))); + case 8: + return gh!(fg!(ef!(de!(cd!(bc!(ab!(a))))))); + case 9: + return hi!(gh!(fg!(ef!(de!(cd!(bc!(ab!(a)))))))); + default: { + let ret = arguments[0]; + for (let i = 1; i < arguments.length; i++) { + ret = arguments[i](ret); + } + return ret; + } + } +} diff --git a/src/shared/utils/text.ts b/src/shared/utils/text.ts new file mode 100644 index 00000000..c58bb451 --- /dev/null +++ b/src/shared/utils/text.ts @@ -0,0 +1,10 @@ +export function capitalize(str: string) { + return str.charAt(0).toUpperCase() + str.slice(1); +} + +export function firstLetters(text: string) { + return text + .split(' ') + .map((word) => word[0]) + .join(''); +} diff --git a/src/shared/utils/time-utils/get-connection-status-color/get-connection-status-color.util.ts b/src/shared/utils/time-utils/get-connection-status-color/get-connection-status-color.util.ts new file mode 100644 index 00000000..e51de655 --- /dev/null +++ b/src/shared/utils/time-utils/get-connection-status-color/get-connection-status-color.util.ts @@ -0,0 +1,17 @@ +import dayjs from 'dayjs'; + +export const getConnectionStatusColorUtil = (onlineAt: string | null | Date): string => { + if (!onlineAt) { + return 'var(--mantine-color-yellow-5)'; + } + + const lastSeen = dayjs.utc(onlineAt); + const now = dayjs.utc(); + const diffInSeconds = now.diff(lastSeen, 'second'); + + if (diffInSeconds <= 60) { + return 'var(--mantine-color-teal-5)'; + } + + return 'var(--mantine-color-red-5)'; +}; diff --git a/src/shared/utils/time-utils/get-connection-status-color/index.ts b/src/shared/utils/time-utils/get-connection-status-color/index.ts new file mode 100644 index 00000000..ede8541f --- /dev/null +++ b/src/shared/utils/time-utils/get-connection-status-color/index.ts @@ -0,0 +1 @@ +export * from './get-connection-status-color.util'; diff --git a/src/shared/utils/time-utils/get-expiration-text/get-expiration-text.util.ts b/src/shared/utils/time-utils/get-expiration-text/get-expiration-text.util.ts new file mode 100644 index 00000000..5494798c --- /dev/null +++ b/src/shared/utils/time-utils/get-expiration-text/get-expiration-text.util.ts @@ -0,0 +1,12 @@ +import dayjs from 'dayjs'; + +export function getExpirationTextUtil(expireAt: string | Date): string { + const expiration = dayjs(expireAt); + const now = dayjs(); + + if (expiration.isBefore(now)) { + return `Expired ${expiration.fromNow(false)}`; + } + + return `Expires in ${expiration.fromNow(true)}`; +} diff --git a/src/shared/utils/time-utils/get-expiration-text/index.ts b/src/shared/utils/time-utils/get-expiration-text/index.ts new file mode 100644 index 00000000..61447b8d --- /dev/null +++ b/src/shared/utils/time-utils/get-expiration-text/index.ts @@ -0,0 +1 @@ +export * from './get-expiration-text.util'; diff --git a/src/shared/utils/time-utils/get-time-ago/get-time-ago.util.ts b/src/shared/utils/time-utils/get-time-ago/get-time-ago.util.ts new file mode 100644 index 00000000..d8d1da9e --- /dev/null +++ b/src/shared/utils/time-utils/get-time-ago/get-time-ago.util.ts @@ -0,0 +1,10 @@ +import dayjs from 'dayjs'; + +export function getTimeAgoUtil(dateStr: string | Date | null): string { + if (!dateStr) return 'Not Connected Yet'; + + const date = dayjs(dateStr); + if (!date.isValid()) return 'Invalid Date'; + + return date.fromNow(); +} diff --git a/src/shared/utils/time-utils/get-time-ago/index.ts b/src/shared/utils/time-utils/get-time-ago/index.ts new file mode 100644 index 00000000..91bb2e0e --- /dev/null +++ b/src/shared/utils/time-utils/get-time-ago/index.ts @@ -0,0 +1 @@ +export * from './get-time-ago.util'; diff --git a/src/shared/utils/time-utils/index.ts b/src/shared/utils/time-utils/index.ts new file mode 100644 index 00000000..7e6f08b0 --- /dev/null +++ b/src/shared/utils/time-utils/index.ts @@ -0,0 +1,12 @@ +import dayjs from 'dayjs'; +import duration from 'dayjs/plugin/duration'; +import relativeTime from 'dayjs/plugin/relativeTime'; +import utc from 'dayjs/plugin/utc'; + +dayjs.extend(relativeTime); +dayjs.extend(utc); +dayjs.extend(duration); + +export * from './get-time-ago/get-time-ago.util'; +export * from './get-expiration-text/get-expiration-text.util'; +export * from './get-connection-status-color/get-connection-status-color.util'; diff --git a/src/shared/utils/uid.ts b/src/shared/utils/uid.ts new file mode 100644 index 00000000..f4c3d44c --- /dev/null +++ b/src/shared/utils/uid.ts @@ -0,0 +1,5 @@ +import { createId } from '@paralleldrive/cuid2'; + +export function generateId() { + return createId(); +} diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 00000000..11f02fe2 --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/src/widgets/dashboard/home/metric-with-icons/index.ts b/src/widgets/dashboard/home/metric-with-icons/index.ts new file mode 100644 index 00000000..bbeebccc --- /dev/null +++ b/src/widgets/dashboard/home/metric-with-icons/index.ts @@ -0,0 +1 @@ +export * from './metric-with-icons.widget'; diff --git a/src/widgets/dashboard/home/metric-with-icons/interfaces/iprops.ts b/src/widgets/dashboard/home/metric-with-icons/interfaces/iprops.ts new file mode 100644 index 00000000..1cb8651d --- /dev/null +++ b/src/widgets/dashboard/home/metric-with-icons/interfaces/iprops.ts @@ -0,0 +1,6 @@ +export interface MetricWithIconProps { + icon: React.ElementType; + title: string; + value: number | string; + color?: string; +} diff --git a/src/widgets/dashboard/home/metric-with-icons/metric-with-icons.widget.tsx b/src/widgets/dashboard/home/metric-with-icons/metric-with-icons.widget.tsx new file mode 100644 index 00000000..21d26b41 --- /dev/null +++ b/src/widgets/dashboard/home/metric-with-icons/metric-with-icons.widget.tsx @@ -0,0 +1,17 @@ +import { Group } from '@mantine/core'; +import { MetricCard } from '@/shared/ui/metric-card'; +import { MetricWithIconProps } from './interfaces/iprops'; + +export const MetricWithIcon = (props: MetricWithIconProps) => ( + + + + + +
+ {props.title} + {props.value} +
+
+
+); diff --git a/src/widgets/dashboard/home/metric-with-pb/index.ts b/src/widgets/dashboard/home/metric-with-pb/index.ts new file mode 100644 index 00000000..a29d39a3 --- /dev/null +++ b/src/widgets/dashboard/home/metric-with-pb/index.ts @@ -0,0 +1 @@ +export * from './metric-with-pb.widget'; diff --git a/src/widgets/dashboard/home/metric-with-pb/interfaces/iprops.ts b/src/widgets/dashboard/home/metric-with-pb/interfaces/iprops.ts new file mode 100644 index 00000000..c66b39ad --- /dev/null +++ b/src/widgets/dashboard/home/metric-with-pb/interfaces/iprops.ts @@ -0,0 +1,6 @@ +export interface MetricWithProgressBarProps { + title: string; + value: number | string; + color: string; + percentage: number; +} diff --git a/src/widgets/dashboard/home/metric-with-pb/metric-with-pb.widget.tsx b/src/widgets/dashboard/home/metric-with-pb/metric-with-pb.widget.tsx new file mode 100644 index 00000000..196890bc --- /dev/null +++ b/src/widgets/dashboard/home/metric-with-pb/metric-with-pb.widget.tsx @@ -0,0 +1,58 @@ +import { MetricCard } from '@shared/ui/metric-card'; +import { formatPercentage } from '@shared/utils/number'; +import { Group } from '@mantine/core'; +import { MetricWithProgressBarProps } from './interfaces/iprops'; + +const metrics = [ + { + title: 'Total images', + value: 44012, + color: 'var(--mantine-color-teal-6)', + trend: 14.44, + percentage: 54, + }, + { + title: 'Total videos', + value: 440612, + color: 'var(--mantine-color-red-6)', + trend: -18.45, + percentage: 48, + }, + { + title: 'Total Documents', + value: 90875, + color: 'var(--mantine-color-orange-6)', + trend: 20.34, + percentage: 80.3, + }, + { + title: 'Total videos', + value: 63778, + color: 'var(--mantine-color-blue-6)', + trend: 14.44, + percentage: 54, + }, +]; + +export const MetricWithProgressBar = ({ + title, + value, + color, + percentage, +}: MetricWithProgressBarProps) => { + return ( + + +
+ {title} + {value} +
+ +
+
+ ); +}; diff --git a/src/widgets/dashboard/users/user-status-badge/index.ts b/src/widgets/dashboard/users/user-status-badge/index.ts new file mode 100644 index 00000000..33a3f06e --- /dev/null +++ b/src/widgets/dashboard/users/user-status-badge/index.ts @@ -0,0 +1 @@ +export * from './user-status-badge.widget'; diff --git a/src/widgets/dashboard/users/user-status-badge/interfaces/index.ts b/src/widgets/dashboard/users/user-status-badge/interfaces/index.ts new file mode 100644 index 00000000..3d282fd9 --- /dev/null +++ b/src/widgets/dashboard/users/user-status-badge/interfaces/index.ts @@ -0,0 +1 @@ +export * from './user-status-badge-props.interface'; diff --git a/src/widgets/dashboard/users/user-status-badge/interfaces/user-status-badge-props.interface.ts b/src/widgets/dashboard/users/user-status-badge/interfaces/user-status-badge-props.interface.ts new file mode 100644 index 00000000..58322fa6 --- /dev/null +++ b/src/widgets/dashboard/users/user-status-badge/interfaces/user-status-badge-props.interface.ts @@ -0,0 +1,6 @@ +import { TUsersStatus } from '@remnawave/backend-contract'; +import { BadgeProps } from '@mantine/core'; + +export interface UserStatusBadgeProps extends Omit { + status: TUsersStatus; +} diff --git a/src/widgets/dashboard/users/user-status-badge/user-status-badge.widget.tsx b/src/widgets/dashboard/users/user-status-badge/user-status-badge.widget.tsx new file mode 100644 index 00000000..9edba1af --- /dev/null +++ b/src/widgets/dashboard/users/user-status-badge/user-status-badge.widget.tsx @@ -0,0 +1,40 @@ +import { USERS_STATUS } from '@remnawave/backend-contract'; +import { + PiClockCountdownDuotone, + PiClockUserDuotone, + PiProhibitDuotone, + PiPulseDuotone, +} from 'react-icons/pi'; +import { Badge } from '@mantine/core'; +import { UserStatusBadgeProps } from './interfaces'; + +export function UserStatusBadge({ status, variant = 'outline', ...props }: UserStatusBadgeProps) { + let icon: React.ReactNode; + let color = ''; + switch (status) { + case USERS_STATUS.ACTIVE: + icon = ; + color = 'teal'; + break; + case USERS_STATUS.DISABLED: + icon = ; + color = 'gray'; + break; + case USERS_STATUS.LIMITED: + icon = ( + + ); + color = 'orange'; + break; + case USERS_STATUS.EXPIRED: + icon = ; + color = 'red'; + break; + } + + return ( + + {status} + + ); +} diff --git a/src/widgets/dashboard/users/users-metrics/index.ts b/src/widgets/dashboard/users/users-metrics/index.ts new file mode 100644 index 00000000..f4c7c55e --- /dev/null +++ b/src/widgets/dashboard/users/users-metrics/index.ts @@ -0,0 +1 @@ +export * from './users-metrics.widget'; diff --git a/src/widgets/dashboard/users/users-metrics/users-metrics.widget.tsx b/src/widgets/dashboard/users/users-metrics/users-metrics.widget.tsx new file mode 100644 index 00000000..36abaf0a --- /dev/null +++ b/src/widgets/dashboard/users/users-metrics/users-metrics.widget.tsx @@ -0,0 +1,71 @@ +import { + PiClockCountdownDuotone, + PiClockUserDuotone, + PiProhibitDuotone, + PiPulseDuotone, + PiUsersDuotone, +} from 'react-icons/pi'; +import { Group, Loader, SimpleGrid } from '@mantine/core'; +import { + useDashboardStoreIsLoading, + useDashboardStoreSystemInfo, +} from '@/entitites/dashboard/dashboard-store/dashboard-store'; +import { MetricCard } from '@/shared/ui/metric-card'; +import { formatInt } from '@/shared/utils/number'; + +export function UsersMetrics() { + // const isLoading = useDashboardStoreIsLoading(); + const systemInfo = useDashboardStoreSystemInfo(); + + if (!systemInfo) return null; + + const users = systemInfo.users; + + const cards = [ + { icon: PiUsersDuotone, title: 'Total users', value: users.totalUsers, color: 'blue' }, + { + icon: PiPulseDuotone, + title: 'Active users', + value: users.statusCounts.ACTIVE, + color: 'teal', + }, + { + icon: PiClockUserDuotone, + title: 'Expired users', + value: users.statusCounts.EXPIRED, + color: 'red', + }, + { + icon: PiClockCountdownDuotone, + title: 'Limited users', + value: users.statusCounts.LIMITED, + color: 'orange', + }, + { + icon: PiProhibitDuotone, + title: 'Disabled users', + value: users.statusCounts.DISABLED, + color: 'gray', + }, + ]; + return ( + + {cards.map((card) => ( + + + + + +
+ {card.title} + + {/* {isLoading ? : formatInt(card.value ?? 0)} */} + {formatInt(card.value ?? 0)} + +
+
+
+ ))} +
+ ); +} diff --git a/src/widgets/dashboard/users/users-table/index.ts b/src/widgets/dashboard/users/users-table/index.ts new file mode 100644 index 00000000..c28be1d1 --- /dev/null +++ b/src/widgets/dashboard/users/users-table/index.ts @@ -0,0 +1 @@ +export * from './user-table.widget'; diff --git a/src/widgets/dashboard/users/users-table/interfaces/index.ts b/src/widgets/dashboard/users/users-table/interfaces/index.ts new file mode 100644 index 00000000..f429b6b2 --- /dev/null +++ b/src/widgets/dashboard/users/users-table/interfaces/index.ts @@ -0,0 +1 @@ +export * from './props.interface'; diff --git a/src/widgets/dashboard/users/users-table/interfaces/props.interface.ts b/src/widgets/dashboard/users/users-table/interfaces/props.interface.ts new file mode 100644 index 00000000..67dcb53b --- /dev/null +++ b/src/widgets/dashboard/users/users-table/interfaces/props.interface.ts @@ -0,0 +1,18 @@ +import { Dispatch, SetStateAction } from 'react'; +import { GetAllUsersCommand } from '@remnawave/backend-contract'; +import { DataTableColumn, DataTableSortStatus } from 'mantine-datatable'; +import { User } from '@/entitites/dashboard/users/models'; +import { DataTableReturn } from '@/pages/dashboard/users/ui/connectors/interfaces'; + +export interface IProps { + tabs: DataTableReturn; + setSearch: Dispatch>; + search: string; + setSearchBy: Dispatch>; + searchBy: string; + columns: DataTableColumn[]; + handleSortStatusChange: (status: { columnAccessor: string; direction: 'asc' | 'desc' }) => void; + handlePageChange: (page: number) => void; + handleRecordsPerPageChange: (recordsPerPage: number) => void; + handleUpdate: () => void; +} diff --git a/src/widgets/dashboard/users/users-table/user-table.widget.tsx b/src/widgets/dashboard/users/users-table/user-table.widget.tsx new file mode 100644 index 00000000..4dc09cbb --- /dev/null +++ b/src/widgets/dashboard/users/users-table/user-table.widget.tsx @@ -0,0 +1,134 @@ +import { ChangeEvent, useState } from 'react'; +import { GetAllUsersCommand } from '@remnawave/backend-contract'; +import { LuRefreshCcw } from 'react-icons/lu'; +import { PiArrowCircleDownDuotone, PiDownload } from 'react-icons/pi'; +import { Box, Button, Group, Select, TextInput } from '@mantine/core'; +import { notifications } from '@mantine/notifications'; +import { + useDashboardStoreIsLoading, + useDashboardStoreParams, + useDashboardStoreTotalUsers, + useDashboardStoreUsers, +} from '@/entitites/dashboard/dashboard-store/dashboard-store'; +import { + useUserModalStoreActions, + useUserModalStoreIsModalOpen, +} from '@/entitites/dashboard/user-modal-store/user-modal-store'; +import { AddButton } from '@/shared/ui/stuff/add-button'; +import { DataTable } from '@/shared/ui/stuff/data-table'; +import { IProps } from './interfaces'; + +export function UserTableWidget(props: IProps) { + const { + search, + setSearch, + searchBy, + setSearchBy, + tabs: tabsProps, + columns, + handleSortStatusChange, + handlePageChange, + handleRecordsPerPageChange, + handleUpdate, + } = props; + + const { tabs, filters } = tabsProps; + const [isRefreshing, setIsRefreshing] = useState(false); + + const params = useDashboardStoreParams(); + const isLoading = useDashboardStoreIsLoading(); + const users = useDashboardStoreUsers(); + const totalUsers = useDashboardStoreTotalUsers(); + + const handleSearch = (e: ChangeEvent) => { + setSearch(e.currentTarget.value); + }; + + const handleSelectSearch = (value: string | null) => { + if (!value) { + return; + } + setSearchBy(value as GetAllUsersCommand.SearchableField); + }; + + const handleRefresh = async () => { + setIsRefreshing(true); + + handleUpdate(); + setTimeout(() => { + notifications.show({ + title: 'Success', + message: 'Users fetched successfully', + }); + + setIsRefreshing(false); + }, 1000); + }; + + return ( + + + + + + Create new user + + + + } + /> + + + + + {/* + + + + + + + + + + + {inbounds?.map((inbound) => ( + + ))} + + + + + + + + + + {inbounds?.map((inbound) => ( + + + +
+ {inbound.tag} + + {inbound.type} + +
+
+
+ ))} +
+
+
+
+ + + + + + + + + + + + + )} + + ); +}; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..17c594dc --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,42 @@ +{ + "compilerOptions": { + "types": [ + "node", + ], + "target": "ESNext", + "useDefineForClassFields": true, + "lib": [ + "DOM", + "DOM.Iterable", + "ESNext" + ], + "allowJs": false, + "skipLibCheck": true, + "esModuleInterop": false, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "module": "ESNext", + "moduleResolution": "Node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + "baseUrl": ".", + "paths": { + "@/*": [ + "./src/*" + ], + "@public/*": [ + "./public/*" + ], + "@shared/*": [ + "./src/shared/*" + ] + } + }, + "include": [ + "src", + "client.d.ts", + ] +} \ No newline at end of file diff --git a/vite.config.mjs b/vite.config.mjs new file mode 100644 index 00000000..1b0c9c4f --- /dev/null +++ b/vite.config.mjs @@ -0,0 +1,29 @@ +import { fileURLToPath, URL } from 'node:url'; +import mdx from '@mdx-js/rollup'; +import react from '@vitejs/plugin-react'; +import * as dotenv from 'dotenv'; +import { defineConfig } from 'vite'; +import tsconfigPaths from 'vite-tsconfig-paths'; + +dotenv.config({ path: `${__dirname}/.env` }); + +export default defineConfig({ + plugins: [react(), tsconfigPaths(), mdx()], + define: { + __DOMAIN_BACKEND__: JSON.stringify(process.env.DOMAIN_BACKEND).trim(), + __NODE_ENV__: JSON.stringify(process.env.NODE_ENV).trim(), + }, + server: { + host: '0.0.0.0', + port: 3333, + cors: false, + strictPort: true, + }, + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)), + '@public': fileURLToPath(new URL('./public', import.meta.url)), + '@shared': fileURLToPath(new URL('./src/shared', import.meta.url)), + }, + }, +});