diff --git a/.env.sample b/.env.sample
index 1dc52e0d7..b3e6f367e 100644
--- a/.env.sample
+++ b/.env.sample
@@ -1,6 +1,2 @@
-API_URL=https://your-teams-backend-url.com
-GOOGLE_CLIENT_ID=
-GOOGLE_CLIENT_SECRET=
-AUTH_SECRET=
-NEXTAUTH_URL=https://your-application-deployment
-NODE_ENV="development" // change for deployment
\ No newline at end of file
+PYTHON_BASEURL=
+PHP_BASEURL=
\ No newline at end of file
diff --git a/.eslintignore b/.eslintignore
deleted file mode 100644
index 39cb32685..000000000
--- a/.eslintignore
+++ /dev/null
@@ -1,5 +0,0 @@
-node_modules
-coverage
-html
-dist
-!.prettierrc.cjs
\ No newline at end of file
diff --git a/.eslintrc.cjs b/.eslintrc.cjs
deleted file mode 100644
index f614f24cf..000000000
--- a/.eslintrc.cjs
+++ /dev/null
@@ -1,92 +0,0 @@
-// @ts-check
-
-/**
- * To use this configuration, you need to install the following dependencies:
- *
- * eslint@^8.57.0 @typescript-eslint/eslint-plugin @typescript-eslint/parser eslint-plugin-react eslint-plugin-react-hooks eslint-plugin-react-refresh eslint-plugin-unicorn eslint-plugin-unused-imports@^3.2.0 prettier eslint-config-prettier eslint-plugin-prettier @ianvs/prettier-plugin-sort-imports prettier-plugin-tailwindcss
- *
- *
- * To Replicate the vitest configuration, you need to install the following dependencies:
- *
- * eslint-plugin-vitest@^0.4.1 eslint-testing-library
- *
- * Also replicate the .prettierrc.cjs file in the root of your project.
- */
-
-/** @type {import('eslint').Linter.Config} */
-module.exports = {
- root: true,
- reportUnusedDisableDirectives: true,
- env: {
- browser: true,
- es2020: true,
- },
- extends: [
- "plugin:vitest/all",
- "eslint:recommended",
- "next/core-web-vitals",
- "plugin:react/recommended",
- "plugin:react/jsx-runtime",
- "plugin:@typescript-eslint/recommended",
- "plugin:react-hooks/recommended",
- "plugin:unicorn/recommended",
- "plugin:prettier/recommended",
- "plugin:testing-library/react",
- ],
- ignorePatterns: ["dist", "node_modules"],
- parser: "@typescript-eslint/parser",
- plugins: [
- "@typescript-eslint",
- "react",
- "unicorn",
- "unused-imports",
- "vitest",
- "testing-library",
- ],
- rules: {
- "no-console": "error",
- "react/prop-types": "off",
- "unused-imports/no-unused-imports": "error",
- "unused-imports/no-unused-vars": [
- "warn",
- {
- vars: "all",
- varsIgnorePattern: "^_",
- args: "after-used",
- argsIgnorePattern: "^_",
- },
- ],
- "unicorn/filename-case": [
- "error",
- { cases: { kebabCase: true, pascalCase: true, camelCase: true } },
- ],
- },
- settings: {
- react: { version: "detect" },
- vitest: { typecheck: true },
- },
- overrides: [
- {
- files: [".eslintrc.*js", ".vite(|st).(js|ts)"],
- env: { node: true },
- },
- {
- files: ["*.d.ts"],
- rules: {
- "unicorn/prevent-abbreviations": "off",
- },
- },
- {
- files: ["!*.test.(js|jsx|ts|tsx)"],
- rules: {
- "vitest/require-hook": "off",
- "vitest/max-expects": "off",
- "vitest/no-hooks": "off",
- "testing-library/no-node-access": [
- "error",
- { allowContainerFirstChild: true },
- ],
- },
- },
- ],
-};
diff --git a/.eslintrc.json b/.eslintrc.json
new file mode 100644
index 000000000..372241854
--- /dev/null
+++ b/.eslintrc.json
@@ -0,0 +1,3 @@
+{
+ "extends": ["next/core-web-vitals", "next/typescript"]
+}
diff --git a/.github/workflows/production-deployment.yml b/.github/workflows/production-deployment.yml
index fc838a57f..b8a4ed0a1 100644
--- a/.github/workflows/production-deployment.yml
+++ b/.github/workflows/production-deployment.yml
@@ -42,7 +42,7 @@ jobs:
run: pnpm build
- name: Archive production artifacts
- run: tar -czf nextjs-prod.tar.gz .next public .env
+ run: tar -czf nextjs-prod.tar.gz .next .env
- name: Copy to server
uses: appleboy/scp-action@master
@@ -64,6 +64,11 @@ jobs:
password: ${{ secrets.PASSWORD }}
script: |
cd ~/hng_boilerplate_nextjs/prod
- tar -xzf nextjs-prod.tar.gz
- rm -f nextjs-prod.tar.gz
+ git add .
+ git stash
+ git reset --hard
+ git pull
+ tar -xzf nextjs-staging.tar.gz
+ rm -f nextjs-staging.tar.gz
+ pnpm install
pm2 restart boilerplate_fe_prod --update-env
diff --git a/.github/workflows/staging-deployment.yml b/.github/workflows/staging-deployment.yml
index a5e9ec647..83035c7bc 100644
--- a/.github/workflows/staging-deployment.yml
+++ b/.github/workflows/staging-deployment.yml
@@ -42,7 +42,7 @@ jobs:
run: pnpm build
- name: Archive production artifacts
- run: tar -czf nextjs-staging.tar.gz .next public .env
+ run: tar -czf nextjs-staging.tar.gz .next .env
- name: Copy to server
uses: appleboy/scp-action@master
@@ -64,6 +64,11 @@ jobs:
password: ${{ secrets.PASSWORD }}
script: |
cd ~/hng_boilerplate_nextjs/staging
+ git add .
+ git stash
+ git reset --hard
+ git pull
tar -xzf nextjs-staging.tar.gz
rm -f nextjs-staging.tar.gz
+ pnpm install
pm2 restart boilerplate_fe_staging --update-env
diff --git a/.gitignore b/.gitignore
index 8b0b1362f..9c6a0767d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,7 +8,6 @@
# testing
/coverage
-/html
# next.js
/.next/
@@ -28,7 +27,6 @@ yarn-error.log*
# local env files
.env*.local
-.env
# vercel
.vercel
@@ -36,6 +34,7 @@ yarn-error.log*
# typescript
*.tsbuildinfo
next-env.d.ts
-
-# react email
-/.react-email
+.eslintcache
+.env
+tsconfig.tsbuildinfo
+.eslintcache
\ No newline at end of file
diff --git a/.husky/commit-msg b/.husky/commit-msg
new file mode 100644
index 000000000..c2bec59d1
--- /dev/null
+++ b/.husky/commit-msg
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+npm run commitlint ${1}
\ No newline at end of file
diff --git a/.husky/pre-commit b/.husky/pre-commit
new file mode 100644
index 000000000..54e1abde9
--- /dev/null
+++ b/.husky/pre-commit
@@ -0,0 +1,48 @@
+#!/usr/bin/env sh
+
+echo '🏗️👷 Running checks on your code before committing' 🔍🧐
+
+echo "styling your work" 🎨✨
+
+
+# Check Prettier standards
+npm run check-format ||
+(
+ echo '🤢🤮🤢🤮 Its so ugly!! - Your styling looks disgusting. 🤢🤮🤢🤮
+ Prettier Check Failed. Running npm run format...';
+ npm run format;
+ git add .;
+ echo '✨ Formatting complete and changes added. Committing with the previous commit message...';
+ git commit --amend --no-edit;
+ echo '✅✅ Amended commit with the new changes. Please try to push again.';
+
+)
+
+
+echo '🏗️👷 checking for eslint errors' 🔍🧐
+
+# Check ESLint Standards
+npm run check-lint ||
+ (
+ echo '😤🏀👋😤 Get that beans code out of here! 😤🏀👋😤
+ ESLint Check Failed. Make the required changes listed above, add changes and try to commit again.'
+ false
+ )
+
+echo '🏗️👷 checking for typescript errors' 🔍🧐
+
+# Check tsconfig standards
+npm run check-types ||
+ (
+ echo '🤡😂❌🤡 Failed Type check. 🤡😂❌🤡
+ Are you seriously trying to write that? Make the changes required above.'
+ false
+ )
+
+npx lint-staged
+
+# If everything passes... Now we can commit
+echo '✅✅✅✅ You win this time... I am committing this now. ✅✅✅✅'
+
+echo '✅✅ Awesome work! ✅✅'
+echo '🚀⛅ Run git push to upload your changes to the remote repository ⛅🚀'
\ No newline at end of file
diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 000000000..4645bb67f
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1,55 @@
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+# dependencies
+/node_modules
+/.pnp
+.pnp.js
+.yarn/install-state.gz
+
+# testing
+/coverage
+
+# next.js
+/.next/
+/out/
+.next/
+
+# production
+/build
+
+# misc
+.DS_Store
+*.pem
+
+# debug
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# local env files
+.env*.local
+
+# vercel
+.vercel
+
+# typescript
+*.tsbuildinfo
+next-env.d.ts
+
+
+./dist
+
+**/*.yml
+**/*.md
+**/*.json
+.prettierrc
+postcss.config.js
+.eslintrc.json
+.prettierrc
+next.config.js
+package-lock.json
+postcss.config.js
+README.md
+tailwind.config.ts
+tsconfig.json
+pnpm-lock.yaml
\ No newline at end of file
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 000000000..4c5848a59
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1,11 @@
+{
+ "semi": false,
+ "singleQuote": true,
+ "trailingComma": "es5",
+ "printWidth": 80,
+ "tabWidth": 2,
+ "useTabs": false,
+ "plugins": ["prettier-plugin-tailwindcss"],
+ "tailwindAttributes": ["class", "className"],
+ "tailwindFunctions": ["clsx", "cn"]
+}
\ No newline at end of file
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
deleted file mode 100644
index 897af65d7..000000000
--- a/.vscode/extensions.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "recommendations": [
- "dbaeumer.vscode-eslint"
- ]
-}
\ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
deleted file mode 100644
index 02be42f08..000000000
--- a/.vscode/settings.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "[javascript][javascriptreact][typescript][typescriptreact]": {
- "editor.formatOnSave": false,
- "editor.defaultFormatter": "vscode.typescript-language-features"
- },
- "editor.codeActionsOnSave": {
- "source.fixAll.eslint": "always"
- },
- "[typescriptreact]": {
- "editor.defaultFormatter": "vscode.typescript-language-features"
- }
-}
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index 261eeb9e9..000000000
--- a/LICENSE
+++ /dev/null
@@ -1,201 +0,0 @@
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
diff --git a/commitlint.config.js b/commitlint.config.js
new file mode 100644
index 000000000..53ef0f43e
--- /dev/null
+++ b/commitlint.config.js
@@ -0,0 +1,33 @@
+module.exports = {
+ parserPreset: 'conventional-changelog-conventionalcommits',
+ extends: ['@commitlint/config-conventional'],
+ rules: {
+ 'body-leading-blank': [1, 'always'],
+ 'body-max-line-length': [2, 'always', 100],
+ 'footer-leading-blank': [1, 'always'],
+ 'footer-max-line-length': [2, 'always', 100],
+ 'header-max-length': [2, 'always', 100],
+ 'subject-case': [2, 'never', ['start-case', 'pascal-case']],
+ 'subject-empty': [2, 'never'],
+ 'subject-full-stop': [2, 'never', '.'],
+ 'type-case': [2, 'always', 'lower-case'],
+ 'type-empty': [2, 'never'],
+ 'type-enum': [
+ 2,
+ 'always',
+ [
+ 'build',
+ 'chore',
+ 'ci',
+ 'docs',
+ 'feat',
+ 'fix',
+ 'perf',
+ 'refactor',
+ 'revert',
+ 'style',
+ 'test',
+ ],
+ ],
+ },
+}
diff --git a/components.json b/components.json
index 597fc694d..e15893316 100644
--- a/components.json
+++ b/components.json
@@ -1,6 +1,6 @@
{
"$schema": "https://ui.shadcn.com/schema.json",
- "style": "default",
+ "style": "new-york",
"rsc": true,
"tsx": true,
"tailwind": {
@@ -12,6 +12,9 @@
},
"aliases": {
"components": "~/components",
- "utils": "~/lib/utils"
+ "utils": "~/utils",
+ "ui": "~/components/ui",
+ "lib": "~/lib",
+ "hooks": "~/hooks"
}
}
\ No newline at end of file
diff --git a/docker/development/Dockerfile b/docker/development/Dockerfile
deleted file mode 100644
index eaa083c9e..000000000
--- a/docker/development/Dockerfile
+++ /dev/null
@@ -1,56 +0,0 @@
-# Use the official Node.js image based on Alpine Linux for a smaller image size
-FROM node:20-alpine AS base
-
-FROM base AS deps
-
-# Install build dependencies
-RUN apk add --no-cache libc6-compat
-
-# Set the working directory
-WORKDIR /app
-
-# Copy package.json and pnpm-lock.yaml
-COPY package.json pnpm-lock.yaml ./
-
-# Install dependencies
-RUN corepack enable pnpm && pnpm install --frozen-lockfile
-
-# Rebuild the source code only when needed
-FROM base AS builder
-WORKDIR /app
-COPY --from=deps /app/node_modules ./node_modules
-COPY . .
-
-# Build the application
-RUN corepack enable pnpm && pnpm run build
-
-
-# Production image, copy all the files and run next
-FROM base AS runner
-WORKDIR /app
-
-ENV NODE_ENV development
-# Uncomment the following line in case you want to disable telemetry during runtime.
-# ENV NEXT_TELEMETRY_DISABLED 1
-
-RUN addgroup --system --gid 1001 nodejs
-RUN adduser --system --uid 1001 nextjs
-
-# Copy necessary files for production
-COPY --from=builder /app/public ./public
-COPY --from=builder /app/.next/standalone ./
-COPY --from=builder /app/.next/static ./.next/static
-
-# Set the correct permission for prerender cache
-RUN mkdir -p .next
-RUN chown nextjs:nodejs .next
-
-USER nextjs
-
-EXPOSE 3000
-
-ENV PORT 3000
-
-# server.js is created by next build from the standalone output
-# https://nextjs.org/docs/pages/api-reference/next-config-js/output
-CMD HOSTNAME="0.0.0.0" node server.js
diff --git a/docker/development/docker-compose.yml b/docker/development/docker-compose.yml
deleted file mode 100644
index 869ed04f3..000000000
--- a/docker/development/docker-compose.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-services:
-
- frontend:
- image: hngdevops/nextjs-boilerplate:dev
- ports:
- - 3100:3000
- volumes:
- - ../../.env:/app/.env
-
- # next-dev-frontend-2:
- # build:
- # context: ../../
- # dockerfile: docker/development/Dockerfile
- # ports:
- # - 3130:3000
- # restart: always
diff --git a/docker/prod/Dockerfile b/docker/prod/Dockerfile
deleted file mode 100644
index 74067e5bb..000000000
--- a/docker/prod/Dockerfile
+++ /dev/null
@@ -1,56 +0,0 @@
-# Use the official Node.js image based on Alpine Linux for a smaller image size
-FROM node:20-alpine AS base
-
-FROM base AS deps
-
-# Install build dependencies
-RUN apk add --no-cache libc6-compat
-
-# Set the working directory
-WORKDIR /app
-
-# Copy package.json and pnpm-lock.yaml
-COPY package.json pnpm-lock.yaml ./
-
-# Install dependencies
-RUN corepack enable pnpm && pnpm install --frozen-lockfile
-
-# Rebuild the source code only when needed
-FROM base AS builder
-WORKDIR /app
-COPY --from=deps /app/node_modules ./node_modules
-COPY . .
-
-# Build the application
-RUN corepack enable pnpm && pnpm run build
-
-
-# Production image, copy all the files and run next
-FROM base AS runner
-WORKDIR /app
-
-ENV NODE_ENV production
-# Uncomment the following line in case you want to disable telemetry during runtime.
-# ENV NEXT_TELEMETRY_DISABLED 1
-
-RUN addgroup --system --gid 1001 nodejs
-RUN adduser --system --uid 1001 nextjs
-
-# Copy necessary files for production
-COPY --from=builder /app/public ./public
-COPY --from=builder /app/.next/standalone ./
-COPY --from=builder /app/.next/static ./.next/static
-
-# Set the correct permission for prerender cache
-RUN mkdir -p .next
-RUN chown nextjs:nodejs .next
-
-USER nextjs
-
-EXPOSE 3000
-
-ENV PORT 3000
-
-# server.js is created by next build from the standalone output
-# https://nextjs.org/docs/pages/api-reference/next-config-js/output
-CMD HOSTNAME="0.0.0.0" node server.js
diff --git a/docker/prod/docker-compose.yml b/docker/prod/docker-compose.yml
deleted file mode 100644
index 38660d65b..000000000
--- a/docker/prod/docker-compose.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-services:
-
- frontend:
- image: hngdevops/nextjs-boilerplate:prod
- ports:
- - 3000:3000
- volumes:
- - ../../.env:/app/.env
-
- # next-prod-frontend-2:
- # build:
- # context: ../../
- # dockerfile: docker/prod/Dockerfile
- # ports:
- # - 3030:3000
- # restart: always
diff --git a/docker/staging/Dockerfile b/docker/staging/Dockerfile
deleted file mode 100644
index 74067e5bb..000000000
--- a/docker/staging/Dockerfile
+++ /dev/null
@@ -1,56 +0,0 @@
-# Use the official Node.js image based on Alpine Linux for a smaller image size
-FROM node:20-alpine AS base
-
-FROM base AS deps
-
-# Install build dependencies
-RUN apk add --no-cache libc6-compat
-
-# Set the working directory
-WORKDIR /app
-
-# Copy package.json and pnpm-lock.yaml
-COPY package.json pnpm-lock.yaml ./
-
-# Install dependencies
-RUN corepack enable pnpm && pnpm install --frozen-lockfile
-
-# Rebuild the source code only when needed
-FROM base AS builder
-WORKDIR /app
-COPY --from=deps /app/node_modules ./node_modules
-COPY . .
-
-# Build the application
-RUN corepack enable pnpm && pnpm run build
-
-
-# Production image, copy all the files and run next
-FROM base AS runner
-WORKDIR /app
-
-ENV NODE_ENV production
-# Uncomment the following line in case you want to disable telemetry during runtime.
-# ENV NEXT_TELEMETRY_DISABLED 1
-
-RUN addgroup --system --gid 1001 nodejs
-RUN adduser --system --uid 1001 nextjs
-
-# Copy necessary files for production
-COPY --from=builder /app/public ./public
-COPY --from=builder /app/.next/standalone ./
-COPY --from=builder /app/.next/static ./.next/static
-
-# Set the correct permission for prerender cache
-RUN mkdir -p .next
-RUN chown nextjs:nodejs .next
-
-USER nextjs
-
-EXPOSE 3000
-
-ENV PORT 3000
-
-# server.js is created by next build from the standalone output
-# https://nextjs.org/docs/pages/api-reference/next-config-js/output
-CMD HOSTNAME="0.0.0.0" node server.js
diff --git a/docker/staging/docker-compose.yml b/docker/staging/docker-compose.yml
deleted file mode 100644
index d279c3648..000000000
--- a/docker/staging/docker-compose.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-services:
-
- frontend:
- image: hngdevops/nextjs-boilerplate:staging
- ports:
- - 3200:3000
- volumes:
- - ../../.env:/app/.env
-
- # next-staging-frontend-2:
- # build:
- # context: ../../
- # dockerfile: docker/staging/Dockerfile
- # ports:
- # - 3230:3000
- # restart: alwaysraven@frontend:/home/nextjs/staging/hng_boilerplate_nextjs/docker/staging$
diff --git a/docker/team-deploy/docker-compose.yml b/docker/team-deploy/docker-compose.yml
deleted file mode 100644
index 276c26557..000000000
--- a/docker/team-deploy/docker-compose.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-services:
- frontend:
- image: hngdevops/nextjs-boilerplate:dev
- ports:
- - "${PORT}:3000"
- volumes:
- - ../../.env:/app/.env
diff --git a/next.config.mjs b/next.config.mjs
deleted file mode 100644
index 8f06971a5..000000000
--- a/next.config.mjs
+++ /dev/null
@@ -1,23 +0,0 @@
-import createNextIntlPlugin from 'next-intl/plugin';
-
-const withNextIntl = createNextIntlPlugin();
-
-/** @type {import('next').NextConfig} */
-const nextConfig = {
- output: "standalone",
- images: {
- remotePatterns: [
- {
- protocol: "https",
- hostname: "lh3.googleusercontent.com",
- port: "",
- pathname: "/**",
- },
- { hostname: "res.cloudinary.com", protocol: "https" },
- { hostname: "res.cloudinary.com", protocol: "http" },
- ],
- },
- transpilePackages: ["lucide-react"],
-};
-
-export default withNextIntl(nextConfig);
diff --git a/next.config.ts b/next.config.ts
new file mode 100644
index 000000000..1d6147825
--- /dev/null
+++ b/next.config.ts
@@ -0,0 +1,4 @@
+/** @type {import('next').NextConfig} */
+const nextConfig = {}
+
+export default nextConfig
diff --git a/package.json b/package.json
index 0af44e25a..b33f31062 100644
--- a/package.json
+++ b/package.json
@@ -2,115 +2,66 @@
"name": "hng_boilerplate_nextjs",
"version": "0.1.0",
"private": true,
- "type": "module",
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "next lint",
- "lint:fix": "next lint --fix",
- "shad:add": "npx shadcn-ui@latest add",
- "test": "vitest",
- "test:ui": "vitest --ui",
- "test:update": "vitest --update",
- "test:ci": "vitest --coverage",
- "email:dev": "email dev --dir \"./src/email/templates\"",
- "email:build": "email build --dir \"./src/email/templates\"",
- "email:start": "email start",
- "typecheck": "tsc --project tsconfig.json --noEmit",
- "format": "prettier --write \"src/**/*.{js,jsx,ts,tsx,json,css,md}\""
+ "prepare": "husky",
+ "format": "npm run check-lint --fix && npx prettier --write .",
+ "check-types": "tsc --pretty --noEmit",
+ "check-format": "prettier --check .",
+ "check-lint": "eslint . --ext ts --ext tsx --ext js",
+ "commitlint": "commitlint --edit"
},
"dependencies": {
"@hookform/resolvers": "^3.9.0",
- "@radix-ui/react-accordion": "^1.2.0",
- "@radix-ui/react-alert-dialog": "^1.1.1",
- "@radix-ui/react-avatar": "^1.1.0",
- "@radix-ui/react-checkbox": "^1.1.1",
- "@radix-ui/react-dialog": "^1.1.1",
- "@radix-ui/react-dropdown-menu": "^2.1.1",
+ "@ianvs/prettier-plugin-sort-imports": "^4.3.1",
+ "@radix-ui/react-accordion": "^1.2.1",
+ "@radix-ui/react-avatar": "^1.1.1",
+ "@radix-ui/react-checkbox": "^1.1.2",
+ "@radix-ui/react-dropdown-menu": "^2.1.2",
"@radix-ui/react-icons": "^1.3.0",
"@radix-ui/react-label": "^2.1.0",
- "@radix-ui/react-popover": "^1.1.1",
- "@radix-ui/react-select": "^2.1.1",
- "@radix-ui/react-separator": "^1.1.0",
"@radix-ui/react-slot": "^1.1.0",
- "@radix-ui/react-switch": "^1.1.0",
- "@radix-ui/react-tabs": "^1.1.0",
- "@radix-ui/react-toast": "^1.2.1",
- "@radix-ui/react-toolbar": "^1.1.0",
- "@radix-ui/react-tooltip": "^1.1.2",
- "@react-email/components": "0.0.21",
- "@react-email/tailwind": "^0.0.18",
- "@t3-oss/env-nextjs": "^0.10.1",
- "@tanstack/react-table": "^8.20.1",
- "@types/jest-axe": "^3.5.9",
- "axios": "^1.7.3",
+ "@tanstack/react-query": "^5.59.16",
+ "@tanstack/react-query-devtools": "^5.59.16",
+ "axios": "^1.7.7",
"class-variance-authority": "^0.7.0",
"clsx": "^2.1.1",
- "cookies-next": "^4.2.1",
- "countries-list": "^3.1.1",
- "date-fns": "^3.6.0",
- "framer-motion": "^11.3.21",
- "input-otp": "^1.2.4",
- "jest-axe": "^9.0.0",
- "jose": "^5.6.3",
- "langs": "^2.0.0",
- "lenis": "^1.1.9",
- "lucide-react": "^0.400.0",
- "moment": "^2.30.1",
- "moment-timezone": "^0.5.45",
- "next": "14.2.5",
- "next-auth": "5.0.0-beta.20",
- "next-intl": "^3.17.2",
- "next-nprogress-bar": "^2.3.13",
+ "framer-motion": "^11.11.10",
+ "lenis": "^1.1.14",
+ "lucide-react": "^0.453.0",
+ "next": "15.0.1",
+ "next-auth": "5.0.0-beta.25",
+ "next-nprogress-bar": "^2.3.14",
"react": "^18.3.1",
- "react-day-picker": "^8.10.1",
"react-dom": "^18.3.1",
- "react-email": "2.1.5",
- "react-hook-form": "^7.52.2",
- "react-paginate": "^8.2.0",
- "react-toastify": "^10.0.5",
- "recharts": "^2.12.7",
- "sharp": "^0.33.4",
- "swiper": "^11.1.9",
- "tailwind-merge": "^2.4.0",
+ "react-hook-form": "^7.53.1",
+ "sonner": "^1.5.0",
+ "swiper": "^11.1.14",
+ "tailwind-merge": "^2.5.4",
"tailwindcss-animate": "^1.0.7",
"zod": "^3.23.8",
- "zustand": "^4.5.4"
+ "zustand": "^5.0.0"
},
"devDependencies": {
- "@ianvs/prettier-plugin-sort-imports": "^4.3.1",
- "@mertasan/tailwindcss-variables": "^2.7.0",
- "@testing-library/dom": "^10.4.0",
- "@testing-library/jest-dom": "^6.4.8",
- "@testing-library/react": "^16.0.0",
- "@testing-library/user-event": "^14.5.2",
- "@types/node": "^20.14.14",
- "@types/prop-types": "^15.7.12",
- "@types/react": "^18.3.3",
- "@types/react-dom": "^18.3.0",
- "@typescript-eslint/eslint-plugin": "^7.18.0",
- "@typescript-eslint/parser": "^7.18.0",
- "@vitejs/plugin-react": "^4.3.1",
- "@vitest/coverage-istanbul": "^1.6.0",
- "@vitest/coverage-v8": "^1.6.0",
- "@vitest/ui": "^1.6.0",
- "eslint": "^8.57.0",
- "eslint-config-next": "14.2.4",
- "eslint-config-prettier": "^9.1.0",
- "eslint-plugin-prettier": "^5.2.1",
- "eslint-plugin-react": "^7.35.0",
- "eslint-plugin-react-hooks": "^4.6.2",
- "eslint-plugin-testing-library": "^6.2.2",
- "eslint-plugin-unicorn": "^54.0.0",
- "eslint-plugin-unused-imports": "^3.2.0",
- "eslint-plugin-vitest": "^0.4.1",
- "jsdom": "^24.1.1",
- "postcss": "^8.4.41",
+ "@commitlint/cli": "^19.5.0",
+ "@commitlint/config-conventional": "^19.5.0",
+ "@types/node": "^20.17.1",
+ "@types/react": "^18.3.12",
+ "@types/react-dom": "^18.3.1",
+ "eslint": "^8.57.1",
+ "eslint-config-next": "14.2.13",
+ "husky": "^9.1.6",
+ "lint-staged": "^15.2.10",
+ "postcss": "^8.4.47",
"prettier": "^3.3.3",
- "prettier-plugin-tailwindcss": "^0.6.5",
- "tailwindcss": "^3.4.7",
- "typescript": "^5.5.4",
- "vitest": "^1.6.0"
+ "prettier-plugin-tailwindcss": "^0.6.8",
+ "tailwindcss": "^3.4.14",
+ "typescript": "^5.6.3"
+ },
+ "lint-staged": {
+ "*.{js,jsx,ts,tsx}": "eslint --fix --cache"
}
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index d461aa1ba..6de89c883 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -1,299 +1,156 @@
-lockfileVersion: '6.0'
+lockfileVersion: '9.0'
settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
-dependencies:
- '@hookform/resolvers':
- specifier: ^3.9.0
- version: 3.9.0(react-hook-form@7.53.0)
- '@radix-ui/react-accordion':
- specifier: ^1.2.0
- version: 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-alert-dialog':
- specifier: ^1.1.1
- version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-avatar':
- specifier: ^1.1.0
- version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-checkbox':
- specifier: ^1.1.1
- version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-dialog':
- specifier: ^1.1.1
- version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-dropdown-menu':
- specifier: ^2.1.1
- version: 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-icons':
- specifier: ^1.3.0
- version: 1.3.0(react@18.3.1)
- '@radix-ui/react-label':
- specifier: ^2.1.0
- version: 2.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-popover':
- specifier: ^1.1.1
- version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-select':
- specifier: ^2.1.1
- version: 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-separator':
- specifier: ^1.1.0
- version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-slot':
- specifier: ^1.1.0
- version: 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-switch':
- specifier: ^1.1.0
- version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-tabs':
- specifier: ^1.1.0
- version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-toast':
- specifier: ^1.2.1
- version: 1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-toolbar':
- specifier: ^1.1.0
- version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-tooltip':
- specifier: ^1.1.2
- version: 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@react-email/components':
- specifier: 0.0.21
- version: 0.0.21(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@react-email/tailwind':
- specifier: ^0.0.18
- version: 0.0.18(react@18.3.1)
- '@t3-oss/env-nextjs':
- specifier: ^0.10.1
- version: 0.10.1(typescript@5.5.4)(zod@3.23.8)
- '@tanstack/react-table':
- specifier: ^8.20.1
- version: 8.20.5(react-dom@18.3.1)(react@18.3.1)
- '@types/jest-axe':
- specifier: ^3.5.9
- version: 3.5.9
- axios:
- specifier: ^1.7.3
- version: 1.7.5
- class-variance-authority:
- specifier: ^0.7.0
- version: 0.7.0
- clsx:
- specifier: ^2.1.1
- version: 2.1.1
- cookies-next:
- specifier: ^4.2.1
- version: 4.2.1
- countries-list:
- specifier: ^3.1.1
- version: 3.1.1
- date-fns:
- specifier: ^3.6.0
- version: 3.6.0
- framer-motion:
- specifier: ^11.3.21
- version: 11.3.30(react-dom@18.3.1)(react@18.3.1)
- input-otp:
- specifier: ^1.2.4
- version: 1.2.4(react-dom@18.3.1)(react@18.3.1)
- jest-axe:
- specifier: ^9.0.0
- version: 9.0.0
- jose:
- specifier: ^5.6.3
- version: 5.7.0
- langs:
- specifier: ^2.0.0
- version: 2.0.0
- lenis:
- specifier: ^1.1.9
- version: 1.1.11(react-dom@18.3.1)(react@18.3.1)
- lucide-react:
- specifier: ^0.400.0
- version: 0.400.0(react@18.3.1)
- moment:
- specifier: ^2.30.1
- version: 2.30.1
- moment-timezone:
- specifier: ^0.5.45
- version: 0.5.45
- next:
- specifier: 14.2.5
- version: 14.2.5(@babel/core@7.24.5)(react-dom@18.3.1)(react@18.3.1)
- next-auth:
- specifier: 5.0.0-beta.20
- version: 5.0.0-beta.20(next@14.2.5)(react@18.3.1)
- next-intl:
- specifier: ^3.17.2
- version: 3.17.6(next@14.2.5)(react@18.3.1)
- next-nprogress-bar:
- specifier: ^2.3.13
- version: 2.3.13
- react:
- specifier: ^18.3.1
- version: 18.3.1
- react-day-picker:
- specifier: ^8.10.1
- version: 8.10.1(date-fns@3.6.0)(react@18.3.1)
- react-dom:
- specifier: ^18.3.1
- version: 18.3.1(react@18.3.1)
- react-email:
- specifier: 2.1.5
- version: 2.1.5(eslint@8.57.0)
- react-hook-form:
- specifier: ^7.52.2
- version: 7.53.0(react@18.3.1)
- react-paginate:
- specifier: ^8.2.0
- version: 8.2.0(react@18.3.1)
- react-toastify:
- specifier: ^10.0.5
- version: 10.0.5(react-dom@18.3.1)(react@18.3.1)
- recharts:
- specifier: ^2.12.7
- version: 2.12.7(react-dom@18.3.1)(react@18.3.1)
- sharp:
- specifier: ^0.33.4
- version: 0.33.5
- swiper:
- specifier: ^11.1.9
- version: 11.1.10
- tailwind-merge:
- specifier: ^2.4.0
- version: 2.5.2
- tailwindcss-animate:
- specifier: ^1.0.7
- version: 1.0.7(tailwindcss@3.4.10)
- zod:
- specifier: ^3.23.8
- version: 3.23.8
- zustand:
- specifier: ^4.5.4
- version: 4.5.5(@types/react@18.3.4)(react@18.3.1)
-
-devDependencies:
- '@ianvs/prettier-plugin-sort-imports':
- specifier: ^4.3.1
- version: 4.3.1(prettier@3.3.3)
- '@mertasan/tailwindcss-variables':
- specifier: ^2.7.0
- version: 2.7.0(autoprefixer@10.4.20)(postcss@8.4.41)
- '@testing-library/dom':
- specifier: ^10.4.0
- version: 10.4.0
- '@testing-library/jest-dom':
- specifier: ^6.4.8
- version: 6.5.0
- '@testing-library/react':
- specifier: ^16.0.0
- version: 16.0.0(@testing-library/dom@10.4.0)(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@testing-library/user-event':
- specifier: ^14.5.2
- version: 14.5.2(@testing-library/dom@10.4.0)
- '@types/node':
- specifier: ^20.14.14
- version: 20.16.1
- '@types/prop-types':
- specifier: ^15.7.12
- version: 15.7.12
- '@types/react':
- specifier: ^18.3.3
- version: 18.3.4
- '@types/react-dom':
- specifier: ^18.3.0
- version: 18.3.0
- '@typescript-eslint/eslint-plugin':
- specifier: ^7.18.0
- version: 7.18.0(@typescript-eslint/parser@7.18.0)(eslint@8.57.0)(typescript@5.5.4)
- '@typescript-eslint/parser':
- specifier: ^7.18.0
- version: 7.18.0(eslint@8.57.0)(typescript@5.5.4)
- '@vitejs/plugin-react':
- specifier: ^4.3.1
- version: 4.3.1(vite@5.4.2)
- '@vitest/coverage-istanbul':
- specifier: ^1.6.0
- version: 1.6.0(vitest@1.6.0)
- '@vitest/coverage-v8':
- specifier: ^1.6.0
- version: 1.6.0(vitest@1.6.0)
- '@vitest/ui':
- specifier: ^1.6.0
- version: 1.6.0(vitest@1.6.0)
- eslint:
- specifier: ^8.57.0
- version: 8.57.0
- eslint-config-next:
- specifier: 14.2.4
- version: 14.2.4(eslint@8.57.0)(typescript@5.5.4)
- eslint-config-prettier:
- specifier: ^9.1.0
- version: 9.1.0(eslint@8.57.0)
- eslint-plugin-prettier:
- specifier: ^5.2.1
- version: 5.2.1(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.3.3)
- eslint-plugin-react:
- specifier: ^7.35.0
- version: 7.35.0(eslint@8.57.0)
- eslint-plugin-react-hooks:
- specifier: ^4.6.2
- version: 4.6.2(eslint@8.57.0)
- eslint-plugin-testing-library:
- specifier: ^6.2.2
- version: 6.3.0(eslint@8.57.0)(typescript@5.5.4)
- eslint-plugin-unicorn:
- specifier: ^54.0.0
- version: 54.0.0(eslint@8.57.0)
- eslint-plugin-unused-imports:
- specifier: ^3.2.0
- version: 3.2.0(@typescript-eslint/eslint-plugin@7.18.0)(eslint@8.57.0)
- eslint-plugin-vitest:
- specifier: ^0.4.1
- version: 0.4.1(@typescript-eslint/eslint-plugin@7.18.0)(eslint@8.57.0)(typescript@5.5.4)(vitest@1.6.0)
- jsdom:
- specifier: ^24.1.1
- version: 24.1.3
- postcss:
- specifier: ^8.4.41
- version: 8.4.41
- prettier:
- specifier: ^3.3.3
- version: 3.3.3
- prettier-plugin-tailwindcss:
- specifier: ^0.6.5
- version: 0.6.6(@ianvs/prettier-plugin-sort-imports@4.3.1)(prettier@3.3.3)
- tailwindcss:
- specifier: ^3.4.7
- version: 3.4.10
- typescript:
- specifier: ^5.5.4
- version: 5.5.4
- vitest:
- specifier: ^1.6.0
- version: 1.6.0(@types/node@20.16.1)(@vitest/ui@1.6.0)(jsdom@24.1.3)
+importers:
-packages:
+ .:
+ dependencies:
+ '@hookform/resolvers':
+ specifier: ^3.9.0
+ version: 3.9.0(react-hook-form@7.53.1(react@18.3.1))
+ '@ianvs/prettier-plugin-sort-imports':
+ specifier: ^4.3.1
+ version: 4.3.1(prettier@3.3.3)
+ '@radix-ui/react-accordion':
+ specifier: ^1.2.1
+ version: 1.2.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-avatar':
+ specifier: ^1.1.1
+ version: 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-checkbox':
+ specifier: ^1.1.2
+ version: 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-dropdown-menu':
+ specifier: ^2.1.2
+ version: 2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-icons':
+ specifier: ^1.3.0
+ version: 1.3.0(react@18.3.1)
+ '@radix-ui/react-label':
+ specifier: ^2.1.0
+ version: 2.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-slot':
+ specifier: ^1.1.0
+ version: 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@tanstack/react-query':
+ specifier: ^5.59.16
+ version: 5.59.16(react@18.3.1)
+ '@tanstack/react-query-devtools':
+ specifier: ^5.59.16
+ version: 5.59.16(@tanstack/react-query@5.59.16(react@18.3.1))(react@18.3.1)
+ axios:
+ specifier: ^1.7.7
+ version: 1.7.7
+ class-variance-authority:
+ specifier: ^0.7.0
+ version: 0.7.0
+ clsx:
+ specifier: ^2.1.1
+ version: 2.1.1
+ framer-motion:
+ specifier: ^11.11.10
+ version: 11.11.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ lenis:
+ specifier: ^1.1.14
+ version: 1.1.14(react@18.3.1)
+ lucide-react:
+ specifier: ^0.453.0
+ version: 0.453.0(react@18.3.1)
+ next:
+ specifier: 15.0.1
+ version: 15.0.1(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ next-auth:
+ specifier: 5.0.0-beta.25
+ version: 5.0.0-beta.25(next@15.0.1(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)
+ next-nprogress-bar:
+ specifier: ^2.3.14
+ version: 2.3.14
+ react:
+ specifier: ^18.3.1
+ version: 18.3.1
+ react-dom:
+ specifier: ^18.3.1
+ version: 18.3.1(react@18.3.1)
+ react-hook-form:
+ specifier: ^7.53.1
+ version: 7.53.1(react@18.3.1)
+ sonner:
+ specifier: ^1.5.0
+ version: 1.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ swiper:
+ specifier: ^11.1.14
+ version: 11.1.14
+ tailwind-merge:
+ specifier: ^2.5.4
+ version: 2.5.4
+ tailwindcss-animate:
+ specifier: ^1.0.7
+ version: 1.0.7(tailwindcss@3.4.14)
+ zod:
+ specifier: ^3.23.8
+ version: 3.23.8
+ zustand:
+ specifier: ^5.0.0
+ version: 5.0.0(@types/react@18.3.12)(react@18.3.1)
+ devDependencies:
+ '@commitlint/cli':
+ specifier: ^19.5.0
+ version: 19.5.0(@types/node@20.17.1)(typescript@5.6.3)
+ '@commitlint/config-conventional':
+ specifier: ^19.5.0
+ version: 19.5.0
+ '@types/node':
+ specifier: ^20.17.1
+ version: 20.17.1
+ '@types/react':
+ specifier: ^18.3.12
+ version: 18.3.12
+ '@types/react-dom':
+ specifier: ^18.3.1
+ version: 18.3.1
+ eslint:
+ specifier: ^8.57.1
+ version: 8.57.1
+ eslint-config-next:
+ specifier: 14.2.13
+ version: 14.2.13(eslint@8.57.1)(typescript@5.6.3)
+ husky:
+ specifier: ^9.1.6
+ version: 9.1.6
+ lint-staged:
+ specifier: ^15.2.10
+ version: 15.2.10
+ postcss:
+ specifier: ^8.4.47
+ version: 8.4.47
+ prettier:
+ specifier: ^3.3.3
+ version: 3.3.3
+ prettier-plugin-tailwindcss:
+ specifier: ^0.6.8
+ version: 0.6.8(@ianvs/prettier-plugin-sort-imports@4.3.1(prettier@3.3.3))(prettier@3.3.3)
+ tailwindcss:
+ specifier: ^3.4.14
+ version: 3.4.14
+ typescript:
+ specifier: ^5.6.3
+ version: 5.6.3
- /@adobe/css-tools@4.4.0:
- resolution: {integrity: sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==}
- dev: true
+packages:
- /@alloc/quick-lru@5.2.0:
+ '@alloc/quick-lru@5.2.0':
resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
engines: {node: '>=10'}
- /@ampproject/remapping@2.3.0:
+ '@ampproject/remapping@2.3.0':
resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
engines: {node: '>=6.0.0'}
- dependencies:
- '@jridgewell/gen-mapping': 0.3.5
- '@jridgewell/trace-mapping': 0.3.25
- /@auth/core@0.34.2:
- resolution: {integrity: sha512-KywHKRgLiF3l7PLyL73fjLSIBe1YNcA6sMeew4yMP6cfCWGXZrkkXd32AjRi1hlJ9nvovUBGZHvbn+LijO6ZeQ==}
+ '@auth/core@0.37.2':
+ resolution: {integrity: sha512-kUvzyvkcd6h1vpeMAojK2y7+PAV5H+0Cc9+ZlKYDFhDY31AlvsB+GW5vNO4qE3Y07KeQgvNO9U0QUx/fN62kBw==}
peerDependencies:
'@simplewebauthn/browser': ^9.0.1
'@simplewebauthn/server': ^9.0.2
@@ -305,8233 +162,5286 @@ packages:
optional: true
nodemailer:
optional: true
- dependencies:
- '@panva/hkdf': 1.2.1
- '@types/cookie': 0.6.0
- cookie: 0.6.0
- jose: 5.7.0
- oauth4webapi: 2.12.0
- preact: 10.11.3
- preact-render-to-string: 5.2.3(preact@10.11.3)
- dev: false
- /@babel/code-frame@7.24.7:
- resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/highlight': 7.24.7
- picocolors: 1.0.1
-
- /@babel/compat-data@7.25.4:
- resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==}
+ '@babel/code-frame@7.26.0':
+ resolution: {integrity: sha512-INCKxTtbXtcNbUZ3YXutwMpEleqttcswhAdee7dhuoVrD2cnuc3PqtERBtxkX5nziX9vnBL8WXmSGwv8CuPV6g==}
engines: {node: '>=6.9.0'}
- /@babel/core@7.24.5:
- resolution: {integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==}
+ '@babel/compat-data@7.26.0':
+ resolution: {integrity: sha512-qETICbZSLe7uXv9VE8T/RWOdIE5qqyTucOt4zLYMafj2MRO271VGgLd4RACJMeBO37UPWhXiKMBk7YlJ0fOzQA==}
engines: {node: '>=6.9.0'}
- dependencies:
- '@ampproject/remapping': 2.3.0
- '@babel/code-frame': 7.24.7
- '@babel/generator': 7.25.5
- '@babel/helper-compilation-targets': 7.25.2
- '@babel/helper-module-transforms': 7.25.2(@babel/core@7.24.5)
- '@babel/helpers': 7.25.0
- '@babel/parser': 7.24.5
- '@babel/template': 7.25.0
- '@babel/traverse': 7.25.4
- '@babel/types': 7.25.4
- convert-source-map: 2.0.0
- debug: 4.3.6
- gensync: 1.0.0-beta.2
- json5: 2.2.3
- semver: 6.3.1
- transitivePeerDependencies:
- - supports-color
- dev: false
- /@babel/core@7.25.2:
- resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==}
+ '@babel/core@7.26.0':
+ resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==}
engines: {node: '>=6.9.0'}
- dependencies:
- '@ampproject/remapping': 2.3.0
- '@babel/code-frame': 7.24.7
- '@babel/generator': 7.25.5
- '@babel/helper-compilation-targets': 7.25.2
- '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2)
- '@babel/helpers': 7.25.0
- '@babel/parser': 7.25.4
- '@babel/template': 7.25.0
- '@babel/traverse': 7.25.4
- '@babel/types': 7.25.4
- convert-source-map: 2.0.0
- debug: 4.3.6
- gensync: 1.0.0-beta.2
- json5: 2.2.3
- semver: 6.3.1
- transitivePeerDependencies:
- - supports-color
- dev: true
- /@babel/generator@7.25.5:
- resolution: {integrity: sha512-abd43wyLfbWoxC6ahM8xTkqLpGB2iWBVyuKC9/srhFunCd1SDNrV1s72bBpK4hLj8KLzHBBcOblvLQZBNw9r3w==}
+ '@babel/generator@7.26.0':
+ resolution: {integrity: sha512-/AIkAmInnWwgEAJGQr9vY0c66Mj6kjkE2ZPB1PurTRaRAh3U+J45sAQMjQDJdh4WbR3l0x5xkimXBKyBXXAu2w==}
engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/types': 7.25.4
- '@jridgewell/gen-mapping': 0.3.5
- '@jridgewell/trace-mapping': 0.3.25
- jsesc: 2.5.2
- /@babel/helper-compilation-targets@7.25.2:
- resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==}
+ '@babel/helper-compilation-targets@7.25.9':
+ resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==}
engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/compat-data': 7.25.4
- '@babel/helper-validator-option': 7.24.8
- browserslist: 4.23.3
- lru-cache: 5.1.1
- semver: 6.3.1
- /@babel/helper-module-imports@7.24.7:
- resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==}
+ '@babel/helper-module-imports@7.25.9':
+ resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==}
engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/traverse': 7.25.4
- '@babel/types': 7.25.4
- transitivePeerDependencies:
- - supports-color
- /@babel/helper-module-transforms@7.25.2(@babel/core@7.24.5):
- resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==}
+ '@babel/helper-module-transforms@7.26.0':
+ resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0
- dependencies:
- '@babel/core': 7.24.5
- '@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.4
- transitivePeerDependencies:
- - supports-color
- dev: false
- /@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2):
- resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==}
+ '@babel/helper-string-parser@7.25.9':
+ resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==}
engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
- dependencies:
- '@babel/core': 7.25.2
- '@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.4
- transitivePeerDependencies:
- - supports-color
- dev: true
- /@babel/helper-plugin-utils@7.24.8:
- resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==}
+ '@babel/helper-validator-identifier@7.25.9':
+ resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==}
engines: {node: '>=6.9.0'}
- dev: true
- /@babel/helper-simple-access@7.24.7:
- resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==}
+ '@babel/helper-validator-option@7.25.9':
+ resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==}
engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/traverse': 7.25.4
- '@babel/types': 7.25.4
- transitivePeerDependencies:
- - supports-color
- /@babel/helper-string-parser@7.24.8:
- resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==}
+ '@babel/helpers@7.26.0':
+ resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==}
engines: {node: '>=6.9.0'}
- /@babel/helper-validator-identifier@7.24.7:
- resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==}
- engines: {node: '>=6.9.0'}
+ '@babel/parser@7.26.1':
+ resolution: {integrity: sha512-reoQYNiAJreZNsJzyrDNzFQ+IQ5JFiIzAHJg9bn94S3l+4++J7RsIhNMoB+lgP/9tpmiAQqspv+xfdxTSzREOw==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
- /@babel/helper-validator-option@7.24.8:
- resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==}
+ '@babel/template@7.25.9':
+ resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==}
engines: {node: '>=6.9.0'}
- /@babel/helpers@7.25.0:
- resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==}
+ '@babel/traverse@7.25.9':
+ resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==}
engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/template': 7.25.0
- '@babel/types': 7.25.4
- /@babel/highlight@7.24.7:
- resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==}
+ '@babel/types@7.26.0':
+ resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==}
engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/helper-validator-identifier': 7.24.7
- chalk: 2.4.2
- js-tokens: 4.0.0
- picocolors: 1.0.1
- /@babel/parser@7.24.5:
- resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==}
- engines: {node: '>=6.0.0'}
+ '@commitlint/cli@19.5.0':
+ resolution: {integrity: sha512-gaGqSliGwB86MDmAAKAtV9SV1SHdmN8pnGq4EJU4+hLisQ7IFfx4jvU4s+pk6tl0+9bv6yT+CaZkufOinkSJIQ==}
+ engines: {node: '>=v18'}
hasBin: true
- dependencies:
- '@babel/types': 7.25.4
- dev: false
- /@babel/parser@7.25.4:
- resolution: {integrity: sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA==}
- engines: {node: '>=6.0.0'}
- hasBin: true
- dependencies:
- '@babel/types': 7.25.4
+ '@commitlint/config-conventional@19.5.0':
+ resolution: {integrity: sha512-OBhdtJyHNPryZKg0fFpZNOBM1ZDbntMvqMuSmpfyP86XSfwzGw4CaoYRG4RutUPg0BTK07VMRIkNJT6wi2zthg==}
+ engines: {node: '>=v18'}
- /@babel/plugin-transform-react-jsx-self@7.24.7(@babel/core@7.25.2):
- resolution: {integrity: sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.25.2
- '@babel/helper-plugin-utils': 7.24.8
- dev: true
+ '@commitlint/config-validator@19.5.0':
+ resolution: {integrity: sha512-CHtj92H5rdhKt17RmgALhfQt95VayrUo2tSqY9g2w+laAXyk7K/Ef6uPm9tn5qSIwSmrLjKaXK9eiNuxmQrDBw==}
+ engines: {node: '>=v18'}
- /@babel/plugin-transform-react-jsx-source@7.24.7(@babel/core@7.25.2):
- resolution: {integrity: sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.25.2
- '@babel/helper-plugin-utils': 7.24.8
- dev: true
+ '@commitlint/ensure@19.5.0':
+ resolution: {integrity: sha512-Kv0pYZeMrdg48bHFEU5KKcccRfKmISSm9MvgIgkpI6m+ohFTB55qZlBW6eYqh/XDfRuIO0x4zSmvBjmOwWTwkg==}
+ engines: {node: '>=v18'}
- /@babel/runtime@7.25.4:
- resolution: {integrity: sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==}
- engines: {node: '>=6.9.0'}
- dependencies:
- regenerator-runtime: 0.14.1
+ '@commitlint/execute-rule@19.5.0':
+ resolution: {integrity: sha512-aqyGgytXhl2ejlk+/rfgtwpPexYyri4t8/n4ku6rRJoRhGZpLFMqrZ+YaubeGysCP6oz4mMA34YSTaSOKEeNrg==}
+ engines: {node: '>=v18'}
- /@babel/template@7.25.0:
- resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/code-frame': 7.24.7
- '@babel/parser': 7.25.4
- '@babel/types': 7.25.4
+ '@commitlint/format@19.5.0':
+ resolution: {integrity: sha512-yNy088miE52stCI3dhG/vvxFo9e4jFkU1Mj3xECfzp/bIS/JUay4491huAlVcffOoMK1cd296q0W92NlER6r3A==}
+ engines: {node: '>=v18'}
- /@babel/traverse@7.25.4:
- resolution: {integrity: sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/code-frame': 7.24.7
- '@babel/generator': 7.25.5
- '@babel/parser': 7.25.4
- '@babel/template': 7.25.0
- '@babel/types': 7.25.4
- debug: 4.3.6
- globals: 11.12.0
- transitivePeerDependencies:
- - supports-color
+ '@commitlint/is-ignored@19.5.0':
+ resolution: {integrity: sha512-0XQ7Llsf9iL/ANtwyZ6G0NGp5Y3EQ8eDQSxv/SRcfJ0awlBY4tHFAvwWbw66FVUaWICH7iE5en+FD9TQsokZ5w==}
+ engines: {node: '>=v18'}
- /@babel/types@7.25.4:
- resolution: {integrity: sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/helper-string-parser': 7.24.8
- '@babel/helper-validator-identifier': 7.24.7
- to-fast-properties: 2.0.0
+ '@commitlint/lint@19.5.0':
+ resolution: {integrity: sha512-cAAQwJcRtiBxQWO0eprrAbOurtJz8U6MgYqLz+p9kLElirzSCc0vGMcyCaA1O7AqBuxo11l1XsY3FhOFowLAAg==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/load@19.5.0':
+ resolution: {integrity: sha512-INOUhkL/qaKqwcTUvCE8iIUf5XHsEPCLY9looJ/ipzi7jtGhgmtH7OOFiNvwYgH7mA8osUWOUDV8t4E2HAi4xA==}
+ engines: {node: '>=v18'}
- /@bcoe/v8-coverage@0.2.3:
- resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
- dev: true
+ '@commitlint/message@19.5.0':
+ resolution: {integrity: sha512-R7AM4YnbxN1Joj1tMfCyBryOC5aNJBdxadTZkuqtWi3Xj0kMdutq16XQwuoGbIzL2Pk62TALV1fZDCv36+JhTQ==}
+ engines: {node: '>=v18'}
- /@darkroom.engineering/tempus@0.0.46:
+ '@commitlint/parse@19.5.0':
+ resolution: {integrity: sha512-cZ/IxfAlfWYhAQV0TwcbdR1Oc0/r0Ik1GEessDJ3Lbuma/MRO8FRQX76eurcXtmhJC//rj52ZSZuXUg0oIX0Fw==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/read@19.5.0':
+ resolution: {integrity: sha512-TjS3HLPsLsxFPQj6jou8/CZFAmOP2y+6V4PGYt3ihbQKTY1Jnv0QG28WRKl/d1ha6zLODPZqsxLEov52dhR9BQ==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/resolve-extends@19.5.0':
+ resolution: {integrity: sha512-CU/GscZhCUsJwcKTJS9Ndh3AKGZTNFIOoQB2n8CmFnizE0VnEuJoum+COW+C1lNABEeqk6ssfc1Kkalm4bDklA==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/rules@19.5.0':
+ resolution: {integrity: sha512-hDW5TPyf/h1/EufSHEKSp6Hs+YVsDMHazfJ2azIk9tHPXS6UqSz1dIRs1gpqS3eMXgtkT7JH6TW4IShdqOwhAw==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/to-lines@19.5.0':
+ resolution: {integrity: sha512-R772oj3NHPkodOSRZ9bBVNq224DOxQtNef5Pl8l2M8ZnkkzQfeSTr4uxawV2Sd3ui05dUVzvLNnzenDBO1KBeQ==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/top-level@19.5.0':
+ resolution: {integrity: sha512-IP1YLmGAk0yWrImPRRc578I3dDUI5A2UBJx9FbSOjxe9sTlzFiwVJ+zeMLgAtHMtGZsC8LUnzmW1qRemkFU4ng==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/types@19.5.0':
+ resolution: {integrity: sha512-DSHae2obMSMkAtTBSOulg5X7/z+rGLxcXQIkg3OmWvY6wifojge5uVMydfhUvs7yQj+V7jNmRZ2Xzl8GJyqRgg==}
+ engines: {node: '>=v18'}
+
+ '@darkroom.engineering/tempus@0.0.46':
resolution: {integrity: sha512-s5vav3KMHYezvUCl4ee5epg0oimF6M8C9gAaKxFnFaTvX2q3ywFDryIv6XLd0mRFUt3S1uHDJqKaiEcs2ZVSvw==}
- dev: false
- /@emnapi/runtime@1.2.0:
- resolution: {integrity: sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==}
- requiresBuild: true
- dependencies:
- tslib: 2.7.0
- dev: false
- optional: true
+ '@emnapi/runtime@1.3.1':
+ resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==}
- /@emotion/is-prop-valid@0.8.8:
- resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==}
- requiresBuild: true
- dependencies:
- '@emotion/memoize': 0.7.4
- dev: false
- optional: true
+ '@eslint-community/eslint-utils@4.4.1':
+ resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
- /@emotion/memoize@0.7.4:
- resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==}
- requiresBuild: true
- dev: false
- optional: true
+ '@eslint-community/regexpp@4.12.1':
+ resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==}
+ engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
- /@esbuild/aix-ppc64@0.19.11:
- resolution: {integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==}
- engines: {node: '>=12'}
- cpu: [ppc64]
- os: [aix]
- requiresBuild: true
- dev: false
- optional: true
+ '@eslint/eslintrc@2.1.4':
+ resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- /@esbuild/aix-ppc64@0.21.5:
- resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==}
- engines: {node: '>=12'}
- cpu: [ppc64]
- os: [aix]
- requiresBuild: true
- dev: true
- optional: true
+ '@eslint/js@8.57.1':
+ resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- /@esbuild/android-arm64@0.19.11:
- resolution: {integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [android]
- requiresBuild: true
- dev: false
- optional: true
+ '@floating-ui/core@1.6.8':
+ resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==}
- /@esbuild/android-arm64@0.21.5:
- resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [android]
- requiresBuild: true
- dev: true
- optional: true
+ '@floating-ui/dom@1.6.11':
+ resolution: {integrity: sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==}
- /@esbuild/android-arm@0.19.11:
- resolution: {integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==}
- engines: {node: '>=12'}
- cpu: [arm]
- os: [android]
- requiresBuild: true
- dev: false
- optional: true
+ '@floating-ui/react-dom@2.1.2':
+ resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==}
+ peerDependencies:
+ react: '>=16.8.0'
+ react-dom: '>=16.8.0'
- /@esbuild/android-arm@0.21.5:
- resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==}
- engines: {node: '>=12'}
- cpu: [arm]
- os: [android]
- requiresBuild: true
- dev: true
- optional: true
+ '@floating-ui/utils@0.2.8':
+ resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==}
- /@esbuild/android-x64@0.19.11:
- resolution: {integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [android]
- requiresBuild: true
- dev: false
- optional: true
+ '@hookform/resolvers@3.9.0':
+ resolution: {integrity: sha512-bU0Gr4EepJ/EQsH/IwEzYLsT/PEj5C0ynLQ4m+GSHS+xKH4TfSelhluTgOaoc4kA5s7eCsQbM4wvZLzELmWzUg==}
+ peerDependencies:
+ react-hook-form: ^7.0.0
- /@esbuild/android-x64@0.21.5:
- resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [android]
- requiresBuild: true
- dev: true
- optional: true
+ '@humanwhocodes/config-array@0.13.0':
+ resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==}
+ engines: {node: '>=10.10.0'}
+ deprecated: Use @eslint/config-array instead
- /@esbuild/darwin-arm64@0.19.11:
- resolution: {integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [darwin]
- requiresBuild: true
- dev: false
- optional: true
+ '@humanwhocodes/module-importer@1.0.1':
+ resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
+ engines: {node: '>=12.22'}
- /@esbuild/darwin-arm64@0.21.5:
- resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==}
- engines: {node: '>=12'}
+ '@humanwhocodes/object-schema@2.0.3':
+ resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==}
+ deprecated: Use @eslint/object-schema instead
+
+ '@ianvs/prettier-plugin-sort-imports@4.3.1':
+ resolution: {integrity: sha512-ZHwbyjkANZOjaBm3ZosADD2OUYGFzQGxfy67HmGZU94mHqe7g1LCMA7YYKB1Cq+UTPCBqlAYapY0KXAjKEw8Sg==}
+ peerDependencies:
+ '@vue/compiler-sfc': 2.7.x || 3.x
+ prettier: 2 || 3
+ peerDependenciesMeta:
+ '@vue/compiler-sfc':
+ optional: true
+
+ '@img/sharp-darwin-arm64@0.33.5':
+ resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm64]
os: [darwin]
- requiresBuild: true
- dev: true
- optional: true
- /@esbuild/darwin-x64@0.19.11:
- resolution: {integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==}
- engines: {node: '>=12'}
+ '@img/sharp-darwin-x64@0.33.5':
+ resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [x64]
os: [darwin]
- requiresBuild: true
- dev: false
- optional: true
- /@esbuild/darwin-x64@0.21.5:
- resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==}
- engines: {node: '>=12'}
+ '@img/sharp-libvips-darwin-arm64@1.0.4':
+ resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@img/sharp-libvips-darwin-x64@1.0.4':
+ resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==}
cpu: [x64]
os: [darwin]
- requiresBuild: true
- dev: true
- optional: true
- /@esbuild/freebsd-arm64@0.19.11:
- resolution: {integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==}
- engines: {node: '>=12'}
+ '@img/sharp-libvips-linux-arm64@1.0.4':
+ resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==}
cpu: [arm64]
- os: [freebsd]
- requiresBuild: true
- dev: false
- optional: true
+ os: [linux]
- /@esbuild/freebsd-arm64@0.21.5:
- resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [freebsd]
- requiresBuild: true
- dev: true
- optional: true
+ '@img/sharp-libvips-linux-arm@1.0.5':
+ resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==}
+ cpu: [arm]
+ os: [linux]
- /@esbuild/freebsd-x64@0.19.11:
- resolution: {integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [freebsd]
- requiresBuild: true
- dev: false
- optional: true
+ '@img/sharp-libvips-linux-s390x@1.0.4':
+ resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==}
+ cpu: [s390x]
+ os: [linux]
- /@esbuild/freebsd-x64@0.21.5:
- resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==}
- engines: {node: '>=12'}
+ '@img/sharp-libvips-linux-x64@1.0.4':
+ resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==}
cpu: [x64]
- os: [freebsd]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/linux-arm64@0.19.11:
- resolution: {integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==}
- engines: {node: '>=12'}
- cpu: [arm64]
os: [linux]
- requiresBuild: true
- dev: false
- optional: true
- /@esbuild/linux-arm64@0.21.5:
- resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==}
- engines: {node: '>=12'}
+ '@img/sharp-libvips-linuxmusl-arm64@1.0.4':
+ resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==}
cpu: [arm64]
os: [linux]
- requiresBuild: true
- dev: true
- optional: true
- /@esbuild/linux-arm@0.19.11:
- resolution: {integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==}
- engines: {node: '>=12'}
- cpu: [arm]
+ '@img/sharp-libvips-linuxmusl-x64@1.0.4':
+ resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==}
+ cpu: [x64]
os: [linux]
- requiresBuild: true
- dev: false
- optional: true
- /@esbuild/linux-arm@0.21.5:
- resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==}
- engines: {node: '>=12'}
- cpu: [arm]
+ '@img/sharp-linux-arm64@0.33.5':
+ resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
os: [linux]
- requiresBuild: true
- dev: true
- optional: true
- /@esbuild/linux-ia32@0.19.11:
- resolution: {integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==}
- engines: {node: '>=12'}
- cpu: [ia32]
+ '@img/sharp-linux-arm@0.33.5':
+ resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm]
os: [linux]
- requiresBuild: true
- dev: false
- optional: true
- /@esbuild/linux-ia32@0.21.5:
- resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==}
- engines: {node: '>=12'}
- cpu: [ia32]
+ '@img/sharp-linux-s390x@0.33.5':
+ resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [s390x]
os: [linux]
- requiresBuild: true
- dev: true
- optional: true
- /@esbuild/linux-loong64@0.19.11:
- resolution: {integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==}
- engines: {node: '>=12'}
- cpu: [loong64]
+ '@img/sharp-linux-x64@0.33.5':
+ resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
os: [linux]
- requiresBuild: true
- dev: false
- optional: true
- /@esbuild/linux-loong64@0.21.5:
- resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==}
- engines: {node: '>=12'}
- cpu: [loong64]
+ '@img/sharp-linuxmusl-arm64@0.33.5':
+ resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
os: [linux]
- requiresBuild: true
- dev: true
- optional: true
- /@esbuild/linux-mips64el@0.19.11:
- resolution: {integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==}
- engines: {node: '>=12'}
- cpu: [mips64el]
+ '@img/sharp-linuxmusl-x64@0.33.5':
+ resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
os: [linux]
- requiresBuild: true
- dev: false
- optional: true
- /@esbuild/linux-mips64el@0.21.5:
- resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==}
- engines: {node: '>=12'}
- cpu: [mips64el]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
+ '@img/sharp-wasm32@0.33.5':
+ resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [wasm32]
- /@esbuild/linux-ppc64@0.19.11:
- resolution: {integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==}
- engines: {node: '>=12'}
- cpu: [ppc64]
- os: [linux]
- requiresBuild: true
- dev: false
- optional: true
+ '@img/sharp-win32-ia32@0.33.5':
+ resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [ia32]
+ os: [win32]
- /@esbuild/linux-ppc64@0.21.5:
- resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==}
- engines: {node: '>=12'}
- cpu: [ppc64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
+ '@img/sharp-win32-x64@0.33.5':
+ resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [win32]
- /@esbuild/linux-riscv64@0.19.11:
- resolution: {integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==}
+ '@isaacs/cliui@8.0.2':
+ resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
engines: {node: '>=12'}
- cpu: [riscv64]
- os: [linux]
- requiresBuild: true
- dev: false
- optional: true
- /@esbuild/linux-riscv64@0.21.5:
- resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==}
- engines: {node: '>=12'}
- cpu: [riscv64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/linux-s390x@0.19.11:
- resolution: {integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==}
- engines: {node: '>=12'}
- cpu: [s390x]
- os: [linux]
- requiresBuild: true
- dev: false
- optional: true
-
- /@esbuild/linux-s390x@0.21.5:
- resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==}
- engines: {node: '>=12'}
- cpu: [s390x]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
+ '@jridgewell/gen-mapping@0.3.5':
+ resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==}
+ engines: {node: '>=6.0.0'}
- /@esbuild/linux-x64@0.19.11:
- resolution: {integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [linux]
- requiresBuild: true
- dev: false
- optional: true
+ '@jridgewell/resolve-uri@3.1.2':
+ resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+ engines: {node: '>=6.0.0'}
- /@esbuild/linux-x64@0.21.5:
- resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
+ '@jridgewell/set-array@1.2.1':
+ resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
+ engines: {node: '>=6.0.0'}
- /@esbuild/netbsd-x64@0.19.11:
- resolution: {integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [netbsd]
- requiresBuild: true
- dev: false
- optional: true
+ '@jridgewell/sourcemap-codec@1.5.0':
+ resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
- /@esbuild/netbsd-x64@0.21.5:
- resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [netbsd]
- requiresBuild: true
- dev: true
- optional: true
+ '@jridgewell/trace-mapping@0.3.25':
+ resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
- /@esbuild/openbsd-x64@0.19.11:
- resolution: {integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [openbsd]
- requiresBuild: true
- dev: false
- optional: true
+ '@next/env@15.0.1':
+ resolution: {integrity: sha512-lc4HeDUKO9gxxlM5G2knTRifqhsY6yYpwuHspBZdboZe0Gp+rZHBNNSIjmQKDJIdRXiXGyVnSD6gafrbQPvILQ==}
- /@esbuild/openbsd-x64@0.21.5:
- resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [openbsd]
- requiresBuild: true
- dev: true
- optional: true
+ '@next/eslint-plugin-next@14.2.13':
+ resolution: {integrity: sha512-z8Mk0VljxhIzsSiZUSdt3wp+t2lKd+jk5a9Jsvh3zDGkItgDMfjv/ZbET6HsxEl/fSihVoHGsXV6VLyDH0lfTQ==}
- /@esbuild/sunos-x64@0.19.11:
- resolution: {integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [sunos]
- requiresBuild: true
- dev: false
- optional: true
+ '@next/swc-darwin-arm64@15.0.1':
+ resolution: {integrity: sha512-C9k/Xv4sxkQRTA37Z6MzNq3Yb1BJMmSqjmwowoWEpbXTkAdfOwnoKOpAb71ItSzoA26yUTIo6ZhN8rKGu4ExQw==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [darwin]
- /@esbuild/sunos-x64@0.21.5:
- resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==}
- engines: {node: '>=12'}
+ '@next/swc-darwin-x64@15.0.1':
+ resolution: {integrity: sha512-uHl13HXOuq1G7ovWFxCACDJHTSDVbn/sbLv8V1p+7KIvTrYQ5HNoSmKBdYeEKRRCbEmd+OohOgg9YOp8Ux3MBg==}
+ engines: {node: '>= 10'}
cpu: [x64]
- os: [sunos]
- requiresBuild: true
- dev: true
- optional: true
+ os: [darwin]
- /@esbuild/win32-arm64@0.19.11:
- resolution: {integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==}
- engines: {node: '>=12'}
+ '@next/swc-linux-arm64-gnu@15.0.1':
+ resolution: {integrity: sha512-LvyhvxHOihFTEIbb35KxOc3q8w8G4xAAAH/AQnsYDEnOvwawjL2eawsB59AX02ki6LJdgDaHoTEnC54Gw+82xw==}
+ engines: {node: '>= 10'}
cpu: [arm64]
- os: [win32]
- requiresBuild: true
- dev: false
- optional: true
+ os: [linux]
- /@esbuild/win32-arm64@0.21.5:
- resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==}
- engines: {node: '>=12'}
+ '@next/swc-linux-arm64-musl@15.0.1':
+ resolution: {integrity: sha512-vFmCGUFNyk/A5/BYcQNhAQqPIw01RJaK6dRO+ZEhz0DncoW+hJW1kZ8aH2UvTX27zPq3m85zN5waMSbZEmANcQ==}
+ engines: {node: '>= 10'}
cpu: [arm64]
- os: [win32]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/win32-ia32@0.19.11:
- resolution: {integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==}
- engines: {node: '>=12'}
- cpu: [ia32]
- os: [win32]
- requiresBuild: true
- dev: false
- optional: true
+ os: [linux]
- /@esbuild/win32-ia32@0.21.5:
- resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==}
- engines: {node: '>=12'}
- cpu: [ia32]
- os: [win32]
- requiresBuild: true
- dev: true
- optional: true
+ '@next/swc-linux-x64-gnu@15.0.1':
+ resolution: {integrity: sha512-5by7IYq0NCF8rouz6Qg9T97jYU68kaClHPfGpQG2lCZpSYHtSPQF1kjnqBTd34RIqPKMbCa4DqCufirgr8HM5w==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
- /@esbuild/win32-x64@0.19.11:
- resolution: {integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==}
- engines: {node: '>=12'}
+ '@next/swc-linux-x64-musl@15.0.1':
+ resolution: {integrity: sha512-lmYr6H3JyDNBJLzklGXLfbehU3ay78a+b6UmBGlHls4xhDXBNZfgb0aI67sflrX+cGBnv1LgmWzFlYrAYxS1Qw==}
+ engines: {node: '>= 10'}
cpu: [x64]
+ os: [linux]
+
+ '@next/swc-win32-arm64-msvc@15.0.1':
+ resolution: {integrity: sha512-DS8wQtl6diAj0eZTdH0sefykm4iXMbHT4MOvLwqZiIkeezKpkgPFcEdFlz3vKvXa2R/2UEgMh48z1nEpNhjeOQ==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
os: [win32]
- requiresBuild: true
- dev: false
- optional: true
- /@esbuild/win32-x64@0.21.5:
- resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==}
- engines: {node: '>=12'}
+ '@next/swc-win32-x64-msvc@15.0.1':
+ resolution: {integrity: sha512-4Ho2ggvDdMKlZ/0e9HNdZ9ngeaBwtc+2VS5oCeqrbXqOgutX6I4U2X/42VBw0o+M5evn4/7v3zKgGHo+9v/VjA==}
+ engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
- requiresBuild: true
- dev: true
- optional: true
- /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0):
- resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- peerDependencies:
- eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
- dependencies:
- eslint: 8.57.0
- eslint-visitor-keys: 3.4.3
+ '@nodelib/fs.scandir@2.1.5':
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+ engines: {node: '>= 8'}
- /@eslint-community/regexpp@4.11.0:
- resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==}
- engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+ '@nodelib/fs.stat@2.0.5':
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+ engines: {node: '>= 8'}
- /@eslint/eslintrc@2.1.4:
- resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- dependencies:
- ajv: 6.12.6
- debug: 4.3.6
- espree: 9.6.1
- globals: 13.24.0
- ignore: 5.3.2
- import-fresh: 3.3.0
- js-yaml: 4.1.0
- minimatch: 3.1.2
- strip-json-comments: 3.1.1
- transitivePeerDependencies:
- - supports-color
+ '@nodelib/fs.walk@1.2.8':
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+ engines: {node: '>= 8'}
- /@eslint/eslintrc@3.1.0:
- resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- dependencies:
- ajv: 6.12.6
- debug: 4.3.6
- espree: 10.1.0
- globals: 14.0.0
- ignore: 5.3.2
- import-fresh: 3.3.0
- js-yaml: 4.1.0
- minimatch: 3.1.2
- strip-json-comments: 3.1.1
- transitivePeerDependencies:
- - supports-color
- dev: true
+ '@nolyfill/is-core-module@1.0.39':
+ resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==}
+ engines: {node: '>=12.4.0'}
- /@eslint/js@8.57.0:
- resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ '@panva/hkdf@1.2.1':
+ resolution: {integrity: sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==}
- /@floating-ui/core@1.6.7:
- resolution: {integrity: sha512-yDzVT/Lm101nQ5TCVeK65LtdN7Tj4Qpr9RTXJ2vPFLqtLxwOrpoxAHAJI8J3yYWUc40J0BDBheaitK5SJmno2g==}
- dependencies:
- '@floating-ui/utils': 0.2.7
- dev: false
+ '@pkgjs/parseargs@0.11.0':
+ resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
+ engines: {node: '>=14'}
- /@floating-ui/dom@1.6.10:
- resolution: {integrity: sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A==}
- dependencies:
- '@floating-ui/core': 1.6.7
- '@floating-ui/utils': 0.2.7
- dev: false
+ '@radix-ui/primitive@1.1.0':
+ resolution: {integrity: sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==}
- /@floating-ui/react-dom@2.1.1(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg==}
+ '@radix-ui/react-accordion@1.2.1':
+ resolution: {integrity: sha512-bg/l7l5QzUjgsh8kjwDFommzAshnUsuVMV5NM56QVCm+7ZckYdd9P/ExR8xG/Oup0OajVxNLaHJ1tb8mXk+nzQ==}
peerDependencies:
- react: '>=16.8.0'
- react-dom: '>=16.8.0'
- dependencies:
- '@floating-ui/dom': 1.6.10
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
-
- /@floating-ui/utils@0.2.7:
- resolution: {integrity: sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==}
- dev: false
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
- /@formatjs/ecma402-abstract@2.0.0:
- resolution: {integrity: sha512-rRqXOqdFmk7RYvj4khklyqzcfQl9vEL/usogncBHRZfZBDOwMGuSRNFl02fu5KGHXdbinju+YXyuR+Nk8xlr/g==}
- dependencies:
- '@formatjs/intl-localematcher': 0.5.4
- tslib: 2.7.0
- dev: false
+ '@radix-ui/react-arrow@1.1.0':
+ resolution: {integrity: sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
- /@formatjs/fast-memoize@2.2.0:
- resolution: {integrity: sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==}
- dependencies:
- tslib: 2.7.0
- dev: false
+ '@radix-ui/react-avatar@1.1.1':
+ resolution: {integrity: sha512-eoOtThOmxeoizxpX6RiEsQZ2wj5r4+zoeqAwO0cBaFQGjJwIH3dIX0OCxNrCyrrdxG+vBweMETh3VziQG7c1kw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
- /@formatjs/icu-messageformat-parser@2.7.8:
- resolution: {integrity: sha512-nBZJYmhpcSX0WeJ5SDYUkZ42AgR3xiyhNCsQweFx3cz/ULJjym8bHAzWKvG5e2+1XO98dBYC0fWeeAECAVSwLA==}
- dependencies:
- '@formatjs/ecma402-abstract': 2.0.0
- '@formatjs/icu-skeleton-parser': 1.8.2
- tslib: 2.7.0
- dev: false
+ '@radix-ui/react-checkbox@1.1.2':
+ resolution: {integrity: sha512-/i0fl686zaJbDQLNKrkCbMyDm6FQMt4jg323k7HuqitoANm9sE23Ql8yOK3Wusk34HSLKDChhMux05FnP6KUkw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
- /@formatjs/icu-skeleton-parser@1.8.2:
- resolution: {integrity: sha512-k4ERKgw7aKGWJZgTarIcNEmvyTVD9FYh0mTrrBMHZ1b8hUu6iOJ4SzsZlo3UNAvHYa+PnvntIwRPt1/vy4nA9Q==}
- dependencies:
- '@formatjs/ecma402-abstract': 2.0.0
- tslib: 2.7.0
- dev: false
+ '@radix-ui/react-collapsible@1.1.1':
+ resolution: {integrity: sha512-1///SnrfQHJEofLokyczERxQbWfCGQlQ2XsCZMucVs6it+lq9iw4vXy+uDn1edlb58cOZOWSldnfPAYcT4O/Yg==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
- /@formatjs/intl-localematcher@0.5.4:
- resolution: {integrity: sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g==}
- dependencies:
- tslib: 2.7.0
- dev: false
+ '@radix-ui/react-collection@1.1.0':
+ resolution: {integrity: sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
- /@hookform/resolvers@3.9.0(react-hook-form@7.53.0):
- resolution: {integrity: sha512-bU0Gr4EepJ/EQsH/IwEzYLsT/PEj5C0ynLQ4m+GSHS+xKH4TfSelhluTgOaoc4kA5s7eCsQbM4wvZLzELmWzUg==}
+ '@radix-ui/react-compose-refs@1.1.0':
+ resolution: {integrity: sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==}
peerDependencies:
- react-hook-form: ^7.0.0
- dependencies:
- react-hook-form: 7.53.0(react@18.3.1)
- dev: false
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
- /@humanwhocodes/config-array@0.11.14:
- resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==}
- engines: {node: '>=10.10.0'}
- deprecated: Use @eslint/config-array instead
- dependencies:
- '@humanwhocodes/object-schema': 2.0.3
- debug: 4.3.6
- minimatch: 3.1.2
- transitivePeerDependencies:
- - supports-color
+ '@radix-ui/react-context@1.1.0':
+ resolution: {integrity: sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
- /@humanwhocodes/module-importer@1.0.1:
- resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
- engines: {node: '>=12.22'}
+ '@radix-ui/react-context@1.1.1':
+ resolution: {integrity: sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
- /@humanwhocodes/object-schema@2.0.3:
- resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==}
- deprecated: Use @eslint/object-schema instead
+ '@radix-ui/react-direction@1.1.0':
+ resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
- /@ianvs/prettier-plugin-sort-imports@4.3.1(prettier@3.3.3):
- resolution: {integrity: sha512-ZHwbyjkANZOjaBm3ZosADD2OUYGFzQGxfy67HmGZU94mHqe7g1LCMA7YYKB1Cq+UTPCBqlAYapY0KXAjKEw8Sg==}
+ '@radix-ui/react-dismissable-layer@1.1.1':
+ resolution: {integrity: sha512-QSxg29lfr/xcev6kSz7MAlmDnzbP1eI/Dwn3Tp1ip0KT5CUELsxkekFEMVBEoykI3oV39hKT4TKZzBNMbcTZYQ==}
peerDependencies:
- '@vue/compiler-sfc': 2.7.x || 3.x
- prettier: 2 || 3
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
peerDependenciesMeta:
- '@vue/compiler-sfc':
+ '@types/react':
+ optional: true
+ '@types/react-dom':
optional: true
- dependencies:
- '@babel/core': 7.25.2
- '@babel/generator': 7.25.5
- '@babel/parser': 7.25.4
- '@babel/traverse': 7.25.4
- '@babel/types': 7.25.4
- prettier: 3.3.3
- semver: 7.6.3
- transitivePeerDependencies:
- - supports-color
- dev: true
- /@img/sharp-darwin-arm64@0.33.5:
- resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
- cpu: [arm64]
- os: [darwin]
- requiresBuild: true
- optionalDependencies:
- '@img/sharp-libvips-darwin-arm64': 1.0.4
- dev: false
- optional: true
-
- /@img/sharp-darwin-x64@0.33.5:
- resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
- cpu: [x64]
- os: [darwin]
- requiresBuild: true
- optionalDependencies:
- '@img/sharp-libvips-darwin-x64': 1.0.4
- dev: false
- optional: true
+ '@radix-ui/react-dropdown-menu@2.1.2':
+ resolution: {integrity: sha512-GVZMR+eqK8/Kes0a36Qrv+i20bAPXSn8rCBTHx30w+3ECnR5o3xixAlqcVaYvLeyKUsm0aqyhWfmUcqufM8nYA==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
- /@img/sharp-libvips-darwin-arm64@1.0.4:
- resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==}
- cpu: [arm64]
- os: [darwin]
- requiresBuild: true
- dev: false
- optional: true
+ '@radix-ui/react-focus-guards@1.1.1':
+ resolution: {integrity: sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
- /@img/sharp-libvips-darwin-x64@1.0.4:
- resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==}
- cpu: [x64]
- os: [darwin]
- requiresBuild: true
- dev: false
- optional: true
+ '@radix-ui/react-focus-scope@1.1.0':
+ resolution: {integrity: sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
- /@img/sharp-libvips-linux-arm64@1.0.4:
- resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==}
- cpu: [arm64]
- os: [linux]
- requiresBuild: true
- dev: false
- optional: true
+ '@radix-ui/react-icons@1.3.0':
+ resolution: {integrity: sha512-jQxj/0LKgp+j9BiTXz3O3sgs26RNet2iLWmsPyRz2SIcR4q/4SbazXfnYwbAr+vLYKSfc7qxzyGQA1HLlYiuNw==}
+ peerDependencies:
+ react: ^16.x || ^17.x || ^18.x
- /@img/sharp-libvips-linux-arm@1.0.5:
- resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==}
- cpu: [arm]
- os: [linux]
- requiresBuild: true
- dev: false
- optional: true
+ '@radix-ui/react-id@1.1.0':
+ resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
- /@img/sharp-libvips-linux-s390x@1.0.4:
- resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==}
- cpu: [s390x]
- os: [linux]
- requiresBuild: true
- dev: false
- optional: true
+ '@radix-ui/react-label@2.1.0':
+ resolution: {integrity: sha512-peLblDlFw/ngk3UWq0VnYaOLy6agTZZ+MUO/WhVfm14vJGML+xH4FAl2XQGLqdefjNb7ApRg6Yn7U42ZhmYXdw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
- /@img/sharp-libvips-linux-x64@1.0.4:
- resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==}
- cpu: [x64]
- os: [linux]
- requiresBuild: true
- dev: false
- optional: true
+ '@radix-ui/react-menu@2.1.2':
+ resolution: {integrity: sha512-lZ0R4qR2Al6fZ4yCCZzu/ReTFrylHFxIqy7OezIpWF4bL0o9biKo0pFIvkaew3TyZ9Fy5gYVrR5zCGZBVbO1zg==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
- /@img/sharp-libvips-linuxmusl-arm64@1.0.4:
- resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==}
- cpu: [arm64]
- os: [linux]
- requiresBuild: true
- dev: false
- optional: true
+ '@radix-ui/react-popper@1.2.0':
+ resolution: {integrity: sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
- /@img/sharp-libvips-linuxmusl-x64@1.0.4:
- resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==}
- cpu: [x64]
- os: [linux]
- requiresBuild: true
- dev: false
- optional: true
+ '@radix-ui/react-portal@1.1.2':
+ resolution: {integrity: sha512-WeDYLGPxJb/5EGBoedyJbT0MpoULmwnIPMJMSldkuiMsBAv7N1cRdsTWZWht9vpPOiN3qyiGAtbK2is47/uMFg==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
- /@img/sharp-linux-arm64@0.33.5:
- resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
- cpu: [arm64]
- os: [linux]
- requiresBuild: true
- optionalDependencies:
- '@img/sharp-libvips-linux-arm64': 1.0.4
- dev: false
- optional: true
+ '@radix-ui/react-presence@1.1.1':
+ resolution: {integrity: sha512-IeFXVi4YS1K0wVZzXNrbaaUvIJ3qdY+/Ih4eHFhWA9SwGR9UDX7Ck8abvL57C4cv3wwMvUE0OG69Qc3NCcTe/A==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
- /@img/sharp-linux-arm@0.33.5:
- resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
- cpu: [arm]
- os: [linux]
- requiresBuild: true
- optionalDependencies:
- '@img/sharp-libvips-linux-arm': 1.0.5
- dev: false
- optional: true
+ '@radix-ui/react-primitive@2.0.0':
+ resolution: {integrity: sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
- /@img/sharp-linux-s390x@0.33.5:
- resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
- cpu: [s390x]
- os: [linux]
- requiresBuild: true
- optionalDependencies:
- '@img/sharp-libvips-linux-s390x': 1.0.4
- dev: false
- optional: true
+ '@radix-ui/react-roving-focus@1.1.0':
+ resolution: {integrity: sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
- /@img/sharp-linux-x64@0.33.5:
- resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
- cpu: [x64]
- os: [linux]
- requiresBuild: true
- optionalDependencies:
- '@img/sharp-libvips-linux-x64': 1.0.4
- dev: false
- optional: true
+ '@radix-ui/react-slot@1.1.0':
+ resolution: {integrity: sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
- /@img/sharp-linuxmusl-arm64@0.33.5:
- resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
- cpu: [arm64]
- os: [linux]
- requiresBuild: true
- optionalDependencies:
- '@img/sharp-libvips-linuxmusl-arm64': 1.0.4
- dev: false
- optional: true
+ '@radix-ui/react-use-callback-ref@1.1.0':
+ resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
- /@img/sharp-linuxmusl-x64@0.33.5:
- resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
- cpu: [x64]
- os: [linux]
- requiresBuild: true
- optionalDependencies:
- '@img/sharp-libvips-linuxmusl-x64': 1.0.4
- dev: false
- optional: true
+ '@radix-ui/react-use-controllable-state@1.1.0':
+ resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
- /@img/sharp-wasm32@0.33.5:
- resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
- cpu: [wasm32]
- requiresBuild: true
- dependencies:
- '@emnapi/runtime': 1.2.0
- dev: false
- optional: true
+ '@radix-ui/react-use-escape-keydown@1.1.0':
+ resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
- /@img/sharp-win32-ia32@0.33.5:
- resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
- cpu: [ia32]
- os: [win32]
- requiresBuild: true
- dev: false
- optional: true
+ '@radix-ui/react-use-layout-effect@1.1.0':
+ resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
- /@img/sharp-win32-x64@0.33.5:
- resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
- cpu: [x64]
- os: [win32]
- requiresBuild: true
- dev: false
- optional: true
+ '@radix-ui/react-use-previous@1.1.0':
+ resolution: {integrity: sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
- /@isaacs/cliui@8.0.2:
- resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
- engines: {node: '>=12'}
- dependencies:
- string-width: 5.1.2
- string-width-cjs: /string-width@4.2.3
- strip-ansi: 7.1.0
- strip-ansi-cjs: /strip-ansi@6.0.1
- wrap-ansi: 8.1.0
- wrap-ansi-cjs: /wrap-ansi@7.0.0
-
- /@istanbuljs/schema@0.1.3:
- resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==}
- engines: {node: '>=8'}
- dev: true
+ '@radix-ui/react-use-rect@1.1.0':
+ resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
- /@jest/expect-utils@29.7.0:
- resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- dependencies:
- jest-get-type: 29.6.3
- dev: false
+ '@radix-ui/react-use-size@1.1.0':
+ resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
- /@jest/schemas@29.6.3:
- resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- dependencies:
- '@sinclair/typebox': 0.27.8
+ '@radix-ui/rect@1.1.0':
+ resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==}
- /@jest/types@29.6.3:
- resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- dependencies:
- '@jest/schemas': 29.6.3
- '@types/istanbul-lib-coverage': 2.0.6
- '@types/istanbul-reports': 3.0.4
- '@types/node': 20.16.1
- '@types/yargs': 17.0.33
- chalk: 4.1.2
- dev: false
+ '@rtsao/scc@1.1.0':
+ resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==}
- /@jridgewell/gen-mapping@0.3.5:
- resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==}
- engines: {node: '>=6.0.0'}
- dependencies:
- '@jridgewell/set-array': 1.2.1
- '@jridgewell/sourcemap-codec': 1.5.0
- '@jridgewell/trace-mapping': 0.3.25
+ '@rushstack/eslint-patch@1.10.4':
+ resolution: {integrity: sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==}
- /@jridgewell/resolve-uri@3.1.2:
- resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
- engines: {node: '>=6.0.0'}
+ '@swc/counter@0.1.3':
+ resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==}
- /@jridgewell/set-array@1.2.1:
- resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
- engines: {node: '>=6.0.0'}
+ '@swc/helpers@0.5.13':
+ resolution: {integrity: sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==}
- /@jridgewell/source-map@0.3.6:
- resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==}
- dependencies:
- '@jridgewell/gen-mapping': 0.3.5
- '@jridgewell/trace-mapping': 0.3.25
- dev: false
+ '@tanstack/query-core@5.59.16':
+ resolution: {integrity: sha512-crHn+G3ltqb5JG0oUv6q+PMz1m1YkjpASrXTU+sYWW9pLk0t2GybUHNRqYPZWhxgjPaVGC4yp92gSFEJgYEsPw==}
- /@jridgewell/sourcemap-codec@1.5.0:
- resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
+ '@tanstack/query-devtools@5.58.0':
+ resolution: {integrity: sha512-iFdQEFXaYYxqgrv63ots+65FGI+tNp5ZS5PdMU1DWisxk3fez5HG3FyVlbUva+RdYS5hSLbxZ9aw3yEs97GNTw==}
- /@jridgewell/trace-mapping@0.3.25:
- resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
- dependencies:
- '@jridgewell/resolve-uri': 3.1.2
- '@jridgewell/sourcemap-codec': 1.5.0
+ '@tanstack/react-query-devtools@5.59.16':
+ resolution: {integrity: sha512-Dejo39QBXmDqXZ3vdrk7vHDvs7TvL573/AX2NveMBmRAufAPYuE3oWSKP/gGqkDfEqyr4CmldOj+v9cKskUchQ==}
+ peerDependencies:
+ '@tanstack/react-query': ^5.59.16
+ react: ^18 || ^19
- /@mertasan/tailwindcss-variables@2.7.0(autoprefixer@10.4.20)(postcss@8.4.41):
- resolution: {integrity: sha512-rKPhxi/0r6XWP0+OjPmsfrloX/TtQmvONj2Pr3Nl8BNBznQVP3M9sphguDBUDC0AiKYx2xgup3XzAhlIDLPLIA==}
- engines: {node: '>=12.13.0'}
+ '@tanstack/react-query@5.59.16':
+ resolution: {integrity: sha512-MuyWheG47h6ERd4PKQ6V8gDyBu3ThNG22e1fRVwvq6ap3EqsFhyuxCAwhNP/03m/mLg+DAb0upgbPaX6VB+CkQ==}
peerDependencies:
- autoprefixer: ^10.0.2
- postcss: ^8.0.9
- dependencies:
- autoprefixer: 10.4.20(postcss@8.4.41)
- lodash: 4.17.21
- postcss: 8.4.41
- dev: true
+ react: ^18 || ^19
- /@next/env@14.1.4:
- resolution: {integrity: sha512-e7X7bbn3Z6DWnDi75UWn+REgAbLEqxI8Tq2pkFOFAMpWAWApz/YCUhtWMWn410h8Q2fYiYL7Yg5OlxMOCfFjJQ==}
- dev: false
+ '@types/conventional-commits-parser@5.0.0':
+ resolution: {integrity: sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==}
- /@next/env@14.2.5:
- resolution: {integrity: sha512-/zZGkrTOsraVfYjGP8uM0p6r0BDT6xWpkjdVbcz66PJVSpwXX3yNiRycxAuDfBKGWBrZBXRuK/YVlkNgxHGwmA==}
- dev: false
+ '@types/cookie@0.6.0':
+ resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==}
- /@next/eslint-plugin-next@14.2.4:
- resolution: {integrity: sha512-svSFxW9f3xDaZA3idQmlFw7SusOuWTpDTAeBlO3AEPDltrraV+lqs7mAc6A27YdnpQVVIA3sODqUAAHdWhVWsA==}
- dependencies:
- glob: 10.3.10
- dev: true
+ '@types/json5@0.0.29':
+ resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
- /@next/swc-darwin-arm64@14.1.4:
- resolution: {integrity: sha512-ubmUkbmW65nIAOmoxT1IROZdmmJMmdYvXIe8211send9ZYJu+SqxSnJM4TrPj9wmL6g9Atvj0S/2cFmMSS99jg==}
- engines: {node: '>= 10'}
- cpu: [arm64]
- os: [darwin]
- requiresBuild: true
- dev: false
- optional: true
+ '@types/node@20.17.1':
+ resolution: {integrity: sha512-j2VlPv1NnwPJbaCNv69FO/1z4lId0QmGvpT41YxitRtWlg96g/j8qcv2RKsLKe2F6OJgyXhupN1Xo17b2m139Q==}
- /@next/swc-darwin-arm64@14.2.5:
- resolution: {integrity: sha512-/9zVxJ+K9lrzSGli1///ujyRfon/ZneeZ+v4ptpiPoOU+GKZnm8Wj8ELWU1Pm7GHltYRBklmXMTUqM/DqQ99FQ==}
- engines: {node: '>= 10'}
- cpu: [arm64]
- os: [darwin]
- requiresBuild: true
- dev: false
- optional: true
+ '@types/prop-types@15.7.13':
+ resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==}
- /@next/swc-darwin-x64@14.1.4:
- resolution: {integrity: sha512-b0Xo1ELj3u7IkZWAKcJPJEhBop117U78l70nfoQGo4xUSvv0PJSTaV4U9xQBLvZlnjsYkc8RwQN1HoH/oQmLlQ==}
- engines: {node: '>= 10'}
- cpu: [x64]
- os: [darwin]
- requiresBuild: true
- dev: false
- optional: true
+ '@types/react-dom@18.3.1':
+ resolution: {integrity: sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==}
- /@next/swc-darwin-x64@14.2.5:
- resolution: {integrity: sha512-vXHOPCwfDe9qLDuq7U1OYM2wUY+KQ4Ex6ozwsKxp26BlJ6XXbHleOUldenM67JRyBfVjv371oneEvYd3H2gNSA==}
- engines: {node: '>= 10'}
- cpu: [x64]
- os: [darwin]
- requiresBuild: true
- dev: false
- optional: true
+ '@types/react@18.3.12':
+ resolution: {integrity: sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==}
- /@next/swc-linux-arm64-gnu@14.1.4:
- resolution: {integrity: sha512-457G0hcLrdYA/u1O2XkRMsDKId5VKe3uKPvrKVOyuARa6nXrdhJOOYU9hkKKyQTMru1B8qEP78IAhf/1XnVqKA==}
- engines: {node: '>= 10'}
- cpu: [arm64]
- os: [linux]
- requiresBuild: true
- dev: false
- optional: true
+ '@typescript-eslint/eslint-plugin@8.11.0':
+ resolution: {integrity: sha512-KhGn2LjW1PJT2A/GfDpiyOfS4a8xHQv2myUagTM5+zsormOmBlYsnQ6pobJ8XxJmh6hnHwa2Mbe3fPrDJoDhbA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
- /@next/swc-linux-arm64-gnu@14.2.5:
- resolution: {integrity: sha512-vlhB8wI+lj8q1ExFW8lbWutA4M2ZazQNvMWuEDqZcuJJc78iUnLdPPunBPX8rC4IgT6lIx/adB+Cwrl99MzNaA==}
- engines: {node: '>= 10'}
- cpu: [arm64]
- os: [linux]
- requiresBuild: true
- dev: false
- optional: true
+ '@typescript-eslint/parser@8.11.0':
+ resolution: {integrity: sha512-lmt73NeHdy1Q/2ul295Qy3uninSqi6wQI18XwSpm8w0ZbQXUpjCAWP1Vlv/obudoBiIjJVjlztjQ+d/Md98Yxg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
- /@next/swc-linux-arm64-musl@14.1.4:
- resolution: {integrity: sha512-l/kMG+z6MB+fKA9KdtyprkTQ1ihlJcBh66cf0HvqGP+rXBbOXX0dpJatjZbHeunvEHoBBS69GYQG5ry78JMy3g==}
- engines: {node: '>= 10'}
- cpu: [arm64]
- os: [linux]
- requiresBuild: true
- dev: false
- optional: true
+ '@typescript-eslint/scope-manager@8.11.0':
+ resolution: {integrity: sha512-Uholz7tWhXmA4r6epo+vaeV7yjdKy5QFCERMjs1kMVsLRKIrSdM6o21W2He9ftp5PP6aWOVpD5zvrvuHZC0bMQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- /@next/swc-linux-arm64-musl@14.2.5:
- resolution: {integrity: sha512-NpDB9NUR2t0hXzJJwQSGu1IAOYybsfeB+LxpGsXrRIb7QOrYmidJz3shzY8cM6+rO4Aojuef0N/PEaX18pi9OA==}
- engines: {node: '>= 10'}
- cpu: [arm64]
- os: [linux]
- requiresBuild: true
- dev: false
- optional: true
+ '@typescript-eslint/type-utils@8.11.0':
+ resolution: {integrity: sha512-ItiMfJS6pQU0NIKAaybBKkuVzo6IdnAhPFZA/2Mba/uBjuPQPet/8+zh5GtLHwmuFRShZx+8lhIs7/QeDHflOg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
- /@next/swc-linux-x64-gnu@14.1.4:
- resolution: {integrity: sha512-BapIFZ3ZRnvQ1uWbmqEGJuPT9cgLwvKtxhK/L2t4QYO7l+/DxXuIGjvp1x8rvfa/x1FFSsipERZK70pewbtJtw==}
- engines: {node: '>= 10'}
- cpu: [x64]
- os: [linux]
- requiresBuild: true
- dev: false
- optional: true
+ '@typescript-eslint/types@8.11.0':
+ resolution: {integrity: sha512-tn6sNMHf6EBAYMvmPUaKaVeYvhUsrE6x+bXQTxjQRp360h1giATU0WvgeEys1spbvb5R+VpNOZ+XJmjD8wOUHw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- /@next/swc-linux-x64-gnu@14.2.5:
- resolution: {integrity: sha512-8XFikMSxWleYNryWIjiCX+gU201YS+erTUidKdyOVYi5qUQo/gRxv/3N1oZFCgqpesN6FPeqGM72Zve+nReVXQ==}
- engines: {node: '>= 10'}
- cpu: [x64]
- os: [linux]
- requiresBuild: true
- dev: false
- optional: true
+ '@typescript-eslint/typescript-estree@8.11.0':
+ resolution: {integrity: sha512-yHC3s1z1RCHoCz5t06gf7jH24rr3vns08XXhfEqzYpd6Hll3z/3g23JRi0jM8A47UFKNc3u/y5KIMx8Ynbjohg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
- /@next/swc-linux-x64-musl@14.1.4:
- resolution: {integrity: sha512-mqVxTwk4XuBl49qn2A5UmzFImoL1iLm0KQQwtdRJRKl21ylQwwGCxJtIYo2rbfkZHoSKlh/YgztY0qH3wG1xIg==}
- engines: {node: '>= 10'}
- cpu: [x64]
- os: [linux]
- requiresBuild: true
- dev: false
- optional: true
+ '@typescript-eslint/utils@8.11.0':
+ resolution: {integrity: sha512-CYiX6WZcbXNJV7UNB4PLDIBtSdRmRI/nb0FMyqHPTQD1rMjA0foPLaPUV39C/MxkTd/QKSeX+Gb34PPsDVC35g==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
- /@next/swc-linux-x64-musl@14.2.5:
- resolution: {integrity: sha512-6QLwi7RaYiQDcRDSU/os40r5o06b5ue7Jsk5JgdRBGGp8l37RZEh9JsLSM8QF0YDsgcosSeHjglgqi25+m04IQ==}
- engines: {node: '>= 10'}
- cpu: [x64]
- os: [linux]
- requiresBuild: true
- dev: false
- optional: true
+ '@typescript-eslint/visitor-keys@8.11.0':
+ resolution: {integrity: sha512-EaewX6lxSjRJnc+99+dqzTeoDZUfyrA52d2/HRrkI830kgovWsmIiTfmr0NZorzqic7ga+1bS60lRBUgR3n/Bw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- /@next/swc-win32-arm64-msvc@14.1.4:
- resolution: {integrity: sha512-xzxF4ErcumXjO2Pvg/wVGrtr9QQJLk3IyQX1ddAC/fi6/5jZCZ9xpuL9Tzc4KPWMFq8GGWFVDMshZOdHGdkvag==}
- engines: {node: '>= 10'}
- cpu: [arm64]
- os: [win32]
- requiresBuild: true
- dev: false
- optional: true
+ '@ungap/structured-clone@1.2.0':
+ resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
- /@next/swc-win32-arm64-msvc@14.2.5:
- resolution: {integrity: sha512-1GpG2VhbspO+aYoMOQPQiqc/tG3LzmsdBH0LhnDS3JrtDx2QmzXe0B6mSZZiN3Bq7IOMXxv1nlsjzoS1+9mzZw==}
- engines: {node: '>= 10'}
- cpu: [arm64]
- os: [win32]
- requiresBuild: true
- dev: false
- optional: true
+ JSONStream@1.3.5:
+ resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==}
+ hasBin: true
- /@next/swc-win32-ia32-msvc@14.1.4:
- resolution: {integrity: sha512-WZiz8OdbkpRw6/IU/lredZWKKZopUMhcI2F+XiMAcPja0uZYdMTZQRoQ0WZcvinn9xZAidimE7tN9W5v9Yyfyw==}
- engines: {node: '>= 10'}
- cpu: [ia32]
- os: [win32]
- requiresBuild: true
- dev: false
- optional: true
+ acorn-jsx@5.3.2:
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
- /@next/swc-win32-ia32-msvc@14.2.5:
- resolution: {integrity: sha512-Igh9ZlxwvCDsu6438FXlQTHlRno4gFpJzqPjSIBZooD22tKeI4fE/YMRoHVJHmrQ2P5YL1DoZ0qaOKkbeFWeMg==}
- engines: {node: '>= 10'}
- cpu: [ia32]
- os: [win32]
- requiresBuild: true
- dev: false
- optional: true
+ acorn@8.14.0:
+ resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
- /@next/swc-win32-x64-msvc@14.1.4:
- resolution: {integrity: sha512-4Rto21sPfw555sZ/XNLqfxDUNeLhNYGO2dlPqsnuCg8N8a2a9u1ltqBOPQ4vj1Gf7eJC0W2hHG2eYUHuiXgY2w==}
- engines: {node: '>= 10'}
- cpu: [x64]
- os: [win32]
- requiresBuild: true
- dev: false
- optional: true
+ ajv@6.12.6:
+ resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
- /@next/swc-win32-x64-msvc@14.2.5:
- resolution: {integrity: sha512-tEQ7oinq1/CjSG9uSTerca3v4AZ+dFa+4Yu6ihaG8Ud8ddqLQgFGcnwYls13H5X5CPDPZJdYxyeMui6muOLd4g==}
- engines: {node: '>= 10'}
- cpu: [x64]
- os: [win32]
- requiresBuild: true
- dev: false
- optional: true
+ ajv@8.17.1:
+ resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==}
- /@nodelib/fs.scandir@2.1.5:
- resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
- engines: {node: '>= 8'}
- dependencies:
- '@nodelib/fs.stat': 2.0.5
- run-parallel: 1.2.0
+ ansi-escapes@7.0.0:
+ resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==}
+ engines: {node: '>=18'}
- /@nodelib/fs.stat@2.0.5:
- resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
- engines: {node: '>= 8'}
+ ansi-regex@5.0.1:
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+ engines: {node: '>=8'}
- /@nodelib/fs.walk@1.2.8:
- resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
- engines: {node: '>= 8'}
- dependencies:
- '@nodelib/fs.scandir': 2.1.5
- fastq: 1.17.1
+ ansi-regex@6.1.0:
+ resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==}
+ engines: {node: '>=12'}
- /@one-ini/wasm@0.1.1:
- resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==}
- dev: false
+ ansi-styles@4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
- /@panva/hkdf@1.2.1:
- resolution: {integrity: sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==}
- dev: false
+ ansi-styles@6.2.1:
+ resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
+ engines: {node: '>=12'}
- /@pkgjs/parseargs@0.11.0:
- resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
- engines: {node: '>=14'}
- requiresBuild: true
- optional: true
+ any-promise@1.3.0:
+ resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
- /@pkgr/core@0.1.1:
- resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==}
- engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
- dev: true
+ anymatch@3.1.3:
+ resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+ engines: {node: '>= 8'}
- /@polka/url@1.0.0-next.25:
- resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==}
- dev: true
+ arg@5.0.2:
+ resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
- /@radix-ui/colors@1.0.1:
- resolution: {integrity: sha512-xySw8f0ZVsAEP+e7iLl3EvcBXX7gsIlC1Zso/sPBW9gIWerBTgz6axrjU+MZ39wD+WFi5h5zdWpsg3+hwt2Qsg==}
- dev: false
+ argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
- /@radix-ui/number@1.1.0:
- resolution: {integrity: sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==}
- dev: false
+ aria-hidden@1.2.4:
+ resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==}
+ engines: {node: '>=10'}
- /@radix-ui/primitive@1.1.0:
- resolution: {integrity: sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==}
- dev: false
+ aria-query@5.3.2:
+ resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
+ engines: {node: '>= 0.4'}
- /@radix-ui/react-accordion@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-HJOzSX8dQqtsp/3jVxCU3CXEONF7/2jlGAB28oX8TTw1Dz8JYbEI1UcL8355PuLBE41/IRRMvCw7VkiK/jcUOQ==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@radix-ui/primitive': 1.1.0
- '@radix-ui/react-collapsible': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-context': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-direction': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-id': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@types/react': 18.3.4
- '@types/react-dom': 18.3.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
+ array-buffer-byte-length@1.0.1:
+ resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==}
+ engines: {node: '>= 0.4'}
- /@radix-ui/react-alert-dialog@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-wmCoJwj7byuVuiLKqDLlX7ClSUU0vd9sdCeM+2Ls+uf13+cpSJoMgwysHq1SGVVkJj5Xn0XWi1NoRCdkMpr6Mw==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@radix-ui/primitive': 1.1.0
- '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-context': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-dialog': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-slot': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@types/react': 18.3.4
- '@types/react-dom': 18.3.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
+ array-ify@1.0.0:
+ resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==}
- /@radix-ui/react-arrow@1.1.0(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1)
- '@types/react': 18.2.47
- '@types/react-dom': 18.3.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
+ array-includes@3.1.8:
+ resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==}
+ engines: {node: '>= 0.4'}
- /@radix-ui/react-arrow@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@types/react': 18.3.4
- '@types/react-dom': 18.3.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
+ array.prototype.findlast@1.2.5:
+ resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==}
+ engines: {node: '>= 0.4'}
- /@radix-ui/react-avatar@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-Q/PbuSMk/vyAd/UoIShVGZ7StHHeRFYU7wXmi5GV+8cLXflZAEpHL/F697H1klrzxKXNtZ97vWiC0q3RKUH8UA==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@radix-ui/react-context': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@types/react': 18.3.4
- '@types/react-dom': 18.3.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
+ array.prototype.findlastindex@1.2.5:
+ resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==}
+ engines: {node: '>= 0.4'}
- /@radix-ui/react-checkbox@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-0i/EKJ222Afa1FE0C6pNJxDq1itzcl3HChE9DwskA4th4KRse8ojx8a1nVcOjwJdbpDLcz7uol77yYnQNMHdKw==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@radix-ui/primitive': 1.1.0
- '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-context': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@types/react': 18.3.4
- '@types/react-dom': 18.3.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
+ array.prototype.flat@1.3.2:
+ resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==}
+ engines: {node: '>= 0.4'}
- /@radix-ui/react-collapsible@1.1.0(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-zQY7Epa8sTL0mq4ajSJpjgn2YmCgyrG7RsQgLp3C0LQVkG7+Tf6Pv1CeNWZLyqMjhdPkBa5Lx7wYBeSu7uCSTA==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@radix-ui/primitive': 1.1.0
- '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@radix-ui/react-context': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@radix-ui/react-id': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@types/react': 18.2.47
- '@types/react-dom': 18.3.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
+ array.prototype.flatmap@1.3.2:
+ resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==}
+ engines: {node: '>= 0.4'}
- /@radix-ui/react-collapsible@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-zQY7Epa8sTL0mq4ajSJpjgn2YmCgyrG7RsQgLp3C0LQVkG7+Tf6Pv1CeNWZLyqMjhdPkBa5Lx7wYBeSu7uCSTA==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@radix-ui/primitive': 1.1.0
- '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-context': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-id': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@types/react': 18.3.4
- '@types/react-dom': 18.3.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
+ array.prototype.tosorted@1.1.4:
+ resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==}
+ engines: {node: '>= 0.4'}
- /@radix-ui/react-collection@1.1.0(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@radix-ui/react-context': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-slot': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@types/react': 18.2.47
- '@types/react-dom': 18.3.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
+ arraybuffer.prototype.slice@1.0.3:
+ resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==}
+ engines: {node: '>= 0.4'}
- /@radix-ui/react-collection@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-context': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-slot': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@types/react': 18.3.4
- '@types/react-dom': 18.3.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
+ ast-types-flow@0.0.8:
+ resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==}
- /@radix-ui/react-compose-refs@1.0.1(@types/react@18.3.4)(react@18.3.1):
- resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
- dependencies:
- '@babel/runtime': 7.25.4
- '@types/react': 18.3.4
- react: 18.3.1
- dev: false
+ asynckit@0.4.0:
+ resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
- /@radix-ui/react-compose-refs@1.1.0(@types/react@18.2.47)(react@18.3.1):
- resolution: {integrity: sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- dependencies:
- '@types/react': 18.2.47
- react: 18.3.1
- dev: false
+ available-typed-arrays@1.0.7:
+ resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
+ engines: {node: '>= 0.4'}
- /@radix-ui/react-compose-refs@1.1.0(@types/react@18.3.4)(react@18.3.1):
- resolution: {integrity: sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==}
+ axe-core@4.10.2:
+ resolution: {integrity: sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==}
+ engines: {node: '>=4'}
+
+ axios@1.7.7:
+ resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==}
+
+ axobject-query@4.1.0:
+ resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==}
+ engines: {node: '>= 0.4'}
+
+ balanced-match@1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+ binary-extensions@2.3.0:
+ resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
+ engines: {node: '>=8'}
+
+ brace-expansion@1.1.11:
+ resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
+
+ brace-expansion@2.0.1:
+ resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
+
+ braces@3.0.3:
+ resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+ engines: {node: '>=8'}
+
+ browserslist@4.24.2:
+ resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+
+ busboy@1.6.0:
+ resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==}
+ engines: {node: '>=10.16.0'}
+
+ call-bind@1.0.7:
+ resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==}
+ engines: {node: '>= 0.4'}
+
+ callsites@3.1.0:
+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+ engines: {node: '>=6'}
+
+ camelcase-css@2.0.1:
+ resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
+ engines: {node: '>= 6'}
+
+ caniuse-lite@1.0.30001673:
+ resolution: {integrity: sha512-WTrjUCSMp3LYX0nE12ECkV0a+e6LC85E0Auz75555/qr78Oc8YWhEPNfDd6SHdtlCMSzqtuXY0uyEMNRcsKpKw==}
+
+ chalk@4.1.2:
+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+ engines: {node: '>=10'}
+
+ chalk@5.3.0:
+ resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==}
+ engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
+
+ chokidar@3.6.0:
+ resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
+ engines: {node: '>= 8.10.0'}
+
+ class-variance-authority@0.7.0:
+ resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==}
+
+ cli-cursor@5.0.0:
+ resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==}
+ engines: {node: '>=18'}
+
+ cli-truncate@4.0.0:
+ resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==}
+ engines: {node: '>=18'}
+
+ client-only@0.0.1:
+ resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
+
+ cliui@8.0.1:
+ resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
+ engines: {node: '>=12'}
+
+ clsx@2.0.0:
+ resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==}
+ engines: {node: '>=6'}
+
+ clsx@2.1.1:
+ resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
+ engines: {node: '>=6'}
+
+ color-convert@2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+
+ color-name@1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+ color-string@1.9.1:
+ resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==}
+
+ color@4.2.3:
+ resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==}
+ engines: {node: '>=12.5.0'}
+
+ colorette@2.0.20:
+ resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==}
+
+ combined-stream@1.0.8:
+ resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
+ engines: {node: '>= 0.8'}
+
+ commander@12.1.0:
+ resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==}
+ engines: {node: '>=18'}
+
+ commander@4.1.1:
+ resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
+ engines: {node: '>= 6'}
+
+ compare-func@2.0.0:
+ resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==}
+
+ concat-map@0.0.1:
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+
+ conventional-changelog-angular@7.0.0:
+ resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==}
+ engines: {node: '>=16'}
+
+ conventional-changelog-conventionalcommits@7.0.2:
+ resolution: {integrity: sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==}
+ engines: {node: '>=16'}
+
+ conventional-commits-parser@5.0.0:
+ resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==}
+ engines: {node: '>=16'}
+ hasBin: true
+
+ convert-source-map@2.0.0:
+ resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+
+ cookie@0.7.1:
+ resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==}
+ engines: {node: '>= 0.6'}
+
+ cosmiconfig-typescript-loader@5.1.0:
+ resolution: {integrity: sha512-7PtBB+6FdsOvZyJtlF3hEPpACq7RQX6BVGsgC7/lfVXnKMvNCu/XY3ykreqG5w/rBNdu2z8LCIKoF3kpHHdHlA==}
+ engines: {node: '>=v16'}
peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- dependencies:
- '@types/react': 18.3.4
- react: 18.3.1
- dev: false
+ '@types/node': '*'
+ cosmiconfig: '>=8.2'
+ typescript: '>=4'
- /@radix-ui/react-context@1.1.0(@types/react@18.2.47)(react@18.3.1):
- resolution: {integrity: sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==}
+ cosmiconfig@9.0.0:
+ resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==}
+ engines: {node: '>=14'}
peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ typescript: '>=4.9.5'
peerDependenciesMeta:
- '@types/react':
+ typescript:
optional: true
- dependencies:
- '@types/react': 18.2.47
- react: 18.3.1
- dev: false
- /@radix-ui/react-context@1.1.0(@types/react@18.3.4)(react@18.3.1):
- resolution: {integrity: sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==}
+ cross-spawn@7.0.3:
+ resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
+ engines: {node: '>= 8'}
+
+ cssesc@3.0.0:
+ resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ csstype@3.1.3:
+ resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
+
+ damerau-levenshtein@1.0.8:
+ resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==}
+
+ dargs@8.1.0:
+ resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==}
+ engines: {node: '>=12'}
+
+ data-view-buffer@1.0.1:
+ resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==}
+ engines: {node: '>= 0.4'}
+
+ data-view-byte-length@1.0.1:
+ resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==}
+ engines: {node: '>= 0.4'}
+
+ data-view-byte-offset@1.0.0:
+ resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==}
+ engines: {node: '>= 0.4'}
+
+ debug@3.2.7:
+ resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ supports-color: '*'
peerDependenciesMeta:
- '@types/react':
+ supports-color:
optional: true
- dependencies:
- '@types/react': 18.3.4
- react: 18.3.1
- dev: false
- /@radix-ui/react-dialog@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg==}
+ debug@4.3.7:
+ resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==}
+ engines: {node: '>=6.0'}
peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ supports-color: '*'
peerDependenciesMeta:
- '@types/react':
+ supports-color:
optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@radix-ui/primitive': 1.1.0
- '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-context': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-id': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-slot': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@types/react': 18.3.4
- '@types/react-dom': 18.3.0
- aria-hidden: 1.2.4
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- react-remove-scroll: 2.5.7(@types/react@18.3.4)(react@18.3.1)
- dev: false
- /@radix-ui/react-direction@1.1.0(@types/react@18.2.47)(react@18.3.1):
- resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- dependencies:
- '@types/react': 18.2.47
- react: 18.3.1
- dev: false
+ deep-is@0.1.4:
+ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
- /@radix-ui/react-direction@1.1.0(@types/react@18.3.4)(react@18.3.1):
- resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==}
+ define-data-property@1.1.4:
+ resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
+ engines: {node: '>= 0.4'}
+
+ define-properties@1.2.1:
+ resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
+ engines: {node: '>= 0.4'}
+
+ delayed-stream@1.0.0:
+ resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
+ engines: {node: '>=0.4.0'}
+
+ detect-libc@2.0.3:
+ resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==}
+ engines: {node: '>=8'}
+
+ detect-node-es@1.1.0:
+ resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==}
+
+ didyoumean@1.2.2:
+ resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
+
+ dlv@1.1.3:
+ resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
+
+ doctrine@2.1.0:
+ resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
+ engines: {node: '>=0.10.0'}
+
+ doctrine@3.0.0:
+ resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
+ engines: {node: '>=6.0.0'}
+
+ dot-prop@5.3.0:
+ resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==}
+ engines: {node: '>=8'}
+
+ eastasianwidth@0.2.0:
+ resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
+
+ electron-to-chromium@1.5.47:
+ resolution: {integrity: sha512-zS5Yer0MOYw4rtK2iq43cJagHZ8sXN0jDHDKzB+86gSBSAI4v07S97mcq+Gs2vclAxSh1j7vOAHxSVgduiiuVQ==}
+
+ emoji-regex@10.4.0:
+ resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==}
+
+ emoji-regex@8.0.0:
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+
+ emoji-regex@9.2.2:
+ resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+
+ enhanced-resolve@5.17.1:
+ resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==}
+ engines: {node: '>=10.13.0'}
+
+ env-paths@2.2.1:
+ resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==}
+ engines: {node: '>=6'}
+
+ environment@1.1.0:
+ resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==}
+ engines: {node: '>=18'}
+
+ error-ex@1.3.2:
+ resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
+
+ es-abstract@1.23.3:
+ resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==}
+ engines: {node: '>= 0.4'}
+
+ es-define-property@1.0.0:
+ resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==}
+ engines: {node: '>= 0.4'}
+
+ es-errors@1.3.0:
+ resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
+ engines: {node: '>= 0.4'}
+
+ es-iterator-helpers@1.1.0:
+ resolution: {integrity: sha512-/SurEfycdyssORP/E+bj4sEu1CWw4EmLDsHynHwSXQ7utgbrMRWW195pTrCjFgFCddf/UkYm3oqKPRq5i8bJbw==}
+ engines: {node: '>= 0.4'}
+
+ es-object-atoms@1.0.0:
+ resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==}
+ engines: {node: '>= 0.4'}
+
+ es-set-tostringtag@2.0.3:
+ resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==}
+ engines: {node: '>= 0.4'}
+
+ es-shim-unscopables@1.0.2:
+ resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==}
+
+ es-to-primitive@1.2.1:
+ resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==}
+ engines: {node: '>= 0.4'}
+
+ escalade@3.2.0:
+ resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
+ engines: {node: '>=6'}
+
+ escape-string-regexp@4.0.0:
+ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+ engines: {node: '>=10'}
+
+ eslint-config-next@14.2.13:
+ resolution: {integrity: sha512-aro1EKAoyYchnO/3Tlo91hnNBO7QO7qnv/79MAFC+4Jq8TdUVKQlht5d2F+YjrePjdpOvfL+mV9JPfyYNwkk1g==}
peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ eslint: ^7.23.0 || ^8.0.0
+ typescript: '>=3.3.1'
peerDependenciesMeta:
- '@types/react':
+ typescript:
optional: true
- dependencies:
- '@types/react': 18.3.4
- react: 18.3.1
- dev: false
- /@radix-ui/react-dismissable-layer@1.1.0(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==}
+ eslint-import-resolver-node@0.3.9:
+ resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==}
+
+ eslint-import-resolver-typescript@3.6.3:
+ resolution: {integrity: sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA==}
+ engines: {node: ^14.18.0 || >=16.0.0}
peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ eslint: '*'
+ eslint-plugin-import: '*'
+ eslint-plugin-import-x: '*'
peerDependenciesMeta:
- '@types/react':
+ eslint-plugin-import:
optional: true
- '@types/react-dom':
+ eslint-plugin-import-x:
optional: true
- dependencies:
- '@radix-ui/primitive': 1.1.0
- '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@types/react': 18.2.47
- '@types/react-dom': 18.3.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
- /@radix-ui/react-dismissable-layer@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==}
+ eslint-module-utils@2.12.0:
+ resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==}
+ engines: {node: '>=4'}
peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ '@typescript-eslint/parser': '*'
+ eslint: '*'
+ eslint-import-resolver-node: '*'
+ eslint-import-resolver-typescript: '*'
+ eslint-import-resolver-webpack: '*'
peerDependenciesMeta:
- '@types/react':
+ '@typescript-eslint/parser':
optional: true
- '@types/react-dom':
+ eslint:
optional: true
- dependencies:
- '@radix-ui/primitive': 1.1.0
- '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@types/react': 18.3.4
- '@types/react-dom': 18.3.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
-
- /@radix-ui/react-dropdown-menu@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-y8E+x9fBq9qvteD2Zwa4397pUVhYsh9iq44b5RD5qu1GMJWBCBuVg1hMyItbc6+zH00TxGRqd9Iot4wzf3OoBQ==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
+ eslint-import-resolver-node:
optional: true
- '@types/react-dom':
+ eslint-import-resolver-typescript:
optional: true
- dependencies:
- '@radix-ui/primitive': 1.1.0
- '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-context': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-id': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-menu': 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@types/react': 18.3.4
- '@types/react-dom': 18.3.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
-
- /@radix-ui/react-focus-guards@1.1.0(@types/react@18.2.47)(react@18.3.1):
- resolution: {integrity: sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
+ eslint-import-resolver-webpack:
optional: true
- dependencies:
- '@types/react': 18.2.47
- react: 18.3.1
- dev: false
- /@radix-ui/react-focus-guards@1.1.0(@types/react@18.3.4)(react@18.3.1):
- resolution: {integrity: sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==}
+ eslint-plugin-import@2.31.0:
+ resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==}
+ engines: {node: '>=4'}
peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ '@typescript-eslint/parser': '*'
+ eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9
peerDependenciesMeta:
- '@types/react':
+ '@typescript-eslint/parser':
optional: true
- dependencies:
- '@types/react': 18.3.4
- react: 18.3.1
- dev: false
- /@radix-ui/react-focus-scope@1.1.0(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==}
+ eslint-plugin-jsx-a11y@6.10.2:
+ resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==}
+ engines: {node: '>=4.0'}
peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@types/react': 18.2.47
- '@types/react-dom': 18.3.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
+ eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9
- /@radix-ui/react-focus-scope@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==}
+ eslint-plugin-react-hooks@5.0.0-canary-7118f5dd7-20230705:
+ resolution: {integrity: sha512-AZYbMo/NW9chdL7vk6HQzQhT+PvTAEVqWk9ziruUoW2kAOcN5qNyelv70e0F1VNQAbvutOC9oc+xfWycI9FxDw==}
+ engines: {node: '>=10'}
peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@types/react': 18.3.4
- '@types/react-dom': 18.3.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
+ eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0
- /@radix-ui/react-icons@1.3.0(react@18.3.1):
- resolution: {integrity: sha512-jQxj/0LKgp+j9BiTXz3O3sgs26RNet2iLWmsPyRz2SIcR4q/4SbazXfnYwbAr+vLYKSfc7qxzyGQA1HLlYiuNw==}
+ eslint-plugin-react@7.37.2:
+ resolution: {integrity: sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==}
+ engines: {node: '>=4'}
peerDependencies:
- react: ^16.x || ^17.x || ^18.x
- dependencies:
- react: 18.3.1
- dev: false
+ eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7
- /@radix-ui/react-id@1.1.0(@types/react@18.2.47)(react@18.3.1):
- resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- dependencies:
- '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@types/react': 18.2.47
- react: 18.3.1
- dev: false
+ eslint-scope@7.2.2:
+ resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- /@radix-ui/react-id@1.1.0(@types/react@18.3.4)(react@18.3.1):
- resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- dependencies:
- '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@types/react': 18.3.4
- react: 18.3.1
- dev: false
+ eslint-visitor-keys@3.4.3:
+ resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- /@radix-ui/react-label@2.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-peLblDlFw/ngk3UWq0VnYaOLy6agTZZ+MUO/WhVfm14vJGML+xH4FAl2XQGLqdefjNb7ApRg6Yn7U42ZhmYXdw==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@types/react': 18.3.4
- '@types/react-dom': 18.3.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
+ eslint@8.57.1:
+ resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options.
+ hasBin: true
- /@radix-ui/react-menu@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-oa3mXRRVjHi6DZu/ghuzdylyjaMXLymx83irM7hTxutQbD+7IhPKdMdRHD26Rm+kHRrWcrUkkRPv5pd47a2xFQ==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@radix-ui/primitive': 1.1.0
- '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-context': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-direction': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-id': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-slot': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@types/react': 18.3.4
- '@types/react-dom': 18.3.0
- aria-hidden: 1.2.4
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- react-remove-scroll: 2.5.7(@types/react@18.3.4)(react@18.3.1)
- dev: false
+ espree@9.6.1:
+ resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- /@radix-ui/react-popover@1.1.1(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-3y1A3isulwnWhvTTwmIreiB8CF4L+qRjZnK1wYLO7pplddzXKby/GnZ2M7OZY3qgnl6p9AodUIHRYGXNah8Y7g==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@radix-ui/primitive': 1.1.0
- '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@radix-ui/react-context': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-id': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-slot': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@types/react': 18.2.47
- '@types/react-dom': 18.3.0
- aria-hidden: 1.2.4
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- react-remove-scroll: 2.5.7(@types/react@18.2.47)(react@18.3.1)
- dev: false
+ esquery@1.6.0:
+ resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
+ engines: {node: '>=0.10'}
- /@radix-ui/react-popover@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-3y1A3isulwnWhvTTwmIreiB8CF4L+qRjZnK1wYLO7pplddzXKby/GnZ2M7OZY3qgnl6p9AodUIHRYGXNah8Y7g==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@radix-ui/primitive': 1.1.0
- '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-context': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-id': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-slot': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@types/react': 18.3.4
- '@types/react-dom': 18.3.0
- aria-hidden: 1.2.4
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- react-remove-scroll: 2.5.7(@types/react@18.3.4)(react@18.3.1)
- dev: false
+ esrecurse@4.3.0:
+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+ engines: {node: '>=4.0'}
- /@radix-ui/react-popper@1.2.0(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@floating-ui/react-dom': 2.1.1(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-arrow': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@radix-ui/react-context': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@radix-ui/react-use-rect': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@radix-ui/react-use-size': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@radix-ui/rect': 1.1.0
- '@types/react': 18.2.47
- '@types/react-dom': 18.3.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
+ estraverse@5.3.0:
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+ engines: {node: '>=4.0'}
- /@radix-ui/react-popper@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@floating-ui/react-dom': 2.1.1(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-arrow': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-context': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/rect': 1.1.0
- '@types/react': 18.3.4
- '@types/react-dom': 18.3.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
+ esutils@2.0.3:
+ resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
+ engines: {node: '>=0.10.0'}
- /@radix-ui/react-portal@1.1.1(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@types/react': 18.2.47
- '@types/react-dom': 18.3.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
+ eventemitter3@5.0.1:
+ resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
- /@radix-ui/react-portal@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@types/react': 18.3.4
- '@types/react-dom': 18.3.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
+ execa@8.0.1:
+ resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==}
+ engines: {node: '>=16.17'}
- /@radix-ui/react-presence@1.1.0(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@types/react': 18.2.47
- '@types/react-dom': 18.3.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
+ fast-deep-equal@3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
- /@radix-ui/react-presence@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@types/react': 18.3.4
- '@types/react-dom': 18.3.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
+ fast-glob@3.3.2:
+ resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==}
+ engines: {node: '>=8.6.0'}
- /@radix-ui/react-primitive@2.0.0(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@radix-ui/react-slot': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@types/react': 18.2.47
- '@types/react-dom': 18.3.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
+ fast-json-stable-stringify@2.1.0:
+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
- /@radix-ui/react-primitive@2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@radix-ui/react-slot': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@types/react': 18.3.4
- '@types/react-dom': 18.3.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
+ fast-levenshtein@2.0.6:
+ resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
- /@radix-ui/react-roving-focus@1.1.0(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@radix-ui/primitive': 1.1.0
- '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@radix-ui/react-context': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@radix-ui/react-direction': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@radix-ui/react-id': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@types/react': 18.2.47
- '@types/react-dom': 18.3.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
+ fast-uri@3.0.3:
+ resolution: {integrity: sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==}
- /@radix-ui/react-roving-focus@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@radix-ui/primitive': 1.1.0
- '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-context': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-direction': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-id': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@types/react': 18.3.4
- '@types/react-dom': 18.3.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
+ fastq@1.17.1:
+ resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==}
- /@radix-ui/react-select@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-8iRDfyLtzxlprOo9IicnzvpsO1wNCkuwzzCM+Z5Rb5tNOpCdMvcc2AkzX0Fz+Tz9v6NJ5B/7EEgyZveo4FBRfQ==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@radix-ui/number': 1.1.0
- '@radix-ui/primitive': 1.1.0
- '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-context': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-direction': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-id': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-slot': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@types/react': 18.3.4
- '@types/react-dom': 18.3.0
- aria-hidden: 1.2.4
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- react-remove-scroll: 2.5.7(@types/react@18.3.4)(react@18.3.1)
- dev: false
+ file-entry-cache@6.0.1:
+ resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
+ engines: {node: ^10.12.0 || >=12.0.0}
- /@radix-ui/react-separator@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-3uBAs+egzvJBDZAzvb/n4NxxOYpnspmWxO2u5NbZ8Y6FM/NdrGSF9bop3Cf6F6C71z1rTSn8KV0Fo2ZVd79lGA==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@types/react': 18.3.4
- '@types/react-dom': 18.3.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
+ fill-range@7.1.1:
+ resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+ engines: {node: '>=8'}
- /@radix-ui/react-slot@1.0.2(@types/react@18.3.4)(react@18.3.1):
- resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
- dependencies:
- '@babel/runtime': 7.25.4
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.4)(react@18.3.1)
- '@types/react': 18.3.4
- react: 18.3.1
- dev: false
+ find-up@5.0.0:
+ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+ engines: {node: '>=10'}
- /@radix-ui/react-slot@1.1.0(@types/react@18.2.47)(react@18.3.1):
- resolution: {integrity: sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- dependencies:
- '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@types/react': 18.2.47
- react: 18.3.1
- dev: false
+ find-up@7.0.0:
+ resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==}
+ engines: {node: '>=18'}
- /@radix-ui/react-slot@1.1.0(@types/react@18.3.4)(react@18.3.1):
- resolution: {integrity: sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- dependencies:
- '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@types/react': 18.3.4
- react: 18.3.1
- dev: false
+ flat-cache@3.2.0:
+ resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==}
+ engines: {node: ^10.12.0 || >=12.0.0}
- /@radix-ui/react-switch@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-OBzy5WAj641k0AOSpKQtreDMe+isX0MQJ1IVyF03ucdF3DunOnROVrjWs8zsXUxC3zfZ6JL9HFVCUlMghz9dJw==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@radix-ui/primitive': 1.1.0
- '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-context': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@types/react': 18.3.4
- '@types/react-dom': 18.3.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
+ flatted@3.3.1:
+ resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==}
- /@radix-ui/react-tabs@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-bZgOKB/LtZIij75FSuPzyEti/XBhJH52ExgtdVqjCIh+Nx/FW+LhnbXtbCzIi34ccyMsyOja8T0thCzoHFXNKA==}
+ follow-redirects@1.15.9:
+ resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==}
+ engines: {node: '>=4.0'}
peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ debug: '*'
peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
+ debug:
optional: true
- dependencies:
- '@radix-ui/primitive': 1.1.0
- '@radix-ui/react-context': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-direction': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-id': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@types/react': 18.3.4
- '@types/react-dom': 18.3.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
- /@radix-ui/react-toast@1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-5trl7piMXcZiCq7MW6r8YYmu0bK5qDpTWz+FdEPdKyft2UixkspheYbjbrLXVN5NGKHFbOP7lm8eD0biiSqZqg==}
+ for-each@0.3.3:
+ resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
+
+ foreground-child@3.3.0:
+ resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==}
+ engines: {node: '>=14'}
+
+ form-data@4.0.1:
+ resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==}
+ engines: {node: '>= 6'}
+
+ framer-motion@11.11.10:
+ resolution: {integrity: sha512-061Bt1jL/vIm+diYIiA4dP/Yld7vD47ROextS7ESBW5hr4wQFhxB5D5T5zAc3c/5me3cOa+iO5LqhA38WDln/A==}
peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ '@emotion/is-prop-valid': '*'
+ react: ^18.0.0
+ react-dom: ^18.0.0
peerDependenciesMeta:
- '@types/react':
+ '@emotion/is-prop-valid':
optional: true
- '@types/react-dom':
+ react:
optional: true
- dependencies:
- '@radix-ui/primitive': 1.1.0
- '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-context': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@types/react': 18.3.4
- '@types/react-dom': 18.3.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
+ react-dom:
+ optional: true
+
+ fs.realpath@1.0.0:
+ resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+
+ fsevents@2.3.3:
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+
+ function-bind@1.1.2:
+ resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+
+ function.prototype.name@1.1.6:
+ resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==}
+ engines: {node: '>= 0.4'}
+
+ functions-have-names@1.2.3:
+ resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
+
+ gensync@1.0.0-beta.2:
+ resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
+ engines: {node: '>=6.9.0'}
+
+ get-caller-file@2.0.5:
+ resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
+ engines: {node: 6.* || 8.* || >= 10.*}
+
+ get-east-asian-width@1.3.0:
+ resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==}
+ engines: {node: '>=18'}
+
+ get-intrinsic@1.2.4:
+ resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==}
+ engines: {node: '>= 0.4'}
+
+ get-nonce@1.0.1:
+ resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==}
+ engines: {node: '>=6'}
+
+ get-stream@8.0.1:
+ resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==}
+ engines: {node: '>=16'}
+
+ get-symbol-description@1.0.2:
+ resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==}
+ engines: {node: '>= 0.4'}
+
+ get-tsconfig@4.8.1:
+ resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==}
+
+ git-raw-commits@4.0.0:
+ resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==}
+ engines: {node: '>=16'}
+ hasBin: true
+
+ glob-parent@5.1.2:
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+ engines: {node: '>= 6'}
+
+ glob-parent@6.0.2:
+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+ engines: {node: '>=10.13.0'}
+
+ glob@10.3.10:
+ resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==}
+ engines: {node: '>=16 || 14 >=14.17'}
+ hasBin: true
+
+ glob@10.4.5:
+ resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==}
+ hasBin: true
+
+ glob@7.2.3:
+ resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+ deprecated: Glob versions prior to v9 are no longer supported
+
+ global-directory@4.0.1:
+ resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==}
+ engines: {node: '>=18'}
+
+ globals@11.12.0:
+ resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
+ engines: {node: '>=4'}
+
+ globals@13.24.0:
+ resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==}
+ engines: {node: '>=8'}
+
+ globalthis@1.0.4:
+ resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
+ engines: {node: '>= 0.4'}
+
+ gopd@1.0.1:
+ resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
+
+ graceful-fs@4.2.11:
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
+ graphemer@1.4.0:
+ resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
+
+ has-bigints@1.0.2:
+ resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
+
+ has-flag@4.0.0:
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+ engines: {node: '>=8'}
+
+ has-property-descriptors@1.0.2:
+ resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
+
+ has-proto@1.0.3:
+ resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==}
+ engines: {node: '>= 0.4'}
+
+ has-symbols@1.0.3:
+ resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
+ engines: {node: '>= 0.4'}
+
+ has-tostringtag@1.0.2:
+ resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
+ engines: {node: '>= 0.4'}
+
+ hasown@2.0.2:
+ resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
+ engines: {node: '>= 0.4'}
+
+ human-signals@5.0.0:
+ resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==}
+ engines: {node: '>=16.17.0'}
+
+ husky@9.1.6:
+ resolution: {integrity: sha512-sqbjZKK7kf44hfdE94EoX8MZNk0n7HeW37O4YrVGCF4wzgQjp+akPAkfUK5LZ6KuR/6sqeAVuXHji+RzQgOn5A==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ ignore@5.3.2:
+ resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
+ engines: {node: '>= 4'}
+
+ import-fresh@3.3.0:
+ resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
+ engines: {node: '>=6'}
+
+ import-meta-resolve@4.1.0:
+ resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==}
+
+ imurmurhash@0.1.4:
+ resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
+ engines: {node: '>=0.8.19'}
+
+ inflight@1.0.6:
+ resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
+ deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
+
+ inherits@2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+ ini@4.1.1:
+ resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ internal-slot@1.0.7:
+ resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==}
+ engines: {node: '>= 0.4'}
+
+ invariant@2.2.4:
+ resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==}
+
+ is-array-buffer@3.0.4:
+ resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==}
+ engines: {node: '>= 0.4'}
+
+ is-arrayish@0.2.1:
+ resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
+
+ is-arrayish@0.3.2:
+ resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==}
+
+ is-async-function@2.0.0:
+ resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==}
+ engines: {node: '>= 0.4'}
+
+ is-bigint@1.0.4:
+ resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==}
+
+ is-binary-path@2.1.0:
+ resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+ engines: {node: '>=8'}
+
+ is-boolean-object@1.1.2:
+ resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
+ engines: {node: '>= 0.4'}
+
+ is-bun-module@1.2.1:
+ resolution: {integrity: sha512-AmidtEM6D6NmUiLOvvU7+IePxjEjOzra2h0pSrsfSAcXwl/83zLLXDByafUJy9k/rKK0pvXMLdwKwGHlX2Ke6Q==}
+
+ is-callable@1.2.7:
+ resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
+ engines: {node: '>= 0.4'}
+
+ is-core-module@2.15.1:
+ resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==}
+ engines: {node: '>= 0.4'}
+
+ is-data-view@1.0.1:
+ resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==}
+ engines: {node: '>= 0.4'}
+
+ is-date-object@1.0.5:
+ resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
+ engines: {node: '>= 0.4'}
+
+ is-extglob@2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
+
+ is-finalizationregistry@1.0.2:
+ resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==}
+
+ is-fullwidth-code-point@3.0.0:
+ resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+ engines: {node: '>=8'}
+
+ is-fullwidth-code-point@4.0.0:
+ resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==}
+ engines: {node: '>=12'}
- /@radix-ui/react-toggle-group@1.1.0(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-PpTJV68dZU2oqqgq75Uzto5o/XfOVgkrJ9rulVmfTKxWp3HfUjHE6CP/WLRR4AzPX9HWxw7vFow2me85Yu+Naw==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@radix-ui/primitive': 1.1.0
- '@radix-ui/react-context': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@radix-ui/react-direction': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-toggle': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@types/react': 18.2.47
- '@types/react-dom': 18.3.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
+ is-fullwidth-code-point@5.0.0:
+ resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==}
+ engines: {node: '>=18'}
- /@radix-ui/react-toggle-group@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-PpTJV68dZU2oqqgq75Uzto5o/XfOVgkrJ9rulVmfTKxWp3HfUjHE6CP/WLRR4AzPX9HWxw7vFow2me85Yu+Naw==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@radix-ui/primitive': 1.1.0
- '@radix-ui/react-context': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-direction': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-toggle': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@types/react': 18.3.4
- '@types/react-dom': 18.3.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
+ is-generator-function@1.0.10:
+ resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==}
+ engines: {node: '>= 0.4'}
- /@radix-ui/react-toggle@1.1.0(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-gwoxaKZ0oJ4vIgzsfESBuSgJNdc0rv12VhHgcqN0TEJmmZixXG/2XpsLK8kzNWYcnaoRIEEQc0bEi3dIvdUpjw==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@radix-ui/primitive': 1.1.0
- '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@types/react': 18.2.47
- '@types/react-dom': 18.3.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
+ is-glob@4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
- /@radix-ui/react-toggle@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-gwoxaKZ0oJ4vIgzsfESBuSgJNdc0rv12VhHgcqN0TEJmmZixXG/2XpsLK8kzNWYcnaoRIEEQc0bEi3dIvdUpjw==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@radix-ui/primitive': 1.1.0
- '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@types/react': 18.3.4
- '@types/react-dom': 18.3.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
+ is-map@2.0.3:
+ resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
+ engines: {node: '>= 0.4'}
- /@radix-ui/react-toolbar@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-ZUKknxhMTL/4hPh+4DuaTot9aO7UD6Kupj4gqXCsBTayX1pD1L+0C2/2VZKXb4tIifQklZ3pf2hG9T+ns+FclQ==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@radix-ui/primitive': 1.1.0
- '@radix-ui/react-context': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-direction': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-separator': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-toggle-group': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@types/react': 18.3.4
- '@types/react-dom': 18.3.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
+ is-negative-zero@2.0.3:
+ resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==}
+ engines: {node: '>= 0.4'}
- /@radix-ui/react-tooltip@1.1.1(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-LLE8nzNE4MzPMw3O2zlVlkLFid3y9hMUs7uCbSHyKSo+tCN4yMCf+ZCCcfrYgsOC0TiHBPQ1mtpJ2liY3ZT3SQ==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@radix-ui/primitive': 1.1.0
- '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@radix-ui/react-context': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-id': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-slot': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1)
- '@types/react': 18.2.47
- '@types/react-dom': 18.3.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
+ is-number-object@1.0.7:
+ resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==}
+ engines: {node: '>= 0.4'}
- /@radix-ui/react-tooltip@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-9XRsLwe6Yb9B/tlnYCPVUd/TFS4J7HuOZW345DCeC6vKIxQGMZdx21RK4VoZauPD5frgkXTYVS5y90L+3YBn4w==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@radix-ui/primitive': 1.1.0
- '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-context': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-id': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-slot': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@types/react': 18.3.4
- '@types/react-dom': 18.3.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
+ is-number@7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+ engines: {node: '>=0.12.0'}
- /@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.2.47)(react@18.3.1):
- resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- dependencies:
- '@types/react': 18.2.47
- react: 18.3.1
- dev: false
+ is-obj@2.0.0:
+ resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==}
+ engines: {node: '>=8'}
- /@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.4)(react@18.3.1):
- resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- dependencies:
- '@types/react': 18.3.4
- react: 18.3.1
- dev: false
+ is-path-inside@3.0.3:
+ resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
+ engines: {node: '>=8'}
- /@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.2.47)(react@18.3.1):
- resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- dependencies:
- '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@types/react': 18.2.47
- react: 18.3.1
- dev: false
+ is-regex@1.1.4:
+ resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
+ engines: {node: '>= 0.4'}
- /@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.4)(react@18.3.1):
- resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- dependencies:
- '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@types/react': 18.3.4
- react: 18.3.1
- dev: false
+ is-set@2.0.3:
+ resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==}
+ engines: {node: '>= 0.4'}
- /@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.2.47)(react@18.3.1):
- resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- dependencies:
- '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@types/react': 18.2.47
- react: 18.3.1
- dev: false
+ is-shared-array-buffer@1.0.3:
+ resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==}
+ engines: {node: '>= 0.4'}
- /@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.4)(react@18.3.1):
- resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- dependencies:
- '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@types/react': 18.3.4
- react: 18.3.1
- dev: false
+ is-stream@3.0.0:
+ resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
- /@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.2.47)(react@18.3.1):
- resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- dependencies:
- '@types/react': 18.2.47
- react: 18.3.1
- dev: false
+ is-string@1.0.7:
+ resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==}
+ engines: {node: '>= 0.4'}
- /@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.4)(react@18.3.1):
- resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- dependencies:
- '@types/react': 18.3.4
- react: 18.3.1
- dev: false
+ is-symbol@1.0.4:
+ resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==}
+ engines: {node: '>= 0.4'}
- /@radix-ui/react-use-previous@1.1.0(@types/react@18.3.4)(react@18.3.1):
- resolution: {integrity: sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- dependencies:
- '@types/react': 18.3.4
- react: 18.3.1
- dev: false
+ is-text-path@2.0.0:
+ resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==}
+ engines: {node: '>=8'}
- /@radix-ui/react-use-rect@1.1.0(@types/react@18.2.47)(react@18.3.1):
- resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- dependencies:
- '@radix-ui/rect': 1.1.0
- '@types/react': 18.2.47
- react: 18.3.1
- dev: false
+ is-typed-array@1.1.13:
+ resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==}
+ engines: {node: '>= 0.4'}
- /@radix-ui/react-use-rect@1.1.0(@types/react@18.3.4)(react@18.3.1):
- resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- dependencies:
- '@radix-ui/rect': 1.1.0
- '@types/react': 18.3.4
- react: 18.3.1
- dev: false
+ is-weakmap@2.0.2:
+ resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==}
+ engines: {node: '>= 0.4'}
- /@radix-ui/react-use-size@1.1.0(@types/react@18.2.47)(react@18.3.1):
- resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- dependencies:
- '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@types/react': 18.2.47
- react: 18.3.1
- dev: false
+ is-weakref@1.0.2:
+ resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==}
- /@radix-ui/react-use-size@1.1.0(@types/react@18.3.4)(react@18.3.1):
- resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- dependencies:
- '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.4)(react@18.3.1)
- '@types/react': 18.3.4
- react: 18.3.1
- dev: false
+ is-weakset@2.0.3:
+ resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==}
+ engines: {node: '>= 0.4'}
+
+ isarray@2.0.5:
+ resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
- /@radix-ui/react-visually-hidden@1.1.0(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1)
- '@types/react': 18.2.47
- '@types/react-dom': 18.3.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
+ isexe@2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
- /@radix-ui/react-visually-hidden@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1)
- '@types/react': 18.3.4
- '@types/react-dom': 18.3.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
+ iterator.prototype@1.1.3:
+ resolution: {integrity: sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==}
+ engines: {node: '>= 0.4'}
- /@radix-ui/rect@1.1.0:
- resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==}
- dev: false
+ jackspeak@2.3.6:
+ resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==}
+ engines: {node: '>=14'}
- /@react-email/body@0.0.8(react@18.3.1):
- resolution: {integrity: sha512-gqdkNYlIaIw0OdpWu8KjIcQSIFvx7t2bZpXVxMMvBS859Ia1+1X3b5RNbjI3S1ZqLddUf7owOHkO4MiXGE+nxg==}
- peerDependencies:
- react: ^18.2.0
- dependencies:
- react: 18.3.1
- dev: false
+ jackspeak@3.4.3:
+ resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
- /@react-email/button@0.0.15(react@18.3.1):
- resolution: {integrity: sha512-9Zi6SO3E8PoHYDfcJTecImiHLyitYWmIRs0HE3Ogra60ZzlWP2EXu+AZqwQnhXuq+9pbgwBWNWxB5YPetNPTNA==}
- engines: {node: '>=18.0.0'}
- peerDependencies:
- react: ^18.2.0
- dependencies:
- react: 18.3.1
- dev: false
+ jiti@1.21.6:
+ resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==}
+ hasBin: true
- /@react-email/code-block@0.0.5(react@18.3.1):
- resolution: {integrity: sha512-mmInpZsSIkNaYC1y40/S0XXrIqbTzrpllP6J1JMJuDOBG8l5T7pNl4V+gwfsSTvy9hVsuzQFmhHK8kVb1UXv3A==}
- engines: {node: '>=18.0.0'}
- peerDependencies:
- react: ^18.2.0
- dependencies:
- prismjs: 1.29.0
- react: 18.3.1
- dev: false
+ jose@5.9.6:
+ resolution: {integrity: sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==}
- /@react-email/code-inline@0.0.2(react@18.3.1):
- resolution: {integrity: sha512-0cmgbbibFeOJl0q04K9jJlPDuJ+SEiX/OG6m3Ko7UOkG3TqjRD8Dtvkij6jNDVfUh/zESpqJCP2CxrCLLMUjdA==}
- engines: {node: '>=18.0.0'}
- peerDependencies:
- react: ^18.2.0
- dependencies:
- react: 18.3.1
- dev: false
+ js-tokens@4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
- /@react-email/column@0.0.10(react@18.3.1):
- resolution: {integrity: sha512-MnP8Mnwipr0X3XtdD6jMLckb0sI5/IlS6Kl/2F6/rsSWBJy5Gg6nizlekTdkwDmy0kNSe3/1nGU0Zqo98pl63Q==}
- engines: {node: '>=18.0.0'}
- peerDependencies:
- react: ^18.2.0
- dependencies:
- react: 18.3.1
- dev: false
+ js-yaml@4.1.0:
+ resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
+ hasBin: true
- /@react-email/components@0.0.21(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-fwGfH7FF+iuq+IdPcbEO5HoF0Pakk9big+fFW9+3kiyvbSNuo8Io1rhPTMLd8q41XomN4g7mgWovdAeS/8PHrA==}
- engines: {node: '>=18.0.0'}
- peerDependencies:
- react: ^18.2.0
- dependencies:
- '@react-email/body': 0.0.8(react@18.3.1)
- '@react-email/button': 0.0.15(react@18.3.1)
- '@react-email/code-block': 0.0.5(react@18.3.1)
- '@react-email/code-inline': 0.0.2(react@18.3.1)
- '@react-email/column': 0.0.10(react@18.3.1)
- '@react-email/container': 0.0.12(react@18.3.1)
- '@react-email/font': 0.0.6(react@18.3.1)
- '@react-email/head': 0.0.9(react@18.3.1)
- '@react-email/heading': 0.0.12(@types/react@18.3.4)(react@18.3.1)
- '@react-email/hr': 0.0.8(react@18.3.1)
- '@react-email/html': 0.0.8(react@18.3.1)
- '@react-email/img': 0.0.8(react@18.3.1)
- '@react-email/link': 0.0.8(react@18.3.1)
- '@react-email/markdown': 0.0.10(react@18.3.1)
- '@react-email/preview': 0.0.9(react@18.3.1)
- '@react-email/render': 0.0.16(react-dom@18.3.1)(react@18.3.1)
- '@react-email/row': 0.0.8(react@18.3.1)
- '@react-email/section': 0.0.12(react@18.3.1)
- '@react-email/tailwind': 0.0.18(react@18.3.1)
- '@react-email/text': 0.0.8(react@18.3.1)
- react: 18.3.1
- transitivePeerDependencies:
- - '@types/react'
- - react-dom
- dev: false
+ jsesc@3.0.2:
+ resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==}
+ engines: {node: '>=6'}
+ hasBin: true
- /@react-email/container@0.0.12(react@18.3.1):
- resolution: {integrity: sha512-HFu8Pu5COPFfeZxSL+wKv/TV5uO/sp4zQ0XkRCdnGkj/xoq0lqOHVDL4yC2Pu6fxXF/9C3PHDA++5uEYV5WVJw==}
- engines: {node: '>=18.0.0'}
- peerDependencies:
- react: ^18.2.0
- dependencies:
- react: 18.3.1
- dev: false
+ json-buffer@3.0.1:
+ resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
- /@react-email/font@0.0.6(react@18.3.1):
- resolution: {integrity: sha512-sZZFvEZ4U3vNCAZ8wXqIO3DuGJR2qE/8m2fEH+tdqwa532zGO3zW+UlCTg0b9455wkJSzEBeaWik0IkNvjXzxw==}
- peerDependencies:
- react: ^18.2.0
- dependencies:
- react: 18.3.1
- dev: false
+ json-parse-even-better-errors@2.3.1:
+ resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
- /@react-email/head@0.0.9(react@18.3.1):
- resolution: {integrity: sha512-dF3Uv1qy3oh+IU2atXdv5Xk0hk2udOlMb1A/MNGngC0eHyoEV9ThA0XvhN7mm5x9dDLkVamoWUKXDtmkiuSRqQ==}
- engines: {node: '>=18.0.0'}
- peerDependencies:
- react: ^18.2.0
- dependencies:
- react: 18.3.1
- dev: false
+ json-schema-traverse@0.4.1:
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
- /@react-email/heading@0.0.12(@types/react@18.3.4)(react@18.3.1):
- resolution: {integrity: sha512-eB7mpnAvDmwvQLoPuwEiPRH4fPXWe6ltz6Ptbry2BlI88F0a2k11Ghb4+sZHBqg7vVw/MKbqEgtLqr3QJ/KfCQ==}
- engines: {node: '>=18.0.0'}
- peerDependencies:
- react: ^18.2.0
- dependencies:
- '@radix-ui/react-slot': 1.0.2(@types/react@18.3.4)(react@18.3.1)
- react: 18.3.1
- transitivePeerDependencies:
- - '@types/react'
- dev: false
+ json-schema-traverse@1.0.0:
+ resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
- /@react-email/hr@0.0.8(react@18.3.1):
- resolution: {integrity: sha512-JLVvpCg2wYKEB+n/PGCggWG9fRU5e4lxsGdpK5SDLsCL0ic3OLKSpHMfeE+ZSuw0GixAVVQN7F64PVJHQkd4MQ==}
- engines: {node: '>=18.0.0'}
- peerDependencies:
- react: ^18.2.0
- dependencies:
- react: 18.3.1
- dev: false
+ json-stable-stringify-without-jsonify@1.0.1:
+ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
- /@react-email/html@0.0.8(react@18.3.1):
- resolution: {integrity: sha512-arII3wBNLpeJtwyIJXPaILm5BPKhA+nvdC1F9QkuKcOBJv2zXctn8XzPqyGqDfdplV692ulNJP7XY55YqbKp6w==}
- engines: {node: '>=18.0.0'}
- peerDependencies:
- react: ^18.2.0
- dependencies:
- react: 18.3.1
- dev: false
+ json5@1.0.2:
+ resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
+ hasBin: true
- /@react-email/img@0.0.8(react@18.3.1):
- resolution: {integrity: sha512-jx/rPuKo31tV18fu7P5rRqelaH5wkhg83Dq7uLwJpfqhbi4KFBGeBfD0Y3PiLPPoh+WvYf+Adv9W2ghNW8nOMQ==}
- engines: {node: '>=18.0.0'}
- peerDependencies:
- react: ^18.2.0
- dependencies:
- react: 18.3.1
- dev: false
+ json5@2.2.3:
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+ engines: {node: '>=6'}
+ hasBin: true
- /@react-email/link@0.0.8(react@18.3.1):
- resolution: {integrity: sha512-nVikuTi8WJHa6Baad4VuRUbUCa/7EtZ1Qy73TRejaCHn+vhetc39XGqHzKLNh+Z/JFL8Hv9g+4AgG16o2R0ogQ==}
- engines: {node: '>=18.0.0'}
- peerDependencies:
- react: ^18.2.0
- dependencies:
- react: 18.3.1
- dev: false
+ jsonparse@1.3.1:
+ resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==}
+ engines: {'0': node >= 0.2.0}
- /@react-email/markdown@0.0.10(react@18.3.1):
- resolution: {integrity: sha512-MH0xO+NJ4IuJcx9nyxbgGKAMXyudFjCZ0A2GQvuWajemW9qy2hgnJ3mW3/z5lwcenG+JPn7JyO/iZpizQ7u1tA==}
- engines: {node: '>=18.0.0'}
- peerDependencies:
- react: ^18.2.0
- dependencies:
- md-to-react-email: 5.0.2(react@18.3.1)
- react: 18.3.1
- dev: false
+ jsx-ast-utils@3.3.5:
+ resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==}
+ engines: {node: '>=4.0'}
- /@react-email/preview@0.0.9(react@18.3.1):
- resolution: {integrity: sha512-2fyAA/zzZYfYmxfyn3p2YOIU30klyA6Dq4ytyWq4nfzQWWglt5hNDE0cMhObvRtfjM9ghMSVtoELAb0MWiF/kw==}
- engines: {node: '>=18.0.0'}
- peerDependencies:
- react: ^18.2.0
- dependencies:
- react: 18.3.1
- dev: false
+ keyv@4.5.4:
+ resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
- /@react-email/render@0.0.16(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-wDaMy27xAq1cJHtSFptp0DTKPuV2GYhloqia95ub/DH9Dea1aWYsbdM918MOc/b/HvVS3w1z8DWzfAk13bGStQ==}
- engines: {node: '>=18.0.0'}
- peerDependencies:
- react: ^18.2.0
- react-dom: ^18.2.0
- dependencies:
- html-to-text: 9.0.5
- js-beautify: 1.15.1
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- react-promise-suspense: 0.3.4
- dev: false
+ language-subtag-registry@0.3.23:
+ resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==}
- /@react-email/row@0.0.8(react@18.3.1):
- resolution: {integrity: sha512-JsB6pxs/ZyjYpEML3nbwJRGAerjcN/Pa/QG48XUwnT/MioDWrUuyQuefw+CwCrSUZ2P1IDrv2tUD3/E3xzcoKw==}
- engines: {node: '>=18.0.0'}
- peerDependencies:
- react: ^18.2.0
- dependencies:
- react: 18.3.1
- dev: false
+ language-tags@1.0.9:
+ resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==}
+ engines: {node: '>=0.10'}
- /@react-email/section@0.0.12(react@18.3.1):
- resolution: {integrity: sha512-UCD/N/BeOTN4h3VZBUaFdiSem6HnpuxD1Q51TdBFnqeNqS5hBomp8LWJJ9s4gzwHWk1XPdNfLA3I/fJwulJshg==}
- engines: {node: '>=18.0.0'}
+ lenis@1.1.14:
+ resolution: {integrity: sha512-dzIeiOCdBL/7Tjh6jU8iN5j1uu5R3PIQwRYipS4C8POPyTH1pHyux3HDyvcGuLqNNsEztZjkmwfPii2cPLXBbg==}
peerDependencies:
- react: ^18.2.0
- dependencies:
- react: 18.3.1
- dev: false
+ react: '>=17.0.0'
+ vue: '>=3.0.0'
+ peerDependenciesMeta:
+ react:
+ optional: true
+ vue:
+ optional: true
- /@react-email/tailwind@0.0.18(react@18.3.1):
- resolution: {integrity: sha512-ob8CXX/Pqq1U8YfL5OJTL48WJkixizyoXMMRYTiDLDN9LVLU7lSLtcK9kOD9CgFbO2yUPQr7/5+7gnQJ+cXa8Q==}
- engines: {node: '>=18.0.0'}
- peerDependencies:
- react: ^18.2.0
- dependencies:
- react: 18.3.1
- dev: false
+ levn@0.4.1:
+ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
+ engines: {node: '>= 0.8.0'}
- /@react-email/text@0.0.8(react@18.3.1):
- resolution: {integrity: sha512-uvN2TNWMrfC9wv/LLmMLbbEN1GrMWZb9dBK14eYxHHAEHCeyvGb5ePZZ2MPyzO7Y5yTC+vFEnCEr76V+hWMxCQ==}
- engines: {node: '>=18.0.0'}
- peerDependencies:
- react: ^18.2.0
- dependencies:
- react: 18.3.1
- dev: false
+ lilconfig@2.1.0:
+ resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
+ engines: {node: '>=10'}
- /@rollup/rollup-android-arm-eabi@4.21.0:
- resolution: {integrity: sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA==}
- cpu: [arm]
- os: [android]
- requiresBuild: true
- dev: true
- optional: true
+ lilconfig@3.1.2:
+ resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==}
+ engines: {node: '>=14'}
- /@rollup/rollup-android-arm64@4.21.0:
- resolution: {integrity: sha512-a1sR2zSK1B4eYkiZu17ZUZhmUQcKjk2/j9Me2IDjk1GHW7LB5Z35LEzj9iJch6gtUfsnvZs1ZNyDW2oZSThrkA==}
- cpu: [arm64]
- os: [android]
- requiresBuild: true
- dev: true
- optional: true
+ lines-and-columns@1.2.4:
+ resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
- /@rollup/rollup-darwin-arm64@4.21.0:
- resolution: {integrity: sha512-zOnKWLgDld/svhKO5PD9ozmL6roy5OQ5T4ThvdYZLpiOhEGY+dp2NwUmxK0Ld91LrbjrvtNAE0ERBwjqhZTRAA==}
- cpu: [arm64]
- os: [darwin]
- requiresBuild: true
- dev: true
- optional: true
+ lint-staged@15.2.10:
+ resolution: {integrity: sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg==}
+ engines: {node: '>=18.12.0'}
+ hasBin: true
- /@rollup/rollup-darwin-x64@4.21.0:
- resolution: {integrity: sha512-7doS8br0xAkg48SKE2QNtMSFPFUlRdw9+votl27MvT46vo44ATBmdZdGysOevNELmZlfd+NEa0UYOA8f01WSrg==}
- cpu: [x64]
- os: [darwin]
- requiresBuild: true
- dev: true
- optional: true
+ listr2@8.2.5:
+ resolution: {integrity: sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==}
+ engines: {node: '>=18.0.0'}
- /@rollup/rollup-linux-arm-gnueabihf@4.21.0:
- resolution: {integrity: sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA==}
- cpu: [arm]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
+ locate-path@6.0.0:
+ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+ engines: {node: '>=10'}
- /@rollup/rollup-linux-arm-musleabihf@4.21.0:
- resolution: {integrity: sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w==}
- cpu: [arm]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
+ locate-path@7.2.0:
+ resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
- /@rollup/rollup-linux-arm64-gnu@4.21.0:
- resolution: {integrity: sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w==}
- cpu: [arm64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
+ lodash.camelcase@4.3.0:
+ resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==}
- /@rollup/rollup-linux-arm64-musl@4.21.0:
- resolution: {integrity: sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw==}
- cpu: [arm64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
+ lodash.isplainobject@4.0.6:
+ resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==}
- /@rollup/rollup-linux-powerpc64le-gnu@4.21.0:
- resolution: {integrity: sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg==}
- cpu: [ppc64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
+ lodash.kebabcase@4.1.1:
+ resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==}
- /@rollup/rollup-linux-riscv64-gnu@4.21.0:
- resolution: {integrity: sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg==}
- cpu: [riscv64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
+ lodash.merge@4.6.2:
+ resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
- /@rollup/rollup-linux-s390x-gnu@4.21.0:
- resolution: {integrity: sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw==}
- cpu: [s390x]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
+ lodash.mergewith@4.6.2:
+ resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==}
- /@rollup/rollup-linux-x64-gnu@4.21.0:
- resolution: {integrity: sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg==}
- cpu: [x64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
+ lodash.snakecase@4.1.1:
+ resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==}
- /@rollup/rollup-linux-x64-musl@4.21.0:
- resolution: {integrity: sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ==}
- cpu: [x64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
+ lodash.startcase@4.4.0:
+ resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==}
- /@rollup/rollup-win32-arm64-msvc@4.21.0:
- resolution: {integrity: sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ==}
- cpu: [arm64]
- os: [win32]
- requiresBuild: true
- dev: true
- optional: true
+ lodash.uniq@4.5.0:
+ resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==}
- /@rollup/rollup-win32-ia32-msvc@4.21.0:
- resolution: {integrity: sha512-G9+TEqRnAA6nbpqyUqgTiopmnfgnMkR3kMukFBDsiyy23LZvUCpiUwjTRx6ezYCjJODXrh52rBR9oXvm+Fp5wg==}
- cpu: [ia32]
- os: [win32]
- requiresBuild: true
- dev: true
- optional: true
+ lodash.upperfirst@4.3.1:
+ resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==}
- /@rollup/rollup-win32-x64-msvc@4.21.0:
- resolution: {integrity: sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ==}
- cpu: [x64]
- os: [win32]
- requiresBuild: true
- dev: true
- optional: true
+ log-update@6.1.0:
+ resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==}
+ engines: {node: '>=18'}
- /@rushstack/eslint-patch@1.10.4:
- resolution: {integrity: sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==}
- dev: true
+ loose-envify@1.4.0:
+ resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
+ hasBin: true
- /@selderee/plugin-htmlparser2@0.11.0:
- resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==}
- dependencies:
- domhandler: 5.0.3
- selderee: 0.11.0
- dev: false
+ lru-cache@10.4.3:
+ resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
- /@sinclair/typebox@0.27.8:
- resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==}
+ lru-cache@5.1.1:
+ resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
- /@socket.io/component-emitter@3.1.2:
- resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==}
- dev: false
+ lucide-react@0.453.0:
+ resolution: {integrity: sha512-kL+RGZCcJi9BvJtzg2kshO192Ddy9hv3ij+cPrVPWSRzgCWCVazoQJxOjAwgK53NomL07HB7GPHW120FimjNhQ==}
+ peerDependencies:
+ react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc
- /@swc/core-darwin-arm64@1.3.101:
- resolution: {integrity: sha512-mNFK+uHNPRXSnfTOG34zJOeMl2waM4hF4a2NY7dkMXrPqw9CoJn4MwTXJcyMiSz1/BnNjjTCHF3Yhj0jPxmkzQ==}
- engines: {node: '>=10'}
- cpu: [arm64]
- os: [darwin]
- requiresBuild: true
- dev: false
- optional: true
+ meow@12.1.1:
+ resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==}
+ engines: {node: '>=16.10'}
- /@swc/core-darwin-x64@1.3.101:
- resolution: {integrity: sha512-B085j8XOx73Fg15KsHvzYWG262bRweGr3JooO1aW5ec5pYbz5Ew9VS5JKYS03w2UBSxf2maWdbPz2UFAxg0whw==}
- engines: {node: '>=10'}
- cpu: [x64]
- os: [darwin]
- requiresBuild: true
- dev: false
- optional: true
+ merge-stream@2.0.0:
+ resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
- /@swc/core-linux-arm-gnueabihf@1.3.101:
- resolution: {integrity: sha512-9xLKRb6zSzRGPqdz52Hy5GuB1lSjmLqa0lST6MTFads3apmx4Vgs8Y5NuGhx/h2I8QM4jXdLbpqQlifpzTlSSw==}
- engines: {node: '>=10'}
- cpu: [arm]
- os: [linux]
- requiresBuild: true
- dev: false
- optional: true
+ merge2@1.4.1:
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+ engines: {node: '>= 8'}
- /@swc/core-linux-arm64-gnu@1.3.101:
- resolution: {integrity: sha512-oE+r1lo7g/vs96Weh2R5l971dt+ZLuhaUX+n3BfDdPxNHfObXgKMjO7E+QS5RbGjv/AwiPCxQmbdCp/xN5ICJA==}
- engines: {node: '>=10'}
- cpu: [arm64]
- os: [linux]
- requiresBuild: true
- dev: false
- optional: true
+ micromatch@4.0.8:
+ resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
+ engines: {node: '>=8.6'}
- /@swc/core-linux-arm64-musl@1.3.101:
- resolution: {integrity: sha512-OGjYG3H4BMOTnJWJyBIovCez6KiHF30zMIu4+lGJTCrxRI2fAjGLml3PEXj8tC3FMcud7U2WUn6TdG0/te2k6g==}
- engines: {node: '>=10'}
- cpu: [arm64]
- os: [linux]
- requiresBuild: true
- dev: false
- optional: true
+ mime-db@1.52.0:
+ resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
+ engines: {node: '>= 0.6'}
- /@swc/core-linux-x64-gnu@1.3.101:
- resolution: {integrity: sha512-/kBMcoF12PRO/lwa8Z7w4YyiKDcXQEiLvM+S3G9EvkoKYGgkkz4Q6PSNhF5rwg/E3+Hq5/9D2R+6nrkF287ihg==}
- engines: {node: '>=10'}
- cpu: [x64]
- os: [linux]
- requiresBuild: true
- dev: false
- optional: true
+ mime-types@2.1.35:
+ resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+ engines: {node: '>= 0.6'}
- /@swc/core-linux-x64-musl@1.3.101:
- resolution: {integrity: sha512-kDN8lm4Eew0u1p+h1l3JzoeGgZPQ05qDE0czngnjmfpsH2sOZxVj1hdiCwS5lArpy7ktaLu5JdRnx70MkUzhXw==}
- engines: {node: '>=10'}
- cpu: [x64]
- os: [linux]
- requiresBuild: true
- dev: false
- optional: true
+ mimic-fn@4.0.0:
+ resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==}
+ engines: {node: '>=12'}
- /@swc/core-win32-arm64-msvc@1.3.101:
- resolution: {integrity: sha512-9Wn8TTLWwJKw63K/S+jjrZb9yoJfJwCE2RV5vPCCWmlMf3U1AXj5XuWOLUX+Rp2sGKau7wZKsvywhheWm+qndQ==}
- engines: {node: '>=10'}
- cpu: [arm64]
- os: [win32]
- requiresBuild: true
- dev: false
- optional: true
+ mimic-function@5.0.1:
+ resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==}
+ engines: {node: '>=18'}
+
+ minimatch@3.1.2:
+ resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+
+ minimatch@9.0.5:
+ resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
+ engines: {node: '>=16 || 14 >=14.17'}
- /@swc/core-win32-ia32-msvc@1.3.101:
- resolution: {integrity: sha512-onO5KvICRVlu2xmr4//V2je9O2XgS1SGKpbX206KmmjcJhXN5EYLSxW9qgg+kgV5mip+sKTHTAu7IkzkAtElYA==}
- engines: {node: '>=10'}
- cpu: [ia32]
- os: [win32]
- requiresBuild: true
- dev: false
- optional: true
+ minimist@1.2.8:
+ resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
- /@swc/core-win32-x64-msvc@1.3.101:
- resolution: {integrity: sha512-T3GeJtNQV00YmiVw/88/nxJ/H43CJvFnpvBHCVn17xbahiVUOPOduh3rc9LgAkKiNt/aV8vU3OJR+6PhfMR7UQ==}
- engines: {node: '>=10'}
- cpu: [x64]
- os: [win32]
- requiresBuild: true
- dev: false
- optional: true
+ minipass@7.1.2:
+ resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
+ engines: {node: '>=16 || 14 >=14.17'}
- /@swc/core@1.3.101:
- resolution: {integrity: sha512-w5aQ9qYsd/IYmXADAnkXPGDMTqkQalIi+kfFf/MHRKTpaOL7DHjMXwPp/n8hJ0qNjRvchzmPtOqtPBiER50d8A==}
- engines: {node: '>=10'}
- requiresBuild: true
- peerDependencies:
- '@swc/helpers': ^0.5.0
- peerDependenciesMeta:
- '@swc/helpers':
- optional: true
- dependencies:
- '@swc/counter': 0.1.3
- '@swc/types': 0.1.12
- optionalDependencies:
- '@swc/core-darwin-arm64': 1.3.101
- '@swc/core-darwin-x64': 1.3.101
- '@swc/core-linux-arm-gnueabihf': 1.3.101
- '@swc/core-linux-arm64-gnu': 1.3.101
- '@swc/core-linux-arm64-musl': 1.3.101
- '@swc/core-linux-x64-gnu': 1.3.101
- '@swc/core-linux-x64-musl': 1.3.101
- '@swc/core-win32-arm64-msvc': 1.3.101
- '@swc/core-win32-ia32-msvc': 1.3.101
- '@swc/core-win32-x64-msvc': 1.3.101
- dev: false
-
- /@swc/counter@0.1.3:
- resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==}
- dev: false
+ ms@2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
- /@swc/helpers@0.5.2:
- resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==}
- dependencies:
- tslib: 2.7.0
- dev: false
+ mz@2.7.0:
+ resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
- /@swc/helpers@0.5.5:
- resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==}
- dependencies:
- '@swc/counter': 0.1.3
- tslib: 2.7.0
- dev: false
+ nanoid@3.3.7:
+ resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
- /@swc/types@0.1.12:
- resolution: {integrity: sha512-wBJA+SdtkbFhHjTMYH+dEH1y4VpfGdAc2Kw/LK09i9bXd/K6j6PkDcFCEzb6iVfZMkPRrl/q0e3toqTAJdkIVA==}
- dependencies:
- '@swc/counter': 0.1.3
- dev: false
+ natural-compare@1.4.0:
+ resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
- /@t3-oss/env-core@0.10.1(typescript@5.5.4)(zod@3.23.8):
- resolution: {integrity: sha512-GcKZiCfWks5CTxhezn9k5zWX3sMDIYf6Kaxy2Gx9YEQftFcz8hDRN56hcbylyAO3t4jQnQ5ifLawINsNgCDpOg==}
+ next-auth@5.0.0-beta.25:
+ resolution: {integrity: sha512-2dJJw1sHQl2qxCrRk+KTQbeH+izFbGFPuJj5eGgBZFYyiYYtvlrBeUw1E/OJJxTRjuxbSYGnCTkUIRsIIW0bog==}
peerDependencies:
- typescript: '>=5.0.0'
- zod: ^3.0.0
+ '@simplewebauthn/browser': ^9.0.1
+ '@simplewebauthn/server': ^9.0.2
+ next: ^14.0.0-0 || ^15.0.0-0
+ nodemailer: ^6.6.5
+ react: ^18.2.0 || ^19.0.0-0
peerDependenciesMeta:
- typescript:
+ '@simplewebauthn/browser':
optional: true
- dependencies:
- typescript: 5.5.4
- zod: 3.23.8
- dev: false
-
- /@t3-oss/env-nextjs@0.10.1(typescript@5.5.4)(zod@3.23.8):
- resolution: {integrity: sha512-iy2qqJLnFh1RjEWno2ZeyTu0ufomkXruUsOZludzDIroUabVvHsrSjtkHqwHp1/pgPUzN3yBRHMILW162X7x2Q==}
- peerDependencies:
- typescript: '>=5.0.0'
- zod: ^3.0.0
- peerDependenciesMeta:
- typescript:
+ '@simplewebauthn/server':
+ optional: true
+ nodemailer:
optional: true
- dependencies:
- '@t3-oss/env-core': 0.10.1(typescript@5.5.4)(zod@3.23.8)
- typescript: 5.5.4
- zod: 3.23.8
- dev: false
-
- /@tanstack/react-table@8.20.5(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-WEHopKw3znbUZ61s9i0+i9g8drmDo6asTWbrQh8Us63DAk/M0FkmIqERew6P71HI75ksZ2Pxyuf4vvKh9rAkiA==}
- engines: {node: '>=12'}
- peerDependencies:
- react: '>=16.8'
- react-dom: '>=16.8'
- dependencies:
- '@tanstack/table-core': 8.20.5
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
- /@tanstack/table-core@8.20.5:
- resolution: {integrity: sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg==}
- engines: {node: '>=12'}
- dev: false
+ next-nprogress-bar@2.3.14:
+ resolution: {integrity: sha512-r2zdo5SFakm1CSYLBo2/+9X2F5NRnbV/LI1b/Iu3mFLa9ln+Dlwx3vjJc3kVHI4i42jRC0an++obVHeWkYU6gA==}
- /@testing-library/dom@10.4.0:
- resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==}
- engines: {node: '>=18'}
- dependencies:
- '@babel/code-frame': 7.24.7
- '@babel/runtime': 7.25.4
- '@types/aria-query': 5.0.4
- aria-query: 5.3.0
- chalk: 4.1.2
- dom-accessibility-api: 0.5.16
- lz-string: 1.5.0
- pretty-format: 27.5.1
- dev: true
-
- /@testing-library/jest-dom@6.5.0:
- resolution: {integrity: sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==}
- engines: {node: '>=14', npm: '>=6', yarn: '>=1'}
- dependencies:
- '@adobe/css-tools': 4.4.0
- aria-query: 5.3.0
- chalk: 3.0.0
- css.escape: 1.5.1
- dom-accessibility-api: 0.6.3
- lodash: 4.17.21
- redent: 3.0.0
- dev: true
-
- /@testing-library/react@16.0.0(@testing-library/dom@10.4.0)(@types/react-dom@18.3.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-guuxUKRWQ+FgNX0h0NS0FIq3Q3uLtWVpBzcLOggmfMoUpgBnzBzvLLd4fbm6yS8ydJd94cIfY4yP9qUQjM2KwQ==}
- engines: {node: '>=18'}
+ next@15.0.1:
+ resolution: {integrity: sha512-PSkFkr/w7UnFWm+EP8y/QpHrJXMqpZzAXpergB/EqLPOh4SGPJXv1wj4mslr2hUZBAS9pX7/9YLIdxTv6fwytw==}
+ engines: {node: '>=18.18.0'}
+ hasBin: true
peerDependencies:
- '@testing-library/dom': ^10.0.0
- '@types/react': ^18.0.0
- '@types/react-dom': ^18.0.0
- react: ^18.0.0
- react-dom: ^18.0.0
+ '@opentelemetry/api': ^1.1.0
+ '@playwright/test': ^1.41.2
+ babel-plugin-react-compiler: '*'
+ react: ^18.2.0 || 19.0.0-rc-69d4b800-20241021
+ react-dom: ^18.2.0 || 19.0.0-rc-69d4b800-20241021
+ sass: ^1.3.0
peerDependenciesMeta:
- '@types/react':
+ '@opentelemetry/api':
optional: true
- '@types/react-dom':
+ '@playwright/test':
+ optional: true
+ babel-plugin-react-compiler:
+ optional: true
+ sass:
optional: true
- dependencies:
- '@babel/runtime': 7.25.4
- '@testing-library/dom': 10.4.0
- '@types/react': 18.3.4
- '@types/react-dom': 18.3.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: true
- /@testing-library/user-event@14.5.2(@testing-library/dom@10.4.0):
- resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==}
- engines: {node: '>=12', npm: '>=6'}
- peerDependencies:
- '@testing-library/dom': '>=7.21.4'
- dependencies:
- '@testing-library/dom': 10.4.0
- dev: true
+ node-releases@2.0.18:
+ resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==}
- /@types/aria-query@5.0.4:
- resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==}
- dev: true
+ normalize-path@3.0.0:
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+ engines: {node: '>=0.10.0'}
- /@types/babel__core@7.20.5:
- resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
- dependencies:
- '@babel/parser': 7.25.4
- '@babel/types': 7.25.4
- '@types/babel__generator': 7.6.8
- '@types/babel__template': 7.4.4
- '@types/babel__traverse': 7.20.6
- dev: true
+ npm-run-path@5.3.0:
+ resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
- /@types/babel__generator@7.6.8:
- resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==}
- dependencies:
- '@babel/types': 7.25.4
- dev: true
+ nprogress@0.2.0:
+ resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==}
- /@types/babel__template@7.4.4:
- resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==}
- dependencies:
- '@babel/parser': 7.25.4
- '@babel/types': 7.25.4
- dev: true
+ oauth4webapi@3.1.2:
+ resolution: {integrity: sha512-KQZkNU+xn02lWrFu5Vjqg9E81yPtDSxUZorRHlLWVoojD+H/0GFbH59kcnz5Thdjj7c4/mYMBPj/mhvGe/kKXA==}
- /@types/babel__traverse@7.20.6:
- resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==}
- dependencies:
- '@babel/types': 7.25.4
- dev: true
+ object-assign@4.1.1:
+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+ engines: {node: '>=0.10.0'}
- /@types/cookie@0.4.1:
- resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==}
- dev: false
+ object-hash@3.0.0:
+ resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
+ engines: {node: '>= 6'}
- /@types/cookie@0.6.0:
- resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==}
- dev: false
+ object-inspect@1.13.2:
+ resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==}
+ engines: {node: '>= 0.4'}
- /@types/cors@2.8.17:
- resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==}
- dependencies:
- '@types/node': 20.16.1
- dev: false
+ object-keys@1.1.1:
+ resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
+ engines: {node: '>= 0.4'}
- /@types/d3-array@3.2.1:
- resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==}
- dev: false
+ object.assign@4.1.5:
+ resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==}
+ engines: {node: '>= 0.4'}
- /@types/d3-color@3.1.3:
- resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==}
- dev: false
+ object.entries@1.1.8:
+ resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==}
+ engines: {node: '>= 0.4'}
- /@types/d3-ease@3.0.2:
- resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==}
- dev: false
+ object.fromentries@2.0.8:
+ resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==}
+ engines: {node: '>= 0.4'}
- /@types/d3-interpolate@3.0.4:
- resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==}
- dependencies:
- '@types/d3-color': 3.1.3
- dev: false
+ object.groupby@1.0.3:
+ resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==}
+ engines: {node: '>= 0.4'}
- /@types/d3-path@3.1.0:
- resolution: {integrity: sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==}
- dev: false
+ object.values@1.2.0:
+ resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==}
+ engines: {node: '>= 0.4'}
- /@types/d3-scale@4.0.8:
- resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==}
- dependencies:
- '@types/d3-time': 3.0.3
- dev: false
+ once@1.4.0:
+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
- /@types/d3-shape@3.1.6:
- resolution: {integrity: sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==}
- dependencies:
- '@types/d3-path': 3.1.0
- dev: false
+ onetime@6.0.0:
+ resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==}
+ engines: {node: '>=12'}
- /@types/d3-time@3.0.3:
- resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==}
- dev: false
+ onetime@7.0.0:
+ resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==}
+ engines: {node: '>=18'}
- /@types/d3-timer@3.0.2:
- resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==}
- dev: false
+ optionator@0.9.4:
+ resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
+ engines: {node: '>= 0.8.0'}
- /@types/estree@1.0.5:
- resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
+ p-limit@3.1.0:
+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+ engines: {node: '>=10'}
- /@types/istanbul-lib-coverage@2.0.6:
- resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==}
- dev: false
+ p-limit@4.0.0:
+ resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
- /@types/istanbul-lib-report@3.0.3:
- resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==}
- dependencies:
- '@types/istanbul-lib-coverage': 2.0.6
- dev: false
+ p-locate@5.0.0:
+ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+ engines: {node: '>=10'}
- /@types/istanbul-reports@3.0.4:
- resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==}
- dependencies:
- '@types/istanbul-lib-report': 3.0.3
- dev: false
+ p-locate@6.0.0:
+ resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
- /@types/jest-axe@3.5.9:
- resolution: {integrity: sha512-z98CzR0yVDalCEuhGXXO4/zN4HHuSebAukXDjTLJyjEAgoUf1H1i+sr7SUB/mz8CRS/03/XChsx0dcLjHkndoQ==}
- dependencies:
- '@types/jest': 29.5.12
- axe-core: 3.5.6
- dev: false
+ package-json-from-dist@1.0.1:
+ resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
- /@types/jest@29.5.12:
- resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==}
- dependencies:
- expect: 29.7.0
- pretty-format: 29.7.0
- dev: false
+ parent-module@1.0.1:
+ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+ engines: {node: '>=6'}
- /@types/json-schema@7.0.15:
- resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+ parse-json@5.2.0:
+ resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
+ engines: {node: '>=8'}
- /@types/json5@0.0.29:
- resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
- dev: true
+ path-exists@4.0.0:
+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+ engines: {node: '>=8'}
- /@types/node@20.16.1:
- resolution: {integrity: sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ==}
- dependencies:
- undici-types: 6.19.8
+ path-exists@5.0.0:
+ resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
- /@types/normalize-package-data@2.4.4:
- resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==}
- dev: true
+ path-is-absolute@1.0.1:
+ resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
+ engines: {node: '>=0.10.0'}
- /@types/prismjs@1.26.4:
- resolution: {integrity: sha512-rlAnzkW2sZOjbqZ743IHUhFcvzaGbqijwOu8QZnZCjfQzBqFE3s4lOTJEsxikImav9uzz/42I+O7YUs1mWgMlg==}
- dev: false
+ path-key@3.1.1:
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+ engines: {node: '>=8'}
- /@types/prop-types@15.7.12:
- resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==}
+ path-key@4.0.0:
+ resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
+ engines: {node: '>=12'}
- /@types/react-dom@18.3.0:
- resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==}
- dependencies:
- '@types/react': 18.3.4
+ path-parse@1.0.7:
+ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
- /@types/react@18.2.47:
- resolution: {integrity: sha512-xquNkkOirwyCgoClNk85BjP+aqnIS+ckAJ8i37gAbDs14jfW/J23f2GItAf33oiUPQnqNMALiFeoM9Y5mbjpVQ==}
- dependencies:
- '@types/prop-types': 15.7.12
- '@types/scheduler': 0.23.0
- csstype: 3.1.3
- dev: false
+ path-scurry@1.11.1:
+ resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
+ engines: {node: '>=16 || 14 >=14.18'}
- /@types/react@18.3.4:
- resolution: {integrity: sha512-J7W30FTdfCxDDjmfRM+/JqLHBIyl7xUIp9kwK637FGmY7+mkSFSe6L4jpZzhj5QMfLssSDP4/i75AKkrdC7/Jw==}
- dependencies:
- '@types/prop-types': 15.7.12
- csstype: 3.1.3
+ picocolors@1.1.1:
+ resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
- /@types/scheduler@0.23.0:
- resolution: {integrity: sha512-YIoDCTH3Af6XM5VuwGG/QL/CJqga1Zm3NkU3HZ4ZHK2fRMPYP1VczsTUqtsf43PH/iJNVlPHAo2oWX7BSdB2Hw==}
- dev: false
+ picomatch@2.3.1:
+ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+ engines: {node: '>=8.6'}
- /@types/semver@7.5.8:
- resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==}
- dev: true
+ pidtree@0.6.0:
+ resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==}
+ engines: {node: '>=0.10'}
+ hasBin: true
- /@types/stack-utils@2.0.3:
- resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==}
- dev: false
+ pify@2.3.0:
+ resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
+ engines: {node: '>=0.10.0'}
- /@types/webpack@5.28.5(@swc/core@1.3.101)(esbuild@0.19.11):
- resolution: {integrity: sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw==}
- dependencies:
- '@types/node': 20.16.1
- tapable: 2.2.1
- webpack: 5.94.0(@swc/core@1.3.101)(esbuild@0.19.11)
- transitivePeerDependencies:
- - '@swc/core'
- - esbuild
- - uglify-js
- - webpack-cli
- dev: false
+ pirates@4.0.6:
+ resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==}
+ engines: {node: '>= 6'}
- /@types/yargs-parser@21.0.3:
- resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==}
- dev: false
+ possible-typed-array-names@1.0.0:
+ resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==}
+ engines: {node: '>= 0.4'}
- /@types/yargs@17.0.33:
- resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==}
- dependencies:
- '@types/yargs-parser': 21.0.3
- dev: false
+ postcss-import@15.1.0:
+ resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ postcss: ^8.0.0
- /@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0)(eslint@8.57.0)(typescript@5.5.4):
- resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==}
- engines: {node: ^18.18.0 || >=20.0.0}
+ postcss-js@4.0.1:
+ resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==}
+ engines: {node: ^12 || ^14 || >= 16}
peerDependencies:
- '@typescript-eslint/parser': ^7.0.0
- eslint: ^8.56.0
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
- dependencies:
- '@eslint-community/regexpp': 4.11.0
- '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.5.4)
- '@typescript-eslint/scope-manager': 7.18.0
- '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4)
- '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4)
- '@typescript-eslint/visitor-keys': 7.18.0
- eslint: 8.57.0
- graphemer: 1.4.0
- ignore: 5.3.2
- natural-compare: 1.4.0
- ts-api-utils: 1.3.0(typescript@5.5.4)
- typescript: 5.5.4
- transitivePeerDependencies:
- - supports-color
- dev: true
+ postcss: ^8.4.21
- /@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4):
- resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==}
- engines: {node: ^18.18.0 || >=20.0.0}
+ postcss-load-config@4.0.2:
+ resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==}
+ engines: {node: '>= 14'}
peerDependencies:
- eslint: ^8.56.0
- typescript: '*'
+ postcss: '>=8.0.9'
+ ts-node: '>=9.0.0'
peerDependenciesMeta:
- typescript:
+ postcss:
+ optional: true
+ ts-node:
optional: true
- dependencies:
- '@typescript-eslint/scope-manager': 7.18.0
- '@typescript-eslint/types': 7.18.0
- '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4)
- '@typescript-eslint/visitor-keys': 7.18.0
- debug: 4.3.6
- eslint: 8.57.0
- typescript: 5.5.4
- transitivePeerDependencies:
- - supports-color
- dev: true
- /@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4):
- resolution: {integrity: sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==}
- engines: {node: ^16.0.0 || >=18.0.0}
+ postcss-nested@6.2.0:
+ resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==}
+ engines: {node: '>=12.0'}
peerDependencies:
- eslint: ^8.56.0
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
- dependencies:
- '@typescript-eslint/scope-manager': 7.2.0
- '@typescript-eslint/types': 7.2.0
- '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.5.4)
- '@typescript-eslint/visitor-keys': 7.2.0
- debug: 4.3.6
- eslint: 8.57.0
- typescript: 5.5.4
- transitivePeerDependencies:
- - supports-color
- dev: true
+ postcss: ^8.2.14
- /@typescript-eslint/scope-manager@5.62.0:
- resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- dependencies:
- '@typescript-eslint/types': 5.62.0
- '@typescript-eslint/visitor-keys': 5.62.0
- dev: true
+ postcss-selector-parser@6.1.2:
+ resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==}
+ engines: {node: '>=4'}
- /@typescript-eslint/scope-manager@7.18.0:
- resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==}
- engines: {node: ^18.18.0 || >=20.0.0}
- dependencies:
- '@typescript-eslint/types': 7.18.0
- '@typescript-eslint/visitor-keys': 7.18.0
- dev: true
+ postcss-value-parser@4.2.0:
+ resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
- /@typescript-eslint/scope-manager@7.2.0:
- resolution: {integrity: sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==}
- engines: {node: ^16.0.0 || >=18.0.0}
- dependencies:
- '@typescript-eslint/types': 7.2.0
- '@typescript-eslint/visitor-keys': 7.2.0
- dev: true
+ postcss@8.4.31:
+ resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ postcss@8.4.47:
+ resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==}
+ engines: {node: ^10 || ^12 || >=14}
- /@typescript-eslint/type-utils@7.18.0(eslint@8.57.0)(typescript@5.5.4):
- resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==}
- engines: {node: ^18.18.0 || >=20.0.0}
+ preact-render-to-string@5.2.3:
+ resolution: {integrity: sha512-aPDxUn5o3GhWdtJtW0svRC2SS/l8D9MAgo2+AWml+BhDImb27ALf04Q2d+AHqUUOc6RdSXFIBVa2gxzgMKgtZA==}
peerDependencies:
- eslint: ^8.56.0
- typescript: '*'
+ preact: '>=10'
+
+ preact@10.11.3:
+ resolution: {integrity: sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==}
+
+ prelude-ls@1.2.1:
+ resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
+ engines: {node: '>= 0.8.0'}
+
+ prettier-plugin-tailwindcss@0.6.8:
+ resolution: {integrity: sha512-dGu3kdm7SXPkiW4nzeWKCl3uoImdd5CTZEJGxyypEPL37Wj0HT2pLqjrvSei1nTeuQfO4PUfjeW5cTUNRLZ4sA==}
+ engines: {node: '>=14.21.3'}
+ peerDependencies:
+ '@ianvs/prettier-plugin-sort-imports': '*'
+ '@prettier/plugin-pug': '*'
+ '@shopify/prettier-plugin-liquid': '*'
+ '@trivago/prettier-plugin-sort-imports': '*'
+ '@zackad/prettier-plugin-twig-melody': '*'
+ prettier: ^3.0
+ prettier-plugin-astro: '*'
+ prettier-plugin-css-order: '*'
+ prettier-plugin-import-sort: '*'
+ prettier-plugin-jsdoc: '*'
+ prettier-plugin-marko: '*'
+ prettier-plugin-multiline-arrays: '*'
+ prettier-plugin-organize-attributes: '*'
+ prettier-plugin-organize-imports: '*'
+ prettier-plugin-sort-imports: '*'
+ prettier-plugin-style-order: '*'
+ prettier-plugin-svelte: '*'
peerDependenciesMeta:
- typescript:
+ '@ianvs/prettier-plugin-sort-imports':
+ optional: true
+ '@prettier/plugin-pug':
+ optional: true
+ '@shopify/prettier-plugin-liquid':
+ optional: true
+ '@trivago/prettier-plugin-sort-imports':
+ optional: true
+ '@zackad/prettier-plugin-twig-melody':
+ optional: true
+ prettier-plugin-astro:
+ optional: true
+ prettier-plugin-css-order:
+ optional: true
+ prettier-plugin-import-sort:
optional: true
- dependencies:
- '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4)
- '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4)
- debug: 4.3.6
- eslint: 8.57.0
- ts-api-utils: 1.3.0(typescript@5.5.4)
- typescript: 5.5.4
- transitivePeerDependencies:
- - supports-color
- dev: true
-
- /@typescript-eslint/types@5.62.0:
- resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- dev: true
-
- /@typescript-eslint/types@7.18.0:
- resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==}
- engines: {node: ^18.18.0 || >=20.0.0}
- dev: true
-
- /@typescript-eslint/types@7.2.0:
- resolution: {integrity: sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==}
- engines: {node: ^16.0.0 || >=18.0.0}
- dev: true
-
- /@typescript-eslint/typescript-estree@5.62.0(typescript@5.5.4):
- resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- peerDependencies:
- typescript: '*'
- peerDependenciesMeta:
- typescript:
+ prettier-plugin-jsdoc:
optional: true
- dependencies:
- '@typescript-eslint/types': 5.62.0
- '@typescript-eslint/visitor-keys': 5.62.0
- debug: 4.3.6
- globby: 11.1.0
- is-glob: 4.0.3
- semver: 7.6.3
- tsutils: 3.21.0(typescript@5.5.4)
- typescript: 5.5.4
- transitivePeerDependencies:
- - supports-color
- dev: true
-
- /@typescript-eslint/typescript-estree@7.18.0(typescript@5.5.4):
- resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==}
- engines: {node: ^18.18.0 || >=20.0.0}
- peerDependencies:
- typescript: '*'
- peerDependenciesMeta:
- typescript:
+ prettier-plugin-marko:
optional: true
- dependencies:
- '@typescript-eslint/types': 7.18.0
- '@typescript-eslint/visitor-keys': 7.18.0
- debug: 4.3.6
- globby: 11.1.0
- is-glob: 4.0.3
- minimatch: 9.0.5
- semver: 7.6.3
- ts-api-utils: 1.3.0(typescript@5.5.4)
- typescript: 5.5.4
- transitivePeerDependencies:
- - supports-color
- dev: true
-
- /@typescript-eslint/typescript-estree@7.2.0(typescript@5.5.4):
- resolution: {integrity: sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==}
- engines: {node: ^16.0.0 || >=18.0.0}
- peerDependencies:
- typescript: '*'
- peerDependenciesMeta:
- typescript:
+ prettier-plugin-multiline-arrays:
+ optional: true
+ prettier-plugin-organize-attributes:
+ optional: true
+ prettier-plugin-organize-imports:
+ optional: true
+ prettier-plugin-sort-imports:
+ optional: true
+ prettier-plugin-style-order:
+ optional: true
+ prettier-plugin-svelte:
optional: true
- dependencies:
- '@typescript-eslint/types': 7.2.0
- '@typescript-eslint/visitor-keys': 7.2.0
- debug: 4.3.6
- globby: 11.1.0
- is-glob: 4.0.3
- minimatch: 9.0.3
- semver: 7.6.3
- ts-api-utils: 1.3.0(typescript@5.5.4)
- typescript: 5.5.4
- transitivePeerDependencies:
- - supports-color
- dev: true
-
- /@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.5.4):
- resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- peerDependencies:
- eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
- dependencies:
- '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
- '@types/json-schema': 7.0.15
- '@types/semver': 7.5.8
- '@typescript-eslint/scope-manager': 5.62.0
- '@typescript-eslint/types': 5.62.0
- '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.4)
- eslint: 8.57.0
- eslint-scope: 5.1.1
- semver: 7.6.3
- transitivePeerDependencies:
- - supports-color
- - typescript
- dev: true
- /@typescript-eslint/utils@7.18.0(eslint@8.57.0)(typescript@5.5.4):
- resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==}
- engines: {node: ^18.18.0 || >=20.0.0}
- peerDependencies:
- eslint: ^8.56.0
- dependencies:
- '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
- '@typescript-eslint/scope-manager': 7.18.0
- '@typescript-eslint/types': 7.18.0
- '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4)
- eslint: 8.57.0
- transitivePeerDependencies:
- - supports-color
- - typescript
- dev: true
+ prettier@3.3.3:
+ resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==}
+ engines: {node: '>=14'}
+ hasBin: true
- /@typescript-eslint/visitor-keys@5.62.0:
- resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- dependencies:
- '@typescript-eslint/types': 5.62.0
- eslint-visitor-keys: 3.4.3
- dev: true
+ pretty-format@3.8.0:
+ resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==}
- /@typescript-eslint/visitor-keys@7.18.0:
- resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==}
- engines: {node: ^18.18.0 || >=20.0.0}
- dependencies:
- '@typescript-eslint/types': 7.18.0
- eslint-visitor-keys: 3.4.3
- dev: true
+ prop-types@15.8.1:
+ resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
- /@typescript-eslint/visitor-keys@7.2.0:
- resolution: {integrity: sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==}
- engines: {node: ^16.0.0 || >=18.0.0}
- dependencies:
- '@typescript-eslint/types': 7.2.0
- eslint-visitor-keys: 3.4.3
- dev: true
+ proxy-from-env@1.1.0:
+ resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
- /@ungap/structured-clone@1.2.0:
- resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
+ punycode@2.3.1:
+ resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+ engines: {node: '>=6'}
- /@vitejs/plugin-react@4.3.1(vite@5.4.2):
- resolution: {integrity: sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==}
- engines: {node: ^14.18.0 || >=16.0.0}
- peerDependencies:
- vite: ^4.2.0 || ^5.0.0
- dependencies:
- '@babel/core': 7.25.2
- '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.25.2)
- '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.25.2)
- '@types/babel__core': 7.20.5
- react-refresh: 0.14.2
- vite: 5.4.2(@types/node@20.16.1)
- transitivePeerDependencies:
- - supports-color
- dev: true
+ queue-microtask@1.2.3:
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
- /@vitest/coverage-istanbul@1.6.0(vitest@1.6.0):
- resolution: {integrity: sha512-h/BwpXehkkS0qsNCS00QxiupAqVkNi0WT19BR0dQvlge5oHghoSVLx63fABYFoKxVb7Ue7+k6V2KokmQ1zdMpg==}
+ react-dom@18.3.1:
+ resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==}
peerDependencies:
- vitest: 1.6.0
- dependencies:
- debug: 4.3.6
- istanbul-lib-coverage: 3.2.2
- istanbul-lib-instrument: 6.0.3
- istanbul-lib-report: 3.0.1
- istanbul-lib-source-maps: 5.0.6
- istanbul-reports: 3.1.7
- magicast: 0.3.4
- picocolors: 1.0.1
- test-exclude: 6.0.0
- vitest: 1.6.0(@types/node@20.16.1)(@vitest/ui@1.6.0)(jsdom@24.1.3)
- transitivePeerDependencies:
- - supports-color
- dev: true
+ react: ^18.3.1
- /@vitest/coverage-v8@1.6.0(vitest@1.6.0):
- resolution: {integrity: sha512-KvapcbMY/8GYIG0rlwwOKCVNRc0OL20rrhFkg/CHNzncV03TE2XWvO5w9uZYoxNiMEBacAJt3unSOiZ7svePew==}
+ react-hook-form@7.53.1:
+ resolution: {integrity: sha512-6aiQeBda4zjcuaugWvim9WsGqisoUk+etmFEsSUMm451/Ic8L/UAb7sRtMj3V+Hdzm6mMjU1VhiSzYUZeBm0Vg==}
+ engines: {node: '>=18.0.0'}
peerDependencies:
- vitest: 1.6.0
- dependencies:
- '@ampproject/remapping': 2.3.0
- '@bcoe/v8-coverage': 0.2.3
- debug: 4.3.6
- istanbul-lib-coverage: 3.2.2
- istanbul-lib-report: 3.0.1
- istanbul-lib-source-maps: 5.0.6
- istanbul-reports: 3.1.7
- magic-string: 0.30.11
- magicast: 0.3.4
- picocolors: 1.0.1
- std-env: 3.7.0
- strip-literal: 2.1.0
- test-exclude: 6.0.0
- vitest: 1.6.0(@types/node@20.16.1)(@vitest/ui@1.6.0)(jsdom@24.1.3)
- transitivePeerDependencies:
- - supports-color
- dev: true
-
- /@vitest/expect@1.6.0:
- resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==}
- dependencies:
- '@vitest/spy': 1.6.0
- '@vitest/utils': 1.6.0
- chai: 4.5.0
- dev: true
-
- /@vitest/runner@1.6.0:
- resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==}
- dependencies:
- '@vitest/utils': 1.6.0
- p-limit: 5.0.0
- pathe: 1.1.2
- dev: true
-
- /@vitest/snapshot@1.6.0:
- resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==}
- dependencies:
- magic-string: 0.30.11
- pathe: 1.1.2
- pretty-format: 29.7.0
- dev: true
+ react: ^16.8.0 || ^17 || ^18 || ^19
- /@vitest/spy@1.6.0:
- resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==}
- dependencies:
- tinyspy: 2.2.1
- dev: true
+ react-is@16.13.1:
+ resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
- /@vitest/ui@1.6.0(vitest@1.6.0):
- resolution: {integrity: sha512-k3Lyo+ONLOgylctiGovRKy7V4+dIN2yxstX3eY5cWFXH6WP+ooVX79YSyi0GagdTQzLmT43BF27T0s6dOIPBXA==}
+ react-remove-scroll-bar@2.3.6:
+ resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==}
+ engines: {node: '>=10'}
peerDependencies:
- vitest: 1.6.0
- dependencies:
- '@vitest/utils': 1.6.0
- fast-glob: 3.3.2
- fflate: 0.8.2
- flatted: 3.3.1
- pathe: 1.1.2
- picocolors: 1.0.1
- sirv: 2.0.4
- vitest: 1.6.0(@types/node@20.16.1)(@vitest/ui@1.6.0)(jsdom@24.1.3)
- dev: true
-
- /@vitest/utils@1.6.0:
- resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==}
- dependencies:
- diff-sequences: 29.6.3
- estree-walker: 3.0.3
- loupe: 2.3.7
- pretty-format: 29.7.0
- dev: true
-
- /@webassemblyjs/ast@1.12.1:
- resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==}
- dependencies:
- '@webassemblyjs/helper-numbers': 1.11.6
- '@webassemblyjs/helper-wasm-bytecode': 1.11.6
- dev: false
-
- /@webassemblyjs/floating-point-hex-parser@1.11.6:
- resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==}
- dev: false
-
- /@webassemblyjs/helper-api-error@1.11.6:
- resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==}
- dev: false
-
- /@webassemblyjs/helper-buffer@1.12.1:
- resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==}
- dev: false
-
- /@webassemblyjs/helper-numbers@1.11.6:
- resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==}
- dependencies:
- '@webassemblyjs/floating-point-hex-parser': 1.11.6
- '@webassemblyjs/helper-api-error': 1.11.6
- '@xtuc/long': 4.2.2
- dev: false
-
- /@webassemblyjs/helper-wasm-bytecode@1.11.6:
- resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==}
- dev: false
-
- /@webassemblyjs/helper-wasm-section@1.12.1:
- resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==}
- dependencies:
- '@webassemblyjs/ast': 1.12.1
- '@webassemblyjs/helper-buffer': 1.12.1
- '@webassemblyjs/helper-wasm-bytecode': 1.11.6
- '@webassemblyjs/wasm-gen': 1.12.1
- dev: false
-
- /@webassemblyjs/ieee754@1.11.6:
- resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==}
- dependencies:
- '@xtuc/ieee754': 1.2.0
- dev: false
-
- /@webassemblyjs/leb128@1.11.6:
- resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==}
- dependencies:
- '@xtuc/long': 4.2.2
- dev: false
-
- /@webassemblyjs/utf8@1.11.6:
- resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==}
- dev: false
-
- /@webassemblyjs/wasm-edit@1.12.1:
- resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==}
- dependencies:
- '@webassemblyjs/ast': 1.12.1
- '@webassemblyjs/helper-buffer': 1.12.1
- '@webassemblyjs/helper-wasm-bytecode': 1.11.6
- '@webassemblyjs/helper-wasm-section': 1.12.1
- '@webassemblyjs/wasm-gen': 1.12.1
- '@webassemblyjs/wasm-opt': 1.12.1
- '@webassemblyjs/wasm-parser': 1.12.1
- '@webassemblyjs/wast-printer': 1.12.1
- dev: false
-
- /@webassemblyjs/wasm-gen@1.12.1:
- resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==}
- dependencies:
- '@webassemblyjs/ast': 1.12.1
- '@webassemblyjs/helper-wasm-bytecode': 1.11.6
- '@webassemblyjs/ieee754': 1.11.6
- '@webassemblyjs/leb128': 1.11.6
- '@webassemblyjs/utf8': 1.11.6
- dev: false
-
- /@webassemblyjs/wasm-opt@1.12.1:
- resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==}
- dependencies:
- '@webassemblyjs/ast': 1.12.1
- '@webassemblyjs/helper-buffer': 1.12.1
- '@webassemblyjs/wasm-gen': 1.12.1
- '@webassemblyjs/wasm-parser': 1.12.1
- dev: false
-
- /@webassemblyjs/wasm-parser@1.12.1:
- resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==}
- dependencies:
- '@webassemblyjs/ast': 1.12.1
- '@webassemblyjs/helper-api-error': 1.11.6
- '@webassemblyjs/helper-wasm-bytecode': 1.11.6
- '@webassemblyjs/ieee754': 1.11.6
- '@webassemblyjs/leb128': 1.11.6
- '@webassemblyjs/utf8': 1.11.6
- dev: false
-
- /@webassemblyjs/wast-printer@1.12.1:
- resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==}
- dependencies:
- '@webassemblyjs/ast': 1.12.1
- '@xtuc/long': 4.2.2
- dev: false
-
- /@xtuc/ieee754@1.2.0:
- resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==}
- dev: false
-
- /@xtuc/long@4.2.2:
- resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==}
- dev: false
-
- /abbrev@2.0.0:
- resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==}
- engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
- dev: false
-
- /accepts@1.3.8:
- resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
- engines: {node: '>= 0.6'}
- dependencies:
- mime-types: 2.1.35
- negotiator: 0.6.3
- dev: false
+ '@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
- /acorn-import-attributes@1.9.5(acorn@8.12.1):
- resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==}
+ react-remove-scroll@2.6.0:
+ resolution: {integrity: sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ==}
+ engines: {node: '>=10'}
peerDependencies:
- acorn: ^8
- dependencies:
- acorn: 8.12.1
- dev: false
+ '@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
- /acorn-jsx@5.3.2(acorn@8.12.1):
- resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+ react-style-singleton@2.2.1:
+ resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==}
+ engines: {node: '>=10'}
peerDependencies:
- acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
- dependencies:
- acorn: 8.12.1
+ '@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
- /acorn-walk@8.3.3:
- resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==}
- engines: {node: '>=0.4.0'}
- dependencies:
- acorn: 8.12.1
- dev: true
+ react@18.3.1:
+ resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==}
+ engines: {node: '>=0.10.0'}
- /acorn@8.12.1:
- resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==}
- engines: {node: '>=0.4.0'}
- hasBin: true
+ read-cache@1.0.0:
+ resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
- /agent-base@7.1.1:
- resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==}
- engines: {node: '>= 14'}
- dependencies:
- debug: 4.3.6
- transitivePeerDependencies:
- - supports-color
- dev: true
+ readdirp@3.6.0:
+ resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+ engines: {node: '>=8.10.0'}
- /ajv-keywords@3.5.2(ajv@6.12.6):
- resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==}
- peerDependencies:
- ajv: ^6.9.1
- dependencies:
- ajv: 6.12.6
- dev: false
+ reflect.getprototypeof@1.0.6:
+ resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==}
+ engines: {node: '>= 0.4'}
- /ajv@6.12.6:
- resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
- dependencies:
- fast-deep-equal: 3.1.3
- fast-json-stable-stringify: 2.1.0
- json-schema-traverse: 0.4.1
- uri-js: 4.4.1
+ regexp.prototype.flags@1.5.3:
+ resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==}
+ engines: {node: '>= 0.4'}
- /ansi-regex@5.0.1:
- resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
- engines: {node: '>=8'}
+ require-directory@2.1.1:
+ resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+ engines: {node: '>=0.10.0'}
- /ansi-regex@6.0.1:
- resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==}
- engines: {node: '>=12'}
+ require-from-string@2.0.2:
+ resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
+ engines: {node: '>=0.10.0'}
- /ansi-styles@3.2.1:
- resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
+ resolve-from@4.0.0:
+ resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
engines: {node: '>=4'}
- dependencies:
- color-convert: 1.9.3
- /ansi-styles@4.3.0:
- resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ resolve-from@5.0.0:
+ resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
engines: {node: '>=8'}
- dependencies:
- color-convert: 2.0.1
- /ansi-styles@5.2.0:
- resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
- engines: {node: '>=10'}
+ resolve-pkg-maps@1.0.0:
+ resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
- /ansi-styles@6.2.1:
- resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
- engines: {node: '>=12'}
+ resolve@1.22.8:
+ resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
+ hasBin: true
- /any-promise@1.3.0:
- resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
+ resolve@2.0.0-next.5:
+ resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==}
+ hasBin: true
- /anymatch@3.1.3:
- resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
- engines: {node: '>= 8'}
- dependencies:
- normalize-path: 3.0.0
- picomatch: 2.3.1
+ restore-cursor@5.1.0:
+ resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==}
+ engines: {node: '>=18'}
- /arg@5.0.2:
- resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
+ reusify@1.0.4:
+ resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
- /argparse@2.0.1:
- resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+ rfdc@1.4.1:
+ resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
- /aria-hidden@1.2.4:
- resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==}
- engines: {node: '>=10'}
- dependencies:
- tslib: 2.7.0
- dev: false
+ rimraf@3.0.2:
+ resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
+ deprecated: Rimraf versions prior to v4 are no longer supported
+ hasBin: true
- /aria-query@5.1.3:
- resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==}
- dependencies:
- deep-equal: 2.2.3
- dev: true
+ run-parallel@1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
- /aria-query@5.3.0:
- resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
- dependencies:
- dequal: 2.0.3
- dev: true
+ safe-array-concat@1.1.2:
+ resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==}
+ engines: {node: '>=0.4'}
- /array-buffer-byte-length@1.0.1:
- resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==}
+ safe-regex-test@1.0.3:
+ resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==}
engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.7
- is-array-buffer: 3.0.4
- dev: true
- /array-includes@3.1.8:
- resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.7
- define-properties: 1.2.1
- es-abstract: 1.23.3
- es-object-atoms: 1.0.0
- get-intrinsic: 1.2.4
- is-string: 1.0.7
- dev: true
+ scheduler@0.23.2:
+ resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==}
- /array-union@2.1.0:
- resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
- engines: {node: '>=8'}
- dev: true
+ semver@6.3.1:
+ resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+ hasBin: true
- /array.prototype.findlast@1.2.5:
- resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.7
- define-properties: 1.2.1
- es-abstract: 1.23.3
- es-errors: 1.3.0
- es-object-atoms: 1.0.0
- es-shim-unscopables: 1.0.2
- dev: true
+ semver@7.6.3:
+ resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==}
+ engines: {node: '>=10'}
+ hasBin: true
- /array.prototype.findlastindex@1.2.5:
- resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==}
+ set-function-length@1.2.2:
+ resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.7
- define-properties: 1.2.1
- es-abstract: 1.23.3
- es-errors: 1.3.0
- es-object-atoms: 1.0.0
- es-shim-unscopables: 1.0.2
- dev: true
- /array.prototype.flat@1.3.2:
- resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==}
+ set-function-name@2.0.2:
+ resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==}
engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.7
- define-properties: 1.2.1
- es-abstract: 1.23.3
- es-shim-unscopables: 1.0.2
- dev: true
- /array.prototype.flatmap@1.3.2:
- resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.7
- define-properties: 1.2.1
- es-abstract: 1.23.3
- es-shim-unscopables: 1.0.2
- dev: true
+ sharp@0.33.5:
+ resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
- /array.prototype.tosorted@1.1.4:
- resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==}
- engines: {node: '>= 0.4'}
- 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
- dev: true
+ shebang-command@2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
- /arraybuffer.prototype.slice@1.0.3:
- resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==}
+ shebang-regex@3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
+
+ side-channel@1.0.6:
+ resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==}
engines: {node: '>= 0.4'}
- dependencies:
- array-buffer-byte-length: 1.0.1
- call-bind: 1.0.7
- define-properties: 1.2.1
- es-abstract: 1.23.3
- es-errors: 1.3.0
- get-intrinsic: 1.2.4
- is-array-buffer: 3.0.4
- is-shared-array-buffer: 1.0.3
- dev: true
- /assertion-error@1.1.0:
- resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==}
- dev: true
+ signal-exit@4.1.0:
+ resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
+ engines: {node: '>=14'}
- /ast-types-flow@0.0.8:
- resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==}
- dev: true
+ simple-swizzle@0.2.2:
+ resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==}
- /asynckit@0.4.0:
- resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
+ slice-ansi@5.0.0:
+ resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==}
+ engines: {node: '>=12'}
- /autoprefixer@10.4.14(postcss@8.4.38):
- resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==}
- engines: {node: ^10 || ^12 || >=14}
- hasBin: true
- peerDependencies:
- postcss: ^8.1.0
- dependencies:
- browserslist: 4.23.3
- caniuse-lite: 1.0.30001653
- fraction.js: 4.3.7
- normalize-range: 0.1.2
- picocolors: 1.0.1
- postcss: 8.4.38
- postcss-value-parser: 4.2.0
- dev: false
+ slice-ansi@7.1.0:
+ resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==}
+ engines: {node: '>=18'}
- /autoprefixer@10.4.20(postcss@8.4.41):
- resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==}
- engines: {node: ^10 || ^12 || >=14}
- hasBin: true
+ sonner@1.5.0:
+ resolution: {integrity: sha512-FBjhG/gnnbN6FY0jaNnqZOMmB73R+5IiyYAw8yBj7L54ER7HB3fOSE5OFiQiE2iXWxeXKvg6fIP4LtVppHEdJA==}
peerDependencies:
- postcss: ^8.1.0
- dependencies:
- browserslist: 4.23.3
- caniuse-lite: 1.0.30001653
- fraction.js: 4.3.7
- normalize-range: 0.1.2
- picocolors: 1.0.1
- postcss: 8.4.41
- postcss-value-parser: 4.2.0
- dev: true
+ react: ^18.0.0
+ react-dom: ^18.0.0
- /available-typed-arrays@1.0.7:
- resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
- engines: {node: '>= 0.4'}
- dependencies:
- possible-typed-array-names: 1.0.0
- dev: true
+ source-map-js@1.2.1:
+ resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+ engines: {node: '>=0.10.0'}
- /axe-core@3.5.6:
- resolution: {integrity: sha512-LEUDjgmdJoA3LqklSTwKYqkjcZ4HKc4ddIYGSAiSkr46NTjzg2L9RNB+lekO9P7Dlpa87+hBtzc2Fzn/+GUWMQ==}
- engines: {node: '>=4'}
- dev: false
+ split2@4.2.0:
+ resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
+ engines: {node: '>= 10.x'}
- /axe-core@4.10.0:
- resolution: {integrity: sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==}
- engines: {node: '>=4'}
- dev: true
+ streamsearch@1.1.0:
+ resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==}
+ engines: {node: '>=10.0.0'}
- /axe-core@4.9.1:
- resolution: {integrity: sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw==}
- engines: {node: '>=4'}
- dev: false
+ string-argv@0.3.2:
+ resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==}
+ engines: {node: '>=0.6.19'}
- /axios@1.7.5:
- resolution: {integrity: sha512-fZu86yCo+svH3uqJ/yTdQ0QHpQu5oL+/QE+QPSv6BZSkDAoky9vytxp7u5qk83OJFS3kEBcesWni9WTZAv3tSw==}
- dependencies:
- follow-redirects: 1.15.6
- form-data: 4.0.0
- proxy-from-env: 1.1.0
- transitivePeerDependencies:
- - debug
- dev: false
+ string-width@4.2.3:
+ resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+ engines: {node: '>=8'}
- /axobject-query@3.1.1:
- resolution: {integrity: sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==}
- dependencies:
- deep-equal: 2.2.3
- dev: true
+ string-width@5.1.2:
+ resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
+ engines: {node: '>=12'}
- /balanced-match@1.0.2:
- resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+ string-width@7.2.0:
+ resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==}
+ engines: {node: '>=18'}
- /base64-js@1.5.1:
- resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
- dev: false
+ string.prototype.includes@2.0.1:
+ resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==}
+ engines: {node: '>= 0.4'}
- /base64id@2.0.0:
- resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==}
- engines: {node: ^4.5.0 || >= 5.9}
- dev: false
+ string.prototype.matchall@4.0.11:
+ resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==}
+ engines: {node: '>= 0.4'}
- /binary-extensions@2.3.0:
- resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
- engines: {node: '>=8'}
+ string.prototype.repeat@1.0.0:
+ resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==}
- /bl@4.1.0:
- resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
- dependencies:
- buffer: 5.7.1
- inherits: 2.0.4
- readable-stream: 3.6.2
- dev: false
+ string.prototype.trim@1.2.9:
+ resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==}
+ engines: {node: '>= 0.4'}
- /brace-expansion@1.1.11:
- resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
- dependencies:
- balanced-match: 1.0.2
- concat-map: 0.0.1
+ string.prototype.trimend@1.0.8:
+ resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==}
- /brace-expansion@2.0.1:
- resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
- dependencies:
- balanced-match: 1.0.2
+ string.prototype.trimstart@1.0.8:
+ resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
+ engines: {node: '>= 0.4'}
- /braces@3.0.3:
- resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+ strip-ansi@6.0.1:
+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
engines: {node: '>=8'}
- dependencies:
- fill-range: 7.1.1
- /browserslist@4.23.3:
- resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==}
- engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
- hasBin: true
- dependencies:
- caniuse-lite: 1.0.30001653
- electron-to-chromium: 1.5.13
- node-releases: 2.0.18
- update-browserslist-db: 1.1.0(browserslist@4.23.3)
+ strip-ansi@7.1.0:
+ resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
+ engines: {node: '>=12'}
- /buffer-from@1.1.2:
- resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
- dev: false
+ strip-bom@3.0.0:
+ resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
+ engines: {node: '>=4'}
- /buffer@5.7.1:
- resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
- dependencies:
- base64-js: 1.5.1
- ieee754: 1.2.1
- dev: false
+ strip-final-newline@3.0.0:
+ resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
+ engines: {node: '>=12'}
- /builtin-modules@3.3.0:
- resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==}
- engines: {node: '>=6'}
- dev: true
+ strip-json-comments@3.1.1:
+ resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
+ engines: {node: '>=8'}
- /busboy@1.6.0:
- resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==}
- engines: {node: '>=10.16.0'}
- dependencies:
- streamsearch: 1.1.0
- dev: false
+ styled-jsx@5.1.6:
+ resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==}
+ engines: {node: '>= 12.0.0'}
+ peerDependencies:
+ '@babel/core': '*'
+ babel-plugin-macros: '*'
+ react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0'
+ peerDependenciesMeta:
+ '@babel/core':
+ optional: true
+ babel-plugin-macros:
+ optional: true
- /cac@6.7.14:
- resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
+ sucrase@3.35.0:
+ resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==}
+ engines: {node: '>=16 || 14 >=14.17'}
+ hasBin: true
+
+ supports-color@7.2.0:
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
engines: {node: '>=8'}
- dev: true
- /call-bind@1.0.7:
- resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==}
+ supports-preserve-symlinks-flag@1.0.0:
+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
engines: {node: '>= 0.4'}
- 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.2
- dev: true
- /callsites@3.1.0:
- resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
- engines: {node: '>=6'}
+ swiper@11.1.14:
+ resolution: {integrity: sha512-VbQLQXC04io6AoAjIUWuZwW4MSYozkcP9KjLdrsG/00Q/yiwvhz9RQyt0nHXV10hi9NVnDNy1/wv7Dzq1lkOCQ==}
+ engines: {node: '>= 4.7.0'}
- /camelcase-css@2.0.1:
- resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
- engines: {node: '>= 6'}
+ tailwind-merge@2.5.4:
+ resolution: {integrity: sha512-0q8cfZHMu9nuYP/b5Shb7Y7Sh1B7Nnl5GqNr1U+n2p6+mybvRtayrQ+0042Z5byvTA8ihjlP8Odo8/VnHbZu4Q==}
- /caniuse-lite@1.0.30001653:
- resolution: {integrity: sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw==}
+ tailwindcss-animate@1.0.7:
+ resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==}
+ peerDependencies:
+ tailwindcss: '>=3.0.0 || insiders'
- /chai@4.5.0:
- resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==}
- engines: {node: '>=4'}
- dependencies:
- assertion-error: 1.1.0
- check-error: 1.0.3
- deep-eql: 4.1.4
- get-func-name: 2.0.2
- loupe: 2.3.7
- pathval: 1.1.1
- type-detect: 4.1.0
- dev: true
-
- /chalk@2.4.2:
- resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
- engines: {node: '>=4'}
- dependencies:
- ansi-styles: 3.2.1
- escape-string-regexp: 1.0.5
- supports-color: 5.5.0
+ tailwindcss@3.4.14:
+ resolution: {integrity: sha512-IcSvOcTRcUtQQ7ILQL5quRDg7Xs93PdJEk1ZLbhhvJc7uj/OAhYOnruEiwnGgBvUtaUAJ8/mhSw1o8L2jCiENA==}
+ engines: {node: '>=14.0.0'}
+ hasBin: true
+
+ tapable@2.2.1:
+ resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
+ engines: {node: '>=6'}
- /chalk@3.0.0:
- resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==}
+ text-extensions@2.4.0:
+ resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==}
engines: {node: '>=8'}
- dependencies:
- ansi-styles: 4.3.0
- supports-color: 7.2.0
- dev: true
- /chalk@4.1.2:
- resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+ text-table@0.2.0:
+ resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
+
+ thenify-all@1.6.0:
+ resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
+ engines: {node: '>=0.8'}
+
+ thenify@3.3.1:
+ resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
+
+ through@2.3.8:
+ resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
+
+ tinyexec@0.3.1:
+ resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==}
+
+ to-regex-range@5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+
+ ts-api-utils@1.3.0:
+ resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==}
+ engines: {node: '>=16'}
+ peerDependencies:
+ typescript: '>=4.2.0'
+
+ ts-interface-checker@0.1.13:
+ resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
+
+ tsconfig-paths@3.15.0:
+ resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==}
+
+ tslib@2.8.0:
+ resolution: {integrity: sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==}
+
+ type-check@0.4.0:
+ resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
+ engines: {node: '>= 0.8.0'}
+
+ type-fest@0.20.2:
+ resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
engines: {node: '>=10'}
- dependencies:
- ansi-styles: 4.3.0
- supports-color: 7.2.0
- /check-error@1.0.3:
- resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==}
- dependencies:
- get-func-name: 2.0.2
- dev: true
+ typed-array-buffer@1.0.2:
+ resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==}
+ engines: {node: '>= 0.4'}
- /chokidar@3.5.3:
- resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
- engines: {node: '>= 8.10.0'}
- dependencies:
- anymatch: 3.1.3
- braces: 3.0.3
- glob-parent: 5.1.2
- is-binary-path: 2.1.0
- is-glob: 4.0.3
- normalize-path: 3.0.0
- readdirp: 3.6.0
- optionalDependencies:
- fsevents: 2.3.3
- dev: false
+ typed-array-byte-length@1.0.1:
+ resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==}
+ engines: {node: '>= 0.4'}
- /chokidar@3.6.0:
- resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
- engines: {node: '>= 8.10.0'}
- dependencies:
- anymatch: 3.1.3
- braces: 3.0.3
- glob-parent: 5.1.2
- is-binary-path: 2.1.0
- is-glob: 4.0.3
- normalize-path: 3.0.0
- readdirp: 3.6.0
- optionalDependencies:
- fsevents: 2.3.3
+ typed-array-byte-offset@1.0.2:
+ resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==}
+ engines: {node: '>= 0.4'}
- /chrome-trace-event@1.0.4:
- resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==}
- engines: {node: '>=6.0'}
- dev: false
+ typed-array-length@1.0.6:
+ resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==}
+ engines: {node: '>= 0.4'}
- /ci-info@3.9.0:
- resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==}
- engines: {node: '>=8'}
- dev: false
+ typescript@5.6.3:
+ resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
- /ci-info@4.0.0:
- resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==}
- engines: {node: '>=8'}
- dev: true
+ unbox-primitive@1.0.2:
+ resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==}
- /class-variance-authority@0.7.0:
- resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==}
- dependencies:
- clsx: 2.0.0
- dev: false
+ undici-types@6.19.8:
+ resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==}
- /clean-regexp@1.0.0:
- resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==}
- engines: {node: '>=4'}
- dependencies:
- escape-string-regexp: 1.0.5
- dev: true
+ unicorn-magic@0.1.0:
+ resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==}
+ engines: {node: '>=18'}
- /cli-cursor@3.1.0:
- resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
- engines: {node: '>=8'}
- dependencies:
- restore-cursor: 3.1.0
- dev: false
+ update-browserslist-db@1.1.1:
+ resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
- /cli-spinners@2.9.2:
- resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==}
- engines: {node: '>=6'}
- dev: false
+ uri-js@4.4.1:
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
- /client-only@0.0.1:
- resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
- dev: false
+ use-callback-ref@1.3.2:
+ resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==}
+ 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
- /clone@1.0.4:
- resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==}
- engines: {node: '>=0.8'}
- dev: false
+ use-sidecar@1.1.2:
+ resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==}
+ 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
- /clsx@1.2.1:
- resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==}
- engines: {node: '>=6'}
- dev: false
+ util-deprecate@1.0.2:
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
- /clsx@2.0.0:
- resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==}
- engines: {node: '>=6'}
- dev: false
+ which-boxed-primitive@1.0.2:
+ resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
+
+ which-builtin-type@1.1.4:
+ resolution: {integrity: sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==}
+ engines: {node: '>= 0.4'}
+
+ which-collection@1.0.2:
+ resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==}
+ engines: {node: '>= 0.4'}
- /clsx@2.1.0:
- resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==}
- engines: {node: '>=6'}
- dev: false
+ which-typed-array@1.1.15:
+ resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==}
+ engines: {node: '>= 0.4'}
- /clsx@2.1.1:
- resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
- engines: {node: '>=6'}
- dev: false
+ which@2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
+ hasBin: true
- /color-convert@1.9.3:
- resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
- dependencies:
- color-name: 1.1.3
+ word-wrap@1.2.5:
+ resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
+ engines: {node: '>=0.10.0'}
- /color-convert@2.0.1:
- resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
- engines: {node: '>=7.0.0'}
- dependencies:
- color-name: 1.1.4
+ wrap-ansi@7.0.0:
+ resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+ engines: {node: '>=10'}
- /color-name@1.1.3:
- resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
+ wrap-ansi@8.1.0:
+ resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
+ engines: {node: '>=12'}
- /color-name@1.1.4:
- resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+ wrap-ansi@9.0.0:
+ resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==}
+ engines: {node: '>=18'}
- /color-string@1.9.1:
- resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==}
- dependencies:
- color-name: 1.1.4
- simple-swizzle: 0.2.2
- dev: false
+ wrappy@1.0.2:
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
- /color@4.2.3:
- resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==}
- engines: {node: '>=12.5.0'}
- dependencies:
- color-convert: 2.0.1
- color-string: 1.9.1
- dev: false
+ y18n@5.0.8:
+ resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+ engines: {node: '>=10'}
- /combined-stream@1.0.8:
- resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
- engines: {node: '>= 0.8'}
- dependencies:
- delayed-stream: 1.0.0
+ yallist@3.1.1:
+ resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
- /commander@10.0.1:
- resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==}
- engines: {node: '>=14'}
- dev: false
+ yaml@2.5.1:
+ resolution: {integrity: sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==}
+ engines: {node: '>= 14'}
+ hasBin: true
- /commander@11.1.0:
- resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==}
- engines: {node: '>=16'}
- dev: false
+ yaml@2.6.0:
+ resolution: {integrity: sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==}
+ engines: {node: '>= 14'}
+ hasBin: true
- /commander@2.20.3:
- resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
- dev: false
+ yargs-parser@21.1.1:
+ resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
+ engines: {node: '>=12'}
- /commander@4.1.1:
- resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
- engines: {node: '>= 6'}
+ yargs@17.7.2:
+ resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
+ engines: {node: '>=12'}
- /concat-map@0.0.1:
- resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+ yocto-queue@0.1.0:
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+ engines: {node: '>=10'}
- /confbox@0.1.7:
- resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==}
- dev: true
+ yocto-queue@1.1.1:
+ resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==}
+ engines: {node: '>=12.20'}
- /config-chain@1.1.13:
- resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==}
- dependencies:
- ini: 1.3.8
- proto-list: 1.2.4
- dev: false
+ zod@3.23.8:
+ resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==}
- /convert-source-map@2.0.0:
- resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+ zustand@5.0.0:
+ resolution: {integrity: sha512-LE+VcmbartOPM+auOjCCLQOsQ05zUTp8RkgwRzefUk+2jISdMMFnxvyTjA4YNWr5ZGXYbVsEMZosttuxUBkojQ==}
+ 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
- /cookie@0.4.2:
- resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==}
- engines: {node: '>= 0.6'}
- dev: false
+snapshots:
- /cookie@0.6.0:
- resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==}
- engines: {node: '>= 0.6'}
- dev: false
+ '@alloc/quick-lru@5.2.0': {}
- /cookies-next@4.2.1:
- resolution: {integrity: sha512-qsjtZ8TLlxCSX2JphMQNhkm3V3zIMQ05WrLkBKBwu50npBbBfiZWIdmSMzBGcdGKfMK19E0PIitTfRFAdMGHXg==}
+ '@ampproject/remapping@2.3.0':
dependencies:
- '@types/cookie': 0.6.0
- cookie: 0.6.0
- dev: false
+ '@jridgewell/gen-mapping': 0.3.5
+ '@jridgewell/trace-mapping': 0.3.25
- /core-js-compat@3.38.1:
- resolution: {integrity: sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==}
+ '@auth/core@0.37.2':
dependencies:
- browserslist: 4.23.3
- dev: true
+ '@panva/hkdf': 1.2.1
+ '@types/cookie': 0.6.0
+ cookie: 0.7.1
+ jose: 5.9.6
+ oauth4webapi: 3.1.2
+ preact: 10.11.3
+ preact-render-to-string: 5.2.3(preact@10.11.3)
- /cors@2.8.5:
- resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==}
- engines: {node: '>= 0.10'}
+ '@babel/code-frame@7.26.0':
dependencies:
- object-assign: 4.1.1
- vary: 1.1.2
- dev: false
+ '@babel/helper-validator-identifier': 7.25.9
+ js-tokens: 4.0.0
+ picocolors: 1.1.1
- /countries-list@3.1.1:
- resolution: {integrity: sha512-nPklKJ5qtmY5MdBKw1NiBAoyx5Sa7p2yPpljZyQ7gyCN1m+eMFs9I6CT37Mxt8zvR5L3VzD3DJBE4WQzX3WF4A==}
- dev: false
+ '@babel/compat-data@7.26.0': {}
- /cross-spawn@7.0.3:
- resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
- engines: {node: '>= 8'}
+ '@babel/core@7.26.0':
dependencies:
- path-key: 3.1.1
- shebang-command: 2.0.0
- which: 2.0.2
-
- /css.escape@1.5.1:
- resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==}
- dev: true
+ '@ampproject/remapping': 2.3.0
+ '@babel/code-frame': 7.26.0
+ '@babel/generator': 7.26.0
+ '@babel/helper-compilation-targets': 7.25.9
+ '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0)
+ '@babel/helpers': 7.26.0
+ '@babel/parser': 7.26.1
+ '@babel/template': 7.25.9
+ '@babel/traverse': 7.25.9
+ '@babel/types': 7.26.0
+ convert-source-map: 2.0.0
+ debug: 4.3.7
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
- /cssesc@3.0.0:
- resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
- engines: {node: '>=4'}
- hasBin: true
+ '@babel/generator@7.26.0':
+ dependencies:
+ '@babel/parser': 7.26.1
+ '@babel/types': 7.26.0
+ '@jridgewell/gen-mapping': 0.3.5
+ '@jridgewell/trace-mapping': 0.3.25
+ jsesc: 3.0.2
- /cssstyle@4.0.1:
- resolution: {integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==}
- engines: {node: '>=18'}
+ '@babel/helper-compilation-targets@7.25.9':
dependencies:
- rrweb-cssom: 0.6.0
- dev: true
+ '@babel/compat-data': 7.26.0
+ '@babel/helper-validator-option': 7.25.9
+ browserslist: 4.24.2
+ lru-cache: 5.1.1
+ semver: 6.3.1
- /csstype@3.1.3:
- resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
+ '@babel/helper-module-imports@7.25.9':
+ dependencies:
+ '@babel/traverse': 7.25.9
+ '@babel/types': 7.26.0
+ transitivePeerDependencies:
+ - supports-color
- /d3-array@3.2.4:
- resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==}
- engines: {node: '>=12'}
+ '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)':
dependencies:
- internmap: 2.0.3
- dev: false
+ '@babel/core': 7.26.0
+ '@babel/helper-module-imports': 7.25.9
+ '@babel/helper-validator-identifier': 7.25.9
+ '@babel/traverse': 7.25.9
+ transitivePeerDependencies:
+ - supports-color
- /d3-color@3.1.0:
- resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==}
- engines: {node: '>=12'}
- dev: false
+ '@babel/helper-string-parser@7.25.9': {}
- /d3-ease@3.0.1:
- resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==}
- engines: {node: '>=12'}
- dev: false
+ '@babel/helper-validator-identifier@7.25.9': {}
- /d3-format@3.1.0:
- resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==}
- engines: {node: '>=12'}
- dev: false
+ '@babel/helper-validator-option@7.25.9': {}
- /d3-interpolate@3.0.1:
- resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==}
- engines: {node: '>=12'}
+ '@babel/helpers@7.26.0':
dependencies:
- d3-color: 3.1.0
- dev: false
-
- /d3-path@3.1.0:
- resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==}
- engines: {node: '>=12'}
- dev: false
+ '@babel/template': 7.25.9
+ '@babel/types': 7.26.0
- /d3-scale@4.0.2:
- resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==}
- engines: {node: '>=12'}
+ '@babel/parser@7.26.1':
dependencies:
- d3-array: 3.2.4
- d3-format: 3.1.0
- d3-interpolate: 3.0.1
- d3-time: 3.1.0
- d3-time-format: 4.1.0
- dev: false
+ '@babel/types': 7.26.0
- /d3-shape@3.2.0:
- resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==}
- engines: {node: '>=12'}
+ '@babel/template@7.25.9':
dependencies:
- d3-path: 3.1.0
- dev: false
+ '@babel/code-frame': 7.26.0
+ '@babel/parser': 7.26.1
+ '@babel/types': 7.26.0
- /d3-time-format@4.1.0:
- resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==}
- engines: {node: '>=12'}
+ '@babel/traverse@7.25.9':
dependencies:
- d3-time: 3.1.0
- dev: false
+ '@babel/code-frame': 7.26.0
+ '@babel/generator': 7.26.0
+ '@babel/parser': 7.26.1
+ '@babel/template': 7.25.9
+ '@babel/types': 7.26.0
+ debug: 4.3.7
+ globals: 11.12.0
+ transitivePeerDependencies:
+ - supports-color
- /d3-time@3.1.0:
- resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==}
- engines: {node: '>=12'}
+ '@babel/types@7.26.0':
dependencies:
- d3-array: 3.2.4
- dev: false
-
- /d3-timer@3.0.1:
- resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==}
- engines: {node: '>=12'}
- dev: false
-
- /damerau-levenshtein@1.0.8:
- resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==}
- dev: true
+ '@babel/helper-string-parser': 7.25.9
+ '@babel/helper-validator-identifier': 7.25.9
- /data-urls@5.0.0:
- resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==}
- engines: {node: '>=18'}
+ '@commitlint/cli@19.5.0(@types/node@20.17.1)(typescript@5.6.3)':
dependencies:
- whatwg-mimetype: 4.0.0
- whatwg-url: 14.0.0
- dev: true
+ '@commitlint/format': 19.5.0
+ '@commitlint/lint': 19.5.0
+ '@commitlint/load': 19.5.0(@types/node@20.17.1)(typescript@5.6.3)
+ '@commitlint/read': 19.5.0
+ '@commitlint/types': 19.5.0
+ tinyexec: 0.3.1
+ yargs: 17.7.2
+ transitivePeerDependencies:
+ - '@types/node'
+ - typescript
- /data-view-buffer@1.0.1:
- resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==}
- engines: {node: '>= 0.4'}
+ '@commitlint/config-conventional@19.5.0':
dependencies:
- call-bind: 1.0.7
- es-errors: 1.3.0
- is-data-view: 1.0.1
- dev: true
+ '@commitlint/types': 19.5.0
+ conventional-changelog-conventionalcommits: 7.0.2
- /data-view-byte-length@1.0.1:
- resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==}
- engines: {node: '>= 0.4'}
+ '@commitlint/config-validator@19.5.0':
dependencies:
- call-bind: 1.0.7
- es-errors: 1.3.0
- is-data-view: 1.0.1
- dev: true
+ '@commitlint/types': 19.5.0
+ ajv: 8.17.1
- /data-view-byte-offset@1.0.0:
- resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==}
- engines: {node: '>= 0.4'}
+ '@commitlint/ensure@19.5.0':
dependencies:
- call-bind: 1.0.7
- es-errors: 1.3.0
- is-data-view: 1.0.1
- dev: true
+ '@commitlint/types': 19.5.0
+ lodash.camelcase: 4.3.0
+ lodash.kebabcase: 4.1.1
+ lodash.snakecase: 4.1.1
+ lodash.startcase: 4.4.0
+ lodash.upperfirst: 4.3.1
- /date-fns@3.6.0:
- resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==}
- dev: false
+ '@commitlint/execute-rule@19.5.0': {}
- /debounce@2.0.0:
- resolution: {integrity: sha512-xRetU6gL1VJbs85Mc4FoEGSjQxzpdxRyFhe3lmWFyy2EzydIcD4xzUvRJMD+NPDfMwKNhxa3PvsIOU32luIWeA==}
- engines: {node: '>=18'}
- dev: false
+ '@commitlint/format@19.5.0':
+ dependencies:
+ '@commitlint/types': 19.5.0
+ chalk: 5.3.0
- /debug@3.2.7:
- resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
- peerDependencies:
- supports-color: '*'
- peerDependenciesMeta:
- supports-color:
- optional: true
+ '@commitlint/is-ignored@19.5.0':
dependencies:
- ms: 2.1.3
- dev: true
+ '@commitlint/types': 19.5.0
+ semver: 7.6.3
- /debug@4.3.6:
- resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==}
- engines: {node: '>=6.0'}
- peerDependencies:
- supports-color: '*'
- peerDependenciesMeta:
- supports-color:
- optional: true
+ '@commitlint/lint@19.5.0':
+ dependencies:
+ '@commitlint/is-ignored': 19.5.0
+ '@commitlint/parse': 19.5.0
+ '@commitlint/rules': 19.5.0
+ '@commitlint/types': 19.5.0
+
+ '@commitlint/load@19.5.0(@types/node@20.17.1)(typescript@5.6.3)':
dependencies:
- ms: 2.1.2
+ '@commitlint/config-validator': 19.5.0
+ '@commitlint/execute-rule': 19.5.0
+ '@commitlint/resolve-extends': 19.5.0
+ '@commitlint/types': 19.5.0
+ chalk: 5.3.0
+ cosmiconfig: 9.0.0(typescript@5.6.3)
+ cosmiconfig-typescript-loader: 5.1.0(@types/node@20.17.1)(cosmiconfig@9.0.0(typescript@5.6.3))(typescript@5.6.3)
+ lodash.isplainobject: 4.0.6
+ lodash.merge: 4.6.2
+ lodash.uniq: 4.5.0
+ transitivePeerDependencies:
+ - '@types/node'
+ - typescript
- /decimal.js-light@2.5.1:
- resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==}
- dev: false
+ '@commitlint/message@19.5.0': {}
- /decimal.js@10.4.3:
- resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==}
- dev: true
+ '@commitlint/parse@19.5.0':
+ dependencies:
+ '@commitlint/types': 19.5.0
+ conventional-changelog-angular: 7.0.0
+ conventional-commits-parser: 5.0.0
- /deep-eql@4.1.4:
- resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==}
- engines: {node: '>=6'}
+ '@commitlint/read@19.5.0':
dependencies:
- type-detect: 4.1.0
- dev: true
+ '@commitlint/top-level': 19.5.0
+ '@commitlint/types': 19.5.0
+ git-raw-commits: 4.0.0
+ minimist: 1.2.8
+ tinyexec: 0.3.1
- /deep-equal@2.2.3:
- resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==}
- engines: {node: '>= 0.4'}
+ '@commitlint/resolve-extends@19.5.0':
dependencies:
- array-buffer-byte-length: 1.0.1
- call-bind: 1.0.7
- es-get-iterator: 1.1.3
- get-intrinsic: 1.2.4
- is-arguments: 1.1.1
- is-array-buffer: 3.0.4
- is-date-object: 1.0.5
- is-regex: 1.1.4
- is-shared-array-buffer: 1.0.3
- isarray: 2.0.5
- object-is: 1.1.6
- object-keys: 1.1.1
- object.assign: 4.1.5
- regexp.prototype.flags: 1.5.2
- side-channel: 1.0.6
- which-boxed-primitive: 1.0.2
- which-collection: 1.0.2
- which-typed-array: 1.1.15
- dev: true
+ '@commitlint/config-validator': 19.5.0
+ '@commitlint/types': 19.5.0
+ global-directory: 4.0.1
+ import-meta-resolve: 4.1.0
+ lodash.mergewith: 4.6.2
+ resolve-from: 5.0.0
- /deep-is@0.1.4:
- resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+ '@commitlint/rules@19.5.0':
+ dependencies:
+ '@commitlint/ensure': 19.5.0
+ '@commitlint/message': 19.5.0
+ '@commitlint/to-lines': 19.5.0
+ '@commitlint/types': 19.5.0
- /deepmerge@4.3.1:
- resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
- engines: {node: '>=0.10.0'}
- dev: false
+ '@commitlint/to-lines@19.5.0': {}
- /defaults@1.0.4:
- resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==}
+ '@commitlint/top-level@19.5.0':
dependencies:
- clone: 1.0.4
- dev: false
+ find-up: 7.0.0
- /define-data-property@1.1.4:
- resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
- engines: {node: '>= 0.4'}
+ '@commitlint/types@19.5.0':
dependencies:
- es-define-property: 1.0.0
- es-errors: 1.3.0
- gopd: 1.0.1
- dev: true
+ '@types/conventional-commits-parser': 5.0.0
+ chalk: 5.3.0
- /define-properties@1.2.1:
- resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
- engines: {node: '>= 0.4'}
+ '@darkroom.engineering/tempus@0.0.46': {}
+
+ '@emnapi/runtime@1.3.1':
dependencies:
- define-data-property: 1.1.4
- has-property-descriptors: 1.0.2
- object-keys: 1.1.1
- dev: true
+ tslib: 2.8.0
+ optional: true
- /delayed-stream@1.0.0:
- resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
- engines: {node: '>=0.4.0'}
+ '@eslint-community/eslint-utils@4.4.1(eslint@8.57.1)':
+ dependencies:
+ eslint: 8.57.1
+ eslint-visitor-keys: 3.4.3
- /dequal@2.0.3:
- resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
- engines: {node: '>=6'}
- dev: true
+ '@eslint-community/regexpp@4.12.1': {}
- /detect-libc@2.0.3:
- resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==}
- engines: {node: '>=8'}
- dev: false
+ '@eslint/eslintrc@2.1.4':
+ dependencies:
+ ajv: 6.12.6
+ debug: 4.3.7
+ espree: 9.6.1
+ globals: 13.24.0
+ ignore: 5.3.2
+ import-fresh: 3.3.0
+ js-yaml: 4.1.0
+ minimatch: 3.1.2
+ strip-json-comments: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
- /detect-node-es@1.1.0:
- resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==}
- dev: false
+ '@eslint/js@8.57.1': {}
- /didyoumean@1.2.2:
- resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
+ '@floating-ui/core@1.6.8':
+ dependencies:
+ '@floating-ui/utils': 0.2.8
- /diff-sequences@29.6.3:
- resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ '@floating-ui/dom@1.6.11':
+ dependencies:
+ '@floating-ui/core': 1.6.8
+ '@floating-ui/utils': 0.2.8
- /dir-glob@3.0.1:
- resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
- engines: {node: '>=8'}
+ '@floating-ui/react-dom@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
- path-type: 4.0.0
- dev: true
+ '@floating-ui/dom': 1.6.11
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
- /dlv@1.1.3:
- resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
+ '@floating-ui/utils@0.2.8': {}
- /doctrine@2.1.0:
- resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
- engines: {node: '>=0.10.0'}
+ '@hookform/resolvers@3.9.0(react-hook-form@7.53.1(react@18.3.1))':
dependencies:
- esutils: 2.0.3
- dev: true
+ react-hook-form: 7.53.1(react@18.3.1)
- /doctrine@3.0.0:
- resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
- engines: {node: '>=6.0.0'}
+ '@humanwhocodes/config-array@0.13.0':
dependencies:
- esutils: 2.0.3
+ '@humanwhocodes/object-schema': 2.0.3
+ debug: 4.3.7
+ minimatch: 3.1.2
+ transitivePeerDependencies:
+ - supports-color
- /dom-accessibility-api@0.5.16:
- resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==}
- dev: true
+ '@humanwhocodes/module-importer@1.0.1': {}
- /dom-accessibility-api@0.6.3:
- resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==}
- dev: true
+ '@humanwhocodes/object-schema@2.0.3': {}
- /dom-helpers@5.2.1:
- resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==}
+ '@ianvs/prettier-plugin-sort-imports@4.3.1(prettier@3.3.3)':
dependencies:
- '@babel/runtime': 7.25.4
- csstype: 3.1.3
- dev: false
+ '@babel/core': 7.26.0
+ '@babel/generator': 7.26.0
+ '@babel/parser': 7.26.1
+ '@babel/traverse': 7.25.9
+ '@babel/types': 7.26.0
+ prettier: 3.3.3
+ semver: 7.6.3
+ transitivePeerDependencies:
+ - supports-color
- /dom-serializer@2.0.0:
- resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
- dependencies:
- domelementtype: 2.3.0
- domhandler: 5.0.3
- entities: 4.5.0
- dev: false
+ '@img/sharp-darwin-arm64@0.33.5':
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-arm64': 1.0.4
+ optional: true
- /domelementtype@2.3.0:
- resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
- dev: false
+ '@img/sharp-darwin-x64@0.33.5':
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-x64': 1.0.4
+ optional: true
- /domhandler@5.0.3:
- resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
- engines: {node: '>= 4'}
- dependencies:
- domelementtype: 2.3.0
- dev: false
+ '@img/sharp-libvips-darwin-arm64@1.0.4':
+ optional: true
+
+ '@img/sharp-libvips-darwin-x64@1.0.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-arm64@1.0.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-arm@1.0.5':
+ optional: true
+
+ '@img/sharp-libvips-linux-s390x@1.0.4':
+ optional: true
- /domutils@3.1.0:
- resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==}
- dependencies:
- dom-serializer: 2.0.0
- domelementtype: 2.3.0
- domhandler: 5.0.3
- dev: false
+ '@img/sharp-libvips-linux-x64@1.0.4':
+ optional: true
- /dotenv@16.0.3:
- resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==}
- engines: {node: '>=12'}
- dev: false
+ '@img/sharp-libvips-linuxmusl-arm64@1.0.4':
+ optional: true
- /eastasianwidth@0.2.0:
- resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
+ '@img/sharp-libvips-linuxmusl-x64@1.0.4':
+ optional: true
- /editorconfig@1.0.4:
- resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==}
- engines: {node: '>=14'}
- hasBin: true
- dependencies:
- '@one-ini/wasm': 0.1.1
- commander: 10.0.1
- minimatch: 9.0.1
- semver: 7.6.3
- dev: false
+ '@img/sharp-linux-arm64@0.33.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm64': 1.0.4
+ optional: true
- /electron-to-chromium@1.5.13:
- resolution: {integrity: sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==}
+ '@img/sharp-linux-arm@0.33.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm': 1.0.5
+ optional: true
- /emoji-regex@8.0.0:
- resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+ '@img/sharp-linux-s390x@0.33.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-s390x': 1.0.4
+ optional: true
- /emoji-regex@9.2.2:
- resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+ '@img/sharp-linux-x64@0.33.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-x64': 1.0.4
+ optional: true
- /engine.io-client@6.5.4:
- resolution: {integrity: sha512-GeZeeRjpD2qf49cZQ0Wvh/8NJNfeXkXXcoGh+F77oEAgo9gUHwT1fCRxSNU+YEEaysOJTnsFHmM5oAcPy4ntvQ==}
- dependencies:
- '@socket.io/component-emitter': 3.1.2
- debug: 4.3.6
- engine.io-parser: 5.2.3
- ws: 8.17.1
- xmlhttprequest-ssl: 2.0.0
- transitivePeerDependencies:
- - bufferutil
- - supports-color
- - utf-8-validate
- dev: false
+ '@img/sharp-linuxmusl-arm64@0.33.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-arm64': 1.0.4
+ optional: true
- /engine.io-parser@5.2.3:
- resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==}
- engines: {node: '>=10.0.0'}
- dev: false
-
- /engine.io@6.5.5:
- resolution: {integrity: sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==}
- engines: {node: '>=10.2.0'}
- dependencies:
- '@types/cookie': 0.4.1
- '@types/cors': 2.8.17
- '@types/node': 20.16.1
- accepts: 1.3.8
- base64id: 2.0.0
- cookie: 0.4.2
- cors: 2.8.5
- debug: 4.3.6
- engine.io-parser: 5.2.3
- ws: 8.17.1
- transitivePeerDependencies:
- - bufferutil
- - supports-color
- - utf-8-validate
- dev: false
+ '@img/sharp-linuxmusl-x64@0.33.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-x64': 1.0.4
+ optional: true
- /enhanced-resolve@5.17.1:
- resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==}
- engines: {node: '>=10.13.0'}
+ '@img/sharp-wasm32@0.33.5':
dependencies:
- graceful-fs: 4.2.11
- tapable: 2.2.1
+ '@emnapi/runtime': 1.3.1
+ optional: true
- /entities@4.5.0:
- resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
- engines: {node: '>=0.12'}
+ '@img/sharp-win32-ia32@0.33.5':
+ optional: true
- /error-ex@1.3.2:
- resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
- dependencies:
- is-arrayish: 0.2.1
- dev: true
+ '@img/sharp-win32-x64@0.33.5':
+ optional: true
- /es-abstract@1.23.3:
- resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==}
- engines: {node: '>= 0.4'}
+ '@isaacs/cliui@8.0.2':
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.4
- 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.2
- 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
- dev: true
+ string-width: 5.1.2
+ string-width-cjs: string-width@4.2.3
+ strip-ansi: 7.1.0
+ strip-ansi-cjs: strip-ansi@6.0.1
+ wrap-ansi: 8.1.0
+ wrap-ansi-cjs: wrap-ansi@7.0.0
- /es-define-property@1.0.0:
- resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==}
- engines: {node: '>= 0.4'}
+ '@jridgewell/gen-mapping@0.3.5':
dependencies:
- get-intrinsic: 1.2.4
- dev: true
+ '@jridgewell/set-array': 1.2.1
+ '@jridgewell/sourcemap-codec': 1.5.0
+ '@jridgewell/trace-mapping': 0.3.25
- /es-errors@1.3.0:
- resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
- engines: {node: '>= 0.4'}
- dev: true
+ '@jridgewell/resolve-uri@3.1.2': {}
- /es-get-iterator@1.1.3:
- resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==}
- dependencies:
- call-bind: 1.0.7
- get-intrinsic: 1.2.4
- has-symbols: 1.0.3
- is-arguments: 1.1.1
- is-map: 2.0.3
- is-set: 2.0.3
- is-string: 1.0.7
- isarray: 2.0.5
- stop-iteration-iterator: 1.0.0
- dev: true
+ '@jridgewell/set-array@1.2.1': {}
- /es-iterator-helpers@1.0.19:
- resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==}
- engines: {node: '>= 0.4'}
+ '@jridgewell/sourcemap-codec@1.5.0': {}
+
+ '@jridgewell/trace-mapping@0.3.25':
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.4
- 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
- dev: true
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.0
- /es-module-lexer@1.5.4:
- resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==}
- dev: false
+ '@next/env@15.0.1': {}
- /es-object-atoms@1.0.0:
- resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==}
- engines: {node: '>= 0.4'}
+ '@next/eslint-plugin-next@14.2.13':
dependencies:
- es-errors: 1.3.0
- dev: true
+ glob: 10.3.10
- /es-set-tostringtag@2.0.3:
- resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==}
- engines: {node: '>= 0.4'}
- dependencies:
- get-intrinsic: 1.2.4
- has-tostringtag: 1.0.2
- hasown: 2.0.2
- dev: true
+ '@next/swc-darwin-arm64@15.0.1':
+ optional: true
- /es-shim-unscopables@1.0.2:
- resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==}
- dependencies:
- hasown: 2.0.2
- dev: true
+ '@next/swc-darwin-x64@15.0.1':
+ optional: true
- /es-to-primitive@1.2.1:
- resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==}
- engines: {node: '>= 0.4'}
- dependencies:
- is-callable: 1.2.7
- is-date-object: 1.0.5
- is-symbol: 1.0.4
- dev: true
+ '@next/swc-linux-arm64-gnu@15.0.1':
+ optional: true
- /esbuild@0.19.11:
- resolution: {integrity: sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==}
- engines: {node: '>=12'}
- hasBin: true
- requiresBuild: true
- optionalDependencies:
- '@esbuild/aix-ppc64': 0.19.11
- '@esbuild/android-arm': 0.19.11
- '@esbuild/android-arm64': 0.19.11
- '@esbuild/android-x64': 0.19.11
- '@esbuild/darwin-arm64': 0.19.11
- '@esbuild/darwin-x64': 0.19.11
- '@esbuild/freebsd-arm64': 0.19.11
- '@esbuild/freebsd-x64': 0.19.11
- '@esbuild/linux-arm': 0.19.11
- '@esbuild/linux-arm64': 0.19.11
- '@esbuild/linux-ia32': 0.19.11
- '@esbuild/linux-loong64': 0.19.11
- '@esbuild/linux-mips64el': 0.19.11
- '@esbuild/linux-ppc64': 0.19.11
- '@esbuild/linux-riscv64': 0.19.11
- '@esbuild/linux-s390x': 0.19.11
- '@esbuild/linux-x64': 0.19.11
- '@esbuild/netbsd-x64': 0.19.11
- '@esbuild/openbsd-x64': 0.19.11
- '@esbuild/sunos-x64': 0.19.11
- '@esbuild/win32-arm64': 0.19.11
- '@esbuild/win32-ia32': 0.19.11
- '@esbuild/win32-x64': 0.19.11
- dev: false
-
- /esbuild@0.21.5:
- resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==}
- engines: {node: '>=12'}
- hasBin: true
- requiresBuild: true
- optionalDependencies:
- '@esbuild/aix-ppc64': 0.21.5
- '@esbuild/android-arm': 0.21.5
- '@esbuild/android-arm64': 0.21.5
- '@esbuild/android-x64': 0.21.5
- '@esbuild/darwin-arm64': 0.21.5
- '@esbuild/darwin-x64': 0.21.5
- '@esbuild/freebsd-arm64': 0.21.5
- '@esbuild/freebsd-x64': 0.21.5
- '@esbuild/linux-arm': 0.21.5
- '@esbuild/linux-arm64': 0.21.5
- '@esbuild/linux-ia32': 0.21.5
- '@esbuild/linux-loong64': 0.21.5
- '@esbuild/linux-mips64el': 0.21.5
- '@esbuild/linux-ppc64': 0.21.5
- '@esbuild/linux-riscv64': 0.21.5
- '@esbuild/linux-s390x': 0.21.5
- '@esbuild/linux-x64': 0.21.5
- '@esbuild/netbsd-x64': 0.21.5
- '@esbuild/openbsd-x64': 0.21.5
- '@esbuild/sunos-x64': 0.21.5
- '@esbuild/win32-arm64': 0.21.5
- '@esbuild/win32-ia32': 0.21.5
- '@esbuild/win32-x64': 0.21.5
- dev: true
-
- /escalade@3.1.2:
- resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==}
- engines: {node: '>=6'}
+ '@next/swc-linux-arm64-musl@15.0.1':
+ optional: true
- /escape-string-regexp@1.0.5:
- resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
- engines: {node: '>=0.8.0'}
+ '@next/swc-linux-x64-gnu@15.0.1':
+ optional: true
- /escape-string-regexp@2.0.0:
- resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==}
- engines: {node: '>=8'}
- dev: false
+ '@next/swc-linux-x64-musl@15.0.1':
+ optional: true
- /escape-string-regexp@4.0.0:
- resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
- engines: {node: '>=10'}
+ '@next/swc-win32-arm64-msvc@15.0.1':
+ optional: true
- /eslint-config-next@14.2.4(eslint@8.57.0)(typescript@5.5.4):
- resolution: {integrity: sha512-Qr0wMgG9m6m4uYy2jrYJmyuNlYZzPRQq5Kvb9IDlYwn+7yq6W6sfMNFgb+9guM1KYwuIo6TIaiFhZJ6SnQ/Efw==}
- peerDependencies:
- eslint: ^7.23.0 || ^8.0.0
- typescript: '>=3.3.1'
- peerDependenciesMeta:
- typescript:
- optional: true
- dependencies:
- '@next/eslint-plugin-next': 14.2.4
- '@rushstack/eslint-patch': 1.10.4
- '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.4)
- eslint: 8.57.0
- eslint-import-resolver-node: 0.3.9
- eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0)
- eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.18.0)(eslint@8.57.0)
- eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0)
- eslint-plugin-react: 7.35.0(eslint@8.57.0)
- eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0)
- typescript: 5.5.4
- transitivePeerDependencies:
- - eslint-import-resolver-webpack
- - supports-color
- dev: true
+ '@next/swc-win32-x64-msvc@15.0.1':
+ optional: true
- /eslint-config-prettier@9.0.0(eslint@8.57.0):
- resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==}
- hasBin: true
- peerDependencies:
- eslint: '>=7.0.0'
+ '@nodelib/fs.scandir@2.1.5':
dependencies:
- eslint: 8.57.0
- dev: false
+ '@nodelib/fs.stat': 2.0.5
+ run-parallel: 1.2.0
- /eslint-config-prettier@9.1.0(eslint@8.57.0):
- resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==}
- hasBin: true
- peerDependencies:
- eslint: '>=7.0.0'
- dependencies:
- eslint: 8.57.0
- dev: true
+ '@nodelib/fs.stat@2.0.5': {}
- /eslint-config-turbo@1.10.12(eslint@8.57.0):
- resolution: {integrity: sha512-z3jfh+D7UGYlzMWGh+Kqz++hf8LOE96q3o5R8X4HTjmxaBWlLAWG+0Ounr38h+JLR2TJno0hU9zfzoPNkR9BdA==}
- peerDependencies:
- eslint: '>6.6.0'
+ '@nodelib/fs.walk@1.2.8':
dependencies:
- eslint: 8.57.0
- eslint-plugin-turbo: 1.10.12(eslint@8.57.0)
- dev: false
+ '@nodelib/fs.scandir': 2.1.5
+ fastq: 1.17.1
- /eslint-import-resolver-node@0.3.9:
- resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==}
- dependencies:
- debug: 3.2.7
- is-core-module: 2.15.1
- resolve: 1.22.8
- transitivePeerDependencies:
- - supports-color
- dev: true
+ '@nolyfill/is-core-module@1.0.39': {}
- /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0):
- resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==}
- engines: {node: ^14.18.0 || >=16.0.0}
- peerDependencies:
- eslint: '*'
- eslint-plugin-import: '*'
- dependencies:
- debug: 4.3.6
- enhanced-resolve: 5.17.1
- eslint: 8.57.0
- eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0)
- eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.18.0)(eslint@8.57.0)
- fast-glob: 3.3.2
- get-tsconfig: 4.7.6
- is-core-module: 2.15.1
- is-glob: 4.0.3
- transitivePeerDependencies:
- - '@typescript-eslint/parser'
- - eslint-import-resolver-node
- - eslint-import-resolver-webpack
- - supports-color
- dev: true
+ '@panva/hkdf@1.2.1': {}
- /eslint-module-utils@2.8.1(@typescript-eslint/parser@7.18.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0):
- resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==}
- engines: {node: '>=4'}
- peerDependencies:
- '@typescript-eslint/parser': '*'
- eslint: '*'
- eslint-import-resolver-node: '*'
- eslint-import-resolver-typescript: '*'
- eslint-import-resolver-webpack: '*'
- peerDependenciesMeta:
- '@typescript-eslint/parser':
- optional: true
- eslint:
- optional: true
- eslint-import-resolver-node:
- optional: true
- eslint-import-resolver-typescript:
- optional: true
- eslint-import-resolver-webpack:
- optional: true
- dependencies:
- '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.5.4)
- debug: 3.2.7
- eslint: 8.57.0
- eslint-import-resolver-node: 0.3.9
- transitivePeerDependencies:
- - supports-color
- dev: true
+ '@pkgjs/parseargs@0.11.0':
+ optional: true
- /eslint-module-utils@2.8.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0):
- resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==}
- engines: {node: '>=4'}
- peerDependencies:
- '@typescript-eslint/parser': '*'
- eslint: '*'
- eslint-import-resolver-node: '*'
- eslint-import-resolver-typescript: '*'
- eslint-import-resolver-webpack: '*'
- peerDependenciesMeta:
- '@typescript-eslint/parser':
- optional: true
- eslint:
- optional: true
- eslint-import-resolver-node:
- optional: true
- eslint-import-resolver-typescript:
- optional: true
- eslint-import-resolver-webpack:
- optional: true
+ '@radix-ui/primitive@1.1.0': {}
+
+ '@radix-ui/react-accordion@1.2.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-collapsible': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
+
+ '@radix-ui/react-arrow@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
- '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.4)
- debug: 3.2.7
- eslint: 8.57.0
- eslint-import-resolver-node: 0.3.9
- eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0)
- transitivePeerDependencies:
- - supports-color
- dev: true
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
- /eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0)(eslint@8.57.0):
- resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==}
- engines: {node: '>=4'}
- peerDependencies:
- '@typescript-eslint/parser': '*'
- eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8
- peerDependenciesMeta:
- '@typescript-eslint/parser':
- optional: true
+ '@radix-ui/react-avatar@1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
- '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.5.4)
- 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: 8.57.0
- eslint-import-resolver-node: 0.3.9
- eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.18.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.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
- transitivePeerDependencies:
- - eslint-import-resolver-typescript
- - eslint-import-resolver-webpack
- - supports-color
- dev: true
+ '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
- /eslint-plugin-jsx-a11y@6.9.0(eslint@8.57.0):
- resolution: {integrity: sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==}
- engines: {node: '>=4.0'}
- peerDependencies:
- eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
+ '@radix-ui/react-checkbox@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
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: 3.1.1
- damerau-levenshtein: 1.0.8
- emoji-regex: 9.2.2
- es-iterator-helpers: 1.0.19
- eslint: 8.57.0
- hasown: 2.0.2
- jsx-ast-utils: 3.3.5
- language-tags: 1.0.9
- minimatch: 3.1.2
- object.fromentries: 2.0.8
- safe-regex-test: 1.0.3
- string.prototype.includes: 2.0.0
- dev: true
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
- /eslint-plugin-prettier@5.2.1(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.3.3):
- resolution: {integrity: sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==}
- engines: {node: ^14.18.0 || >=16.0.0}
- peerDependencies:
- '@types/eslint': '>=8.0.0'
- eslint: '>=8.0.0'
- eslint-config-prettier: '*'
- prettier: '>=3.0.0'
- peerDependenciesMeta:
- '@types/eslint':
- optional: true
- eslint-config-prettier:
- optional: true
+ '@radix-ui/react-collapsible@1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
- eslint: 8.57.0
- eslint-config-prettier: 9.1.0(eslint@8.57.0)
- prettier: 3.3.3
- prettier-linter-helpers: 1.0.0
- synckit: 0.9.1
- dev: true
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
- /eslint-plugin-react-hooks@4.6.2(eslint@8.57.0):
- resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==}
- engines: {node: '>=10'}
- peerDependencies:
- eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0
+ '@radix-ui/react-collection@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
- eslint: 8.57.0
- dev: true
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-slot': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
- /eslint-plugin-react@7.35.0(eslint@8.57.0):
- resolution: {integrity: sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==}
- engines: {node: '>=4'}
- peerDependencies:
- eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7
+ '@radix-ui/react-compose-refs@1.1.0(@types/react@18.3.12)(react@18.3.1)':
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
- eslint: 8.57.0
- estraverse: 5.3.0
- hasown: 2.0.2
- jsx-ast-utils: 3.3.5
- minimatch: 3.1.2
- object.entries: 1.1.8
- object.fromentries: 2.0.8
- object.values: 1.2.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
- dev: true
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.12
- /eslint-plugin-testing-library@6.3.0(eslint@8.57.0)(typescript@5.5.4):
- resolution: {integrity: sha512-GYcEErTt6EGwE0bPDY+4aehfEBpB2gDBFKohir8jlATSUvzStEyzCx8QWB/14xeKc/AwyXkzScSzMHnFojkWrA==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'}
- peerDependencies:
- eslint: ^7.5.0 || ^8.0.0
+ '@radix-ui/react-context@1.1.0(@types/react@18.3.12)(react@18.3.1)':
dependencies:
- '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4)
- eslint: 8.57.0
- transitivePeerDependencies:
- - supports-color
- - typescript
- dev: true
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.12
- /eslint-plugin-turbo@1.10.12(eslint@8.57.0):
- resolution: {integrity: sha512-uNbdj+ohZaYo4tFJ6dStRXu2FZigwulR1b3URPXe0Q8YaE7thuekKNP+54CHtZPH9Zey9dmDx5btAQl9mfzGOw==}
- peerDependencies:
- eslint: '>6.6.0'
+ '@radix-ui/react-context@1.1.1(@types/react@18.3.12)(react@18.3.1)':
dependencies:
- dotenv: 16.0.3
- eslint: 8.57.0
- dev: false
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.12
- /eslint-plugin-unicorn@54.0.0(eslint@8.57.0):
- resolution: {integrity: sha512-XxYLRiYtAWiAjPv6z4JREby1TAE2byBC7wlh0V4vWDCpccOSU1KovWV//jqPXF6bq3WKxqX9rdjoRQ1EhdmNdQ==}
- engines: {node: '>=18.18'}
- peerDependencies:
- eslint: '>=8.56.0'
- dependencies:
- '@babel/helper-validator-identifier': 7.24.7
- '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
- '@eslint/eslintrc': 3.1.0
- ci-info: 4.0.0
- clean-regexp: 1.0.0
- core-js-compat: 3.38.1
- eslint: 8.57.0
- esquery: 1.6.0
- indent-string: 4.0.0
- is-builtin-module: 3.2.1
- jsesc: 3.0.2
- pluralize: 8.0.0
- read-pkg-up: 7.0.1
- regexp-tree: 0.1.27
- regjsparser: 0.10.0
- semver: 7.6.3
- strip-indent: 3.0.0
- transitivePeerDependencies:
- - supports-color
- dev: true
+ '@radix-ui/react-direction@1.1.0(@types/react@18.3.12)(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.12
- /eslint-plugin-unused-imports@3.2.0(@typescript-eslint/eslint-plugin@7.18.0)(eslint@8.57.0):
- resolution: {integrity: sha512-6uXyn6xdINEpxE1MtDjxQsyXB37lfyO2yKGVVgtD7WEWQGORSOZjgrD6hBhvGv4/SO+TOlS+UnC6JppRqbuwGQ==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- peerDependencies:
- '@typescript-eslint/eslint-plugin': 6 - 7
- eslint: '8'
- peerDependenciesMeta:
- '@typescript-eslint/eslint-plugin':
- optional: true
+ '@radix-ui/react-dismissable-layer@1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
- '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0)(eslint@8.57.0)(typescript@5.5.4)
- eslint: 8.57.0
- eslint-rule-composer: 0.3.0
- dev: true
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
- /eslint-plugin-vitest@0.4.1(@typescript-eslint/eslint-plugin@7.18.0)(eslint@8.57.0)(typescript@5.5.4)(vitest@1.6.0):
- resolution: {integrity: sha512-+PnZ2u/BS+f5FiuHXz4zKsHPcMKHie+K+1Uvu/x91ovkCMEOJqEI8E9Tw1Wzx2QRz4MHOBHYf1ypO8N1K0aNAA==}
- engines: {node: ^18.0.0 || >= 20.0.0}
- peerDependencies:
- '@typescript-eslint/eslint-plugin': '*'
- eslint: '>=8.0.0'
- vitest: '*'
- peerDependenciesMeta:
- '@typescript-eslint/eslint-plugin':
- optional: true
- vitest:
- optional: true
+ '@radix-ui/react-dropdown-menu@2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
- '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0)(eslint@8.57.0)(typescript@5.5.4)
- '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4)
- eslint: 8.57.0
- vitest: 1.6.0(@types/node@20.16.1)(@vitest/ui@1.6.0)(jsdom@24.1.3)
- transitivePeerDependencies:
- - supports-color
- - typescript
- dev: true
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-menu': 2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
- /eslint-rule-composer@0.3.0:
- resolution: {integrity: sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==}
- engines: {node: '>=4.0.0'}
- dev: true
+ '@radix-ui/react-focus-guards@1.1.1(@types/react@18.3.12)(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.12
- /eslint-scope@5.1.1:
- resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
- engines: {node: '>=8.0.0'}
+ '@radix-ui/react-focus-scope@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
- esrecurse: 4.3.0
- estraverse: 4.3.0
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
- /eslint-scope@7.2.2:
- resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ '@radix-ui/react-icons@1.3.0(react@18.3.1)':
dependencies:
- esrecurse: 4.3.0
- estraverse: 5.3.0
+ react: 18.3.1
- /eslint-visitor-keys@3.4.3:
- resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ '@radix-ui/react-id@1.1.0(@types/react@18.3.12)(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.12
- /eslint-visitor-keys@4.0.0:
- resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- dev: true
+ '@radix-ui/react-label@2.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
- /eslint@8.57.0:
- resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- hasBin: true
+ '@radix-ui/react-menu@2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
- '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
- '@eslint-community/regexpp': 4.11.0
- '@eslint/eslintrc': 2.1.4
- '@eslint/js': 8.57.0
- '@humanwhocodes/config-array': 0.11.14
- '@humanwhocodes/module-importer': 1.0.1
- '@nodelib/fs.walk': 1.2.8
- '@ungap/structured-clone': 1.2.0
- ajv: 6.12.6
- chalk: 4.1.2
- cross-spawn: 7.0.3
- debug: 4.3.6
- doctrine: 3.0.0
- escape-string-regexp: 4.0.0
- eslint-scope: 7.2.2
- eslint-visitor-keys: 3.4.3
- espree: 9.6.1
- esquery: 1.6.0
- esutils: 2.0.3
- fast-deep-equal: 3.1.3
- file-entry-cache: 6.0.1
- find-up: 5.0.0
- glob-parent: 6.0.2
- globals: 13.24.0
- graphemer: 1.4.0
- ignore: 5.3.2
- imurmurhash: 0.1.4
- is-glob: 4.0.3
- is-path-inside: 3.0.3
- js-yaml: 4.1.0
- 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.4
- strip-ansi: 6.0.1
- text-table: 0.2.0
- transitivePeerDependencies:
- - supports-color
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-slot': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ aria-hidden: 1.2.4
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-remove-scroll: 2.6.0(@types/react@18.3.12)(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
+
+ '@radix-ui/react-popper@1.2.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-arrow': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/rect': 1.1.0
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
- /espree@10.1.0:
- resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ '@radix-ui/react-portal@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
- acorn: 8.12.1
- acorn-jsx: 5.3.2(acorn@8.12.1)
- eslint-visitor-keys: 4.0.0
- dev: true
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
- /espree@9.6.1:
- resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ '@radix-ui/react-presence@1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
- acorn: 8.12.1
- acorn-jsx: 5.3.2(acorn@8.12.1)
- eslint-visitor-keys: 3.4.3
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
- /esquery@1.6.0:
- resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
- engines: {node: '>=0.10'}
+ '@radix-ui/react-primitive@2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
- estraverse: 5.3.0
+ '@radix-ui/react-slot': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
- /esrecurse@4.3.0:
- resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
- engines: {node: '>=4.0'}
+ '@radix-ui/react-roving-focus@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
- estraverse: 5.3.0
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
- /estraverse@4.3.0:
- resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==}
- engines: {node: '>=4.0'}
+ '@radix-ui/react-slot@1.1.0(@types/react@18.3.12)(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.12
- /estraverse@5.3.0:
- resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
- engines: {node: '>=4.0'}
+ '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.12)(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.12
- /estree-walker@3.0.3:
- resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
+ '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.12)(react@18.3.1)':
dependencies:
- '@types/estree': 1.0.5
- dev: true
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.12
- /esutils@2.0.3:
- resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
- engines: {node: '>=0.10.0'}
+ '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.12)(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.12
- /eventemitter3@4.0.7:
- resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==}
- dev: false
+ '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.12)(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.12
- /events@3.3.0:
- resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
- engines: {node: '>=0.8.x'}
- dev: false
+ '@radix-ui/react-use-previous@1.1.0(@types/react@18.3.12)(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.12
- /execa@8.0.1:
- resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==}
- engines: {node: '>=16.17'}
+ '@radix-ui/react-use-rect@1.1.0(@types/react@18.3.12)(react@18.3.1)':
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.3.0
- onetime: 6.0.0
- signal-exit: 4.1.0
- strip-final-newline: 3.0.0
- dev: true
+ '@radix-ui/rect': 1.1.0
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.12
- /expect@29.7.0:
- resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ '@radix-ui/react-use-size@1.1.0(@types/react@18.3.12)(react@18.3.1)':
dependencies:
- '@jest/expect-utils': 29.7.0
- jest-get-type: 29.6.3
- jest-matcher-utils: 29.7.0
- jest-message-util: 29.7.0
- jest-util: 29.7.0
- dev: false
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.12
- /fast-deep-equal@2.0.1:
- resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==}
- dev: false
+ '@radix-ui/rect@1.1.0': {}
- /fast-deep-equal@3.1.3:
- resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+ '@rtsao/scc@1.1.0': {}
- /fast-diff@1.3.0:
- resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==}
- dev: true
+ '@rushstack/eslint-patch@1.10.4': {}
- /fast-equals@5.0.1:
- resolution: {integrity: sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==}
- engines: {node: '>=6.0.0'}
- dev: false
+ '@swc/counter@0.1.3': {}
- /fast-glob@3.3.2:
- resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==}
- engines: {node: '>=8.6.0'}
+ '@swc/helpers@0.5.13':
dependencies:
- '@nodelib/fs.stat': 2.0.5
- '@nodelib/fs.walk': 1.2.8
- glob-parent: 5.1.2
- merge2: 1.4.1
- micromatch: 4.0.8
+ tslib: 2.8.0
- /fast-json-stable-stringify@2.1.0:
- resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+ '@tanstack/query-core@5.59.16': {}
- /fast-levenshtein@2.0.6:
- resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+ '@tanstack/query-devtools@5.58.0': {}
- /fastq@1.17.1:
- resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==}
+ '@tanstack/react-query-devtools@5.59.16(@tanstack/react-query@5.59.16(react@18.3.1))(react@18.3.1)':
dependencies:
- reusify: 1.0.4
-
- /fflate@0.8.2:
- resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==}
- dev: true
+ '@tanstack/query-devtools': 5.58.0
+ '@tanstack/react-query': 5.59.16(react@18.3.1)
+ react: 18.3.1
- /file-entry-cache@6.0.1:
- resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
- engines: {node: ^10.12.0 || >=12.0.0}
+ '@tanstack/react-query@5.59.16(react@18.3.1)':
dependencies:
- flat-cache: 3.2.0
+ '@tanstack/query-core': 5.59.16
+ react: 18.3.1
- /fill-range@7.1.1:
- resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
- engines: {node: '>=8'}
+ '@types/conventional-commits-parser@5.0.0':
dependencies:
- to-regex-range: 5.0.1
+ '@types/node': 20.17.1
- /find-up@4.1.0:
- resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
- engines: {node: '>=8'}
- dependencies:
- locate-path: 5.0.0
- path-exists: 4.0.0
- dev: true
+ '@types/cookie@0.6.0': {}
- /find-up@5.0.0:
- resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
- engines: {node: '>=10'}
+ '@types/json5@0.0.29': {}
+
+ '@types/node@20.17.1':
dependencies:
- locate-path: 6.0.0
- path-exists: 4.0.0
+ undici-types: 6.19.8
- /flat-cache@3.2.0:
- resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==}
- engines: {node: ^10.12.0 || >=12.0.0}
+ '@types/prop-types@15.7.13': {}
+
+ '@types/react-dom@18.3.1':
dependencies:
- flatted: 3.3.1
- keyv: 4.5.4
- rimraf: 3.0.2
+ '@types/react': 18.3.12
- /flatted@3.3.1:
- resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==}
+ '@types/react@18.3.12':
+ dependencies:
+ '@types/prop-types': 15.7.13
+ csstype: 3.1.3
- /follow-redirects@1.15.6:
- resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==}
- engines: {node: '>=4.0'}
- peerDependencies:
- debug: '*'
- peerDependenciesMeta:
- debug:
- optional: true
- dev: false
+ '@typescript-eslint/eslint-plugin@8.11.0(@typescript-eslint/parser@8.11.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3)':
+ dependencies:
+ '@eslint-community/regexpp': 4.12.1
+ '@typescript-eslint/parser': 8.11.0(eslint@8.57.1)(typescript@5.6.3)
+ '@typescript-eslint/scope-manager': 8.11.0
+ '@typescript-eslint/type-utils': 8.11.0(eslint@8.57.1)(typescript@5.6.3)
+ '@typescript-eslint/utils': 8.11.0(eslint@8.57.1)(typescript@5.6.3)
+ '@typescript-eslint/visitor-keys': 8.11.0
+ eslint: 8.57.1
+ graphemer: 1.4.0
+ ignore: 5.3.2
+ natural-compare: 1.4.0
+ ts-api-utils: 1.3.0(typescript@5.6.3)
+ optionalDependencies:
+ typescript: 5.6.3
+ transitivePeerDependencies:
+ - supports-color
- /for-each@0.3.3:
- resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
+ '@typescript-eslint/parser@8.11.0(eslint@8.57.1)(typescript@5.6.3)':
dependencies:
- is-callable: 1.2.7
- dev: true
+ '@typescript-eslint/scope-manager': 8.11.0
+ '@typescript-eslint/types': 8.11.0
+ '@typescript-eslint/typescript-estree': 8.11.0(typescript@5.6.3)
+ '@typescript-eslint/visitor-keys': 8.11.0
+ debug: 4.3.7
+ eslint: 8.57.1
+ optionalDependencies:
+ typescript: 5.6.3
+ transitivePeerDependencies:
+ - supports-color
- /foreground-child@3.3.0:
- resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==}
- engines: {node: '>=14'}
+ '@typescript-eslint/scope-manager@8.11.0':
dependencies:
- cross-spawn: 7.0.3
- signal-exit: 4.1.0
+ '@typescript-eslint/types': 8.11.0
+ '@typescript-eslint/visitor-keys': 8.11.0
- /form-data@4.0.0:
- resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
- engines: {node: '>= 6'}
+ '@typescript-eslint/type-utils@8.11.0(eslint@8.57.1)(typescript@5.6.3)':
dependencies:
- asynckit: 0.4.0
- combined-stream: 1.0.8
- mime-types: 2.1.35
+ '@typescript-eslint/typescript-estree': 8.11.0(typescript@5.6.3)
+ '@typescript-eslint/utils': 8.11.0(eslint@8.57.1)(typescript@5.6.3)
+ debug: 4.3.7
+ ts-api-utils: 1.3.0(typescript@5.6.3)
+ optionalDependencies:
+ typescript: 5.6.3
+ transitivePeerDependencies:
+ - eslint
+ - supports-color
- /fraction.js@4.3.7:
- resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
+ '@typescript-eslint/types@8.11.0': {}
- /framer-motion@10.17.4(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-CYBSs6cWfzcasAX8aofgKFZootmkQtR4qxbfTOksBLny/lbUfkGbQAFOS3qnl6Uau1N9y8tUpI7mVIrHgkFjLQ==}
- peerDependencies:
- react: ^18.0.0
- react-dom: ^18.0.0
- peerDependenciesMeta:
- react:
- optional: true
- react-dom:
- optional: true
+ '@typescript-eslint/typescript-estree@8.11.0(typescript@5.6.3)':
dependencies:
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- tslib: 2.7.0
+ '@typescript-eslint/types': 8.11.0
+ '@typescript-eslint/visitor-keys': 8.11.0
+ debug: 4.3.7
+ fast-glob: 3.3.2
+ is-glob: 4.0.3
+ minimatch: 9.0.5
+ semver: 7.6.3
+ ts-api-utils: 1.3.0(typescript@5.6.3)
optionalDependencies:
- '@emotion/is-prop-valid': 0.8.8
- dev: false
+ typescript: 5.6.3
+ transitivePeerDependencies:
+ - supports-color
- /framer-motion@11.3.30(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-9VmqGe9OIjfMoCcs+ZsKXlv6JaG5QagKX2F1uSbkG3Z33wgjnz60Kw+CngC1M49rDYau+Y9aL+8jGagAwrbVyw==}
- 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
+ '@typescript-eslint/utils@8.11.0(eslint@8.57.1)(typescript@5.6.3)':
dependencies:
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- tslib: 2.7.0
- dev: false
+ '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1)
+ '@typescript-eslint/scope-manager': 8.11.0
+ '@typescript-eslint/types': 8.11.0
+ '@typescript-eslint/typescript-estree': 8.11.0(typescript@5.6.3)
+ eslint: 8.57.1
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
- /fs.realpath@1.0.0:
- resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+ '@typescript-eslint/visitor-keys@8.11.0':
+ dependencies:
+ '@typescript-eslint/types': 8.11.0
+ eslint-visitor-keys: 3.4.3
- /fsevents@2.3.3:
- resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
- engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
- os: [darwin]
- requiresBuild: true
- optional: true
+ '@ungap/structured-clone@1.2.0': {}
- /function-bind@1.1.2:
- resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+ JSONStream@1.3.5:
+ dependencies:
+ jsonparse: 1.3.1
+ through: 2.3.8
- /function.prototype.name@1.1.6:
- resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==}
- engines: {node: '>= 0.4'}
+ acorn-jsx@5.3.2(acorn@8.14.0):
dependencies:
- call-bind: 1.0.7
- define-properties: 1.2.1
- es-abstract: 1.23.3
- functions-have-names: 1.2.3
- dev: true
+ acorn: 8.14.0
- /functions-have-names@1.2.3:
- resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
- dev: true
+ acorn@8.14.0: {}
- /gensync@1.0.0-beta.2:
- resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
- engines: {node: '>=6.9.0'}
+ ajv@6.12.6:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-json-stable-stringify: 2.1.0
+ json-schema-traverse: 0.4.1
+ uri-js: 4.4.1
- /get-func-name@2.0.2:
- resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==}
- dev: true
+ ajv@8.17.1:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-uri: 3.0.3
+ json-schema-traverse: 1.0.0
+ require-from-string: 2.0.2
- /get-intrinsic@1.2.4:
- resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==}
- engines: {node: '>= 0.4'}
+ ansi-escapes@7.0.0:
dependencies:
- es-errors: 1.3.0
- function-bind: 1.1.2
- has-proto: 1.0.3
- has-symbols: 1.0.3
- hasown: 2.0.2
- dev: true
+ environment: 1.1.0
- /get-nonce@1.0.1:
- resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==}
- engines: {node: '>=6'}
- dev: false
+ ansi-regex@5.0.1: {}
- /get-stream@8.0.1:
- resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==}
- engines: {node: '>=16'}
- dev: true
+ ansi-regex@6.1.0: {}
- /get-symbol-description@1.0.2:
- resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==}
- engines: {node: '>= 0.4'}
+ ansi-styles@4.3.0:
dependencies:
- call-bind: 1.0.7
- es-errors: 1.3.0
- get-intrinsic: 1.2.4
- dev: true
+ color-convert: 2.0.1
- /get-tsconfig@4.7.6:
- resolution: {integrity: sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==}
- dependencies:
- resolve-pkg-maps: 1.0.0
- dev: true
+ ansi-styles@6.2.1: {}
- /glob-parent@5.1.2:
- resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
- engines: {node: '>= 6'}
- dependencies:
- is-glob: 4.0.3
+ any-promise@1.3.0: {}
- /glob-parent@6.0.2:
- resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
- engines: {node: '>=10.13.0'}
+ anymatch@3.1.3:
dependencies:
- is-glob: 4.0.3
+ normalize-path: 3.0.0
+ picomatch: 2.3.1
- /glob-to-regexp@0.4.1:
- resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==}
- dev: false
+ arg@5.0.2: {}
- /glob@10.3.10:
- resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==}
- engines: {node: '>=16 || 14 >=14.17'}
- hasBin: true
- dependencies:
- foreground-child: 3.3.0
- jackspeak: 2.3.6
- minimatch: 9.0.5
- minipass: 7.1.2
- path-scurry: 1.11.1
- dev: true
+ argparse@2.0.1: {}
- /glob@10.3.4:
- resolution: {integrity: sha512-6LFElP3A+i/Q8XQKEvZjkEWEOTgAIALR9AO2rwT8bgPhDd1anmqDJDZ6lLddI4ehxxxR1S5RIqKe1uapMQfYaQ==}
- engines: {node: '>=16 || 14 >=14.17'}
- hasBin: true
+ aria-hidden@1.2.4:
dependencies:
- foreground-child: 3.3.0
- jackspeak: 2.3.6
- minimatch: 9.0.5
- minipass: 7.1.2
- path-scurry: 1.11.1
- dev: false
+ tslib: 2.8.0
- /glob@10.4.5:
- resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==}
- hasBin: true
+ aria-query@5.3.2: {}
+
+ array-buffer-byte-length@1.0.1:
dependencies:
- foreground-child: 3.3.0
- jackspeak: 3.4.3
- minimatch: 9.0.5
- minipass: 7.1.2
- package-json-from-dist: 1.0.0
- path-scurry: 1.11.1
+ call-bind: 1.0.7
+ is-array-buffer: 3.0.4
- /glob@7.2.3:
- resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
- deprecated: Glob versions prior to v9 are no longer supported
+ array-ify@1.0.0: {}
+
+ array-includes@3.1.8:
dependencies:
- fs.realpath: 1.0.0
- inflight: 1.0.6
- inherits: 2.0.4
- minimatch: 3.1.2
- once: 1.4.0
- path-is-absolute: 1.0.1
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-object-atoms: 1.0.0
+ get-intrinsic: 1.2.4
+ is-string: 1.0.7
- /globals@11.12.0:
- resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
- engines: {node: '>=4'}
+ array.prototype.findlast@1.2.5:
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-errors: 1.3.0
+ es-object-atoms: 1.0.0
+ es-shim-unscopables: 1.0.2
- /globals@13.24.0:
- resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==}
- engines: {node: '>=8'}
+ array.prototype.findlastindex@1.2.5:
dependencies:
- type-fest: 0.20.2
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-errors: 1.3.0
+ es-object-atoms: 1.0.0
+ es-shim-unscopables: 1.0.2
- /globals@14.0.0:
- resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
- engines: {node: '>=18'}
- dev: true
+ array.prototype.flat@1.3.2:
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-shim-unscopables: 1.0.2
- /globalthis@1.0.4:
- resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
- engines: {node: '>= 0.4'}
+ array.prototype.flatmap@1.3.2:
dependencies:
+ call-bind: 1.0.7
define-properties: 1.2.1
- gopd: 1.0.1
- dev: true
+ es-abstract: 1.23.3
+ es-shim-unscopables: 1.0.2
- /globby@11.1.0:
- resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
- engines: {node: '>=10'}
+ array.prototype.tosorted@1.1.4:
dependencies:
- array-union: 2.1.0
- dir-glob: 3.0.1
- fast-glob: 3.3.2
- ignore: 5.3.2
- merge2: 1.4.1
- slash: 3.0.0
- dev: true
+ 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
- /gopd@1.0.1:
- resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
+ arraybuffer.prototype.slice@1.0.3:
dependencies:
+ array-buffer-byte-length: 1.0.1
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-errors: 1.3.0
get-intrinsic: 1.2.4
- dev: true
+ is-array-buffer: 3.0.4
+ is-shared-array-buffer: 1.0.3
- /graceful-fs@4.2.11:
- resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+ ast-types-flow@0.0.8: {}
+
+ asynckit@0.4.0: {}
+
+ available-typed-arrays@1.0.7:
+ dependencies:
+ possible-typed-array-names: 1.0.0
+
+ axe-core@4.10.2: {}
+
+ axios@1.7.7:
+ dependencies:
+ follow-redirects: 1.15.9
+ form-data: 4.0.1
+ proxy-from-env: 1.1.0
+ transitivePeerDependencies:
+ - debug
- /graphemer@1.4.0:
- resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
+ axobject-query@4.1.0: {}
- /has-bigints@1.0.2:
- resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
- dev: true
+ balanced-match@1.0.2: {}
- /has-flag@3.0.0:
- resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
- engines: {node: '>=4'}
+ binary-extensions@2.3.0: {}
- /has-flag@4.0.0:
- resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
- engines: {node: '>=8'}
+ brace-expansion@1.1.11:
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
- /has-property-descriptors@1.0.2:
- resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
+ brace-expansion@2.0.1:
dependencies:
- es-define-property: 1.0.0
- dev: true
+ balanced-match: 1.0.2
- /has-proto@1.0.3:
- resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==}
- engines: {node: '>= 0.4'}
- dev: true
+ braces@3.0.3:
+ dependencies:
+ fill-range: 7.1.1
- /has-symbols@1.0.3:
- resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
- engines: {node: '>= 0.4'}
- dev: true
+ browserslist@4.24.2:
+ dependencies:
+ caniuse-lite: 1.0.30001673
+ electron-to-chromium: 1.5.47
+ node-releases: 2.0.18
+ update-browserslist-db: 1.1.1(browserslist@4.24.2)
- /has-tostringtag@1.0.2:
- resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
- engines: {node: '>= 0.4'}
+ busboy@1.6.0:
dependencies:
- has-symbols: 1.0.3
- dev: true
+ streamsearch: 1.1.0
- /hasown@2.0.2:
- resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
- engines: {node: '>= 0.4'}
+ call-bind@1.0.7:
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.2
- /hosted-git-info@2.8.9:
- resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==}
- dev: true
+ callsites@3.1.0: {}
- /html-encoding-sniffer@4.0.0:
- resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==}
- engines: {node: '>=18'}
+ camelcase-css@2.0.1: {}
+
+ caniuse-lite@1.0.30001673: {}
+
+ chalk@4.1.2:
dependencies:
- whatwg-encoding: 3.1.1
- dev: true
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
- /html-escaper@2.0.2:
- resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
- dev: true
+ chalk@5.3.0: {}
- /html-to-text@9.0.5:
- resolution: {integrity: sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==}
- engines: {node: '>=14'}
+ chokidar@3.6.0:
dependencies:
- '@selderee/plugin-htmlparser2': 0.11.0
- deepmerge: 4.3.1
- dom-serializer: 2.0.0
- htmlparser2: 8.0.2
- selderee: 0.11.0
- dev: false
+ anymatch: 3.1.3
+ braces: 3.0.3
+ glob-parent: 5.1.2
+ is-binary-path: 2.1.0
+ is-glob: 4.0.3
+ normalize-path: 3.0.0
+ readdirp: 3.6.0
+ optionalDependencies:
+ fsevents: 2.3.3
- /htmlparser2@8.0.2:
- resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==}
+ class-variance-authority@0.7.0:
dependencies:
- domelementtype: 2.3.0
- domhandler: 5.0.3
- domutils: 3.1.0
- entities: 4.5.0
- dev: false
+ clsx: 2.0.0
- /http-proxy-agent@7.0.2:
- resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==}
- engines: {node: '>= 14'}
+ cli-cursor@5.0.0:
dependencies:
- agent-base: 7.1.1
- debug: 4.3.6
- transitivePeerDependencies:
- - supports-color
- dev: true
+ restore-cursor: 5.1.0
- /https-proxy-agent@7.0.5:
- resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==}
- engines: {node: '>= 14'}
+ cli-truncate@4.0.0:
dependencies:
- agent-base: 7.1.1
- debug: 4.3.6
- transitivePeerDependencies:
- - supports-color
- dev: true
+ slice-ansi: 5.0.0
+ string-width: 7.2.0
- /human-signals@5.0.0:
- resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==}
- engines: {node: '>=16.17.0'}
- dev: true
+ client-only@0.0.1: {}
- /iconv-lite@0.6.3:
- resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
- engines: {node: '>=0.10.0'}
+ cliui@8.0.1:
dependencies:
- safer-buffer: 2.1.2
- dev: true
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wrap-ansi: 7.0.0
- /ieee754@1.2.1:
- resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
- dev: false
+ clsx@2.0.0: {}
- /ignore@5.3.2:
- resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
- engines: {node: '>= 4'}
+ clsx@2.1.1: {}
- /import-fresh@3.3.0:
- resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
- engines: {node: '>=6'}
+ color-convert@2.0.1:
dependencies:
- parent-module: 1.0.1
- resolve-from: 4.0.0
-
- /imurmurhash@0.1.4:
- resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
- engines: {node: '>=0.8.19'}
+ color-name: 1.1.4
- /indent-string@4.0.0:
- resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==}
- engines: {node: '>=8'}
- dev: true
+ color-name@1.1.4: {}
- /inflight@1.0.6:
- resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
- deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
+ color-string@1.9.1:
dependencies:
- once: 1.4.0
- wrappy: 1.0.2
+ color-name: 1.1.4
+ simple-swizzle: 0.2.2
+ optional: true
- /inherits@2.0.4:
- resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+ color@4.2.3:
+ dependencies:
+ color-convert: 2.0.1
+ color-string: 1.9.1
+ optional: true
- /ini@1.3.8:
- resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
- dev: false
+ colorette@2.0.20: {}
- /input-otp@1.2.4(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-md6rhmD+zmMnUh5crQNSQxq3keBRYvE3odbr4Qb9g2NWzQv9azi+t1a3X4TBTbh98fsGHgEEJlzbe1q860uGCA==}
- peerDependencies:
- react: ^16.8 || ^17.0 || ^18.0
- react-dom: ^16.8 || ^17.0 || ^18.0
+ combined-stream@1.0.8:
dependencies:
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
+ delayed-stream: 1.0.0
- /internal-slot@1.0.7:
- resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==}
- engines: {node: '>= 0.4'}
- dependencies:
- es-errors: 1.3.0
- hasown: 2.0.2
- side-channel: 1.0.6
- dev: true
+ commander@12.1.0: {}
- /internmap@2.0.3:
- resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==}
- engines: {node: '>=12'}
- dev: false
+ commander@4.1.1: {}
- /intl-messageformat@10.5.14:
- resolution: {integrity: sha512-IjC6sI0X7YRjjyVH9aUgdftcmZK7WXdHeil4KwbjDnRWjnVitKpAx3rr6t6di1joFp5188VqKcobOPA6mCLG/w==}
+ compare-func@2.0.0:
dependencies:
- '@formatjs/ecma402-abstract': 2.0.0
- '@formatjs/fast-memoize': 2.2.0
- '@formatjs/icu-messageformat-parser': 2.7.8
- tslib: 2.7.0
- dev: false
+ array-ify: 1.0.0
+ dot-prop: 5.3.0
- /invariant@2.2.4:
- resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==}
+ concat-map@0.0.1: {}
+
+ conventional-changelog-angular@7.0.0:
dependencies:
- loose-envify: 1.4.0
- dev: false
+ compare-func: 2.0.0
- /is-arguments@1.1.1:
- resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==}
- engines: {node: '>= 0.4'}
+ conventional-changelog-conventionalcommits@7.0.2:
dependencies:
- call-bind: 1.0.7
- has-tostringtag: 1.0.2
- dev: true
+ compare-func: 2.0.0
- /is-array-buffer@3.0.4:
- resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==}
- engines: {node: '>= 0.4'}
+ conventional-commits-parser@5.0.0:
dependencies:
- call-bind: 1.0.7
- get-intrinsic: 1.2.4
- dev: true
+ JSONStream: 1.3.5
+ is-text-path: 2.0.0
+ meow: 12.1.1
+ split2: 4.2.0
- /is-arrayish@0.2.1:
- resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
- dev: true
+ convert-source-map@2.0.0: {}
- /is-arrayish@0.3.2:
- resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==}
- dev: false
+ cookie@0.7.1: {}
- /is-async-function@2.0.0:
- resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==}
- engines: {node: '>= 0.4'}
+ cosmiconfig-typescript-loader@5.1.0(@types/node@20.17.1)(cosmiconfig@9.0.0(typescript@5.6.3))(typescript@5.6.3):
dependencies:
- has-tostringtag: 1.0.2
- dev: true
+ '@types/node': 20.17.1
+ cosmiconfig: 9.0.0(typescript@5.6.3)
+ jiti: 1.21.6
+ typescript: 5.6.3
- /is-bigint@1.0.4:
- resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==}
+ cosmiconfig@9.0.0(typescript@5.6.3):
dependencies:
- has-bigints: 1.0.2
- dev: true
+ env-paths: 2.2.1
+ import-fresh: 3.3.0
+ js-yaml: 4.1.0
+ parse-json: 5.2.0
+ optionalDependencies:
+ typescript: 5.6.3
- /is-binary-path@2.1.0:
- resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
- engines: {node: '>=8'}
+ cross-spawn@7.0.3:
dependencies:
- binary-extensions: 2.3.0
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.2
- /is-boolean-object@1.1.2:
- resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.7
- has-tostringtag: 1.0.2
- dev: true
+ cssesc@3.0.0: {}
- /is-builtin-module@3.2.1:
- resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==}
- engines: {node: '>=6'}
- dependencies:
- builtin-modules: 3.3.0
- dev: true
+ csstype@3.1.3: {}
- /is-callable@1.2.7:
- resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
- engines: {node: '>= 0.4'}
- dev: true
+ damerau-levenshtein@1.0.8: {}
- /is-core-module@2.15.1:
- resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==}
- engines: {node: '>= 0.4'}
+ dargs@8.1.0: {}
+
+ data-view-buffer@1.0.1:
dependencies:
- hasown: 2.0.2
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ is-data-view: 1.0.1
- /is-data-view@1.0.1:
- resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==}
- engines: {node: '>= 0.4'}
+ data-view-byte-length@1.0.1:
dependencies:
- is-typed-array: 1.1.13
- dev: true
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ is-data-view: 1.0.1
- /is-date-object@1.0.5:
- resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
- engines: {node: '>= 0.4'}
+ data-view-byte-offset@1.0.0:
dependencies:
- has-tostringtag: 1.0.2
- dev: true
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ is-data-view: 1.0.1
- /is-extglob@2.1.1:
- resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
- engines: {node: '>=0.10.0'}
+ debug@3.2.7:
+ dependencies:
+ ms: 2.1.3
- /is-finalizationregistry@1.0.2:
- resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==}
+ debug@4.3.7:
dependencies:
- call-bind: 1.0.7
- dev: true
+ ms: 2.1.3
- /is-fullwidth-code-point@3.0.0:
- resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
- engines: {node: '>=8'}
+ deep-is@0.1.4: {}
- /is-generator-function@1.0.10:
- resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==}
- engines: {node: '>= 0.4'}
+ define-data-property@1.1.4:
dependencies:
- has-tostringtag: 1.0.2
- dev: true
+ es-define-property: 1.0.0
+ es-errors: 1.3.0
+ gopd: 1.0.1
- /is-glob@4.0.3:
- resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
- engines: {node: '>=0.10.0'}
+ define-properties@1.2.1:
dependencies:
- is-extglob: 2.1.1
+ define-data-property: 1.1.4
+ has-property-descriptors: 1.0.2
+ object-keys: 1.1.1
- /is-interactive@1.0.0:
- resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==}
- engines: {node: '>=8'}
- dev: false
+ delayed-stream@1.0.0: {}
- /is-map@2.0.3:
- resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
- engines: {node: '>= 0.4'}
- dev: true
+ detect-libc@2.0.3:
+ optional: true
- /is-negative-zero@2.0.3:
- resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==}
- engines: {node: '>= 0.4'}
- dev: true
+ detect-node-es@1.1.0: {}
- /is-number-object@1.0.7:
- resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==}
- engines: {node: '>= 0.4'}
- dependencies:
- has-tostringtag: 1.0.2
- dev: true
+ didyoumean@1.2.2: {}
- /is-number@7.0.0:
- resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
- engines: {node: '>=0.12.0'}
+ dlv@1.1.3: {}
- /is-path-inside@3.0.3:
- resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
- engines: {node: '>=8'}
+ doctrine@2.1.0:
+ dependencies:
+ esutils: 2.0.3
- /is-potential-custom-element-name@1.0.1:
- resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==}
- dev: true
+ doctrine@3.0.0:
+ dependencies:
+ esutils: 2.0.3
- /is-regex@1.1.4:
- resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
- engines: {node: '>= 0.4'}
+ dot-prop@5.3.0:
dependencies:
- call-bind: 1.0.7
- has-tostringtag: 1.0.2
- dev: true
+ is-obj: 2.0.0
- /is-set@2.0.3:
- resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==}
- engines: {node: '>= 0.4'}
- dev: true
+ eastasianwidth@0.2.0: {}
- /is-shared-array-buffer@1.0.3:
- resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.7
- dev: true
+ electron-to-chromium@1.5.47: {}
- /is-stream@3.0.0:
- resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
- dev: true
+ emoji-regex@10.4.0: {}
- /is-string@1.0.7:
- resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==}
- engines: {node: '>= 0.4'}
- dependencies:
- has-tostringtag: 1.0.2
- dev: true
+ emoji-regex@8.0.0: {}
- /is-symbol@1.0.4:
- resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==}
- engines: {node: '>= 0.4'}
- dependencies:
- has-symbols: 1.0.3
- dev: true
+ emoji-regex@9.2.2: {}
- /is-typed-array@1.1.13:
- resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==}
- engines: {node: '>= 0.4'}
+ enhanced-resolve@5.17.1:
dependencies:
- which-typed-array: 1.1.15
- dev: true
+ graceful-fs: 4.2.11
+ tapable: 2.2.1
- /is-unicode-supported@0.1.0:
- resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==}
- engines: {node: '>=10'}
- dev: false
+ env-paths@2.2.1: {}
- /is-weakmap@2.0.2:
- resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==}
- engines: {node: '>= 0.4'}
- dev: true
+ environment@1.1.0: {}
- /is-weakref@1.0.2:
- resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==}
+ error-ex@1.3.2:
+ dependencies:
+ is-arrayish: 0.2.1
+
+ es-abstract@1.23.3:
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
- dev: true
+ 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.4
+ 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.2
+ object-keys: 1.1.1
+ object.assign: 4.1.5
+ regexp.prototype.flags: 1.5.3
+ 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
- /is-weakset@2.0.3:
- resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==}
- engines: {node: '>= 0.4'}
+ es-define-property@1.0.0:
dependencies:
- call-bind: 1.0.7
get-intrinsic: 1.2.4
- dev: true
-
- /isarray@2.0.5:
- resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
- dev: true
-
- /isexe@2.0.0:
- resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
-
- /istanbul-lib-coverage@3.2.2:
- resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==}
- engines: {node: '>=8'}
- dev: true
-
- /istanbul-lib-instrument@6.0.3:
- resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==}
- engines: {node: '>=10'}
- dependencies:
- '@babel/core': 7.25.2
- '@babel/parser': 7.25.4
- '@istanbuljs/schema': 0.1.3
- istanbul-lib-coverage: 3.2.2
- semver: 7.6.3
- transitivePeerDependencies:
- - supports-color
- dev: true
-
- /istanbul-lib-report@3.0.1:
- resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==}
- engines: {node: '>=10'}
- dependencies:
- istanbul-lib-coverage: 3.2.2
- make-dir: 4.0.0
- supports-color: 7.2.0
- dev: true
-
- /istanbul-lib-source-maps@5.0.6:
- resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==}
- engines: {node: '>=10'}
- dependencies:
- '@jridgewell/trace-mapping': 0.3.25
- debug: 4.3.6
- istanbul-lib-coverage: 3.2.2
- transitivePeerDependencies:
- - supports-color
- dev: true
- /istanbul-reports@3.1.7:
- resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==}
- engines: {node: '>=8'}
- dependencies:
- html-escaper: 2.0.2
- istanbul-lib-report: 3.0.1
- dev: true
+ es-errors@1.3.0: {}
- /iterator.prototype@1.1.2:
- resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==}
+ es-iterator-helpers@1.1.0:
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.4
+ has-property-descriptors: 1.0.2
+ has-proto: 1.0.3
has-symbols: 1.0.3
- reflect.getprototypeof: 1.0.6
- set-function-name: 2.0.2
- dev: true
+ internal-slot: 1.0.7
+ iterator.prototype: 1.1.3
+ safe-array-concat: 1.1.2
- /jackspeak@2.3.6:
- resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==}
- engines: {node: '>=14'}
+ es-object-atoms@1.0.0:
dependencies:
- '@isaacs/cliui': 8.0.2
- optionalDependencies:
- '@pkgjs/parseargs': 0.11.0
+ es-errors: 1.3.0
- /jackspeak@3.4.3:
- resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
+ es-set-tostringtag@2.0.3:
dependencies:
- '@isaacs/cliui': 8.0.2
- optionalDependencies:
- '@pkgjs/parseargs': 0.11.0
+ get-intrinsic: 1.2.4
+ has-tostringtag: 1.0.2
+ hasown: 2.0.2
- /jest-axe@9.0.0:
- resolution: {integrity: sha512-Xt7O0+wIpW31lv0SO1wQZUTyJE7DEmnDEZeTt9/S9L5WUywxrv8BrgvTuQEqujtfaQOcJ70p4wg7UUgK1E2F5g==}
- engines: {node: '>= 16.0.0'}
+ es-shim-unscopables@1.0.2:
dependencies:
- axe-core: 4.9.1
- chalk: 4.1.2
- jest-matcher-utils: 29.2.2
- lodash.merge: 4.6.2
- dev: false
+ hasown: 2.0.2
- /jest-diff@29.7.0:
- resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ es-to-primitive@1.2.1:
dependencies:
- chalk: 4.1.2
- diff-sequences: 29.6.3
- jest-get-type: 29.6.3
- pretty-format: 29.7.0
- dev: false
-
- /jest-get-type@29.6.3:
- resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- dev: false
+ is-callable: 1.2.7
+ is-date-object: 1.0.5
+ is-symbol: 1.0.4
- /jest-matcher-utils@29.2.2:
- resolution: {integrity: sha512-4DkJ1sDPT+UX2MR7Y3od6KtvRi9Im1ZGLGgdLFLm4lPexbTaCgJW5NN3IOXlQHF7NSHY/VHhflQ+WoKtD/vyCw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- dependencies:
- chalk: 4.1.2
- jest-diff: 29.7.0
- jest-get-type: 29.6.3
- pretty-format: 29.7.0
- dev: false
+ escalade@3.2.0: {}
- /jest-matcher-utils@29.7.0:
- resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- dependencies:
- chalk: 4.1.2
- jest-diff: 29.7.0
- jest-get-type: 29.6.3
- pretty-format: 29.7.0
- dev: false
-
- /jest-message-util@29.7.0:
- resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- dependencies:
- '@babel/code-frame': 7.24.7
- '@jest/types': 29.6.3
- '@types/stack-utils': 2.0.3
- chalk: 4.1.2
- graceful-fs: 4.2.11
- micromatch: 4.0.8
- pretty-format: 29.7.0
- slash: 3.0.0
- stack-utils: 2.0.6
- dev: false
+ escape-string-regexp@4.0.0: {}
- /jest-util@29.7.0:
- resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ eslint-config-next@14.2.13(eslint@8.57.1)(typescript@5.6.3):
dependencies:
- '@jest/types': 29.6.3
- '@types/node': 20.16.1
- chalk: 4.1.2
- ci-info: 3.9.0
- graceful-fs: 4.2.11
- picomatch: 2.3.1
- dev: false
+ '@next/eslint-plugin-next': 14.2.13
+ '@rushstack/eslint-patch': 1.10.4
+ '@typescript-eslint/eslint-plugin': 8.11.0(@typescript-eslint/parser@8.11.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3)
+ '@typescript-eslint/parser': 8.11.0(eslint@8.57.1)(typescript@5.6.3)
+ eslint: 8.57.1
+ eslint-import-resolver-node: 0.3.9
+ eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.11.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1)
+ eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.11.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
+ eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1)
+ eslint-plugin-react: 7.37.2(eslint@8.57.1)
+ eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.1)
+ optionalDependencies:
+ typescript: 5.6.3
+ transitivePeerDependencies:
+ - eslint-import-resolver-webpack
+ - eslint-plugin-import-x
+ - supports-color
- /jest-worker@27.5.1:
- resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==}
- engines: {node: '>= 10.13.0'}
+ eslint-import-resolver-node@0.3.9:
dependencies:
- '@types/node': 20.16.1
- merge-stream: 2.0.0
- supports-color: 8.1.1
- dev: false
-
- /jiti@1.21.6:
- resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==}
- hasBin: true
-
- /jose@5.7.0:
- resolution: {integrity: sha512-3P9qfTYDVnNn642LCAqIKbTGb9a1TBxZ9ti5zEVEr48aDdflgRjhspWFb6WM4PzAfFbGMJYC4+803v8riCRAKw==}
- dev: false
+ debug: 3.2.7
+ is-core-module: 2.15.1
+ resolve: 1.22.8
+ transitivePeerDependencies:
+ - supports-color
- /js-beautify@1.15.1:
- resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==}
- engines: {node: '>=14'}
- hasBin: true
+ eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.11.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1):
dependencies:
- config-chain: 1.1.13
- editorconfig: 1.0.4
- glob: 10.4.5
- js-cookie: 3.0.5
- nopt: 7.2.1
- dev: false
-
- /js-cookie@3.0.5:
- resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==}
- engines: {node: '>=14'}
- dev: false
-
- /js-tokens@4.0.0:
- resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
-
- /js-tokens@9.0.0:
- resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==}
- dev: true
+ '@nolyfill/is-core-module': 1.0.39
+ debug: 4.3.7
+ enhanced-resolve: 5.17.1
+ eslint: 8.57.1
+ eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.11.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
+ fast-glob: 3.3.2
+ get-tsconfig: 4.8.1
+ is-bun-module: 1.2.1
+ is-glob: 4.0.3
+ optionalDependencies:
+ eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.11.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
+ transitivePeerDependencies:
+ - '@typescript-eslint/parser'
+ - eslint-import-resolver-node
+ - eslint-import-resolver-webpack
+ - supports-color
- /js-yaml@4.1.0:
- resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
- hasBin: true
+ eslint-module-utils@2.12.0(@typescript-eslint/parser@8.11.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1):
dependencies:
- argparse: 2.0.1
+ debug: 3.2.7
+ optionalDependencies:
+ '@typescript-eslint/parser': 8.11.0(eslint@8.57.1)(typescript@5.6.3)
+ eslint: 8.57.1
+ eslint-import-resolver-node: 0.3.9
+ eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.11.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1)
+ transitivePeerDependencies:
+ - supports-color
- /jsdom@24.1.3:
- resolution: {integrity: sha512-MyL55p3Ut3cXbeBEG7Hcv0mVM8pp8PBNWxRqchZnSfAiES1v1mRnMeFfaHWIPULpwsYfvO+ZmMZz5tGCnjzDUQ==}
- engines: {node: '>=18'}
- peerDependencies:
- canvas: ^2.11.2
- peerDependenciesMeta:
- canvas:
- optional: true
+ eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.11.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1):
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
+ '@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: 8.57.1
+ eslint-import-resolver-node: 0.3.9
+ eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.11.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
+ hasown: 2.0.2
+ is-core-module: 2.15.1
+ is-glob: 4.0.3
+ minimatch: 3.1.2
+ object.fromentries: 2.0.8
+ object.groupby: 1.0.3
+ object.values: 1.2.0
+ semver: 6.3.1
+ string.prototype.trimend: 1.0.8
+ tsconfig-paths: 3.15.0
+ optionalDependencies:
+ '@typescript-eslint/parser': 8.11.0(eslint@8.57.1)(typescript@5.6.3)
transitivePeerDependencies:
- - bufferutil
+ - eslint-import-resolver-typescript
+ - eslint-import-resolver-webpack
- supports-color
- - utf-8-validate
- dev: true
-
- /jsesc@0.5.0:
- resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==}
- hasBin: true
- dev: true
-
- /jsesc@2.5.2:
- resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
- engines: {node: '>=4'}
- hasBin: true
-
- /jsesc@3.0.2:
- resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==}
- engines: {node: '>=6'}
- hasBin: true
- dev: true
-
- /json-buffer@3.0.1:
- resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
- /json-parse-even-better-errors@2.3.1:
- resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
-
- /json-schema-traverse@0.4.1:
- resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
-
- /json-stable-stringify-without-jsonify@1.0.1:
- resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
-
- /json5@1.0.2:
- resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
- hasBin: true
+ eslint-plugin-jsx-a11y@6.10.2(eslint@8.57.1):
dependencies:
- minimist: 1.2.8
- dev: true
+ aria-query: 5.3.2
+ array-includes: 3.1.8
+ array.prototype.flatmap: 1.3.2
+ ast-types-flow: 0.0.8
+ axe-core: 4.10.2
+ axobject-query: 4.1.0
+ damerau-levenshtein: 1.0.8
+ emoji-regex: 9.2.2
+ eslint: 8.57.1
+ hasown: 2.0.2
+ jsx-ast-utils: 3.3.5
+ language-tags: 1.0.9
+ minimatch: 3.1.2
+ object.fromentries: 2.0.8
+ safe-regex-test: 1.0.3
+ string.prototype.includes: 2.0.1
- /json5@2.2.3:
- resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
- engines: {node: '>=6'}
- hasBin: true
+ eslint-plugin-react-hooks@5.0.0-canary-7118f5dd7-20230705(eslint@8.57.1):
+ dependencies:
+ eslint: 8.57.1
- /jsx-ast-utils@3.3.5:
- resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==}
- engines: {node: '>=4.0'}
+ eslint-plugin-react@7.37.2(eslint@8.57.1):
dependencies:
array-includes: 3.1.8
- array.prototype.flat: 1.3.2
- object.assign: 4.1.5
+ 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.1.0
+ eslint: 8.57.1
+ estraverse: 5.3.0
+ hasown: 2.0.2
+ jsx-ast-utils: 3.3.5
+ minimatch: 3.1.2
+ object.entries: 1.1.8
+ object.fromentries: 2.0.8
object.values: 1.2.0
- dev: true
+ 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
- /keyv@4.5.4:
- resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
+ eslint-scope@7.2.2:
dependencies:
- json-buffer: 3.0.1
-
- /langs@2.0.0:
- resolution: {integrity: sha512-v4pxOBEQVN1WBTfB1crhTtxzNLZU9HPWgadlwzWKISJtt6Ku/CnpBrwVy+jFv8StjxsPfwPFzO0CMwdZLJ0/BA==}
- dev: false
+ esrecurse: 4.3.0
+ estraverse: 5.3.0
- /language-subtag-registry@0.3.23:
- resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==}
- dev: true
+ eslint-visitor-keys@3.4.3: {}
- /language-tags@1.0.9:
- resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==}
- engines: {node: '>=0.10'}
+ eslint@8.57.1:
dependencies:
- language-subtag-registry: 0.3.23
- dev: true
-
- /leac@0.6.0:
- resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==}
- dev: false
+ '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1)
+ '@eslint-community/regexpp': 4.12.1
+ '@eslint/eslintrc': 2.1.4
+ '@eslint/js': 8.57.1
+ '@humanwhocodes/config-array': 0.13.0
+ '@humanwhocodes/module-importer': 1.0.1
+ '@nodelib/fs.walk': 1.2.8
+ '@ungap/structured-clone': 1.2.0
+ ajv: 6.12.6
+ chalk: 4.1.2
+ cross-spawn: 7.0.3
+ debug: 4.3.7
+ doctrine: 3.0.0
+ escape-string-regexp: 4.0.0
+ eslint-scope: 7.2.2
+ eslint-visitor-keys: 3.4.3
+ espree: 9.6.1
+ esquery: 1.6.0
+ esutils: 2.0.3
+ fast-deep-equal: 3.1.3
+ file-entry-cache: 6.0.1
+ find-up: 5.0.0
+ glob-parent: 6.0.2
+ globals: 13.24.0
+ graphemer: 1.4.0
+ ignore: 5.3.2
+ imurmurhash: 0.1.4
+ is-glob: 4.0.3
+ is-path-inside: 3.0.3
+ js-yaml: 4.1.0
+ 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.4
+ strip-ansi: 6.0.1
+ text-table: 0.2.0
+ transitivePeerDependencies:
+ - supports-color
- /lenis@1.1.11(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-ykl6sYWhECtD/9N1JiKhKCY10LEYnGaxgQzo5tFQcHlkD9zZx2ZSUydqk1Xtk/w13+ZGv9qMyhcG7d8s159ONQ==}
- peerDependencies:
- react: '>=17.0.0'
- react-dom: '>=17.0.0'
- peerDependenciesMeta:
- react:
- optional: true
- react-dom:
- optional: true
+ espree@9.6.1:
dependencies:
- '@darkroom.engineering/tempus': 0.0.46
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
+ acorn: 8.14.0
+ acorn-jsx: 5.3.2(acorn@8.14.0)
+ eslint-visitor-keys: 3.4.3
- /levn@0.4.1:
- resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
- engines: {node: '>= 0.8.0'}
+ esquery@1.6.0:
dependencies:
- prelude-ls: 1.2.1
- type-check: 0.4.0
+ estraverse: 5.3.0
- /lilconfig@2.1.0:
- resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
- engines: {node: '>=10'}
+ esrecurse@4.3.0:
+ dependencies:
+ estraverse: 5.3.0
- /lilconfig@3.1.2:
- resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==}
- engines: {node: '>=14'}
+ estraverse@5.3.0: {}
- /lines-and-columns@1.2.4:
- resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+ esutils@2.0.3: {}
- /loader-runner@4.3.0:
- resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==}
- engines: {node: '>=6.11.5'}
- dev: false
+ eventemitter3@5.0.1: {}
- /local-pkg@0.5.0:
- resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==}
- engines: {node: '>=14'}
+ execa@8.0.1:
dependencies:
- mlly: 1.7.1
- pkg-types: 1.2.0
- dev: true
+ 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.3.0
+ onetime: 6.0.0
+ signal-exit: 4.1.0
+ strip-final-newline: 3.0.0
- /locate-path@5.0.0:
- resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
- engines: {node: '>=8'}
- dependencies:
- p-locate: 4.1.0
- dev: true
+ fast-deep-equal@3.1.3: {}
- /locate-path@6.0.0:
- resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
- engines: {node: '>=10'}
+ fast-glob@3.3.2:
dependencies:
- p-locate: 5.0.0
+ '@nodelib/fs.stat': 2.0.5
+ '@nodelib/fs.walk': 1.2.8
+ glob-parent: 5.1.2
+ merge2: 1.4.1
+ micromatch: 4.0.8
- /lodash.merge@4.6.2:
- resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+ fast-json-stable-stringify@2.1.0: {}
- /lodash@4.17.21:
- resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+ fast-levenshtein@2.0.6: {}
- /log-symbols@4.1.0:
- resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
- engines: {node: '>=10'}
+ fast-uri@3.0.3: {}
+
+ fastq@1.17.1:
dependencies:
- chalk: 4.1.2
- is-unicode-supported: 0.1.0
- dev: false
+ reusify: 1.0.4
- /loose-envify@1.4.0:
- resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
- hasBin: true
+ file-entry-cache@6.0.1:
dependencies:
- js-tokens: 4.0.0
+ flat-cache: 3.2.0
- /loupe@2.3.7:
- resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==}
+ fill-range@7.1.1:
dependencies:
- get-func-name: 2.0.2
- dev: true
+ to-regex-range: 5.0.1
- /lru-cache@10.4.3:
- resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
+ find-up@5.0.0:
+ dependencies:
+ locate-path: 6.0.0
+ path-exists: 4.0.0
- /lru-cache@5.1.1:
- resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+ find-up@7.0.0:
dependencies:
- yallist: 3.1.1
+ locate-path: 7.2.0
+ path-exists: 5.0.0
+ unicorn-magic: 0.1.0
- /lucide-react@0.400.0(react@18.3.1):
- resolution: {integrity: sha512-rpp7pFHh3Xd93KHixNgB0SqThMHpYNzsGUu69UaQbSZ75Q/J3m5t6EhKyMT3m4w2WOxmJ2mY0tD3vebnXqQryQ==}
- peerDependencies:
- react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ flat-cache@3.2.0:
dependencies:
- react: 18.3.1
- dev: false
+ flatted: 3.3.1
+ keyv: 4.5.4
+ rimraf: 3.0.2
- /lz-string@1.5.0:
- resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==}
- hasBin: true
- dev: true
+ flatted@3.3.1: {}
- /magic-string@0.30.11:
- resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==}
- dependencies:
- '@jridgewell/sourcemap-codec': 1.5.0
- dev: true
+ follow-redirects@1.15.9: {}
- /magicast@0.3.4:
- resolution: {integrity: sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==}
+ for-each@0.3.3:
dependencies:
- '@babel/parser': 7.25.4
- '@babel/types': 7.25.4
- source-map-js: 1.2.0
- dev: true
+ is-callable: 1.2.7
- /make-dir@4.0.0:
- resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==}
- engines: {node: '>=10'}
+ foreground-child@3.3.0:
dependencies:
- semver: 7.6.3
- dev: true
+ cross-spawn: 7.0.3
+ signal-exit: 4.1.0
- /marked@7.0.4:
- resolution: {integrity: sha512-t8eP0dXRJMtMvBojtkcsA7n48BkauktUKzfkPSCq85ZMTJ0v76Rke4DYz01omYpPTUh4p/f7HePgRo3ebG8+QQ==}
- engines: {node: '>= 16'}
- hasBin: true
- dev: false
+ form-data@4.0.1:
+ dependencies:
+ asynckit: 0.4.0
+ combined-stream: 1.0.8
+ mime-types: 2.1.35
- /md-to-react-email@5.0.2(react@18.3.1):
- resolution: {integrity: sha512-x6kkpdzIzUhecda/yahltfEl53mH26QdWu4abUF9+S0Jgam8P//Ciro8cdhyMHnT5MQUJYrIbO6ORM2UxPiNNA==}
- peerDependencies:
- react: 18.x
+ framer-motion@11.11.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- marked: 7.0.4
+ tslib: 2.8.0
+ optionalDependencies:
react: 18.3.1
- dev: false
+ react-dom: 18.3.1(react@18.3.1)
- /merge-stream@2.0.0:
- resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+ fs.realpath@1.0.0: {}
- /merge2@1.4.1:
- resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
- engines: {node: '>= 8'}
+ fsevents@2.3.3:
+ optional: true
- /micromatch@4.0.8:
- resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
- engines: {node: '>=8.6'}
+ function-bind@1.1.2: {}
+
+ function.prototype.name@1.1.6:
dependencies:
- braces: 3.0.3
- picomatch: 2.3.1
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ functions-have-names: 1.2.3
- /mime-db@1.52.0:
- resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
- engines: {node: '>= 0.6'}
+ functions-have-names@1.2.3: {}
- /mime-types@2.1.35:
- resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
- engines: {node: '>= 0.6'}
- dependencies:
- mime-db: 1.52.0
+ gensync@1.0.0-beta.2: {}
- /mimic-fn@2.1.0:
- resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
- engines: {node: '>=6'}
- dev: false
+ get-caller-file@2.0.5: {}
- /mimic-fn@4.0.0:
- resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==}
- engines: {node: '>=12'}
- dev: true
+ get-east-asian-width@1.3.0: {}
- /min-indent@1.0.1:
- resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
- engines: {node: '>=4'}
- dev: true
+ get-intrinsic@1.2.4:
+ dependencies:
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+ has-proto: 1.0.3
+ has-symbols: 1.0.3
+ hasown: 2.0.2
- /minimatch@3.1.2:
- resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+ get-nonce@1.0.1: {}
+
+ get-stream@8.0.1: {}
+
+ get-symbol-description@1.0.2:
dependencies:
- brace-expansion: 1.1.11
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.4
- /minimatch@9.0.1:
- resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==}
- engines: {node: '>=16 || 14 >=14.17'}
+ get-tsconfig@4.8.1:
dependencies:
- brace-expansion: 2.0.1
- dev: false
+ resolve-pkg-maps: 1.0.0
- /minimatch@9.0.3:
- resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==}
- engines: {node: '>=16 || 14 >=14.17'}
+ git-raw-commits@4.0.0:
dependencies:
- brace-expansion: 2.0.1
- dev: true
+ dargs: 8.1.0
+ meow: 12.1.1
+ split2: 4.2.0
- /minimatch@9.0.5:
- resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
- engines: {node: '>=16 || 14 >=14.17'}
+ glob-parent@5.1.2:
dependencies:
- brace-expansion: 2.0.1
+ is-glob: 4.0.3
- /minimist@1.2.8:
- resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
- dev: true
+ glob-parent@6.0.2:
+ dependencies:
+ is-glob: 4.0.3
- /minipass@7.1.2:
- resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
- engines: {node: '>=16 || 14 >=14.17'}
+ glob@10.3.10:
+ dependencies:
+ foreground-child: 3.3.0
+ jackspeak: 2.3.6
+ minimatch: 9.0.5
+ minipass: 7.1.2
+ path-scurry: 1.11.1
- /mlly@1.7.1:
- resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==}
+ glob@10.4.5:
dependencies:
- acorn: 8.12.1
- pathe: 1.1.2
- pkg-types: 1.2.0
- ufo: 1.5.4
- dev: true
+ foreground-child: 3.3.0
+ jackspeak: 3.4.3
+ minimatch: 9.0.5
+ minipass: 7.1.2
+ package-json-from-dist: 1.0.1
+ path-scurry: 1.11.1
- /moment-timezone@0.5.45:
- resolution: {integrity: sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ==}
+ glob@7.2.3:
dependencies:
- moment: 2.30.1
- dev: false
+ fs.realpath: 1.0.0
+ inflight: 1.0.6
+ inherits: 2.0.4
+ minimatch: 3.1.2
+ once: 1.4.0
+ path-is-absolute: 1.0.1
- /moment@2.30.1:
- resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==}
- dev: false
+ global-directory@4.0.1:
+ dependencies:
+ ini: 4.1.1
- /mrmime@2.0.0:
- resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==}
- engines: {node: '>=10'}
- dev: true
+ globals@11.12.0: {}
- /ms@2.1.2:
- resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
+ globals@13.24.0:
+ dependencies:
+ type-fest: 0.20.2
- /ms@2.1.3:
- resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
- dev: true
+ globalthis@1.0.4:
+ dependencies:
+ define-properties: 1.2.1
+ gopd: 1.0.1
- /mz@2.7.0:
- resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
+ gopd@1.0.1:
dependencies:
- any-promise: 1.3.0
- object-assign: 4.1.1
- thenify-all: 1.6.0
+ get-intrinsic: 1.2.4
- /nanoid@3.3.7:
- resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
- engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
- hasBin: true
+ graceful-fs@4.2.11: {}
- /natural-compare@1.4.0:
- resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+ graphemer@1.4.0: {}
- /negotiator@0.6.3:
- resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
- engines: {node: '>= 0.6'}
- dev: false
+ has-bigints@1.0.2: {}
- /neo-async@2.6.2:
- resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
- dev: false
+ has-flag@4.0.0: {}
- /next-auth@5.0.0-beta.20(next@14.2.5)(react@18.3.1):
- resolution: {integrity: sha512-+48SjV9k9AtUU3JbEIa4PXNjKIewfFjVGL7Xs2RKkuQ5QqegDNIQiIG8sLk6/qo7RTScQYIGKgeQ5IuQRtrTQg==}
- peerDependencies:
- '@simplewebauthn/browser': ^9.0.1
- '@simplewebauthn/server': ^9.0.2
- next: ^14.0.0-0 || ^15.0.0-0
- nodemailer: ^6.6.5
- react: ^18.2.0 || ^19.0.0-0
- peerDependenciesMeta:
- '@simplewebauthn/browser':
- optional: true
- '@simplewebauthn/server':
- optional: true
- nodemailer:
- optional: true
+ has-property-descriptors@1.0.2:
dependencies:
- '@auth/core': 0.34.2
- next: 14.2.5(@babel/core@7.24.5)(react-dom@18.3.1)(react@18.3.1)
- react: 18.3.1
- dev: false
+ es-define-property: 1.0.0
- /next-intl@3.17.6(next@14.2.5)(react@18.3.1):
- resolution: {integrity: sha512-giPh2Us/C7B5P/60qdfHZMj9YPg5yXp6c9msFxv6Ua4zJt1IueNrKivInowN8FAwwSqEyC7TNYXBkXuG6oToTQ==}
- peerDependencies:
- next: ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0
- react: ^16.8.0 || ^17.0.0 || ^18.0.0
- dependencies:
- '@formatjs/intl-localematcher': 0.5.4
- negotiator: 0.6.3
- next: 14.2.5(@babel/core@7.24.5)(react-dom@18.3.1)(react@18.3.1)
- react: 18.3.1
- use-intl: 3.17.6(react@18.3.1)
- dev: false
+ has-proto@1.0.3: {}
- /next-nprogress-bar@2.3.13:
- resolution: {integrity: sha512-eJQDvPSUwZ2yRyNKqAH6xTFI4RtIFvs+qtY8essTtfooyaxLGmkanEO7vL83U166bullMtVpixD6FQk5SQkhMw==}
- dependencies:
- nprogress: 0.2.0
- dev: false
+ has-symbols@1.0.3: {}
- /next@14.1.4(@babel/core@7.24.5)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-1WTaXeSrUwlz/XcnhGTY7+8eiaFvdet5z9u3V2jb+Ek1vFo0VhHKSAIJvDWfQpttWjnyw14kBeq28TPq7bTeEQ==}
- engines: {node: '>=18.17.0'}
- hasBin: true
- peerDependencies:
- '@opentelemetry/api': ^1.1.0
- react: ^18.2.0
- react-dom: ^18.2.0
- sass: ^1.3.0
- peerDependenciesMeta:
- '@opentelemetry/api':
- optional: true
- sass:
- optional: true
+ has-tostringtag@1.0.2:
dependencies:
- '@next/env': 14.1.4
- '@swc/helpers': 0.5.2
- busboy: 1.6.0
- caniuse-lite: 1.0.30001653
- graceful-fs: 4.2.11
- postcss: 8.4.31
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- styled-jsx: 5.1.1(@babel/core@7.24.5)(react@18.3.1)
- optionalDependencies:
- '@next/swc-darwin-arm64': 14.1.4
- '@next/swc-darwin-x64': 14.1.4
- '@next/swc-linux-arm64-gnu': 14.1.4
- '@next/swc-linux-arm64-musl': 14.1.4
- '@next/swc-linux-x64-gnu': 14.1.4
- '@next/swc-linux-x64-musl': 14.1.4
- '@next/swc-win32-arm64-msvc': 14.1.4
- '@next/swc-win32-ia32-msvc': 14.1.4
- '@next/swc-win32-x64-msvc': 14.1.4
- transitivePeerDependencies:
- - '@babel/core'
- - babel-plugin-macros
- dev: false
+ has-symbols: 1.0.3
- /next@14.2.5(@babel/core@7.24.5)(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-0f8aRfBVL+mpzfBjYfQuLWh2WyAwtJXCRfkPF4UJ5qd2YwrHczsrSzXU4tRMV0OAxR8ZJZWPFn6uhSC56UTsLA==}
- engines: {node: '>=18.17.0'}
- hasBin: true
- peerDependencies:
- '@opentelemetry/api': ^1.1.0
- '@playwright/test': ^1.41.2
- react: ^18.2.0
- react-dom: ^18.2.0
- sass: ^1.3.0
- peerDependenciesMeta:
- '@opentelemetry/api':
- optional: true
- '@playwright/test':
- optional: true
- sass:
- optional: true
+ hasown@2.0.2:
dependencies:
- '@next/env': 14.2.5
- '@swc/helpers': 0.5.5
- busboy: 1.6.0
- caniuse-lite: 1.0.30001653
- graceful-fs: 4.2.11
- postcss: 8.4.31
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- styled-jsx: 5.1.1(@babel/core@7.24.5)(react@18.3.1)
- optionalDependencies:
- '@next/swc-darwin-arm64': 14.2.5
- '@next/swc-darwin-x64': 14.2.5
- '@next/swc-linux-arm64-gnu': 14.2.5
- '@next/swc-linux-arm64-musl': 14.2.5
- '@next/swc-linux-x64-gnu': 14.2.5
- '@next/swc-linux-x64-musl': 14.2.5
- '@next/swc-win32-arm64-msvc': 14.2.5
- '@next/swc-win32-ia32-msvc': 14.2.5
- '@next/swc-win32-x64-msvc': 14.2.5
- transitivePeerDependencies:
- - '@babel/core'
- - babel-plugin-macros
- dev: false
+ function-bind: 1.1.2
- /node-releases@2.0.18:
- resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==}
+ human-signals@5.0.0: {}
- /nopt@7.2.1:
- resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==}
- engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
- hasBin: true
- dependencies:
- abbrev: 2.0.0
- dev: false
+ husky@9.1.6: {}
+
+ ignore@5.3.2: {}
- /normalize-package-data@2.5.0:
- resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==}
+ import-fresh@3.3.0:
dependencies:
- hosted-git-info: 2.8.9
- resolve: 1.22.8
- semver: 5.7.2
- validate-npm-package-license: 3.0.4
- dev: true
+ parent-module: 1.0.1
+ resolve-from: 4.0.0
- /normalize-path@3.0.0:
- resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
- engines: {node: '>=0.10.0'}
+ import-meta-resolve@4.1.0: {}
- /normalize-range@0.1.2:
- resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
- engines: {node: '>=0.10.0'}
+ imurmurhash@0.1.4: {}
- /npm-run-path@5.3.0:
- resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ inflight@1.0.6:
dependencies:
- path-key: 4.0.0
- dev: true
-
- /nprogress@0.2.0:
- resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==}
- dev: false
-
- /nwsapi@2.2.12:
- resolution: {integrity: sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==}
- dev: true
+ once: 1.4.0
+ wrappy: 1.0.2
- /oauth4webapi@2.12.0:
- resolution: {integrity: sha512-WFmcHzhFtq2Ar91crpGQZUD8DS0SG7Zti1AgbansUAfdpIsoRXE+hcMNi8MW6bGNNObWis0x8BZRl6K+FR4oQg==}
- dev: false
+ inherits@2.0.4: {}
- /object-assign@4.1.1:
- resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
- engines: {node: '>=0.10.0'}
+ ini@4.1.1: {}
- /object-hash@3.0.0:
- resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
- engines: {node: '>= 6'}
+ internal-slot@1.0.7:
+ dependencies:
+ es-errors: 1.3.0
+ hasown: 2.0.2
+ side-channel: 1.0.6
- /object-inspect@1.13.2:
- resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==}
- engines: {node: '>= 0.4'}
- dev: true
+ invariant@2.2.4:
+ dependencies:
+ loose-envify: 1.4.0
- /object-is@1.1.6:
- resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==}
- engines: {node: '>= 0.4'}
+ is-array-buffer@3.0.4:
dependencies:
call-bind: 1.0.7
- define-properties: 1.2.1
- dev: true
+ get-intrinsic: 1.2.4
- /object-keys@1.1.1:
- resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
- engines: {node: '>= 0.4'}
- dev: true
+ is-arrayish@0.2.1: {}
- /object.assign@4.1.5:
- resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==}
- engines: {node: '>= 0.4'}
+ is-arrayish@0.3.2:
+ optional: true
+
+ is-async-function@2.0.0:
dependencies:
- call-bind: 1.0.7
- define-properties: 1.2.1
- has-symbols: 1.0.3
- object-keys: 1.1.1
- dev: true
+ has-tostringtag: 1.0.2
- /object.entries@1.1.8:
- resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==}
- engines: {node: '>= 0.4'}
+ is-bigint@1.0.4:
dependencies:
- call-bind: 1.0.7
- define-properties: 1.2.1
- es-object-atoms: 1.0.0
- dev: true
+ has-bigints: 1.0.2
- /object.fromentries@2.0.8:
- resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==}
- engines: {node: '>= 0.4'}
+ is-binary-path@2.1.0:
dependencies:
- call-bind: 1.0.7
- define-properties: 1.2.1
- es-abstract: 1.23.3
- es-object-atoms: 1.0.0
- dev: true
+ binary-extensions: 2.3.0
- /object.groupby@1.0.3:
- resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==}
- engines: {node: '>= 0.4'}
+ is-boolean-object@1.1.2:
dependencies:
call-bind: 1.0.7
- define-properties: 1.2.1
- es-abstract: 1.23.3
- dev: true
+ has-tostringtag: 1.0.2
- /object.values@1.2.0:
- resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==}
- engines: {node: '>= 0.4'}
+ is-bun-module@1.2.1:
dependencies:
- call-bind: 1.0.7
- define-properties: 1.2.1
- es-object-atoms: 1.0.0
- dev: true
+ semver: 7.6.3
- /once@1.4.0:
- resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+ is-callable@1.2.7: {}
+
+ is-core-module@2.15.1:
dependencies:
- wrappy: 1.0.2
+ hasown: 2.0.2
- /onetime@5.1.2:
- resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
- engines: {node: '>=6'}
+ is-data-view@1.0.1:
dependencies:
- mimic-fn: 2.1.0
- dev: false
+ is-typed-array: 1.1.13
- /onetime@6.0.0:
- resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==}
- engines: {node: '>=12'}
+ is-date-object@1.0.5:
dependencies:
- mimic-fn: 4.0.0
- dev: true
+ has-tostringtag: 1.0.2
- /optionator@0.9.4:
- resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
- engines: {node: '>= 0.8.0'}
+ is-extglob@2.1.1: {}
+
+ is-finalizationregistry@1.0.2:
dependencies:
- deep-is: 0.1.4
- fast-levenshtein: 2.0.6
- levn: 0.4.1
- prelude-ls: 1.2.1
- type-check: 0.4.0
- word-wrap: 1.2.5
+ call-bind: 1.0.7
- /ora@5.4.1:
- resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==}
- engines: {node: '>=10'}
+ is-fullwidth-code-point@3.0.0: {}
+
+ is-fullwidth-code-point@4.0.0: {}
+
+ is-fullwidth-code-point@5.0.0:
dependencies:
- bl: 4.1.0
- chalk: 4.1.2
- cli-cursor: 3.1.0
- cli-spinners: 2.9.2
- is-interactive: 1.0.0
- is-unicode-supported: 0.1.0
- log-symbols: 4.1.0
- strip-ansi: 6.0.1
- wcwidth: 1.0.1
- dev: false
+ get-east-asian-width: 1.3.0
- /p-limit@2.3.0:
- resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
- engines: {node: '>=6'}
+ is-generator-function@1.0.10:
dependencies:
- p-try: 2.2.0
- dev: true
+ has-tostringtag: 1.0.2
- /p-limit@3.1.0:
- resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
- engines: {node: '>=10'}
+ is-glob@4.0.3:
dependencies:
- yocto-queue: 0.1.0
+ is-extglob: 2.1.1
- /p-limit@5.0.0:
- resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==}
- engines: {node: '>=18'}
+ is-map@2.0.3: {}
+
+ is-negative-zero@2.0.3: {}
+
+ is-number-object@1.0.7:
dependencies:
- yocto-queue: 1.1.1
- dev: true
+ has-tostringtag: 1.0.2
- /p-locate@4.1.0:
- resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
- engines: {node: '>=8'}
+ is-number@7.0.0: {}
+
+ is-obj@2.0.0: {}
+
+ is-path-inside@3.0.3: {}
+
+ is-regex@1.1.4:
dependencies:
- p-limit: 2.3.0
- dev: true
+ call-bind: 1.0.7
+ has-tostringtag: 1.0.2
- /p-locate@5.0.0:
- resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
- engines: {node: '>=10'}
+ is-set@2.0.3: {}
+
+ is-shared-array-buffer@1.0.3:
dependencies:
- p-limit: 3.1.0
+ call-bind: 1.0.7
- /p-try@2.2.0:
- resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
- engines: {node: '>=6'}
- dev: true
+ is-stream@3.0.0: {}
- /package-json-from-dist@1.0.0:
- resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==}
+ is-string@1.0.7:
+ dependencies:
+ has-tostringtag: 1.0.2
- /parent-module@1.0.1:
- resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
- engines: {node: '>=6'}
+ is-symbol@1.0.4:
dependencies:
- callsites: 3.1.0
+ has-symbols: 1.0.3
- /parse-json@5.2.0:
- resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
- engines: {node: '>=8'}
+ is-text-path@2.0.0:
dependencies:
- '@babel/code-frame': 7.24.7
- error-ex: 1.3.2
- json-parse-even-better-errors: 2.3.1
- lines-and-columns: 1.2.4
- dev: true
+ text-extensions: 2.4.0
- /parse5@7.1.2:
- resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==}
+ is-typed-array@1.1.13:
dependencies:
- entities: 4.5.0
- dev: true
+ which-typed-array: 1.1.15
- /parseley@0.12.1:
- resolution: {integrity: sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==}
+ is-weakmap@2.0.2: {}
+
+ is-weakref@1.0.2:
dependencies:
- leac: 0.6.0
- peberminta: 0.9.0
- dev: false
+ call-bind: 1.0.7
- /path-exists@4.0.0:
- resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
- engines: {node: '>=8'}
+ is-weakset@2.0.3:
+ dependencies:
+ call-bind: 1.0.7
+ get-intrinsic: 1.2.4
- /path-is-absolute@1.0.1:
- resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
- engines: {node: '>=0.10.0'}
+ isarray@2.0.5: {}
- /path-key@3.1.1:
- resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
- engines: {node: '>=8'}
+ isexe@2.0.0: {}
- /path-key@4.0.0:
- resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
- engines: {node: '>=12'}
- dev: true
+ iterator.prototype@1.1.3:
+ dependencies:
+ define-properties: 1.2.1
+ get-intrinsic: 1.2.4
+ has-symbols: 1.0.3
+ reflect.getprototypeof: 1.0.6
+ set-function-name: 2.0.2
- /path-parse@1.0.7:
- resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+ jackspeak@2.3.6:
+ dependencies:
+ '@isaacs/cliui': 8.0.2
+ optionalDependencies:
+ '@pkgjs/parseargs': 0.11.0
- /path-scurry@1.11.1:
- resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
- engines: {node: '>=16 || 14 >=14.18'}
+ jackspeak@3.4.3:
dependencies:
- lru-cache: 10.4.3
- minipass: 7.1.2
+ '@isaacs/cliui': 8.0.2
+ optionalDependencies:
+ '@pkgjs/parseargs': 0.11.0
- /path-type@4.0.0:
- resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
- engines: {node: '>=8'}
- dev: true
+ jiti@1.21.6: {}
- /pathe@1.1.2:
- resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==}
- dev: true
+ jose@5.9.6: {}
- /pathval@1.1.1:
- resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==}
- dev: true
+ js-tokens@4.0.0: {}
- /peberminta@0.9.0:
- resolution: {integrity: sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==}
- dev: false
+ js-yaml@4.1.0:
+ dependencies:
+ argparse: 2.0.1
- /picocolors@1.0.1:
- resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==}
+ jsesc@3.0.2: {}
- /picomatch@2.3.1:
- resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
- engines: {node: '>=8.6'}
+ json-buffer@3.0.1: {}
- /pify@2.3.0:
- resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
- engines: {node: '>=0.10.0'}
+ json-parse-even-better-errors@2.3.1: {}
- /pirates@4.0.6:
- resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==}
- engines: {node: '>= 6'}
+ json-schema-traverse@0.4.1: {}
- /pkg-types@1.2.0:
- resolution: {integrity: sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==}
+ json-schema-traverse@1.0.0: {}
+
+ json-stable-stringify-without-jsonify@1.0.1: {}
+
+ json5@1.0.2:
dependencies:
- confbox: 0.1.7
- mlly: 1.7.1
- pathe: 1.1.2
- dev: true
+ minimist: 1.2.8
- /pluralize@8.0.0:
- resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==}
- engines: {node: '>=4'}
- dev: true
+ json5@2.2.3: {}
- /possible-typed-array-names@1.0.0:
- resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==}
- engines: {node: '>= 0.4'}
- dev: true
+ jsonparse@1.3.1: {}
- /postcss-import@15.1.0(postcss@8.4.41):
- resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
- engines: {node: '>=14.0.0'}
- peerDependencies:
- postcss: ^8.0.0
+ jsx-ast-utils@3.3.5:
dependencies:
- postcss: 8.4.41
- postcss-value-parser: 4.2.0
- read-cache: 1.0.0
- resolve: 1.22.8
+ array-includes: 3.1.8
+ array.prototype.flat: 1.3.2
+ object.assign: 4.1.5
+ object.values: 1.2.0
- /postcss-js@4.0.1(postcss@8.4.41):
- resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==}
- engines: {node: ^12 || ^14 || >= 16}
- peerDependencies:
- postcss: ^8.4.21
+ keyv@4.5.4:
dependencies:
- camelcase-css: 2.0.1
- postcss: 8.4.41
+ json-buffer: 3.0.1
- /postcss-load-config@4.0.2(postcss@8.4.41):
- resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==}
- engines: {node: '>= 14'}
- peerDependencies:
- postcss: '>=8.0.9'
- ts-node: '>=9.0.0'
- peerDependenciesMeta:
- postcss:
- optional: true
- ts-node:
- optional: true
+ language-subtag-registry@0.3.23: {}
+
+ language-tags@1.0.9:
dependencies:
- lilconfig: 3.1.2
- postcss: 8.4.41
- yaml: 2.5.0
+ language-subtag-registry: 0.3.23
- /postcss-nested@6.2.0(postcss@8.4.41):
- resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==}
- engines: {node: '>=12.0'}
- peerDependencies:
- postcss: ^8.2.14
+ lenis@1.1.14(react@18.3.1):
dependencies:
- postcss: 8.4.41
- postcss-selector-parser: 6.1.2
+ '@darkroom.engineering/tempus': 0.0.46
+ optionalDependencies:
+ react: 18.3.1
- /postcss-selector-parser@6.1.2:
- resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==}
- engines: {node: '>=4'}
+ levn@0.4.1:
dependencies:
- cssesc: 3.0.0
- util-deprecate: 1.0.2
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
- /postcss-value-parser@4.2.0:
- resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
+ lilconfig@2.1.0: {}
- /postcss@8.4.31:
- resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==}
- engines: {node: ^10 || ^12 || >=14}
+ lilconfig@3.1.2: {}
+
+ lines-and-columns@1.2.4: {}
+
+ lint-staged@15.2.10:
dependencies:
- nanoid: 3.3.7
- picocolors: 1.0.1
- source-map-js: 1.2.0
- dev: false
+ chalk: 5.3.0
+ commander: 12.1.0
+ debug: 4.3.7
+ execa: 8.0.1
+ lilconfig: 3.1.2
+ listr2: 8.2.5
+ micromatch: 4.0.8
+ pidtree: 0.6.0
+ string-argv: 0.3.2
+ yaml: 2.5.1
+ transitivePeerDependencies:
+ - supports-color
- /postcss@8.4.38:
- resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==}
- engines: {node: ^10 || ^12 || >=14}
+ listr2@8.2.5:
dependencies:
- nanoid: 3.3.7
- picocolors: 1.0.1
- source-map-js: 1.2.0
- dev: false
+ cli-truncate: 4.0.0
+ colorette: 2.0.20
+ eventemitter3: 5.0.1
+ log-update: 6.1.0
+ rfdc: 1.4.1
+ wrap-ansi: 9.0.0
- /postcss@8.4.41:
- resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==}
- engines: {node: ^10 || ^12 || >=14}
+ locate-path@6.0.0:
dependencies:
- nanoid: 3.3.7
- picocolors: 1.0.1
- source-map-js: 1.2.0
+ p-locate: 5.0.0
- /preact-render-to-string@5.2.3(preact@10.11.3):
- resolution: {integrity: sha512-aPDxUn5o3GhWdtJtW0svRC2SS/l8D9MAgo2+AWml+BhDImb27ALf04Q2d+AHqUUOc6RdSXFIBVa2gxzgMKgtZA==}
- peerDependencies:
- preact: '>=10'
+ locate-path@7.2.0:
dependencies:
- preact: 10.11.3
- pretty-format: 3.8.0
- dev: false
+ p-locate: 6.0.0
- /preact@10.11.3:
- resolution: {integrity: sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==}
- dev: false
+ lodash.camelcase@4.3.0: {}
- /prelude-ls@1.2.1:
- resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
- engines: {node: '>= 0.8.0'}
+ lodash.isplainobject@4.0.6: {}
- /prettier-linter-helpers@1.0.0:
- resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==}
- engines: {node: '>=6.0.0'}
- dependencies:
- fast-diff: 1.3.0
- dev: true
+ lodash.kebabcase@4.1.1: {}
- /prettier-plugin-tailwindcss@0.6.6(@ianvs/prettier-plugin-sort-imports@4.3.1)(prettier@3.3.3):
- resolution: {integrity: sha512-OPva5S7WAsPLEsOuOWXATi13QrCKACCiIonFgIR6V4lYv4QLp++UXVhZSzRbZxXGimkQtQT86CC6fQqTOybGng==}
- engines: {node: '>=14.21.3'}
- peerDependencies:
- '@ianvs/prettier-plugin-sort-imports': '*'
- '@prettier/plugin-pug': '*'
- '@shopify/prettier-plugin-liquid': '*'
- '@trivago/prettier-plugin-sort-imports': '*'
- '@zackad/prettier-plugin-twig-melody': '*'
- prettier: ^3.0
- prettier-plugin-astro: '*'
- prettier-plugin-css-order: '*'
- prettier-plugin-import-sort: '*'
- prettier-plugin-jsdoc: '*'
- prettier-plugin-marko: '*'
- prettier-plugin-multiline-arrays: '*'
- prettier-plugin-organize-attributes: '*'
- prettier-plugin-organize-imports: '*'
- prettier-plugin-sort-imports: '*'
- prettier-plugin-style-order: '*'
- prettier-plugin-svelte: '*'
- peerDependenciesMeta:
- '@ianvs/prettier-plugin-sort-imports':
- optional: true
- '@prettier/plugin-pug':
- optional: true
- '@shopify/prettier-plugin-liquid':
- optional: true
- '@trivago/prettier-plugin-sort-imports':
- optional: true
- '@zackad/prettier-plugin-twig-melody':
- optional: true
- prettier-plugin-astro:
- optional: true
- prettier-plugin-css-order:
- optional: true
- prettier-plugin-import-sort:
- optional: true
- prettier-plugin-jsdoc:
- optional: true
- prettier-plugin-marko:
- optional: true
- prettier-plugin-multiline-arrays:
- optional: true
- prettier-plugin-organize-attributes:
- optional: true
- prettier-plugin-organize-imports:
- optional: true
- prettier-plugin-sort-imports:
- optional: true
- prettier-plugin-style-order:
- optional: true
- prettier-plugin-svelte:
- optional: true
- dependencies:
- '@ianvs/prettier-plugin-sort-imports': 4.3.1(prettier@3.3.3)
- prettier: 3.3.3
- dev: true
+ lodash.merge@4.6.2: {}
+
+ lodash.mergewith@4.6.2: {}
- /prettier@3.3.3:
- resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==}
- engines: {node: '>=14'}
- hasBin: true
- dev: true
+ lodash.snakecase@4.1.1: {}
+
+ lodash.startcase@4.4.0: {}
- /pretty-format@27.5.1:
- resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==}
- engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+ lodash.uniq@4.5.0: {}
+
+ lodash.upperfirst@4.3.1: {}
+
+ log-update@6.1.0:
dependencies:
- ansi-regex: 5.0.1
- ansi-styles: 5.2.0
- react-is: 17.0.2
- dev: true
+ ansi-escapes: 7.0.0
+ cli-cursor: 5.0.0
+ slice-ansi: 7.1.0
+ strip-ansi: 7.1.0
+ wrap-ansi: 9.0.0
- /pretty-format@29.7.0:
- resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ loose-envify@1.4.0:
dependencies:
- '@jest/schemas': 29.6.3
- ansi-styles: 5.2.0
- react-is: 18.3.1
+ js-tokens: 4.0.0
- /pretty-format@3.8.0:
- resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==}
- dev: false
+ lru-cache@10.4.3: {}
- /prism-react-renderer@2.1.0(react@18.3.1):
- resolution: {integrity: sha512-I5cvXHjA1PVGbGm1MsWCpvBCRrYyxEri0MC7/JbfIfYfcXAxHyO5PaUjs3A8H5GW6kJcLhTHxxMaOZZpRZD2iQ==}
- peerDependencies:
- react: '>=16.0.0'
+ lru-cache@5.1.1:
+ dependencies:
+ yallist: 3.1.1
+
+ lucide-react@0.453.0(react@18.3.1):
dependencies:
- '@types/prismjs': 1.26.4
- clsx: 1.2.1
react: 18.3.1
- dev: false
- /prismjs@1.29.0:
- resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==}
- engines: {node: '>=6'}
- dev: false
+ meow@12.1.1: {}
- /prop-types@15.8.1:
- resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
+ merge-stream@2.0.0: {}
+
+ merge2@1.4.1: {}
+
+ micromatch@4.0.8:
dependencies:
- loose-envify: 1.4.0
- object-assign: 4.1.1
- react-is: 16.13.1
+ braces: 3.0.3
+ picomatch: 2.3.1
- /proto-list@1.2.4:
- resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==}
- dev: false
+ mime-db@1.52.0: {}
- /proxy-from-env@1.1.0:
- resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
- dev: false
+ mime-types@2.1.35:
+ dependencies:
+ mime-db: 1.52.0
- /psl@1.9.0:
- resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==}
- dev: true
+ mimic-fn@4.0.0: {}
- /punycode@2.3.1:
- resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
- engines: {node: '>=6'}
+ mimic-function@5.0.1: {}
- /querystringify@2.2.0:
- resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==}
- dev: true
+ minimatch@3.1.2:
+ dependencies:
+ brace-expansion: 1.1.11
- /queue-microtask@1.2.3:
- resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+ minimatch@9.0.5:
+ dependencies:
+ brace-expansion: 2.0.1
+
+ minimist@1.2.8: {}
+
+ minipass@7.1.2: {}
+
+ ms@2.1.3: {}
- /randombytes@2.1.0:
- resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
+ mz@2.7.0:
dependencies:
- safe-buffer: 5.2.1
- dev: false
+ any-promise: 1.3.0
+ object-assign: 4.1.1
+ thenify-all: 1.6.0
- /react-day-picker@8.10.1(date-fns@3.6.0)(react@18.3.1):
- resolution: {integrity: sha512-TMx7fNbhLk15eqcMt+7Z7S2KF7mfTId/XJDjKE8f+IUcFn0l08/kI4FiYTL/0yuOLmEcbR4Fwe3GJf/NiiMnPA==}
- peerDependencies:
- date-fns: ^2.28.0 || ^3.0.0
- react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ nanoid@3.3.7: {}
+
+ natural-compare@1.4.0: {}
+
+ next-auth@5.0.0-beta.25(next@15.0.1(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1):
dependencies:
- date-fns: 3.6.0
+ '@auth/core': 0.37.2
+ next: 15.0.1(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react: 18.3.1
- dev: false
- /react-dom@18.3.1(react@18.3.1):
- resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==}
- peerDependencies:
- react: ^18.3.1
+ next-nprogress-bar@2.3.14:
dependencies:
- loose-envify: 1.4.0
- react: 18.3.1
- scheduler: 0.23.2
+ nprogress: 0.2.0
- /react-email@2.1.5(eslint@8.57.0):
- resolution: {integrity: sha512-SjGt5XiqNwrC6FT0rAxERj0MC9binUOVZDzspAxcRHpxjZavvePAHvV29uROWNQ1Ha7ssg1sfy4dTQi7bjCXrg==}
- engines: {node: '>=18.0.0'}
- hasBin: true
+ next@15.0.1(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@babel/core': 7.24.5
- '@babel/parser': 7.24.5
- '@radix-ui/colors': 1.0.1
- '@radix-ui/react-collapsible': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-popover': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-slot': 1.1.0(@types/react@18.2.47)(react@18.3.1)
- '@radix-ui/react-toggle-group': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1)
- '@radix-ui/react-tooltip': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1)
- '@swc/core': 1.3.101
- '@types/react': 18.2.47
- '@types/react-dom': 18.3.0
- '@types/webpack': 5.28.5(@swc/core@1.3.101)(esbuild@0.19.11)
- autoprefixer: 10.4.14(postcss@8.4.38)
- chalk: 4.1.2
- chokidar: 3.5.3
- clsx: 2.1.0
- commander: 11.1.0
- debounce: 2.0.0
- esbuild: 0.19.11
- eslint-config-prettier: 9.0.0(eslint@8.57.0)
- eslint-config-turbo: 1.10.12(eslint@8.57.0)
- framer-motion: 10.17.4(react-dom@18.3.1)(react@18.3.1)
- glob: 10.3.4
- log-symbols: 4.1.0
- mime-types: 2.1.35
- next: 14.1.4(@babel/core@7.24.5)(react-dom@18.3.1)(react@18.3.1)
- normalize-path: 3.0.0
- ora: 5.4.1
- postcss: 8.4.38
- prism-react-renderer: 2.1.0(react@18.3.1)
+ '@next/env': 15.0.1
+ '@swc/counter': 0.1.3
+ '@swc/helpers': 0.5.13
+ busboy: 1.6.0
+ caniuse-lite: 1.0.30001673
+ postcss: 8.4.31
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
- socket.io: 4.7.3
- socket.io-client: 4.7.3
- sonner: 1.3.1(react-dom@18.3.1)(react@18.3.1)
- source-map-js: 1.0.2
- stacktrace-parser: 0.1.10
- tailwind-merge: 2.2.0
- tailwindcss: 3.4.0
- typescript: 5.1.6
+ styled-jsx: 5.1.6(@babel/core@7.26.0)(react@18.3.1)
+ optionalDependencies:
+ '@next/swc-darwin-arm64': 15.0.1
+ '@next/swc-darwin-x64': 15.0.1
+ '@next/swc-linux-arm64-gnu': 15.0.1
+ '@next/swc-linux-arm64-musl': 15.0.1
+ '@next/swc-linux-x64-gnu': 15.0.1
+ '@next/swc-linux-x64-musl': 15.0.1
+ '@next/swc-win32-arm64-msvc': 15.0.1
+ '@next/swc-win32-x64-msvc': 15.0.1
+ sharp: 0.33.5
transitivePeerDependencies:
- - '@opentelemetry/api'
- - '@swc/helpers'
+ - '@babel/core'
- babel-plugin-macros
- - bufferutil
- - eslint
- - sass
- - supports-color
- - ts-node
- - uglify-js
- - utf-8-validate
- - webpack-cli
- dev: false
- /react-hook-form@7.53.0(react@18.3.1):
- resolution: {integrity: sha512-M1n3HhqCww6S2hxLxciEXy2oISPnAzxY7gvwVPrtlczTM/1dDadXgUxDpHMrMTblDOcm/AXtXxHwZ3jpg1mqKQ==}
- engines: {node: '>=18.0.0'}
- peerDependencies:
- react: ^16.8.0 || ^17 || ^18 || ^19
+ node-releases@2.0.18: {}
+
+ normalize-path@3.0.0: {}
+
+ npm-run-path@5.3.0:
dependencies:
- react: 18.3.1
- dev: false
+ path-key: 4.0.0
- /react-is@16.13.1:
- resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
+ nprogress@0.2.0: {}
- /react-is@17.0.2:
- resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==}
- dev: true
+ oauth4webapi@3.1.2: {}
- /react-is@18.3.1:
- resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==}
+ object-assign@4.1.1: {}
- /react-paginate@8.2.0(react@18.3.1):
- resolution: {integrity: sha512-sJCz1PW+9PNIjUSn919nlcRVuleN2YPoFBOvL+6TPgrH/3lwphqiSOgdrLafLdyLDxsgK+oSgviqacF4hxsDIw==}
- peerDependencies:
- react: ^16 || ^17 || ^18
+ object-hash@3.0.0: {}
+
+ object-inspect@1.13.2: {}
+
+ object-keys@1.1.1: {}
+
+ object.assign@4.1.5:
dependencies:
- prop-types: 15.8.1
- react: 18.3.1
- dev: false
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ has-symbols: 1.0.3
+ object-keys: 1.1.1
- /react-promise-suspense@0.3.4:
- resolution: {integrity: sha512-I42jl7L3Ze6kZaq+7zXWSunBa3b1on5yfvUW6Eo/3fFOj6dZ5Bqmcd264nJbTK/gn1HjjILAjSwnZbV4RpSaNQ==}
+ object.entries@1.1.8:
dependencies:
- fast-deep-equal: 2.0.1
- dev: false
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-object-atoms: 1.0.0
- /react-refresh@0.14.2:
- resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==}
- engines: {node: '>=0.10.0'}
- dev: true
+ object.fromentries@2.0.8:
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-object-atoms: 1.0.0
- /react-remove-scroll-bar@2.3.6(@types/react@18.2.47)(react@18.3.1):
- resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==}
- 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
+ object.groupby@1.0.3:
dependencies:
- '@types/react': 18.2.47
- react: 18.3.1
- react-style-singleton: 2.2.1(@types/react@18.2.47)(react@18.3.1)
- tslib: 2.7.0
- dev: false
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
- /react-remove-scroll-bar@2.3.6(@types/react@18.3.4)(react@18.3.1):
- resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==}
- 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
+ object.values@1.2.0:
dependencies:
- '@types/react': 18.3.4
- react: 18.3.1
- react-style-singleton: 2.2.1(@types/react@18.3.4)(react@18.3.1)
- tslib: 2.7.0
- dev: false
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-object-atoms: 1.0.0
- /react-remove-scroll@2.5.7(@types/react@18.2.47)(react@18.3.1):
- resolution: {integrity: sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==}
- 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
+ once@1.4.0:
dependencies:
- '@types/react': 18.2.47
- react: 18.3.1
- react-remove-scroll-bar: 2.3.6(@types/react@18.2.47)(react@18.3.1)
- react-style-singleton: 2.2.1(@types/react@18.2.47)(react@18.3.1)
- tslib: 2.7.0
- use-callback-ref: 1.3.2(@types/react@18.2.47)(react@18.3.1)
- use-sidecar: 1.1.2(@types/react@18.2.47)(react@18.3.1)
- dev: false
-
- /react-remove-scroll@2.5.7(@types/react@18.3.4)(react@18.3.1):
- resolution: {integrity: sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==}
- 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
+ wrappy: 1.0.2
+
+ onetime@6.0.0:
dependencies:
- '@types/react': 18.3.4
- react: 18.3.1
- react-remove-scroll-bar: 2.3.6(@types/react@18.3.4)(react@18.3.1)
- react-style-singleton: 2.2.1(@types/react@18.3.4)(react@18.3.1)
- tslib: 2.7.0
- use-callback-ref: 1.3.2(@types/react@18.3.4)(react@18.3.1)
- use-sidecar: 1.1.2(@types/react@18.3.4)(react@18.3.1)
- dev: false
-
- /react-smooth@4.0.1(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-OE4hm7XqR0jNOq3Qmk9mFLyd6p2+j6bvbPJ7qlB7+oo0eNcL2l7WQzG6MBnT3EXY6xzkLMUBec3AfewJdA0J8w==}
- peerDependencies:
- react: ^16.8.0 || ^17.0.0 || ^18.0.0
- react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
+ mimic-fn: 4.0.0
+
+ onetime@7.0.0:
dependencies:
- fast-equals: 5.0.1
- prop-types: 15.8.1
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- react-transition-group: 4.4.5(react-dom@18.3.1)(react@18.3.1)
- dev: false
+ mimic-function: 5.0.1
- /react-style-singleton@2.2.1(@types/react@18.2.47)(react@18.3.1):
- resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==}
- 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
+ optionator@0.9.4:
dependencies:
- '@types/react': 18.2.47
- get-nonce: 1.0.1
- invariant: 2.2.4
- react: 18.3.1
- tslib: 2.7.0
- dev: false
+ deep-is: 0.1.4
+ fast-levenshtein: 2.0.6
+ levn: 0.4.1
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+ word-wrap: 1.2.5
- /react-style-singleton@2.2.1(@types/react@18.3.4)(react@18.3.1):
- resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==}
- 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
+ p-limit@3.1.0:
dependencies:
- '@types/react': 18.3.4
- get-nonce: 1.0.1
- invariant: 2.2.4
- react: 18.3.1
- tslib: 2.7.0
- dev: false
+ yocto-queue: 0.1.0
- /react-toastify@10.0.5(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-mNKt2jBXJg4O7pSdbNUfDdTsK9FIdikfsIE/yUCxbAEXl4HMyJaivrVFcn3Elvt5xvCQYhUZm+hqTIu1UXM3Pw==}
- peerDependencies:
- react: '>=18'
- react-dom: '>=18'
+ p-limit@4.0.0:
dependencies:
- clsx: 2.1.1
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
+ yocto-queue: 1.1.1
- /react-transition-group@4.4.5(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==}
- peerDependencies:
- react: '>=16.6.0'
- react-dom: '>=16.6.0'
+ p-locate@5.0.0:
dependencies:
- '@babel/runtime': 7.25.4
- dom-helpers: 5.2.1
- loose-envify: 1.4.0
- prop-types: 15.8.1
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- dev: false
+ p-limit: 3.1.0
- /react@18.3.1:
- resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==}
- engines: {node: '>=0.10.0'}
+ p-locate@6.0.0:
+ dependencies:
+ p-limit: 4.0.0
+
+ package-json-from-dist@1.0.1: {}
+
+ parent-module@1.0.1:
+ dependencies:
+ callsites: 3.1.0
+
+ parse-json@5.2.0:
+ dependencies:
+ '@babel/code-frame': 7.26.0
+ error-ex: 1.3.2
+ json-parse-even-better-errors: 2.3.1
+ lines-and-columns: 1.2.4
+
+ path-exists@4.0.0: {}
+
+ path-exists@5.0.0: {}
+
+ path-is-absolute@1.0.1: {}
+
+ path-key@3.1.1: {}
+
+ path-key@4.0.0: {}
+
+ path-parse@1.0.7: {}
+
+ path-scurry@1.11.1:
+ dependencies:
+ lru-cache: 10.4.3
+ minipass: 7.1.2
+
+ picocolors@1.1.1: {}
+
+ picomatch@2.3.1: {}
+
+ pidtree@0.6.0: {}
+
+ pify@2.3.0: {}
+
+ pirates@4.0.6: {}
+
+ possible-typed-array-names@1.0.0: {}
+
+ postcss-import@15.1.0(postcss@8.4.47):
+ dependencies:
+ postcss: 8.4.47
+ postcss-value-parser: 4.2.0
+ read-cache: 1.0.0
+ resolve: 1.22.8
+
+ postcss-js@4.0.1(postcss@8.4.47):
+ dependencies:
+ camelcase-css: 2.0.1
+ postcss: 8.4.47
+
+ postcss-load-config@4.0.2(postcss@8.4.47):
+ dependencies:
+ lilconfig: 3.1.2
+ yaml: 2.6.0
+ optionalDependencies:
+ postcss: 8.4.47
+
+ postcss-nested@6.2.0(postcss@8.4.47):
+ dependencies:
+ postcss: 8.4.47
+ postcss-selector-parser: 6.1.2
+
+ postcss-selector-parser@6.1.2:
+ dependencies:
+ cssesc: 3.0.0
+ util-deprecate: 1.0.2
+
+ postcss-value-parser@4.2.0: {}
+
+ postcss@8.4.31:
+ dependencies:
+ nanoid: 3.3.7
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
+ postcss@8.4.47:
+ dependencies:
+ nanoid: 3.3.7
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
+ preact-render-to-string@5.2.3(preact@10.11.3):
+ dependencies:
+ preact: 10.11.3
+ pretty-format: 3.8.0
+
+ preact@10.11.3: {}
+
+ prelude-ls@1.2.1: {}
+
+ prettier-plugin-tailwindcss@0.6.8(@ianvs/prettier-plugin-sort-imports@4.3.1(prettier@3.3.3))(prettier@3.3.3):
+ dependencies:
+ prettier: 3.3.3
+ optionalDependencies:
+ '@ianvs/prettier-plugin-sort-imports': 4.3.1(prettier@3.3.3)
+
+ prettier@3.3.3: {}
+
+ pretty-format@3.8.0: {}
+
+ prop-types@15.8.1:
dependencies:
loose-envify: 1.4.0
+ object-assign: 4.1.1
+ react-is: 16.13.1
- /read-cache@1.0.0:
- resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
+ proxy-from-env@1.1.0: {}
+
+ punycode@2.3.1: {}
+
+ queue-microtask@1.2.3: {}
+
+ react-dom@18.3.1(react@18.3.1):
dependencies:
- pify: 2.3.0
+ loose-envify: 1.4.0
+ react: 18.3.1
+ scheduler: 0.23.2
- /read-pkg-up@7.0.1:
- resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==}
- engines: {node: '>=8'}
+ react-hook-form@7.53.1(react@18.3.1):
dependencies:
- find-up: 4.1.0
- read-pkg: 5.2.0
- type-fest: 0.8.1
- dev: true
+ react: 18.3.1
- /read-pkg@5.2.0:
- resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==}
- engines: {node: '>=8'}
+ react-is@16.13.1: {}
+
+ react-remove-scroll-bar@2.3.6(@types/react@18.3.12)(react@18.3.1):
dependencies:
- '@types/normalize-package-data': 2.4.4
- normalize-package-data: 2.5.0
- parse-json: 5.2.0
- type-fest: 0.6.0
- dev: true
+ react: 18.3.1
+ react-style-singleton: 2.2.1(@types/react@18.3.12)(react@18.3.1)
+ tslib: 2.8.0
+ optionalDependencies:
+ '@types/react': 18.3.12
- /readable-stream@3.6.2:
- resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
- engines: {node: '>= 6'}
+ react-remove-scroll@2.6.0(@types/react@18.3.12)(react@18.3.1):
dependencies:
- inherits: 2.0.4
- string_decoder: 1.3.0
- util-deprecate: 1.0.2
- dev: false
+ react: 18.3.1
+ react-remove-scroll-bar: 2.3.6(@types/react@18.3.12)(react@18.3.1)
+ react-style-singleton: 2.2.1(@types/react@18.3.12)(react@18.3.1)
+ tslib: 2.8.0
+ use-callback-ref: 1.3.2(@types/react@18.3.12)(react@18.3.1)
+ use-sidecar: 1.1.2(@types/react@18.3.12)(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.12
- /readdirp@3.6.0:
- resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
- engines: {node: '>=8.10.0'}
+ react-style-singleton@2.2.1(@types/react@18.3.12)(react@18.3.1):
dependencies:
- picomatch: 2.3.1
+ get-nonce: 1.0.1
+ invariant: 2.2.4
+ react: 18.3.1
+ tslib: 2.8.0
+ optionalDependencies:
+ '@types/react': 18.3.12
- /recharts-scale@0.4.5:
- resolution: {integrity: sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==}
+ react@18.3.1:
dependencies:
- decimal.js-light: 2.5.1
- dev: false
+ loose-envify: 1.4.0
- /recharts@2.12.7(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-hlLJMhPQfv4/3NBSAyq3gzGg4h2v69RJh6KU7b3pXYNNAELs9kEoXOjbkxdXpALqKBoVmVptGfLpxdaVYqjmXQ==}
- 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
+ read-cache@1.0.0:
dependencies:
- clsx: 2.1.1
- eventemitter3: 4.0.7
- lodash: 4.17.21
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- react-is: 16.13.1
- react-smooth: 4.0.1(react-dom@18.3.1)(react@18.3.1)
- recharts-scale: 0.4.5
- tiny-invariant: 1.3.3
- victory-vendor: 36.9.2
- dev: false
-
- /redent@3.0.0:
- resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==}
- engines: {node: '>=8'}
+ pify: 2.3.0
+
+ readdirp@3.6.0:
dependencies:
- indent-string: 4.0.0
- strip-indent: 3.0.0
- dev: true
+ picomatch: 2.3.1
- /reflect.getprototypeof@1.0.6:
- resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==}
- engines: {node: '>= 0.4'}
+ reflect.getprototypeof@1.0.6:
dependencies:
call-bind: 1.0.7
define-properties: 1.2.1
@@ -8540,197 +5450,75 @@ packages:
get-intrinsic: 1.2.4
globalthis: 1.0.4
which-builtin-type: 1.1.4
- dev: true
-
- /regenerator-runtime@0.14.1:
- resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
- /regexp-tree@0.1.27:
- resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==}
- hasBin: true
- dev: true
-
- /regexp.prototype.flags@1.5.2:
- resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==}
- engines: {node: '>= 0.4'}
+ regexp.prototype.flags@1.5.3:
dependencies:
call-bind: 1.0.7
define-properties: 1.2.1
es-errors: 1.3.0
set-function-name: 2.0.2
- dev: true
- /regjsparser@0.10.0:
- resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==}
- hasBin: true
- dependencies:
- jsesc: 0.5.0
- dev: true
+ require-directory@2.1.1: {}
- /requires-port@1.0.0:
- resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==}
- dev: true
+ require-from-string@2.0.2: {}
- /resolve-from@4.0.0:
- resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
- engines: {node: '>=4'}
+ resolve-from@4.0.0: {}
- /resolve-pkg-maps@1.0.0:
- resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
- dev: true
+ resolve-from@5.0.0: {}
- /resolve@1.22.8:
- resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
- hasBin: true
+ resolve-pkg-maps@1.0.0: {}
+
+ resolve@1.22.8:
dependencies:
is-core-module: 2.15.1
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
- /resolve@2.0.0-next.5:
- resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==}
- hasBin: true
+ resolve@2.0.0-next.5:
dependencies:
is-core-module: 2.15.1
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
- dev: true
- /restore-cursor@3.1.0:
- resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==}
- engines: {node: '>=8'}
+ restore-cursor@5.1.0:
dependencies:
- onetime: 5.1.2
- signal-exit: 3.0.7
- dev: false
+ onetime: 7.0.0
+ signal-exit: 4.1.0
- /reusify@1.0.4:
- resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
- engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+ reusify@1.0.4: {}
- /rimraf@3.0.2:
- resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
- deprecated: Rimraf versions prior to v4 are no longer supported
- hasBin: true
- dependencies:
- glob: 7.2.3
+ rfdc@1.4.1: {}
- /rollup@4.21.0:
- resolution: {integrity: sha512-vo+S/lfA2lMS7rZ2Qoubi6I5hwZwzXeUIctILZLbHI+laNtvhhOIon2S1JksA5UEDQ7l3vberd0fxK44lTYjbQ==}
- engines: {node: '>=18.0.0', npm: '>=8.0.0'}
- hasBin: true
+ rimraf@3.0.2:
dependencies:
- '@types/estree': 1.0.5
- optionalDependencies:
- '@rollup/rollup-android-arm-eabi': 4.21.0
- '@rollup/rollup-android-arm64': 4.21.0
- '@rollup/rollup-darwin-arm64': 4.21.0
- '@rollup/rollup-darwin-x64': 4.21.0
- '@rollup/rollup-linux-arm-gnueabihf': 4.21.0
- '@rollup/rollup-linux-arm-musleabihf': 4.21.0
- '@rollup/rollup-linux-arm64-gnu': 4.21.0
- '@rollup/rollup-linux-arm64-musl': 4.21.0
- '@rollup/rollup-linux-powerpc64le-gnu': 4.21.0
- '@rollup/rollup-linux-riscv64-gnu': 4.21.0
- '@rollup/rollup-linux-s390x-gnu': 4.21.0
- '@rollup/rollup-linux-x64-gnu': 4.21.0
- '@rollup/rollup-linux-x64-musl': 4.21.0
- '@rollup/rollup-win32-arm64-msvc': 4.21.0
- '@rollup/rollup-win32-ia32-msvc': 4.21.0
- '@rollup/rollup-win32-x64-msvc': 4.21.0
- fsevents: 2.3.3
- dev: true
-
- /rrweb-cssom@0.6.0:
- resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==}
- dev: true
-
- /rrweb-cssom@0.7.1:
- resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==}
- dev: true
+ glob: 7.2.3
- /run-parallel@1.2.0:
- resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+ run-parallel@1.2.0:
dependencies:
queue-microtask: 1.2.3
- /safe-array-concat@1.1.2:
- resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==}
- engines: {node: '>=0.4'}
+ safe-array-concat@1.1.2:
dependencies:
call-bind: 1.0.7
get-intrinsic: 1.2.4
has-symbols: 1.0.3
isarray: 2.0.5
- dev: true
-
- /safe-buffer@5.2.1:
- resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
- dev: false
- /safe-regex-test@1.0.3:
- resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==}
- engines: {node: '>= 0.4'}
+ safe-regex-test@1.0.3:
dependencies:
call-bind: 1.0.7
es-errors: 1.3.0
is-regex: 1.1.4
- dev: true
-
- /safer-buffer@2.1.2:
- resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
- dev: true
-
- /saxes@6.0.0:
- resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==}
- engines: {node: '>=v12.22.7'}
- dependencies:
- xmlchars: 2.2.0
- dev: true
- /scheduler@0.23.2:
- resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==}
+ scheduler@0.23.2:
dependencies:
loose-envify: 1.4.0
- /schema-utils@3.3.0:
- resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==}
- engines: {node: '>= 10.13.0'}
- dependencies:
- '@types/json-schema': 7.0.15
- ajv: 6.12.6
- ajv-keywords: 3.5.2(ajv@6.12.6)
- dev: false
-
- /selderee@0.11.0:
- resolution: {integrity: sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==}
- dependencies:
- parseley: 0.12.1
- dev: false
-
- /semver@5.7.2:
- resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==}
- hasBin: true
- dev: true
-
- /semver@6.3.1:
- resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
- hasBin: true
-
- /semver@7.6.3:
- resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==}
- engines: {node: '>=10'}
- hasBin: true
+ semver@6.3.1: {}
- /serialize-javascript@6.0.2:
- resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==}
- dependencies:
- randombytes: 2.1.0
- dev: false
+ semver@7.6.3: {}
- /set-function-length@1.2.2:
- resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
- engines: {node: '>= 0.4'}
+ set-function-length@1.2.2:
dependencies:
define-data-property: 1.1.4
es-errors: 1.3.0
@@ -8738,22 +5526,15 @@ packages:
get-intrinsic: 1.2.4
gopd: 1.0.1
has-property-descriptors: 1.0.2
- dev: true
- /set-function-name@2.0.2:
- resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==}
- engines: {node: '>= 0.4'}
+ set-function-name@2.0.2:
dependencies:
define-data-property: 1.1.4
es-errors: 1.3.0
functions-have-names: 1.2.3
has-property-descriptors: 1.0.2
- dev: true
- /sharp@0.33.5:
- resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
- requiresBuild: true
+ sharp@0.33.5:
dependencies:
color: 4.2.3
detect-libc: 2.0.3
@@ -8778,224 +5559,76 @@ packages:
'@img/sharp-wasm32': 0.33.5
'@img/sharp-win32-ia32': 0.33.5
'@img/sharp-win32-x64': 0.33.5
- dev: false
+ optional: true
- /shebang-command@2.0.0:
- resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
- engines: {node: '>=8'}
+ shebang-command@2.0.0:
dependencies:
shebang-regex: 3.0.0
- /shebang-regex@3.0.0:
- resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
- engines: {node: '>=8'}
+ shebang-regex@3.0.0: {}
- /side-channel@1.0.6:
- resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==}
- engines: {node: '>= 0.4'}
+ side-channel@1.0.6:
dependencies:
call-bind: 1.0.7
es-errors: 1.3.0
get-intrinsic: 1.2.4
object-inspect: 1.13.2
- dev: true
-
- /siginfo@2.0.0:
- resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
- dev: true
- /signal-exit@3.0.7:
- resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
- dev: false
-
- /signal-exit@4.1.0:
- resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
- engines: {node: '>=14'}
+ signal-exit@4.1.0: {}
- /simple-swizzle@0.2.2:
- resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==}
+ simple-swizzle@0.2.2:
dependencies:
is-arrayish: 0.3.2
- dev: false
-
- /sirv@2.0.4:
- resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==}
- engines: {node: '>= 10'}
- dependencies:
- '@polka/url': 1.0.0-next.25
- mrmime: 2.0.0
- totalist: 3.0.1
- dev: true
-
- /slash@3.0.0:
- resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
- engines: {node: '>=8'}
-
- /socket.io-adapter@2.5.5:
- resolution: {integrity: sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==}
- dependencies:
- debug: 4.3.6
- ws: 8.17.1
- transitivePeerDependencies:
- - bufferutil
- - supports-color
- - utf-8-validate
- dev: false
+ optional: true
- /socket.io-client@4.7.3:
- resolution: {integrity: sha512-nU+ywttCyBitXIl9Xe0RSEfek4LneYkJxCeNnKCuhwoH4jGXO1ipIUw/VA/+Vvv2G1MTym11fzFC0SxkrcfXDw==}
- engines: {node: '>=10.0.0'}
+ slice-ansi@5.0.0:
dependencies:
- '@socket.io/component-emitter': 3.1.2
- debug: 4.3.6
- engine.io-client: 6.5.4
- socket.io-parser: 4.2.4
- transitivePeerDependencies:
- - bufferutil
- - supports-color
- - utf-8-validate
- dev: false
+ ansi-styles: 6.2.1
+ is-fullwidth-code-point: 4.0.0
- /socket.io-parser@4.2.4:
- resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==}
- engines: {node: '>=10.0.0'}
+ slice-ansi@7.1.0:
dependencies:
- '@socket.io/component-emitter': 3.1.2
- debug: 4.3.6
- transitivePeerDependencies:
- - supports-color
- dev: false
-
- /socket.io@4.7.3:
- resolution: {integrity: sha512-SE+UIQXBQE+GPG2oszWMlsEmWtHVqw/h1VrYJGK5/MC7CH5p58N448HwIrtREcvR4jfdOJAY4ieQfxMr55qbbw==}
- engines: {node: '>=10.2.0'}
- dependencies:
- accepts: 1.3.8
- base64id: 2.0.0
- cors: 2.8.5
- debug: 4.3.6
- engine.io: 6.5.5
- socket.io-adapter: 2.5.5
- socket.io-parser: 4.2.4
- transitivePeerDependencies:
- - bufferutil
- - supports-color
- - utf-8-validate
- dev: false
+ ansi-styles: 6.2.1
+ is-fullwidth-code-point: 5.0.0
- /sonner@1.3.1(react-dom@18.3.1)(react@18.3.1):
- resolution: {integrity: sha512-+rOAO56b2eI3q5BtgljERSn2umRk63KFIvgb2ohbZ5X+Eb5u+a/7/0ZgswYqgBMg8dyl7n6OXd9KasA8QF9ToA==}
- peerDependencies:
- react: ^18.0.0
- react-dom: ^18.0.0
+ sonner@1.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
- dev: false
-
- /source-map-js@1.0.2:
- resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
- engines: {node: '>=0.10.0'}
- dev: false
-
- /source-map-js@1.2.0:
- resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==}
- engines: {node: '>=0.10.0'}
-
- /source-map-support@0.5.21:
- resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
- dependencies:
- buffer-from: 1.1.2
- source-map: 0.6.1
- dev: false
-
- /source-map@0.6.1:
- resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
- engines: {node: '>=0.10.0'}
- dev: false
-
- /spdx-correct@3.2.0:
- resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==}
- dependencies:
- spdx-expression-parse: 3.0.1
- spdx-license-ids: 3.0.20
- dev: true
-
- /spdx-exceptions@2.5.0:
- resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==}
- dev: true
- /spdx-expression-parse@3.0.1:
- resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==}
- dependencies:
- spdx-exceptions: 2.5.0
- spdx-license-ids: 3.0.20
- dev: true
-
- /spdx-license-ids@3.0.20:
- resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==}
- dev: true
-
- /stack-utils@2.0.6:
- resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==}
- engines: {node: '>=10'}
- dependencies:
- escape-string-regexp: 2.0.0
- dev: false
-
- /stackback@0.0.2:
- resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
- dev: true
-
- /stacktrace-parser@0.1.10:
- resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==}
- engines: {node: '>=6'}
- dependencies:
- type-fest: 0.7.1
- dev: false
+ source-map-js@1.2.1: {}
- /std-env@3.7.0:
- resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==}
- dev: true
+ split2@4.2.0: {}
- /stop-iteration-iterator@1.0.0:
- resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==}
- engines: {node: '>= 0.4'}
- dependencies:
- internal-slot: 1.0.7
- dev: true
+ streamsearch@1.1.0: {}
- /streamsearch@1.1.0:
- resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==}
- engines: {node: '>=10.0.0'}
- dev: false
+ string-argv@0.3.2: {}
- /string-width@4.2.3:
- resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
- engines: {node: '>=8'}
+ string-width@4.2.3:
dependencies:
emoji-regex: 8.0.0
is-fullwidth-code-point: 3.0.0
strip-ansi: 6.0.1
- /string-width@5.1.2:
- resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
- engines: {node: '>=12'}
+ string-width@5.1.2:
dependencies:
eastasianwidth: 0.2.0
emoji-regex: 9.2.2
strip-ansi: 7.1.0
- /string.prototype.includes@2.0.0:
- resolution: {integrity: sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==}
+ string-width@7.2.0:
+ dependencies:
+ emoji-regex: 10.4.0
+ get-east-asian-width: 1.3.0
+ strip-ansi: 7.1.0
+
+ string.prototype.includes@2.0.1:
dependencies:
+ call-bind: 1.0.7
define-properties: 1.2.1
es-abstract: 1.23.3
- dev: true
- /string.prototype.matchall@4.0.11:
- resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==}
- engines: {node: '>= 0.4'}
+ string.prototype.matchall@4.0.11:
dependencies:
call-bind: 1.0.7
define-properties: 1.2.1
@@ -9006,112 +5639,56 @@ packages:
gopd: 1.0.1
has-symbols: 1.0.3
internal-slot: 1.0.7
- regexp.prototype.flags: 1.5.2
+ regexp.prototype.flags: 1.5.3
set-function-name: 2.0.2
side-channel: 1.0.6
- dev: true
- /string.prototype.repeat@1.0.0:
- resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==}
+ string.prototype.repeat@1.0.0:
dependencies:
define-properties: 1.2.1
es-abstract: 1.23.3
- dev: true
- /string.prototype.trim@1.2.9:
- resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==}
- engines: {node: '>= 0.4'}
+ string.prototype.trim@1.2.9:
dependencies:
call-bind: 1.0.7
define-properties: 1.2.1
es-abstract: 1.23.3
es-object-atoms: 1.0.0
- dev: true
- /string.prototype.trimend@1.0.8:
- resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==}
+ string.prototype.trimend@1.0.8:
dependencies:
call-bind: 1.0.7
define-properties: 1.2.1
es-object-atoms: 1.0.0
- dev: true
- /string.prototype.trimstart@1.0.8:
- resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
- engines: {node: '>= 0.4'}
+ string.prototype.trimstart@1.0.8:
dependencies:
call-bind: 1.0.7
define-properties: 1.2.1
es-object-atoms: 1.0.0
- dev: true
-
- /string_decoder@1.3.0:
- resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
- dependencies:
- safe-buffer: 5.2.1
- dev: false
- /strip-ansi@6.0.1:
- resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
- engines: {node: '>=8'}
+ strip-ansi@6.0.1:
dependencies:
ansi-regex: 5.0.1
- /strip-ansi@7.1.0:
- resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
- engines: {node: '>=12'}
+ strip-ansi@7.1.0:
dependencies:
- ansi-regex: 6.0.1
-
- /strip-bom@3.0.0:
- resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
- engines: {node: '>=4'}
- dev: true
-
- /strip-final-newline@3.0.0:
- resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
- engines: {node: '>=12'}
- dev: true
+ ansi-regex: 6.1.0
- /strip-indent@3.0.0:
- resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
- engines: {node: '>=8'}
- dependencies:
- min-indent: 1.0.1
- dev: true
+ strip-bom@3.0.0: {}
- /strip-json-comments@3.1.1:
- resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
- engines: {node: '>=8'}
+ strip-final-newline@3.0.0: {}
- /strip-literal@2.1.0:
- resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==}
- dependencies:
- js-tokens: 9.0.0
- dev: true
+ strip-json-comments@3.1.1: {}
- /styled-jsx@5.1.1(@babel/core@7.24.5)(react@18.3.1):
- resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==}
- engines: {node: '>= 12.0.0'}
- peerDependencies:
- '@babel/core': '*'
- babel-plugin-macros: '*'
- react: '>= 16.8.0 || 17.x.x || ^18.0.0-0'
- peerDependenciesMeta:
- '@babel/core':
- optional: true
- babel-plugin-macros:
- optional: true
+ styled-jsx@5.1.6(@babel/core@7.26.0)(react@18.3.1):
dependencies:
- '@babel/core': 7.24.5
client-only: 0.0.1
react: 18.3.1
- dev: false
+ optionalDependencies:
+ '@babel/core': 7.26.0
- /sucrase@3.35.0:
- resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==}
- engines: {node: '>=16 || 14 >=14.17'}
- hasBin: true
+ sucrase@3.35.0:
dependencies:
'@jridgewell/gen-mapping': 0.3.5
commander: 4.1.1
@@ -9121,99 +5698,21 @@ packages:
pirates: 4.0.6
ts-interface-checker: 0.1.13
- /supports-color@5.5.0:
- resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
- engines: {node: '>=4'}
- dependencies:
- has-flag: 3.0.0
-
- /supports-color@7.2.0:
- resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
- engines: {node: '>=8'}
- dependencies:
- has-flag: 4.0.0
-
- /supports-color@8.1.1:
- resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
- engines: {node: '>=10'}
+ supports-color@7.2.0:
dependencies:
has-flag: 4.0.0
- dev: false
-
- /supports-preserve-symlinks-flag@1.0.0:
- resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
- engines: {node: '>= 0.4'}
- /swiper@11.1.10:
- resolution: {integrity: sha512-pAVM6vCb6bumj2B9aSh67l3wP1j5YR8dPQM1YhQKMpnBc33vs+RpyVz6NZYZl/ZopCBSYbbWK5nvESwbmU0QXQ==}
- engines: {node: '>= 4.7.0'}
- dev: false
-
- /symbol-tree@3.2.4:
- resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
- dev: true
-
- /synckit@0.9.1:
- resolution: {integrity: sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==}
- engines: {node: ^14.18.0 || >=16.0.0}
- dependencies:
- '@pkgr/core': 0.1.1
- tslib: 2.7.0
- dev: true
-
- /tailwind-merge@2.2.0:
- resolution: {integrity: sha512-SqqhhaL0T06SW59+JVNfAqKdqLs0497esifRrZ7jOaefP3o64fdFNDMrAQWZFMxTLJPiHVjRLUywT8uFz1xNWQ==}
- dependencies:
- '@babel/runtime': 7.25.4
- dev: false
+ supports-preserve-symlinks-flag@1.0.0: {}
- /tailwind-merge@2.5.2:
- resolution: {integrity: sha512-kjEBm+pvD+6eAwzJL2Bi+02/9LFLal1Gs61+QB7HvTfQQ0aXwC5LGT8PEt1gS0CWKktKe6ysPTAy3cBC5MeiIg==}
- dev: false
+ swiper@11.1.14: {}
- /tailwindcss-animate@1.0.7(tailwindcss@3.4.10):
- resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==}
- peerDependencies:
- tailwindcss: '>=3.0.0 || insiders'
- dependencies:
- tailwindcss: 3.4.10
- dev: false
+ tailwind-merge@2.5.4: {}
- /tailwindcss@3.4.0:
- resolution: {integrity: sha512-VigzymniH77knD1dryXbyxR+ePHihHociZbXnLZHUyzf2MMs2ZVqlUrZ3FvpXP8pno9JzmILt1sZPD19M3IxtA==}
- engines: {node: '>=14.0.0'}
- hasBin: true
+ tailwindcss-animate@1.0.7(tailwindcss@3.4.14):
dependencies:
- '@alloc/quick-lru': 5.2.0
- arg: 5.0.2
- chokidar: 3.5.3
- didyoumean: 1.2.2
- dlv: 1.1.3
- fast-glob: 3.3.2
- glob-parent: 6.0.2
- is-glob: 4.0.3
- jiti: 1.21.6
- lilconfig: 2.1.0
- micromatch: 4.0.8
- normalize-path: 3.0.0
- object-hash: 3.0.0
- picocolors: 1.0.1
- postcss: 8.4.41
- postcss-import: 15.1.0(postcss@8.4.41)
- postcss-js: 4.0.1(postcss@8.4.41)
- postcss-load-config: 4.0.2(postcss@8.4.41)
- postcss-nested: 6.2.0(postcss@8.4.41)
- postcss-selector-parser: 6.1.2
- resolve: 1.22.8
- sucrase: 3.35.0
- transitivePeerDependencies:
- - ts-node
- dev: false
+ tailwindcss: 3.4.14
- /tailwindcss@3.4.10:
- resolution: {integrity: sha512-KWZkVPm7yJRhdu4SRSl9d4AK2wM3a50UsvgHZO7xY77NQr2V+fIrEuoDGQcbvswWvFGbS2f6e+jC/6WJm1Dl0w==}
- engines: {node: '>=14.0.0'}
- hasBin: true
+ tailwindcss@3.4.14:
dependencies:
'@alloc/quick-lru': 5.2.0
arg: 5.0.2
@@ -9228,223 +5727,76 @@ packages:
micromatch: 4.0.8
normalize-path: 3.0.0
object-hash: 3.0.0
- picocolors: 1.0.1
- postcss: 8.4.41
- postcss-import: 15.1.0(postcss@8.4.41)
- postcss-js: 4.0.1(postcss@8.4.41)
- postcss-load-config: 4.0.2(postcss@8.4.41)
- postcss-nested: 6.2.0(postcss@8.4.41)
+ picocolors: 1.1.1
+ postcss: 8.4.47
+ postcss-import: 15.1.0(postcss@8.4.47)
+ postcss-js: 4.0.1(postcss@8.4.47)
+ postcss-load-config: 4.0.2(postcss@8.4.47)
+ postcss-nested: 6.2.0(postcss@8.4.47)
postcss-selector-parser: 6.1.2
resolve: 1.22.8
sucrase: 3.35.0
- transitivePeerDependencies:
- - ts-node
-
- /tapable@2.2.1:
- resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
- engines: {node: '>=6'}
-
- /terser-webpack-plugin@5.3.10(@swc/core@1.3.101)(esbuild@0.19.11)(webpack@5.94.0):
- resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==}
- engines: {node: '>= 10.13.0'}
- peerDependencies:
- '@swc/core': '*'
- esbuild: '*'
- uglify-js: '*'
- webpack: ^5.1.0
- peerDependenciesMeta:
- '@swc/core':
- optional: true
- esbuild:
- optional: true
- uglify-js:
- optional: true
- dependencies:
- '@jridgewell/trace-mapping': 0.3.25
- '@swc/core': 1.3.101
- esbuild: 0.19.11
- jest-worker: 27.5.1
- schema-utils: 3.3.0
- serialize-javascript: 6.0.2
- terser: 5.31.6
- webpack: 5.94.0(@swc/core@1.3.101)(esbuild@0.19.11)
- dev: false
-
- /terser@5.31.6:
- resolution: {integrity: sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==}
- engines: {node: '>=10'}
- hasBin: true
- dependencies:
- '@jridgewell/source-map': 0.3.6
- acorn: 8.12.1
- commander: 2.20.3
- source-map-support: 0.5.21
- dev: false
+ transitivePeerDependencies:
+ - ts-node
- /test-exclude@6.0.0:
- resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==}
- engines: {node: '>=8'}
- dependencies:
- '@istanbuljs/schema': 0.1.3
- glob: 7.2.3
- minimatch: 3.1.2
- dev: true
+ tapable@2.2.1: {}
- /text-table@0.2.0:
- resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
+ text-extensions@2.4.0: {}
- /thenify-all@1.6.0:
- resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
- engines: {node: '>=0.8'}
+ text-table@0.2.0: {}
+
+ thenify-all@1.6.0:
dependencies:
thenify: 3.3.1
- /thenify@3.3.1:
- resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
+ thenify@3.3.1:
dependencies:
any-promise: 1.3.0
- /tiny-invariant@1.3.3:
- resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==}
- dev: false
-
- /tinybench@2.9.0:
- resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
- dev: true
-
- /tinypool@0.8.4:
- resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==}
- engines: {node: '>=14.0.0'}
- dev: true
-
- /tinyspy@2.2.1:
- resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==}
- engines: {node: '>=14.0.0'}
- dev: true
+ through@2.3.8: {}
- /to-fast-properties@2.0.0:
- resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
- engines: {node: '>=4'}
+ tinyexec@0.3.1: {}
- /to-regex-range@5.0.1:
- resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
- engines: {node: '>=8.0'}
+ to-regex-range@5.0.1:
dependencies:
is-number: 7.0.0
- /totalist@3.0.1:
- resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
- engines: {node: '>=6'}
- dev: true
-
- /tough-cookie@4.1.4:
- resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==}
- engines: {node: '>=6'}
- dependencies:
- psl: 1.9.0
- punycode: 2.3.1
- universalify: 0.2.0
- url-parse: 1.5.10
- dev: true
-
- /tr46@5.0.0:
- resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==}
- engines: {node: '>=18'}
- dependencies:
- punycode: 2.3.1
- dev: true
-
- /ts-api-utils@1.3.0(typescript@5.5.4):
- resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==}
- engines: {node: '>=16'}
- peerDependencies:
- typescript: '>=4.2.0'
+ ts-api-utils@1.3.0(typescript@5.6.3):
dependencies:
- typescript: 5.5.4
- dev: true
+ typescript: 5.6.3
- /ts-interface-checker@0.1.13:
- resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
+ ts-interface-checker@0.1.13: {}
- /tsconfig-paths@3.15.0:
- resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==}
+ tsconfig-paths@3.15.0:
dependencies:
'@types/json5': 0.0.29
json5: 1.0.2
minimist: 1.2.8
strip-bom: 3.0.0
- dev: true
-
- /tslib@1.14.1:
- resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
- dev: true
- /tslib@2.7.0:
- resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==}
-
- /tsutils@3.21.0(typescript@5.5.4):
- resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
- engines: {node: '>= 6'}
- peerDependencies:
- typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta'
- dependencies:
- tslib: 1.14.1
- typescript: 5.5.4
- dev: true
+ tslib@2.8.0: {}
- /type-check@0.4.0:
- resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
- engines: {node: '>= 0.8.0'}
+ type-check@0.4.0:
dependencies:
prelude-ls: 1.2.1
- /type-detect@4.1.0:
- resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==}
- engines: {node: '>=4'}
- dev: true
-
- /type-fest@0.20.2:
- resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
- engines: {node: '>=10'}
-
- /type-fest@0.6.0:
- resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==}
- engines: {node: '>=8'}
- dev: true
-
- /type-fest@0.7.1:
- resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==}
- engines: {node: '>=8'}
- dev: false
-
- /type-fest@0.8.1:
- resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==}
- engines: {node: '>=8'}
- dev: true
+ type-fest@0.20.2: {}
- /typed-array-buffer@1.0.2:
- resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==}
- engines: {node: '>= 0.4'}
+ typed-array-buffer@1.0.2:
dependencies:
call-bind: 1.0.7
es-errors: 1.3.0
is-typed-array: 1.1.13
- dev: true
- /typed-array-byte-length@1.0.1:
- resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==}
- engines: {node: '>= 0.4'}
+ typed-array-byte-length@1.0.1:
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
- dev: true
- /typed-array-byte-offset@1.0.2:
- resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==}
- engines: {node: '>= 0.4'}
+ typed-array-byte-offset@1.0.2:
dependencies:
available-typed-arrays: 1.0.7
call-bind: 1.0.7
@@ -9452,11 +5804,8 @@ packages:
gopd: 1.0.1
has-proto: 1.0.3
is-typed-array: 1.1.13
- dev: true
- /typed-array-length@1.0.6:
- resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==}
- engines: {node: '>= 0.4'}
+ typed-array-length@1.0.6:
dependencies:
call-bind: 1.0.7
for-each: 0.3.3
@@ -9464,399 +5813,56 @@ packages:
has-proto: 1.0.3
is-typed-array: 1.1.13
possible-typed-array-names: 1.0.0
- dev: true
-
- /typescript@5.1.6:
- resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==}
- engines: {node: '>=14.17'}
- hasBin: true
- dev: false
-
- /typescript@5.5.4:
- resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==}
- engines: {node: '>=14.17'}
- hasBin: true
- /ufo@1.5.4:
- resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==}
- dev: true
+ typescript@5.6.3: {}
- /unbox-primitive@1.0.2:
- resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==}
+ unbox-primitive@1.0.2:
dependencies:
call-bind: 1.0.7
has-bigints: 1.0.2
has-symbols: 1.0.3
which-boxed-primitive: 1.0.2
- dev: true
- /undici-types@6.19.8:
- resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==}
+ undici-types@6.19.8: {}
- /universalify@0.2.0:
- resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==}
- engines: {node: '>= 4.0.0'}
- dev: true
+ unicorn-magic@0.1.0: {}
- /update-browserslist-db@1.1.0(browserslist@4.23.3):
- resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==}
- hasBin: true
- peerDependencies:
- browserslist: '>= 4.21.0'
+ update-browserslist-db@1.1.1(browserslist@4.24.2):
dependencies:
- browserslist: 4.23.3
- escalade: 3.1.2
- picocolors: 1.0.1
+ browserslist: 4.24.2
+ escalade: 3.2.0
+ picocolors: 1.1.1
- /uri-js@4.4.1:
- resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+ uri-js@4.4.1:
dependencies:
punycode: 2.3.1
- /url-parse@1.5.10:
- resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==}
- dependencies:
- querystringify: 2.2.0
- requires-port: 1.0.0
- dev: true
-
- /use-callback-ref@1.3.2(@types/react@18.2.47)(react@18.3.1):
- resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==}
- 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
- dependencies:
- '@types/react': 18.2.47
- react: 18.3.1
- tslib: 2.7.0
- dev: false
-
- /use-callback-ref@1.3.2(@types/react@18.3.4)(react@18.3.1):
- resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==}
- 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
- dependencies:
- '@types/react': 18.3.4
- react: 18.3.1
- tslib: 2.7.0
- dev: false
-
- /use-intl@3.17.6(react@18.3.1):
- resolution: {integrity: sha512-07wyVHSFSfI6M6TjhX/buZUFXnFymSz5LCimIMutTnBY11Vc/ym18j3HpZoQoWH+JYRKCCa4Jfm7NNyVKmgVww==}
- peerDependencies:
- react: ^16.8.0 || ^17.0.0 || ^18.0.0
- dependencies:
- '@formatjs/fast-memoize': 2.2.0
- intl-messageformat: 10.5.14
- react: 18.3.1
- dev: false
-
- /use-sidecar@1.1.2(@types/react@18.2.47)(react@18.3.1):
- resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==}
- 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
+ use-callback-ref@1.3.2(@types/react@18.3.12)(react@18.3.1):
dependencies:
- '@types/react': 18.2.47
- detect-node-es: 1.1.0
react: 18.3.1
- tslib: 2.7.0
- dev: false
+ tslib: 2.8.0
+ optionalDependencies:
+ '@types/react': 18.3.12
- /use-sidecar@1.1.2(@types/react@18.3.4)(react@18.3.1):
- resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==}
- 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
+ use-sidecar@1.1.2(@types/react@18.3.12)(react@18.3.1):
dependencies:
- '@types/react': 18.3.4
detect-node-es: 1.1.0
react: 18.3.1
- tslib: 2.7.0
- dev: false
-
- /use-sync-external-store@1.2.2(react@18.3.1):
- resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==}
- peerDependencies:
- react: ^16.8.0 || ^17.0.0 || ^18.0.0
- dependencies:
- react: 18.3.1
- dev: false
-
- /util-deprecate@1.0.2:
- resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
-
- /validate-npm-package-license@3.0.4:
- resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
- dependencies:
- spdx-correct: 3.2.0
- spdx-expression-parse: 3.0.1
- dev: true
-
- /vary@1.1.2:
- resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
- engines: {node: '>= 0.8'}
- dev: false
-
- /victory-vendor@36.9.2:
- resolution: {integrity: sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==}
- dependencies:
- '@types/d3-array': 3.2.1
- '@types/d3-ease': 3.0.2
- '@types/d3-interpolate': 3.0.4
- '@types/d3-scale': 4.0.8
- '@types/d3-shape': 3.1.6
- '@types/d3-time': 3.0.3
- '@types/d3-timer': 3.0.2
- d3-array: 3.2.4
- d3-ease: 3.0.1
- d3-interpolate: 3.0.1
- d3-scale: 4.0.2
- d3-shape: 3.2.0
- d3-time: 3.1.0
- d3-timer: 3.0.1
- dev: false
-
- /vite-node@1.6.0(@types/node@20.16.1):
- resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==}
- engines: {node: ^18.0.0 || >=20.0.0}
- hasBin: true
- dependencies:
- cac: 6.7.14
- debug: 4.3.6
- pathe: 1.1.2
- picocolors: 1.0.1
- vite: 5.4.2(@types/node@20.16.1)
- transitivePeerDependencies:
- - '@types/node'
- - less
- - lightningcss
- - sass
- - sass-embedded
- - stylus
- - sugarss
- - supports-color
- - terser
- dev: true
-
- /vite@5.4.2(@types/node@20.16.1):
- resolution: {integrity: sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==}
- engines: {node: ^18.0.0 || >=20.0.0}
- hasBin: true
- peerDependencies:
- '@types/node': ^18.0.0 || >=20.0.0
- less: '*'
- lightningcss: ^1.21.0
- sass: '*'
- sass-embedded: '*'
- stylus: '*'
- sugarss: '*'
- terser: ^5.4.0
- peerDependenciesMeta:
- '@types/node':
- optional: true
- less:
- optional: true
- lightningcss:
- optional: true
- sass:
- optional: true
- sass-embedded:
- optional: true
- stylus:
- optional: true
- sugarss:
- optional: true
- terser:
- optional: true
- dependencies:
- '@types/node': 20.16.1
- esbuild: 0.21.5
- postcss: 8.4.41
- rollup: 4.21.0
+ tslib: 2.8.0
optionalDependencies:
- fsevents: 2.3.3
- dev: true
-
- /vitest@1.6.0(@types/node@20.16.1)(@vitest/ui@1.6.0)(jsdom@24.1.3):
- resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==}
- engines: {node: ^18.0.0 || >=20.0.0}
- hasBin: true
- peerDependencies:
- '@edge-runtime/vm': '*'
- '@types/node': ^18.0.0 || >=20.0.0
- '@vitest/browser': 1.6.0
- '@vitest/ui': 1.6.0
- 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
- dependencies:
- '@types/node': 20.16.1
- '@vitest/expect': 1.6.0
- '@vitest/runner': 1.6.0
- '@vitest/snapshot': 1.6.0
- '@vitest/spy': 1.6.0
- '@vitest/ui': 1.6.0(vitest@1.6.0)
- '@vitest/utils': 1.6.0
- acorn-walk: 8.3.3
- chai: 4.5.0
- debug: 4.3.6
- execa: 8.0.1
- jsdom: 24.1.3
- local-pkg: 0.5.0
- magic-string: 0.30.11
- pathe: 1.1.2
- picocolors: 1.0.1
- std-env: 3.7.0
- strip-literal: 2.1.0
- tinybench: 2.9.0
- tinypool: 0.8.4
- vite: 5.4.2(@types/node@20.16.1)
- vite-node: 1.6.0(@types/node@20.16.1)
- why-is-node-running: 2.3.0
- transitivePeerDependencies:
- - less
- - lightningcss
- - sass
- - sass-embedded
- - stylus
- - sugarss
- - supports-color
- - terser
- dev: true
-
- /w3c-xmlserializer@5.0.0:
- resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==}
- engines: {node: '>=18'}
- dependencies:
- xml-name-validator: 5.0.0
- dev: true
-
- /watchpack@2.4.2:
- resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==}
- engines: {node: '>=10.13.0'}
- dependencies:
- glob-to-regexp: 0.4.1
- graceful-fs: 4.2.11
- dev: false
-
- /wcwidth@1.0.1:
- resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
- dependencies:
- defaults: 1.0.4
- dev: false
-
- /webidl-conversions@7.0.0:
- resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}
- engines: {node: '>=12'}
- dev: true
-
- /webpack-sources@3.2.3:
- resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==}
- engines: {node: '>=10.13.0'}
- dev: false
-
- /webpack@5.94.0(@swc/core@1.3.101)(esbuild@0.19.11):
- resolution: {integrity: sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==}
- engines: {node: '>=10.13.0'}
- hasBin: true
- peerDependencies:
- webpack-cli: '*'
- peerDependenciesMeta:
- webpack-cli:
- optional: true
- dependencies:
- '@types/estree': 1.0.5
- '@webassemblyjs/ast': 1.12.1
- '@webassemblyjs/wasm-edit': 1.12.1
- '@webassemblyjs/wasm-parser': 1.12.1
- acorn: 8.12.1
- acorn-import-attributes: 1.9.5(acorn@8.12.1)
- browserslist: 4.23.3
- chrome-trace-event: 1.0.4
- enhanced-resolve: 5.17.1
- es-module-lexer: 1.5.4
- eslint-scope: 5.1.1
- events: 3.3.0
- glob-to-regexp: 0.4.1
- graceful-fs: 4.2.11
- json-parse-even-better-errors: 2.3.1
- loader-runner: 4.3.0
- mime-types: 2.1.35
- neo-async: 2.6.2
- schema-utils: 3.3.0
- tapable: 2.2.1
- terser-webpack-plugin: 5.3.10(@swc/core@1.3.101)(esbuild@0.19.11)(webpack@5.94.0)
- watchpack: 2.4.2
- webpack-sources: 3.2.3
- transitivePeerDependencies:
- - '@swc/core'
- - esbuild
- - uglify-js
- dev: false
+ '@types/react': 18.3.12
- /whatwg-encoding@3.1.1:
- resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==}
- engines: {node: '>=18'}
- dependencies:
- iconv-lite: 0.6.3
- dev: true
-
- /whatwg-mimetype@4.0.0:
- resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==}
- engines: {node: '>=18'}
- dev: true
+ util-deprecate@1.0.2: {}
- /whatwg-url@14.0.0:
- resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==}
- engines: {node: '>=18'}
- dependencies:
- tr46: 5.0.0
- webidl-conversions: 7.0.0
- dev: true
-
- /which-boxed-primitive@1.0.2:
- resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
+ which-boxed-primitive@1.0.2:
dependencies:
is-bigint: 1.0.4
is-boolean-object: 1.1.2
is-number-object: 1.0.7
is-string: 1.0.7
is-symbol: 1.0.4
- dev: true
- /which-builtin-type@1.1.4:
- resolution: {integrity: sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==}
- engines: {node: '>= 0.4'}
+ which-builtin-type@1.1.4:
dependencies:
function.prototype.name: 1.1.6
has-tostringtag: 1.0.2
@@ -9870,145 +5876,75 @@ packages:
which-boxed-primitive: 1.0.2
which-collection: 1.0.2
which-typed-array: 1.1.15
- dev: true
- /which-collection@1.0.2:
- resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==}
- engines: {node: '>= 0.4'}
+ which-collection@1.0.2:
dependencies:
is-map: 2.0.3
is-set: 2.0.3
is-weakmap: 2.0.2
is-weakset: 2.0.3
- dev: true
- /which-typed-array@1.1.15:
- resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==}
- engines: {node: '>= 0.4'}
+ which-typed-array@1.1.15:
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
- dev: true
- /which@2.0.2:
- resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
- engines: {node: '>= 8'}
- hasBin: true
+ which@2.0.2:
dependencies:
isexe: 2.0.0
- /why-is-node-running@2.3.0:
- resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==}
- engines: {node: '>=8'}
- hasBin: true
- dependencies:
- siginfo: 2.0.0
- stackback: 0.0.2
- dev: true
-
- /word-wrap@1.2.5:
- resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
- engines: {node: '>=0.10.0'}
+ word-wrap@1.2.5: {}
- /wrap-ansi@7.0.0:
- resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
- engines: {node: '>=10'}
+ wrap-ansi@7.0.0:
dependencies:
ansi-styles: 4.3.0
string-width: 4.2.3
strip-ansi: 6.0.1
- /wrap-ansi@8.1.0:
- resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
- engines: {node: '>=12'}
+ wrap-ansi@8.1.0:
dependencies:
ansi-styles: 6.2.1
string-width: 5.1.2
strip-ansi: 7.1.0
- /wrappy@1.0.2:
- resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+ wrap-ansi@9.0.0:
+ dependencies:
+ ansi-styles: 6.2.1
+ string-width: 7.2.0
+ strip-ansi: 7.1.0
- /ws@8.17.1:
- resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==}
- engines: {node: '>=10.0.0'}
- peerDependencies:
- bufferutil: ^4.0.1
- utf-8-validate: '>=5.0.2'
- peerDependenciesMeta:
- bufferutil:
- optional: true
- utf-8-validate:
- optional: true
- dev: false
+ wrappy@1.0.2: {}
- /ws@8.18.0:
- resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==}
- engines: {node: '>=10.0.0'}
- peerDependencies:
- bufferutil: ^4.0.1
- utf-8-validate: '>=5.0.2'
- peerDependenciesMeta:
- bufferutil:
- optional: true
- utf-8-validate:
- optional: true
- dev: true
+ y18n@5.0.8: {}
- /xml-name-validator@5.0.0:
- resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==}
- engines: {node: '>=18'}
- dev: true
+ yallist@3.1.1: {}
- /xmlchars@2.2.0:
- resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==}
- dev: true
+ yaml@2.5.1: {}
- /xmlhttprequest-ssl@2.0.0:
- resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==}
- engines: {node: '>=0.4.0'}
- dev: false
+ yaml@2.6.0: {}
- /yallist@3.1.1:
- resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+ yargs-parser@21.1.1: {}
- /yaml@2.5.0:
- resolution: {integrity: sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==}
- engines: {node: '>= 14'}
- hasBin: true
+ yargs@17.7.2:
+ dependencies:
+ cliui: 8.0.1
+ escalade: 3.2.0
+ get-caller-file: 2.0.5
+ require-directory: 2.1.1
+ string-width: 4.2.3
+ y18n: 5.0.8
+ yargs-parser: 21.1.1
- /yocto-queue@0.1.0:
- resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
- engines: {node: '>=10'}
+ yocto-queue@0.1.0: {}
- /yocto-queue@1.1.1:
- resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==}
- engines: {node: '>=12.20'}
- dev: true
+ yocto-queue@1.1.1: {}
- /zod@3.23.8:
- resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==}
- dev: false
+ zod@3.23.8: {}
- /zustand@4.5.5(@types/react@18.3.4)(react@18.3.1):
- resolution: {integrity: sha512-+0PALYNJNgK6hldkgDq2vLrw5f6g/jCInz52n9RTpropGgeAf/ioFUCdtsjCqu4gNhW9D01rUQBROoRjdzyn2Q==}
- engines: {node: '>=12.7.0'}
- peerDependencies:
- '@types/react': '>=16.8'
- immer: '>=9.0.6'
- react: '>=16.8'
- peerDependenciesMeta:
- '@types/react':
- optional: true
- immer:
- optional: true
- react:
- optional: true
- dependencies:
- '@types/react': 18.3.4
+ zustand@5.0.0(@types/react@18.3.12)(react@18.3.1):
+ optionalDependencies:
+ '@types/react': 18.3.12
react: 18.3.1
- use-sync-external-store: 1.2.2(react@18.3.1)
- dev: false
diff --git a/postcss.config.mjs b/postcss.config.mjs
index 1a69fd2a4..0dc456ad9 100644
--- a/postcss.config.mjs
+++ b/postcss.config.mjs
@@ -3,6 +3,6 @@ const config = {
plugins: {
tailwindcss: {},
},
-};
+}
-export default config;
+export default config
diff --git a/.prettierrc.cjs b/prettierrc.cjs
similarity index 57%
rename from .prettierrc.cjs
rename to prettierrc.cjs
index 8182e19c7..98105238d 100644
--- a/.prettierrc.cjs
+++ b/prettierrc.cjs
@@ -9,18 +9,18 @@ module.exports = {
jsxSingleQuote: false,
singleQuote: false,
semi: true,
- trailingComma: "all",
- arrowParens: "always",
- endOfLine: "auto",
+ trailingComma: 'all',
+ arrowParens: 'always',
+ endOfLine: 'auto',
plugins: [
- "@ianvs/prettier-plugin-sort-imports",
- "prettier-plugin-tailwindcss",
+ '@ianvs/prettier-plugin-sort-imports',
+ 'prettier-plugin-tailwindcss',
],
// #region @ianvs/prettier-plugin-sort-imports
- importOrder: ["", "", "^~/", "^[.][.]/", "^[.]/"],
- importOrderParserPlugins: ["typescript", "jsx", "decorators-legacy"],
- importOrderTypeScriptVersion: "5.0.0",
+ importOrder: ['', '', '^~/', '^[.][.]/', '^[.]/'],
+ importOrderParserPlugins: ['typescript', 'jsx', 'decorators-legacy'],
+ importOrderTypeScriptVersion: '5.0.0',
// #endregion @ianvs/prettier-plugin-sort-imports
-};
+}
diff --git a/public/404.gif b/public/404.gif
deleted file mode 100644
index ca8ec2e0c..000000000
Binary files a/public/404.gif and /dev/null differ
diff --git a/public/admin-dashboard/images/user-1.png b/public/admin-dashboard/images/user-1.png
deleted file mode 100644
index bfcb62a07..000000000
Binary files a/public/admin-dashboard/images/user-1.png and /dev/null differ
diff --git a/public/admin-dashboard/images/user-2.png b/public/admin-dashboard/images/user-2.png
deleted file mode 100644
index 6bca4c6b9..000000000
Binary files a/public/admin-dashboard/images/user-2.png and /dev/null differ
diff --git a/public/admin-dashboard/images/user-3.png b/public/admin-dashboard/images/user-3.png
deleted file mode 100644
index 514e7f648..000000000
Binary files a/public/admin-dashboard/images/user-3.png and /dev/null differ
diff --git a/public/admin-dashboard/images/user-4.png b/public/admin-dashboard/images/user-4.png
deleted file mode 100644
index 82c04823f..000000000
Binary files a/public/admin-dashboard/images/user-4.png and /dev/null differ
diff --git a/public/admin-dashboard/images/user-5.png b/public/admin-dashboard/images/user-5.png
deleted file mode 100644
index fc34a52de..000000000
Binary files a/public/admin-dashboard/images/user-5.png and /dev/null differ
diff --git a/public/email/email-verification.png b/public/email/email-verification.png
deleted file mode 100644
index 6cd86d244..000000000
Binary files a/public/email/email-verification.png and /dev/null differ
diff --git a/public/images/blogPage/utils/index.ts b/public/images/blogPage/utils/index.ts
new file mode 100644
index 000000000..b458a5240
--- /dev/null
+++ b/public/images/blogPage/utils/index.ts
@@ -0,0 +1,7 @@
+export { default as blogCard1 } from '../../blogPage/blogCard1.png'
+export { default as blogCard3 } from '../../blogPage/blogCard3.png'
+export { default as blogCard2 } from '../../blogPage/blogCard2.png'
+export { default as blogCard4 } from '../../blogPage/blogCard4.png'
+export { default as blogCard5 } from '../../blogPage/blogCard5.png'
+export { default as blogCard6 } from '../../blogPage/blogCard1.png'
+export { default as blogHero } from '../../blogPage/blogHero.svg'
diff --git a/public/images/blogPage/utils/index.tsx b/public/images/blogPage/utils/index.tsx
deleted file mode 100644
index 1487ba2e6..000000000
--- a/public/images/blogPage/utils/index.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-export { default as blogCard1 } from "../../blogPage/blogCard1.png";
-export { default as blogCard3 } from "../../blogPage/blogCard3.png";
-export { default as blogCard2 } from "../../blogPage/blogCard2.png";
-export { default as blogCard4 } from "../../blogPage/blogCard4.png";
-export { default as blogCard5 } from "../../blogPage/blogCard5.png";
-export { default as blogCard6 } from "../../blogPage/blogCard1.png";
-export { default as blogHero } from "../../blogPage/blogHero.svg";
diff --git a/public/logo/dashboard-logo.png b/public/logo/dashboard-logo.png
deleted file mode 100644
index 6603d0187..000000000
Binary files a/public/logo/dashboard-logo.png and /dev/null differ
diff --git a/public/logo/logo.png b/public/logo/logo.png
deleted file mode 100644
index 76dbcbf1b..000000000
Binary files a/public/logo/logo.png and /dev/null differ
diff --git a/public/logo/logo.svg b/public/logo/logo.svg
deleted file mode 100644
index 8626afc1f..000000000
--- a/public/logo/logo.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/messages/en.json b/public/messages/en.json
deleted file mode 100644
index 8ba47e979..000000000
--- a/public/messages/en.json
+++ /dev/null
@@ -1,198 +0,0 @@
-{
- "navbar": {
- "login": "Log in",
- "register": "Get Started"
- },
- "navLinks": {
- "home": "Home",
- "pricing": "Pricing",
- "careers": "Careers"
- },
- "login": {
- "title": "Login",
- "welcomeBack": "Welcome back, you've been missed!",
- "continueWithGoogle": "Continue with Google",
- "emailPlaceholder": "Enter Email Address",
- "passwordPlaceholder": "Enter Password",
- "rememberMe": "Remember me",
- "forgotPassword": "Forgot Password?",
- "loginButton": "Login",
- "signInWithMagicLink": "Sign in with magic link",
- "noAccount": "Don't Have An Account?",
- "agree": "By logging in, you agree to the",
- "and": "and",
- "signUp": "Sign Up",
- "termsOfService": "Terms of Service",
- "privacyPolicy": "Privacy Policy",
- "loggingIn": "Logging in..."
- },
- "register": {
- "signUp": "Sign Up",
- "createAccountDesc": "Create an account to get started with us.",
- "continueWithGoogle": "Continue with Google",
- "firstName": "First Name",
- "firstNamePlaceholder": "Enter your first name",
- "lastName": "Last Name",
- "lastNamePlaceholder": "Enter your last name",
- "email": "Email",
- "emailPlaceholder": "Enter Email Address",
- "password": "Password",
- "passwordPlaceholder": "Enter Password",
- "createAccount": "Create Account",
- "loggingIn": "Logging in...",
- "emailVerification": "Email Verification",
- "emailVerificationDesc": "We have sent a code to your email {email}",
- "checkSpam": "check your spam if you do not receive the email",
- "otpExpiresIn": "OTP expires in: {timeLeft}",
- "resendCode": "Didn't receive the code? resend",
- "dataProcessing": "We would process your data as set forth in our Terms of Use, Privacy Policy and Data Processing Agreement",
- "alreadyHaveAccount": "Already Have An Account?"
- },
- "HomePage": {
- "title": "Hello world!"
- },
- "hero": {
- "headline": "Focus on What Matters. We've Got the Foundation Covered.",
- "description": "Streamline your processes with a boilerplate built for efficiency and optimal productivity.",
- "cta": "Get Started"
- },
- "userSection": {
- "userSectionMoreThan": "More than 200",
- "userSectionUsers": "Users",
- "userSectionUsage": "make use of our Boilerplate"
- },
- "howItWorks": {
- "howItWorksTitlePrefix": "How It Works:",
- "howItWorksTitleHighlight": "Experience the benefits of using our product with every step.",
- "howItWorksDescription": "We designed our product to simplify your life. It offers a comprehensive solution. Here's how it works and how it benefits you at each stage.",
- "prebuiltTitle": "Pre-Built Sections",
- "prebuiltDescription": "Leverage pre-built sections like \"Features,\" \"Benefits,\" \"Pricing,\" and \"Testimonials\" to showcase your product effectively.",
- "scalableTitle": "Scalable Foundation",
- "scalableDescription": "Our boilerplate is designed to grow with your product. Easily add new features and functionalities as needed.",
- "easyTitle": "Easy Customization",
- "easyDescription": "Tailor the experience to your specific needs and preferences for maximum results."
- },
- "testimonials": {
- "title": "Client Testimonials",
- "description": "Don't just take our word for it - see what actual users of our product have to say about their experience.",
- "content": "I've been using this web hosting service for over a year and I'm really impressed with the uptime and support. The website has never gone down and the customer service is always quick to help with any issues I have. Highly recommend!"
- },
- "perfectFit": {
- "title": "Find The Perfect Fit",
- "description": "Choose the boilerplate plan that best suits your project needs and budget. All plans include access to our comprehensive library of pre-built sections, drag-and-drop customization.",
- "cta": "See Our Pricing Plan"
- },
- "footer": {
- "newsletterSignUp": "Sign Up For Newsletters",
- "subscribe": "Subscribe",
- "navigation": "Navigation",
- "support": "Support",
- "legal": "Legal",
- "followUs": "Follow Us",
- "privacyPolicy": "Privacy Policy",
- "termsOfUse": "Terms of Use",
- "enterYourEmail": "Enter your email",
- "links": {
- "navigation": "Navigation",
- "home": "Home",
- "aboutUs": "About Us",
- "career": "Career",
- "features": "Features",
- "blog": "Blog",
- "status": "Status",
- "support": "Support",
- "helpCenter": "Help Center",
- "faq": "FAQ",
- "waitingList": "Waiting List",
- "pricingExperience": "Pricing Experience",
- "contactUs": "Contact Us",
- "legal": "Legal",
- "privacyPolicy": "Privacy Policy",
- "termsAndConditions": "Terms and Conditions"
- },
- "social": {
- "facebook": "Facebook",
- "instagram": "Instagram",
- "linkedin": "LinkedIn",
- "youtube": "YouTube"
- },
- "footerBottom": {
- "privacyPolicy": "Privacy Policy",
- "termsOfUse": "Terms of Use",
- "copyright": "2024 All Rights Reserved",
- "companyName": "HNG Boilerplate"
- }
- },
- "pricing": {
- "pricingTitle": "Simple and {{Affordable}} Pricing Plan",
- "pricingContent": "Our flexible plans are designed to scale with your business. We have a plan for you.",
- "monthly": "Monthly",
- "annual": "Annual (save 20%)",
- "billingPlansNotAvailable": "Billing plans not available",
- "features": {
- "feature1": "2 Projects",
- "feature2": "Up to 100 subscribers",
- "feature3": "Basic analytics",
- "feature4": "24-hour support response time",
- "feature5": "Marketing advisor",
- "feature6": "Custom integration",
- "continue": "Continue"
- },
- "essentials": "The essentials to provide your best work for clients.",
- "faqHeader": "Frequently Asked Questions",
- "faqSubHeader": "We couldn’t answer your question?",
- "contactUs": "Contact us",
- "continue": "Continue"
- },
- "faq": {
- "question1": "What is the purpose of this application?",
- "answer1": "This application is designed to help users manage their tasks efficiently by providing tools for scheduling, tracking progress, and setting reminders.",
- "question2": "How do I reset my password?",
- "answer2": "To reset your password, go to the login page and click on the 'Forgot Password' link. Follow the instructions to receive a password reset email and create a new password.",
- "question3": "Can I use this application on multiple devices?",
- "answer3": "Yes, the application is accessible from multiple devices including desktops, tablets, and smartphones. Your data will be synced across all devices, ensuring a seamless experience."
- },
- "noJobs": {
- "noJobsTitle": "No available Jobs at the moment",
-
- "noJobsContent": "Sign up for our newsletter to get updates on job postings",
- "modalTitle": "Newsletter",
- "button": "Sign up for newsletter",
- "placeholder": "Enter your email",
- "modalButton": "Subscribe",
- "error": "Please provide your email",
- "subscribed": "Thank you for subscribing"
- },
- "ourServices": {
- "title": "Our Services",
- "description": "Trained to Give You The Best",
- "details": "Since our founding in, Hng Boilerplate has been dedicated to constantly evolving to stay ahead of the curve. Our agile mindset and relentless pursuit of innovation ensure that you're always equipped with the most effective tools and strategies."
- },
- "mission": {
- "title": "Our Mission & Vision",
- "subtitle": "Leading the Way, Redefining Industries",
- "description": "At Hng Boilerplate, we are dedicated to exceeding your expectations. We strive to understand your unique needs and challenges, providing tailored solutions that drive real results and empower your success."
- },
- "coreValues": {
- "title": "Our Core Values",
- "description": "Our Values shape the core of our organization and define the character of our industry.",
- "values": {
- "integrity": {
- "title": "Integrity",
- "description": "We uphold the highest ethical standards in everything we do, fostering trust and transparency with our clients, partners, and employees. We believe that honesty and integrity are the foundation of lasting success."
- },
- "customerCentricity": {
- "title": "Customer Centricity",
- "description": "Our customers are at the heart of our business. We strive to understand their needs, exceed their expectations, and build lasting relationships based on trust and mutual respect. We believe that putting our customers first is the key to long-term success."
- },
- "innovation": {
- "title": "Innovation",
- "description": "We embrace a culture of continuous improvement and creativity, constantly seeking new ways to evolve and enhance our products, services, and processes. We encourage experimentation and risk-taking, recognizing that innovation is essential for growth."
- },
- "excellence": {
- "title": "Excellence",
- "description": "We are committed to delivering exceptional quality in everything we do, from our products and services to our customer interactions and internal processes. We strive for continuous improvement and hold ourselves to the highest standards of performance."
- }
- }
- }
-}
diff --git a/public/messages/es.json b/public/messages/es.json
deleted file mode 100644
index 4688e87b0..000000000
--- a/public/messages/es.json
+++ /dev/null
@@ -1,198 +0,0 @@
-{
- "navbar": {
- "login": "Iniciar sesión",
- "register": "Comenzar"
- },
- "navLinks": {
- "home": "Inicio",
- "pricing": "Precios",
- "careers": "Carreras"
- },
- "login": {
- "title": "Iniciar sesión",
- "welcomeBack": "¡Bienvenido de nuevo, te hemos extrañado!",
- "continueWithGoogle": "Continuar con Google",
- "emailPlaceholder": "Ingrese dirección de correo electrónico",
- "passwordPlaceholder": "Ingrese contraseña",
- "rememberMe": "Recuérdame",
- "forgotPassword": "¿Olvidaste tu contraseña?",
- "loginButton": "Iniciar sesión",
- "signInWithMagicLink": "Iniciar sesión con enlace mágico",
- "noAccount": "¿No tienes una cuenta?",
- "agree": "Al iniciar sesión, aceptas los",
- "and": "y",
- "signUp": "Regístrate",
- "termsOfService": "Términos del Servicio",
- "privacyPolicy": "Política de Privacidad",
- "loggingIn": "Iniciando sesión..."
- },
- "register": {
- "signUp": "Regístrate",
- "createAccountDesc": "Crea una cuenta para comenzar con nosotros.",
- "continueWithGoogle": "Continuar con Google",
- "firstName": "Nombre",
- "firstNamePlaceholder": "Ingresa tu nombre",
- "lastName": "Apellido",
- "lastNamePlaceholder": "Ingresa tu apellido",
- "email": "Correo electrónico",
- "emailPlaceholder": "Ingresa la dirección de correo",
- "password": "Contraseña",
- "passwordPlaceholder": "Ingresa la contraseña",
- "createAccount": "Crear cuenta",
- "loggingIn": "Iniciando sesión...",
- "emailVerification": "Verificación de correo electrónico",
- "emailVerificationDesc": "Hemos enviado un código a tu correo {email}",
- "checkSpam": "verifica tu spam si no recibes el correo",
- "otpExpiresIn": "OTP expira en: {timeLeft}",
- "resendCode": "¿No recibiste el código? reenviar",
- "dataProcessing": "Procesaremos tus datos según lo establecido en nuestros Términos de uso, Política de privacidad y Acuerdo de procesamiento de datos",
- "alreadyHaveAccount": "¿Ya tienes una cuenta? Iniciar sesión"
- },
- "HomePage": {
- "title": "¡Hola, mundo!"
- },
- "hero": {
- "headline": "Concéntrate en lo importante. Nosotros cubrimos los cimientos.",
- "description": "Agiliza tus procesos con una base de código diseñada para la eficiencia y una productividad óptima.",
- "cta": "Comenzar"
- },
- "userSection": {
- "userSectionMoreThan": "Más de 200",
- "userSectionUsers": "Usuarios",
- "userSectionUsage": "usan nuestro Boilerplate"
- },
- "howItWorks": {
- "howItWorksTitlePrefix": "Cómo Funciona:",
- "howItWorksTitleHighlight": "Experimenta los beneficios de usar nuestro producto en cada paso.",
- "howItWorksDescription": "Diseñamos nuestro producto para simplificar tu vida. Ofrece una solución integral. Así es como funciona y cómo te beneficia en cada etapa.",
- "prebuiltTitle": "Secciones Preconstruidas",
- "prebuiltDescription": "Aprovecha secciones preconstruidas como \"Características\", \"Beneficios\", \"Precios\" y \"Testimonios\" para mostrar tu producto de manera efectiva.",
- "scalableTitle": "Fundación Escalable",
- "scalableDescription": "Nuestro boilerplate está diseñado para crecer con tu producto. Añade fácilmente nuevas características y funcionalidades según sea necesario.",
- "easyTitle": "Personalización Fácil",
- "easyDescription": "Personaliza la experiencia según tus necesidades y preferencias específicas para obtener resultados óptimos."
- },
- "testimonials": {
- "title": "Testimonios de Clientes",
- "description": "No te fíes solo de nuestra palabra: descubre lo que los usuarios reales de nuestro producto tienen que decir sobre su experiencia.",
- "content": "He estado usando este servicio de alojamiento web durante más de un año y estoy realmente impresionado con el tiempo de actividad y el soporte. El sitio web nunca ha caído y el servicio al cliente siempre es rápido para ayudar con cualquier problema que tenga. ¡Altamente recomendado!"
- },
- "perfectFit": {
- "title": "Encuentra la Solución Perfecta",
- "description": "Elige el plan de plantilla que mejor se adapte a las necesidades y presupuesto de tu proyecto. Todos los planes incluyen acceso a nuestra biblioteca completa de secciones preconstruidas y personalización mediante arrastrar y soltar.",
- "cta": "Consulta Nuestro Plan de Precios"
- },
- "footer": {
- "boilerplate": "Plantilla",
- "address": "Detalles del logo y dirección",
- "newsletterSignUp": "Suscríbete al Boletín",
- "subscribe": "Suscribirse",
- "navigation": "Navegación",
- "support": "Soporte",
- "legal": "Legal",
- "followUs": "Síguenos",
- "privacyPolicy": "Política de Privacidad",
- "termsOfUse": "Términos de Uso",
- "enterYourEmail": "Introduce tu correo electrónico",
- "links": {
- "navigation": "Navegación",
- "home": "Inicio",
- "aboutUs": "Sobre Nosotros",
- "career": "Carrera",
- "features": "Características",
- "blog": "Blog",
- "status": "Estado",
- "support": "Soporte",
- "helpCenter": "Centro de Ayuda",
- "faq": "FAQ",
- "waitingList": "Lista de Espera",
- "pricingExperience": "Experiencia de Precios",
- "contactUs": "Contáctanos",
- "legal": "Legal",
- "privacyPolicy": "Política de Privacidad",
- "termsAndConditions": "Términos y Condiciones"
- },
- "social": {
- "facebook": "Facebook",
- "instagram": "Instagram",
- "linkedin": "LinkedIn",
- "youtube": "YouTube"
- },
- "footerBottom": {
- "privacyPolicy": "Política de Privacidad",
- "termsOfUse": "Términos de Uso",
- "copyright": "2024 Todos los Derechos Reservados"
- }
- },
- "pricing": {
- "pricingTitle": "Plan de Precios Simple y {{Asequible}}",
- "pricingContent": "Nuestros planes flexibles están diseñados para adaptarse a su negocio. Tenemos un plan para usted.",
- "monthly": "Mensual",
- "annual": "Anual (ahorra un 20%)",
- "billingPlansNotAvailable": "Planes de facturación no disponibles",
- "features": {
- "feature1": "2 Proyectos",
- "feature2": "Hasta 100 suscriptores",
- "feature3": "Análisis básico",
- "feature4": "Tiempo de respuesta de soporte de 24 horas",
- "feature5": "Asesor de marketing",
- "feature6": "Integración personalizada",
- "continue": "Continuar"
- },
- "essentials": "Los elementos esenciales para ofrecer tu mejor trabajo a los clientes.",
- "faqHeader": "Preguntas Frecuentes",
- "faqSubHeader": "¿No pudimos responder a su pregunta?",
- "contactUs": "Contáctanos",
- "continue": "Continuar"
- },
- "faq": {
- "question1": "¿Cuál es el propósito de esta aplicación?",
- "answer1": "Esta aplicación está diseñada para ayudar a los usuarios a gestionar sus tareas de manera eficiente proporcionando herramientas para la programación, el seguimiento del progreso y el establecimiento de recordatorios.",
- "question2": "¿Cómo restablezco mi contraseña?",
- "answer2": "Para restablecer tu contraseña, ve a la página de inicio de sesión y haz clic en el enlace 'Olvidé mi contraseña'. Sigue las instrucciones para recibir un correo electrónico de restablecimiento de contraseña y crear una nueva contraseña.",
- "question3": "¿Puedo usar esta aplicación en varios dispositivos?",
- "answer3": "Sí, la aplicación es accesible desde múltiples dispositivos, incluidos escritorios, tabletas y teléfonos inteligentes. Tus datos se sincronizarán en todos los dispositivos, garantizando una experiencia fluida."
- },
- "noJobs": {
- "noJobsTitle": "No hay trabajos disponibles en este momento",
- "noJobsContent": "Regístrate en nuestro boletín para recibir actualizaciones sobre ofertas de trabajo.",
- "modalTitle": "Boletín",
- "button": "Regístrate en el boletín",
- "placeholder": "Por favor, proporciona tu correo electrónico",
- "modalButton": "Suscribirse",
- "error": "Ingresa tu correo electrónico",
- "subscribed": "Gracias por suscribirte"
- },
- "ourServices": {
- "title": "Nuestros Servicios",
- "description": "Capacitados para Ofrecerte Lo Mejor",
- "details": "Desde nuestra fundación, Hng Boilerplate se ha dedicado a evolucionar constantemente para mantenerse a la vanguardia. Nuestra mentalidad ágil y nuestra búsqueda incesante de innovación garantizan que siempre estés equipado con las herramientas y estrategias más efectivas."
- },
- "mission": {
- "title": "Nuestra Misión y Visión",
- "subtitle": "Liderando el Camino, Redefiniendo Industrias",
- "description": "En Hng Boilerplate, estamos dedicados a superar tus expectativas. Nos esforzamos por entender tus necesidades y desafíos únicos, proporcionando soluciones personalizadas que generan resultados reales y potencian tu éxito."
- },
- "coreValues": {
- "title": "Nuestros Valores Fundamentales",
- "description": "Nuestros Valores forman el núcleo de nuestra organización y definen el carácter de nuestra industria.",
- "values": {
- "integrity": {
- "title": "Integridad",
- "description": "Mantenemos los más altos estándares éticos en todo lo que hacemos, fomentando la confianza y la transparencia con nuestros clientes, socios y empleados. Creemos que la honestidad y la integridad son la base del éxito duradero."
- },
- "customerCentricity": {
- "title": "Enfoque en el Cliente",
- "description": "Nuestros clientes están en el corazón de nuestro negocio. Nos esforzamos por entender sus necesidades, superar sus expectativas y construir relaciones duraderas basadas en la confianza y el respeto mutuo. Creemos que poner a nuestros clientes en primer lugar es la clave para el éxito a largo plazo."
- },
- "innovation": {
- "title": "Innovación",
- "description": "Adoptamos una cultura de mejora continua y creatividad, buscando constantemente nuevas formas de evolucionar y mejorar nuestros productos, servicios y procesos. Fomentamos la experimentación y la toma de riesgos, reconociendo que la innovación es esencial para el crecimiento."
- },
- "excellence": {
- "title": "Excelencia",
- "description": "Estamos comprometidos a ofrecer una calidad excepcional en todo lo que hacemos, desde nuestros productos y servicios hasta nuestras interacciones con los clientes y procesos internos. Buscamos la mejora continua y nos mantenemos a los más altos estándares de desempeño."
- }
- }
- }
-}
diff --git a/public/messages/fr.json b/public/messages/fr.json
deleted file mode 100644
index 559fc7368..000000000
--- a/public/messages/fr.json
+++ /dev/null
@@ -1,198 +0,0 @@
-{
- "navbar": {
- "login": "Se connecter",
- "register": "Commencer"
- },
- "navLinks": {
- "home": "Accueil",
- "pricing": "Tarification",
- "careers": "Carrières"
- },
- "login": {
- "title": "Connexion",
- "welcomeBack": "Bon retour, tu nous as manqué !",
- "continueWithGoogle": "Continuer avec Google",
- "emailPlaceholder": "Entrez l'adresse e-mail",
- "passwordPlaceholder": "Entrez le mot de passe",
- "rememberMe": "Se souvenir de moi",
- "forgotPassword": "Mot de passe oublié ?",
- "loginButton": "Connexion",
- "signInWithMagicLink": "Se connecter avec un lien magique",
- "noAccount": "Vous n'avez pas de compte ?",
- "agree": "En vous connectant, vous acceptez les",
- "and": "et",
- "signUp": "S'inscrire",
- "termsOfService": "Conditions d'utilisation",
- "privacyPolicy": "Politique de confidentialité",
- "loggingIn": "Connexion en cours..."
- },
- "register": {
- "signUp": "S'inscrire",
- "createAccountDesc": "Créez un compte pour commencer avec nous.",
- "continueWithGoogle": "Continuer avec Google",
- "firstName": "Prénom",
- "firstNamePlaceholder": "Entrez votre prénom",
- "lastName": "Nom",
- "lastNamePlaceholder": "Entrez votre nom",
- "email": "Email",
- "emailPlaceholder": "Entrez l'adresse email",
- "password": "Mot de passe",
- "passwordPlaceholder": "Entrez le mot de passe",
- "createAccount": "Créer un compte",
- "loggingIn": "Connexion en cours...",
- "emailVerification": "Vérification de l'email",
- "emailVerificationDesc": "Nous avons envoyé un code à votre email {email}",
- "checkSpam": "vérifiez votre spam si vous ne recevez pas l'email",
- "otpExpiresIn": "OTP expire dans : {timeLeft}",
- "resendCode": "Vous n'avez pas reçu le code ? renvoyez",
- "dataProcessing": "Nous traiterons vos données comme indiqué dans nos Conditions d'utilisation, Politique de confidentialité et Accord de traitement des données",
- "alreadyHaveAccount": "Vous avez déjà un compte ? Connexion"
- },
- "HomePage": {
- "title": "Bonjour le monde !"
- },
- "hero": {
- "headline": "Concentrez-vous sur l'essentiel. Nous avons la base.",
- "description": "Rationalisez vos processus avec une base de code conçue pour l'efficacité et une productivité optimale.",
- "cta": "Commencer"
- },
- "userSection": {
- "userSectionMoreThan": "Plus de 200",
- "userSectionUsers": "Utilisateurs",
- "userSectionUsage": "utilisent notre Boilerplate"
- },
- "howItWorks": {
- "howItWorksTitlePrefix": "Comment ça marche :",
- "howItWorksTitleHighlight": "Découvrez les avantages de notre produit à chaque étape.",
- "howItWorksDescription": "Nous avons conçu notre produit pour simplifier votre vie. Il offre une solution complète. Voici comment il fonctionne et comment il vous profite à chaque étape.",
- "prebuiltTitle": "Sections Pré-Construites",
- "prebuiltDescription": "Profitez des sections pré-construites comme « Fonctionnalités », « Avantages », « Tarifs » et « Témoignages » pour présenter votre produit efficacement.",
- "scalableTitle": "Fondation Évolutive",
- "scalableDescription": "Notre modèle est conçu pour évoluer avec votre produit. Ajoutez facilement de nouvelles fonctionnalités selon vos besoins.",
- "easyTitle": "Personnalisation Facile",
- "easyDescription": "Adaptez l'expérience à vos besoins et préférences spécifiques pour des résultats maximaux."
- },
- "testimonials": {
- "title": "Témoignages de Clients",
- "description": "Ne vous fiez pas seulement à notre parole : découvrez ce que les utilisateurs réels de notre produit ont à dire sur leur expérience.",
- "content": "J'utilise ce service d'hébergement web depuis plus d'un an et je suis vraiment impressionné par le temps de disponibilité et le support. Le site web n'est jamais tombé et le service client est toujours rapide pour aider avec les problèmes que j'ai. Je recommande vivement !"
- },
- "perfectFit": {
- "title": "Trouvez la Solution Parfaite",
- "description": "Choisissez le plan de modèle qui correspond le mieux aux besoins et au budget de votre projet. Tous les plans incluent l'accès à notre bibliothèque complète de sections pré-construites et à la personnalisation par glisser-déposer.",
- "cta": "Voir Notre Plan Tarifaire"
- },
- "footer": {
- "boilerplate": "Gabarit",
- "address": "Détails du logo et adresse",
- "newsletterSignUp": "Inscrivez-vous à la Newsletter",
- "subscribe": "S'abonner",
- "navigation": "Navigation",
- "support": "Support",
- "legal": "Légal",
- "followUs": "Suivez-nous",
- "privacyPolicy": "Politique de Confidentialité",
- "termsOfUse": "Conditions d'Utilisation",
- "enterYourEmail": "Entrez votre e-mail",
- "links": {
- "navigation": "Navigation",
- "home": "Accueil",
- "aboutUs": "À Propos de Nous",
- "career": "Carrière",
- "features": "Fonctionnalités",
- "blog": "Blog",
- "status": "Statut",
- "support": "Support",
- "helpCenter": "Centre d'Aide",
- "faq": "FAQ",
- "waitingList": "Liste d'Attente",
- "pricingExperience": "Expérience Tarifaire",
- "contactUs": "Contactez-nous",
- "legal": "Légal",
- "privacyPolicy": "Politique de Confidentialité",
- "termsAndConditions": "Conditions Générales"
- },
- "social": {
- "facebook": "Facebook",
- "instagram": "Instagram",
- "linkedin": "LinkedIn",
- "youtube": "YouTube"
- },
- "footerBottom": {
- "privacyPolicy": "Politique de Confidentialité",
- "termsOfUse": "Conditions d'Utilisation",
- "copyright": "2024 Tous Droits Réservés"
- }
- },
- "pricing": {
- "pricingTitle": "Plan de Tarification Simple et {{Abordable}}",
- "pricingContent": "Nos plans flexibles sont conçus pour évoluer avec votre entreprise. Nous avons un plan pour vous.",
- "monthly": "Mensuel",
- "annual": "Annuel (économisez 20%)",
- "billingPlansNotAvailable": "Plans de facturation non disponibles",
- "features": {
- "feature1": "2 Projets",
- "feature2": "Jusqu'à 100 abonnés",
- "feature3": "Analyse de base",
- "feature4": "Délai de réponse du support de 24 heures",
- "feature5": "Conseiller marketing",
- "feature6": "Intégration personnalisée",
- "continue": "Continuer"
- },
- "essentials": "Les éléments essentiels pour fournir votre meilleur travail aux clients.",
- "faqHeader": "Questions Fréquemment Posées",
- "faqSubHeader": "Nous n'avons pas pu répondre à votre question ?",
- "contactUs": "Contactez-nous",
- "continue": "Continuer"
- },
- "faq": {
- "question1": "Quel est le but de cette application ?",
- "answer1": "Cette application est conçue pour aider les utilisateurs à gérer leurs tâches efficacement en fournissant des outils pour la planification, le suivi des progrès et la définition de rappels.",
- "question2": "Comment réinitialiser mon mot de passe ?",
- "answer2": "Pour réinitialiser votre mot de passe, allez sur la page de connexion et cliquez sur le lien 'Mot de passe oublié'. Suivez les instructions pour recevoir un e-mail de réinitialisation de mot de passe et créer un nouveau mot de passe.",
- "question3": "Puis-je utiliser cette application sur plusieurs appareils ?",
- "answer3": "Oui, l'application est accessible depuis plusieurs appareils, y compris les ordinateurs de bureau, les tablettes et les smartphones. Vos données seront synchronisées sur tous les appareils, garantissant une expérience fluide."
- },
- "noJobs": {
- "noJobsTitle": "Aucun emploi disponible pour le moment",
- "noJobsContent": "Inscrivez-vous à notre newsletter pour recevoir des mises à jour sur les offres d'emploi.",
- "modalTitle": "Newsletter",
- "button": "Regístrate en el boletín",
- "placeholder": "Veuillez fournir votre adresse e-mail",
- "modalButton": "S'abonner",
- "error": "Veuillez fournir votre adresse e-mail",
- "subscribed": "Merci pour votre abonnement"
- },
- "ourServices": {
- "title": "Nos Services",
- "description": "Formés pour Vous Offrir le Meilleur",
- "details": "Depuis notre création, Hng Boilerplate est dédié à évoluer constamment pour rester en avance. Notre état d’esprit agile et notre quête incessante d'innovation garantissent que vous disposez toujours des outils et des stratégies les plus efficaces."
- },
- "mission": {
- "title": "Notre Mission & Vision",
- "subtitle": "Ouvrir la Voie, Redéfinir les Industries",
- "description": "Chez Hng Boilerplate, nous sommes dédiés à dépasser vos attentes. Nous nous efforçons de comprendre vos besoins et défis uniques, en fournissant des solutions sur mesure qui génèrent des résultats réels et favorisent votre succès."
- },
- "coreValues": {
- "title": "Nos Valeurs Fondamentales",
- "description": "Nos Valeurs forment le cœur de notre organisation et définissent le caractère de notre secteur.",
- "values": {
- "integrity": {
- "title": "Intégrité",
- "description": "Nous maintenons les plus hauts standards éthiques dans tout ce que nous faisons, favorisant la confiance et la transparence avec nos clients, partenaires et employés. Nous croyons que l'honnêteté et l'intégrité sont les fondements d'un succès durable."
- },
- "customerCentricity": {
- "title": "Centricité Client",
- "description": "Nos clients sont au cœur de notre activité. Nous nous efforçons de comprendre leurs besoins, de dépasser leurs attentes et de construire des relations durables basées sur la confiance et le respect mutuel. Nous croyons que placer nos clients en premier est la clé du succès à long terme."
- },
- "innovation": {
- "title": "Innovation",
- "description": "Nous adoptons une culture d'amélioration continue et de créativité, cherchant constamment de nouvelles façons d'évoluer et d'améliorer nos produits, services et processus. Nous encourageons l'expérimentation et la prise de risques, reconnaissant que l'innovation est essentielle pour la croissance."
- },
- "excellence": {
- "title": "Excellence",
- "description": "Nous nous engageons à offrir une qualité exceptionnelle dans tout ce que nous faisons, de nos produits et services à nos interactions avec les clients et nos processus internes. Nous visons l'amélioration continue et nous nous tenons aux plus hauts standards de performance."
- }
- }
- }
-}
diff --git a/public/next.svg b/public/next.svg
deleted file mode 100644
index 5174b28c5..000000000
--- a/public/next.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/product/product-detail-img-x1.png b/public/product/product-detail-img-x1.png
deleted file mode 100644
index 713dd3537..000000000
Binary files a/public/product/product-detail-img-x1.png and /dev/null differ
diff --git a/public/product/product-detail-img.png b/public/product/product-detail-img.png
deleted file mode 100644
index f2cfac438..000000000
Binary files a/public/product/product-detail-img.png and /dev/null differ
diff --git a/public/product/product-image.webp b/public/product/product-image.webp
deleted file mode 100644
index 75d3afca0..000000000
Binary files a/public/product/product-image.webp and /dev/null differ
diff --git a/public/product/product-img-1.png b/public/product/product-img-1.png
deleted file mode 100644
index 6df147849..000000000
Binary files a/public/product/product-img-1.png and /dev/null differ
diff --git a/public/product/product-img-2.png b/public/product/product-img-2.png
deleted file mode 100644
index c233b5873..000000000
Binary files a/public/product/product-img-2.png and /dev/null differ
diff --git a/public/product/product-img-3.jpg b/public/product/product-img-3.jpg
deleted file mode 100644
index cdf1f693a..000000000
Binary files a/public/product/product-img-3.jpg and /dev/null differ
diff --git a/public/product/product-img-4.png b/public/product/product-img-4.png
deleted file mode 100644
index 8b6813b68..000000000
Binary files a/public/product/product-img-4.png and /dev/null differ
diff --git a/public/product/product-img-5.png b/public/product/product-img-5.png
deleted file mode 100644
index 96bd2e05e..000000000
Binary files a/public/product/product-img-5.png and /dev/null differ
diff --git a/public/product/product-img-6.png b/public/product/product-img-6.png
deleted file mode 100644
index 4977cb9a7..000000000
Binary files a/public/product/product-img-6.png and /dev/null differ
diff --git a/public/product/product-img-7.png b/public/product/product-img-7.png
deleted file mode 100644
index 01bcb5960..000000000
Binary files a/public/product/product-img-7.png and /dev/null differ
diff --git a/public/product/product-img-8.png b/public/product/product-img-8.png
deleted file mode 100644
index fc9d413f8..000000000
Binary files a/public/product/product-img-8.png and /dev/null differ
diff --git a/public/product/product-img-9.png b/public/product/product-img-9.png
deleted file mode 100644
index cec4f93c3..000000000
Binary files a/public/product/product-img-9.png and /dev/null differ
diff --git a/public/signup/icons/bi_facebook.svg b/public/signup/icons/bi_facebook.svg
deleted file mode 100644
index e2c617c85..000000000
--- a/public/signup/icons/bi_facebook.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/public/signup/icons/flat-color-icons_google.svg b/public/signup/icons/flat-color-icons_google.svg
deleted file mode 100644
index c5ba07eee..000000000
--- a/public/signup/icons/flat-color-icons_google.svg
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
diff --git a/public/status.jpg b/public/status.jpg
deleted file mode 100644
index 8c9ad6700..000000000
Binary files a/public/status.jpg and /dev/null differ
diff --git a/public/user-dashboard/svg/credit-card.svg b/public/user-dashboard/svg/credit-card.svg
deleted file mode 100644
index c2d867778..000000000
--- a/public/user-dashboard/svg/credit-card.svg
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/public/user-dashboard/svg/paypal-logo.svg b/public/user-dashboard/svg/paypal-logo.svg
deleted file mode 100644
index 90822257e..000000000
--- a/public/user-dashboard/svg/paypal-logo.svg
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/public/user-dashboard/svg/stripe-logo.svg b/public/user-dashboard/svg/stripe-logo.svg
deleted file mode 100644
index fddde7b63..000000000
--- a/public/user-dashboard/svg/stripe-logo.svg
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/public/vercel.svg b/public/vercel.svg
deleted file mode 100644
index d2f842227..000000000
--- a/public/vercel.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/scripts/dev_deploy.sh b/scripts/dev_deploy.sh
deleted file mode 100755
index efd20584c..000000000
--- a/scripts/dev_deploy.sh
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/bash
-
-set -e
-
-cd "$(git rev-parse --show-toplevel)"
-git pull origin dev
-docker compose --project-name dev-nextjs -f docker/development/docker-compose.yml up -d
diff --git a/scripts/prod_deploy.sh b/scripts/prod_deploy.sh
deleted file mode 100755
index 32c161edf..000000000
--- a/scripts/prod_deploy.sh
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/bash
-
-set -e
-
-cd "$(git rev-parse --show-toplevel)"
-git pull origin main
-docker compose --project-name prod-nextjs -f docker/prod/docker-compose.yml up -d
diff --git a/scripts/staging_deploy.sh b/scripts/staging_deploy.sh
deleted file mode 100755
index d39993bbc..000000000
--- a/scripts/staging_deploy.sh
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/bash
-
-set -e
-
-cd "$(git rev-parse --show-toplevel)"
-git pull origin staging
-docker compose --project-name staging-nextjs -f docker/staging/docker-compose.yml up -d
diff --git a/scripts/team_deploy.sh b/scripts/team_deploy.sh
deleted file mode 100755
index 6fd67a091..000000000
--- a/scripts/team_deploy.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/bash
-
-set -e
-
-# Check if the team name is provided
-if [ -z "$1" ] || [ -z "$2" ]; then
- echo "Error: Port number is required."
- echo "Usage: $0 [team name] [port]"
- exit 1
-fi
-
-TEAM_NAME=$1
-export PORT=$2
-
-cd "$(git rev-parse --show-toplevel)"
-git pull origin dev
-docker compose --project-name $TEAM_NAME -f docker/team-deploy/docker-compose.yml up -d
diff --git a/src/actions/auth.ts b/src/actions/auth.ts
new file mode 100644
index 000000000..40974192e
--- /dev/null
+++ b/src/actions/auth.ts
@@ -0,0 +1,135 @@
+'use server'
+
+import axios from 'axios'
+import * as z from 'zod'
+
+import { LoginSchema, RegisterSchema } from '~/schemas'
+import { AuthResponse, ErrorResponse } from '~/types'
+import { getBaseURL } from './getenv'
+
+const credentialsAuth = async (
+ values: z.infer,
+ backend?: string
+): Promise => {
+ const baseURL = await getBaseURL(backend)
+ const validatedFields = LoginSchema.safeParse(values)
+ if (!validatedFields.success) {
+ return {
+ message: 'Something went wrong',
+ status_code: 401,
+ success: false,
+ }
+ }
+ const { email, password } = validatedFields.data
+ const payload = { email, password }
+ try {
+ const response = await axios.post(`${baseURL}/auth/login`, payload)
+
+ return {
+ data: response.data.user,
+ access_token: response.data.access_token,
+ success: true,
+ message: 'login success',
+ }
+ } catch (error) {
+ return {
+ success: false,
+ message:
+ axios.isAxiosError(error) &&
+ error.response &&
+ error.response.data.message
+ ? error.response.data.message
+ : 'Something went wrong',
+ status_code:
+ axios.isAxiosError(error) && error.response
+ ? error.response.status
+ : undefined,
+ }
+ }
+}
+
+export const registerUser = async (
+ values: z.infer,
+ backend?: string
+) => {
+ const validatedFields = RegisterSchema.safeParse(values)
+ const baseURL = await getBaseURL(backend)
+ if (!validatedFields.success) {
+ return {
+ error: 'registration Failed. Please check your inputs.',
+ }
+ }
+ try {
+ const response = await axios.post(
+ `${baseURL}/auth/register`,
+ validatedFields.data
+ )
+
+ return {
+ status: response.status,
+ data: response.data,
+ }
+ } catch (error) {
+ return axios.isAxiosError(error) && error.response
+ ? {
+ error: error.response.data.message || 'Registration failed.',
+ status: error.response.status,
+ }
+ : {
+ error: 'An unexpected error occurred.',
+ }
+ }
+}
+
+// export const verifyOtp = async (values: z.infer) => {
+// const token = values.token;
+// const email = values.email;
+
+// const payload = { token, email };
+
+// try {
+// const response = await axios.post(
+// `${apiUrl}//auth/verify-otp`,
+// payload,
+// );
+// return {
+// status: response.status,
+// message: response.data.message,
+// data: response.data,
+// };
+// } catch (error) {
+// return axios.isAxiosError(error) && error.response
+// ? {
+// error: error.response.data.message || "OTP verification failed.",
+// status: error.response.status,
+// }
+// : {
+// error: "An unexpected error occurred.",
+// };
+// }
+// };
+
+export const resendOtp = async (email: string) => {
+ const baseURL = await getBaseURL()
+ try {
+ const response = await axios.post(`${baseURL}/auth/request/token`, {
+ email,
+ })
+
+ return {
+ status: response.status,
+ message: response.data.message,
+ }
+ } catch (error) {
+ return axios.isAxiosError(error) && error.response
+ ? {
+ error: error.response.data.message || 'Resend OTP failed.',
+ status: error.response.status,
+ }
+ : {
+ error: 'An unexpected error occurred.',
+ }
+ }
+}
+
+export { credentialsAuth }
diff --git a/src/actions/axios.ts b/src/actions/axios.ts
new file mode 100644
index 000000000..71869aefa
--- /dev/null
+++ b/src/actions/axios.ts
@@ -0,0 +1,28 @@
+import axios, { AxiosInstance } from 'axios'
+
+const Calls = (baseURL?: string): AxiosInstance => {
+ return axios.create({
+ baseURL,
+ headers: {
+ 'Content-Type': 'application/json; charset=UTF-8',
+ 'Access-Control-Allow-Origin': '*',
+ credentials: 'include',
+ },
+ })
+}
+
+const CallsWithBearer = (
+ baseURL: string,
+ authorization: string
+): AxiosInstance => {
+ return axios.create({
+ baseURL,
+ headers: {
+ 'Content-Type': 'application/json; charset=UTF-8',
+ 'Access-Control-Allow-Origin': '*',
+ Authorization: `Bearer ${authorization}`,
+ },
+ })
+}
+
+export { Calls, CallsWithBearer }
diff --git a/src/actions/blog.ts b/src/actions/blog.ts
deleted file mode 100644
index 9d843d8c1..000000000
--- a/src/actions/blog.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-"use server";
-
-import axios from "axios";
-
-const apiUrl = process.env.API_URL;
-const fetchBlogById = async (id: string) => {
- try {
- const response = await axios.get(`${apiUrl}/api/v1/blogs/${id}`);
- return response.data;
- } catch (error) {
- return {
- message:
- axios.isAxiosError(error) &&
- error.response &&
- error.response.data.message
- ? error.response.data.message
- : "Something went wrong",
- status_code:
- axios.isAxiosError(error) && error.response
- ? error.response.status
- : undefined,
- };
- }
-};
-export { fetchBlogById };
diff --git a/src/actions/cloudinary.ts b/src/actions/cloudinary.ts
deleted file mode 100644
index c18fc96dd..000000000
--- a/src/actions/cloudinary.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-"use server";
-
-import { CloudinaryAsset } from "~/types";
-
-export default async function cloudinary(formData: FormData) {
- try {
- const request = await fetch(
- `https://api.cloudinary.com/v1_1/dnik53vns/image/upload`,
- {
- method: "POST",
- body: formData,
- },
- );
- const response: CloudinaryAsset = await request.json();
- return response.url;
- } catch {
- throw new Error("Error Occured uploading data");
- }
-}
diff --git a/src/actions/createOrg.ts b/src/actions/createOrg.ts
deleted file mode 100644
index ee02d67c2..000000000
--- a/src/actions/createOrg.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-"use server";
-
-import axios from "axios";
-import * as z from "zod";
-
-import { auth } from "~/lib/auth";
-import { organizationSchema } from "~/schemas";
-import { getApiUrl } from "./getApiUrl";
-
-const team = process.env.TEAM;
-
-export const createOrg = async (
- values: z.infer,
- token?: string,
-) => {
- const apiUrl = await getApiUrl();
- const session = await auth();
-
- const validatedFields = organizationSchema.safeParse(values);
- if (!validatedFields.success) {
- return {
- error: "Create Organization Failed. Please check your inputs.",
- };
- }
- try {
- const response = await axios.post(
- `${apiUrl}/api/v1/organisations`,
- validatedFields.data,
- {
- headers: {
- Authorization: `Bearer ${session?.access_token || token}`,
- },
- },
- );
- return {
- team: team,
- status: response.status,
- data: response.data,
- access_token: response.data.access_token,
- };
- } catch (error) {
- return axios.isAxiosError(error) && error.response
- ? {
- error: error.response.data.message || "Create Organization failed.",
- status: error.response.status,
- }
- : {
- error: "An unexpected error occurred.",
- };
- }
-};
diff --git a/src/actions/dashboard.ts b/src/actions/dashboard.ts
deleted file mode 100644
index 1da3e21d4..000000000
--- a/src/actions/dashboard.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-"use server";
-
-import axios from "axios";
-
-import { auth } from "~/lib/auth";
-import { getApiUrl } from "./getApiUrl";
-
-export const dashboard = async () => {
- const session = await auth();
- const apiUrl = await getApiUrl();
- try {
- const response = await axios.get(`${apiUrl}/api/v1/Dashboards`, {
- headers: {
- Authorization: `Bearer ${session?.access_token}`,
- },
- });
- return response.data;
- } catch (error) {
- return axios.isAxiosError(error) && error.response
- ? {
- error: error.response.data.message || "Product creation failed.",
- status: error.response.status,
- }
- : {
- error: "An unexpected error occurred.",
- };
- }
-};
diff --git a/src/actions/external/faq.ts b/src/actions/external/faq.ts
new file mode 100644
index 000000000..e76d7aacd
--- /dev/null
+++ b/src/actions/external/faq.ts
@@ -0,0 +1,40 @@
+'use server'
+
+import { cache } from 'react'
+import { isAxiosError } from 'axios'
+import { Calls } from '../axios'
+import { getBaseURL } from '../getenv'
+
+export const getFaqs = cache(async (backend: string = '') => {
+ const baseURL = await getBaseURL(backend)
+
+ if (!baseURL) {
+ return {
+ message: 'Unable to determine backend URL',
+ success: false,
+ }
+ }
+
+ const $http = Calls(baseURL)
+
+ try {
+ const response = await $http.get('/faqs')
+
+ return {
+ data: response.data.data,
+ success: true,
+ }
+ } catch (error) {
+ return {
+ success: false,
+ message:
+ isAxiosError(error) && error.response && error.response.data.message
+ ? error.response.data.message
+ : 'Something went wrong',
+ status_code:
+ isAxiosError(error) && error.response
+ ? error.response.status
+ : undefined,
+ }
+ }
+})
diff --git a/src/actions/externalPages.ts b/src/actions/externalPages.ts
deleted file mode 100644
index 4f670f64c..000000000
--- a/src/actions/externalPages.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-"use server";
-
-import axios from "axios";
-
-const apiUrl = process.env.API_URL;
-
-export const getFaqs = async () => {
- try {
- const response = await axios.get(`${apiUrl}/api/v1/faqs`);
-
- return {
- data: response.data,
- status: response.status,
- };
- } catch (error) {
- return axios.isAxiosError(error) && error.response
- ? {
- error: error.response.data.message || "Unable to Fetch FAQS",
- status: error.response.status,
- }
- : {
- error: "An unexpected error occurred.",
- };
- }
-};
diff --git a/src/actions/faq.ts b/src/actions/faq.ts
deleted file mode 100644
index 09d5bb3ab..000000000
--- a/src/actions/faq.ts
+++ /dev/null
@@ -1,100 +0,0 @@
-"use server";
-
-import axios from "axios";
-
-import { auth } from "~/lib/auth";
-
-const apiUrl = process.env.API_URL;
-
-interface Properties {
- question: string;
- answer: string;
- category: string;
-}
-
-interface UpdateProperties {
- question: string;
- answer: string;
- category: string;
-}
-
-export const CreateFaqs = async (payload: Properties) => {
- //
- try {
- const session = await auth();
-
- const response = await axios.post(`${apiUrl}/api/v1/faqs`, payload, {
- headers: {
- Authorization: `Bearer ${session?.access_token}`,
- },
- });
-
- return {
- data: response.data,
- status: response.status,
- };
- } catch (error) {
- return axios.isAxiosError(error) && error.response
- ? {
- error: error.response.data.message || "Unable to Create FAQS",
- status: error.response.status,
- }
- : {
- error: "An unexpected error occurred.",
- };
- }
-};
-
-export const UpdateFaqs = async (payload: UpdateProperties, id: string) => {
- //
- try {
- const session = await auth();
-
- const response = await axios.put(`${apiUrl}/api/v1/faqs/${id}`, payload, {
- headers: {
- Authorization: `Bearer ${session?.access_token}`,
- },
- });
-
- return {
- data: response.data,
- status: response.status,
- };
- } catch (error) {
- return axios.isAxiosError(error) && error.response
- ? {
- error: error.response.data.message || "Unable to Create FAQS",
- status: error.response.status,
- }
- : {
- error: "An unexpected error occurred.",
- };
- }
-};
-
-export const DeleteFaqs = async (id: string) => {
- //
- try {
- const session = await auth();
-
- const response = await axios.delete(`${apiUrl}/api/v1/faqs/${id}`, {
- headers: {
- Authorization: `Bearer ${session?.access_token}`,
- },
- });
-
- return {
- message: response.data.message,
- status: response.status,
- };
- } catch (error) {
- return axios.isAxiosError(error) && error.response
- ? {
- error: error.response.data.message || "Unable to Create FAQS",
- status: error.response.status,
- }
- : {
- error: "An unexpected error occurred.",
- };
- }
-};
diff --git a/src/actions/fetchutil.ts b/src/actions/fetchutil.ts
new file mode 100644
index 000000000..59428b9dd
--- /dev/null
+++ b/src/actions/fetchutil.ts
@@ -0,0 +1,99 @@
+/* eslint-disable @typescript-eslint/no-explicit-any */
+type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH'
+
+interface FetchOptions
+ extends Omit {
+ method?: HttpMethod
+ headers?: Record
+ body?: TRequestBody
+ params?: Record
+}
+
+interface FetchConfig {
+ baseUrl: string
+ defaultHeaders?: Record
+}
+
+export class HttpError extends Error {
+ public statusCode: number
+ public responseBody: any
+ public statusText: string
+
+ constructor(
+ public response: Response,
+ responseBody: any,
+ statusText: string
+ ) {
+ super(`HTTP error! status: ${response.status}`)
+ this.name = 'HttpError'
+ this.statusCode = response.status
+ this.responseBody = responseBody
+ this.statusText = statusText
+ }
+}
+
+export const createFetchUtil = (config: FetchConfig) => {
+ const { baseUrl, defaultHeaders = {} } = config
+
+ return async function fetchUtil(
+ endpoint: string,
+ options: FetchOptions = {}
+ ): Promise {
+ const {
+ method = 'GET',
+ headers = {},
+ body,
+ params,
+ ...restOptions
+ } = options
+
+ const normalizedBaseUrl = baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`
+ const normalizedEndpoint = endpoint.startsWith('/')
+ ? endpoint.slice(1)
+ : endpoint
+
+ const url = new URL(normalizedEndpoint, normalizedBaseUrl)
+
+ if (params) {
+ Object.entries(params).forEach(([key, value]) => {
+ url.searchParams.append(key, value)
+ })
+ }
+
+ const mergedHeaders = {
+ 'Content-Type': 'application/json',
+ ...defaultHeaders,
+ ...headers,
+ }
+
+ const fetchOptions: RequestInit = {
+ method,
+ headers: mergedHeaders,
+ ...restOptions,
+ }
+
+ if (body) {
+ fetchOptions.body = JSON.stringify(body)
+ }
+
+ const response = await fetch(url.toString(), fetchOptions)
+
+ let responseBody
+ const contentType = response.headers.get('content-type')
+ if (contentType && contentType.includes('application/json')) {
+ responseBody = await response.json()
+ } else {
+ responseBody = await response.text()
+ }
+
+ if (!response.ok) {
+ throw new HttpError(response, responseBody, response.statusText)
+ }
+
+ return responseBody as TResponse
+ }
+}
+
+export const withAuth = (token: string): Record => ({
+ Authorization: `Bearer ${token}`,
+})
diff --git a/src/actions/getApiUrl.ts b/src/actions/getApiUrl.ts
deleted file mode 100644
index 2579b1996..000000000
--- a/src/actions/getApiUrl.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-"use server";
-
-export const getApiUrl = async (): Promise => {
- const apiUrl = process.env.API_URL;
-
- if (!apiUrl) {
- throw new Error("API_URL environment variable is not defined");
- }
-
- return apiUrl;
-};
diff --git a/src/actions/getBackendSer.ts b/src/actions/getBackendSer.ts
new file mode 100644
index 000000000..70db80c34
--- /dev/null
+++ b/src/actions/getBackendSer.ts
@@ -0,0 +1,9 @@
+'use client'
+
+import useEnvironmentStore from '~/hooks/global/use-enviroment'
+
+export const SendBackend = () => {
+ const { backend } = useEnvironmentStore()
+
+ return backend
+}
diff --git a/src/actions/getenv.ts b/src/actions/getenv.ts
new file mode 100644
index 000000000..4f0e89480
--- /dev/null
+++ b/src/actions/getenv.ts
@@ -0,0 +1,71 @@
+'use server'
+
+export const getEnvVariables = async (
+ ...envNames: string[]
+): Promise<{ [key: string]: string }> => {
+ const envVariables: { [key: string]: string } = {}
+
+ envNames.forEach((envName) => {
+ const value = process.env[envName]
+
+ if (!value) {
+ throw new Error(`${envName} environment variable is not defined`)
+ }
+
+ envVariables[envName] = value
+ })
+
+ return envVariables
+}
+
+export const getBaseURL = async (backend?: string) => {
+ try {
+ let baseURL: string | undefined
+
+ switch (backend) {
+ case 'python':
+ baseURL = process.env.PYTHON_BASEURL
+ if (!baseURL) {
+ throw new Error('PYTHON_BASEURL environment variable is not defined')
+ }
+ return baseURL
+
+ case 'php':
+ baseURL = process.env.PHP_BASEURL
+ if (!baseURL) {
+ throw new Error('PHP_BASEURL environment variable is not defined')
+ }
+ return baseURL
+
+ default:
+ baseURL = process.env.BASE_URL
+ if (!baseURL) {
+ throw new Error('BASE_URL environment variable is not defined')
+ }
+ return baseURL
+ }
+ } catch (error) {
+ console.log(error)
+ if (
+ backend === 'python' &&
+ error instanceof Error &&
+ error.message.includes('PYTHON_BASEURL')
+ ) {
+ throw error
+ } else if (
+ backend === 'php' &&
+ error instanceof Error &&
+ error.message.includes('PHP_BASEURL')
+ ) {
+ throw error
+ } else if (
+ !backend &&
+ error instanceof Error &&
+ error.message.includes('BASE_URL')
+ ) {
+ throw error
+ }
+
+ return undefined
+ }
+}
diff --git a/src/actions/inviteMembers.ts b/src/actions/inviteMembers.ts
deleted file mode 100644
index 44f929feb..000000000
--- a/src/actions/inviteMembers.ts
+++ /dev/null
@@ -1,160 +0,0 @@
-"use server";
-
-import axios from "axios";
-import * as z from "zod";
-
-import { auth } from "~/lib/auth";
-import { getApiUrl } from "./getApiUrl";
-
-// Schema for validating email input
-const inviteSchema = z.object({
- emails: z.string().nonempty("Emails are required"),
- org_id: z.string().optional(),
-});
-
-export const inviteMembers = async (emails: string, org_id?: string) => {
- const apiUrl = await getApiUrl();
- const session = await auth();
-
- const validatedFields = inviteSchema.safeParse({ emails, org_id });
- if (!validatedFields.success) {
- return {
- error: "Invite Failed. Please check your inputs.",
- };
- }
-
- try {
- const response = await axios.post(
- `${apiUrl}/api/v1/organisations/invites/send`,
- {
- emails: emails.split(",").map((email) => email.trim()), // Convert emails string to an array
- org_id, // Use organization id if provided
- },
- {
- headers: {
- Authorization: `Bearer ${session?.access_token}`,
- },
- },
- );
-
- return {
- data: response.data.data,
- status: response.status,
- };
- } catch (error) {
- return axios.isAxiosError(error) && error.response
- ? {
- error: error.response.data.message || "Failed to send invites.",
- status: error.response.status,
- }
- : {
- error: "An unexpected error occurred.",
- };
- }
-};
-
-export const fetchOrganizations = async () => {
- const apiUrl = await getApiUrl();
- const session = await auth();
-
- try {
- const response = await axios.get(`${apiUrl}/api/v1/organisations`, {
- headers: {
- Authorization: `Bearer ${session?.access_token}`,
- },
- });
-
- // Extracting the relevant data
- const organizations = response.data.data.map(
- (org: { id: string; name: string }) => ({
- id: org.id,
- name: org.name,
- }),
- );
-
- return {
- data: organizations,
- status: response.status,
- };
- } catch (error) {
- return axios.isAxiosError(error) && error.response
- ? {
- error:
- error.response.data.message || "Failed to fetch organizations.",
- status: error.response.status,
- }
- : {
- error: "An unexpected error occurred.",
- };
- }
-};
-
-export const generateInviteLink = async (org_id: string) => {
- const apiUrl = await getApiUrl();
- const session = await auth();
-
- try {
- const response = await axios.get(
- `${apiUrl}/api/v1/organisations/${org_id}/invites`,
- {
- headers: {
- Authorization: `Bearer ${session?.access_token}`,
- },
- },
- );
-
- // Extract the invite link from the nested data object
- let inviteLink = response.data.data.invite_link;
-
- // Ensure the link has a slash between the domain and the path
- if (!inviteLink.includes("/invite")) {
- inviteLink = inviteLink.replace("techinvite", "tech/invite");
- }
-
- return {
- data: inviteLink,
- status: response.status,
- };
- } catch (error) {
- return axios.isAxiosError(error) && error.response
- ? {
- error:
- error.response.data.message || "Failed to generate invite link.",
- status: error.response.status,
- }
- : {
- error: "An unexpected error occurred.",
- };
- }
-};
-
-export const acceptInviteRequest = async (token: string) => {
- const apiUrl = await getApiUrl();
- const session = await auth();
-
- try {
- const response = await axios.post(
- `${apiUrl}/api/v1/organisations/invites/accept`,
- { invite_token_guid: token },
- {
- headers: {
- Authorization: `Bearer ${session?.access_token}`,
- },
- },
- );
-
- return {
- data: response.data,
- status: response.status,
- };
- } catch (error) {
- return axios.isAxiosError(error) && error.response
- ? {
- error: error.response.data.message || "Failed to accept invite.",
- status: error.response.status,
- }
- : {
- error: "An unexpected error occurred.",
- };
- }
-};
diff --git a/src/actions/nextauth.ts b/src/actions/nextauth.ts
new file mode 100644
index 000000000..4d7654ac8
--- /dev/null
+++ b/src/actions/nextauth.ts
@@ -0,0 +1,109 @@
+'use server'
+
+import * as z from 'zod'
+import { LoginSchema } from '~/schemas'
+import { getBaseURL } from './getenv'
+import { createFetchUtil, HttpError } from './fetchutil'
+import { User } from '~/types'
+import { cookies } from 'next/headers'
+
+interface LoginResponse {
+ user: User
+ access_token: string
+}
+
+export const nextLogin = async (values: z.infer) => {
+ const cookieStore = await cookies()
+ const backend = cookieStore.get('backend')?.value
+ const baseURL = await getBaseURL(backend)
+
+ if (!baseURL) {
+ return {
+ status: 500,
+ message: 'Base URL not defined',
+ success: true,
+ }
+ }
+ const api = createFetchUtil({ baseUrl: baseURL })
+
+ const response = await api<{ data: LoginResponse; access_token: string }>(
+ '/auth/login',
+ {
+ method: 'POST',
+ body: values,
+ }
+ )
+
+ return {
+ data: response.data.user,
+ access_token: response.access_token,
+ success: true,
+ }
+}
+
+export const googleAuth = async (idToken: string) => {
+ const cookieStore = await cookies()
+ const backend = cookieStore.get('backend')?.value
+
+ console.log(backend)
+ const baseURL = await getBaseURL(backend)
+ if (!baseURL) {
+ return {
+ status: 500,
+ message: 'Base URL not defined',
+ success: true,
+ }
+ }
+ const api = createFetchUtil({ baseUrl: baseURL })
+
+ try {
+ const res = await api<{ data: LoginResponse; access_token: string }>(
+ '/auth/google',
+ {
+ method: 'POST',
+ body: { id_token: idToken },
+ }
+ )
+
+ return {
+ data: res.data.user,
+ access_token: res.access_token,
+ success: true,
+ }
+ } catch (error) {
+ if (error instanceof z.ZodError) {
+ return {
+ success: false,
+ message: 'Invalid form data',
+ errors: error.errors,
+ }
+ } else if (error instanceof HttpError) {
+ console.error(
+ 'HTTP Error:',
+ error.message,
+ 'Status:',
+ error.response.status
+ )
+ return {
+ success: false,
+ message:
+ error.responseBody?.message || `Server error: ${error.message}`,
+ statusCode: error.statusCode,
+ responseBody: error.responseBody,
+ }
+ } else {
+ return { success: false, message: 'An unexpected error occurred' }
+ }
+ }
+}
+
+export const setBackend = async (backend?: string) => {
+ const cookieStore = await cookies()
+ if (backend) {
+ cookieStore.set('backend', backend)
+ }
+
+ return {
+ sucess: true,
+ }
+}
diff --git a/src/actions/notifications/deleteAllNotifications.ts b/src/actions/notifications/deleteAllNotifications.ts
deleted file mode 100644
index e9726d7e6..000000000
--- a/src/actions/notifications/deleteAllNotifications.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-import axios from "axios";
-
-import { getApiUrl } from "../getApiUrl";
-
-export const deleteAllNotifications = async (token: string) => {
- const apiUrl = await getApiUrl();
-
- try {
- const response = await axios.delete(
- `${apiUrl}/api/v1/notifications/clear-all`,
- {
- headers: {
- Authorization: `Bearer ${token}`,
- },
- },
- );
-
- return {
- data: response.data,
- };
- } catch (error) {
- return axios.isAxiosError(error) && error.response
- ? {
- error:
- error.response.data.message || "Failed to delete notifications.",
- status: error.response.status,
- }
- : {
- error: "An unexpected error occurred.",
- };
- }
-};
diff --git a/src/actions/notifications/deleteNotifications.ts b/src/actions/notifications/deleteNotifications.ts
deleted file mode 100644
index 042994965..000000000
--- a/src/actions/notifications/deleteNotifications.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-import axios from "axios";
-
-import { getApiUrl } from "../getApiUrl";
-
-interface DeleteNotificationProperties {
- notificationId: string;
- token?: string;
-}
-
-export const deleteNotifications = async ({
- notificationId,
- token,
-}: DeleteNotificationProperties) => {
- const apiUrl = await getApiUrl();
-
- try {
- const response = await axios.delete(
- `${apiUrl}/api/v1/notifications/${notificationId}`,
- {
- headers: {
- Authorization: `Bearer ${token}`,
- },
- },
- );
-
- return {
- data: response.data,
- };
- } catch (error) {
- return axios.isAxiosError(error) && error.response
- ? {
- error:
- error.response.data.message || "Failed to delete notifications.",
- status: error.response.status,
- }
- : {
- error: "An unexpected error occurred.",
- };
- }
-};
diff --git a/src/actions/notifications/getAllNotifications.ts b/src/actions/notifications/getAllNotifications.ts
deleted file mode 100644
index 456b27580..000000000
--- a/src/actions/notifications/getAllNotifications.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-"use server";
-
-import axios from "axios";
-
-import { auth } from "~/lib/auth";
-
-const apiUrl = process.env.API_URL;
-
-export const getAllNotifications = async () => {
- const session = await auth();
- try {
- const response = await axios.get(`${apiUrl}/api/v1/notifications`, {
- headers: {
- Authorization: `Bearer ${session?.access_token}`,
- },
- });
-
- return {
- status: response.status,
- data: response.data,
- };
- } catch (error) {
- return axios.isAxiosError(error) && error.response
- ? {
- error:
- error.response.data.message || "Failed to fetch notifications.",
- status: error.response.status,
- }
- : {
- error: "An unexpected error occurred.",
- };
- }
-};
diff --git a/src/actions/notifications/markAllAsRead.ts b/src/actions/notifications/markAllAsRead.ts
deleted file mode 100644
index 969518f5a..000000000
--- a/src/actions/notifications/markAllAsRead.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-import axios from "axios";
-
-import { getApiUrl } from "../getApiUrl";
-
-export const markAllAsRead = async (token: string) => {
- const apiUrl = await getApiUrl();
-
- try {
- const response = await axios.patch(
- `${apiUrl}/api/v1/notifications`,
- { is_read: true },
- {
- headers: {
- Authorization: `Bearer ${token}`,
- },
- },
- );
-
- return {
- data: response.data,
- };
- } catch (error) {
- return axios.isAxiosError(error) && error.response
- ? {
- error:
- error.response.data.message ||
- "Failed to mark notifications as read.",
- status: error.response.status,
- }
- : {
- error: "An unexpected error occurred.",
- };
- }
-};
diff --git a/src/actions/notifications/markOneAsRead.ts b/src/actions/notifications/markOneAsRead.ts
deleted file mode 100644
index 6a425e17b..000000000
--- a/src/actions/notifications/markOneAsRead.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-import axios from "axios";
-
-import { getApiUrl } from "../getApiUrl";
-
-interface ReadProperties {
- notificationId: string;
- token?: string;
-}
-
-export const markOneAsRead = async ({
- notificationId,
- token,
-}: ReadProperties) => {
- const apiUrl = await getApiUrl();
-
- try {
- const response = await axios.patch(
- `${apiUrl}/api/v1/notifications/${notificationId}`,
- { is_read: true },
- {
- headers: {
- Authorization: `Bearer ${token}`,
- },
- },
- );
-
- return {
- data: response.data,
- };
- } catch (error) {
- return axios.isAxiosError(error) && error.response
- ? {
- error:
- error.response.data.message ||
- "Failed to mark notifications as read.",
- status: error.response.status,
- }
- : {
- error: "An unexpected error occurred.",
- };
- }
-};
diff --git a/src/actions/organisation.ts b/src/actions/organisation.ts
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/actions/organization.ts b/src/actions/organization.ts
deleted file mode 100644
index ac83db272..000000000
--- a/src/actions/organization.ts
+++ /dev/null
@@ -1,123 +0,0 @@
-"use server";
-
-import axios from "axios";
-import { z } from "zod";
-
-import { auth } from "~/lib/auth";
-import { organizationSchema } from "~/schemas";
-
-const apiUrl = process.env.API_URL;
-
-export const getStatistics = async () => {
- const session = await auth();
-
- try {
- const response = await axios.get(`${apiUrl}/api/v1/statistics`, {
- headers: {
- Authorization: `Bearer ${session?.access_token}`,
- },
- });
-
- return {
- data: response.data.data,
- };
- } catch (error) {
- return axios.isAxiosError(error) && error.response
- ? {
- error: error.response.data.message || "Registration failed.",
- status: error.response.status,
- }
- : {
- error: "An unexpected error occurred.",
- };
- }
-};
-
-export const getAllOrg = async () => {
- const session = await auth();
-
- try {
- const response = await axios.get(`${apiUrl}/api/v1/organisations`, {
- headers: {
- Authorization: `Bearer ${session?.access_token}`,
- },
- });
-
- return {
- organization: response.data.data,
- };
- } catch (error) {
- return axios.isAxiosError(error) && error.response
- ? {
- error: error.response.data.message || "Registration failed.",
- status: error.response.status,
- }
- : {
- error: "An unexpected error occurred.",
- };
- }
-};
-
-export const createOrg = async (values: z.infer) => {
- const session = await auth();
-
- const validatedFields = organizationSchema.safeParse(values);
- if (!validatedFields.success) {
- return {
- error: "Create Organization Failed. Please check your inputs.",
- };
- }
- try {
- const response = await axios.post(
- `${apiUrl}/api/v1/organisations`,
- validatedFields.data,
- {
- headers: {
- Authorization: `Bearer ${session?.access_token}`,
- },
- },
- );
- return {
- status: response.status,
- };
- } catch (error) {
- return axios.isAxiosError(error) && error.response
- ? {
- error: error.response.data.message || "Create Organization failed.",
- status: error.response.status,
- }
- : {
- error: "An unexpected error occurred.",
- };
- }
-};
-
-export const getAnalytics = async () => {
- const session = await auth();
-
- try {
- const response = await axios.get(`${apiUrl}/api/v1/analytics`, {
- headers: {
- Authorization: `Bearer ${session?.access_token}`,
- },
- });
-
- const formattedData = Object.keys(response.data.data).map((key) => ({
- month: key,
- revenue: response.data.data[key],
- }));
-
- return {
- data: formattedData,
- };
- } catch (error) {
- return axios.isAxiosError(error) && error.response
- ? {
- error: error.response.data.message || "Registration failed.",
- status: error.response.status,
- }
- : {
- error: "An unexpected error occurred.",
- };
- }
-};
diff --git a/src/actions/product.ts b/src/actions/product.ts
deleted file mode 100644
index e9fe607f6..000000000
--- a/src/actions/product.ts
+++ /dev/null
@@ -1,140 +0,0 @@
-"use server";
-
-import axios from "axios";
-import { z } from "zod";
-
-import { auth } from "~/lib/auth";
-import { productSchema } from "~/schemas";
-
-const apiUrl = process.env.API_URL;
-
-export const createProduct = async (
- values: z.infer,
- org_id: string,
-) => {
- const validatedFields = productSchema.safeParse(values);
- if (!validatedFields.success) {
- return {
- error: "Create Product Failed. Please check your inputs.",
- };
- }
-
- const session = await auth();
- const { price, quantity, ...rest } = validatedFields.data;
-
- const newPrice = Number.parseInt(price);
- const newQuantity = Number.parseInt(quantity);
-
- const acceptdata = { ...rest, price: newPrice, quantity: newQuantity };
- try {
- const response = await axios.post(
- `${apiUrl}/api/v1/organisations/${org_id}/products`,
- acceptdata,
- {
- headers: {
- Authorization: `Bearer ${session?.access_token}`,
- },
- },
- );
- return {
- status: response.status,
- };
- } catch (error) {
- return axios.isAxiosError(error) && error.response
- ? {
- error: error.response.data.message || "Product creation failed.",
- status: error.response.status,
- }
- : {
- error: "An unexpected error occurred.",
- };
- }
-};
-export const getAllProduct = async (org_id: string) => {
- if (!org_id) {
- return {
- error: "invalid organisation",
- };
- }
- try {
- const session = await auth();
-
- const response = await axios.get(
- `${apiUrl}/api/v1/${org_id}/products`,
-
- {
- headers: {
- Authorization: `Bearer ${session?.access_token}`,
- },
- },
- );
- return {
- products: response.data.data,
- };
- } catch (error) {
- return axios.isAxiosError(error) && error.response
- ? {
- error: error.response.data.message || "Error Occured.",
- status: error.response.status,
- }
- : {
- error: "An unexpected error occurred.",
- };
- }
-};
-
-export const deleteProduct = async (org_id: string, product_id: string) => {
- const session = await auth();
- try {
- const response = await axios.delete(
- `${apiUrl}/api/v1/organisations/${org_id}/products/${product_id}`,
- {
- headers: {
- Authorization: `Bearer ${session?.access_token}`,
- },
- },
- );
- return {
- status: response.status,
- message: "Product deleted successfully.",
- };
- } catch (error) {
- return axios.isAxiosError(error) && error.response
- ? {
- error: error.response.data.message || "Error Occurred.",
- status: error.response.status,
- }
- : {
- error: "An unexpected error occurred.",
- };
- }
-};
-
-export const getProductDetails = async (product_id: string) => {
- try {
- const session = await auth();
- const response = await axios.delete(
- `${apiUrl}/api/v1/products/${product_id}`,
-
- {
- headers: {
- Authorization: `Bearer ${session?.access_token}`,
- },
- },
- );
- return {
- status: response.status,
- message: "Product deleted successfully.",
- products: response.data.data,
- };
- } catch (error) {
- return axios.isAxiosError(error) && error.response
- ? {
- error: error.response.data.message || "Error Occurred.",
- status: error.response.status,
- }
- : {
- error: "An unexpected error occurred.",
- };
- }
-};
diff --git a/src/actions/profile.ts b/src/actions/profile.ts
deleted file mode 100644
index 92fc9912b..000000000
--- a/src/actions/profile.ts
+++ /dev/null
@@ -1,39 +0,0 @@
-"use server";
-
-import axios from "axios";
-
-import { auth } from "~/lib/auth";
-import { UpdateProfileType } from "~/types";
-
-const apiUrl = process.env.API_URL;
-
-export default async function updateProfile({
- payload,
-}: {
- payload: UpdateProfileType;
-}) {
- try {
- const session = await auth();
- const userId = session?.user.id;
- if (!userId) {
- return { message: "User Id is not set", data: {}, status_code: 400 };
- }
- const request = await axios.patch(
- `${apiUrl}/api/v1/profile/${userId}`,
- payload,
- {
- headers: {
- Authorization: `Bearer ${session?.access_token}`,
- },
- },
- );
- const response = request.data;
- return response;
- } catch {
- return {
- message: "Error Occured creating user",
- data: {},
- status_code: 500,
- };
- }
-}
diff --git a/src/actions/register.ts b/src/actions/register.ts
deleted file mode 100644
index 87eec6ebe..000000000
--- a/src/actions/register.ts
+++ /dev/null
@@ -1,87 +0,0 @@
-"use server";
-
-import axios from "axios";
-import * as z from "zod";
-
-import { OtpSchema, RegisterSchema } from "~/schemas";
-
-const apiUrl = process.env.API_URL;
-
-export const registerUser = async (values: z.infer) => {
- const validatedFields = RegisterSchema.safeParse(values);
- if (!validatedFields.success) {
- return {
- error: "registration Failed. Please check your inputs.",
- };
- }
- try {
- const response = await axios.post(
- `${apiUrl}/api/v1/auth/register`,
- validatedFields.data,
- );
-
- return {
- status: response.status,
- data: response.data,
- };
- } catch (error) {
- return axios.isAxiosError(error) && error.response
- ? {
- error: error.response.data.message || "Registration failed.",
- status: error.response.status,
- }
- : {
- error: "An unexpected error occurred.",
- };
- }
-};
-
-export const verifyOtp = async (values: z.infer) => {
- const token = values.token;
- const email = values.email;
-
- const payload = { token, email };
-
- try {
- const response = await axios.post(
- `${apiUrl}/api/v1/auth/verify-otp`,
- payload,
- );
- return {
- status: response.status,
- message: response.data.message,
- data: response.data,
- };
- } catch (error) {
- return axios.isAxiosError(error) && error.response
- ? {
- error: error.response.data.message || "OTP verification failed.",
- status: error.response.status,
- }
- : {
- error: "An unexpected error occurred.",
- };
- }
-};
-
-export const resendOtp = async (email: string) => {
- try {
- const response = await axios.post(`${apiUrl}/api/v1/auth/request/token`, {
- email,
- });
-
- return {
- status: response.status,
- message: response.data.message,
- };
- } catch (error) {
- return axios.isAxiosError(error) && error.response
- ? {
- error: error.response.data.message || "Resend OTP failed.",
- status: error.response.status,
- }
- : {
- error: "An unexpected error occurred.",
- };
- }
-};
diff --git a/src/actions/roles-and-permissions.ts b/src/actions/roles-and-permissions.ts
deleted file mode 100644
index d326e26bf..000000000
--- a/src/actions/roles-and-permissions.ts
+++ /dev/null
@@ -1,178 +0,0 @@
-"use server";
-
-import axios from "axios";
-import { z } from "zod";
-
-import { auth } from "~/lib/auth";
-import { roleSchema } from "~/schemas";
-
-const apiUrl = process.env.API_URL;
-
-export const getRoles = async (org_id: string) => {
- const session = await auth();
-
- try {
- const response = await axios.get(
- `${apiUrl}/api/v1/organisations/${org_id}/roles`,
- {
- headers: {
- Authorization: `Bearer ${session?.access_token}`,
- },
- },
- );
-
- return {
- data: response.data,
- };
- } catch (error) {
- return axios.isAxiosError(error) && error.response
- ? {
- error: error.response.data.message || "Failed.",
- status: error.response.status,
- }
- : {
- error: "An unexpected error occurred.",
- };
- }
-};
-export const getPermissions = async () => {
- const session = await auth();
-
- try {
- const response = await axios.get(
- `${apiUrl}/api/v1/organisations/permissions`,
- {
- headers: {
- Authorization: `Bearer ${session?.access_token}`,
- },
- },
- );
-
- return {
- data: response.data.data,
- };
- } catch (error) {
- return axios.isAxiosError(error) && error.response
- ? {
- error: error.response.data.message || "Failed.",
- status: error.response.status,
- }
- : {
- error: "An unexpected error occurred.",
- };
- }
-};
-
-export const getRolePermissions = async (
- currentOrgId: string,
- roleId: string,
-) => {
- const session = await auth();
-
- try {
- const response = await axios.get(
- `${apiUrl}/api/v1/organisations/${currentOrgId}/roles/${roleId}`,
- {
- headers: {
- Authorization: `Bearer ${session?.access_token}`,
- },
- },
- );
-
- return {
- data: response.data.data,
- };
- } catch (error) {
- return axios.isAxiosError(error) && error.response
- ? {
- error: error.response.data.message || "Failed.",
- status: error.response.status,
- }
- : {
- error: "An unexpected error occurred.",
- };
- }
-};
-
-export const createRole = async (
- values: z.infer,
- org_id: string,
-) => {
- const validatedFields = roleSchema.safeParse(values);
- if (!validatedFields.success) {
- return {
- error: "Create Role Failed. Please check your inputs.",
- };
- }
-
- const session = await auth();
- const payload = validatedFields.data;
-
- try {
- const response = await axios.post(
- `${apiUrl}/api/v1/organisations/${org_id}/roles`,
- payload,
- {
- headers: {
- Authorization: `Bearer ${session?.access_token}`,
- },
- },
- );
-
- return {
- data: response.data,
- };
- } catch (error) {
- return axios.isAxiosError(error) && error.response
- ? {
- error: error.response.data.message || "Role creation failed.",
- status: error.response.status,
- }
- : {
- error: "An unexpected error occurred.",
- };
- }
-};
-const roleSchemaWithId = roleSchema.extend({
- id: z.string().uuid(),
- permissions: z.array(z.string().uuid()),
-});
-export const updateRole = async (
- values: z.infer,
- currentOrgId: string,
- roleId: string,
-) => {
- const validatedFields = roleSchemaWithId.safeParse(values);
- if (!validatedFields.success) {
- return {
- error: "Create Role Failed. Please check your inputs.",
- };
- }
-
- const session = await auth();
- const payload = validatedFields.data;
-
- try {
- const response = await axios.put(
- `${apiUrl}/api/v1/organisations/${currentOrgId}/roles/${roleId}`,
- payload,
- {
- headers: {
- Authorization: `Bearer ${session?.access_token}`,
- },
- },
- );
- return {
- data: response.data,
- };
- } catch (error) {
- return axios.isAxiosError(error) && error.response
- ? {
- error: error.response.data.message || "Role creation failed.",
- status: error.response.status,
- }
- : {
- error: "An unexpected error occurred.",
- };
- }
-};
diff --git a/src/actions/subscription.ts b/src/actions/subscription.ts
new file mode 100644
index 000000000..4cc4d3fd2
--- /dev/null
+++ b/src/actions/subscription.ts
@@ -0,0 +1,44 @@
+'use server'
+
+import { Calls } from './axios'
+import { getBaseURL } from './getenv'
+
+export const makeSubscription = async (email: string, backend: string = '') => {
+ const baseURL = await getBaseURL(backend)
+
+ if (!baseURL) {
+ return {
+ message: 'Unable to determine backend URL',
+ success: false,
+ }
+ }
+
+ const $http = Calls(baseURL)
+
+ if (!email) {
+ return {
+ message: 'Please provide your email',
+ success: false,
+ }
+ }
+
+ const payload = { email }
+
+ try {
+ const response = await $http.post('/newsletter-subscription', payload)
+
+ return {
+ data: response.data,
+ success: true,
+ message: 'Subscribed',
+ }
+ } catch (error) {
+ return {
+ message:
+ error instanceof Error
+ ? error.message
+ : 'An error occurred during subscription',
+ success: false,
+ }
+ }
+}
diff --git a/src/actions/switchOrganization.ts b/src/actions/switchOrganization.ts
deleted file mode 100644
index fc98b846d..000000000
--- a/src/actions/switchOrganization.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-"use server";
-
-import axios from "axios";
-
-import { auth } from "~/lib/auth";
-import { getApiUrl } from "./getApiUrl";
-
-export const getCurrentOrgApi = async ({ orgId }: { orgId: string }) => {
- const payload = { isActive: true };
- const apiUrl = await getApiUrl();
- const session = await auth();
- const response = await axios.put(
- `${apiUrl}/api/v1/users/organisations/${orgId}`,
- payload,
- {
- headers: {
- Authorization: `Bearer ${session?.access_token}`,
- },
- },
- );
- return response.data;
-};
-// `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9zaWQiOiIwZjc4ZGExMy0xYTc2LTQyYWItOTg0My1hNTBmNDY2ODBiNjUiLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9lbWFpbGFkZHJlc3MiOiJkZWppd2lsbGlhbXM5QGdtYWlsLmNvbSIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL25hbWUiOiJEZWppIiwiZXhwIjoxNzIzNzA4ODUzfQ.qm8sOMQ-EMkyE8no_Dz22UD5N0qqn3nImjvkVWG1UK4`
diff --git a/src/actions/useVersionSync.ts b/src/actions/useVersionSync.ts
index f6ae4983a..7a36ece6d 100644
--- a/src/actions/useVersionSync.ts
+++ b/src/actions/useVersionSync.ts
@@ -1,13 +1,13 @@
-import { useEffect } from "react";
+import { useEffect } from 'react'
const useVersionSync = (version: string) => {
useEffect(() => {
- const currentVersion = localStorage.getItem("version");
+ const currentVersion = localStorage.getItem('version')
if (currentVersion === null || currentVersion !== version) {
- localStorage.clear();
- localStorage.setItem("version", version);
+ localStorage.clear()
+ localStorage.setItem('version', version)
}
- }, [version]);
-};
+ }, [version])
+}
-export default useVersionSync;
+export default useVersionSync
diff --git a/src/actions/user.ts b/src/actions/user.ts
deleted file mode 100644
index d9027fcf0..000000000
--- a/src/actions/user.ts
+++ /dev/null
@@ -1,39 +0,0 @@
-"use server";
-
-import axios from "axios";
-
-import { auth } from "~/lib/auth";
-import { getApiUrl } from "./getApiUrl";
-
-export const fetchUserData = async () => {
- try {
- const apiUrl = await getApiUrl();
- const session = await auth();
-
- if (!session?.access_token) {
- return {
- error: "Authentication token is missing.",
- status: 401,
- };
- }
-
- // Making the API request
- const response = await axios.get(`${apiUrl}/api/last-login`, {
- headers: {
- Authorization: `Bearer ${session.access_token}`,
- },
- });
-
- return {
- data: response.data,
- status: response.status,
- };
- } catch (error) {
- if (axios.isAxiosError(error) && error.response) {
- return {
- error: error.response.data.message || "Unable to fetch user data.",
- status: error.response.status,
- };
- }
- }
-};
diff --git a/src/actions/userAuth.ts b/src/actions/userAuth.ts
deleted file mode 100644
index 8e12bfdc4..000000000
--- a/src/actions/userAuth.ts
+++ /dev/null
@@ -1,102 +0,0 @@
-"use server";
-
-import axios from "axios";
-import * as z from "zod";
-
-import { LoginSchema } from "~/schemas";
-import { AuthResponse, ErrorResponse } from "~/types";
-
-const apiUrl = process.env.API_URL;
-
-const credentialsAuth = async (
- values: z.infer,
-): Promise => {
- const validatedFields = LoginSchema.safeParse(values);
- if (!validatedFields.success) {
- return {
- message: "Something went wrong",
- status_code: 401,
- };
- }
- const { email, password } = validatedFields.data;
- const payload = { email, password };
- try {
- const response = await axios.post(`${apiUrl}/api/v1/auth/login`, payload);
-
- return {
- data: response.data.user,
- access_token: response.data.access_token,
- };
- } catch (error) {
- return {
- message:
- axios.isAxiosError(error) &&
- error.response &&
- error.response.data.message
- ? error.response.data.message
- : "Something went wrong",
- status_code:
- axios.isAxiosError(error) && error.response
- ? error.response.status
- : undefined,
- };
- }
-};
-
-const googleAuth = async (
- idToken: string,
-): Promise => {
- try {
- const response = await axios.post(`${apiUrl}/api/v1/auth/google`, {
- id_token: idToken,
- });
-
- return {
- data: response.data.user,
- access_token: response.data.access_token,
- };
- } catch (error) {
- return {
- message:
- axios.isAxiosError(error) &&
- error.response &&
- error.response.data.message
- ? error.response.data.message
- : "Something went wrong",
- status_code:
- axios.isAxiosError(error) && error.response
- ? error.response.status
- : undefined,
- };
- }
-};
-
-const twitterAuth = async (
- access_token: string,
-): Promise => {
- try {
- const response = await axios.post(`${apiUrl}/api/v1/auth/twitter`, {
- access_token: access_token,
- });
-
- return {
- data: response.data.user,
- access_token: response.data.access_token,
- };
- } catch (error) {
- return {
- message:
- axios.isAxiosError(error) &&
- error.response &&
- error.response.data.message
- ? error.response.data.message
- : "Something went wrong",
- status_code:
- axios.isAxiosError(error) && error.response
- ? error.response.status
- : undefined,
- };
- }
-};
-
-export { credentialsAuth, googleAuth, twitterAuth };
diff --git a/src/app/(auth-routes)/forgot-password/page.test.tsx b/src/app/(auth-routes)/forgot-password/page.test.tsx
deleted file mode 100644
index 2381a2d7f..000000000
--- a/src/app/(auth-routes)/forgot-password/page.test.tsx
+++ /dev/null
@@ -1,81 +0,0 @@
-import { fireEvent, render, screen, waitFor } from "@testing-library/react";
-
-import ForgotPassword from "./page";
-
-vi.mock("next/link", () => ({
- default: ({ children }: { children: React.ReactNode }) => children,
-}));
-
-describe("forgot password page", () => {
- it("renders the initial email input form", () => {
- expect.hasAssertions();
- render( );
-
- expect(screen.getByText(/forgot password/i)).toBeInTheDocument();
-
- expect(screen.getByText(/enter the email address/i)).toBeInTheDocument();
-
- expect(
- screen.getByPlaceholderText(/enter your email/i),
- ).toBeInTheDocument();
-
- expect(screen.getByText(/send/i)).toBeInTheDocument();
- });
-
- it("shows email error for unregistered email", async () => {
- expect.hasAssertions();
-
- render( );
-
- const emailInput = screen.getByPlaceholderText(/enter your email/i);
- const sendButton = screen.getByText(/send/i);
-
- fireEvent.change(emailInput, {
- target: { value: "unregistered@example.com" },
- });
- fireEvent.click(sendButton);
-
- await waitFor(() => {
- expect(
- screen.getByText(/this email doesn't match our records/i),
- ).toBeInTheDocument();
- });
- });
-
- it("does not proceed to verification code stage if email is invalid", async () => {
- expect.hasAssertions();
- render( );
-
- const emailInput = screen.getByPlaceholderText(/enter your email/i);
- const sendButton = screen.getByText(/send/i);
-
- fireEvent.change(emailInput, {
- target: { value: "invalid-email@example.com" },
- });
- fireEvent.click(sendButton);
-
- await waitFor(() => {
- expect(screen.queryByText("Verification Code")).not.toBeInTheDocument();
- });
- });
-
- it("displays an error message for an invalid email format", async () => {
- expect.hasAssertions();
- render( );
-
- const emailInput = screen.getByPlaceholderText(/enter your email/i);
- const sendButton = screen.getByText(/send/i);
- fireEvent.change(emailInput, {
- target: { value: "invalid-email" },
- });
- fireEvent.click(sendButton);
-
- await waitFor(() => {
- expect(
- screen.getByText(
- "This email doesn't match our records please try again",
- ),
- ).toBeInTheDocument();
- });
- });
-});
diff --git a/src/app/(auth-routes)/forgot-password/page.tsx b/src/app/(auth-routes)/forgot-password/page.tsx
deleted file mode 100644
index 3b87bf5db..000000000
--- a/src/app/(auth-routes)/forgot-password/page.tsx
+++ /dev/null
@@ -1,543 +0,0 @@
-"use client";
-
-import { TooltipArrow } from "@radix-ui/react-tooltip";
-import axios from "axios";
-import { AnimatePresence, motion } from "framer-motion";
-import { Check, CircleCheck, X } from "lucide-react";
-import Link from "next/link";
-import { ReactNode, useEffect, useState } from "react";
-
-import { getApiUrl } from "~/actions/getApiUrl";
-import CustomButton from "~/components/common/common-button/common-button";
-import { InputOtp } from "~/components/common/input-otp";
-import CustomInput from "~/components/common/input/input";
-import {
- Tooltip,
- TooltipContent,
- TooltipProvider,
- TooltipTrigger,
-} from "~/components/ui/tooltip";
-import { useToast } from "~/components/ui/use-toast";
-import { cn } from "~/lib/utils";
-
-const Error = ({
- children,
- className,
-}: {
- children?: ReactNode;
- className?: string;
-}) => (
-
- {children}
-
-);
-
-const Heading = ({ children }: { children: ReactNode }) => (
-
- {children}
-
-);
-
-const Description = ({ children }: { children: ReactNode }) => (
- {children}
-);
-
-const ForgotPassword = () => {
- const [currentStage, setCurrentStage] = useState(0);
- const [email, setEmail] = useState("");
- const [isCodeComplete, setIsCodeComplete] = useState(false);
- const [isCodeCorrect, setIsCodeCorrect] = useState(false);
- const [isOtpResent, setIsOtpResent] = useState(false);
- const [showSuccessMessage, setShowSuccessMessage] = useState(true);
- const [emailTooltipContent, setEmailTooltipContent] = useState("");
- const [apiUrl, setApiUrl] = useState("");
- const [userEmails, setUserEmails] = useState([]);
- const { toast } = useToast();
- const [newPassword, setNewPassword] = useState("");
- const [confirmNewPassword, setConfirmNewPassword] = useState("");
- const [isValidating, setIsValidating] = useState(false);
-
- useEffect(() => {
- const getUsers = async () => {
- let allUsers: string[] = [];
- let currentPage = 1;
- let lastPage = 1;
- try {
- const url = await getApiUrl();
- setApiUrl(url);
-
- do {
- const response = await axios.get(
- `${url}/api/v1/users?page=${currentPage}`,
- );
-
- type UserResponse = {
- data: {
- email: string;
- }[];
- };
-
- const data: UserResponse = response.data;
- const fetchedUserEmails: string[] = data.data.map(
- (user) => user.email,
- );
-
- allUsers = [...allUsers, ...fetchedUserEmails];
- currentPage = response.data.current_page;
- lastPage = response.data.last_page;
- currentPage++;
- } while (currentPage <= lastPage);
-
- setUserEmails(allUsers);
- } catch {
- toast({
- title: "Error",
- description: "Failed to fetch user emails",
- variant: "destructive",
- });
- }
- };
-
- getUsers();
- }, [toast]);
-
- const passwordError =
- newPassword.length < 8 ||
- !/[AZa-z]/.test(newPassword) ||
- !/\d/.test(newPassword) ||
- !/[\W_]/.test(newPassword);
-
- const confirmPasswordError = confirmNewPassword !== newPassword;
-
- const emailError =
- email && !userEmails.some((userEmail) => userEmail.includes(email));
-
- const fetchOtpCode = async () => {
- try {
- const response = await axios.post(
- `${apiUrl}/api/v1/auth/forgot-password`,
- { email },
- );
- return response;
- } catch (error) {
- return axios.isAxiosError(error) && error.response
- ? {
- success: false,
- error: error.response.data,
- }
- : {
- success: false,
- error: "Unknown error occurred",
- };
- }
- };
- const validateOTP = async (inputCode: string) => {
- setIsValidating(true);
- try {
- const response = await axios.post(
- `${apiUrl}/api/v1/auth/verify-forgot-otp`,
- { email, otp: inputCode },
- );
- setIsCodeCorrect(response.status === 200 ? true : false);
- } catch (error) {
- setIsCodeCorrect(false);
- return axios.isAxiosError(error) && error.response
- ? {
- success: false,
- error: error.response.data,
- }
- : {
- success: false,
- error: "Unknown error occurred",
- };
- } finally {
- setIsValidating(false);
- }
- };
-
- const handleReset = async () => {
- const formattedData = {
- email: email,
- password: newPassword,
- password_confirmation: confirmNewPassword,
- };
- try {
- setIsValidating(true);
- const response = await axios.post(
- `${apiUrl}/api/v1/auth/reset-forgot-password`,
- formattedData,
- );
- if (response.status === 200) {
- setIsValidating(false);
- }
- return response;
- } catch (error) {
- return axios.isAxiosError(error) && error.response
- ? {
- success: false,
- error: error.response.data,
- }
- : {
- success: false,
- error: "Unknown error occurred",
- };
- }
- };
-
- const Default = (
- <>
-
- Forgot Password
-
- Enter the email address you used to create the account to receive
- instructions on how to reset your password
-
-
-
-
-
- {
- const newValue = event.target.value;
- const emailMatch = newValue
- ? userEmails.find((email) => email.includes(newValue))
- : undefined;
- setEmailTooltipContent(
- emailMatch ? (emailMatch === newValue ? "" : emailMatch) : "",
- );
- setEmail(newValue);
- }}
- value={email}
- variant="border"
- label="Email"
- placeholder="Enter your email"
- className={`h-12 rounded-lg text-sm placeholder:text-sm focus:bg-zinc-50 focus:placeholder:text-neutral-dark-2 sm:h-16 sm:text-lg sm:placeholder:text-lg ${emailError ? "border-error" : "focus:border-primary"}`}
- labelClassName="sm:text-xl text-[13px] text-neutral-dark-2"
- />
- {emailError && (
-
- This email doesn't match our records please try again
-
- )}
-
- {
- setEmail(emailTooltipContent);
- setEmailTooltipContent("");
- }}
- >
- {emailTooltipContent}
-
-
-
-
-
- Send
-
-
-
- Remember your Password?
-
-
- Login
-
-
- >
- );
-
- const VerificationCode = (
- <>
-
- Verification Code{isOtpResent ? " Resent" : ""}
-
- Confirm the OTP sent to
- {email} and enter the verification
- code that was sent. Code expires in{" "}
- 00:59
-
-
-
- {
- if (value.length === 6) {
- validateOTP(value);
- setIsCodeComplete(true);
- } else {
- setIsCodeComplete(false);
- }
- }}
- />
- {!isCodeCorrect && isCodeComplete && (
- The OTP entered is not correct. Try again
- )}
-
-
- {isValidating ? "Verifying..." : "Verify"}
-
-
-
-
- Didn't receive any code?
-
- setIsOtpResent(true)}
- >
- Resend OTP
-
-
- {isOtpResent && (
- <>
-
-
- Or
-
-
-
{
- setCurrentStage(0);
- setIsOtpResent(false);
- setIsCodeComplete(false);
- setEmail("");
- }}
- >
- Change email
-
- >
- )}
-
- >
- );
-
- const VerificationSuccessful = (
- <>
-
- Verification Successful
-
- Your verification was successful, you can now proceed to reset your
- password
-
-
-
- Reset Password
-
- >
- );
-
- const PasswordUpdated = (
- <>
-
- PASSWORD UPDATED
-
- Your password has been updated
-
-
-
- Back to Login
-
-
- >
- );
-
- const VerificationSuccessfulMessage = (
-
-
-
-
-
- Email Verified Successfully
-
-
-
setShowSuccessMessage(false)}
- />
-
-
- );
-
- const PasswordUpdatedSuccessfulMessage = (
-
-
-
-
-
- Password Updated Successfully!
-
-
-
setShowSuccessMessage(false)}
- />
-
-
- );
-
- const ResetPassword = (
- <>
-
- Reset Password
-
- Your password must be at least 8 characters long
-
-
- {
- setNewPassword(event.target.value);
- }}
- value={newPassword}
- variant="border"
- label="New Password"
- placeholder="New Password"
- className={`h-12 rounded-lg text-sm placeholder:text-sm focus:bg-zinc-50 focus:placeholder:text-neutral-dark-2 sm:h-16 sm:text-lg sm:placeholder:text-lg ${passwordError ? "border-error" : "focus:border-primary"}`}
- labelClassName="sm:text-xl text-[13px] text-neutral-dark-2"
- />
- {passwordError && (
-
- Invalid password format. Please check again
-
- )}
- {
- setConfirmNewPassword(event.target.value);
- }}
- value={confirmNewPassword}
- variant="border"
- label="Confirm Password"
- placeholder="Confirm Password"
- className={`h-12 rounded-lg text-sm placeholder:text-sm focus:bg-zinc-50 focus:placeholder:text-neutral-dark-2 sm:h-16 sm:text-lg sm:placeholder:text-lg ${confirmPasswordError ? "border-error" : "focus:border-primary"}`}
- labelClassName="sm:text-xl text-[13px] text-neutral-dark-2"
- />
- {confirmPasswordError && (
-
- Password do not match!
-
- )}
-
- {isValidating ? "Validating..." : "Reset Password"}
-
- >
- );
-
- const sections = [
- {
- element: Default,
- stage: 0,
- onSubmit: () => {
- if (!emailError) setCurrentStage(1);
- },
- },
- {
- element: VerificationCode,
- stage: 1,
- onSubmit: () => setCurrentStage(2),
- },
- {
- element: VerificationSuccessful,
- stage: 2,
- onSubmit: () => setCurrentStage(3),
- },
- {
- element: ResetPassword,
- stage: 3,
- onSubmit: () => setCurrentStage(4),
- },
- {
- element: PasswordUpdated,
- stage: 4,
- onSubmit: () => {},
- },
- ];
-
- return (
-
-
- {currentStage === 2 &&
- showSuccessMessage &&
- VerificationSuccessfulMessage}
-
-
- {currentStage === 4 &&
- showSuccessMessage &&
- PasswordUpdatedSuccessfulMessage}
-
- {sections.map(
- (section, index) =>
- section.stage === currentStage && (
-
- ),
- )}
-
- );
-};
-
-export default ForgotPassword;
diff --git a/src/app/(auth-routes)/layout.tsx b/src/app/(auth-routes)/layout.tsx
index 07e61119f..2f4305f1e 100644
--- a/src/app/(auth-routes)/layout.tsx
+++ b/src/app/(auth-routes)/layout.tsx
@@ -1,9 +1,12 @@
-import { Suspense } from "react";
+import Navbar from '~/components/navigation/navbar/index'
+import Footer from '~/components/navigation/footer'
+import { Suspense } from 'react'
-import Footer from "~/components/layouts/footer";
-import Navbar from "~/components/layouts/navbar";
-
-function Layout({ children }: { children: React.ReactNode }) {
+export default function LandingLayout({
+ children,
+}: Readonly<{
+ children: React.ReactNode
+}>) {
return (
<>
@@ -12,7 +15,5 @@ function Layout({ children }: { children: React.ReactNode }) {
>
- );
+ )
}
-
-export default Layout;
diff --git a/src/app/(auth-routes)/login/magic-link/link-sent/page.test.tsx b/src/app/(auth-routes)/login/magic-link/link-sent/page.test.tsx
deleted file mode 100644
index e15a0f632..000000000
--- a/src/app/(auth-routes)/login/magic-link/link-sent/page.test.tsx
+++ /dev/null
@@ -1,44 +0,0 @@
-import { render, screen } from "@testing-library/react";
-import { describe, expect, it, vi } from "vitest";
-
-import MagicLinkSuccess from "./page";
-
-type ModuleType = typeof import("./page");
-
-vi.mock("./page", async () => {
- const actualModule: ModuleType = await vi.importActual("./page");
- return {
- default: actualModule.default,
- handleOpenEmail: vi.fn(),
- };
-});
-
-describe("magicLinkSuccess", () => {
- it("renders the success message", () => {
- expect.hasAssertions();
- render( );
- expect(screen.getByText("Sent! Check your email.")).toBeInTheDocument();
- });
-
- it("displays the check icon", () => {
- expect.hasAssertions();
- render( );
- const checkIcon = screen.getByTestId("check-icon");
- expect(checkIcon).toBeInTheDocument();
- expect(checkIcon).toHaveClass("h-20 w-20 text-center text-white");
- });
-
- it("shows the email address in the instructions", () => {
- expect.hasAssertions();
- render( );
- expect(screen.getByText(/talk2johnsnow@gmail.com/)).toBeInTheDocument();
- });
-
- it('renders the "Open Email" button', () => {
- expect.hasAssertions();
- render( );
- expect(
- screen.getByRole("button", { name: "Open Email" }),
- ).toBeInTheDocument();
- });
-});
diff --git a/src/app/(auth-routes)/login/magic-link/link-sent/page.tsx b/src/app/(auth-routes)/login/magic-link/link-sent/page.tsx
deleted file mode 100644
index 093c06ea5..000000000
--- a/src/app/(auth-routes)/login/magic-link/link-sent/page.tsx
+++ /dev/null
@@ -1,45 +0,0 @@
-"use client";
-
-import { Check } from "lucide-react";
-
-import { Button } from "~/components/ui/button";
-
-const handleOpenEmail = () => {
- window.location.href = "mailto:";
-};
-const MagicLinkSuccess = () => {
- return (
-
-
-
-
- Sent! Check your email.
-
-
-
-
-
-
-
- We have sent an email to talk2johnsnow@gmail.com. It contains
- instructions on how to get started.
-
-
-
- Open Email
-
-
-
-
- );
-};
-
-export default MagicLinkSuccess;
diff --git a/src/app/(auth-routes)/login/magic-link/page.tsx b/src/app/(auth-routes)/login/magic-link/page.tsx
deleted file mode 100644
index ae9305d6b..000000000
--- a/src/app/(auth-routes)/login/magic-link/page.tsx
+++ /dev/null
@@ -1,151 +0,0 @@
-"use client";
-
-import { zodResolver } from "@hookform/resolvers/zod";
-import { ShieldCheck } from "lucide-react";
-import { useRouter } from "next/navigation";
-import React, { useState } from "react";
-import { useForm } from "react-hook-form";
-import { z } from "zod";
-
-import LoadingSpinner from "~/components/miscellaneous/loading-spinner";
-import { Button } from "~/components/ui/button";
-import {
- Form,
- FormControl,
- FormField,
- FormItem,
- FormMessage,
-} from "~/components/ui/form";
-import { Input } from "~/components/ui/input";
-import { Label } from "~/components/ui/label";
-import { useToast } from "~/components/ui/use-toast";
-
-const formSchema = z.object({
- email: z.string().email("Please enter a valid email address"),
-});
-
-type FormValues = z.infer;
-
-const getInputClassName = (hasError: boolean, isValid: boolean) => {
- const baseClasses =
- "font-inter w-full rounded-md border px-3 py-6 text-sm font-normal leading-[21.78px] transition duration-150 ease-in-out focus:outline-none focus:ring-1 focus:ring-opacity-50";
-
- if (hasError) {
- return `${baseClasses} border-red-500 focus:border-red-500 focus:ring-red-500 text-red-900`;
- } else if (isValid) {
- return `${baseClasses} border-orange-500 focus:border-orange-500 focus:ring-orange-500 text-neutralColor-dark-2`;
- }
- return `${baseClasses} border-gray-300 focus:border-orange-500 focus:ring-orange-500 text-neutralColor-dark-2`;
-};
-
-const LoginMagicLink: React.FC = () => {
- const router = useRouter();
- const { toast } = useToast();
- const [isLoading, setIsLoading] = useState(false);
- const form = useForm({
- resolver: zodResolver(formSchema),
- defaultValues: {
- email: "",
- },
- });
-
- const onSubmit = async () => {
- setIsLoading(true);
- try {
- await new Promise((resolve) => setTimeout(resolve, 3000));
- router.push("/login/magic-link/link-sent");
- } catch (error: unknown) {
- toast({
- title: "Login failed",
- description:
- error instanceof Error ? error.message : "An unknown error occurred",
- variant: "destructive",
- });
- } finally {
- setIsLoading(false);
- }
- };
-
- return (
-
- );
-};
-
-export default LoginMagicLink;
diff --git a/src/app/(auth-routes)/login/page.test-backup.tsx b/src/app/(auth-routes)/login/page.test-backup.tsx
deleted file mode 100644
index 2fcfec8a9..000000000
--- a/src/app/(auth-routes)/login/page.test-backup.tsx
+++ /dev/null
@@ -1,204 +0,0 @@
-import { fireEvent, screen } from "@testing-library/react";
-import React from "react";
-import { describe, expect, it, vi } from "vitest";
-
-import { renderWithIntl } from "~/test/utils";
-import Login from "./page";
-
-vi.mock("next/link", () => ({
- default: ({ children }: { children: React.ReactNode }) => children,
-}));
-
-const mockPush = vi.fn();
-vi.mock("next/navigation", () => ({
- useRouter: () => ({
- push: mockPush,
- }),
-}));
-
-type FieldType = {
- onChange: (event: React.ChangeEvent) => void;
- onBlur: () => void;
- value: string;
- name: string;
- ref: React.RefCallback | null;
-};
-
-vi.mock("~/components/ui/form", () => ({
- Form: function Form({ children }: { children: React.ReactNode }) {
- return {children}
;
- },
- FormField: function FormField({
- render,
- }: {
- render: (properties: { field: FieldType }) => React.ReactNode;
- }) {
- return render({
- field: {
- onChange: vi.fn(),
- onBlur: vi.fn(),
- value: "",
- name: "",
- ref: () => {},
- },
- });
- },
- FormItem: function FormItem({ children }: { children: React.ReactNode }) {
- return {children}
;
- },
- FormLabel: function FormLabel({ children }: { children: React.ReactNode }) {
- return {children} ;
- },
- FormControl: React.forwardRef(function FormControl(
- { children }: { children: React.ReactNode },
- reference: React.Ref,
- ) {
- return {children}
;
- }),
- FormMessage: function FormMessage({
- children,
- }: {
- children: React.ReactNode;
- }) {
- return children;
- },
-}));
-
-vi.mock("~/components/ui/input", () => ({
- Input: (properties: React.InputHTMLAttributes) => (
-
- ),
-}));
-
-vi.mock("~/components/ui/checkbox", () => ({
- Checkbox: (properties: React.InputHTMLAttributes) => (
-
- ),
-}));
-
-vi.mock("~/components/ui/button", () => ({
- Button: ({
- children,
- ...properties
- }: React.ButtonHTMLAttributes) => (
- {children}
- ),
-}));
-
-describe("login", () => {
- afterEach(() => {
- vi.clearAllMocks();
- });
- it("renders login form", () => {
- expect.hasAssertions();
-
- renderWithIntl( );
-
- expect(screen.getByRole("heading", { name: "Login" })).toBeInTheDocument();
- expect(
- screen.getByPlaceholderText("Enter Email Address"),
- ).toBeInTheDocument();
- expect(screen.getByPlaceholderText("Enter Password")).toBeInTheDocument();
- expect(screen.getByRole("button", { name: "Login" })).toBeInTheDocument();
- });
-
- it("toggles password visibility", () => {
- expect.hasAssertions();
-
- renderWithIntl( );
-
- const passwordInput = screen.getByPlaceholderText("Enter Password");
- const toggleButton = screen.getByRole("button", { name: "" });
-
- expect(passwordInput).toHaveAttribute("type", "password");
- expect(screen.getByTestId("eye-off-icon")).toBeInTheDocument();
-
- fireEvent.click(toggleButton);
-
- expect(passwordInput).toHaveAttribute("type", "text");
- expect(screen.getByTestId("eye-icon")).toBeInTheDocument();
-
- fireEvent.click(toggleButton);
-
- expect(passwordInput).toHaveAttribute("type", "password");
- expect(screen.getByTestId("eye-off-icon")).toBeInTheDocument();
- });
-
- it('renders "Sign in with magic link" button', () => {
- expect.hasAssertions();
-
- renderWithIntl( );
-
- const magicLinkButton = screen.getByRole("button", {
- name: /sign in with magic link/i,
- });
- expect(magicLinkButton).toBeInTheDocument();
- expect(magicLinkButton).toHaveTextContent("Sign in with magic link");
- });
-
- it("renders Terms of Service and Privacy Policy links", () => {
- expect.hasAssertions();
-
- renderWithIntl( );
-
- const termsLink = screen.getByRole("link", { name: /terms of service/i });
- expect(termsLink).toBeInTheDocument();
- expect(termsLink).toHaveTextContent("Terms of Service");
- expect(termsLink).toHaveAttribute("href", "#");
-
- const privacyLink = screen.getByRole("link", { name: /privacy policy/i });
- expect(privacyLink).toBeInTheDocument();
- expect(privacyLink).toHaveTextContent("Privacy Policy");
- expect(privacyLink).toHaveAttribute("href", "#");
- });
-
- it("submits form with valid inputs", async () => {
- expect.hasAssertions();
-
- renderWithIntl( );
-
- const emailInput = screen.getByPlaceholderText("Enter Email Address");
- const passwordInput = screen.getByPlaceholderText("Enter Password");
- const submitButton = screen.getByRole("button", { name: /login/i });
-
- fireEvent.change(emailInput, { target: { value: "test@example.com" } });
- fireEvent.change(passwordInput, { target: { value: "password123" } });
-
- fireEvent.click(submitButton);
-
- await vi.waitFor(
- () => {
- // expect(mockPush).toHaveBeenCalledWith("/");
- const emailError = screen.queryByTestId("email-error");
- const passwordError = screen.queryByTestId("password-error");
- expect(emailError).not.toBeInTheDocument();
- expect(passwordError).not.toBeInTheDocument();
- },
- { timeout: 3000 },
- );
- });
-
- // it("displays error messages for invalid inputs", async () => {
- // expect.hasAssertions();
-
- // render( );
-
- // const emailInput = screen.getByPlaceholderText("Enter Email Address");
- // const passwordInput = screen.getByPlaceholderText("Enter Password");
- // const submitButton = screen.getByRole("button", { name: /login/i });
-
- // await userEvent.type(emailInput, "invalid-email");
- // await userEvent.type(passwordInput, "short");
- // await userEvent.click(submitButton);
-
- // await vi.waitFor(
- // () => {
- // const emailError = screen.queryByTestId("email-error");
- // const passwordError = screen.queryByTestId("password-error");
- // expect(emailError).toBeInTheDocument();
- // expect(passwordError).toBeInTheDocument();
- // },
- // { timeout: 3000 },
- // );
- // });
-});
diff --git a/src/app/(auth-routes)/login/page.tsx b/src/app/(auth-routes)/login/page.tsx
index 5251e9fee..2264e0705 100644
--- a/src/app/(auth-routes)/login/page.tsx
+++ b/src/app/(auth-routes)/login/page.tsx
@@ -1,301 +1,8 @@
-"use client";
+import React from 'react'
+import Login from '~/components/auth/login'
-import { zodResolver } from "@hookform/resolvers/zod";
-import { Eye, EyeOff, ShieldCheck } from "lucide-react";
-import { signIn, useSession } from "next-auth/react";
-import { useTranslations } from "next-intl";
-import { useRouter } from "next-nprogress-bar";
-import Link from "next/link";
-import { useEffect, useState, useTransition } from "react";
-import { useForm } from "react-hook-form";
-import * as z from "zod";
+const page = () => {
+ return
+}
-import CustomButton from "~/components/common/common-button/common-button";
-import { Input } from "~/components/common/input";
-import LoadingSpinner from "~/components/miscellaneous/loading-spinner";
-import { Checkbox } from "~/components/ui/checkbox";
-import {
- Form,
- FormControl,
- FormField,
- FormItem,
- FormLabel,
- FormMessage,
-} from "~/components/ui/form";
-import { useToast } from "~/components/ui/use-toast";
-import { cn } from "~/lib/utils";
-import { LoginSchema } from "~/schemas";
-
-const Login = () => {
- const t = useTranslations("login");
- const router = useRouter();
- const { toast } = useToast();
- const [isLoading, startTransition] = useTransition();
- const [showPassword, setShowPassword] = useState(false);
- const { status } = useSession();
-
- useEffect(() => {
- if (status === "authenticated") {
- router.push("/dashboard");
- }
- }, [status, router]);
-
- const form = useForm>({
- resolver: zodResolver(LoginSchema),
- defaultValues: {
- email: "",
- password: "",
- rememberMe: false,
- },
- });
- const onSubmit = async (values: z.infer) => {
- const { email, password } = values;
-
- try {
- startTransition(async () => {
- const result = await signIn("credentials", {
- email,
- password,
- redirect: false,
- });
-
- if (result?.ok) {
- router.push("/dashboard");
- toast({
- title: "Login success",
- description: "Redirecting",
- });
- } else {
- toast({
- title: "An error occurred",
- description: result?.error || "Unknown error",
- });
- }
- });
- } catch (error) {
- toast({
- title: "Login failed",
- description:
- (error as Error).message || "An error occurred during login",
- });
- }
- };
-
- const togglePasswordVisibility = () => {
- setShowPassword(!showPassword);
- };
- useEffect(() => {
- document.title = "Login";
- }, []);
-
- return (
-
-
-
-
- {t("title")}
-
-
- {t("welcomeBack")}
-
-
-
-
signIn("google", { callbackUrl: "/" })}
- icon={
-
-
-
-
-
-
- }
- >
- {t("continueWithGoogle")}
-
-
-
-
-
- OR
-
-
-
-
-
-
-
- {t("signInWithMagicLink")}
-
-
-
- {t("noAccount")}{" "}
-
- {t("signUp")}
-
-
-
-
-
- {t("agree")}{" "}
-
- {t("termsOfService")}
- {" "}
- {t("and")}{" "}
-
- {t("privacyPolicy")}
-
-
-
-
- );
-};
-
-export default Login;
+export default page
diff --git a/src/app/(auth-routes)/register/organisation/page.tsx b/src/app/(auth-routes)/register/organisation/page.tsx
deleted file mode 100644
index 731fccda4..000000000
--- a/src/app/(auth-routes)/register/organisation/page.tsx
+++ /dev/null
@@ -1,278 +0,0 @@
-"use client";
-
-import { zodResolver } from "@hookform/resolvers/zod";
-import { useSession } from "next-auth/react";
-import { useRouter } from "next-nprogress-bar";
-import Link from "next/link";
-import { useTransition } from "react";
-import { useForm } from "react-hook-form";
-import { z } from "zod";
-
-import { createOrg } from "~/actions/createOrg";
-import LoadingSpinner from "~/components/miscellaneous/loading-spinner";
-import { Button } from "~/components/ui/button";
-import {
- Form,
- FormControl,
- FormField,
- FormItem,
- FormLabel,
- FormMessage,
-} from "~/components/ui/form";
-import { Input } from "~/components/ui/input";
-import {
- Select,
- SelectContent,
- SelectItem,
- SelectTrigger,
- SelectValue,
-} from "~/components/ui/select";
-import { useToast } from "~/components/ui/use-toast";
-import { organizationSchema } from "~/schemas";
-
-function Organisation() {
- const router = useRouter();
- const { toast } = useToast();
- const { status } = useSession();
- const [isLoading, startTransition] = useTransition();
-
- if (status === "authenticated") {
- router.push("/dashboard");
- }
-
- const form = useForm>({
- resolver: zodResolver(organizationSchema),
- defaultValues: {
- name: "",
- description: "Company Description",
- email: "",
- industry: "",
- type: "",
- country: "",
- state: "",
- address: "",
- },
- });
-
- const onSubmit = async (values: z.infer) => {
- const token = sessionStorage.getItem("temp_token");
- startTransition(async () => {
- await createOrg(values, token ?? "").then(async (data) => {
- if (data.status === 201) {
- router.push("/login");
- }
-
- toast({
- title:
- data.status === 201
- ? "Organization created successfully"
- : "an error occurred",
- description: data.status === 201 ? "Continue to login" : data.error,
- });
- });
- });
- };
-
- return (
- <>
-
-
-
- Create Organisation Account
-
-
- Create an account to get started with us.
-
-
-
-
-
- >
- );
-}
-
-export default Organisation;
diff --git a/src/app/(auth-routes)/register/page.tsx b/src/app/(auth-routes)/register/page.tsx
index 1425e694f..70c1839d2 100644
--- a/src/app/(auth-routes)/register/page.tsx
+++ b/src/app/(auth-routes)/register/page.tsx
@@ -1,421 +1,8 @@
-"use client";
+import React from 'react'
+import Register from '~/components/auth/register'
-import { zodResolver } from "@hookform/resolvers/zod";
-import { Eye, EyeOff } from "lucide-react";
-import { signIn, useSession } from "next-auth/react";
-import { useTranslations } from "next-intl";
-import { useRouter } from "next-nprogress-bar";
-import Link from "next/link";
-import { useState, useTransition } from "react";
-import { useForm } from "react-hook-form";
-import * as z from "zod";
+const page = () => {
+ return
+}
-import { getApiUrl } from "~/actions/getApiUrl";
-import { registerUser, resendOtp, verifyOtp } from "~/actions/register";
-import CustomButton from "~/components/common/common-button/common-button";
-import { Input } from "~/components/common/input";
-import LoadingSpinner from "~/components/miscellaneous/loading-spinner";
-import {
- Dialog,
- DialogContent,
- DialogDescription,
- DialogHeader,
- DialogTitle,
-} from "~/components/ui/dialog";
-import {
- Form,
- FormControl,
- FormField,
- FormItem,
- FormLabel,
- FormMessage,
-} from "~/components/ui/form";
-import {
- InputOTP,
- InputOTPGroup,
- InputOTPSlot,
-} from "~/components/ui/input-otp";
-import { useToast } from "~/components/ui/use-toast";
-import { cn } from "~/lib/utils";
-import { RegisterSchema } from "~/schemas";
-import { formatTime, maskEmail } from "~/utils";
-
-const Register = () => {
- const t = useTranslations("register");
- const router = useRouter();
- const { toast } = useToast();
- const { status } = useSession();
- const [isLoading, startTransition] = useTransition();
- const [showPassword, setShowPassword] = useState(false);
- const [showOtp, setShowOtp] = useState(false);
- const [timeLeft, setTimeLeft] = useState(15 * 60);
- const [value, setValue] = useState("");
-
- if (status === "authenticated") {
- router.push("/dashboard");
- }
-
- const form = useForm>({
- resolver: zodResolver(RegisterSchema),
- defaultValues: {
- email: "",
- password: "",
- first_name: "",
- last_name: "",
- },
- });
-
- const onSubmit = async (values: z.infer) => {
- const apiUrl = await getApiUrl();
-
- startTransition(async () => {
- await registerUser(values).then(async (data) => {
- if (data.status === 201) {
- router.push("/login");
-
- toast({
- title: "Account created successfully",
- description: "Verify your account",
- });
-
- const emailTemplateId = data?.data?.email_template_id;
-
- // Check if the email_template_id is provided
- if (emailTemplateId) {
- const emailData = {
- template_id: emailTemplateId,
- subject: "Welcome to Our Service!",
- recipient: values.email,
- variables: JSON.stringify({ name: values.first_name }),
- status: "pending",
- };
-
- try {
- const response = await fetch(`${apiUrl}/api/v1/email-requests`, {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- },
- body: JSON.stringify(emailData),
- });
-
- const emailResult = await response.json();
- if (emailResult.status !== "success") {
- throw new Error(emailResult.message || "Email sending failed");
- }
- } catch {
- // Handle error, possibly show a toast notification or log it
- }
- }
- } else {
- toast({
- title: "An error occurred",
- description: data.error,
- });
- }
- });
- });
- };
-
- const onOtpSubmit = async () => {
- startTransition(async () => {
- const values = { token: value, email: form.getValues().email };
- await verifyOtp(values).then(async (data) => {
- if (data.status === 200) {
- setShowOtp(false);
- router.push("/login");
- }
-
- toast({
- title:
- data.status === 201
- ? "Email verification successfully"
- : "an error occurred",
- description: data.status === 201 ? "Redirecting" : data.error,
- });
- });
- });
- };
-
- const resendOtpreq = async () => {
- startTransition(async () => {
- resendOtp(form.getValues().email).then(async (data) => {
- if (data.status === 200) {
- setTimeLeft(15 * 60);
- toast({
- title: "OTP sent successfully",
- description: "Please check your email",
- });
- } else {
- toast({
- title: "Error",
- description: data.error,
- variant: "destructive",
- });
- }
- });
- });
- };
-
- return (
-
-
-
-
- {t("signUp")}
-
-
- {t("createAccountDesc")}
-
-
-
-
signIn("google", { callbackUrl: "/dashboard" })}
- icon={
-
-
-
-
-
-
- }
- >
- {t("continueWithGoogle")}
-
-
-
-
-
- OR
-
-
-
-
-
-
-
-
-
- {t("emailVerification")}
-
-
-
- {t("emailVerificationDesc")}{" "}
- {maskEmail(form.getValues().email)}
-
-
- {t("checkSpam")}
-
- {t("otpExpiresIn")}: {formatTime(timeLeft)}
-
-
-
-
-
-
- {...[0, 1, 2, 3, 4, 5].map((number_) => (
-
-
-
- ))}
-
-
-
-
- {t("resendCode")}{" "}
- resendOtpreq()}
- >
- resend
-
-
-
-
- {t("dataProcessing")}
-
-
-
-
-
- {t("alreadyHaveAccount")}{" "}
-
- Login
-
-
-
-
- );
-};
-
-export default Register;
+export default page
diff --git a/src/app/(auth-routes)/reset-password/page.tsx b/src/app/(auth-routes)/reset-password/page.tsx
deleted file mode 100644
index dbee39a0c..000000000
--- a/src/app/(auth-routes)/reset-password/page.tsx
+++ /dev/null
@@ -1,5 +0,0 @@
-const Reset = () => {
- return Reset
;
-};
-
-export default Reset;
diff --git a/src/app/(auth-routes)/reset-password/verify-otp/page.tsx b/src/app/(auth-routes)/reset-password/verify-otp/page.tsx
deleted file mode 100644
index bf8d6daa2..000000000
--- a/src/app/(auth-routes)/reset-password/verify-otp/page.tsx
+++ /dev/null
@@ -1,39 +0,0 @@
-"use client";
-
-import CustomButton from "~/components/common/common-button/common-button";
-import { InputOtp } from "~/components/common/input-otp";
-
-export default function VerifyCodePage() {
- return (
- <>
-
-
-
- Verification Code
-
-
- Confirm the OTP sent to{" "}
- ellafedora@gmail.com and
- enter the Verification code that was sent. Code expires in{" "}
- 00:59
-
-
-
-
-
-
-
-
- Verify{" "}
-
-
- Didn't recieve any code?{" "}
-
- Resend OTP
-
-
-
-
- >
- );
-}
diff --git a/src/app/(landing-routes)/(home)/about-us/page.test.tsx b/src/app/(landing-routes)/(home)/about-us/page.test.tsx
deleted file mode 100644
index 39da3cfb1..000000000
--- a/src/app/(landing-routes)/(home)/about-us/page.test.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import { renderWithIntl } from "~/test/utils";
-import Page from "./page";
-
-describe("page tests", () => {
- it("should render correctly", () => {
- expect.assertions(1);
-
- renderWithIntl( );
-
- expect(true).toBeTruthy();
- });
-});
diff --git a/src/app/(landing-routes)/(home)/about-us/page.tsx b/src/app/(landing-routes)/(home)/about-us/page.tsx
index c1b83a31f..90c7b29d2 100644
--- a/src/app/(landing-routes)/(home)/about-us/page.tsx
+++ b/src/app/(landing-routes)/(home)/about-us/page.tsx
@@ -1,13 +1,13 @@
-import CoreValues from "~/components/layouts/aboutUs/CoreValues";
-import ExecutiveTeam from "~/components/layouts/aboutUs/ExecutiveTeam";
-import Hero from "~/components/layouts/aboutUs/Hero";
-import Join from "~/components/layouts/aboutUs/Join";
-import Mission from "~/components/layouts/aboutUs/Mission";
-import OurServices from "~/components/layouts/aboutUs/OurServices";
+import CoreValues from '~/components/about/CoreValues'
+import ExecutiveTeam from '~/components/about/ExecutiveTeam'
+import Hero from '~/components/about/Hero'
+import Join from '~/components/about/Join'
+import Mission from '~/components/about/Mission'
+import OurServices from '~/components/about/OurServices'
const AboutUs = () => {
return (
-
+
@@ -15,7 +15,7 @@ const AboutUs = () => {
- );
-};
+ )
+}
-export default AboutUs;
+export default AboutUs
diff --git a/src/app/(landing-routes)/(home)/layout.tsx b/src/app/(landing-routes)/(home)/layout.tsx
deleted file mode 100644
index 8a5588eac..000000000
--- a/src/app/(landing-routes)/(home)/layout.tsx
+++ /dev/null
@@ -1,9 +0,0 @@
-import LenisProvider from "~/components/LenisProvider";
-
-export default function HomeLayout({
- children,
-}: Readonly<{
- children: React.ReactNode;
-}>) {
- return
{children} ;
-}
diff --git a/src/app/(landing-routes)/(home)/page.test.tsx b/src/app/(landing-routes)/(home)/page.test.tsx
deleted file mode 100644
index 39da3cfb1..000000000
--- a/src/app/(landing-routes)/(home)/page.test.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import { renderWithIntl } from "~/test/utils";
-import Page from "./page";
-
-describe("page tests", () => {
- it("should render correctly", () => {
- expect.assertions(1);
-
- renderWithIntl(
);
-
- expect(true).toBeTruthy();
- });
-});
diff --git a/src/app/(landing-routes)/(home)/page.tsx b/src/app/(landing-routes)/(home)/page.tsx
index b3c6f6520..f04dbc223 100644
--- a/src/app/(landing-routes)/(home)/page.tsx
+++ b/src/app/(landing-routes)/(home)/page.tsx
@@ -1,10 +1,9 @@
-import Hero from "~/components/layouts/homepage/Hero";
-import HowItWorks from "~/components/layouts/homepage/HowItWorks";
-import MarketingAd from "~/components/layouts/homepage/MarketingAd";
-import PerfectFit from "~/components/layouts/homepage/PerfectFit";
-import Testimonials from "~/components/layouts/homepage/Testimonials";
-import UserSection from "~/components/layouts/homepage/UserSection";
-import Video from "~/components/layouts/homepage/Video";
+import Hero from '~/components/homepage/Hero'
+import HowItWorks from '~/components/homepage/HowItWorks'
+import PerfectFit from '~/components/homepage/PerfectFit'
+import Testimonials from '~/components/homepage/Testimonials'
+import UserSection from '~/components/homepage/UserSection'
+import Video from '~/components/homepage/Video'
export default function Home() {
return (
@@ -14,8 +13,7 @@ export default function Home() {
-
>
- );
+ )
}
diff --git a/src/app/(landing-routes)/(home)/payment/success/CheckSuccess.tsx b/src/app/(landing-routes)/(home)/payment/success/CheckSuccess.tsx
deleted file mode 100644
index 544655675..000000000
--- a/src/app/(landing-routes)/(home)/payment/success/CheckSuccess.tsx
+++ /dev/null
@@ -1,100 +0,0 @@
-"use client";
-
-import axios from "axios";
-import Link from "next/link";
-import { useSearchParams } from "next/navigation";
-import { useEffect, useState } from "react";
-
-import { getApiUrl } from "~/actions/getApiUrl";
-
-function CheckSuccess() {
- const [loading, setLoading] = useState(true);
- const [isSuccess, setIsSuccess] = useState(false);
- const searchParameters = useSearchParams();
- const sessionId = searchParameters.get("session_id");
-
- useEffect(() => {
- const checkPaymentStatus = async () => {
- try {
- const apiUrl = await getApiUrl();
- const response = await axios.get(
- `${apiUrl}/api/v1/payment/stripe/status?session_id=${sessionId}`,
- {
- headers: {
- "ngrok-skip-browser-warning": "true",
- },
- },
- );
-
- if (response.data.status === "SUCCESS") {
- setIsSuccess(true);
- }
- } catch {
- throw new Error("An error occured");
- } finally {
- setLoading(false);
- }
- };
- checkPaymentStatus();
- }, [sessionId]);
-
- return (
- <>
-
-
- {loading &&
}
- {!loading && (
-
- {isSuccess ? (
-
-
-
- ) : (
-
-
-
- )}
-
- {isSuccess ? "Payment done" : "Payment failed"}
-
-
- {isSuccess
- ? "The transaction was successful"
- : "The transaction failed"}
-
-
-
- Explore App
-
-
-
- )}
-
-
- >
- );
-}
-
-export default CheckSuccess;
diff --git a/src/app/(landing-routes)/(home)/payment/success/page.tsx b/src/app/(landing-routes)/(home)/payment/success/page.tsx
deleted file mode 100644
index 6f22fce6f..000000000
--- a/src/app/(landing-routes)/(home)/payment/success/page.tsx
+++ /dev/null
@@ -1,13 +0,0 @@
-import { Suspense } from "react";
-
-import CheckSuccess from "./CheckSuccess";
-
-function CheckSuccessPage() {
- return (
-
-
-
- );
-}
-
-export default CheckSuccessPage;
diff --git a/src/app/(landing-routes)/(home)/pricing/page.tsx b/src/app/(landing-routes)/(home)/pricing/page.tsx
deleted file mode 100644
index e5b0d3327..000000000
--- a/src/app/(landing-routes)/(home)/pricing/page.tsx
+++ /dev/null
@@ -1,235 +0,0 @@
-"use client";
-
-import axios from "axios";
-import { getCookie } from "cookies-next";
-import { useSession } from "next-auth/react";
-import { useTranslations } from "next-intl";
-import Image from "next/image";
-import Link from "next/link";
-import { useEffect, useState } from "react";
-
-import { getApiUrl } from "~/actions/getApiUrl";
-import FaqAccordion from "~/components/layouts/accordion/FaqsAccordion";
-import Heading from "~/components/layouts/heading";
-import PricingCardSkeleton from "~/components/skeleton/pricingcardskeleton";
-import { Button } from "~/components/ui/button";
-import { faqData } from "~/constants/faqsdata";
-
-interface BillingPlan {
- id: string;
- name: string;
- price: string;
- description: string;
- features: string[];
- duration: string;
-}
-
-const getAnnualPrice = (monthlyPrice: string) => {
- const monthly = Number.parseFloat(monthlyPrice);
- const annual = monthly * 12 * 0.8;
- return annual.toFixed(2);
-};
-
-export default function Pricing() {
- const { data: session } = useSession();
- const [toggle, setToggle] = useState(1);
- const [plans, setPlans] = useState
([]);
- const [loading, setLoading] = useState(true);
- const [error, setError] = useState();
- const locale = getCookie("NEXT_LOCALE") || "en";
- const t = useTranslations("pricing");
-
- useEffect(() => {
- const fetchPlans = async () => {
- try {
- const apiUrl = await getApiUrl();
- const access_token = session?.access_token;
- const response = await axios.get(`${apiUrl}/api/v1/payment/plans`, {
- headers: {
- Authorization: `Bearer ${access_token}`,
- ...(locale ? { "Accept-Language": locale } : {}),
- "ngrok-skip-browser-warning": "true",
- },
- });
- setPlans(response.data.data);
- } catch {
- setError("Failed to fetch billing plans");
- } finally {
- setLoading(false);
- }
- };
-
- fetchPlans();
- }, [session, locale]);
-
- return (
- <>
-
-
-
-
-
setToggle(1)}
- className={`flex h-[50px] w-[190px] cursor-pointer items-center justify-center rounded-md ${toggle === 1 ? "bg-white font-medium" : ""}`}
- data-testid="monthly-toggle"
- >
- {t("monthly")}
-
-
setToggle(2)}
- className={`flex h-[50px] w-[215px] cursor-pointer items-center justify-center rounded-md ${toggle === 2 ? "bg-white font-medium" : ""}`}
- data-testid="annual-toggle"
- >
- {t("annual")}
-
-
-
- {loading && (
-
- )}
-
- {!loading && plans?.length === 0 && (
-
- {t("billingPlansNotAvailable")}
-
- )}
-
- {!loading && !error && (
- <>
-
- {plans.map((plan) => (
-
-
- {plan.name}
-
-
- ${toggle === 1 ? plan.price : getAnnualPrice(plan.price)} /{" "}
- {toggle === 1 ? "month" : "year"}
-
-
- {plan.description}
-
- {plan.features.map((feature, index) => {
- return (
-
-
- {feature}
-
- );
- })}
-
-
-
- {t("features.continue")}
-
-
-
- ))}
-
- >
- )}
-
-
-
-
-
-
-
- {t("faqHeader")}
-
-
-
- {t("faqSubHeader")}
-
-
-
- {t("contactUs")}
-
-
-
-
-
-
-
- >
- );
-}
diff --git a/src/app/(landing-routes)/(home)/pricing/upgrade-plan/page.tsx b/src/app/(landing-routes)/(home)/pricing/upgrade-plan/page.tsx
deleted file mode 100644
index 432291c87..000000000
--- a/src/app/(landing-routes)/(home)/pricing/upgrade-plan/page.tsx
+++ /dev/null
@@ -1,13 +0,0 @@
-import { Suspense } from "react";
-
-import Upgrade from "./upgrade";
-
-function UpgradePage() {
- return (
-
-
-
- );
-}
-
-export default UpgradePage;
diff --git a/src/app/(landing-routes)/(home)/pricing/upgrade-plan/upgrade.tsx b/src/app/(landing-routes)/(home)/pricing/upgrade-plan/upgrade.tsx
deleted file mode 100644
index a86a2c369..000000000
--- a/src/app/(landing-routes)/(home)/pricing/upgrade-plan/upgrade.tsx
+++ /dev/null
@@ -1,241 +0,0 @@
-"use client";
-
-import axios from "axios";
-import { useSession } from "next-auth/react";
-import { useRouter, useSearchParams } from "next/navigation";
-import React, { useState } from "react";
-
-import { getApiUrl } from "~/actions/getApiUrl";
-import LoadingSpinner from "~/components/miscellaneous/loading-spinner";
-import { useToast } from "~/components/ui/use-toast";
-
-function Upgrade() {
- const router = useRouter();
- const { toast } = useToast();
- const [loading, setLoading] = useState(false);
- const [isCheckboxChecked, setIsCheckboxChecked] = useState(false);
- const searchParameters = useSearchParams();
- const price = searchParameters.get("price");
- const interval = searchParameters.get("interval");
- const planName = searchParameters.get("planName");
-
- const { data } = useSession();
-
- async function handleStripePayment() {
- try {
- setLoading(true);
- const apiUrl = await getApiUrl();
- const requestBody = {
- user_id: data?.user?.id,
- plan_name: planName,
- };
- const response = await axios.post(
- `${apiUrl}/api/v1/payment/stripe/upgrade-plan`,
- requestBody,
- {
- headers: {
- Authorization: `Bearer ${data?.access_token}`,
- "ngrok-skip-browser-warning": "true",
- },
- },
- );
- router.push(response.data.data.checkout_url);
- } catch {
- toast({
- title: "Stripe Payment Failed",
- description: "Something went wrong in the request",
- });
- } finally {
- toast({
- title: "Redirecting...",
- description: "Redirecting you to stripe payment gateway...",
- });
- setLoading(false);
- }
- }
-
- const handleCheckboxChange = (event: React.ChangeEvent) => {
- setIsCheckboxChecked(event.target.checked);
- };
-
- return (
- <>
-
-
-
-
-
Upgrade to {planName}
-
-
- Business Name (Optional)
-
-
-
-
-
-
-
-
-
- Pay with Stripe
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- By submitting this form, you confirm that you agree to our{" "}
- Terms of Service and{" "}
- Privacy Policy .
-
-
-
-
-
-
Order summary
-
Billing cycle:
-
-
-
- {interval}
-
-
${price}/m
-
-
-
- Subtotal
- ${price}.00/month
-
-
- Tax
- $0.00/month
-
-
-
- Total
- ${price}.00/month
-
-
- {loading ? (
-
- Processing {" "}
-
-
- ) : (
- "Confirm order"
- )}
-
-
-
-
-
- >
- );
-}
-
-export default Upgrade;
diff --git a/src/app/(landing-routes)/blog/[id]/RelatedArticle.tsx b/src/app/(landing-routes)/blog/[id]/RelatedArticle.tsx
deleted file mode 100644
index ce68d6e23..000000000
--- a/src/app/(landing-routes)/blog/[id]/RelatedArticle.tsx
+++ /dev/null
@@ -1,78 +0,0 @@
-import { useRouter } from "next/navigation";
-// import { blogPosts } from "../data/mock";
-import { useEffect, useState } from "react";
-
-import BlogCard from "~/components/layouts/BlogCards";
-
-export type New = {
- id: number;
- thumbnailUrl: string;
-};
-
-const RelatedArticle = () => {
- const router = useRouter();
- const [data, setData] = useState<
- {
- id: string;
- title: string;
- date: string;
- readTime: string;
- category: string;
- image: string;
- labelClassName: string;
- }[]
- >([]);
- const [isLoading, setIsLoading] = useState(true);
-
- useEffect(() => {
- const fetchData = async () => {
- try {
- setIsLoading(true);
- const response = await fetch(
- `https://staging.api-csharp.boilerplate.hng.tech/api/v1/blogs`,
- );
- const result = await response.json();
- setData(result.data);
- } finally {
- setIsLoading(false);
- }
- };
-
- fetchData();
- }, []);
-
- return (
- <>
-
-
- Related Articles
-
- {isLoading ? (
-
- Loading Related...
-
- ) : (
-
- {data?.slice(0, 3).map((post, index) => (
- {
- localStorage.setItem("currentBlogPost", JSON.stringify(post));
- router.push(`/blog/${post.id}`);
- }}
- />
- ))}
-
- )}
-
- >
- );
-};
-
-export default RelatedArticle;
diff --git a/src/app/(landing-routes)/blog/[id]/_components/BlogDetailsPage.tsx b/src/app/(landing-routes)/blog/[id]/_components/BlogDetailsPage.tsx
deleted file mode 100644
index e279dc2dd..000000000
--- a/src/app/(landing-routes)/blog/[id]/_components/BlogDetailsPage.tsx
+++ /dev/null
@@ -1,231 +0,0 @@
-"use client";
-
-import { MessageCircleMore, ThumbsUpIcon } from "lucide-react";
-import { Session } from "next-auth";
-import Image from "next/image";
-import Link from "next/link";
-import { FC, useEffect, useState } from "react";
-
-import { fetchBlogById } from "~/actions/blog";
-import Comment, {
- CommentProperties,
-} from "~/components/common/comment-component";
-import { sampleComments } from "~/components/common/comment-component/sample-comments";
-import BlogLabel from "../../_component/label";
-import RelatedArticle from "../RelatedArticle";
-
-const mockSession: Session = {
- user: {
- id: "12345",
- name: "Current User",
- first_name: "Current",
- last_name: "User",
- email: "user@example.com",
- image: "path/to/image",
- },
- access_token: "some-token",
- expires: "2100-01-01T00:00:00.000Z",
-};
-
-interface IProperties {
- id: string;
-}
-
-const BlogDetailsPage: FC = ({ id }) => {
- const [newComment, setNewComment] = useState("");
-
- const [comments, setComments] =
- useState[]>(sampleComments);
-
- const [isLoading, setIsLoading] = useState(true);
- const [post, setPost] = useState<{
- title: string;
- avatar: string;
- thumbnail: string;
- author: string;
- minsRead: string;
- datePublished: string;
- }>();
-
- useEffect(() => {
- const fetchData = async () => {
- try {
- setIsLoading(true);
- const response = await fetchBlogById(id);
- setPost(response.data);
- } finally {
- setIsLoading(false);
- }
- };
-
- fetchData();
- }, [id]);
-
- const handleSubmit = () => {
- if (newComment.trim()) {
- const comment: Omit = {
- id: (comments.length + 1).toString(),
- avatar: "",
- name: mockSession.user?.name || "Anonymous",
- username:
- mockSession.user?.name?.toLowerCase().replace(" ", "") || "anonymous",
- content: newComment,
- timestamp: new Date().toISOString(),
- likes: 0,
- dislikes: 0,
- };
- setComments([comment, ...comments]);
- setNewComment("");
- }
- };
-
- const handleKeyDown = (event_: React.KeyboardEvent) => {
- if (event_.key === "Enter" && !event_.shiftKey) {
- event_.preventDefault();
- handleSubmit();
- }
- };
- return (
- <>
- {isLoading ? (
- Loading Blog...
- ) : (
-
- {post ? (
-
-
-
-
-
-
-
- {post?.title}
-
-
-
-
-
-
-
- {post?.author as string}
-
-
-
- {post.minsRead} mins Read • {post.datePublished}
-
-
-
-
-
-
-
-
-
-
-
- Image: ENIAC computer was the first general-purpose
- electronic digital computer.
-
-
-
-
-
-
- “In the 1930s, John Atanasoff and Clifford Berry built
- the Atanasoff-Berry Computer (ABC), considered the first
- electronic digital computer, using vacuum tubes to perform
- calculations. “
-
-
-
- We often hear about the ENIAC, hailed as the first
- computer, but its story is just one thread in a rich
- tapestry woven by brilliant minds across generations. The
- true journey to the digital age is fascinating, filled
- with visionaries who dared to dream of machines that could
- think and calculate. In the 1830s, Charles Babbage
- conceived the Analytical Engine, a mechanical marvel that
- could perform complex calculations and even store data. It
- was a blueprint for the modern computer, with a central
- processing unit, memory, and input/output capabilities.
- Unfortunately, his vision was ahead of its time, and the
- Analytical Engine was never fully built due to funding
- constraints and the limitations of the technology at the
- time.
-
-
-
-
-
-
-
- ) : (
-
-
- Blog post not found
-
-
- )}
-
- )}
- >
- );
-};
-
-export default BlogDetailsPage;
diff --git a/src/app/(landing-routes)/blog/[id]/page.tsx b/src/app/(landing-routes)/blog/[id]/page.tsx
deleted file mode 100644
index 62f32593a..000000000
--- a/src/app/(landing-routes)/blog/[id]/page.tsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import BlogDetailsPage from "./_components/BlogDetailsPage";
-
-const page = ({ params }: { params: { id: string } }) => {
- return (
-
-
-
- );
-};
-
-export default page;
diff --git a/src/app/(landing-routes)/blog/_component/label.tsx b/src/app/(landing-routes)/blog/_component/label.tsx
deleted file mode 100644
index 72fac1e54..000000000
--- a/src/app/(landing-routes)/blog/_component/label.tsx
+++ /dev/null
@@ -1,15 +0,0 @@
-import { FC } from "react";
-
-interface IProperties {
- label: string;
-}
-const BlogLabel: FC = ({ label }) => {
- return (
-
-
- {label}
-
- );
-};
-
-export default BlogLabel;
diff --git a/src/app/(landing-routes)/blog/comments/page.tsx b/src/app/(landing-routes)/blog/comments/page.tsx
deleted file mode 100644
index 669d30c3d..000000000
--- a/src/app/(landing-routes)/blog/comments/page.tsx
+++ /dev/null
@@ -1,36 +0,0 @@
-import { Session } from "next-auth";
-
-import Comment from "~/components/common/comment-component";
-import { sampleComments } from "~/components/common/comment-component/sample-comments";
-
-const CommentPage = () => {
- const mockSession: Session = {
- user: {
- id: "12345",
- name: "Current User",
- first_name: "Current",
- last_name: "User",
- email: "user@example.com",
- image: "path/to/image",
- },
- access_token: "some-token",
- expires: "1",
- };
- return (
-
-
-
Comments
- {sampleComments.map((comment) => (
-
- ))}
-
-
- );
-};
-
-export default CommentPage;
diff --git a/src/app/(landing-routes)/blog/data/dummy-article-data.ts b/src/app/(landing-routes)/blog/data/dummy-article-data.ts
deleted file mode 100644
index fbc9f57e0..000000000
--- a/src/app/(landing-routes)/blog/data/dummy-article-data.ts
+++ /dev/null
@@ -1,78 +0,0 @@
-interface ArtileDataProperties {
- title: string;
- content: string;
- author: string;
- tag: string;
- avatar: string;
- minsRead: string;
- datePublished: string;
- thumbnail: string;
- id: string;
-}
-
-export const articlesData: ArtileDataProperties[] = [
- {
- title: "5 Mistakes That Kill Your Start-up Before It Takes Off",
- content:
- "We often hear about the ENIAC, hailed as the first computer, but its story is just one thread in a rich tapestry woven by brilliant",
- author: "Nora Nora",
- minsRead: "7 mins Read",
- datePublished: "July 12, 2024",
- avatar: "/images/latest-articles/avatar.png",
- tag: "BUSINESS",
- thumbnail: "/images/latest-articles/post-1.png",
- id: "1",
- },
-
- {
- title: "5 Mistakes That Kill Your Start-up Before It Takes Off",
- content:
- "We often hear about the ENIAC, hailed as the first computer, but its story is just one thread in a rich tapestry woven by brilliant",
- author: "Nora Nora",
- minsRead: "7 mins Read",
- datePublished: "July 12, 2024",
- avatar: "/images/latest-articles/avatar.png",
- tag: "BUSINESS",
- thumbnail: "/images/latest-articles/post-2.png",
- id: "2",
- },
-
- {
- title: "5 Mistakes That Kill Your Start-up Before It Takes Off",
- content:
- "We often hear about the ENIAC, hailed as the first computer, but its story is just one thread in a rich tapestry woven by brilliant",
- author: "Nora Nora",
- minsRead: "7 mins Read",
- datePublished: "July 12, 2024",
- avatar: "/images/latest-articles/avatar.png",
- tag: "BUSINESS",
- thumbnail: "/images/latest-articles/post-3.png",
- id: "3",
- },
-
- {
- title: "5 Mistakes That Kill Your Start-up Before It Takes Off",
- content:
- "We often hear about the ENIAC, hailed as the first computer, but its story is just one thread in a rich tapestry woven by brilliant",
- author: "Nora Nora",
- minsRead: "7 mins Read",
- datePublished: "July 12, 2024",
- avatar: "/images/latest-articles/avatar.png",
- tag: "BUSINESS",
- thumbnail: "/images/latest-articles/post-4.png",
- id: "4",
- },
-
- {
- title: "5 Mistakes That Kill Your Start-up Before It Takes Off",
- content:
- "We often hear about the ENIAC, hailed as the first computer, but its story is just one thread in a rich tapestry woven by brilliant",
- author: "Nora Nora",
- minsRead: "7 mins Read",
- datePublished: "July 12, 2024",
- avatar: "/images/latest-articles/avatar.png",
- tag: "BUSINESS",
- thumbnail: "/images/latest-articles/post-5.png",
- id: "5",
- },
-];
diff --git a/src/app/(landing-routes)/blog/data/mock.ts b/src/app/(landing-routes)/blog/data/mock.ts
deleted file mode 100644
index 43ce9f437..000000000
--- a/src/app/(landing-routes)/blog/data/mock.ts
+++ /dev/null
@@ -1,65 +0,0 @@
-import {
- blogCard1,
- blogCard2,
- blogCard3,
- blogCard4,
- blogCard5,
- blogCard6,
-} from "../../../../../public/images/blogPage/utils";
-
-export const blogPosts = [
- {
- id: "1",
- title: "The Power of Networking: How to Build Meaningful Connections",
- date: "Jul 12, 2024",
- readTime: "5",
- category: "Business",
- image: blogCard1,
- labelClassName: "bg-primary",
- },
- {
- id: "2",
- title: "The Global Impact of Climate Change: A Look at the Evidence",
- date: "Jul 12, 2024",
- readTime: "5",
- category: "World News",
- image: blogCard2,
- labelClassName: "bg-warning",
- },
- {
- id: "3",
- title: "5 Easy and Delicious Recipes for Busy Weeknights",
- date: "Jul 12, 2024",
- readTime: "5",
- category: "Food",
- image: blogCard3,
- labelClassName: "bg-success",
- },
- {
- id: "4",
- title: "5 Simple Habits to Improve Your Mental Wellbeing",
- date: "Jul 12, 2024",
- readTime: "5",
- category: "Lifestyle",
- image: blogCard4,
- labelClassName: "bg-primary",
- },
- {
- id: "5",
- title: "The Ultimate Guide to Dressing Stylishly with Fewer Clothes",
- date: "Jul 12, 2024",
- readTime: "5",
- category: "Fashion",
- image: blogCard5,
- labelClassName: "bg-success",
- },
- {
- id: "6",
- title: "The Future of Travel: What Will the World Look Like in 2030?",
- date: "Jul 12, 2024",
- readTime: "5",
- category: "World News",
- image: blogCard6,
- labelClassName: "bg-warning",
- },
-];
diff --git a/src/app/(landing-routes)/blog/latest/errorboundry.tsx b/src/app/(landing-routes)/blog/latest/errorboundry.tsx
deleted file mode 100644
index f7c7dbf31..000000000
--- a/src/app/(landing-routes)/blog/latest/errorboundry.tsx
+++ /dev/null
@@ -1,39 +0,0 @@
-import { Component, ReactNode } from "react";
-
-interface ErrorBoundaryProperties {
- children: ReactNode;
-}
-
-interface ErrorBoundaryState {
- hasError: boolean;
-}
-
-class ErrorBoundary extends Component<
- ErrorBoundaryProperties,
- ErrorBoundaryState
-> {
- constructor(properties: ErrorBoundaryProperties) {
- super(properties);
- this.state = { hasError: false };
- }
-
- // static getDerivedStateFromError(_: Error): ErrorBoundaryState {
- // return { hasError: true };
- // }
-
- // componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {
- // // Log the error to an error reporting service or console
- // // console.error("Uncaught error:", error, errorInfo);
- // }
-
- render() {
- if (this.state.hasError) {
- // Render any custom fallback UI
- return Something went wrong. ;
- }
-
- return this.props.children;
- }
-}
-
-export default ErrorBoundary;
diff --git a/src/app/(landing-routes)/blog/latest/page.tsx b/src/app/(landing-routes)/blog/latest/page.tsx
deleted file mode 100644
index f696e51b9..000000000
--- a/src/app/(landing-routes)/blog/latest/page.tsx
+++ /dev/null
@@ -1,67 +0,0 @@
-import BlogCard from "~/components/common/blogCard/BlogCard";
-import CustomButton from "~/components/common/common-button/common-button";
-import { articlesData } from "../data/dummy-article-data";
-
-const LatestArticlesPage = () => {
- const isTesting: boolean = process.env.NEXT_PUBLIC_TESTING === "true";
-
- return (
- <>
-
-
- Latest Articles
-
-
- {!isTesting &&
- articlesData.map((data, index) => {
- const {
- author,
- avatar,
- content,
- datePublished,
- minsRead,
- tag,
- thumbnail,
- title,
- } = data;
-
- return (
-
-
-
- );
- })}
-
-
-
-
- >
- );
-};
-
-export default LatestArticlesPage;
diff --git a/src/app/(landing-routes)/blog/page.test.tsx b/src/app/(landing-routes)/blog/page.test.tsx
deleted file mode 100644
index 779e4fd0e..000000000
--- a/src/app/(landing-routes)/blog/page.test.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import { render } from "~/test/utils";
-import CommentPage from "./comments/page";
-
-describe("page tests", () => {
- it("should render correctly", () => {
- expect.assertions(1);
-
- render( );
-
- expect(true).toBeTruthy();
- });
-});
diff --git a/src/app/(landing-routes)/blog/page.tsx b/src/app/(landing-routes)/blog/page.tsx
deleted file mode 100644
index 1a41ee77c..000000000
--- a/src/app/(landing-routes)/blog/page.tsx
+++ /dev/null
@@ -1,171 +0,0 @@
-"use client";
-
-import axios from "axios";
-import { useSession } from "next-auth/react";
-import { useRouter } from "next/navigation";
-import { useEffect, useState } from "react";
-
-import { getApiUrl } from "~/actions/getApiUrl";
-import CustomButton from "~/components/common/common-button/common-button";
-import HeroSection from "~/components/extDynamicPages/blogCollection/BlogPageHero";
-import BlogCard from "~/components/layouts/BlogCards";
-import {
- Pagination,
- PaginationContent,
- PaginationItem,
- PaginationLink,
- PaginationNext,
- PaginationPrevious,
-} from "~/components/ui/pagination";
-import { useToast } from "~/components/ui/use-toast";
-
-const BlogHome = () => {
- const [isLoading, setIsLoading] = useState(true);
- const [data, setData] = useState<
- {
- id: string;
- title: string;
- date: string;
- readTime: string;
- category: string;
- image: string;
- labelClassName: string;
- }[]
- >([]);
- const [page, setPage] = useState(1);
- const router = useRouter();
- const { toast } = useToast();
- const { data: session } = useSession();
- const [, setBlogPost] = useState("");
-
- useEffect(() => {
- async function fetchBlog() {
- try {
- const apiUrl = await getApiUrl();
- const token = session?.access_token;
- const response = await axios.get(`${apiUrl}/api/v1/blogs`, {
- headers: {
- Authorization: `Bearer: ${token}`,
- },
- });
- const data = response.data;
- setData(response.data);
- setBlogPost(data);
- toast({
- title:
- Array.isArray(data.data) && data.data.length === 0
- ? "No Blog Post Available"
- : "Blog Posts Retrieved",
- description:
- Array.isArray(data.data) && data.data.length === 0
- ? "Blog posts are empty"
- : "Blog posts retrieved successfully",
- variant:
- Array.isArray(data.data) && data.data.length === 0
- ? "destructive"
- : "default",
- });
- } catch (error) {
- toast({
- title: "Error occured",
- description:
- error instanceof Error
- ? error.message
- : "An unknown error occurred",
- variant: "destructive",
- });
- } finally {
- setIsLoading(false);
- }
- }
- fetchBlog();
- }, [session?.access_token, toast]);
-
- return (
-
-
-
-
- Recent Blog Posts
-
- {isLoading ? (
-
- Loading Blogs...
-
- ) : (
-
- {data?.map((post, index) => (
- {
- localStorage.setItem("currentBlogPost", JSON.stringify(post));
- router.push(`/blog/${post.id}`);
- }}
- />
- ))}
-
- )}
-
-
-
- Show More Articles
-
-
-
-
-
- setPage((a) => (a > 1 ? a - 1 : a))}
- />
-
- {Array.from({ length: Math.ceil(data?.length / 6) }, (link, id) => (
-
- setPage(id + 1)}
- >
- {id + 1}
-
-
- ))}
-
-
- setPage((a) => (a < Math.ceil(data?.length / 6) ? a + 1 : a))
- }
- />
-
-
-
-
- );
-};
-
-export default BlogHome;
diff --git a/src/app/(landing-routes)/career/Nojobs.tsx b/src/app/(landing-routes)/career/Nojobs.tsx
deleted file mode 100644
index 942607a93..000000000
--- a/src/app/(landing-routes)/career/Nojobs.tsx
+++ /dev/null
@@ -1,176 +0,0 @@
-"use client";
-
-import axios from "axios";
-import { useTranslations } from "next-intl";
-import Image from "next/image";
-import { useState } from "react";
-
-import { getApiUrl } from "~/actions/getApiUrl";
-import CustomButton from "~/components/common/common-button/common-button";
-import { Input } from "~/components/common/input";
-import LoadingSpinner from "~/components/miscellaneous/loading-spinner";
-import {
- Dialog,
- DialogContent,
- DialogDescription,
- DialogHeader,
- DialogTitle,
- DialogTrigger,
-} from "~/components/ui/dialog";
-import { useToast } from "~/components/ui/use-toast";
-import noJob from "../../../../public/images/career/noJob.svg";
-
-function Nojobs() {
- const [loading, setLoading] = useState(false);
- const [email, setEmail] = useState("");
- const [error, setError] = useState(false);
- const [isSubscribed, setIsSubscribed] = useState(false);
- const { toast } = useToast();
-
- const t = useTranslations("noJobs");
-
- const locale = localStorage.getItem("preferredLanguage");
- const toastDesc =
- locale === "fr"
- ? "Veuillez fournir votre e-mail"
- : locale === "es"
- ? "Por favor, proporcione su correo electrónico"
- : "Please provide a valid email";
-
- const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
- const isValidEmail = (email: string): boolean => emailRegex.test(email);
- const [isOpen, setIsOpen] = useState(false);
-
- const handleSubmit = async () => {
- if (!isValidEmail(email)) {
- setError(true);
-
- toast({
- title: "Error",
- description: toastDesc,
- variant: "destructive",
- });
- return;
- }
- setLoading(true);
-
- const apiUrl = await getApiUrl();
- await axios
- .post(
- `${apiUrl}/api/v1/newsletter-subscription`,
- { email },
- {
- headers: {
- "Content-Type": "application/json",
- },
- },
- )
- .then(() => {
- toast({
- title: "Thank you for subscribing!",
- description:
- "You've successfully joined our newsletter. We're excited to keep you updated with our latest news and offers!",
- variant: "default",
- });
- setIsOpen(false);
- setLoading(false);
- setEmail("");
- setIsSubscribed(true);
- })
- .catch((error) => {
- if (error?.response) {
- const errorData = error.response.data;
- if (errorData.status_code === 400) {
- toast({
- title: "You're already subscribed!",
- description:
- "It looks like you're already on our list. Thank you for being part of our community!",
- variant: "default",
- });
- } else {
- toast({
- title: "Oops! Something went wrong.",
- description:
- "We encountered an issue while trying to subscribe you to our newsletter. Check your internet connection or contact support if the problem persists.",
- variant: "destructive",
- });
- setLoading(false);
- }
- setLoading(false);
- return;
- }
- })
- .finally(() => {
- setLoading(false);
- });
- };
-
- return (
-
-
-
-
-
-
- {t("noJobsTitle")}
-
-
- {isSubscribed ? t("subscribed") : t("noJobsContent")}
-
-
- {!isSubscribed && (
-
-
-
-
- {t("button")}
-
-
-
-
-
-
- {t("modalTitle")}
- {t("noJobsContent")}
-
-
-
-
-
- setEmail(event.target.value)}
- value={email}
- onBlur={() =>
- email.length === 0 ? setError(true) : setError(false)
- }
- />
-
-
- {loading ? (
-
- ) : (
- t("modalButton")
- )}
-
-
- {error && (
-
- {t("error")}
-
- )}
-
-
-
- )}
-
- );
-}
-
-export default Nojobs;
diff --git a/src/app/(landing-routes)/career/[slug]/page.tsx b/src/app/(landing-routes)/career/[slug]/page.tsx
deleted file mode 100644
index 4e8f00a9f..000000000
--- a/src/app/(landing-routes)/career/[slug]/page.tsx
+++ /dev/null
@@ -1,236 +0,0 @@
-"use client";
-
-import { Plus } from "lucide-react";
-import moment from "moment";
-import Link from "next/link";
-import { useSearchParams } from "next/navigation";
-import { useEffect, useState } from "react";
-
-import { Breadcrumb } from "~/components/common/breadcrumb";
-import CustomButton from "~/components/common/common-button/common-button";
-
-const JobDetails = () => {
- const [isSmallScreen, setIsSmallScreen] = useState(false);
- const searchParameters = useSearchParams();
-
- const title: string | null = searchParameters.get("title");
- const description: string | null = searchParameters.get("description");
- const amount: string | null = searchParameters.get("amount");
- const jobtype: string | null = searchParameters.get("job_type");
- const jobmode: string | null = searchParameters.get("job_mode");
- const deadline: string | null = searchParameters.get("deadline");
-
- useEffect(() => {
- const handleResize = () => {
- setIsSmallScreen(window.innerWidth < 768);
- };
- handleResize();
- window.addEventListener("resize", handleResize);
- return () => window.removeEventListener("resize", handleResize);
- }, []);
- const pages = isSmallScreen
- ? [
- { name: "Career", href: "/career" },
- {
- name: "Job Details",
- href: "/career/2",
- isCurrent: true,
- style: { color: "hsl(25, 95%, 53%)" },
- },
- ]
- : [
- { name: "Home", href: "/" },
- { name: "Job Listings", href: "/career" },
- {
- name: "Job Details",
- href: "/career/2",
- isCurrent: true,
- },
- ];
- const mailtoLink = "mailto:hng123@gmail.com";
-
- return (
-
-
-
-
-
-
-
- {title}
-
-
-
-
- Job Description
-
-
- {description}You will collaborate closely with
- cross-functional teams, including product managers, engineers,
- and marketers, to create intuitive and aesthetically pleasing
- designs that meet user needs and business goals.
-
-
-
-
- Key Responsibilities
-
-
-
- Conduct user research and gather insights to inform design
- decisions
-
-
- Create wireframes, prototypes, and high-fidelity mockups for
- new features and product enhancements
-
-
- Collaborate with the product team to define design
- requirements and ensure alignment with business objectives
-
-
- Develop and maintain design systems to ensure consistency
- across all products
-
-
- Conduct usability testing and iterate on designs based on
- user feedback
-
-
- Stay up-to-date with industry trends and best practices in
- design and user experience
-
-
-
-
-
- Qualifications
-
-
-
- Bachelor's degree in Design, Human-Computer
- Interaction, or a related field
-
-
- 3+ years of experience in product design or a similar role
-
-
- Proficiency in design tools such as Figma, Sketch, Adobe XD,
- or similar
-
-
- Strong portfolio showcasing your design process,
- problem-solving skills, and final products
-
-
- Excellent communication and collaboration skills
-
-
- Ability to think critically and solve complex design
- challenges
-
-
- Knowledge of HTML, CSS, and JavaScript is a plus
-
-
-
-
-
-
-
-
-
- About the job
-
-
-
-
- Deadline
-
-
- {moment(deadline).format("ll")}
-
-
-
-
-
- Work mode
-
-
{jobmode}
-
-
-
-
- Job-type
-
-
{jobtype}
-
-
-
-
- Experience level
-
-
2-3years
-
-
-
-
- Salary
-
-
{amount}
-
-
-
-
-
- What we offer
-
-
-
- Competitive salary and benefits
-
-
- Flexible working hours and remote work options
-
-
- Opportunities for professional growth and development
-
-
- A collaborative and inclusive work environment
-
-
-
-
-
- How to Apply
-
-
-
- Send your CV and cover letter to this email{" "}
-
- hng123@gmail.com
-
-
-
-
-
-
-
-
- }
- isLeftIconVisible={isSmallScreen}
- isDisabled={false}
- className={`h-[50px] w-[250px] hover:bg-destructive`}
- >
- Apply Now
-
-
-
-
- );
-};
-
-export default JobDetails;
diff --git a/src/app/(landing-routes)/career/page.test.tsx b/src/app/(landing-routes)/career/page.test.tsx
deleted file mode 100644
index 35fd69869..000000000
--- a/src/app/(landing-routes)/career/page.test.tsx
+++ /dev/null
@@ -1,13 +0,0 @@
-import { renderWithIntl } from "~/test/utils";
-import Page from "./page";
-
-describe("page tests", () => {
- // eslint-disable-next-line vitest/no-disabled-tests
- it.skip("should render correctly", () => {
- expect.assertions(1);
-
- renderWithIntl( );
-
- expect(true).toBeTruthy();
- });
-});
diff --git a/src/app/(landing-routes)/career/page.tsx b/src/app/(landing-routes)/career/page.tsx
deleted file mode 100644
index 08e127bff..000000000
--- a/src/app/(landing-routes)/career/page.tsx
+++ /dev/null
@@ -1,136 +0,0 @@
-"use client";
-
-import axios from "axios";
-import { getCookie } from "cookies-next";
-import { useRouter } from "next/navigation";
-import { useEffect, useState } from "react";
-
-import { getApiUrl } from "~/actions/getApiUrl";
-import CareerCardParent from "~/components/common/CareerCard";
-import { Job } from "~/components/common/CareerCard/Jobs";
-import Heading from "~/components/layouts/heading";
-import Pagination from "~/components/layouts/pagination/Pagination";
-import JobSkeleton from "~/components/skeleton/jobskeleton";
-import { useToast } from "~/components/ui/use-toast";
-import Nojobs from "./Nojobs";
-
-export default function Career() {
- const [allJobs, setAllJobs] = useState([]);
- const [displayedJobs, setDisplayedJobs] = useState([]);
- const [loading, setLoading] = useState(true);
- const [currentPage, setCurrentPage] = useState(1);
- const pageSize = 6;
- const router = useRouter();
- const { toast } = useToast();
- const locale = getCookie("NEXT_LOCALE") || "en";
-
- useEffect(() => {
- const fetchCarrers = async () => {
- try {
- const apiUrl = await getApiUrl();
- const response = await axios.get(`${apiUrl}/api/v1/jobs`, {
- headers: {
- ...(locale ? { "Accept-Language": locale } : {}),
- },
- });
- setAllJobs(response.data.data);
- } catch {
- toast({
- title: "Error",
- description: "Failed to fetch Jobs",
- variant: "destructive",
- });
- } finally {
- setLoading(false);
- }
- };
-
- fetchCarrers();
- }, [locale, toast]);
-
- useEffect(() => {
- // Calculate the jobs to display based on the current page
- const startIndex = (currentPage - 1) * pageSize;
- const newDisplayedJobs = allJobs.slice(startIndex, startIndex + pageSize);
- setDisplayedJobs(newDisplayedJobs);
- }, [allJobs, currentPage]);
-
- const handleViewDetails = (job: Job) => {
- const parameters = new URLSearchParams({
- id: job.id.toString(),
- title: job.title,
- company: job.company_name,
- location: job.location,
- description: job.description,
- amount: job.salary_range,
- job_type: job.job_type,
- job_mode: job.job_mode,
- deadline: job.deadline,
- });
- router.push(`/career/details?${parameters.toString()}`);
- };
-
- return (
-
-
-
-
- {loading ? (
-
- ) : (
-
- {displayedJobs.map((job) => (
- handleViewDetails(job)}
- />
- ))}
-
- )}
-
-
-
- {!loading && allJobs?.length === 0 && }
-
-
-
- {displayedJobs.length > 0 &&
- `Showing ${(currentPage - 1) * pageSize + displayedJobs.length} of ${allJobs.length}`}
-
-
-
- {allJobs?.length > pageSize && (
-
setCurrentPage(page)}
- />
- )}
-
-
- );
-}
diff --git a/src/app/(landing-routes)/contact-us/constants.tsx b/src/app/(landing-routes)/contact-us/constants.tsx
deleted file mode 100644
index ea0baf1f4..000000000
--- a/src/app/(landing-routes)/contact-us/constants.tsx
+++ /dev/null
@@ -1,26 +0,0 @@
-import {
- Instagram,
- Linkedin,
- Mail,
- MapPin,
- Phone,
- Twitter,
-} from "lucide-react";
-
-export const bizTime = ["8am", "6pm"];
-export const contactInfo = [
- {
- alt: "map icon",
- Icon: MapPin,
- text: "10111, hornchurch, london, United kingdom",
- },
- { alt: "phone icon", Icon: Phone, text: "+4403989898787" },
- { alt: "mail icon", Icon: Mail, text: "Email: supportteam@gmail.com" },
- { alt: "twitter icon", Icon: Twitter, text: "Twitter @boilerplate23" },
- {
- alt: "instagram icon",
- Icon: Instagram,
- text: "Instagram @boilerplate234",
- },
- { alt: "linkedin icon", Icon: Linkedin, text: "Linkedin @boilerplate34" },
-];
diff --git a/src/app/(landing-routes)/contact-us/page.test.tsx b/src/app/(landing-routes)/contact-us/page.test.tsx
deleted file mode 100644
index 5c4112890..000000000
--- a/src/app/(landing-routes)/contact-us/page.test.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-import { SessionProvider } from "next-auth/react";
-import { ReactNode } from "react";
-
-import { render } from "~/test/utils";
-import Page from "./page";
-
-describe("page tests", () => {
- const renderWithSession = (component: ReactNode) => {
- return render(
- {component} ,
- );
- };
- it("should render correctly", () => {
- expect.assertions(1);
-
- renderWithSession( );
-
- expect(true).toBeTruthy();
- });
-});
diff --git a/src/app/(landing-routes)/contact-us/page.tsx b/src/app/(landing-routes)/contact-us/page.tsx
deleted file mode 100644
index 1cc7ac903..000000000
--- a/src/app/(landing-routes)/contact-us/page.tsx
+++ /dev/null
@@ -1,63 +0,0 @@
-import { ArrowRight } from "lucide-react";
-
-import ContactForm from "~/components/common/contact-us-form";
-import { bizTime, contactInfo } from "./constants";
-
-const Contact = () => {
- return (
-
-
-
-
Contact Our Team
-
- Let's Build Your Product Together
-
-
- Achieve your dreams with us today
-
-
-
-
-
-
-
United Kingdom
-
- Business hours : {bizTime[0]} - {bizTime[1]}
-
-
- {contactInfo.map((info) => (
-
-
-
-
-
- {info.text}
-
-
- ))}
-
-
-
-
-
- See and get answers to the most frequent asked questions
-
-
-
-
-
-
- );
-};
-
-export default Contact;
diff --git a/src/app/(landing-routes)/faqs/inquiries-form/AdditionalInquiriesForm.tsx b/src/app/(landing-routes)/faqs/inquiries-form/AdditionalInquiriesForm.tsx
deleted file mode 100644
index 38cf3def7..000000000
--- a/src/app/(landing-routes)/faqs/inquiries-form/AdditionalInquiriesForm.tsx
+++ /dev/null
@@ -1,146 +0,0 @@
-"use client";
-
-import { zodResolver } from "@hookform/resolvers/zod";
-import { useState } from "react";
-import { useForm } from "react-hook-form";
-import { z } from "zod";
-
-import { Button } from "~/components/ui/button";
-import {
- Form,
- FormControl,
- FormField,
- FormItem,
- FormLabel,
-} from "~/components/ui/form";
-import { Input } from "~/components/ui/input";
-import { Textarea } from "~/components/ui/textarea";
-import FormSchema from "./formSchema";
-import { FormResponse, submitForm } from "./formSubmitHelper";
-
-export default function AdditionalInquiriesForm() {
- const form = useForm>({
- resolver: zodResolver(FormSchema),
- defaultValues: {
- email: "",
- name: "",
- message: "",
- },
- });
-
- const { handleSubmit } = form;
-
- const [successMessage, setSuccessMessage] = useState("");
- const [errorMessage, setErrorMessage] = useState("");
-
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
- async function onSubmit(_values: z.infer) {
- const response: FormResponse = await submitForm();
-
- if (response.success) {
- setSuccessMessage(response.message);
- setErrorMessage("");
- form.reset();
- } else {
- setErrorMessage(response.message);
- setSuccessMessage("");
- form.reset();
- }
- }
-
- return (
-
-
-
- Still have questions?
-
-
- Fill the form and enter your message
-
-
-
-
-
- );
-}
diff --git a/src/app/(landing-routes)/faqs/inquiries-form/additionalInquiriesForm.test.tsx b/src/app/(landing-routes)/faqs/inquiries-form/additionalInquiriesForm.test.tsx
deleted file mode 100644
index f650239cf..000000000
--- a/src/app/(landing-routes)/faqs/inquiries-form/additionalInquiriesForm.test.tsx
+++ /dev/null
@@ -1,103 +0,0 @@
-import { fireEvent, render, screen, waitFor } from "@testing-library/react";
-import { beforeEach, describe, expect, it, vi } from "vitest";
-
-import AdditionalInquiriesForm from "./AdditionalInquiriesForm";
-import * as formSubmitHelper from "./formSubmitHelper";
-
-describe("additionalQuestionsForm Tests", () => {
- beforeEach(() => {
- // Clear mocks if any
- vi.clearAllMocks();
- });
-
- it("should display error messages for empty required fields", async () => {
- expect.assertions(3);
- render( );
- const submitButton = screen.getByRole("button", { name: /submit/i });
-
- fireEvent.click(submitButton);
-
- await waitFor(() => {
- expect(screen.getByText(/name is required/i)).toBeInTheDocument();
- // eslint-disable-next-line testing-library/no-wait-for-multiple-assertions
- expect(screen.getByText(/email is required/i)).toBeInTheDocument();
- // eslint-disable-next-line testing-library/no-wait-for-multiple-assertions
- expect(screen.getByText(/message is required/i)).toBeInTheDocument();
- });
- });
-
- it("should display error message for invalid email", async () => {
- expect.assertions(1);
- render( );
- const emailInput = screen.getByLabelText(/email/i);
- const submitButton = screen.getByRole("button", { name: /submit/i });
-
- fireEvent.change(emailInput, { target: { value: "invalid-email" } });
- fireEvent.click(submitButton);
-
- const errorMessage = await screen.findByText(/email is invalid/i);
- expect(errorMessage).toBeInTheDocument();
- });
-
- it("should display success message on successful form submission", async () => {
- expect.hasAssertions();
- // Mock the submitForm function to return a successful response
- vi.spyOn(formSubmitHelper, "submitForm").mockResolvedValue({
- success: true,
- message: "Your question has been submitted successfully",
- });
-
- expect.assertions(1);
- render( );
- const nameInput = screen.getByLabelText(/name/i);
- const emailInput = screen.getByLabelText(/email/i);
- const messageInput = screen.getByLabelText(/message/i);
- const submitButton = screen.getByRole("button", { name: /submit/i });
-
- fireEvent.change(nameInput, { target: { value: "John Doe" } });
- fireEvent.change(emailInput, { target: { value: "john.doe@example.com" } });
- fireEvent.change(messageInput, {
- target: { value: "This is a test message" },
- });
-
- fireEvent.click(submitButton);
-
- await waitFor(() => {
- const successMessage = screen.getByText(
- "Your question has been submitted successfully",
- );
- expect(successMessage).toBeInTheDocument();
- });
- });
-
- it("should display error message on failed form submission", async () => {
- expect.hasAssertions();
- // Mock the submitForm function to return a failed response
- vi.spyOn(formSubmitHelper, "submitForm").mockResolvedValue({
- success: false,
- message: "There was an error submitting your question. Please try again.",
- });
-
- expect.assertions(1);
- render( );
- const nameInput = screen.getByLabelText(/name/i);
- const emailInput = screen.getByLabelText(/email/i);
- const messageInput = screen.getByLabelText(/message/i);
- const submitButton = screen.getByRole("button", { name: /submit/i });
-
- fireEvent.change(nameInput, { target: { value: "John Doe" } });
- fireEvent.change(emailInput, { target: { value: "john.doe@example.com" } });
- fireEvent.change(messageInput, {
- target: { value: "This is a test message" },
- });
-
- fireEvent.click(submitButton);
-
- await waitFor(() => {
- const errorMessage = screen.getByText(
- "There was an error submitting your question. Please try again.",
- );
- expect(errorMessage).toBeInTheDocument();
- });
- });
-});
diff --git a/src/app/(landing-routes)/faqs/inquiries-form/formSchema.ts b/src/app/(landing-routes)/faqs/inquiries-form/formSchema.ts
deleted file mode 100644
index 93ce6a2df..000000000
--- a/src/app/(landing-routes)/faqs/inquiries-form/formSchema.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { z } from "zod";
-
-const FormSchema = z.object({
- email: z
- .string()
- .min(1, { message: "Email is required" })
- .email({ message: "Email is invalid" }),
- name: z.string().min(1, { message: "Name is required" }),
- message: z.string().min(1, { message: "Message is required" }),
-});
-
-export default FormSchema;
diff --git a/src/app/(landing-routes)/faqs/inquiries-form/formSubmitHelper.ts b/src/app/(landing-routes)/faqs/inquiries-form/formSubmitHelper.ts
deleted file mode 100644
index 8d9ad14a9..000000000
--- a/src/app/(landing-routes)/faqs/inquiries-form/formSubmitHelper.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-export interface FormResponse {
- success: boolean;
- message: string;
-}
-
-export async function submitForm(): Promise {
- const dummyData = [
- {
- success: true,
- message: "Your question has been submitted successfully",
- },
- {
- success: false,
- message: "There was an error submitting your question. Please try again.",
- },
- ];
-
- // Simulate a delay to mimic an actual network request
- await new Promise((resolve) => setTimeout(resolve, 1000));
-
- // Randomly pick success or error for demonstration
- return dummyData[Math.floor(Math.random() * dummyData.length)];
-}
diff --git a/src/app/(landing-routes)/faqs/page.tsx b/src/app/(landing-routes)/faqs/page.tsx
index 6deba9f12..78ae7b1ae 100644
--- a/src/app/(landing-routes)/faqs/page.tsx
+++ b/src/app/(landing-routes)/faqs/page.tsx
@@ -1,70 +1,8 @@
-"use client";
-
-import { useEffect, useState } from "react";
-
-import { getFaqs } from "~/actions/externalPages";
-import FaqAccordion from "~/components/layouts/accordion/FaqAccordion";
-import Heading from "~/components/layouts/heading";
-import FaqSkeleton from "~/components/skeleton/faqskeleton";
-import AdditionalInquiriesForm from "./inquiries-form/AdditionalInquiriesForm";
-
-// Define a type for the FAQ items
-interface FaqItem {
- id: number;
- question: string;
- answer: string;
-}
+import React from 'react'
+import FaqPage from '~/components/faq/faqpage'
const Faq = () => {
- const [faqs, setFaqs] = useState([]);
- const [loading, setLoading] = useState(true);
-
- // Get FAQs
- useEffect(() => {
- const fetchFaqs = async () => {
- const result = await getFaqs();
- if (result && (result.status === 200 || result.status === 201)) {
- setFaqs(result.data.data);
- } else {
- setFaqs([]);
- }
-
- setLoading(false);
- };
- fetchFaqs();
- }, []);
-
- return (
-
-
-
-
-
- {loading ? (
-
- ) : (
- <>
- {faqs?.length === 0 ? (
-
No results found.
- ) : (
-
- )}
- >
- )}
-
-
-
-
-
- );
-};
+ return
+}
-export default Faq;
+export default Faq
diff --git a/src/app/(landing-routes)/help-center/page.test.tsx b/src/app/(landing-routes)/help-center/page.test.tsx
deleted file mode 100644
index 39da3cfb1..000000000
--- a/src/app/(landing-routes)/help-center/page.test.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import { renderWithIntl } from "~/test/utils";
-import Page from "./page";
-
-describe("page tests", () => {
- it("should render correctly", () => {
- expect.assertions(1);
-
- renderWithIntl( );
-
- expect(true).toBeTruthy();
- });
-});
diff --git a/src/app/(landing-routes)/help-center/page.tsx b/src/app/(landing-routes)/help-center/page.tsx
deleted file mode 100644
index 768041179..000000000
--- a/src/app/(landing-routes)/help-center/page.tsx
+++ /dev/null
@@ -1,145 +0,0 @@
-"use client";
-
-import axios from "axios";
-import { Search } from "lucide-react";
-import Link from "next/link";
-import { ChangeEvent, useEffect, useState } from "react";
-
-import { getApiUrl } from "~/actions/getApiUrl";
-import { Input } from "~/components/common/input";
-import FaqAccordion from "~/components/layouts/accordion/FaqsAccordion";
-import TopicsAccordions from "~/components/layouts/accordion/TopicAccordion";
-import Heading from "~/components/layouts/heading";
-import HelpCenterSkeleton from "~/components/skeleton/helpcenterskeleton";
-import { useToast } from "~/components/ui/use-toast";
-import { faqData } from "~/constants/faqsdata";
-
-interface Topic {
- id: string;
- title: string;
- content: string;
-}
-
-const HelpCenter = () => {
- const [topics, setTopics] = useState([]);
- const [loading, setLoading] = useState(true);
- const [searchValue, setSearchValue] = useState("");
- const { toast } = useToast();
-
- useEffect(() => {
- const fetchTopics = async () => {
- try {
- const apiUrl = await getApiUrl();
- const response = await axios.get(`${apiUrl}/api/v1/help-center/topics`);
- setTopics(response.data.data);
- } catch {
- toast({
- title: "Error",
- description: "Error fetching topics",
- variant: "destructive",
- });
- } finally {
- setLoading(false);
- }
- };
-
- fetchTopics();
- }, [toast]);
-
- const handleSearch = (event: ChangeEvent) => {
- setSearchValue(event.target.value);
- };
-
- const filteredTopics = topics?.filter(
- (topic) =>
- topic.title.toLowerCase().includes(searchValue.toLowerCase()) ||
- topic.content.toLowerCase().includes(searchValue.toLowerCase()),
- );
-
- //
-
- return (
- <>
-
-
-
-
-
-
-
-
-
-
- Browse by topics
-
-
- {loading ? (
-
- ) : (
- <>
- {filteredTopics?.length === 0 ? (
- No results found.
- ) : (
-
- )}
- >
- )}
-
-
-
-
-
-
- Frequently Asked Questions
-
-
-
-
-
-
-
-
-
-
-
- Didn't find an answer?
-
-
- Contact us for more inquiries and information about our services.
-
-
-
- Contact us
-
-
-
- >
- );
-};
-
-export default HelpCenter;
diff --git a/src/app/(landing-routes)/hng-test/page.tsx b/src/app/(landing-routes)/hng-test/page.tsx
deleted file mode 100644
index e75751fd9..000000000
--- a/src/app/(landing-routes)/hng-test/page.tsx
+++ /dev/null
@@ -1,23 +0,0 @@
-import { unstable_noStore as noStore } from "next/cache";
-
-export default async function HNGTEST() {
- noStore();
- const API_URL = process.env.API_URL || "No API URL provided";
- let result = {} as { message?: string };
- try {
- const response = await fetch(API_URL);
- result = response.ok ? await response.json() : {};
- } catch {
- result = {};
- }
- return (
-
-
-
HNG TEST BACKEND
-
Version 0.12
-
{API_URL}
-
{result?.message}
-
-
- );
-}
diff --git a/src/app/(landing-routes)/layout.tsx b/src/app/(landing-routes)/layout.tsx
index c20203777..2c462824b 100644
--- a/src/app/(landing-routes)/layout.tsx
+++ b/src/app/(landing-routes)/layout.tsx
@@ -1,11 +1,11 @@
-import Footer from "~/components/layouts/footer";
-import Navbar from "~/components/layouts/navbar";
-import GotoTop from "~/components/miscellaneous/goto-top";
+import Navbar from '~/components/navigation/navbar/index'
+import GotoTop from '~/components/miscellaneous/goto-top'
+import Footer from '~/components/navigation/footer'
export default function LandingLayout({
children,
}: Readonly<{
- children: React.ReactNode;
+ children: React.ReactNode
}>) {
return (
@@ -14,5 +14,5 @@ export default function LandingLayout({
- );
+ )
}
diff --git a/src/app/(landing-routes)/privacy-policy/page.tsx b/src/app/(landing-routes)/privacy-policy/page.tsx
deleted file mode 100644
index fd4e1172c..000000000
--- a/src/app/(landing-routes)/privacy-policy/page.tsx
+++ /dev/null
@@ -1,51 +0,0 @@
-"use client";
-
-import { useEffect } from "react";
-
-import Heading from "~/components/layouts/heading";
-import privacyPolicyData, {
- getTableOfContents,
-} from "~/components/layouts/Legal/PrivacyPolicy/constants/privacyPolicyData";
-import PrivacyPolicyContent from "~/components/layouts/Legal/PrivacyPolicy/PrivacyPolicyContent";
-import TableOfContent from "~/components/layouts/Legal/TableOfContent";
-
-export default function PrivacyPolicy() {
- const tableOfContents = getTableOfContents(privacyPolicyData);
-
- useEffect(() => {
- const scrollClasses = [
- "scroll-smooth",
- "scroll-pt-24",
- "md:scroll-pt-[108px]",
- ];
-
- const htmlElement = document.documentElement;
- htmlElement.classList.add(...scrollClasses);
-
- return () => {
- htmlElement.classList.remove(...scrollClasses);
- };
- }, []);
-
- return (
-
-
-
-
-
- );
-}
diff --git a/src/app/(landing-routes)/products/[uid]/page.tsx b/src/app/(landing-routes)/products/[uid]/page.tsx
deleted file mode 100644
index f9aca7b0f..000000000
--- a/src/app/(landing-routes)/products/[uid]/page.tsx
+++ /dev/null
@@ -1,185 +0,0 @@
-"use client";
-
-import Image from "next/image";
-import { Swiper, SwiperSlide } from "swiper/react";
-
-import "swiper/css";
-import "swiper/css/navigation";
-import "swiper/css/pagination";
-import "swiper/css/scrollbar";
-
-import { Button } from "~/components/ui/button";
-import {
- ChevronRight,
- DeliveryVanIcon,
- MinusIcon,
- PlusIcon,
- StarIcon,
- ThreeDRotateIcon,
-} from "../icons";
-
-export default function Page() {
- return (
-
-
-
-
- Products
-
- Product Details
-
-
-
-
-
-
-
- {Array.from({ length: 5 }).map((_, index) => (
-
- ))}
-
-
- Product 2
-
-
- A fusion of ripe bananas, pure honey, and succulent raspberries
- with our bread. Crafted to perfection.
-
-
- $150.00
-
-
-
-
-
- Free worldwide shipping on all orders over $100
-
-
-
-
-
- Delivers in: 3-7 Working Days Shipping & Return
-
-
-
-
-
-
-
-
-
Descriptions
-
-
Reviews
-
-
-
- Our artisan bread is crafted using traditional methods and the
- finest ingredients. Baked fresh daily, each loaf features a crisp,
- golden crust and a soft, flavorful interior. Our signature recipes
- include a range of varieties, from hearty sourdough and rustic
- multigrain to rich olive and rosemary. Our dried nuts are carefully
- selected and processed to preserve their natural flavor and
- nutritional value. Sourced from trusted farms, our nuts include a
- variety of options such as almonds, cashews, walnuts, and
- pistachios, all roasted to perfection and lightly seasoned.Our team
- of skilled bakers and nut experts work tirelessly to blend age-old
- techniques with modern practices, creating products that not only
- taste great but are also kind to the environment. From our ovens to
- your table, we strive to deliver products that enhance your culinary
- experiences and support a healthier lifestyle.
-
-
-
-
-
- {`Similar Products from Kingpin's Organization`}{" "}
-
-
- See all
-
-
-
-
= 640px
- 425: {
- slidesPerView: 2,
- },
- 640: {
- slidesPerView: 2,
- },
- // When the screen is >= 768px
- 768: {
- slidesPerView: 3,
- },
- // When the screen is >= 1024px
- 1024: {
- slidesPerView: 4,
- spaceBetween: 30,
- },
- }}
- >
- {Array.from({ length: 8 }).map((_, index) => (
-
-
-
-
-
-
- {Array.from({ length: 5 }).map((_, index) => (
-
- ))}
-
-
- Product 50
-
-
- $575.99
-
-
-
- ))}
-
-
-
-
-
- );
-}
diff --git a/src/app/(landing-routes)/products/data.tsx b/src/app/(landing-routes)/products/data.tsx
deleted file mode 100644
index 22769d3c0..000000000
--- a/src/app/(landing-routes)/products/data.tsx
+++ /dev/null
@@ -1,29 +0,0 @@
-export const productData = [
- {
- image: "/product/product-img-1.png",
- },
- {
- image: "/product/product-img-2.png",
- },
- {
- image: "/product/product-img-3.jpg",
- },
- {
- image: "/product/product-img-4.png",
- },
- {
- image: "/product/product-img-5.png",
- },
- {
- image: "/product/product-img-6.png",
- },
- {
- image: "/product/product-img-7.png",
- },
- {
- image: "/product/product-img-8.png",
- },
- {
- image: "/product/product-img-9.png",
- },
-];
diff --git a/src/app/(landing-routes)/products/icons.tsx b/src/app/(landing-routes)/products/icons.tsx
deleted file mode 100644
index 04e4ce04c..000000000
--- a/src/app/(landing-routes)/products/icons.tsx
+++ /dev/null
@@ -1,189 +0,0 @@
-export const DeliveryVanIcon = () => {
- return (
-
-
-
-
-
-
-
-
-
-
- );
-};
-
-export const ThreeDRotateIcon = () => {
- return (
-
-
-
-
-
-
-
- );
-};
-
-export const ChevronRight = () => {
- return (
-
-
-
- );
-};
-
-export const MinusIcon = () => {
- return (
-
-
-
- );
-};
-
-export const PlusIcon = () => {
- return (
-
-
-
- );
-};
-
-export const StarIcon = () => {
- return (
-
-
-
- );
-};
diff --git a/src/app/(landing-routes)/products/page.tsx b/src/app/(landing-routes)/products/page.tsx
deleted file mode 100644
index edda562fa..000000000
--- a/src/app/(landing-routes)/products/page.tsx
+++ /dev/null
@@ -1,170 +0,0 @@
-"use client";
-
-import axios from "axios";
-import { ChevronDown, ChevronLeft, ChevronRight } from "lucide-react";
-import Image from "next/image";
-import Link from "next/link";
-import { useEffect, useState } from "react";
-
-import { getApiUrl } from "~/actions/getApiUrl";
-import { Button } from "~/components/ui/button";
-import { productData } from "./data";
-import { StarIcon } from "./icons";
-
-export default function Page() {
- const [, setIsLoading] = useState(false);
-
- const [page, setPage] = useState(1);
- const [, setProducts] = useState([]);
-
- useEffect(() => {
- (async () => {
- setIsLoading(true);
- try {
- const baseUrl = await getApiUrl();
- const API_URL = `${baseUrl}/api/v1/products`;
- const response = await axios.get(`${API_URL}?page=${page}&page_size=9`);
- setProducts(response.data.data.products);
- } catch {
- setIsLoading(false);
- } finally {
- setIsLoading(false);
- }
- })();
- }, [page]);
-
- return (
-
-
-
-
-
-
-
-
-
1-24 of 172 products
-
-
-
- {productData.map((data, index) => (
-
-
-
-
-
-
-
-
- King Pin Organization{" "}
-
-
-
-
- {Array.from({ length: 5 }).map((_, index) => (
-
- ))}
-
-
- Add to Cart
-
-
-
-
- ))}
-
- {/* Pagination */}
-
-
-
- setPage((previous) => (previous > 1 ? previous - 1 : 0))
- }
- >
-
- Previous
-
-
-
- 1
-
-
- 2
-
-
- 3
-
- ...
-
-
setPage((previous) => previous + 1)}
- className="flex items-center gap-[11px] font-semibold"
- >
- Next
-
-
-
-
-
-
- );
-}
-
-const SearchIcon = () => {
- return (
-
-
-
-
- );
-};
diff --git a/src/app/(landing-routes)/squeeze/index.tsx b/src/app/(landing-routes)/squeeze/index.tsx
deleted file mode 100644
index 7cf76b46a..000000000
--- a/src/app/(landing-routes)/squeeze/index.tsx
+++ /dev/null
@@ -1,216 +0,0 @@
-"use client";
-
-import { Check } from "lucide-react";
-import Link from "next/link";
-import { useRouter } from "next/navigation";
-import React, { useEffect, useState } from "react";
-import { z, ZodError } from "zod";
-
-import { getApiUrl } from "~/actions/getApiUrl";
-import { useToast } from "~/components/ui/use-toast";
-
-const validationSchema = z.object({
- first_name: z.string().min(1, "First name is required"),
- last_name: z.string().min(1, "Last name is required"),
- email: z.string().email("Invalid email address").min(1, "Email is required"),
-});
-
-const Page: React.FC = () => {
- const [apiUrl, setApiUrl] = useState("");
- const [first_name, setFirst_name] = useState("");
- const [last_name, setLast_name] = useState("");
- const [email, setEmail] = useState("");
- const [errors, setErrors] = useState<{ [key: string]: string } | undefined>();
- const [submitting, setSubmitting] = useState(false);
- const { toast } = useToast();
- const router = useRouter();
-
- useEffect(() => {
- const fetchApiUrl = async () => {
- try {
- const url = await getApiUrl();
- setApiUrl(url);
- } catch {
- toast({
- title: "Error",
- description: "Failed to fetch API URL",
- variant: "destructive",
- });
- }
- };
-
- fetchApiUrl();
- }, [toast]);
-
- const validateForm = (): { [key: string]: string } | undefined => {
- try {
- validationSchema.parse({
- first_name,
- last_name,
- email,
- });
- return undefined;
- } catch (error) {
- if (error instanceof ZodError) {
- const errorMap: { [key: string]: string } = {};
- for (const error_ of error.errors) {
- if (error_.path.length > 0) {
- errorMap[error_.path[0]] = error_.message;
- }
- }
- return errorMap;
- }
- return undefined;
- }
- };
-
- const handleSubmit = async (event: React.FormEvent) => {
- event.preventDefault();
- setSubmitting(true);
-
- const validationErrors = validateForm();
- if (validationErrors) {
- setErrors(validationErrors);
- setSubmitting(false);
- return;
- }
-
- if (!apiUrl) {
- setSubmitting(false);
- return;
- }
-
- try {
- const response = await fetch(`${apiUrl}/api/v1/squeeze`, {
- method: "POST",
- body: JSON.stringify({ first_name, last_name, email }),
- headers: {
- "Content-Type": "application/json",
- },
- });
-
- if (!response.ok) {
- throw new Error("Network response was not ok");
- }
-
- toast({
- title: "Success",
- description: "Template sent successfully",
- variant: "default",
- });
-
- setFirst_name("");
- setLast_name("");
- setEmail("");
- router.push("/");
- } catch {
- toast({
- title: "Error",
- description: "Failed to send details",
- variant: "destructive",
- });
- }
-
- setSubmitting(false);
- };
-
- return (
-
-
-
-
- UNLEASH YOUR CREATIVITY WITH HNG BOILERPLATE
-
-
-
-
-
-
-
-
- Eliminate complexity and coding headaches with our intuitive
- boilerplate
-
-
-
-
-
-
-
-
- Stay up-to-date with continuous updates and enhancements.
-
-
-
-
-
-
-
-
- Simplify development with an intuitive solution.
-
-
-
-
-
- setFirst_name(event.target.value)}
- />
- {errors?.first_name && (
-
- {errors.first_name}
-
- )}
-
- setLast_name(event.target.value)}
- />
- {errors?.last_name && (
-
- {errors.last_name}
-
- )}
-
- setEmail(event.target.value)}
- />
- {errors?.email && (
- {errors.email}
- )}
-
-
- {submitting ? "Submitting..." : "Send me the template"}
-
-
-
- We respect your privacy, unsubscribe anytime, view our{" "}
-
- privacy policy
-
-
-
-
-
- );
-};
-
-export default Page;
diff --git a/src/app/(landing-routes)/squeeze/page.tsx b/src/app/(landing-routes)/squeeze/page.tsx
deleted file mode 100644
index ba46f3d6b..000000000
--- a/src/app/(landing-routes)/squeeze/page.tsx
+++ /dev/null
@@ -1,9 +0,0 @@
-import React from "react";
-
-import Index from "./index";
-
-const Page: React.FC = async () => {
- return ;
-};
-
-export default Page;
diff --git a/src/app/(landing-routes)/terms-and-conditions/page.tsx b/src/app/(landing-routes)/terms-and-conditions/page.tsx
deleted file mode 100644
index 261e0c6f5..000000000
--- a/src/app/(landing-routes)/terms-and-conditions/page.tsx
+++ /dev/null
@@ -1,23 +0,0 @@
-import Heading from "~/components/layouts/heading";
-import Main from "~/components/layouts/Legal/Terms&Conditions/Main";
-
-const TermsConditions = () => {
- return (
-
- );
-};
-
-export default TermsConditions;
diff --git a/src/app/(landing-routes)/waitlist/page.test.tsx b/src/app/(landing-routes)/waitlist/page.test.tsx
deleted file mode 100644
index dea52ad56..000000000
--- a/src/app/(landing-routes)/waitlist/page.test.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import { render } from "~/test/utils";
-import Page from "./page";
-
-describe("page tests", () => {
- it("should render correctly", () => {
- expect.assertions(1);
-
- render( );
-
- expect(true).toBeTruthy();
- });
-});
diff --git a/src/app/(landing-routes)/waitlist/page.tsx b/src/app/(landing-routes)/waitlist/page.tsx
deleted file mode 100644
index 5a3948885..000000000
--- a/src/app/(landing-routes)/waitlist/page.tsx
+++ /dev/null
@@ -1,17 +0,0 @@
-import WaitlistDialog from "~/components/waitList/WaitlistDialog";
-import WaitlistForm from "~/components/waitList/WaitListForm";
-import WaitlistJoin from "~/components/waitList/WaitlistJoin";
-import WaitlistPayment from "~/components/waitList/WaitlistPayment";
-
-const WaitlistPage = () => {
- return (
-
-
-
-
-
-
- );
-};
-
-export default WaitlistPage;
diff --git a/src/app/(user)/dashboard/page.tsx b/src/app/(user)/dashboard/page.tsx
new file mode 100644
index 000000000..2868bf2fc
--- /dev/null
+++ b/src/app/(user)/dashboard/page.tsx
@@ -0,0 +1,7 @@
+import React from 'react'
+
+const page = () => {
+ return page
+}
+
+export default page
diff --git a/src/app/api/auth/[...nextauth]/.gitkeep b/src/app/api/auth/[...nextauth]/.gitkeep
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/app/api/auth/[...nextauth]/route.ts b/src/app/api/auth/[...nextauth]/route.ts
index ff20d1adf..2110e1b0b 100644
--- a/src/app/api/auth/[...nextauth]/route.ts
+++ b/src/app/api/auth/[...nextauth]/route.ts
@@ -1 +1 @@
-export { GET, POST } from "~/lib/auth";
+export { GET, POST } from '~/auth'
diff --git a/src/app/dashboard/(admin)/_components/layout/Sidebar/index.tsx b/src/app/dashboard/(admin)/_components/layout/Sidebar/index.tsx
deleted file mode 100644
index df7769237..000000000
--- a/src/app/dashboard/(admin)/_components/layout/Sidebar/index.tsx
+++ /dev/null
@@ -1,123 +0,0 @@
-"use client";
-
-import {
- Bot,
- Box,
- House,
- List,
- LucideProps,
- Mail,
- Settings,
- TabletSmartphone,
- Users,
-} from "lucide-react";
-import { useSession } from "next-auth/react";
-import Link from "next/link";
-import { usePathname } from "next/navigation";
-import { FC, ForwardRefExoticComponent, RefAttributes } from "react";
-
-const sideItems = [
- {
- route: "Dashboard",
- link: "/dashboard/admin",
- icon: House,
- id: "dashboard",
- },
- {
- route: "Products",
- link: "/dashboard/admin/products",
- icon: Box,
- id: "products",
- },
- {
- route: "Users",
- link: "/dashboard/admin/users",
- icon: Users,
- id: "users",
- },
- {
- route: "Email Templates",
- link: "/dashboard/admin/email",
- icon: Mail,
- id: "email",
- },
- {
- route: "Squeeze Pages",
- link: "/dashboard/admin/squeeze-pages",
- icon: List,
- id: "squeeze",
- },
- {
- route: "Waitlist Page",
- link: "/dashboard/admin/waitlist-page",
- icon: TabletSmartphone,
- id: "waitlist",
- },
- {
- route: "FAQs",
- link: "/dashboard/admin/faqs",
- icon: Bot,
- id: "faqs",
- },
- {
- route: "Settings",
- link: "/dashboard/admin/settings",
- icon: Settings,
- id: "settings",
- },
-];
-
-interface Iproperties {
- sideNavitems?: {
- route: string;
- link: string;
- icon: ForwardRefExoticComponent<
- Omit & RefAttributes
- >;
- id: string;
- }[];
- currenPathName?: string;
-}
-
-const Sidebar: FC = ({ sideNavitems = sideItems }) => {
- const { data: session } = useSession();
- const pathname = usePathname();
- const currentPath = pathname?.split("/")[3];
-
- const filteredItems = session?.user?.is_superadmin
- ? [
- ...sideNavitems,
- {
- route: "Faq Page",
- link: "/dashboard/admin/faqs",
- icon: List,
- id: "faqs",
- },
- ]
- : sideNavitems;
-
- return (
-
-
- {filteredItems.map((item, index) => (
-
-
- {item.route}
-
- ))}
-
-
- );
-};
-
-export default Sidebar;
diff --git a/src/app/dashboard/(admin)/_components/layout/logo/index.tsx b/src/app/dashboard/(admin)/_components/layout/logo/index.tsx
deleted file mode 100644
index f78054429..000000000
--- a/src/app/dashboard/(admin)/_components/layout/logo/index.tsx
+++ /dev/null
@@ -1,36 +0,0 @@
-import Image from "next/image";
-import Link from "next/link";
-
-import { cn } from "~/lib/utils";
-
-type DashboardLogoProperties = {
- responsive?: boolean;
-};
-const DashboardLogo = ({ responsive }: DashboardLogoProperties) => {
- return (
-
-
-
-
-
- Boilerplate.
-
-
- );
-};
-
-export default DashboardLogo;
diff --git a/src/app/dashboard/(admin)/_components/layout/navbar/index.tsx b/src/app/dashboard/(admin)/_components/layout/navbar/index.tsx
deleted file mode 100644
index c756c0063..000000000
--- a/src/app/dashboard/(admin)/_components/layout/navbar/index.tsx
+++ /dev/null
@@ -1,127 +0,0 @@
-"use client";
-
-import { BellIcon, HelpCircle, SearchIcon } from "lucide-react";
-import { useSession } from "next-auth/react";
-import { useRouter } from "next/navigation";
-import { useEffect, useState } from "react";
-
-import { getAllNotifications } from "~/actions/notifications/getAllNotifications";
-import UserCard from "~/components/card/user-card";
-import {
- Popover,
- PopoverContent,
- PopoverTrigger,
-} from "~/components/ui/popover";
-import UnreadNotificationCard from "../../unread-notification-card/UnreadNotificationCard";
-import DashboardLogo from "../logo";
-
-interface NotificationPreview {
- message: string;
- created_at: string;
- is_read: boolean;
- id: string;
-}
-
-interface NotificationsData {
- data: {
- total_unread_notification_count: number;
- total_notification_count: number;
- notifications: NotificationPreview[];
- };
- message: string;
-}
-
-const DashboardNavbar = () => {
- const [notifications, setNotifications] =
- useState();
- const { status } = useSession();
- const router = useRouter();
- useEffect(() => {
- if (status === "unauthenticated") {
- router.push("/login");
- }
- }, [status, router]);
-
- useEffect(() => {
- async function fetchNotifications() {
- const result = await getAllNotifications();
-
- if (result.error) {
- return result.error;
- } else {
- setNotifications(result.data as NotificationsData);
- }
- }
-
- fetchNotifications();
- }, []);
-
- const totalUnreadNotificationCount =
- notifications?.data.total_unread_notification_count || 0;
-
- const totalNotificationCount =
- notifications?.data.total_notification_count || 0;
- const notificationContent: NotificationPreview[] =
- notifications?.data.notifications || [];
-
- return (
-
-
-
- );
-};
-
-export default DashboardNavbar;
diff --git a/src/app/dashboard/(admin)/_components/ui/dropdownMenu.tsx b/src/app/dashboard/(admin)/_components/ui/dropdownMenu.tsx
deleted file mode 100644
index 93ec494ab..000000000
--- a/src/app/dashboard/(admin)/_components/ui/dropdownMenu.tsx
+++ /dev/null
@@ -1,23 +0,0 @@
-const DropdownMenu = ({
- width,
- active,
- position,
- children,
-}: {
- width: string;
- active: boolean;
- position: string;
- children: React.ReactNode;
-}) => {
- return (
- <>
-
- {children}
-
- >
- );
-};
-
-export default DropdownMenu;
diff --git a/src/app/dashboard/(admin)/_components/unread-notification-card/NotificationAction.tsx b/src/app/dashboard/(admin)/_components/unread-notification-card/NotificationAction.tsx
deleted file mode 100644
index fefa6263b..000000000
--- a/src/app/dashboard/(admin)/_components/unread-notification-card/NotificationAction.tsx
+++ /dev/null
@@ -1,73 +0,0 @@
-import {
- DropdownMenu,
- DropdownMenuContent,
- DropdownMenuItem,
- DropdownMenuLabel,
- DropdownMenuSeparator,
- DropdownMenuTrigger,
-} from "@radix-ui/react-dropdown-menu";
-import { Check, EllipsisVertical, Trash } from "lucide-react";
-import { useSession } from "next-auth/react";
-
-import { deleteNotifications } from "~/actions/notifications/deleteNotifications";
-import { markOneAsRead } from "~/actions/notifications/markOneAsRead";
-
-interface Properties {
- notificationId: string;
- handleSetIsRead: (notificationId: string) => void;
- handleDeleteNotification: (notificationId: string) => void;
-}
-
-const handleMarkOneAsRead = async (notificationId: string, token: string) => {
- await markOneAsRead({ notificationId, token });
-};
-
-const handleDeleteNotifications = async (
- notificationId: string,
- token: string,
-) => {
- await deleteNotifications({ notificationId, token });
-};
-
-function NotificationAction({
- notificationId,
- handleSetIsRead,
- handleDeleteNotification,
-}: Properties) {
- const { data } = useSession();
- const token = data?.access_token || "";
-
- return (
-
-
-
-
-
-
- Actions
-
-
- {
- await handleMarkOneAsRead(notificationId, token);
- handleSetIsRead(notificationId);
- }}
- >
- Mark as read
-
- {
- await handleDeleteNotifications(notificationId, token);
- handleDeleteNotification(notificationId);
- }}
- >
- Delete
-
-
-
- );
-}
-
-export default NotificationAction;
diff --git a/src/app/dashboard/(admin)/_components/unread-notification-card/UnreadNotificationCard.tsx b/src/app/dashboard/(admin)/_components/unread-notification-card/UnreadNotificationCard.tsx
deleted file mode 100644
index 934e26e0a..000000000
--- a/src/app/dashboard/(admin)/_components/unread-notification-card/UnreadNotificationCard.tsx
+++ /dev/null
@@ -1,231 +0,0 @@
-"use client";
-
-import { BellRing } from "lucide-react";
-import { useSession } from "next-auth/react";
-import Image from "next/image";
-import { FC, useState } from "react";
-
-import { deleteAllNotifications } from "~/actions/notifications/deleteAllNotifications";
-import { markAllAsRead } from "~/actions/notifications/markAllAsRead";
-import CustomButton from "~/components/common/common-button/common-button";
-import {
- Card,
- CardContent,
- CardDescription,
- CardFooter,
- CardHeader,
- CardTitle,
-} from "~/components/ui/card";
-import { Switch } from "~/components/ui/switch";
-import { cn } from "~/lib/utils";
-import formatCreatedAt from "~/utils/formatDate";
-import { useNotificationStore } from "../../admin/(settings)/settings/notification/_action/notification-store";
-import { notificationSettingsProperties } from "../../admin/(settings)/settings/notification/_types/notification-settings.types";
-import NotificationAction from "./NotificationAction";
-
-interface NotificationPreview {
- message: string;
- is_read: boolean;
- created_at: string;
- id: string;
-}
-
-interface CardProperties extends React.ComponentProps {
- notificationsPreview: NotificationPreview[];
- unreadCount: number;
- totalNotificationCount: number;
-}
-
-const handleMarkAllAsRead = async (token: string) => {
- await markAllAsRead(token);
-};
-
-const handleDeleteAllNotifications = async (token: string) => {
- await deleteAllNotifications(token);
-};
-
-const UnreadNotificationCard: FC = ({
- className,
- notificationsPreview = [],
- unreadCount = 0,
- totalNotificationCount = 0,
- ...properties
-}) => {
- const { settings, updateSettings } = useNotificationStore();
- const [readNotifications, setReadNotifications] = useState([]);
- const [isAllNotificationsDeleted, setIsAllNotificationsDeleted] =
- useState(false);
- const [visibleNotifications, setVisibleNotifications] =
- useState(notificationsPreview);
-
- const handleToggleSwitch = (name: keyof notificationSettingsProperties) => {
- updateSettings({ [name]: !settings[name] });
- };
-
- const handleSetIsRead = (notificationId: string) => {
- setReadNotifications((previous) => [...previous, notificationId]);
- };
-
- const handleDeleteNotification = (notificationId: string) => {
- setVisibleNotifications((previous) =>
- previous.filter((notification) => notification.id !== notificationId),
- );
- };
-
- const { data } = useSession();
- const token = data?.access_token || "";
-
- const handleMarkAll = () => {
- handleMarkAllAsRead(token);
- const allNotificationIds = visibleNotifications.map(
- (preview) => preview.id,
- );
- setReadNotifications(allNotificationIds);
- };
-
- const handleDeleteAll = () => {
- handleDeleteAllNotifications(token);
- setIsAllNotificationsDeleted(true);
- };
-
- return (
-
-
- Notifications
-
- You have{" "}
- {unreadCount === 0 || isAllNotificationsDeleted ? 0 : unreadCount}{" "}
- unread message
- {unreadCount === 1 ? "" : "s"}.
- {totalNotificationCount > 0 && (
- <>
- {!isAllNotificationsDeleted && (
-
- Delete notifications
-
- )}
- >
- )}
-
-
-
- {totalNotificationCount === 0 || isAllNotificationsDeleted ? (
-
-
-
-
- All Caught Up!
-
-
- New notifications will show up here.
-
-
-
- ) : (
- <>
-
-
-
-
-
- Push Notifications
-
-
- Send notifications to device.
-
-
-
- handleToggleSwitch("mobile_push_notifications")
- }
- name="mobile_push_notifications"
- />
-
-
- {visibleNotifications.map((preview) => (
-
-
-
-
-
- {preview.message}
-
-
- {formatCreatedAt(preview.created_at)}
-
-
-
-
-
-
-
- ))}
-
-
- >
- )}
-
-
- {totalNotificationCount > 0 && (
- <>
- {!isAllNotificationsDeleted && (
-
-
- Mark all as read
-
-
- )}
- >
- )}
-
-
- );
-};
-
-export default UnreadNotificationCard;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/client.tsx b/src/app/dashboard/(admin)/admin/(overview)/client.tsx
deleted file mode 100644
index 4dcdb08cc..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/client.tsx
+++ /dev/null
@@ -1,50 +0,0 @@
-"use client";
-
-import { cardData } from "~/components/adminDashboard/cardData";
-import { Chart } from "~/components/adminDashboard/Chart";
-import { chartConfig, chartData } from "~/components/adminDashboard/chartData";
-import { data, gradients } from "~/components/adminDashboard/productData";
-import TopProductsComponent from "~/components/adminDashboard/TopProductsComponent";
-import CardComponent from "~/components/common/DashboardCard/CardComponent";
-import { Card } from "~/components/ui/card";
-
-const AdminPage = () => {
- return (
-
-
-
-
- Overview
-
-
- Showing records from the last .....
-
-
-
-
-
- {cardData.map((card, index) => (
-
- ))}
-
-
-
-
-
- Overview
-
-
-
-
-
-
- );
-};
-
-export default AdminPage;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/email/_components/Toptab/index.tsx b/src/app/dashboard/(admin)/admin/(overview)/email/_components/Toptab/index.tsx
deleted file mode 100644
index 3561ffff3..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/email/_components/Toptab/index.tsx
+++ /dev/null
@@ -1,48 +0,0 @@
-import { FC, ReactNode } from "react";
-
-import { Tabs, TabsContent, TabsList, TabsTrigger } from "~/components/ui/tabs";
-
-interface ITab {
- name: string;
- value: string;
- content: ReactNode;
-}
-
-interface IProperties {
- tabs: ITab[];
-}
-
-const Toptab: FC = ({ tabs }) => {
- return (
-
-
- {tabs?.map((tab, item) => {
- return (
-
- {tab.name}
-
- );
- })}
-
- {tabs?.map((tab, item) => {
- return (
-
- {tab.content}
-
- );
- })}
-
- );
-};
-
-export default Toptab;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/email/_components/new-template/NewTemplate.test.tsx b/src/app/dashboard/(admin)/admin/(overview)/email/_components/new-template/NewTemplate.test.tsx
deleted file mode 100644
index 0ec8965da..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/email/_components/new-template/NewTemplate.test.tsx
+++ /dev/null
@@ -1,74 +0,0 @@
-import { render, screen } from "@testing-library/react";
-import { CodeIcon, FileIcon, LucideProps } from "lucide-react";
-import { ForwardRefExoticComponent } from "react";
-
-import PageHeader from "../page-header";
-import NewTemplate, { Options } from "./NewTemplate";
-
-interface Option {
- title: string;
- description: string;
- icon: ForwardRefExoticComponent<
- Omit & React.RefAttributes
- >;
- link: string;
-}
-
-const options: Option[] = [
- {
- title: "Generate with HTML",
- description:
- "Create an email template by pasting your custom-coded template",
- icon: CodeIcon,
- link: "email/generate-with-html",
- },
- {
- title: "Edit in-built Template",
- description:
- "Create an email template by choosing from our custom template library",
- icon: FileIcon,
- link: "email/edit-in-buit-templates",
- },
-];
-
-describe("newTemplate component", () => {
- it("renders admin page cards correctly", () => {
- expect.assertions(6);
- for (const item of options) {
- render( );
- expect(screen.getByText(item.title)).toBeInTheDocument();
- expect(screen.getByText(item.description)).toBeInTheDocument();
- expect(screen.getAllByRole("option-icon")).toBeTruthy();
- }
- });
-
- it("renders page header", () => {
- expect.assertions(2);
- render(
- ,
- );
- expect.assertions(2);
- expect(screen.getByText("Create a New Template")).toBeInTheDocument();
- expect(
- screen.getByText(
- "Choose an option below to begin crafting your email design.",
- ),
- ).toBeInTheDocument();
- });
-
- it("renders card with links", () => {
- expect.assertions(2);
- render( );
- expect(screen.getAllByRole("link")[0]).toHaveAttribute(
- "href",
- "email/generate-with-html",
- );
- expect(screen.getAllByRole("link")[1]).toHaveAttribute(
- "href",
- "email/edit-in-buit-templates",
- );
- });
-});
diff --git a/src/app/dashboard/(admin)/admin/(overview)/email/_components/new-template/NewTemplate.tsx b/src/app/dashboard/(admin)/admin/(overview)/email/_components/new-template/NewTemplate.tsx
deleted file mode 100644
index 0350d63ef..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/email/_components/new-template/NewTemplate.tsx
+++ /dev/null
@@ -1,74 +0,0 @@
-import { CodeIcon, FileIcon, LucideProps } from "lucide-react";
-import Link from "next/link";
-import { FC, ForwardRefExoticComponent } from "react";
-
-import PageHeader from "../page-header";
-
-interface IOption {
- data: {
- title: string;
- description: string;
- icon: ForwardRefExoticComponent<
- Omit & React.RefAttributes
- >;
- link: string;
- };
-}
-
-const options = [
- {
- title: "Generate with HTML",
- description:
- "Create an email template by pasting your custom-coded template",
- icon: CodeIcon,
- link: "email/generate-with-html",
- },
- {
- title: "Edit in-built Template",
- description:
- "Create an email template by choosing from our custom template library",
- icon: FileIcon,
- link: "email/edit-in-buit-templates",
- },
-];
-
-export const Options: FC = ({ data }) => {
- return (
-
-
-
-
-
-
- {data.title}
-
-
{data.description}
-
-
- );
-};
-const NewTemplate = () => {
- return (
-
-
-
- {options.map((option, index) => {
- return ;
- })}
-
-
- );
-};
-
-export default NewTemplate;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/email/_components/page-header/index.tsx b/src/app/dashboard/(admin)/admin/(overview)/email/_components/page-header/index.tsx
deleted file mode 100644
index c6d7e7250..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/email/_components/page-header/index.tsx
+++ /dev/null
@@ -1,23 +0,0 @@
-import { FC } from "react";
-
-interface IProperties {
- title: string;
- description: string;
-}
-const PageHeader: FC = ({ title, description }) => {
- return (
-
-
- {title}
-
-
- {description}
-
-
- );
-};
-
-export default PageHeader;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/email/_components/page-header/pageHeader.test.tsx b/src/app/dashboard/(admin)/admin/(overview)/email/_components/page-header/pageHeader.test.tsx
deleted file mode 100644
index b4c16e54a..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/email/_components/page-header/pageHeader.test.tsx
+++ /dev/null
@@ -1,14 +0,0 @@
-import PageHeader from ".";
-
-import { render, screen } from "~/test/utils";
-
-describe("page header test", () => {
- it("page header renders title and description", () => {
- expect.assertions(2);
- render( );
- expect(screen.getByTestId("page-title")).toHaveTextContent("Page title");
- expect(screen.getByTestId("page-description")).toHaveTextContent(
- "Page description",
- );
- });
-});
diff --git a/src/app/dashboard/(admin)/admin/(overview)/email/_components/pagination/index.tsx b/src/app/dashboard/(admin)/admin/(overview)/email/_components/pagination/index.tsx
deleted file mode 100644
index 75ae4f9a0..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/email/_components/pagination/index.tsx
+++ /dev/null
@@ -1,86 +0,0 @@
-import { ChevronLeft, ChevronRight } from "lucide-react";
-import { Dispatch, FC, SetStateAction } from "react";
-
-import CustomButton from "~/components/common/common-button/common-button";
-import useGeneratePagesNumbers from "~/hooks/use-generate-pagination";
-
-interface IProperties {
- currentPage: number;
- totalPage: number;
- setCurrentPage: Dispatch>;
- isloading: boolean;
-}
-
-const Pigination: FC = ({
- currentPage,
- totalPage,
- setCurrentPage,
- isloading,
-}) => {
- const { before, after } = useGeneratePagesNumbers(currentPage, totalPage);
- return (
-
-
- Page {currentPage} of {totalPage}
-
-
- {before.map((item, index) => {
- if (item) {
- return (
- setCurrentPage(item as number)}
- isDisabled={isloading}
- >
- {item}
-
- );
- }
- })}
-
- {currentPage}
-
- {after.map((item, index) => {
- if (item)
- return (
- setCurrentPage(item)}
- isDisabled={isloading}
- >
- {item}
-
- );
- })}
-
-
- setCurrentPage((previous) => previous - 1)}
- >
-
-
- setCurrentPage((previous) => previous + 1)}
- >
-
-
-
-
- );
-};
-
-export default Pigination;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/email/_components/template-card/TemplateCard.tsx b/src/app/dashboard/(admin)/admin/(overview)/email/_components/template-card/TemplateCard.tsx
deleted file mode 100644
index 472c831a3..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/email/_components/template-card/TemplateCard.tsx
+++ /dev/null
@@ -1,32 +0,0 @@
-import { Dispatch, FC, SetStateAction } from "react";
-
-interface ITemplateCard {
- setTogglePreview: Dispatch>;
- togglePreview: boolean;
-}
-const TemplateCard: FC = ({
- togglePreview,
- setTogglePreview,
-}) => {
- return (
- setTogglePreview(!togglePreview)}
- className="flex cursor-pointer items-center justify-between gap-2 border-b-[1px] border-border px-5 py-6 transition-all duration-300 hover:border-primary hover:bg-neutral-dark-1/5"
- >
-
-
-
- Preview
-
-
- Edit
-
-
-
- );
-};
-
-export default TemplateCard;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/email/edit-in-buit-templates/[templateId]/page.tsx b/src/app/dashboard/(admin)/admin/(overview)/email/edit-in-buit-templates/[templateId]/page.tsx
deleted file mode 100644
index dbe37e831..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/email/edit-in-buit-templates/[templateId]/page.tsx
+++ /dev/null
@@ -1,42 +0,0 @@
-"use client";
-
-import { EllipsisVertical, Eye, Redo, Undo } from "lucide-react";
-
-import { Button } from "~/components/common/common-button";
-import PageHeader from "../../_components/page-header";
-
-export default function page() {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Send
-
-
-
-
-
-
-
-
- {/* YOUR EDIT TEMPLATE COMPONENTS GOES HERE ACCORRDING */}
- {/* CREATE A FLEX CONTAINER TO HOUSE THE TEMPLATE AREA AND THE SIDEBAR ICONS */}
-
-
-
- );
-}
diff --git a/src/app/dashboard/(admin)/admin/(overview)/email/edit-in-buit-templates/_components/AddLogo.tsx b/src/app/dashboard/(admin)/admin/(overview)/email/edit-in-buit-templates/_components/AddLogo.tsx
deleted file mode 100644
index 4312fb772..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/email/edit-in-buit-templates/_components/AddLogo.tsx
+++ /dev/null
@@ -1,49 +0,0 @@
-"use client";
-
-import Image from "next/image";
-import React, { useState } from "react";
-
-const AddLogo: React.FC = () => {
- const [selectedImage, setSelectedImage] = useState<
- string | ArrayBuffer | undefined
- >();
-
- const handleImageChange = (event: React.ChangeEvent) => {
- const file = event.target.files?.[0];
- if (file) {
- const reader = new FileReader();
- reader.onloadend = () => {
- setSelectedImage(reader.result ?? undefined);
- };
- reader.readAsDataURL(file);
- }
- };
-
- return (
-
-
-
- {selectedImage ? (
-
- ) : (
- Add your logo
- )}
-
-
-
-
- );
-};
-
-export default AddLogo;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/email/edit-in-buit-templates/_components/ImageBody.tsx b/src/app/dashboard/(admin)/admin/(overview)/email/edit-in-buit-templates/_components/ImageBody.tsx
deleted file mode 100644
index b059040ad..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/email/edit-in-buit-templates/_components/ImageBody.tsx
+++ /dev/null
@@ -1,62 +0,0 @@
-"use client";
-
-import Image from "next/image";
-import React, { useState } from "react";
-
-const ImageBody: React.FC = () => {
- const [selectedImage, setSelectedImage] = useState<
- string | ArrayBuffer | undefined
- >();
-
- const handleImageChange = (event: React.ChangeEvent) => {
- const file = event.target.files?.[0];
- if (file) {
- const reader = new FileReader();
- reader.onloadend = () => {
- setSelectedImage(reader.result ?? undefined);
- };
- reader.readAsDataURL(file);
- }
- };
-
- return (
-
-
-
- {selectedImage ? (
-
- ) : (
-
-
-
- )}
-
-
-
-
-
- Welcome to Boilerplate!
-
-
Thanks for signing up
-
-
- );
-};
-
-export default ImageBody;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/email/edit-in-buit-templates/_components/Input.tsx b/src/app/dashboard/(admin)/admin/(overview)/email/edit-in-buit-templates/_components/Input.tsx
deleted file mode 100644
index 8c6b1e734..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/email/edit-in-buit-templates/_components/Input.tsx
+++ /dev/null
@@ -1,34 +0,0 @@
-import React from "react";
-
-interface InputProperties {
- label: string;
- value: string;
- onChange: (error: React.ChangeEvent) => void;
- type?: string;
- placeholder?: string;
-}
-
-const Input: React.FC = ({
- label,
- value,
- onChange,
- type = "text",
- placeholder,
-}) => {
- return (
-
-
- {label}
-
-
-
- );
-};
-
-export default Input;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/email/edit-in-buit-templates/_components/Modal.tsx b/src/app/dashboard/(admin)/admin/(overview)/email/edit-in-buit-templates/_components/Modal.tsx
deleted file mode 100644
index d1e775259..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/email/edit-in-buit-templates/_components/Modal.tsx
+++ /dev/null
@@ -1,63 +0,0 @@
-"use client";
-
-import React, { ChangeEvent, useState } from "react";
-
-import Input from "./Input";
-
-interface InputProperties {
- label: string;
- value: string;
- onChange: (event: ChangeEvent) => void;
- placeholder: string;
-}
-
-interface ModalProperties {
- inputs: InputProperties[];
- buttonText?: string;
-}
-
-const Modal: React.FC = ({ inputs, buttonText = "Save" }) => {
- const initialFormValues: { [key: string]: string } = {};
- for (const input of inputs) {
- initialFormValues[input.label] = "";
- }
-
- const [formValues, setFormValues] = useState<{ [key: string]: string }>(
- initialFormValues,
- );
-
- const handleChange =
- (label: string) => (event: ChangeEvent) => {
- setFormValues((previousValues) => ({
- ...previousValues,
- [label]: event.target.value,
- }));
- };
-
- return (
-
-
-
-
- {inputs.map((input) => (
-
- ))}
-
-
-
-
-
- {buttonText}
-
-
-
- );
-};
-
-export default Modal;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/email/edit-in-buit-templates/_components/SideEditNav.tsx b/src/app/dashboard/(admin)/admin/(overview)/email/edit-in-buit-templates/_components/SideEditNav.tsx
deleted file mode 100644
index b50ed7b3b..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/email/edit-in-buit-templates/_components/SideEditNav.tsx
+++ /dev/null
@@ -1,26 +0,0 @@
-import { ArrowDown, ArrowUp, Copy, Delete, Plus } from "lucide-react";
-import React from "react";
-
-const SideEditNav: React.FC = () => {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-};
-
-export default SideEditNav;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/email/edit-in-buit-templates/_components/manage-template/ManageTemplate.tsx b/src/app/dashboard/(admin)/admin/(overview)/email/edit-in-buit-templates/_components/manage-template/ManageTemplate.tsx
deleted file mode 100644
index 01dd691fb..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/email/edit-in-buit-templates/_components/manage-template/ManageTemplate.tsx
+++ /dev/null
@@ -1,87 +0,0 @@
-"use client";
-
-import { LucideProps } from "lucide-react";
-import Link from "next/link";
-import { FC, ForwardRefExoticComponent, useState } from "react";
-
-import { Breadcrumb } from "~/components/common/breadcrumb";
-import PageHeader from "../../../_components/page-header";
-import Pagination from "../../../_components/pagination";
-import TemplateCard from "../../../_components/template-card/TemplateCard";
-import PreviewCard from "../preview-card";
-
-interface IOption {
- data: {
- title: string;
- description: string;
- icon: ForwardRefExoticComponent<
- Omit & React.RefAttributes
- >;
- link: string;
- };
-}
-
-export const Options: FC = ({ data }) => {
- return (
-
-
-
-
-
-
- {data.title}
-
-
{data.description}
-
-
- );
-};
-const ManageTemplate = () => {
- const isloading: boolean = false;
- const data = 100;
- const [togglePreview, setTogglePreview] = useState(false);
- const [currentPage, setCurrentPage] = useState(1);
- const totalPage = Math.ceil(data / 10);
- return (
-
-
-
-
- {togglePreview &&
}
-
-
- );
-};
-
-export default ManageTemplate;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/email/edit-in-buit-templates/_components/new-template/NewTemplate.tsx b/src/app/dashboard/(admin)/admin/(overview)/email/edit-in-buit-templates/_components/new-template/NewTemplate.tsx
deleted file mode 100644
index a4ceadb21..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/email/edit-in-buit-templates/_components/new-template/NewTemplate.tsx
+++ /dev/null
@@ -1,87 +0,0 @@
-"use client";
-
-import { LucideProps } from "lucide-react";
-import Link from "next/link";
-import { FC, ForwardRefExoticComponent, useState } from "react";
-
-import { Breadcrumb } from "~/components/common/breadcrumb";
-import PageHeader from "../../../_components/page-header";
-import Pagination from "../../../_components/pagination";
-import TemplateCard from "../../../_components/template-card/TemplateCard";
-import PreviewCard from "../preview-card";
-
-interface IOption {
- data: {
- title: string;
- description: string;
- icon: ForwardRefExoticComponent<
- Omit & React.RefAttributes
- >;
- link: string;
- };
-}
-
-export const Options: FC = ({ data }) => {
- return (
-
-
-
-
-
-
- {data.title}
-
-
{data.description}
-
-
- );
-};
-const NewTemplate = () => {
- const isloading: boolean = false;
- const data = 100;
- const [togglePreview, setTogglePreview] = useState(false);
- const [currentPage, setCurrentPage] = useState(1);
- const totalPage = Math.ceil(data / 10);
- return (
-
-
-
-
- {togglePreview &&
}
-
-
- );
-};
-
-export default NewTemplate;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/email/edit-in-buit-templates/_components/preview-card/index.tsx b/src/app/dashboard/(admin)/admin/(overview)/email/edit-in-buit-templates/_components/preview-card/index.tsx
deleted file mode 100644
index 24c27d371..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/email/edit-in-buit-templates/_components/preview-card/index.tsx
+++ /dev/null
@@ -1,15 +0,0 @@
-const PreviewCard = () => {
- // @kinxlo IS CURRENTLY WORKING ON THIS FIX 👍.
- return (
-
-
-
- hi guys, @Guy in A Chair is currently working on this component
- responsivess 👍
-
-
-
- );
-};
-
-export default PreviewCard;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/email/edit-in-buit-templates/page.tsx b/src/app/dashboard/(admin)/admin/(overview)/email/edit-in-buit-templates/page.tsx
deleted file mode 100644
index 73bb5f548..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/email/edit-in-buit-templates/page.tsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import Toptab from "../_components/Toptab";
-import NewTemplate from "./_components/new-template/NewTemplate";
-
-const tabs = [
- {
- name: "New Template",
- value: "new",
- content: ,
- },
- {
- name: "Manage Template",
- value: "manage",
- content:
,
- },
-];
-
-const page = () => {
- return { }
;
-};
-
-export default page;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/email/generate-with-html/_components/generate-field/generate-field.tsx b/src/app/dashboard/(admin)/admin/(overview)/email/generate-with-html/_components/generate-field/generate-field.tsx
deleted file mode 100644
index 886d9c69d..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/email/generate-with-html/_components/generate-field/generate-field.tsx
+++ /dev/null
@@ -1,24 +0,0 @@
-"use client";
-
-import { useRouter } from "next/navigation";
-
-import CustomInput from "~/components/common/input/input";
-
-const GenerateField = () => {
- const router = useRouter();
- return (
-
-
- router.push("/admin/email/generate-with-html/preview-template")
- }
- />
-
- );
-};
-
-export default GenerateField;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/email/generate-with-html/_components/tips/index.tsx b/src/app/dashboard/(admin)/admin/(overview)/email/generate-with-html/_components/tips/index.tsx
deleted file mode 100644
index c799cfa89..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/email/generate-with-html/_components/tips/index.tsx
+++ /dev/null
@@ -1,24 +0,0 @@
-const tips = [
- "Ensure the link points directly to an HTML file containing the complete email template.",
- "The link should be accessible without requiring login or permissions",
- "Use static HTML pages that do not include dynamic content or scripts.",
- "Ensure the HTML content is well-structured and valid.",
-];
-const TipsCard = () => {
- return (
-
-
- Tips on Acceptable HTML Links
-
-
- {tips.map((tip, index) => (
-
- {tip}
-
- ))}
-
-
- );
-};
-
-export default TipsCard;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/email/generate-with-html/layout.tsx b/src/app/dashboard/(admin)/admin/(overview)/email/generate-with-html/layout.tsx
deleted file mode 100644
index d2555f97f..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/email/generate-with-html/layout.tsx
+++ /dev/null
@@ -1,19 +0,0 @@
-import { FC, ReactNode } from "react";
-
-import { Breadcrumb } from "~/components/common/breadcrumb";
-
-interface IProperties {
- children: ReactNode;
-}
-const layout: FC = ({ children }) => {
- return (
-
- );
-};
-
-export default layout;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/email/generate-with-html/page.testx.tsx b/src/app/dashboard/(admin)/admin/(overview)/email/generate-with-html/page.testx.tsx
deleted file mode 100644
index ba7bddf8b..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/email/generate-with-html/page.testx.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import { render } from "~/test/utils";
-import Page from "./page";
-
-describe("page tests", () => {
- it("generate with html page renders correctly", () => {
- expect.assertions(1);
- render( );
- expect(true).toBeTruthy();
- });
-});
diff --git a/src/app/dashboard/(admin)/admin/(overview)/email/generate-with-html/page.tsx b/src/app/dashboard/(admin)/admin/(overview)/email/generate-with-html/page.tsx
deleted file mode 100644
index cf0a3e16f..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/email/generate-with-html/page.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-import PageHeader from "../_components/page-header";
-import GenerateField from "./_components/generate-field/generate-field";
-import TipsCard from "./_components/tips";
-
-const page = () => {
- return (
-
- );
-};
-
-export default page;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/email/generate-with-html/preview-template/_component.tsx/HtmlTemplateViewer.test.tsx b/src/app/dashboard/(admin)/admin/(overview)/email/generate-with-html/preview-template/_component.tsx/HtmlTemplateViewer.test.tsx
deleted file mode 100644
index e33668e01..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/email/generate-with-html/preview-template/_component.tsx/HtmlTemplateViewer.test.tsx
+++ /dev/null
@@ -1,55 +0,0 @@
-import { fireEvent, render, screen } from "@testing-library/react";
-import { describe, expect, it, vi } from "vitest";
-
-import "@testing-library/jest-dom";
-
-import HtmlTemplateViewer from "./TemplateViewer";
-
-describe("htmlTemplateViewer", () => {
- it("should scroll its content", () => {
- expect.hasAssertions();
- render( );
- const scrollContainer = screen.getByTestId("scroll-container");
- expect(scrollContainer).toHaveClass("overflow-y-auto");
- });
-
- it("should accept template prop of HTML content", () => {
- expect.hasAssertions();
- const template = "Hello World
";
- render( );
- const content = screen.getByTestId("template-content");
- expect(content).toContainHTML(template);
- });
-
- it("should accept mode prop - preview", () => {
- expect.hasAssertions();
- const template = "Hello World
";
- render( );
- const content = screen.getByTestId("template-content");
- expect(content.innerHTML).toBe(template);
- });
-
- it("should accept mode prop - edit", () => {
- expect.hasAssertions();
- const template = "Hello World
";
- render( );
- const content = screen.getByTestId("template-content");
- expect(content.tagName).toBe("TEXTAREA");
- });
-
- it("should call onEdit with updated content", () => {
- expect.hasAssertions();
- const handleEdit = vi.fn();
- const template = "Hello World
";
- render(
- ,
- );
- const content = screen.getByTestId("template-content");
- fireEvent.change(content, { target: { value: "New Content" } });
- expect(handleEdit).toHaveBeenCalledWith("New Content");
- });
-});
diff --git a/src/app/dashboard/(admin)/admin/(overview)/email/generate-with-html/preview-template/_component.tsx/TemplateViewer.tsx b/src/app/dashboard/(admin)/admin/(overview)/email/generate-with-html/preview-template/_component.tsx/TemplateViewer.tsx
deleted file mode 100644
index 3909f607a..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/email/generate-with-html/preview-template/_component.tsx/TemplateViewer.tsx
+++ /dev/null
@@ -1,79 +0,0 @@
-import { usePathname } from "next/navigation";
-import React, { ReactNode, useEffect, useRef, useState } from "react";
-
-interface PreviewComponentProperties {
- template?: string | ReactNode;
- mode?: "preview" | "edit";
- onEdit?: (content: string) => void;
-}
-
-const TemplateViewer: React.FC = ({
- template,
- mode = "preview",
- onEdit,
-}) => {
- const [content, setContent] = useState(template as string);
- const contentReference = useRef(null);
- const pathname = usePathname();
-
- useEffect(() => {
- if (typeof template === "string") {
- setContent(template);
- }
- }, [template]);
-
- useEffect(() => {
- if (mode === "edit" && contentReference.current) {
- contentReference.current.value = content;
- }
- }, [mode, content]);
-
- const handleContentChange = (
- event: React.ChangeEvent,
- ) => {
- const newContent = event.target.value;
- if (newContent !== content) {
- setContent(newContent);
- onEdit?.(newContent);
- }
- };
-
- return (
-
-
-
- {mode === "edit" ? (
-
- ) : (
-
- )}
-
-
-
- );
-};
-
-export default TemplateViewer;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/email/generate-with-html/preview-template/_component.tsx/index.tsx b/src/app/dashboard/(admin)/admin/(overview)/email/generate-with-html/preview-template/_component.tsx/index.tsx
deleted file mode 100644
index 9b2e1fad8..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/email/generate-with-html/preview-template/_component.tsx/index.tsx
+++ /dev/null
@@ -1,64 +0,0 @@
-"use client";
-
-import { useState } from "react";
-import { renderToString } from "react-dom/server";
-
-import { Button } from "~/components/common/common-button";
-import AccountActivationSuccessful from "~/email/templates/account-activation-successful/image";
-import PageHeader from "../../../_components/page-header";
-import TemplateViewer from "./TemplateViewer";
-
-const HtmlTemplateViewer = () => {
- // Define the props for the component
- const previewProperties = {
- title: "Your Account is Now Active!",
- username: "John Doe",
- image: "https://imgur.com/3Yymb22.png",
- link: "/",
- description:
- "Congratulations! Your account with Boilerplate is now active and ready to use.",
- descriptionOne:
- "We're thrilled to have you as part of our community and look forward to helping you make the most out of your experience with us.",
- descriptionTwo:
- "You can now log in and start exploring all the features and benefits we have to offer. ",
- };
-
- // Convert the React component to a string with the props
- // eslint-disable-next-line testing-library/render-result-naming-convention
- const welcomeEmailString = renderToString(
- ,
- );
-
- const [template, setTemplate] = useState(welcomeEmailString);
- const [mode, setMode] = useState<"preview" | "edit">("preview");
-
- const toggleMode = () => {
- setMode((previousMode) =>
- previousMode === "preview" ? "edit" : "preview",
- );
- };
-
- const handleEdit = (newContent: string) => {
- setTemplate(newContent);
- };
-
- return (
-
-
-
-
- {mode === "preview" ? "Edit Content" : "Preview Content"}
-
-
-
-
- );
-};
-
-export default HtmlTemplateViewer;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/email/generate-with-html/preview-template/_component.tsx/manual.md b/src/app/dashboard/(admin)/admin/(overview)/email/generate-with-html/preview-template/_component.tsx/manual.md
deleted file mode 100644
index 1dc4bbc30..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/email/generate-with-html/preview-template/_component.tsx/manual.md
+++ /dev/null
@@ -1,11 +0,0 @@
-FILES:
-index.tsx - This file holds the view that consist of the MAIN component and some other dummy component e.g (breadcrumbs, texts, an edit content button etc...), it also simulates the functionality of the component i.e (to edit template and to preview template).
-TemplateViewer.tsx - the is the main standalone component (MY TASK, based on the issue created [#43](https://github.com/hngprojects/hng_boilerplate_nextjs/issues/43))
-template-example.tsx - this contains dummy html templates (please NOTE: converting react.js template to html before parsing into the preview component is not specified in the task brief..but it can be done.)
-HtmlTemplateViewer.test.tsx - this is the test file
-manual.md - a mini read me file to help reviewers navigate the component.
-
-HOW TO USE:
-Just import the HtmlTemplateViewer folder(index.tsx) into the admin page (/admin) to view the component.
-
-Thank you. :+1:
\ No newline at end of file
diff --git a/src/app/dashboard/(admin)/admin/(overview)/email/generate-with-html/preview-template/_component.tsx/template-example.tsx b/src/app/dashboard/(admin)/admin/(overview)/email/generate-with-html/preview-template/_component.tsx/template-example.tsx
deleted file mode 100644
index db41d247f..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/email/generate-with-html/preview-template/_component.tsx/template-example.tsx
+++ /dev/null
@@ -1,360 +0,0 @@
-export const templateOne = `
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Boilerplate.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Welcome to Boilerplate
- Thanks for signing up
-
-
-
-
-
-
-
-
- Hi John Doe,
- We're thrilled to have you join us. Experience quality and innovation like never before. Our product is made to fit your needs and make your life easier.
-
-
-
-
-
-
-
-
- Here’s what you can look forward to
-
-
-
- Exclusive Offers: Enjoy special promotions and discounts available only to our members.
-
-
-
- Exclusive Offers: Enjoy special promotions and discounts available only to our members.
-
-
-
- Exclusive Offers: Enjoy special promotions and discounts available only to our members.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Regards, Boilerplate
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
You are receiving this email because you signed up at Boilerplate.com . Want to change how you receive these emails?
-
-
-
-
-
-
-
-
-
-
-
-`;
-
-export const templateTwo = `
-
-
-
-
- Styled Email Template
-
-
-
-
-
-
-
- Lorem ipsum dolor sit amet consectetur adipisicing elit. Animi
- deleniti, sit unde ullam consequuntur est at! Ullam officia possimus
- maiores nam cumque earum atque dolores provident! Aliquam iste quaerat
- quasi placeat tenetur, voluptatum inventore ad ratione, veniam error
- illo repellendus eaque quam magnam nobis autem totam in veritatis
- doloribus soluta unde? Nemo sequi ipsam tempora pariatur hic veniam
- harum magni provident iste iusto
-
-
-
- qui blanditiis, totam aspernatur natus laboriosam eligendi itaque cum
- quidem voluptate officiis dolorum ex beatae aut dolores? Dolorem odit
- repellat, nisi eveniet perferendis quasi eum facilis nemo? Eum iure
- debitis officiis pariatur, reprehenderit voluptates perferendis
- perspiciatis optio!
-
-
- qui blanditiis, totam aspernatur natus laboriosam eligendi itaque cum
- quidem voluptate officiis dolorum ex beatae aut dolores? Dolorem odit
- repellat, nisi eveniet perferendis quasi eum facilis nemo? Eum iure
- debitis officiis pariatur, reprehenderit voluptates perferendis
- perspiciatis optio!
-
-
- qui blanditiis, totam aspernatur natus laboriosam eligendi itaque cum
- quidem voluptate officiis dolorum ex beatae aut dolores? Dolorem odit
- repellat, nisi eveniet perferendis quasi eum facilis nemo? Eum iure
- debitis officiis pariatur, reprehenderit voluptates perferendis
- perspiciatis optio!
-
-
- qui blanditiis, totam aspernatur natus laboriosam eligendi itaque cum
- quidem voluptate officiis dolorum ex beatae aut dolores? Dolorem odit
- repellat, nisi eveniet perferendis quasi eum facilis nemo? Eum iure
- debitis officiis pariatur, reprehenderit voluptates perferendis
- perspiciatis optio!
-
-
- qui blanditiis, totam aspernatur natus laboriosam eligendi itaque cum
- quidem voluptate officiis dolorum ex beatae aut dolores? Dolorem odit
- repellat, nisi eveniet perferendis quasi eum facilis nemo? Eum iure
- debitis officiis pariatur, reprehenderit voluptates perferendis
- perspiciatis optio!
-
-
- We hope you find this information helpful and engaging. As always, we
- welcome your feedback and suggestions. Feel free to
- contact us with any questions
- or comments.
-
-
Learn More
-
-
-
-
-
-`;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/email/generate-with-html/preview-template/page.test.tsx b/src/app/dashboard/(admin)/admin/(overview)/email/generate-with-html/preview-template/page.test.tsx
deleted file mode 100644
index 1e823cc05..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/email/generate-with-html/preview-template/page.test.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import { render } from "~/test/utils";
-import Page from "./page";
-
-describe("page tests", () => {
- it("preview template page renders correctly", () => {
- expect.assertions(1);
-
- render( );
-
- expect(true).toBeTruthy();
- });
-});
diff --git a/src/app/dashboard/(admin)/admin/(overview)/email/generate-with-html/preview-template/page.tsx b/src/app/dashboard/(admin)/admin/(overview)/email/generate-with-html/preview-template/page.tsx
deleted file mode 100644
index a516de46d..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/email/generate-with-html/preview-template/page.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import HtmlTemplateViewer from "./_component.tsx";
-
-const page = () => {
- return (
-
- {/* @kinxlo IS CURRENTLY WORKING ON THIS FIX 👍. will likely have to use package */}
-
-
- );
-};
-
-export default page;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/email/page.test.tsx b/src/app/dashboard/(admin)/admin/(overview)/email/page.test.tsx
deleted file mode 100644
index f821e35d5..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/email/page.test.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import { render } from "~/test/utils";
-import Page from "./page";
-
-describe("page tests", () => {
- it("admin email page renders correctly", () => {
- expect.assertions(1);
-
- render( );
-
- expect(true).toBeTruthy();
- });
-});
diff --git a/src/app/dashboard/(admin)/admin/(overview)/email/page.tsx b/src/app/dashboard/(admin)/admin/(overview)/email/page.tsx
deleted file mode 100644
index ff6dcea39..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/email/page.tsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import NewTemplate from "./_components/new-template/NewTemplate";
-import Toptab from "./_components/Toptab";
-
-const tabs = [
- {
- name: "New Template",
- value: "new",
- content: ,
- },
- {
- name: "Manage Template",
- value: "manage",
- content:
,
- },
-];
-
-const page = () => {
- return { }
;
-};
-
-export default page;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/faqs/FaqPage.tsx b/src/app/dashboard/(admin)/admin/(overview)/faqs/FaqPage.tsx
deleted file mode 100644
index 2e4dae9f5..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/faqs/FaqPage.tsx
+++ /dev/null
@@ -1,257 +0,0 @@
-"use client";
-
-import {
- CirclePlus,
- EllipsisVertical,
- Pencil,
- SearchIcon,
- Trash2,
-} from "lucide-react";
-import { useEffect, useState } from "react";
-
-import { getFaqs } from "~/actions/externalPages";
-import { Button } from "~/components/common/common-button";
-import Pagination from "~/components/layouts/pagination/Pagination";
-import TableSkeleton from "~/components/skeleton/tableskeleton";
-import {
- DropdownMenu,
- DropdownMenuContent,
- DropdownMenuItem,
- DropdownMenuLabel,
- DropdownMenuTrigger,
-} from "~/components/ui/dropdown-menu";
-import {
- Table,
- TableBody,
- TableCaption,
- TableCell,
- TableHead,
- TableHeader,
- TableRow,
-} from "~/components/ui/table";
-import AddFaqModal from "./_components/FaqModal/add-faq-modal";
-import DeleteDialog from "./_components/FaqModal/delete-dialog";
-import UpdateFaqModal from "./_components/FaqModal/update-faq-modal";
-
-// Define a type for the FAQ items
-interface FaqItem {
- id: string;
- question: string;
- answer: string;
- category: string;
-}
-
-const FaqPage = () => {
- const [faqs, setFaqs] = useState([]);
- const [loading, setLoading] = useState(true);
- const [displayedFaqs, setDisplayedFaqs] = useState([]);
- const [currentPage, setCurrentPage] = useState(1);
- const [isDialogOpen, setIsDialogOpen] = useState(false);
- const [createModal, setCreateModal] = useState(false);
- const [updateModal, setUpdateModal] = useState(false);
- const [selectedFaq, setSelectedFaq] = useState();
- const handleCloseDialog = () => setIsDialogOpen(false);
- const handleCloseUpdateDialog = () => setUpdateModal(false);
- const [callback, setCallback] = useState(false);
- const [searchValue, setSearchValue] = useState("");
- const pageSize = 4;
-
- // Get FAQs
- useEffect(() => {
- const fetchFaqs = async () => {
- const result = await getFaqs();
- if (result && (result.status === 200 || result.status === 201)) {
- setFaqs(result.data.data);
- } else {
- setFaqs([]);
- }
-
- setLoading(false);
- };
- fetchFaqs();
- }, [callback]);
-
- useEffect(() => {
- const startIndex = (currentPage - 1) * pageSize;
- const newDisplayedJobs = faqs.slice(startIndex, startIndex + pageSize);
- setDisplayedFaqs(newDisplayedJobs);
- }, [faqs, currentPage]);
-
- // open update dialog and set selected FAQ
- const handleOpenUpdateDialog = (faq: FaqItem) => {
- setSelectedFaq(faq);
- setUpdateModal(true);
- };
-
- const handleOpenDialog = (faq: FaqItem) => {
- setSelectedFaq(faq);
- setIsDialogOpen(true);
- };
-
- // search filter
- const filteredFaqs = displayedFaqs?.filter(
- (faq) =>
- faq.question.toLowerCase().includes(searchValue.toLowerCase()) ||
- faq.answer.toLowerCase().includes(searchValue.toLowerCase()),
- );
-
- //
- return (
-
-
-
- FAQ
-
-
- Manage your frequently asked questions efficiently.
-
-
-
-
-
-
- setSearchValue(event.target.value)}
- />
-
-
-
- setCreateModal(true)}
- className="inline-flex h-10 items-center justify-center bg-primary"
- >
-
- Add FAQ
-
-
-
-
-
-
-
- A list of faqs.
-
-
-
- Frequently Asked Questions
- Category
- Answers
- Action
-
-
-
-
- {loading ? (
-
- ) : (
- <>
- {filteredFaqs?.map((faq, index) => {
- return (
-
- {faq.question}
-
- {faq.category}
-
- {faq.answer}
-
-
-
-
-
-
-
-
-
-
-
- Actions
-
- handleOpenUpdateDialog(faq)}
- >
-
- Edit
- {" "}
- handleOpenDialog(faq)}
- >
- Delete
-
-
-
-
-
- );
- })}
- >
- )}
-
-
-
- {/* create modal */}
- {createModal && (
-
setCreateModal(false)}
- callback={callback}
- setCallback={setCallback}
- />
- )}
-
- {/* delete modal */}
- {isDialogOpen && selectedFaq && (
-
- )}
-
- {/* update modal */}
- {updateModal && selectedFaq && (
-
- )}
-
- {!loading && faqs?.length === 0 && (
- No data available
- )}
-
-
-
- {!loading && faqs?.length > pageSize && (
-
setCurrentPage(page)}
- />
- )}
-
-
-
-
-
- );
-};
-
-export default FaqPage;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/faqs/_components/FaqModal/add-faq-modal.tsx b/src/app/dashboard/(admin)/admin/(overview)/faqs/_components/FaqModal/add-faq-modal.tsx
deleted file mode 100644
index 7a31ecd7f..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/faqs/_components/FaqModal/add-faq-modal.tsx
+++ /dev/null
@@ -1,183 +0,0 @@
-import { useState } from "react";
-
-import { CreateFaqs } from "~/actions/faq";
-import { Button } from "~/components/common/common-button";
-import { Input } from "~/components/common/input";
-import LoadingSpinner from "~/components/miscellaneous/loading-spinner";
-import {
- Dialog,
- DialogContent,
- DialogFooter,
- DialogHeader,
- DialogTitle,
- DialogTrigger,
-} from "~/components/ui/dialog";
-import { Label } from "~/components/ui/label";
-import {
- Select,
- SelectContent,
- SelectItem,
- SelectTrigger,
- SelectValue,
-} from "~/components/ui/select";
-import { Textarea } from "~/components/ui/textarea";
-import { useToast } from "~/components/ui/use-toast";
-
-interface AddFaqModalProperties {
- callback: boolean;
- setCallback: (value: boolean) => void;
- onClose: () => void;
-}
-
-const AddFaqModal = ({
- callback,
- setCallback,
- onClose,
-}: AddFaqModalProperties) => {
- const [question, setQuestion] = useState("");
- const [answer, setAnswer] = useState("");
- const [category, setCategory] = useState("");
- const [loading, setLoading] = useState(false);
- const { toast } = useToast();
-
- //add faq
- const handleFaq = async () => {
- setLoading(true);
-
- // validate input
- if (answer === "" || question === "") {
- toast({
- title: "Error",
- description: "Inputs cannot be empty",
- variant: "destructive",
- });
- setLoading(false);
- return;
- }
-
- const payload = {
- question,
- answer,
- category,
- };
-
- const result = await CreateFaqs(payload);
-
- if (result?.status === 200 || result?.status === 201) {
- setCallback(!callback);
- toast({
- title: "Success",
- description: "Faq created successfully",
- variant: "default",
- });
-
- onClose();
- setLoading(false);
- } else {
- toast({
- title: "Error",
- description: result?.error,
- variant: "destructive",
- });
- setLoading(false);
- setCallback(!callback);
- }
- };
-
- return (
-
-
-
-
- Create FAQ
-
-
-
-
-
-
- Question*
-
- setQuestion(event.target.value)}
- />
-
-
-
-
- Category*
-
- setCategory(value)}
- value={category}
- >
-
-
-
-
- Pricing
- Policy
- General
-
-
-
-
-
-
- Answer
-
- setAnswer(event.target.value)}
- />
-
-
-
- Minimum of 50 characters
-
-
-
-
-
- Cancel
-
-
-
- {loading ? (
-
- Saving {" "}
-
-
- ) : (
- "Save"
- )}
-
-
-
-
- );
-};
-
-export default AddFaqModal;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/faqs/_components/FaqModal/delete-dialog.tsx b/src/app/dashboard/(admin)/admin/(overview)/faqs/_components/FaqModal/delete-dialog.tsx
deleted file mode 100644
index 74ec9cd0c..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/faqs/_components/FaqModal/delete-dialog.tsx
+++ /dev/null
@@ -1,95 +0,0 @@
-"use client";
-
-import { useState } from "react";
-
-import { DeleteFaqs } from "~/actions/faq";
-import { Button } from "~/components/common/common-button";
-import LoadingSpinner from "~/components/miscellaneous/loading-spinner";
-import {
- Dialog,
- DialogContent,
- DialogDescription,
- DialogHeader,
- DialogTitle,
-} from "~/components/ui/dialog";
-import { useToast } from "~/components/ui/use-toast";
-
-interface Properties {
- onClose: () => void;
- faqs: {
- id: string;
- question: string;
- answer: string;
- category: string;
- };
- callback: boolean;
- setCallback: (value: boolean) => void;
-}
-
-const DeleteDialog = (properties: Properties) => {
- const [loading, setLoading] = useState(false);
- const { toast } = useToast();
- //
- const handleDelete = async () => {
- setLoading(true);
-
- const response = await DeleteFaqs(properties?.faqs?.id);
- if (response?.status === 200 || response?.status === 201) {
- properties?.setCallback(!properties?.callback);
- toast({
- title: "Success",
- description: "Faq Deleted successfully",
- variant: "default",
- });
- properties?.onClose();
- setLoading(false);
- } else {
- toast({
- title: "Error",
- description: response?.error,
- variant: "destructive",
- });
- setLoading(false);
- }
- };
-
- return (
-
-
-
-
- Are you absolutely sure?
-
-
- This action cannot be undone. This will permanently delete this FAQ
- from the database.
-
-
-
-
- Cancel
-
-
- {loading ? (
-
- Deleting {" "}
-
-
- ) : (
- "Delete"
- )}
-
-
-
-
- );
-};
-
-export default DeleteDialog;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/faqs/_components/FaqModal/update-faq-modal.tsx b/src/app/dashboard/(admin)/admin/(overview)/faqs/_components/FaqModal/update-faq-modal.tsx
deleted file mode 100644
index 3e324d821..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/faqs/_components/FaqModal/update-faq-modal.tsx
+++ /dev/null
@@ -1,188 +0,0 @@
-"use client";
-
-import { useEffect, useState } from "react";
-
-import { UpdateFaqs } from "~/actions/faq";
-import { Button } from "~/components/common/common-button";
-import { Input } from "~/components/common/input";
-import LoadingSpinner from "~/components/miscellaneous/loading-spinner";
-import {
- Dialog,
- DialogContent,
- DialogFooter,
- DialogHeader,
- DialogTitle,
- DialogTrigger,
-} from "~/components/ui/dialog";
-import { Label } from "~/components/ui/label";
-import {
- Select,
- SelectContent,
- SelectItem,
- SelectTrigger,
- SelectValue,
-} from "~/components/ui/select";
-import { Textarea } from "~/components/ui/textarea";
-import { useToast } from "~/components/ui/use-toast";
-
-interface Properties {
- onClose: () => void;
- faqs: {
- id: string;
- question: string;
- answer: string;
- category: string;
- };
- callback: boolean;
- setCallback: (callback: boolean) => void;
-}
-
-const UpdateFaqModal = (properties: Properties) => {
- const [question, setQuestion] = useState("");
- const [answer, setAnswer] = useState("");
- const [category, setCategory] = useState("");
- const [loading, setLoading] = useState(false);
- const { toast } = useToast();
-
- useEffect(() => {
- setQuestion(properties?.faqs?.question || "");
- setAnswer(properties?.faqs?.answer || "");
- setCategory(properties?.faqs?.category || "");
- }, [properties?.faqs]);
-
- const handleFaq = async () => {
- setLoading(true);
-
- if (answer === "" || question === "") {
- toast({
- title: "Error",
- description: "Inputs cannot be empty",
- variant: "destructive",
- });
- setLoading(false);
- return;
- }
-
- const payload = {
- question,
- answer,
- category,
- };
-
- const result = await UpdateFaqs(payload, properties?.faqs?.id);
- if (result?.status === 200 || result?.status === 201) {
- properties?.setCallback(!properties?.callback);
- toast({
- title: "Success",
- description: "FAQ updated successfully",
- variant: "default",
- });
- properties?.onClose();
- setLoading(false);
- } else {
- toast({
- title: "Error",
- description: result?.error,
- variant: "destructive",
- });
- setLoading(false);
- }
- };
-
- return (
-
-
-
-
- Update FAQ
-
-
-
-
-
-
- Question*
-
- setQuestion(event.target.value)}
- />
-
-
-
-
- Category*
-
- setCategory(value)}
- value={category}
- >
-
-
-
-
- Pricing
- Policy
- General
-
-
-
-
-
-
- Answer
-
- setAnswer(event.target.value)}
- />
-
-
-
- Minimum of 50 characters
-
-
-
-
-
- Cancel
-
-
-
- {loading ? (
-
- Saving {" "}
-
-
- ) : (
- "Save"
- )}
-
-
-
-
- );
-};
-
-export default UpdateFaqModal;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/faqs/_components/FaqTable/faq-table.tsx b/src/app/dashboard/(admin)/admin/(overview)/faqs/_components/FaqTable/faq-table.tsx
deleted file mode 100644
index b77169dd7..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/faqs/_components/FaqTable/faq-table.tsx
+++ /dev/null
@@ -1,186 +0,0 @@
-"use client";
-
-import { EllipsisVertical, Pencil, Trash2 } from "lucide-react";
-import { useEffect, useState } from "react";
-
-import { getFaqs } from "~/actions/externalPages";
-import Pagination from "~/components/layouts/pagination/Pagination";
-import TableSkeleton from "~/components/skeleton/tableskeleton";
-import { Button } from "~/components/ui/button";
-import {
- DropdownMenu,
- DropdownMenuContent,
- DropdownMenuItem,
- DropdownMenuLabel,
- DropdownMenuTrigger,
-} from "~/components/ui/dropdown-menu";
-import {
- Table,
- TableBody,
- TableCaption,
- TableCell,
- TableHead,
- TableHeader,
- TableRow,
-} from "~/components/ui/table";
-import DeleteDialog from "../FaqModal/delete-dialog";
-import UpdateFaqModal from "../FaqModal/update-faq-modal";
-
-// Define a type for the FAQ items
-interface FaqItem {
- id: string;
- question: string;
- answer: string;
- category: string;
-}
-
-const FaqTable = ({
- callback,
- setCallback,
-}: {
- callback: boolean;
- setCallback: (value: boolean) => void;
-}) => {
- const [faqs, setFaqs] = useState([]);
- const [loading, setLoading] = useState(true);
- const [displayedFaqs, setDisplayedFaqs] = useState([]);
- const [currentPage, setCurrentPage] = useState(1);
- const [isDialogOpen, setIsDialogOpen] = useState(false);
- const [updateModal, setUpdateModal] = useState(false);
- const handleOpenDialog = () => setIsDialogOpen(true);
- const handleCloseDialog = () => setIsDialogOpen(false);
- const handleCloseUpdateDialog = () => setUpdateModal(false);
- const pageSize = 4;
-
- // Get FAQs
- useEffect(() => {
- const fetchFaqs = async () => {
- const result = await getFaqs();
- if (result && (result.status === 200 || result.status === 201)) {
- setFaqs(result.data.data);
- } else {
- setFaqs([]);
- }
-
- setLoading(false);
- };
- fetchFaqs();
- }, [callback]);
-
- useEffect(() => {
- const startIndex = (currentPage - 1) * pageSize;
- const newDisplayedJobs = faqs.slice(startIndex, startIndex + pageSize);
- setDisplayedFaqs(newDisplayedJobs);
- }, [faqs, currentPage]);
-
- // open dialog
- const handleOpenUpdateDialog = () => {
- setUpdateModal(true);
- };
-
- //
- return (
-
-
- A list of faqs.
-
-
-
- Frequently Asked Questions
- Category
- Answers
- Action
-
-
-
-
- {loading ? (
-
- ) : (
- <>
- {displayedFaqs?.map((faq, index) => {
- return (
-
- {faq.question}
-
- {faq.category}
- {faq.answer}
-
-
-
-
-
-
-
-
-
-
- Actions
-
-
-
- Edit
- {" "}
-
- Delete
-
-
-
-
-
- {isDialogOpen && (
-
- )}
- {updateModal && (
-
- )}
-
- );
- })}
- >
- )}
-
-
- {!loading && faqs?.length === 0 && (
-
No data available
- )}
-
-
-
- {!loading && faqs?.length > pageSize && (
-
setCurrentPage(page)}
- />
- )}
-
-
-
- );
-};
-
-export default FaqTable;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/faqs/data/mock.faqs.ts b/src/app/dashboard/(admin)/admin/(overview)/faqs/data/mock.faqs.ts
deleted file mode 100644
index 9557eaca6..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/faqs/data/mock.faqs.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-export interface Faq {
- question: string;
- answer: string;
-}
-
-export const faqs: Faq[] = [
- {
- question: "What payment method do you accept",
- answer:
- "We accept cash, credit cards (Visa, Mastercard, America Express) and mobile payment (Apple Pay, Google Pay)",
- },
- {
- question: "Is there a discount for annual subscriptions",
- answer:
- "We accept cash, credit cards (Visa, Mastercard, America Express) and mobile payment (Apple Pay, Google Pay)",
- },
- {
- question: "What payment method do you accept",
- answer:
- "We accept cash, credit cards (Visa, Mastercard, America Express) and mobile payment (Apple Pay, Google Pay)",
- },
- {
- question: "What payment method do you accept",
- answer:
- "We accept cash, credit cards (Visa, Mastercard, America Express) and mobile payment (Apple Pay, Google Pay)",
- },
- {
- question: "What payment method do you accept",
- answer:
- "We accept cash, credit cards (Visa, Mastercard, America Express) and mobile payment (Apple Pay, Google Pay)",
- },
- {
- question: "What payment method do you accept",
- answer:
- "We accept cash, credit cards (Visa, Mastercard, America Express) and mobile payment (Apple Pay, Google Pay)",
- },
- {
- question: "What payment method do you accept",
- answer:
- "We accept cash, credit cards (Visa, Mastercard, America Express) and mobile payment (Apple Pay, Google Pay)",
- },
- {
- question: "What payment method do you accept",
- answer:
- "We accept cash, credit cards (Visa, Mastercard, America Express) and mobile payment (Apple Pay, Google Pay)",
- },
-];
diff --git a/src/app/dashboard/(admin)/admin/(overview)/faqs/page.tsx b/src/app/dashboard/(admin)/admin/(overview)/faqs/page.tsx
deleted file mode 100644
index 2f5d96065..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/faqs/page.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-"use client";
-
-import FaqPage from "./FaqPage";
-
-const page = () => {
- //
- return ;
-};
-
-export default page;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/layout.tsx b/src/app/dashboard/(admin)/admin/(overview)/layout.tsx
deleted file mode 100644
index e1b6d7de3..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/layout.tsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import { Suspense } from "react";
-
-import Sidebar from "~/app/dashboard/(admin)/_components/layout/Sidebar";
-
-export default function AdminLayout({
- children,
-}: {
- children: React.ReactNode;
-}) {
- return (
-
-
-
- {children}
-
-
- );
-}
diff --git a/src/app/dashboard/(admin)/admin/(overview)/page.test.tsx b/src/app/dashboard/(admin)/admin/(overview)/page.test.tsx
deleted file mode 100644
index dea52ad56..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/page.test.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import { render } from "~/test/utils";
-import Page from "./page";
-
-describe("page tests", () => {
- it("should render correctly", () => {
- expect.assertions(1);
-
- render( );
-
- expect(true).toBeTruthy();
- });
-});
diff --git a/src/app/dashboard/(admin)/admin/(overview)/page.tsx b/src/app/dashboard/(admin)/admin/(overview)/page.tsx
deleted file mode 100644
index 6822724ad..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/page.tsx
+++ /dev/null
@@ -1,13 +0,0 @@
-import AdminPage from "~/app/dashboard/(admin)/admin/(overview)/client";
-
-export const metadata = {
- title: "Dashboard",
- description:
- "Super Admin Dashboard using ShadCN UI components, adhering to design specifications and best practices for accessibility.",
-};
-
-const Admin = () => {
- return ;
-};
-
-export default Admin;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/products/_components/ProductModal/add-product-modal.test.tsx b/src/app/dashboard/(admin)/admin/(overview)/products/_components/ProductModal/add-product-modal.test.tsx
deleted file mode 100644
index 37bc71bd5..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/products/_components/ProductModal/add-product-modal.test.tsx
+++ /dev/null
@@ -1,66 +0,0 @@
-import { fireEvent, render, screen } from "@testing-library/react";
-import { describe, expect, it } from "vitest";
-
-import AddProductModal from "./add-product-modal";
-
-describe("addProductModal", () => {
- it("renders the modal with correct title and description", async () => {
- expect.hasAssertions();
- render(
-
- Open Modal
- ,
- );
-
- expect(screen.getByText("Open Modal")).toBeInTheDocument();
-
- fireEvent.click(screen.getByText("Open Modal"));
-
- await expect(
- screen.findByText("Add new product"),
- ).resolves.toBeInTheDocument();
- await expect(
- screen.findByText("Create a new product"),
- ).resolves.toBeInTheDocument();
- });
-
- it("renders form fields", async () => {
- expect.hasAssertions();
- render(
-
- Open Modal
- ,
- );
-
- fireEvent.click(screen.getByText("Open Modal"));
-
- await expect(
- screen.findByLabelText("Product name"),
- ).resolves.toBeInTheDocument();
- await expect(
- screen.findByLabelText("Product Description"),
- ).resolves.toBeInTheDocument();
- await expect(screen.findByLabelText("Price")).resolves.toBeInTheDocument();
- await expect(
- screen.findByLabelText("Quantity"),
- ).resolves.toBeInTheDocument();
- await expect(
- screen.findByText("Upload Images"),
- ).resolves.toBeInTheDocument();
- });
-
- it("renders submit button", async () => {
- expect.hasAssertions();
- render(
-
- Open Modal
- ,
- );
-
- fireEvent.click(screen.getByText("Open Modal"));
-
- await expect(
- screen.findByRole("button", { name: "Add Product" }),
- ).resolves.toBeInTheDocument();
- });
-});
diff --git a/src/app/dashboard/(admin)/admin/(overview)/products/_components/ProductModal/add-product-modal.tsx b/src/app/dashboard/(admin)/admin/(overview)/products/_components/ProductModal/add-product-modal.tsx
deleted file mode 100644
index 5dbc84808..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/products/_components/ProductModal/add-product-modal.tsx
+++ /dev/null
@@ -1,118 +0,0 @@
-import { Button } from "~/components/common/common-button";
-import { Input } from "~/components/common/input";
-import {
- Dialog,
- DialogContent,
- DialogDescription,
- DialogFooter,
- DialogHeader,
- DialogTitle,
- DialogTrigger,
-} from "~/components/ui/dialog";
-import { Label } from "~/components/ui/label";
-import { Textarea } from "~/components/ui/textarea";
-
-interface AddProductModalProperties {
- children: React.ReactNode;
-}
-const AddProductModal = ({ children }: AddProductModalProperties) => {
- return (
-
- {children}
-
-
-
- Add new product
-
-
- Create a new product
-
-
-
-
-
- Product name
-
-
-
-
-
- Product Description
-
-
-
-
-
-
-
- Upload Images
-
-
- Choose file No file choosen
-
-
-
-
-
-
-
- Add Product
-
-
-
-
- );
-};
-
-export default AddProductModal;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/products/_components/ProductModal/delete-dialog.test.tsx b/src/app/dashboard/(admin)/admin/(overview)/products/_components/ProductModal/delete-dialog.test.tsx
deleted file mode 100644
index 638577655..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/products/_components/ProductModal/delete-dialog.test.tsx
+++ /dev/null
@@ -1,39 +0,0 @@
-import { fireEvent, render, screen } from "@testing-library/react";
-import { describe, expect, it, vi } from "vitest";
-
-import DeleteDialog from "./delete-dialog";
-
-describe("deleteDialog", () => {
- it("renders the dialog with correct content", () => {
- expect.hasAssertions();
- const onClose = vi.fn();
- render( );
-
- expect(screen.getByText("Are you absolutely sure?")).toBeInTheDocument();
- expect(
- screen.getByText(
- "This action cannot be undone. This will permanently delete this product from the database.",
- ),
- ).toBeInTheDocument();
- expect(screen.getByRole("button", { name: /cancel/i })).toBeInTheDocument();
- expect(screen.getByRole("button", { name: /delete/i })).toBeInTheDocument();
- });
-
- it("calls onClose when Cancel button is clicked", () => {
- expect.hasAssertions();
- const onClose = vi.fn();
- render( );
-
- fireEvent.click(screen.getByRole("button", { name: /cancel/i }));
- expect(onClose).toHaveBeenCalledTimes(1);
- });
-
- it("calls onClose when Delete button is clicked", () => {
- expect.hasAssertions();
- const onClose = vi.fn();
- render( );
-
- fireEvent.click(screen.getByRole("button", { name: /delete/i }));
- expect(onClose).toHaveBeenCalledTimes(1);
- });
-});
diff --git a/src/app/dashboard/(admin)/admin/(overview)/products/_components/ProductModal/delete-dialog.tsx b/src/app/dashboard/(admin)/admin/(overview)/products/_components/ProductModal/delete-dialog.tsx
deleted file mode 100644
index 0952a8bf6..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/products/_components/ProductModal/delete-dialog.tsx
+++ /dev/null
@@ -1,43 +0,0 @@
-import { Button } from "~/components/common/common-button";
-import {
- Dialog,
- DialogContent,
- DialogDescription,
- DialogHeader,
- DialogTitle,
-} from "~/components/ui/dialog";
-
-const DeleteDialog = ({ onClose }: { onClose: () => void }) => {
- return (
-
-
-
-
- Are you absolutely sure?
-
-
- This action cannot be undone. This will permanently delete this
- product from the database.
-
-
-
-
- Cancel
-
-
- Delete
-
-
-
-
- );
-};
-
-export default DeleteDialog;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/products/_components/ProductTable/product-table.tsx b/src/app/dashboard/(admin)/admin/(overview)/products/_components/ProductTable/product-table.tsx
deleted file mode 100644
index 558392a29..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/products/_components/ProductTable/product-table.tsx
+++ /dev/null
@@ -1,151 +0,0 @@
-"use client";
-
-import clsx from "clsx";
-import { ChevronLeft, ChevronRight, EllipsisVertical } from "lucide-react";
-import { useState } from "react";
-
-import { Button } from "~/components/ui/button";
-import {
- DropdownMenu,
- DropdownMenuContent,
- DropdownMenuItem,
- DropdownMenuLabel,
- DropdownMenuTrigger,
-} from "~/components/ui/dropdown-menu";
-import {
- Pagination,
- PaginationContent,
- PaginationEllipsis,
- PaginationItem,
- PaginationLink,
-} from "~/components/ui/pagination";
-import {
- Table,
- TableBody,
- TableCaption,
- TableCell,
- TableHead,
- TableHeader,
- TableRow,
-} from "~/components/ui/table";
-import { Product, products } from "../../data/mock.products";
-import DeleteDialog from "../ProductModal/delete-dialog";
-
-const ProductRow = ({ product }: { product: Product }) => {
- const [isDialogOpen, setIsDialogOpen] = useState(false);
- const handleOpenDialog = () => setIsDialogOpen(true);
- const handleCloseDialog = () => setIsDialogOpen(false);
- return (
- <>
-
-
-
-
- {product.price}
- {product.totalSold}
-
-
- {product.status}
-
-
- {product.createdAt}
-
-
-
-
-
-
-
-
- Actions
- Edit
-
- Delete
-
-
-
-
-
- {isDialogOpen && }
- >
- );
-};
-
-const ProductTable = () => {
- return (
-
-
-
- A list of your recent invoices.
-
-
-
- Name
- Price
- Total Sold
- Status
- Created at
- Action
-
-
-
- {products.map((product) => {
- return ;
- })}
-
-
-
-
-
-
-
- {" "}
- Previous
-
-
-
-
- 1
-
-
-
-
- 2
-
-
-
-
- 3
-
-
-
-
-
-
-
- Next
-
-
-
-
-
-
- );
-};
-
-export default ProductTable;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/products/_components/ProductTable/product.table.test.tsx b/src/app/dashboard/(admin)/admin/(overview)/products/_components/ProductTable/product.table.test.tsx
deleted file mode 100644
index 4169ff9e4..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/products/_components/ProductTable/product.table.test.tsx
+++ /dev/null
@@ -1,39 +0,0 @@
-import { fireEvent, render, screen } from "@testing-library/react";
-import { describe, expect, it } from "vitest";
-
-import { products } from "../../data/mock.products";
-import ProductTable from "./product-table";
-
-describe("productTable", () => {
- it("renders the table with product data and interacts correctly", () => {
- expect.hasAssertions();
- render( );
-
- expect(screen.getByText("Name")).toBeInTheDocument();
- expect(screen.getByText("Price")).toBeInTheDocument();
- expect(screen.getByText("Total Sold")).toBeInTheDocument();
- expect(screen.getByText("Created at")).toBeInTheDocument();
- expect(screen.getByText("Action")).toBeInTheDocument();
-
- for (const product of products) {
- expect(screen.getByText(product.name)).toBeInTheDocument();
- expect(screen.getByText(product.price)).toBeInTheDocument();
- expect(screen.getByText(product.totalSold)).toBeInTheDocument();
- expect(screen.getByText(product.createdAt)).toBeInTheDocument();
- }
-
- const actionButtons = screen.getAllByRole("button", { name: "" });
- fireEvent.click(actionButtons[0]);
-
- fireEvent.click(document.body);
-
- expect(screen.getByText("Previous")).toBeInTheDocument();
- expect(screen.getByText("1")).toBeInTheDocument();
- expect(screen.getByText("2")).toBeInTheDocument();
- expect(screen.getByText("3")).toBeInTheDocument();
- expect(screen.getByText("Next")).toBeInTheDocument();
-
- const nextButton = screen.getByText("Next");
- fireEvent.click(nextButton);
- });
-});
diff --git a/src/app/dashboard/(admin)/admin/(overview)/products/data/mock.products.ts b/src/app/dashboard/(admin)/admin/(overview)/products/data/mock.products.ts
deleted file mode 100644
index fef492c68..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/products/data/mock.products.ts
+++ /dev/null
@@ -1,38 +0,0 @@
-export interface Product {
- name: string;
- price: string;
- totalSold: string;
- status: "Active" | "Draft";
- createdAt: string;
-}
-
-export const products: Product[] = [
- {
- name: "Hypernova Headphones",
- price: "$129.99",
- totalSold: "25",
- status: "Draft",
- createdAt: "2024-07-16 10:36AM",
- },
- {
- name: "Galaxy Tablet",
- price: "$399.99",
- totalSold: "40",
- status: "Active",
- createdAt: "2024-07-14 03:15PM",
- },
- {
- name: "Astro Smartwatch",
- price: "$199.99",
- totalSold: "15",
- status: "Draft",
- createdAt: "2024-07-10 09:20AM",
- },
- {
- name: "Nebula Laptop",
- price: "$899.99",
- totalSold: "50",
- status: "Active",
- createdAt: "2024-07-08 01:45PM",
- },
-];
diff --git a/src/app/dashboard/(admin)/admin/(overview)/products/page.tsx b/src/app/dashboard/(admin)/admin/(overview)/products/page.tsx
deleted file mode 100644
index dff3f3025..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/products/page.tsx
+++ /dev/null
@@ -1,71 +0,0 @@
-"use client";
-
-import { CirclePlus, Filter } from "lucide-react";
-
-import { cardData } from "~/components/adminDashboard/cardData";
-import { Button } from "~/components/common/common-button";
-import CardComponent from "~/components/common/DashboardCard/CardComponent";
-import {
- DropdownMenu,
- DropdownMenuContent,
- DropdownMenuItem,
- DropdownMenuLabel,
- DropdownMenuTrigger,
-} from "~/components/ui/dropdown-menu";
-import AddProductModal from "./_components/ProductModal/add-product-modal";
-import ProductTable from "./_components/ProductTable/product-table";
-
-const page = () => {
- return (
-
-
- {[0, 1, 2].map((_, index) => (
-
- ))}
-
-
-
-
-
- Products
-
-
- Manage your products and view their sales performance.
-
-
-
-
-
-
-
- Filter
-
-
-
- Actions
- Draft
- Active
-
-
-
-
-
- Add Product
-
-
-
-
-
-
- );
-};
-
-export default page;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/users/[id]/component/dialogue/delete-dialog.test.tsx b/src/app/dashboard/(admin)/admin/(overview)/users/[id]/component/dialogue/delete-dialog.test.tsx
deleted file mode 100644
index 18c844bf7..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/users/[id]/component/dialogue/delete-dialog.test.tsx
+++ /dev/null
@@ -1,48 +0,0 @@
-import { fireEvent, render, screen } from "@testing-library/react";
-import { describe, expect, it, vi } from "vitest";
-
-import DeleteDialog from "./delete-dialog";
-
-describe("deleteDialog", () => {
- it("renders the dialog with correct content", () => {
- expect.hasAssertions();
- const onClose = vi.fn();
- const onDelete = vi.fn();
- render(
- ,
- );
-
- expect(screen.getByText("Are you absolutely sure?")).toBeInTheDocument();
- expect(
- screen.getByText(
- "This action cannot be undone. This will permanently delete this product from the database.",
- ),
- ).toBeInTheDocument();
- expect(screen.getByRole("button", { name: /cancel/i })).toBeInTheDocument();
- expect(screen.getByRole("button", { name: /delete/i })).toBeInTheDocument();
- });
-
- it("calls onClose when Cancel button is clicked", () => {
- expect.hasAssertions();
- const onClose = vi.fn();
- const onDelete = vi.fn();
- render(
- ,
- );
-
- fireEvent.click(screen.getByRole("button", { name: /cancel/i }));
- expect(onClose).toHaveBeenCalledTimes(1);
- });
-
- it("calls onDelete when Delete button is clicked", () => {
- expect.hasAssertions();
- const onClose = vi.fn();
- const onDelete = vi.fn();
- render(
- ,
- );
-
- fireEvent.click(screen.getByRole("button", { name: /delete/i }));
- expect(onDelete).toHaveBeenCalledTimes(1);
- });
-});
diff --git a/src/app/dashboard/(admin)/admin/(overview)/users/[id]/component/dialogue/delete-dialog.tsx b/src/app/dashboard/(admin)/admin/(overview)/users/[id]/component/dialogue/delete-dialog.tsx
deleted file mode 100644
index f6b329a47..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/users/[id]/component/dialogue/delete-dialog.tsx
+++ /dev/null
@@ -1,53 +0,0 @@
-import { Button } from "~/components/common/common-button";
-import LoadingSpinner from "~/components/miscellaneous/loading-spinner";
-import {
- Dialog,
- DialogContent,
- DialogDescription,
- DialogHeader,
- DialogTitle,
-} from "~/components/ui/dialog";
-
-const DeleteDialog = ({
- onClose,
- onDelete,
- isDeleting,
-}: {
- onClose: () => void;
- onDelete: () => void;
- isDeleting: boolean;
-}) => {
- return (
-
-
-
-
- Are you absolutely sure?
-
-
- This action cannot be undone. This will permanently delete this
- product from the database.
-
-
-
-
- Cancel
-
-
- Delete
- {isDeleting && }
-
-
-
-
- );
-};
-
-export default DeleteDialog;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/users/[id]/component/userModal.tsx b/src/app/dashboard/(admin)/admin/(overview)/users/[id]/component/userModal.tsx
deleted file mode 100644
index 81bdb6fe3..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/users/[id]/component/userModal.tsx
+++ /dev/null
@@ -1,116 +0,0 @@
-import { Button } from "~/components/common/common-button";
-import { Input } from "~/components/common/input";
-import {
- Dialog,
- DialogContent,
- DialogDescription,
- DialogFooter,
- DialogHeader,
- DialogTitle,
- DialogTrigger,
-} from "~/components/ui/dialog";
-import { Label } from "~/components/ui/label";
-
-interface AddProductModalProperties {
- children: React.ReactNode;
-}
-const AddUserModal = ({ children }: AddProductModalProperties) => {
- return (
-
- {children}
-
-
-
- Add new user
-
-
- Create a new user
-
-
-
-
-
-
-
- Upload Picture
-
-
-
- Click to upload
-
-
-
-
-
-
-
-
-
-
- Add new user
-
-
-
-
- );
-};
-
-export default AddUserModal;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/users/[id]/component/userProductTable.tsx b/src/app/dashboard/(admin)/admin/(overview)/users/[id]/component/userProductTable.tsx
deleted file mode 100644
index ea852c9b9..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/users/[id]/component/userProductTable.tsx
+++ /dev/null
@@ -1,15 +0,0 @@
-import UserTableBody from "./userProductTableBody";
-import UserTableHead from "./userProductTableHead";
-
-const UserProductsTable = () => {
- return (
- <>
-
- >
- );
-};
-
-export default UserProductsTable;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/users/[id]/component/userProductTableBody.tsx b/src/app/dashboard/(admin)/admin/(overview)/users/[id]/component/userProductTableBody.tsx
deleted file mode 100644
index e1d880b46..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/users/[id]/component/userProductTableBody.tsx
+++ /dev/null
@@ -1,181 +0,0 @@
-import { EllipsisVertical } from "lucide-react";
-
-import { Button } from "~/components/ui/button";
-import {
- DropdownMenu,
- DropdownMenuContent,
- DropdownMenuItem,
- DropdownMenuLabel,
- DropdownMenuTrigger,
-} from "~/components/ui/dropdown-menu";
-
-const UserProductsTableBody = () => {
- return (
- <>
-
-
-
-
-
-
Hypernova Headphones
-
-
-
-
- $129.99
-
-
-
- 25
-
-
-
-
- Draft
-
-
-
-
- 2024-07-16 10:36AM
-
-
-
-
-
-
-
-
-
-
-
- Actions
-
- Edit
- Delete
-
-
-
-
-
-
-
-
-
Hypernova Headphones
-
-
-
-
- $129.99
-
-
-
- 25
-
-
-
-
- Draft
-
-
-
-
- 2024-07-16 10:36AM
-
-
-
-
-
-
-
-
-
-
-
- Actions
-
- Edit
- Delete
-
-
-
-
-
-
-
-
-
Hypernova Headphones
-
-
-
-
- $129.99
-
-
-
- 25
-
-
-
-
- Draft
-
-
-
-
- 2024-07-16 10:36AM
-
-
-
-
-
-
-
-
-
-
-
- Actions
-
- Edit
- handleOpenDialog(id)}
- >
- Delete
-
-
-
-
-
-
- >
- );
-};
-
-export default UserProductsTableBody;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/users/[id]/component/userProductTableHead.tsx b/src/app/dashboard/(admin)/admin/(overview)/users/[id]/component/userProductTableHead.tsx
deleted file mode 100644
index 7a8d2cbac..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/users/[id]/component/userProductTableHead.tsx
+++ /dev/null
@@ -1,31 +0,0 @@
-const tableHeadData: string[] = [
- "name",
- "price",
- "total sales",
- "status",
- "created at",
- "action",
-];
-
-const UserProductsTableHead = () => {
- return (
- <>
-
-
- {tableHeadData.map((data, index) => {
- return (
-
- {data}
-
- );
- })}
-
-
- >
- );
-};
-
-export default UserProductsTableHead;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/users/[id]/page.tsx b/src/app/dashboard/(admin)/admin/(overview)/users/[id]/page.tsx
deleted file mode 100644
index fdbb42c12..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/users/[id]/page.tsx
+++ /dev/null
@@ -1,240 +0,0 @@
-"use client";
-
-import axios from "axios";
-import { ChevronLeft, ChevronRight, Star } from "lucide-react";
-import { useSession } from "next-auth/react";
-import { useParams } from "next/navigation";
-import { useEffect, useState } from "react";
-
-import { getApiUrl } from "~/actions/getApiUrl";
-import CardComponent from "~/components/common/DashboardCard/CardComponent";
-import LoadingSpinner from "~/components/miscellaneous/loading-spinner";
-import { Button } from "~/components/ui/button";
-import {
- Pagination,
- PaginationContent,
- PaginationItem,
- PaginationLink,
-} from "~/components/ui/pagination";
-import { useToast } from "~/components/ui/use-toast";
-import { UserCardData } from "../data/user-dummy-data";
-import UserProductsTable from "./component/userProductTable";
-
-export interface UserDetailsProperties {
- email: string;
- id: string;
- is_active: boolean;
- first_name: string;
- last_name: string;
- products: [];
- created_at: string;
-}
-
-function formatMongoDate(mongoDateString: string): string {
- const date = new Date(mongoDateString);
-
- const day = date.getUTCDate();
- const month = date.getUTCMonth() + 1;
- const year = date.getUTCFullYear();
-
- const formattedDate = `${String(day).padStart(2, "0")}/${String(month).padStart(2, "0")}/${year}`;
-
- return formattedDate;
-}
-
-const UserDetails = () => {
- const { id } = useParams();
- const [loading, setLoading] = useState(false);
- const [userData, setUserData] = useState();
- const [rating, setRating] = useState(0);
- const { toast } = useToast();
- const { data: session } = useSession();
-
- const [totalProducts, setTotalProducts] = useState({
- title: "Total Products",
- value: 0,
- description: "+10% from last month",
- icon: "user",
- });
-
- const [totalOrders, setTotalOrders] = useState({
- title: "Total Orders",
- value: 0,
- description: "+20% from last month",
- icon: "box",
- });
-
- const [totalSales, setTotalSales] = useState({
- title: "Total Sales",
- value: 0,
- description: "+150% from last month",
- icon: "arrow-up",
- });
-
- useEffect(() => {
- (async () => {
- try {
- setLoading(true);
- const baseUrl = await getApiUrl();
- const API_URL = `${baseUrl}/api/v1/users/${id}`;
- const response = await axios.get(`${API_URL}`, {
- headers: {
- Authorization: `Bearer ${session?.access_token}`,
- },
- });
- const userDetails: UserDetailsProperties = response.data.user;
- setUserData(userDetails);
- setTotalSales((previous) => ({
- ...previous,
- value: 450_000,
- }));
- setTotalOrders((previous) => ({
- ...previous,
- value: 1000,
- }));
- setTotalProducts((previous) => ({
- ...previous,
- value: 4000,
- }));
- } catch (error) {
- toast({
- title: `Error fetching user ${id}`,
- description:
- error instanceof Error
- ? error.message
- : "An unknown error occurred",
- variant: "destructive",
- });
- } finally {
- setLoading(false);
- }
- })();
- }, [id, session?.access_token, toast]);
-
- const handleRatingClick = (index: number) => {
- setRating(index);
- };
-
- if (loading) {
-
- Fetching user data... {" "}
-
- ;
- }
-
- return (
-
-
-
-
- {userData?.first_name?.charAt(0).toUpperCase() ||
- userData?.email?.charAt(0).toUpperCase()}
-
-
-
-
- {userData?.first_name || userData?.last_name
- ? userData.first_name + " " + userData.last_name
- : (userData?.email ?? (
-
- ))}
-
-
-
- {userData?.email || (
-
- )}
-
-
-
-
-
-
- A Farmer that loves making fresh food produce from his farm
-
-
-
-
-
3.3/5
-
- {Array.from({ length: 5 }).map((_, index) => (
- handleRatingClick(index + 1)}
- className={`h-6 w-6 cursor-pointer ${
- index < rating
- ? "stroke-current text-yellow-500"
- : "text-black"
- }`}
- />
- ))}
-
-
-
(50 products)
-
-
Date Added
- {userData?.created_at ? (
- formatMongoDate(userData?.created_at as string)
- ) : (
-
- )}
-
-
-
-
-
-
- {[totalProducts, totalOrders, totalSales].map((card, index) => (
-
- ))}
-
-
-
-
-
-
- Products
-
-
- Manage & Track users products
-
-
-
-
-
-
-
-
-
-
-
-
-
- Previous
-
-
-
-
- 1
-
-
-
-
- Next
-
-
-
-
-
-
-
- );
-};
-
-export default UserDetails;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/users/assets/style.css b/src/app/dashboard/(admin)/admin/(overview)/users/assets/style.css
deleted file mode 100644
index 373d71236..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/users/assets/style.css
+++ /dev/null
@@ -1,4 +0,0 @@
-.user-table::-webkit-scrollbar {
- width: 0;
- display: none;
-}
diff --git a/src/app/dashboard/(admin)/admin/(overview)/users/component/addUserModal.test.tsx b/src/app/dashboard/(admin)/admin/(overview)/users/component/addUserModal.test.tsx
deleted file mode 100644
index c3a2ab76c..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/users/component/addUserModal.test.tsx
+++ /dev/null
@@ -1,65 +0,0 @@
-import { fireEvent, render, screen } from "@testing-library/react";
-import { describe, expect, it } from "vitest";
-
-import AddUserModal from "./userModal";
-
-describe("addUserModal", () => {
- // it("renders the modal with correct title and description", async () => {
- // expect.hasAssertions();
- // render(
- //
- // Open Modal
- // ,
- // );
-
- // // Check if the trigger button is rendered
- // expect(screen.getByText("Open Modal")).toBeInTheDocument();
-
- // // Open the modal
- // fireEvent.click(screen.getByText("Open Modal"));
-
- // // Check if the modal title and description are rendered
- // await expect(
- // screen.findByText("Add new user"),
- // ).resolves.toBeInTheDocument();
- // await expect(
- // screen.findByText("Create a new user"),
- // ).resolves.toBeInTheDocument();
- // });
-
- it("renders form fields", async () => {
- expect.hasAssertions();
- render(
-
- Open Modal
- ,
- );
-
- // Open the modal
- fireEvent.click(screen.getByText("Open Modal"));
-
- // Check if form fields are rendered
- await expect(screen.findByLabelText("Name")).resolves.toBeInTheDocument();
- await expect(screen.findByLabelText("Email")).resolves.toBeInTheDocument();
- await expect(
- screen.findByLabelText("Phone number"),
- ).resolves.toBeInTheDocument();
- });
-
- it("renders submit button", async () => {
- expect.hasAssertions();
- render(
-
- Open Modal
- ,
- );
-
- // Open the modal
- fireEvent.click(screen.getByText("Open Modal"));
-
- // Check if the submit button is rendered
- await expect(
- screen.findByRole("button", { name: "Add new user" }),
- ).resolves.toBeInTheDocument();
- });
-});
diff --git a/src/app/dashboard/(admin)/admin/(overview)/users/component/dialogue/delete-dialog.test.tsx b/src/app/dashboard/(admin)/admin/(overview)/users/component/dialogue/delete-dialog.test.tsx
deleted file mode 100644
index 18c844bf7..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/users/component/dialogue/delete-dialog.test.tsx
+++ /dev/null
@@ -1,48 +0,0 @@
-import { fireEvent, render, screen } from "@testing-library/react";
-import { describe, expect, it, vi } from "vitest";
-
-import DeleteDialog from "./delete-dialog";
-
-describe("deleteDialog", () => {
- it("renders the dialog with correct content", () => {
- expect.hasAssertions();
- const onClose = vi.fn();
- const onDelete = vi.fn();
- render(
- ,
- );
-
- expect(screen.getByText("Are you absolutely sure?")).toBeInTheDocument();
- expect(
- screen.getByText(
- "This action cannot be undone. This will permanently delete this product from the database.",
- ),
- ).toBeInTheDocument();
- expect(screen.getByRole("button", { name: /cancel/i })).toBeInTheDocument();
- expect(screen.getByRole("button", { name: /delete/i })).toBeInTheDocument();
- });
-
- it("calls onClose when Cancel button is clicked", () => {
- expect.hasAssertions();
- const onClose = vi.fn();
- const onDelete = vi.fn();
- render(
- ,
- );
-
- fireEvent.click(screen.getByRole("button", { name: /cancel/i }));
- expect(onClose).toHaveBeenCalledTimes(1);
- });
-
- it("calls onDelete when Delete button is clicked", () => {
- expect.hasAssertions();
- const onClose = vi.fn();
- const onDelete = vi.fn();
- render(
- ,
- );
-
- fireEvent.click(screen.getByRole("button", { name: /delete/i }));
- expect(onDelete).toHaveBeenCalledTimes(1);
- });
-});
diff --git a/src/app/dashboard/(admin)/admin/(overview)/users/component/dialogue/delete-dialog.tsx b/src/app/dashboard/(admin)/admin/(overview)/users/component/dialogue/delete-dialog.tsx
deleted file mode 100644
index f6b329a47..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/users/component/dialogue/delete-dialog.tsx
+++ /dev/null
@@ -1,53 +0,0 @@
-import { Button } from "~/components/common/common-button";
-import LoadingSpinner from "~/components/miscellaneous/loading-spinner";
-import {
- Dialog,
- DialogContent,
- DialogDescription,
- DialogHeader,
- DialogTitle,
-} from "~/components/ui/dialog";
-
-const DeleteDialog = ({
- onClose,
- onDelete,
- isDeleting,
-}: {
- onClose: () => void;
- onDelete: () => void;
- isDeleting: boolean;
-}) => {
- return (
-
-
-
-
- Are you absolutely sure?
-
-
- This action cannot be undone. This will permanently delete this
- product from the database.
-
-
-
-
- Cancel
-
-
- Delete
- {isDeleting && }
-
-
-
-
- );
-};
-
-export default DeleteDialog;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/users/component/dialogue/delete-successful.tsx b/src/app/dashboard/(admin)/admin/(overview)/users/component/dialogue/delete-successful.tsx
deleted file mode 100644
index d5a42ea7d..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/users/component/dialogue/delete-successful.tsx
+++ /dev/null
@@ -1,36 +0,0 @@
-import { Button } from "~/components/common/common-button";
-import {
- Dialog,
- DialogContent,
- DialogDescription,
- DialogHeader,
- DialogTitle,
-} from "~/components/ui/dialog";
-
-const DeleteSuccessfulDialog = ({ onClose }: { onClose: () => void }) => {
- return (
-
-
-
-
- User Deleted Successfully!
-
-
- Their account has been deleted, and they will no longer be able to
- access the platform.
-
-
-
-
- Done
-
-
-
-
- );
-};
-
-export default DeleteSuccessfulDialog;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/users/component/userModal.tsx b/src/app/dashboard/(admin)/admin/(overview)/users/component/userModal.tsx
deleted file mode 100644
index 81bdb6fe3..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/users/component/userModal.tsx
+++ /dev/null
@@ -1,116 +0,0 @@
-import { Button } from "~/components/common/common-button";
-import { Input } from "~/components/common/input";
-import {
- Dialog,
- DialogContent,
- DialogDescription,
- DialogFooter,
- DialogHeader,
- DialogTitle,
- DialogTrigger,
-} from "~/components/ui/dialog";
-import { Label } from "~/components/ui/label";
-
-interface AddProductModalProperties {
- children: React.ReactNode;
-}
-const AddUserModal = ({ children }: AddProductModalProperties) => {
- return (
-
- {children}
-
-
-
- Add new user
-
-
- Create a new user
-
-
-
-
-
-
-
- Upload Picture
-
-
-
- Click to upload
-
-
-
-
-
-
-
-
-
-
- Add new user
-
-
-
-
- );
-};
-
-export default AddUserModal;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/users/component/userTable.tsx b/src/app/dashboard/(admin)/admin/(overview)/users/component/userTable.tsx
deleted file mode 100644
index c9aed5500..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/users/component/userTable.tsx
+++ /dev/null
@@ -1,58 +0,0 @@
-import React from "react";
-
-import LoadingSpinner from "~/components/miscellaneous/loading-spinner";
-import { UserData } from "../page";
-import UserTableBody from "./userTableBody";
-import UserTableHead from "./userTableHead";
-
-interface UserTableProperties {
- data: UserData[];
- onDelete: (userId: string) => void;
- isDeleting: boolean;
- loading: boolean;
- isDialogOpen: boolean;
- isSuccessDeleteDialogOpen: boolean;
- setIsDialogOpen: React.Dispatch>;
- setIsSuccessDeleteDialogOpen: React.Dispatch>;
-}
-
-const UserTable: React.FC = ({
- data,
- onDelete,
- isDeleting,
- loading,
- isDialogOpen,
- setIsDialogOpen,
- isSuccessDeleteDialogOpen,
- setIsSuccessDeleteDialogOpen,
-}) => {
- return (
- <>
-
-
- {loading ? (
-
- Fetching user data... {" "}
-
-
- ) : data.length > 0 ? (
-
- ) : (
-
- No user data
-
- )}
-
- >
- );
-};
-
-export default UserTable;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/users/component/userTableBody.tsx b/src/app/dashboard/(admin)/admin/(overview)/users/component/userTableBody.tsx
deleted file mode 100644
index 039e884cf..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/users/component/userTableBody.tsx
+++ /dev/null
@@ -1,160 +0,0 @@
-import { EllipsisVertical } from "lucide-react";
-import Link from "next/link";
-import { useState } from "react";
-
-import { Button } from "~/components/ui/button";
-import {
- DropdownMenu,
- DropdownMenuContent,
- DropdownMenuItem,
- DropdownMenuLabel,
- DropdownMenuTrigger,
-} from "~/components/ui/dropdown-menu";
-import { UserData } from "../page";
-import DeleteDialog from "./dialogue/delete-dialog";
-import DeleteSuccessfulDialog from "./dialogue/delete-successful";
-
-interface UserTableProperties {
- data: UserData[];
- onDelete: (userId: string) => void;
- isDeleting: boolean;
- isDialogOpen: boolean;
- isSuccessDeleteDialogOpen: boolean;
- setIsDialogOpen: React.Dispatch>;
- setIsSuccessDeleteDialogOpen: React.Dispatch>;
-}
-
-const UserTableBody: React.FC = ({
- data,
- onDelete,
- isDeleting,
- isDialogOpen,
- setIsDialogOpen,
- isSuccessDeleteDialogOpen,
- setIsSuccessDeleteDialogOpen,
-}) => {
- const [userId, setUserId] = useState("");
-
- const handleOpenDialog = (id: string) => {
- setIsDialogOpen(true);
- setUserId(id);
- };
- const handleCloseDialog = () => setIsDialogOpen(false);
- const handleCloseDeleteSuccessDialog = () =>
- setIsSuccessDeleteDialogOpen(false);
- return (
- <>
-
- {Array.isArray(data) &&
- data.map((_data, index) => {
- const {
- id,
- email,
- phone,
- is_active: status,
- name: fullName,
- created_at: date,
- } = _data;
-
- return (
-
-
-
-
-
-
- {fullName?.charAt(0).toUpperCase() ??
- email?.charAt(0).toUpperCase()}
-
-
-
-
-
- {fullName ?? email}
-
-
- {email}
-
-
-
-
-
-
- {phone ?? "Nil"}
-
-
-
- {formatMongoDate(date)}
-
-
-
-
- {status && (
- <>
-
-
Active
- >
- )}
-
- {!status && (
- <>
-
-
Inactive
- >
- )}
-
-
-
-
-
-
-
-
-
-
-
-
- Actions
-
- Edit
- handleOpenDialog(id)}>
- Delete
-
-
-
-
-
- );
- })}
-
- {isDialogOpen && (
- onDelete(userId)}
- />
- )}
- {isSuccessDeleteDialogOpen && (
-
- )}
- >
- );
-};
-
-function formatMongoDate(mongoDateString: string): string {
- const date = new Date(mongoDateString);
- const day = date.getUTCDate();
- const month = date.getUTCMonth() + 1;
- const year = date.getUTCFullYear();
- const formattedDate = `${String(day).padStart(2, "0")}/${String(month).padStart(2, "0")}/${year}`;
-
- return formattedDate;
-}
-
-export default UserTableBody;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/users/component/userTableHead.tsx b/src/app/dashboard/(admin)/admin/(overview)/users/component/userTableHead.tsx
deleted file mode 100644
index 2321b7b3a..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/users/component/userTableHead.tsx
+++ /dev/null
@@ -1,30 +0,0 @@
-const tableHeadData: string[] = [
- "name",
- "phone number",
- "date created",
- "status",
- "action",
-];
-
-const UserTableHead = () => {
- return (
- <>
-
-
- {tableHeadData.map((data, index) => {
- return (
-
- {data}
-
- );
- })}
-
-
- >
- );
-};
-
-export default UserTableHead;
diff --git a/src/app/dashboard/(admin)/admin/(overview)/users/data/user-dummy-data.ts b/src/app/dashboard/(admin)/admin/(overview)/users/data/user-dummy-data.ts
deleted file mode 100644
index 3ae11a133..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/users/data/user-dummy-data.ts
+++ /dev/null
@@ -1,99 +0,0 @@
-import type { LucideIconName } from "~/components/common/lucide-icon";
-
-export interface UserCardData {
- title: string;
- value: number;
- description: string;
- icon: LucideIconName;
-}
-
-interface UserStatusProperties {
- active: boolean;
-}
-
-export interface UserDataProperties {
- avatar: string;
- fullName: string;
- email: string;
- phone: string;
- date: string;
- status: UserStatusProperties;
-}
-
-export const userCardData: UserCardData[] = [
- {
- title: "Total Users",
- value: 4000,
- description: "+10% from last month",
- icon: "user",
- },
- {
- title: "Active Users",
- value: 1500,
- description: "+20% from last month",
- icon: "box",
- },
- {
- title: "Deleted Users",
- value: 2500,
- description: "+150% from last month",
- icon: "arrow-up",
- },
-];
-
-export const userData: UserDataProperties[] = [
- {
- avatar: "/admin-dashboard/images/user-1.png",
- fullName: "Afolabi Olanipekun",
- email: "Afolabiolanipekun@gmail.com",
- phone: "09123456789",
- date: "02/07/2024",
- status: {
- active: true,
- },
- },
-
- {
- avatar: "/admin-dashboard/images/user-2.png",
- fullName: "Adetunji Oluwaseun",
- email: "Afolabiolanipekun@gmail.com",
- phone: "09123456789",
- date: "02/07/2024",
- status: {
- active: false,
- },
- },
-
- {
- avatar: "/admin-dashboard/images/user-3.png",
- fullName: "Ifunanya Adedapo",
- email: "Afolabiolanipekun@gmail.com",
- phone: "09123456789",
- date: "02/07/2024",
- status: {
- active: false,
- },
- },
-
- {
- avatar: "/admin-dashboard/images/user-4.png",
- fullName: "Busola Igwe",
- email: "Afolabiolanipekun@gmail.com",
- phone: "09123456789",
- date: "02/07/2024",
- status: {
- active: false,
- },
- },
-
- {
- avatar: "/admin-dashboard/images/user-5.png",
- fullName: "Moshood Adedayo",
- email: "Afolabiolanipekun@gmail.com",
- phone: "09123456789",
- date: "02/07/2024",
- status: {
- active: true,
- },
- },
-];
diff --git a/src/app/dashboard/(admin)/admin/(overview)/users/page.test.tsx b/src/app/dashboard/(admin)/admin/(overview)/users/page.test.tsx
deleted file mode 100644
index dea52ad56..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/users/page.test.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import { render } from "~/test/utils";
-import Page from "./page";
-
-describe("page tests", () => {
- it("should render correctly", () => {
- expect.assertions(1);
-
- render( );
-
- expect(true).toBeTruthy();
- });
-});
diff --git a/src/app/dashboard/(admin)/admin/(overview)/users/page.tsx b/src/app/dashboard/(admin)/admin/(overview)/users/page.tsx
deleted file mode 100644
index b16a64166..000000000
--- a/src/app/dashboard/(admin)/admin/(overview)/users/page.tsx
+++ /dev/null
@@ -1,359 +0,0 @@
-"use client";
-
-import { Check, ChevronLeft, ChevronRight, Filter } from "lucide-react";
-import { useCallback, useEffect, useState } from "react";
-
-import CardComponent from "~/components/common/DashboardCard/CardComponent";
-import { Button } from "~/components/ui/button";
-import {
- DropdownMenu,
- DropdownMenuContent,
- DropdownMenuItem,
- DropdownMenuTrigger,
-} from "~/components/ui/dropdown-menu";
-import {
- Pagination,
- PaginationContent,
- PaginationItem,
- PaginationLink,
-} from "~/components/ui/pagination";
-import UserTable from "./component/userTable";
-import { UserCardData } from "./data/user-dummy-data";
-
-import "./assets/style.css";
-
-import axios from "axios";
-import { getSession } from "next-auth/react";
-
-import { getApiUrl } from "~/actions/getApiUrl";
-import { useToast } from "~/components/ui/use-toast";
-
-interface FilterDataProperties {
- title: string;
- selected: boolean;
-}
-
-const filterActions: FilterDataProperties[] = [
- {
- title: "Active",
- selected: false,
- },
-
- {
- title: "Inactive",
- selected: false,
- },
-];
-
-export interface UserData {
- id: string;
- email: string;
- name: string;
- role: string;
- phone: string | null;
- is_active: boolean;
- signup_type: string;
- created_at: string;
- deleted_at: string | null;
- email_verified_at: string | null;
- is_verified: boolean;
- social_id: string | null;
- updated_at: string;
-}
-
-const UserPage = () => {
- const [page, setPage] = useState(1);
-
- const [data, setData] = useState([]);
-
- const [filterData, setFilterData] = useState([]);
-
- const [isDeleting, setIsDeleting] = useState(false);
-
- const [loading, setLoading] = useState(false);
-
- const [isDialogOpen, setIsDialogOpen] = useState(false);
- const [isSuccessDeleteDialogOpen, setIsSuccessDeleteDialogOpen] =
- useState(false);
- const { toast } = useToast();
-
- const [totalUserOverview, setTotalUserOverview] = useState({
- title: "Total Users",
- value: 0,
- description: "+10% from last month",
- icon: "user",
- });
-
- const [activeUserOverview, setActiveUserOverview] = useState({
- title: "Active Users",
- value: 0,
- description: "+20% from last month",
- icon: "box",
- });
-
- const [deletedUserOverview, setdeletedUserOverview] = useState({
- title: "Deleted Users",
- value: 0,
- description: "+150% from last month",
- icon: "arrow-up",
- });
-
- const [isNextPageActive, setIsNextPageActive] = useState(false);
- const [isPreviousPageActive, setIsPreviousPageActive] = useState(false);
-
- const [selectedFilter, setSelectedFilter] = useState<
- FilterDataProperties | undefined
- >();
-
- const deletedUser = 0;
-
- const filterActionsHandler = (title: string) => {
- if (title === "Active") {
- const _data = data?.filter((item) => item.is_active);
- setFilterData(_data);
- } else {
- const _data = data?.filter((item) => !item.is_active);
- setFilterData(_data);
- }
- };
-
- const fetchData = useCallback(async () => {
- try {
- const session = await getSession();
- setLoading(true);
- const baseUrl = await getApiUrl();
- const API_URL = `${baseUrl}/api/v1/users`;
- const response = await axios.get(`${API_URL}?page=${page}`, {
- headers: {
- Authorization: `Bearer ${session?.access_token}`,
- },
- });
- setIsNextPageActive(
- response.data.data.pagination.current_page ===
- response.data.data.pagination.last_page
- ? false
- : true,
- );
- setIsPreviousPageActive(
- response.data.data.pagination.current_page === 1 ? false : true,
- );
- const usersData: UserData[] = response.data.data?.users || [];
- setData(usersData);
- setFilterData(usersData);
- const totalUser = response.data.data.pagination.total || 0;
-
- setTotalUserOverview((previous) => ({
- ...previous,
- value: totalUser,
- }));
-
- setdeletedUserOverview((previous) => ({
- ...previous,
- value: deletedUser,
- }));
-
- setActiveUserOverview((previous) => {
- let count = 0;
- for (const user of usersData) {
- if (user.is_active) {
- count += 1;
- }
- }
-
- return {
- ...previous,
- value: count,
- };
- });
- } catch (error) {
- setLoading(false);
- toast({
- title: `Error fetching users`,
- description:
- error instanceof Error ? error.message : "An unknown error occurred",
- variant: "destructive",
- });
- } finally {
- setLoading(false);
- }
- }, [deletedUser, page, toast]);
-
- useEffect(() => {
- fetchData();
- }, [fetchData]);
-
- const deleteUser = async (userId: string) => {
- try {
- const session = await getSession();
- const baseUrl = await getApiUrl();
- const API_URL = `${baseUrl}/api/v1/users/${userId}`;
- setIsDeleting(true);
- await axios.delete(API_URL, {
- headers: {
- Authorization: `Bearer ${session?.access_token}`,
- },
- });
-
- // Update data without calling fetchData
- const updatedUser = data.filter((user) => user.id !== userId);
- setData(updatedUser);
- setFilterData(updatedUser);
-
- // Update overviews
- setdeletedUserOverview((previous) => ({
- ...previous,
- value: previous.value + 1, // Increment the count
- }));
- const activeCount = updatedUser.filter((user) => user.is_active).length;
- setActiveUserOverview((previous) => ({
- ...previous,
- value: activeCount,
- }));
- setTotalUserOverview((previous) => ({
- ...previous,
- value: previous.value - 1,
- }));
- setIsSuccessDeleteDialogOpen(true);
- } catch (error) {
- toast({
- title: `Error deleting user`,
- description:
- error instanceof Error ? error.message : "An unknown error occurred",
- variant: "destructive",
- });
- } finally {
- setIsDeleting(false);
- setIsDialogOpen(false);
- }
- };
-
- return (
- <>
-
-
- {[totalUserOverview, activeUserOverview, deletedUserOverview].map(
- (card, index) => (
-
- ),
- )}
-
-
-
-
-
-
- Users
-
-
- Manage Users & Track Activity
-
-
-
-
-
-
-
-
-
-
-
- {filterActions.map((data, index) => {
- const { selected, title } = data;
-
- selectedFilter?.title === title
- ? (data.selected = true)
- : (data.selected = false);
-
- return (
- {
- filterActionsHandler(data.title);
- setSelectedFilter(filterActions[index]);
- }}
- key={index}
- >
-
-
- );
- })}
-
-
-
-
-
-
-
-
-
-
-
-
- {
- if (isPreviousPageActive) {
- setPage((previous) => previous - 1);
- }
- }}
- >
-
- Previous
-
-
-
-
- {page}
-
-
- {
- if (isNextPageActive) {
- setPage((previous) => previous + 1);
- }
- }}
- >
-
- Next
-
-
-
-
-
-
-
- >
- );
-};
-
-export default UserPage;
diff --git a/src/app/dashboard/(admin)/admin/(settings)/settings/_components/layout/sidebar/index.tsx b/src/app/dashboard/(admin)/admin/(settings)/settings/_components/layout/sidebar/index.tsx
deleted file mode 100644
index eaf49d6b7..000000000
--- a/src/app/dashboard/(admin)/admin/(settings)/settings/_components/layout/sidebar/index.tsx
+++ /dev/null
@@ -1,183 +0,0 @@
-"use client";
-
-import {
- Banknote,
- Bell,
- ChevronLeft,
- ChevronRight,
- Database,
- Globe,
- LucideProps,
- User,
- UserRoundCog,
- UsersIcon,
-} from "lucide-react";
-import { useSession } from "next-auth/react";
-import Link from "next/link";
-import { usePathname, useRouter } from "next/navigation";
-import { FC, ForwardRefExoticComponent, RefAttributes } from "react";
-
-import { useOrgContext } from "~/contexts/orgContext";
-
-const sideItems = [
- {
- route: "General",
- link: "/dashboard/admin/settings",
- icon: User,
- id: "general",
- },
- {
- route: "Account",
- link: "/dashboard/admin/settings/account",
- icon: UserRoundCog,
- id: "account",
- },
- {
- route: "Notification",
- link: "/dashboard/admin/settings/notification",
- icon: Bell,
- id: "notification",
- },
- {
- route: "Payment Information",
- link: "/dashboard/admin/settings/payment-information",
- icon: Banknote,
- id: "payment-information",
- },
- {
- route: "Data and Privacy",
- link: "/dashboard/admin/settings/data-and-privacy",
- icon: Database,
- id: "data-and-privacy",
- },
- {
- route: "Language and Region",
- link: "/dashboard/admin/settings/language-and-region",
- icon: Globe,
- id: "language-and-region",
- },
-];
-
-const organizationLinks = [
- {
- route: "Members",
- link: "/dashboard/admin/settings/organization/members",
- icon: UsersIcon,
- id: "members",
- },
- {
- route: "Roles and permissions",
- link: "/dashboard/admin/settings/organization/roles-and-permissions",
- icon: Bell,
- id: "roles-and-permissions",
- },
- {
- route: "Integrations",
- link: "/dashboard/admin/settings/organization/integrations",
- icon: Banknote,
- id: "integrations",
- },
-];
-
-interface Iproperties {
- sideNavitems?: {
- route: string;
- link: string;
- icon: ForwardRefExoticComponent<
- Omit & RefAttributes
- >;
- id: string;
- }[];
- currenPathName?: string;
-}
-const SettingsSidebar: FC = ({ sideNavitems = sideItems }) => {
- const pathname = usePathname();
- const currentPath =
- pathname?.split("/").length == 2 ? "general" : pathname?.split("/")[3];
- const organizationPath = pathname?.split("/")[4];
- const { organizations } = useOrgContext();
- const { data: session } = useSession();
- const router = useRouter();
-
- const organization = organizations.find(
- (org) => org.organisation_id === session?.currentOrgId,
- );
-
- return (
-
-
router.push("/dashboard")}
- >
-
-
- Settings
-
-
-
- Profile
-
-
- {sideNavitems.map((item, index) => (
-
-
- {item.route}
-
- ))}
-
- {organization?.user_role !== "user" && (
- <>
-
- Organization
-
-
- {organizationLinks.map((item, index) => (
-
-
-
- {item.route}
-
-
-
- ))}
-
- >
- )}
- {/*
- {organizationLinks.map((item, index) => (
-
-
-
- {item.route}
-
-
-
- ))}
- */}
-
- );
-};
-
-export default SettingsSidebar;
diff --git a/src/app/dashboard/(admin)/admin/(settings)/settings/account/_component.tsx/password.tsx b/src/app/dashboard/(admin)/admin/(settings)/settings/account/_component.tsx/password.tsx
deleted file mode 100644
index ae6a8f408..000000000
--- a/src/app/dashboard/(admin)/admin/(settings)/settings/account/_component.tsx/password.tsx
+++ /dev/null
@@ -1,175 +0,0 @@
-"use client";
-
-import { zodResolver } from "@hookform/resolvers/zod";
-import axios from "axios";
-import { useSession } from "next-auth/react";
-import { useState } from "react";
-import { useForm } from "react-hook-form";
-
-import { getApiUrl } from "~/actions/getApiUrl";
-import CustomButton from "~/components/common/common-button/common-button";
-import PasswordSuccessfulModal from "~/components/common/modals/password-successful";
-import { toast } from "~/components/ui/use-toast";
-import { cn } from "~/lib/utils";
-import { passwordSchema, type PasswordFormData } from "./schema";
-
-const Password = () => {
- const { data } = useSession();
-
- const [open, setOpen] = useState(false);
- const [isPending, setIsPending] = useState(false);
-
- const {
- register,
- handleSubmit,
- reset,
- formState: { errors, isValid },
- } = useForm({
- resolver: zodResolver(passwordSchema),
- mode: "all",
- });
-
- const submitHandler = async (values: PasswordFormData) => {
- try {
- setIsPending(true);
- const payload = {
- old_password: values.currentPassword,
- new_password: values.newPassword,
- confirm_new_password: values.confirmPassword,
- };
- const baseUrl = await getApiUrl();
- const API_URL = `${baseUrl}/api/v1/auth/password`;
-
- await axios.put(API_URL, payload, {
- headers: {
- Authorization: `Bearer ${data?.access_token}`,
- },
- });
- setOpen(true);
- reset({ currentPassword: "", newPassword: "", confirmPassword: "" });
- } catch (error) {
- const errorMessage = (error as HttpError)?.response?.data?.message;
- toast({
- title: "Error",
- description: errorMessage,
- });
- setIsPending(false);
- } finally {
- setIsPending(false);
- }
- };
-
- return (
-
-
-
- Password Settings
-
-
- Update password for enhanced account security
-
-
-
-
-
-
-
- Current Password
-
-
-
-
-
- {errors.currentPassword && (
-
- {errors.currentPassword?.message}
-
- )}
-
-
-
-
- New Password
-
-
-
-
-
- {errors.newPassword && (
-
- {errors.newPassword?.message}
-
- )}
-
-
-
-
- Confirm new password
-
-
-
-
-
- {errors.confirmPassword && (
-
- {errors.confirmPassword?.message}
-
- )}
-
-
-
- setOpen(false)}
- >
- Cancel
-
-
- Update Password
-
-
-
-
setOpen(!open)} show={open} />
-
- );
-};
-
-interface HttpError {
- response?: {
- data?: {
- message?: string;
- };
- };
-}
-
-export default Password;
diff --git a/src/app/dashboard/(admin)/admin/(settings)/settings/account/_component.tsx/schema.ts b/src/app/dashboard/(admin)/admin/(settings)/settings/account/_component.tsx/schema.ts
deleted file mode 100644
index 96f806966..000000000
--- a/src/app/dashboard/(admin)/admin/(settings)/settings/account/_component.tsx/schema.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import * as z from "zod";
-
-export const passwordSchema = z
- .object({
- currentPassword: z
- .string()
- .min(8, "Current password must be at least 8 characters long"),
- newPassword: z
- .string()
- .min(8, "New password must be at least 8 characters long"),
- confirmPassword: z
- .string()
- .min(8, "Confirm password must be at least 8 characters long"),
- })
- .refine((data) => data.newPassword === data.confirmPassword, {
- message: "Passwords do not match",
- path: ["confirmPassword"],
- });
-export type PasswordFormData = z.infer;
diff --git a/src/app/dashboard/(admin)/admin/(settings)/settings/account/page.tsx b/src/app/dashboard/(admin)/admin/(settings)/settings/account/page.tsx
deleted file mode 100644
index 3932937fa..000000000
--- a/src/app/dashboard/(admin)/admin/(settings)/settings/account/page.tsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import PasswordSettings from "./_component.tsx/password";
-
-const page = () => {
- return (
-
- );
-};
-
-export default page;
diff --git a/src/app/dashboard/(admin)/admin/(settings)/settings/data-and-privacy/page.tsx b/src/app/dashboard/(admin)/admin/(settings)/settings/data-and-privacy/page.tsx
deleted file mode 100644
index aa0e9bd79..000000000
--- a/src/app/dashboard/(admin)/admin/(settings)/settings/data-and-privacy/page.tsx
+++ /dev/null
@@ -1,111 +0,0 @@
-"use client";
-
-import { useState } from "react";
-
-import CustomButton from "~/components/common/common-button/common-button";
-
-interface ToggleSwitchProperties {
- label: string;
- description: string;
- apiEndpoint: string;
-}
-
-const ToggleSwitch: React.FC = ({
- label,
- description,
-}) => {
- const [enabled, setEnabled] = useState(false);
-
- const handleToggle = async () => {
- setEnabled(!enabled);
- };
-
- return (
-
-
- {label}
-
-
-
-
-
-
-
{description}
-
- );
-};
-
-const Page = () => {
- return (
-
-
Data & Privacy
-
-
Choose how we use your data
-
- Your data is important for helping improve and personalize HNG
- Boilerplate, and you have control over how it is used. You can change
- these settings anytime if you feel like playing a part in our
- development. Learn more.
-
-
-
-
-
-
-
-
-
-
-
- Cancel
-
-
- Save Changes
-
-
-
- );
-};
-
-export default Page;
diff --git a/src/app/dashboard/(admin)/admin/(settings)/settings/icons.tsx b/src/app/dashboard/(admin)/admin/(settings)/settings/icons.tsx
deleted file mode 100644
index 8a0b8c8e1..000000000
--- a/src/app/dashboard/(admin)/admin/(settings)/settings/icons.tsx
+++ /dev/null
@@ -1,59 +0,0 @@
-export const XIcon = ({ className }: { className?: string }) => {
- return (
-
-
-
- );
-};
-
-export const InstagramIcon = ({ className }: { className?: string }) => {
- return (
-
-
-
- );
-};
-
-export const LinkedinIcon = ({ className }: { className?: string }) => {
- return (
-
-
-
- );
-};
diff --git a/src/app/dashboard/(admin)/admin/(settings)/settings/language-and-region/page.tsx b/src/app/dashboard/(admin)/admin/(settings)/settings/language-and-region/page.tsx
deleted file mode 100644
index 40383c85b..000000000
--- a/src/app/dashboard/(admin)/admin/(settings)/settings/language-and-region/page.tsx
+++ /dev/null
@@ -1,199 +0,0 @@
-"use client";
-
-import axios from "axios";
-import { countries, languages } from "countries-list";
-import moment from "moment-timezone";
-import { useSession } from "next-auth/react";
-import { useEffect, useState } from "react";
-
-import { getApiUrl } from "~/actions/getApiUrl";
-import CustomButton from "~/components/common/common-button/common-button";
-import {
- Select,
- SelectContent,
- SelectItem,
- SelectTrigger,
- SelectValue,
-} from "~/components/ui/select";
-
-const _languages = Object.values(languages).map((data) => ({
- value: data.name,
- label: data.name,
-}));
-
-const regions = Object.values(countries).map((data) => ({
- value: data.name,
- label: data.name,
-}));
-
-const formatTimeZone = () => {
- return moment.tz.names().map((tz) => {
- const offset = moment.tz(tz).utcOffset();
- const hours = Math.floor(Math.abs(offset) / 60);
- const minutes = Math.abs(offset) % 60;
- const sign = offset >= 0 ? "+" : "-";
- const formattedOffset = `UTC${sign}${String(hours).padStart(2, "0")}:${String(minutes).padStart(2, "0")}`;
-
- return {
- value: `(${formattedOffset}) ${tz.replace("_", " ")}`,
- label: `(${formattedOffset}) ${tz.replace("_", " ")}`,
- };
- });
-};
-
-const timeZones = formatTimeZone();
-
-const LanguageRegion = () => {
- const { data } = useSession();
-
- const [language, setLanguage] = useState("");
- const [region, setRegion] = useState("");
- const [timezone, setTimezone] = useState("");
-
- const [errorMessage, setErrorMessage] = useState();
- const [successMessage, setSuccessMessage] = useState();
- const [isPending, setIsPending] = useState(false);
-
- useEffect(() => {
- (async () => {
- const baseUrl = await getApiUrl();
- const API_URL = `${baseUrl}/api/v1/profile/${data?.user.id}`;
-
- try {
- const response = await axios.get(API_URL, {
- headers: {
- Authorization: `Bearer ${data?.access_token}`,
- },
- });
- setLanguage(response.data.data.language);
- setRegion(response.data.data.region);
- setTimezone(response.data.data.timezones);
- } catch {
- setErrorMessage("An error occurred while retrieving your information");
- }
- })();
- }, [data]);
-
- const updateUserData = async () => {
- try {
- setIsPending(true);
- const baseUrl = await getApiUrl();
- const API_URL = `${baseUrl}/api/v1/profile/${data?.user.id}`;
-
- const payload = {
- language,
- region,
- timezones: timezone,
- };
-
- await axios.patch(API_URL, payload, {
- headers: {
- Authorization: `Bearer ${data?.access_token}`,
- },
- });
-
- setSuccessMessage("Settings have been saved successfully.");
- } catch {
- setErrorMessage(
- "There was a problem updating your settings. Please try again.",
- );
- setIsPending(false);
- } finally {
- setIsPending(false);
- }
- };
-
- return (
- <>
-
-
- Language & Region
-
-
- Customize your language and region preferences
-
-
-
-
-
- Language
-
- setLanguage(value)}
- >
-
-
-
-
- {_languages.map((lang) => (
-
- {lang.label}
-
- ))}
-
-
-
-
-
-
- Region
-
- setRegion(value)}>
-
-
-
-
- {regions.map((region, index) => (
-
- {region.label}
-
- ))}
-
-
-
-
-
-
- Time-Zone
-
- setTimezone(value)}
- >
-
-
-
-
- {timeZones.map((tz, index) => (
-
- {tz.label}
-
- ))}
-
-
-
-
-
- {errorMessage &&
{errorMessage}
}
-
-
- {successMessage &&
{successMessage}
}
-
-
-
- Save
-
- Cancel
-
-
- >
- );
-};
-
-export default LanguageRegion;
diff --git a/src/app/dashboard/(admin)/admin/(settings)/settings/layout.tsx b/src/app/dashboard/(admin)/admin/(settings)/settings/layout.tsx
deleted file mode 100644
index 7a435a806..000000000
--- a/src/app/dashboard/(admin)/admin/(settings)/settings/layout.tsx
+++ /dev/null
@@ -1,17 +0,0 @@
-import { FC, ReactNode } from "react";
-
-import SettingsSidebar from "./_components/layout/sidebar";
-
-interface Iproperties {
- children: ReactNode;
-}
-const layout: FC = ({ children }) => {
- return (
-
- );
-};
-
-export default layout;
diff --git a/src/app/dashboard/(admin)/admin/(settings)/settings/notification/_action/notification-store.ts b/src/app/dashboard/(admin)/admin/(settings)/settings/notification/_action/notification-store.ts
deleted file mode 100644
index d489c7456..000000000
--- a/src/app/dashboard/(admin)/admin/(settings)/settings/notification/_action/notification-store.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import create from "zustand";
-
-import { notificationSettingsProperties } from "../_types/notification-settings.types";
-
-interface NotificationStore {
- settings: notificationSettingsProperties;
- updateSettings: (
- newSettings: Partial,
- ) => void;
-}
-
-export const useNotificationStore = create((set) => ({
- settings: {
- mobile_push_notifications: false,
- email_notification_activity_in_workspace: false,
- email_notification_always_send_email_notifications: false,
- email_notification_email_digest: false,
- email_notification_announcement_and_update_emails: false,
- slack_notifications_activity_on_your_workspace: false,
- slack_notifications_always_send_email_notifications: false,
- slack_notifications_announcement_and_update_emails: false,
- },
- updateSettings: (newSettings: Partial) =>
- set((state) => ({
- settings: { ...state.settings, ...newSettings },
- })),
-}));
diff --git a/src/app/dashboard/(admin)/admin/(settings)/settings/notification/_action/notification.ts b/src/app/dashboard/(admin)/admin/(settings)/settings/notification/_action/notification.ts
deleted file mode 100644
index a86ecfe0a..000000000
--- a/src/app/dashboard/(admin)/admin/(settings)/settings/notification/_action/notification.ts
+++ /dev/null
@@ -1,66 +0,0 @@
-import axios from "axios";
-
-/**
- * THIS API IMPLEMENTATION ARE NOT WORKING CURRENTLY, THE BACKEND WOULD BE INTEGRTED SHORTLY. ☺️
- */
-
-const notification_id = undefined;
-
-export const createNotification = async () => {
- const data = {
- message: `Welcome to HNGi8`,
- };
- try {
- await axios.post("/notifications", data);
- } catch (error) {
- return error;
- }
-};
-
-export const RetrieveUserNotificationSettings = async () => {
- try {
- await axios.get("/notification-settings");
- } catch (error) {
- return error;
- }
-};
-
-export const updateUserNotificationSettings = async (settings: object) => {
- try {
- await axios.patch("/notification-settings", settings);
- } catch (error) {
- return error;
- }
-};
-
-export const RetrieveUserNotificationAll = async () => {
- try {
- await axios.get("/notifications");
- } catch (error) {
- return error;
- }
-};
-
-export const RetrieveUserUnreadNotification = async () => {
- try {
- await axios.get("/notifications?_read=false");
- } catch (error) {
- return error;
- }
-};
-
-export const markNotificationAsRead = async () => {
- try {
- await axios.patch(`/notifications/${notification_id}`);
- } catch (error) {
- return error;
- }
-};
-
-export const markAllNotificationAsRead = async () => {
- try {
- await axios.patch("/notifications");
- } catch (error) {
- return error;
- }
-};
diff --git a/src/app/dashboard/(admin)/admin/(settings)/settings/notification/_components/header.tsx b/src/app/dashboard/(admin)/admin/(settings)/settings/notification/_components/header.tsx
deleted file mode 100644
index 986f39353..000000000
--- a/src/app/dashboard/(admin)/admin/(settings)/settings/notification/_components/header.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-import { Separator } from "~/components/ui/separator";
-
-interface IProperties {
- notificationTitle: string;
-}
-
-const NotificationHeader = ({ notificationTitle }: IProperties) => {
- return (
-
- {notificationTitle}
-
-
- );
-};
-
-NotificationHeader.PreviewProps = {
- notificationTitle: `Notification Alert`,
-} satisfies IProperties;
-
-export default NotificationHeader;
diff --git a/src/app/dashboard/(admin)/admin/(settings)/settings/notification/_components/notification-switch-box.tsx b/src/app/dashboard/(admin)/admin/(settings)/settings/notification/_components/notification-switch-box.tsx
deleted file mode 100644
index bd1387604..000000000
--- a/src/app/dashboard/(admin)/admin/(settings)/settings/notification/_components/notification-switch-box.tsx
+++ /dev/null
@@ -1,35 +0,0 @@
-import { Switch } from "~/components/ui/switch";
-import { notificationSettingsProperties } from "../_types/notification-settings.types";
-
-interface IProperties {
- title: string;
- description: string;
- name: keyof notificationSettingsProperties;
- isChecked: boolean;
- onToggle: (name: keyof notificationSettingsProperties) => void;
- className?: string;
-}
-
-export const NotificationSwitchBox = ({
- title,
- description,
- name,
- isChecked,
- onToggle,
-}: IProperties) => {
- return (
-
-
-
- {title}
-
-
- {description}
-
-
-
- onToggle(name)} />
-
-
- );
-};
diff --git a/src/app/dashboard/(admin)/admin/(settings)/settings/notification/_types/notification-settings.types.ts b/src/app/dashboard/(admin)/admin/(settings)/settings/notification/_types/notification-settings.types.ts
deleted file mode 100644
index 505ca8814..000000000
--- a/src/app/dashboard/(admin)/admin/(settings)/settings/notification/_types/notification-settings.types.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-export type notificationSettingsProperties = {
- mobile_push_notifications: boolean;
- email_notification_activity_in_workspace: boolean;
- email_notification_always_send_email_notifications: boolean;
- email_notification_email_digest: boolean;
- email_notification_announcement_and_update_emails: boolean;
- slack_notifications_activity_on_your_workspace: boolean;
- slack_notifications_always_send_email_notifications: boolean;
- slack_notifications_announcement_and_update_emails: boolean;
-};
diff --git a/src/app/dashboard/(admin)/admin/(settings)/settings/notification/page.tsx b/src/app/dashboard/(admin)/admin/(settings)/settings/notification/page.tsx
deleted file mode 100644
index 431eb04df..000000000
--- a/src/app/dashboard/(admin)/admin/(settings)/settings/notification/page.tsx
+++ /dev/null
@@ -1,199 +0,0 @@
-"use client";
-
-import axios from "axios";
-import { Check, ChevronLeft } from "lucide-react";
-import { getSession } from "next-auth/react";
-import { useState } from "react";
-
-import { getApiUrl } from "~/actions/getApiUrl";
-import CustomButton from "~/components/common/common-button/common-button";
-import NotificationSettingSavedModal from "~/components/common/modals/notification-settings-saved";
-import { useToast } from "~/components/ui/use-toast";
-import { useNotificationStore } from "./_action/notification-store";
-import NotificationHeader from "./_components/header";
-import { NotificationSwitchBox } from "./_components/notification-switch-box";
-import { notificationSettingsProperties } from "./_types/notification-settings.types";
-
-const NotificationPage = () => {
- const { settings, updateSettings } = useNotificationStore();
- const [isOpen, setOpen] = useState(false);
- const { toast } = useToast();
-
- const saveNotificationSettings = async (
- settings: notificationSettingsProperties,
- ) => {
- const baseUrl = await getApiUrl();
- const endpoint = "/api/v1/settings/notification-settings";
- const url = `${baseUrl}${endpoint}`;
-
- try {
- const session = await getSession();
- const token = session?.access_token;
-
- if (!token) {
- toast({
- title: "Error",
- description: "No access token",
- variant: "destructive",
- });
- }
-
- const response = await axios.post(url, settings, {
- headers: {
- "Content-Type": "application/json",
- Authorization: `Bearer ${token}`,
- },
- });
-
- if (response.status !== 200) {
- toast({
- title: "Error",
- description: "Request failed",
- variant: "destructive",
- });
- }
- const data = response.data;
- return data;
- } catch {
- toast({
- title: "Error",
- description: "Failed to save settings",
- variant: "destructive",
- });
- }
- };
-
- const handleToggleSwitch = (name: keyof typeof settings) => {
- updateSettings({ [name]: !settings[name] });
- };
-
- const handleSaveChanges = async () => {
- try {
- await saveNotificationSettings(settings);
- setOpen(true);
- } catch {
- throw new Error("Failed to save settings");
- }
- };
-
- return (
-
-
-
- Notification
-
- {/* NOTIFICATION ALERT */}
-
- {/* EMAIL NOTIFICATION */}
-
- {/* SLACK NOTIFICATIONS */}
-
-
- }
- isLeftIconVisible={true}
- onClick={handleSaveChanges}
- >
- Save Changes
-
-
- setOpen(false)}
- />
-
- );
-};
-
-export default NotificationPage;
diff --git a/src/app/dashboard/(admin)/admin/(settings)/settings/organization/export.ts b/src/app/dashboard/(admin)/admin/(settings)/settings/organization/export.ts
deleted file mode 100644
index 521f32983..000000000
--- a/src/app/dashboard/(admin)/admin/(settings)/settings/organization/export.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-import axios from "axios";
-
-import { getApiUrl } from "~/actions/getApiUrl";
-
-export const exportMembersEndpoint = async (format: string = "csv") => {
- const apiUrl = await getApiUrl();
- try {
- const response = await axios.get(
- `${apiUrl}/api/v1/organisation/members/export`,
- {
- params: {
- format: format,
- },
- },
- );
- return {
- success: true,
- format: format,
- response: response,
- };
- } catch (error: unknown) {
- if (axios.isAxiosError(error)) {
- return {
- error: true,
- message: error.response?.data?.message || error?.message,
- };
- }
- return {
- error: true,
- message: "An unknown error occurred",
- };
- }
-};
diff --git a/src/app/dashboard/(admin)/admin/(settings)/settings/organization/integrations/page.tsx b/src/app/dashboard/(admin)/admin/(settings)/settings/organization/integrations/page.tsx
deleted file mode 100644
index ee0010e25..000000000
--- a/src/app/dashboard/(admin)/admin/(settings)/settings/organization/integrations/page.tsx
+++ /dev/null
@@ -1,228 +0,0 @@
-"use client";
-
-import { useState } from "react";
-
-import CardPlatform from "~/components/card/card-platform";
-import { cn } from "~/lib/utils";
-
-const mockupPlatforms: PlatformCardProperties[] = [
- {
- id: 1,
- heading: "Drive",
- logo: "/images/integration/gdrive.svg",
- description:
- "Store, share, and collaborate on documents and files securely",
- isActive: false,
- },
- {
- id: 2,
- heading: "Dropbox",
- logo: "/images/integration/dropbox.svg",
- description: "Securely store, sync, and share all your files and documents",
- isActive: true,
- },
- {
- id: 3,
- heading: "Notion",
- logo: "/images/integration/notion.svg",
- description:
- "Organize information, collaborate on projects, and create flexible workflows",
- isActive: false,
- },
- {
- id: 4,
- heading: "OneDrive",
- logo: "/images/integration/onedrive.svg",
- description:
- "Access, share, and manage your files seamlessly across devices",
- isActive: true,
- },
- {
- id: 5,
- heading: "Atlassian",
- logo: "/images/integration/atlassian.svg",
- description: "Streamline project planning and manage workflows effectively",
- isActive: true,
- },
- {
- id: 6,
- heading: "MicrosoftTeams",
- logo: "/images/integration/ms-office-teams.svg",
- description:
- "Enhance team communication and project management with Microsoft Teams",
- isActive: true,
- },
- {
- id: 7,
- heading: "Trello",
- logo: "/images/integration/trello.svg",
- description:
- "Organize your projects, track tasks, and collaborate in a visual way",
- isActive: true,
- },
- {
- id: 8,
- heading: "Jira",
- logo: "/images/integration/jira.svg",
- description:
- "Track tasks, manage projects, and streamline team collaboration",
- isActive: true,
- },
- {
- id: 9,
- heading: "Slack",
- logo: "/images/integration/slack.svg",
- description:
- "Transform team communication, enhance collaboration, and streamline workflow efficiency",
- isActive: true,
- },
-];
-
-export default function Integration() {
- const [platforms, setPlatforms] = useState(mockupPlatforms);
- const [filter, setFilter] = useState("all");
- const [searchTerm, setSearchTerm] = useState("");
-
- const togglePlatformActive = (id: number | string) => {
- setTimeout(() => {
- setPlatforms(
- platforms.map((platform) =>
- platform.id === id
- ? { ...platform, isActive: !platform.isActive }
- : platform,
- ),
- );
- }, 500);
- };
-
- const filteredPlatforms = platforms.filter((platform) => {
- const matchesFilter =
- filter === "all" ||
- (filter === "active" && platform.isActive) ||
- (filter === "inactive" && !platform.isActive);
-
- const matchesSearch = platform.heading
- .toLowerCase()
- .includes(searchTerm.toLowerCase());
-
- return matchesFilter && matchesSearch;
- });
- return (
-
-
-
- {filteredPlatforms.map((data) => (
- togglePlatformActive(data.id)}
- />
- ))}
-
-
- );
-}
-
-const SearchIcon = () => {
- return (
-
-
-
-
- );
-};
-
-interface PlatformCardProperties {
- /**
- * Unique identifier.
- */
- id: string | number;
- /**
- * Displaying the platform title.
- */
- heading: string;
- /**
- * Displaying the platform logo or icon.
- */
- logo: string;
- /**
- * Providing a brief overview of the platform.
- */
- description: string;
- /**
- * active status of the platform, true or false.
- */
- isActive: boolean;
-}
diff --git a/src/app/dashboard/(admin)/admin/(settings)/settings/organization/members/page.tsx b/src/app/dashboard/(admin)/admin/(settings)/settings/organization/members/page.tsx
deleted file mode 100644
index 85488d79b..000000000
--- a/src/app/dashboard/(admin)/admin/(settings)/settings/organization/members/page.tsx
+++ /dev/null
@@ -1,321 +0,0 @@
-"use client";
-
-import { AxiosResponse } from "axios";
-import { EllipsisIcon } from "lucide-react";
-import Link from "next/link";
-import { useState } from "react";
-
-import CustomButton from "~/components/common/common-button/common-button";
-import { Input } from "~/components/common/input";
-import InviteMemberModal from "~/components/common/modals/invite-member";
-import DeleteMember from "~/components/common/modals/invite-member/DeleteMembers";
-import LoadingSpinner from "~/components/miscellaneous/loading-spinner";
-import {
- DropdownMenu,
- DropdownMenuContent,
- DropdownMenuItem,
- DropdownMenuTrigger,
-} from "~/components/ui/dropdown-menu";
-import {
- Select,
- SelectContent,
- SelectGroup,
- SelectItem,
- SelectLabel,
- SelectTrigger,
- SelectValue,
-} from "~/components/ui/select";
-import { useToast } from "~/components/ui/use-toast";
-import { exportMembersEndpoint } from "../export";
-
-type Member = {
- avatar?: string;
- id: number;
- name: string;
- email: string;
- role: string;
-};
-
-const memberData: Member[] = [
- {
- avatar: "CB",
- id: 1,
- name: "Chad Bosewick",
- email: "ChadBoseW@gmail.com",
- role: "Admin",
- },
- {
- avatar: "SN",
- id: 2,
- name: "Chad Bosewick",
- email: "ChadBoseW@gmail.com",
- role: "Admin",
- },
- {
- avatar: "CB",
- id: 3,
- name: "Chad Bosewick",
- email: "ChadBoseW@gmail.com",
- role: "Admin",
- },
- {
- avatar: "CB",
- id: 4,
- name: "Chad Bosewick",
- email: "ChadBoseW@gmail.com",
- role: "Admin",
- },
- {
- avatar: "CB",
- id: 5,
- name: "Chad Bosewick",
- email: "ChadBoseW@gmail.com",
- role: "Admin",
- },
-];
-
-const activeMembers: number = memberData.length;
-
-const Members = () => {
- const [isModalOpen, setIsModalOpen] = useState(false);
- const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false);
-
- const [exporting, setExporting] = useState(false);
- const [text, setText] = useState("Export CSV");
- const [isVisible, setIsVisible] = useState(false);
-
- const toggleVisibility = () => {
- setIsVisible(!isVisible);
- };
-
- const { toast } = useToast();
- const handleCopy = () => {
- navigator.clipboard.writeText("https://example.com").then(() => {
- toast({
- description: "Invite link copied to clipboard.",
- });
- });
- };
-
- const handleModalOpen = () => {
- setIsModalOpen(true);
- };
-
- const handleDeleteOpen = () => {
- setIsDeleteModalOpen(true);
- };
-
- const handleModalClose = () => {
- setIsModalOpen(false);
- };
-
- const handleDeleteClose = () => {
- setIsDeleteModalOpen(false);
- };
-
- const exportMembers = async () => {
- setExporting(true);
- setText("Exporting...");
-
- const result = await exportMembersEndpoint();
-
- if (result.success) {
- toast({
- title: "Success",
- description: result.message || "Exported Successfully",
- variant: "destructive",
- });
- downloadDocument(result);
- }
-
- if (result.error) {
- toast({
- title: "Error",
- description: result.message,
- variant: "destructive",
- });
- setExporting(false);
- setText("Export CSV");
- }
- };
-
- const downloadDocument = (result: {
- success?: boolean;
- format: string;
- response: AxiosResponse;
- error?: undefined;
- message?: undefined;
- }) => {
- setText("Downloading...");
-
- const link = document.createElement("a");
-
- link.href = URL.createObjectURL(result.response.data);
- link.download = `org_members.${result.format}`;
- document.body.append(link);
- link.click();
- link.remove();
-
- setText("Export CSV");
- setExporting(false);
- };
-
- return (
-
-
-
Members
-
- Manage who has access to this workspace
-
-
-
-
-
-
Invite Link
-
- This provides a unique URL that allows anyone to join your
- workspace
-
-
-
-
-
- {isVisible && (
-
-
- https://www.figma.com/design/7hCSTNzQOJLl9aww6wEEd1/Managing-Users----Team-Learn-AI?node-i
-
-
- Copy link
-
-
- )}
-
-
-
Manage members
-
- On the Free plan all members in a workspace are administrators.
- Upgrade to a paid plan to add the ability to assign or remove
- administrator roles.{" "}
-
- {" "}
- Go to Plans
-
-
-
-
-
-
-
-
-
-
-
-
- Roles
- Name
- Email
-
-
-
-
-
- Invite people
-
-
-
-
{activeMembers} active members
-
-
-
-
Export Members List
-
- Export a CSV with information of all members of your team
-
-
-
{
- exportMembers();
- }}
- >
- {exporting ? (
-
- {text} {" "}
-
-
- ) : (
- {text}
- )}
-
-
-
-
-
-
- );
-};
-
-export default Members;
diff --git a/src/app/dashboard/(admin)/admin/(settings)/settings/organization/roles-and-permissions/create-role/page.tsx b/src/app/dashboard/(admin)/admin/(settings)/settings/organization/roles-and-permissions/create-role/page.tsx
deleted file mode 100644
index a55dfa546..000000000
--- a/src/app/dashboard/(admin)/admin/(settings)/settings/organization/roles-and-permissions/create-role/page.tsx
+++ /dev/null
@@ -1,338 +0,0 @@
-"use client";
-
-import { zodResolver } from "@hookform/resolvers/zod";
-import { ChevronLeftIcon } from "lucide-react";
-import { useSession } from "next-auth/react";
-import Link from "next/link";
-import { useRouter } from "next/navigation";
-import { useEffect, useState } from "react";
-import { useForm } from "react-hook-form";
-import { z } from "zod";
-
-import { createRole, getPermissions } from "~/actions/roles-and-permissions";
-import RolePermissionsCreationModal from "~/components/common/modals/roles-permissions-creation";
-import LoadingSpinner from "~/components/miscellaneous/loading-spinner";
-import {
- Select,
- SelectContent,
- SelectItem,
- SelectTrigger,
- SelectValue,
-} from "~/components/ui/select";
-import { toast } from "~/components/ui/use-toast";
-import { roleSchema } from "~/schemas";
-
-type UseFormInputs = z.infer;
-type Role = {
- name: string;
- description: string;
- permissions: Record;
-};
-
-const permOptions: Role[] = [
- {
- name: "Super Admin",
- description: "Full control and Full Permissions",
- permissions: {
- "Can view transactions": true,
- "Can view refunds": true,
- "Can view users": true,
- "Can create users": true,
- "Can blacklist/whitelist users": true,
- },
- },
- {
- name: "Admin",
- description: "Full control and Limited Permissions",
- permissions: {
- "Can view transactions": true,
- "Can view refunds": true,
- "Can view users": true,
- "Can create users": true,
- "Can blacklist/whitelist users": false,
- },
- },
- {
- name: "User",
- description: "Limited Control and Limited Permissions",
- permissions: {
- "Can view transactions": true,
- "Can view refunds": true,
- "Can view users": false,
- "Can create users": false,
- "Can blacklist/whitelist users": false,
- },
- },
- {
- name: "Custom Role",
- description: "Custom Control and Custom Permissions",
- permissions: {
- "Can view transactions": false,
- "Can view refunds": false,
- "Can view users": false,
- "Can create users": false,
- "Can blacklist/whitelist users": false,
- },
- },
-];
-
-type APIPermissions = {
- name: string;
- id: string;
- description: string;
-};
-
-type PermissionOption = {
- name: string;
- description: string;
- permissions: {
- id: string;
- name: string;
- description: string;
- value: boolean;
- }[];
-};
-
-const transformPermissions = (apiResponse: APIPermissions[]) => {
- // eslint-disable-next-line unicorn/no-array-reduce
- const apiResponseMap = apiResponse.reduce>(
- (accumulator, permission) => {
- accumulator[permission.name.toLowerCase()] = permission;
- return accumulator;
- },
- {},
- );
-
- const transformedPermOptions = permOptions.map((role) => ({
- name: role.name,
- description: role.description,
- permissions: Object.keys(role.permissions).map((permName) => {
- const permKey = permName.toLowerCase();
- const apiPerm = apiResponseMap[permKey];
-
- return {
- id: apiPerm.id,
- name: permName,
- description: apiPerm.description,
- value: role.permissions[permName],
- };
- }),
- }));
- return transformedPermOptions;
-};
-
-function CreateNewRolePage() {
- const router = useRouter();
- const { data: session } = useSession();
- const [isSaving, setIsSaving] = useState(false);
- const [permissions, setPermissions] = useState<
- PermissionOption["permissions"] | []
- >([]);
- const [permissionOptions, setPermissionOptions] = useState<
- PermissionOption[] | []
- >([]);
-
- const {
- register,
- handleSubmit,
- formState: { errors },
- setValue,
- trigger,
- } = useForm({
- mode: "onChange",
- resolver: zodResolver(roleSchema),
- });
-
- useEffect(() => {
- const fetchPermissions = async () => {
- await getPermissions()
- .then((data) => {
- if (data.data) setPermissionOptions(transformPermissions(data.data));
- })
- .catch((error) => {
- // eslint-disable-next-line no-console
- console.log(error);
- });
- };
- fetchPermissions();
- }, []);
-
- useEffect(() => {
- if (permissions.length > 0) {
- const permissionIds = permissions
- .filter((permission) => permission.value === true)
- .map((permission) => permission.id);
- setValue("permissions", permissionIds as [string, ...string[]]);
- }
- }, [permissions, setValue]);
-
- useEffect(() => {
- if (permissionOptions && permissionOptions.length > 0) {
- setPermissions(permissionOptions[0].permissions);
- }
- }, [permissionOptions]);
-
- const onValid = async (values: UseFormInputs) => {
- setIsSaving(true);
- try {
- await createRole(values, session?.currentOrgId ?? "")
- .then((data) => {
- if (!data.error) {
- toast({
- title: "🎉 Role Created Successfully!",
- description:
- "You have successfully created the new role Role Name. You can now assign this role to team members and manage their permissions in the Roles & Permissions section.",
- variant: "default",
- });
- router.push("");
- }
- setIsSaving(false);
- })
- .catch(() => {
- toast({
- title: "⚠️ Error Creating Role",
- description:
- "Oops! Something went wrong while trying to create the new role. Please check your input and try again. If the problem persists, contact support.",
- variant: "destructive",
- });
- setIsSaving(false);
- });
- } catch {
- toast({
- title: "⚠️ Error Creating Role",
- description:
- "Oops! Something went wrong while trying to create the new role. Please check your input and try again. If the problem persists, contact support.",
- variant: "destructive",
- });
- setIsSaving(false);
- }
- };
-
- const handleInputChange = (field: keyof UseFormInputs) => {
- trigger(field);
- };
-
- return (
-
-
-
-
-
-
-
Create Role
-
-
- Custom roles let you group permissions and assign them to principals
- in your organization. You can manually select permissions or import
- permissions from another role.
-
-
-
-
-
-
- Name of role
-
-
handleInputChange("name"),
- })}
- className={`!w-full rounded-md border ${
- errors.name ? "border-red-500" : "border-border"
- } bg-transparent px-3 py-2 shadow-sm outline-none focus:border-primary focus:ring-ring md:w-56`}
- />
- {errors.name && (
-
{errors.name.message}
- )}
-
-
-
-
- Permissions
-
-
-
{
- setPermissions(JSON.parse(value));
- trigger("permissions");
- }}
- >
-
-
-
-
- {permissionOptions.map((option) => (
-
- {option.name}
- {option.description}
-
- ))}
-
-
- {errors.permissions && (
-
- {errors.permissions.message}
-
- )}
-
-
-
-
- Role Description
-
-
handleInputChange("description"),
- })}
- className={`min-h-20 w-full resize-none rounded-md border ${
- errors.description ? "border-red-500" : "border-border"
- } bg-transparent px-3 py-2 shadow-sm outline-none focus:border-primary focus:ring-ring`}
- />
- {errors.description && (
-
- {errors.description.message}
-
- )}
-
-
-
-
-
- {isSaving ? (
-
- ) : (
- "Create Role"
- )}
-
-
-
-
- );
-}
-
-export default CreateNewRolePage;
diff --git a/src/app/dashboard/(admin)/admin/(settings)/settings/organization/roles-and-permissions/page.tsx b/src/app/dashboard/(admin)/admin/(settings)/settings/organization/roles-and-permissions/page.tsx
deleted file mode 100644
index 0ec979fa5..000000000
--- a/src/app/dashboard/(admin)/admin/(settings)/settings/organization/roles-and-permissions/page.tsx
+++ /dev/null
@@ -1,279 +0,0 @@
-"use client";
-
-import { useSession } from "next-auth/react";
-import Link from "next/link";
-import { useEffect, useState } from "react";
-
-import { getApiUrl } from "~/actions/getApiUrl";
-import {
- getPermissions,
- getRolePermissions,
- getRoles,
- updateRole,
-} from "~/actions/roles-and-permissions";
-import CustomButton from "~/components/common/common-button/common-button";
-import LoadingSpinner from "~/components/miscellaneous/loading-spinner";
-import { useToast } from "~/components/ui/use-toast";
-
-type Role = {
- id: string;
- name: string;
- description: string;
-};
-
-type Permission = {
- id: string;
- name: string;
- description: string;
-};
-
-const RolesAndPermission = () => {
- const [selectedRoleId, setSelectedRoleId] = useState();
- const [permissions, setPermissions] = useState([]);
- const [allPermission, setAllPermissions] = useState([]);
- const [isAllPermissionsLoaded, setIsAllPermissionsLoaded] =
- useState(false);
- const [roles, setRoles] = useState([]);
- const [apiUrl, setApiUrl] = useState("");
- const { toast } = useToast();
- const [loadingRoles, setLoadingRoles] = useState(true);
- const [loadingPermissions, setLoadingPermissions] = useState(false);
- const [loadingRequest, setLoadingRequest] = useState(false);
- const { data: session } = useSession();
-
- useEffect(() => {
- if (!session?.currentOrgId) return;
- const fetchData = async () => {
- try {
- const url = await getApiUrl();
- setApiUrl(url);
- const { data, error } = await getRoles(session?.currentOrgId ?? "");
-
- if (error) throw new Error("An error occurred!");
-
- setRoles(data.data);
- setLoadingRoles(false);
- } catch (error: unknown) {
- toast({
- title: "Error occurred",
- description:
- error instanceof Error ? error.message : "Error fetching data",
- variant: "destructive",
- });
- setLoadingRoles(false);
- }
- };
- setLoadingRoles(true);
- fetchData();
- }, [session?.currentOrgId, toast]);
-
- useEffect(() => {
- const fetchPermissions = async () => {
- if (selectedRoleId && session?.currentOrgId) {
- setLoadingPermissions(true);
- try {
- await getRolePermissions(session?.currentOrgId, selectedRoleId).then(
- (data) => {
- const rolesData = data.data;
- if (rolesData.permissions.length > 0) {
- setPermissions(
- rolesData.permissions.map(
- (permission: Permission) => permission.id,
- ),
- );
- }
- setLoadingPermissions(false);
- },
- );
- } catch {
- toast({
- title: "An error occurred",
- description: "Error fetching permissions",
- variant: "destructive",
- });
- setLoadingPermissions(false);
- }
- }
- };
- fetchPermissions();
- }, [selectedRoleId, apiUrl, session?.currentOrgId, toast]);
-
- useEffect(() => {
- const fetchPermissions = async () => {
- await getPermissions()
- .then((data) => {
- setIsAllPermissionsLoaded(true);
- if (data.data) setAllPermissions(data.data);
- })
- .catch((error) => {
- // eslint-disable-next-line no-console
- console.log(error);
- setIsAllPermissionsLoaded(true);
- });
- };
- fetchPermissions();
- }, []);
-
- const handleRoleClick = (roleId: string) => {
- setSelectedRoleId(roleId);
- };
-
- const handleToggle = (permissionId: string, checked: boolean) => {
- if (checked) {
- setPermissions((previous) => [...previous, permissionId]);
- } else {
- setPermissions((previous) =>
- previous.filter((id) => id !== permissionId),
- );
- }
- };
-
- const handleSave = async () => {
- if (!selectedRoleId || !session?.currentOrgId) return;
- const selectedRole =
- roles.some((role) => role.id === selectedRoleId) &&
- roles.find((role) => role.id === selectedRoleId);
- if (!selectedRole) return;
- setLoadingRequest(true);
- try {
- await updateRole(
- { ...selectedRole, permissions },
- session?.currentOrgId,
- selectedRoleId,
- ).then(() => {
- toast({
- title: "Success",
- description: "Role updated successfully",
- variant: "default",
- });
- });
- } catch {
- toast({
- title: "Error",
- description: "Failed to update role",
- variant: "destructive",
- });
- }
- setLoadingRequest(false);
- };
-
- return (
-
-
-
-
Roles
-
- Manage user roles for members
-
-
-
-
-
- + Create roles
-
-
-
-
-
-
-
- {loadingRoles ? (
-
-
-
- ) : (
- roles.map((role) => (
- handleRoleClick(role.id)}
- >
- {role.name}
-
- {role.description}
-
-
- ))
- )}
-
-
-
-
-
-
- Permissions
-
-
- See the list of permissions for this role
-
-
- {selectedRoleId === undefined ? (
-
-
- No list to show
-
-
- Click on a role to view permissions
-
-
- ) : loadingPermissions ? (
-
-
-
- ) : isAllPermissionsLoaded ? (
-
- {allPermission.map((permission) => (
-
-
- {permission.name
- .replaceAll("_", " ")
- .replaceAll(/\b\w/g, (l) => l.toUpperCase())}
-
-
-
- handleToggle(permission.id, event.target.checked)
- }
- />
-
-
-
- ))}
-
-
- {loadingRequest ? (
-
- ) : (
- "Save Preferences"
- )}
-
-
-
- ) : (
-
-
-
- )}
-
-
-
-
- );
-};
-
-export default RolesAndPermission;
diff --git a/src/app/dashboard/(admin)/admin/(settings)/settings/page.tsx b/src/app/dashboard/(admin)/admin/(settings)/settings/page.tsx
deleted file mode 100644
index 0f26d3f06..000000000
--- a/src/app/dashboard/(admin)/admin/(settings)/settings/page.tsx
+++ /dev/null
@@ -1,402 +0,0 @@
-"use client";
-
-import axios from "axios";
-import { useSession } from "next-auth/react";
-import Image from "next/image";
-import { ChangeEvent, useEffect, useState } from "react";
-
-import { getApiUrl } from "~/actions/getApiUrl";
-import CustomButton from "~/components/common/common-button/common-button";
-import CustomInput from "~/components/common/input/input";
-import ProfileUpdateSuccessModal from "~/components/common/modals/profile-update-success";
-import { Textarea } from "~/components/common/text-area";
-import {
- Select,
- SelectContent,
- SelectItem,
- SelectTrigger,
- SelectValue,
-} from "~/components/ui/select";
-import { toast } from "~/components/ui/use-toast";
-import { InstagramIcon, LinkedinIcon, XIcon } from "./icons";
-
-const pronouns = [
- { value: "He/Him", label: "He/Him" },
- { value: "She/Her", label: "She/Her" },
- { value: "Other", label: "Other" },
-];
-
-export default function SettingsPage() {
- const { data } = useSession();
- const [image, setImage] = useState();
-
- const [error, setError] = useState();
- const [isSuccess, setIsSuccess] = useState(false);
-
- const [isPending, setIsPending] = useState(false);
-
- const [pronoun, setPronoun] = useState("");
-
- const [profilePicture, setProfilePicture] = useState();
-
- const [socialLinks, setSocialLinks] = useState({
- x: "",
- instagram: "",
- linkedin: "",
- });
-
- const linksDataHandler = (
- event: ChangeEvent,
- ) => {
- setSocialLinks((previous) => ({
- ...previous,
- [event.target.name]: event.target.value,
- }));
- };
-
- const [formData, setFormData] = useState({
- username: "",
- jobTitle: "",
- department: "",
- email: "",
- bio: "",
- });
-
- const formDataHandler = (
- event: ChangeEvent,
- ) => {
- setFormData((previous) => ({
- ...previous,
- [event.target.name]: event.target.value,
- }));
- };
-
- useEffect(() => {
- (async () => {
- const baseUrl = await getApiUrl();
- const API_URL = `${baseUrl}/api/v1/profile/${data?.user.id}`;
- try {
- const response = await axios.get(API_URL, {
- headers: {
- Authorization: `Bearer ${data?.access_token}`,
- },
- });
- if (response.data?.data) {
- //console.log("Fetched profile data:", response.data.data);
- const { avatar_url, profile_pic_url } = response.data.data;
- setPronoun(response.data.data.pronouns);
- setSocialLinks({
- x: response.data.data.social_links
- ? response.data.data.social_links[0]
- : "",
- instagram: response.data.data.social_links
- ? response.data.data.social_links[1]
- : "",
- linkedin: response.data.data.social_links
- ? response.data.data.social_links[2]
- : "",
- });
- setFormData({
- bio: response.data.data.bio ?? "",
- jobTitle: response.data.data.jobTitle ?? "",
- email: response.data.data.email ?? "",
- department: response.data.data.department ?? "",
- username: response.data.data.username ?? "",
- });
- setProfilePicture(avatar_url || profile_pic_url);
- setIsSuccess(true);
- }
- } catch {
- setError("An error occurred while retrieving your information");
- }
- })();
- }, [data?.access_token, data?.user.id]);
-
- const handleImageUpload = async (event: ChangeEvent) => {
- const file = event.target.files?.[0];
- if (file) {
- setImage(file);
-
- const formData = new FormData();
- formData.append("avatar", file);
-
- try {
- const baseUrl = await getApiUrl();
- const UPLOAD_API_URL = `${baseUrl}/api/v1/profile/upload-image`;
-
- const uploadResponse = await axios.post(UPLOAD_API_URL, formData, {
- headers: {
- Authorization: `Bearer ${data?.access_token}`,
- "Content-Type": "multipart/form-data",
- },
- });
-
- if (uploadResponse.status === 200) {
- const { avatar_url, profile_pic_url } = uploadResponse.data.data;
- const profilePicUrl = avatar_url || profile_pic_url;
-
- setProfilePicture(profilePicUrl);
-
- setFormData((previousData) => ({
- ...previousData,
- profile_pic_url: profilePicture,
- }));
- } else {
- throw new Error(".");
- }
- } catch {
- setError(".");
- }
- }
- };
-
- const submit = async () => {
- if (!isValidXUrl(socialLinks.x)) {
- return toast({ title: "Warning!", description: "Enter a valid X url" });
- }
- if (!isValidInstagramUrl(socialLinks.instagram)) {
- return toast({
- title: "Warning!",
- description: "Enter a valid Instagram url",
- });
- }
- if (!isValidLinkedInUrl(socialLinks.linkedin)) {
- return toast({
- title: "Warning!",
- description: "Enter a valid Linkedin url",
- });
- }
-
- try {
- const payload = {
- ...formData,
- pronouns: pronoun,
- social_links: Object.values(socialLinks),
- profile_pic_url: profilePicture,
- };
- setIsPending(true);
- // const baseUrl = await getApiUrl();
- // const API_URL = `${baseUrl}/api/v1/profile/${data?.user.id}`;
-
- const updatedUser = {
- ...data?.user,
- image: payload.profile_pic_url,
- };
-
- const event = new CustomEvent("session", {
- detail: { session: { ...data, user: updatedUser } },
- });
-
- window.dispatchEvent(event);
-
- setIsSuccess(true);
-
- window.dispatchEvent(
- new CustomEvent("userProfileUpdate", {
- detail: { profilePicUrl: profilePicture },
- }),
- );
- } catch {
- setIsPending(false);
- setError("An error occurred while saving your information");
- } finally {
- setIsPending(false);
- }
- };
-
- return (
-
-
-
-
-
-
-
- Pronouns
-
- setPronoun(value)}
- >
-
-
-
-
- {pronouns.map((pronoun) => (
-
- {pronoun.label}
-
- ))}
-
-
-
-
-
-
-
-
-
-
-
- Bio
-
-
-
-
- Maximum of 64 characters
-
-
-
-
-
Connect Social Links
-
-
-
-
-
- Cancel
-
-
- Save Changes
-
-
- {isSuccess && (
-
setIsSuccess(false)}
- />
- )}
-
-
- );
-}
-
-function isValidLinkedInUrl(url: string) {
- const linkedInRegex = /^(https?:\/\/)?(www\.)?linkedin\.com\/[\w/-]+\/?$/;
- return linkedInRegex.test(url);
-}
-
-function isValidXUrl(url: string) {
- const xRegex = /^(https?:\/\/)?(www\.)?x\.com\/\w{1,15}\/?$/;
- return xRegex.test(url);
-}
-
-function isValidInstagramUrl(url: string) {
- const instagramRegex = /^(https?:\/\/)?(www\.)?instagram\.com\/[\w.]+\/?$/;
- return instagramRegex.test(url);
-}
diff --git a/src/app/dashboard/(admin)/admin/(settings)/settings/payment-information/page.tsx b/src/app/dashboard/(admin)/admin/(settings)/settings/payment-information/page.tsx
deleted file mode 100644
index fa909b5d2..000000000
--- a/src/app/dashboard/(admin)/admin/(settings)/settings/payment-information/page.tsx
+++ /dev/null
@@ -1,220 +0,0 @@
-import Link from "next/link";
-
-import { Button } from "~/components/ui/button";
-
-const PaymentInformation = () => {
- return (
-
-
Current Plan
-
-
-
Free
-
- Your account is on a free 90-day trial of our free plan, through
- September 27th. Upgrade anytime to stay on this plan when your trial
- ends.
-
-
$0/month
-
-
-
-
Subscribe to your desired plan
-
-
-
-
-
Free
-
- {" "}
- $0 {" "}
- /month {" "}
-
-
- The essential to provide your best work for clients.
-
-
-
- 10 Projects {" "}
-
-
- Up to 10 subscribers {" "}
-
-
- Advanced analytics {" "}
-
-
-
- Current Plan
-
-
-
-
Basic
-
- {" "}
- $20 {" "}
- /month {" "}
-
-
- Ideal for growing needs who want more features.
-
-
-
- 100 Projects {" "}
-
-
- Up to 50 subscribers {" "}
-
-
- Advanced analytics {" "}
-
-
- 24-hour support {" "}
-
-
-
-
- Upgrade
-
-
-
-
-
Advanced
-
- {" "}
- $50 {" "}
- /month {" "}
-
-
- Designed for power users and maximum functionalities.
-
-
-
- 200 Projects {" "}
-
-
- Up to 100 subscribers {" "}
-
-
- Advanced analytics {" "}
-
-
- 24-hour support {" "}
-
-
- Marketing advisor {" "}
-
-
-
-
- Upgrade
-
-
-
-
-
Premium
-
- {" "}
- $100 {" "}
- /month {" "}
-
-
- Perfect for users who want more features.
-
-
-
- 300 Projects {" "}
-
-
- Up to 500 subscribers {" "}
-
-
- Advanced analytics {" "}
-
-
- 24-hour support {" "}
-
-
- Marketing advisor {" "}
-
-
-
-
- Upgrade
-
-
-
-
-
-
-
-
-
-
-
- 10 Projects {" "}
-
-
- Up to 10 subscribers {" "}
-
-
- Advanced analytics {" "}
-
-
-
-
- 100 Projects {" "}
-
-
- Up to 50 subscribers {" "}
-
-
- Advanced analytics {" "}
-
-
- 24-hour support {" "}
-
-
-
-
- 200 Projects {" "}
-
-
- Up to 100 subscribers {" "}
-
-
- Advanced analytics {" "}
-
-
- 24-hour support {" "}
-
-
- Marketing advisor {" "}
-
-
-
-
- 300 Projects {" "}
-
-
- Up to 500 subscribers {" "}
-
-
- Advanced analytics {" "}
-
-
- 24-hour support {" "}
-
-
- Marketing advisor {" "}
-
-
-
-
-
-
- );
-};
-
-export default PaymentInformation;
diff --git a/src/app/dashboard/(admin)/admin/(settings)/settings/payment-information/upgrade/page.tsx b/src/app/dashboard/(admin)/admin/(settings)/settings/payment-information/upgrade/page.tsx
deleted file mode 100644
index 35ea600b4..000000000
--- a/src/app/dashboard/(admin)/admin/(settings)/settings/payment-information/upgrade/page.tsx
+++ /dev/null
@@ -1,232 +0,0 @@
-"use client";
-
-import { ArrowLeft, ChevronDown, ChevronUp } from "lucide-react";
-import Image from "next/image";
-import Link from "next/link";
-import { useRouter } from "next/navigation";
-import { useState } from "react";
-
-import CustomButton from "~/components/common/common-button/common-button";
-import CustomInput from "~/components/common/input/input";
-import PlanUpgradeSuccessfulModal from "~/components/common/modals/plan-upgrade-successful";
-
-const billingOption = [
- {
- name: "Pay monthly",
- description: "$20/ month/member",
- },
- {
- name: "Pay yearly",
- description: "$200/ year/member",
- },
-];
-
-const paymentMethod = [
- {
- name: "Credit Card",
- icon: "/user-dashboard/svg/credit-card.svg",
- width: 64,
- },
- {
- name: "Stripe Payment",
- icon: "/user-dashboard/svg/stripe-logo.svg",
- width: 84,
- },
- {
- name: "Paypal Payment",
- icon: "/user-dashboard/svg/paypal-logo.svg",
- width: 153,
- },
-];
-
-const Checkout = () => {
- const [open, setOpen] = useState(false);
- const router = useRouter();
-
- const [isDetailsVisible, setIsDetailsVisible] = useState(false);
-
- const toggleDetails = () => {
- setIsDetailsVisible(!isDetailsVisible);
- };
-
- return (
-
-
-
-
- router.back()} title="Back">
-
-
-
- Upgrade to Basic
-
-
-
- Do more with unlimited users and Integration when you upgrade
-
-
-
-
-
-
-
-
-
-
- Billing Option
-
-
-
- {billingOption.map((item, index) => (
-
-
-
-
-
-
{item.name}
-
- {item.description}
-
-
-
-
-
-
- ))}
-
-
-
-
- $20 /month
- : }
- isRightIconVisible={true}
- size="sm"
- onClick={toggleDetails}
- >
- Details
-
-
-
- {isDetailsVisible && (
-
-
- Members in your workspace
- 1
-
-
- x$20/month/member
- $20
-
-
-
- Subtotal
- $20
-
-
- Tax if applicable
- $20
-
-
- )}
-
-
-
-
-
- Choose Payment Method
-
-
-
-
-
-
-
-
-
-
- By submitting this form, you confirm that you agree to our{" "}
-
- Terms of Service
- {" "}
- and{" "}
-
- Privacy Policy
-
- .
-
-
-
-
-
setOpen(true)}
- >
- Proceed to Payment
-
-
-
- setOpen(!open)} show={open} />
-
- );
-};
-
-export default Checkout;
diff --git a/src/app/dashboard/(admin)/admin/(settings)/settings/subscription/page.tsx b/src/app/dashboard/(admin)/admin/(settings)/settings/subscription/page.tsx
deleted file mode 100644
index db4d38750..000000000
--- a/src/app/dashboard/(admin)/admin/(settings)/settings/subscription/page.tsx
+++ /dev/null
@@ -1,5 +0,0 @@
-const page = () => {
- return page
;
-};
-
-export default page;
diff --git a/src/app/dashboard/(admin)/layout.tsx b/src/app/dashboard/(admin)/layout.tsx
deleted file mode 100644
index 9d4b79dfe..000000000
--- a/src/app/dashboard/(admin)/layout.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Suspense } from "react";
-
-import Providers from "~/components/providers";
-import DashboardNavbar from "./_components/layout/navbar";
-
-export default function AdminLayout({
- children,
-}: {
- children: React.ReactNode;
-}) {
- return (
-
-
-
-
-
- {children}
-
-
-
- );
-}
diff --git a/src/app/dashboard/(user-dashboard)/(user-metrics)/analytics/page.tsx b/src/app/dashboard/(user-dashboard)/(user-metrics)/analytics/page.tsx
deleted file mode 100644
index b1477f101..000000000
--- a/src/app/dashboard/(user-dashboard)/(user-metrics)/analytics/page.tsx
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function DashboardAnalytics() {
- return ANALYTICS
;
-}
diff --git a/src/app/dashboard/(user-dashboard)/(user-metrics)/layout.tsx b/src/app/dashboard/(user-dashboard)/(user-metrics)/layout.tsx
deleted file mode 100644
index 41a7552da..000000000
--- a/src/app/dashboard/(user-dashboard)/(user-metrics)/layout.tsx
+++ /dev/null
@@ -1,40 +0,0 @@
-import type { PropsWithChildren } from "react";
-
-import { DateSelector } from "~/app/dashboard/(user-dashboard)/_components/layout/dateselector";
-import { Tablinks } from "~/app/dashboard/(user-dashboard)/_components/layout/tablinks";
-import { Button } from "~/components/common/common-button";
-
-const links = [
- {
- title: "Overview",
- href: "/dashboard",
- },
- {
- title: "Analytics",
- href: "/dashboard/analytics",
- },
- {
- title: "Reports",
- href: "/dashboard/reports",
- },
-];
-
-export default function UserMetricsLayout({ children }: PropsWithChildren) {
- return (
-
-
-
-
Dashboard
-
-
-
-
-
- Download
-
-
-
-
{children}
-
- );
-}
diff --git a/src/app/dashboard/(user-dashboard)/(user-metrics)/page.tsx b/src/app/dashboard/(user-dashboard)/(user-metrics)/page.tsx
deleted file mode 100644
index 7cf891d1f..000000000
--- a/src/app/dashboard/(user-dashboard)/(user-metrics)/page.tsx
+++ /dev/null
@@ -1,19 +0,0 @@
-import { OverviewChart } from "~/app/dashboard/(user-dashboard)/_components/overview-chart";
-import { OverviewRevenue } from "~/app/dashboard/(user-dashboard)/_components/overview-revenue";
-import { OverviewSales } from "~/app/dashboard/(user-dashboard)/_components/overview-sales";
-
-export default function DashboardOverview() {
- return (
-
- );
-}
diff --git a/src/app/dashboard/(user-dashboard)/(user-metrics)/reports/page.tsx b/src/app/dashboard/(user-dashboard)/(user-metrics)/reports/page.tsx
deleted file mode 100644
index b6815d6f8..000000000
--- a/src/app/dashboard/(user-dashboard)/(user-metrics)/reports/page.tsx
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function DashboardReports() {
- return REPORTS
;
-}
diff --git a/src/app/dashboard/(user-dashboard)/_components/RecentSales.tsx b/src/app/dashboard/(user-dashboard)/_components/RecentSales.tsx
deleted file mode 100644
index 2c4e35d9d..000000000
--- a/src/app/dashboard/(user-dashboard)/_components/RecentSales.tsx
+++ /dev/null
@@ -1,30 +0,0 @@
-"use client";
-
-import React, { useEffect, useState } from "react";
-
-import LoadingSpinner from "~/components/miscellaneous/loading-spinner";
-import { Card } from "~/components/ui/card";
-
-const RecentSales: React.FC = () => {
- const [loading, setLoading] = useState(true);
-
- useEffect(() => {
- const timer = setTimeout(() => {
- setLoading(false);
- }, 3000); // 3 seconds
-
- return () => clearTimeout(timer);
- }, []);
-
- return (
-
- {loading ? (
-
- ) : (
- No recent sales
- )}
-
- );
-};
-
-export default RecentSales;
diff --git a/src/app/dashboard/(user-dashboard)/_components/UserTable/page.tsx b/src/app/dashboard/(user-dashboard)/_components/UserTable/page.tsx
deleted file mode 100644
index 340797972..000000000
--- a/src/app/dashboard/(user-dashboard)/_components/UserTable/page.tsx
+++ /dev/null
@@ -1,224 +0,0 @@
-"use client";
-
-import { CaretSortIcon, DotsHorizontalIcon } from "@radix-ui/react-icons";
-import {
- ColumnDef,
- ColumnFiltersState,
- flexRender,
- getCoreRowModel,
- getFilteredRowModel,
- getPaginationRowModel,
- getSortedRowModel,
- SortingState,
- useReactTable,
- VisibilityState,
-} from "@tanstack/react-table";
-import Image from "next/image";
-import * as React from "react";
-
-import { Button } from "~/components/ui/button";
-import {
- DropdownMenu,
- DropdownMenuContent,
- DropdownMenuLabel,
- DropdownMenuTrigger,
-} from "~/components/ui/dropdown-menu";
-import {
- Table,
- TableBody,
- TableCell,
- TableHead,
- TableHeader,
- TableRow,
-} from "~/components/ui/table";
-
-interface MemberDetailsProperties {
- data: UserLoginData[];
-}
-export type UserLoginData = {
- id: string;
- ipAddress: string;
- loginTime: string;
- logoutTime: string | null;
- role: string;
- name: string;
- email: string;
- img: string;
-};
-
-const columns: ColumnDef[] = [
- {
- accessorKey: "id",
- header: "ID",
- cell: ({ row }) => {row.getValue("id")}
,
- },
- {
- accessorKey: "name",
- header: ({ column }) => (
- column.toggleSorting(column.getIsSorted() === "asc")}
- className=""
- >
- Name
-
- ),
- cell: ({ row }) => {
- const avatarUrl = row.getValue("img") as string;
- return (
-
-
-
-
{row.getValue("name")}
-
{row.getValue("email")}
-
-
- );
- },
- },
- {
- accessorKey: "email",
- enableHiding: false,
- header: ({ column }) => {
- return (
- column.toggleSorting(column.getIsSorted() === "asc")}
- >
-
-
- );
- },
- cell: ({ row }) => (
- {row.getValue("email")}
- ),
- },
- {
- accessorKey: "role",
- header: "Role",
- cell: ({ row }) => {row.getValue("role")}
,
- },
- {
- accessorKey: "ipAddress",
- header: "IP Address",
- cell: ({ row }) => {row.getValue("ipAddress")}
,
- },
- {
- accessorKey: "loginTime",
- header: "Login Time",
- cell: ({ row }) => {row.getValue("loginTime")}
,
- },
- {
- accessorKey: "logoutTime",
- header: "Logout Time",
- cell: ({ row }) => (
- {row.getValue("logoutTime") || "Still Logged In"}
- ),
- },
- {
- id: "actions",
- header: "Actions",
- cell: () => (
-
-
-
- Open menu
-
-
-
-
- Actions
-
-
- ),
- },
-];
-
-export function UserTable({ data }: MemberDetailsProperties) {
- const [sorting, setSorting] = React.useState([]);
- const [columnFilters, setColumnFilters] = React.useState(
- [],
- );
- const [columnVisibility, setColumnVisibility] =
- React.useState({});
- const [rowSelection, setRowSelection] = React.useState({});
-
- const table = useReactTable({
- data,
- columns,
- onSortingChange: setSorting,
- onColumnFiltersChange: setColumnFilters,
- getCoreRowModel: getCoreRowModel(),
- getPaginationRowModel: getPaginationRowModel(),
- getSortedRowModel: getSortedRowModel(),
- getFilteredRowModel: getFilteredRowModel(),
- onColumnVisibilityChange: setColumnVisibility,
- onRowSelectionChange: setRowSelection,
- state: {
- sorting,
- columnFilters,
- columnVisibility,
- rowSelection,
- },
- });
-
- return (
-
-
-
-
-
- {table.getHeaderGroups().map((headerGroup) => (
-
- {headerGroup.headers.map((header) => (
-
- {header.isPlaceholder
- ? undefined
- : flexRender(
- header.column.columnDef.header,
- header.getContext(),
- )}
-
- ))}
-
- ))}
-
-
- {table.getRowModel().rows?.length ? (
- table.getRowModel().rows.map((row) => (
-
- {row.getVisibleCells().map((cell) => (
-
- {flexRender(
- cell.column.columnDef.cell,
- cell.getContext(),
- )}
-
- ))}
-
- ))
- ) : (
-
-
- No results.
-
-
- )}
-
-
-
-
- );
-}
diff --git a/src/app/dashboard/(user-dashboard)/_components/county.ts b/src/app/dashboard/(user-dashboard)/_components/county.ts
deleted file mode 100644
index 88000d3aa..000000000
--- a/src/app/dashboard/(user-dashboard)/_components/county.ts
+++ /dev/null
@@ -1,176 +0,0 @@
-// country.ts
-
-export const countries = [
- {
- name: "United States",
- states: [
- "Alabama",
- "Alaska",
- "Arizona",
- "Arkansas",
- "California",
- "Colorado",
- "Connecticut",
- "Delaware",
- "Florida",
- "Georgia",
- "Hawaii",
- "Idaho",
- "Illinois",
- "Indiana",
- "Iowa",
- "Kansas",
- "Kentucky",
- "Louisiana",
- "Maine",
- "Maryland",
- "Massachusetts",
- "Michigan",
- "Minnesota",
- "Mississippi",
- "Missouri",
- "Montana",
- "Nebraska",
- "Nevada",
- "New Hampshire",
- "New Jersey",
- "New Mexico",
- "New York",
- "North Carolina",
- "North Dakota",
- "Ohio",
- "Oklahoma",
- "Oregon",
- "Pennsylvania",
- "Rhode Island",
- "South Carolina",
- "South Dakota",
- "Tennessee",
- "Texas",
- "Utah",
- "Vermont",
- "Virginia",
- "Washington",
- "West Virginia",
- "Wisconsin",
- "Wyoming",
- ],
- },
- {
- name: "Canada",
- states: [
- "Alberta",
- "British Columbia",
- "Manitoba",
- "New Brunswick",
- "Newfoundland and Labrador",
- "Northwest Territories",
- "Nova Scotia",
- "Nunavut",
- "Ontario",
- "Prince Edward Island",
- "Quebec",
- "Saskatchewan",
- "Yukon",
- ],
- },
- {
- name: "Australia",
- states: [
- "Australian Capital Territory",
- "New South Wales",
- "Northern Territory",
- "Queensland",
- "South Australia",
- "Tasmania",
- "Victoria",
- "Western Australia",
- ],
- },
- {
- name: "India",
- states: [
- "Andhra Pradesh",
- "Arunachal Pradesh",
- "Assam",
- "Bihar",
- "Chhattisgarh",
- "Goa",
- "Gujarat",
- "Haryana",
- "Himachal Pradesh",
- "Jharkhand",
- "Karnataka",
- "Kerala",
- "Madhya Pradesh",
- "Maharashtra",
- "Manipur",
- "Meghalaya",
- "Mizoram",
- "Nagaland",
- "Odisha",
- "Punjab",
- "Rajasthan",
- "Sikkim",
- "Tamil Nadu",
- "Telangana",
- "Tripura",
- "Uttar Pradesh",
- "Uttarakhand",
- "West Bengal",
- ],
- },
- {
- name: "Nigeria",
- states: [
- "Abia",
- "Adamawa",
- "Akwa Ibom",
- "Anambra",
- "Bauchi",
- "Bayelsa",
- "Benue",
- "Borno",
- "Cross River",
- "Delta",
- "Ebonyi",
- "Edo",
- "Ekiti",
- "Enugu",
- "Gombe",
- "Imo",
- "Jigawa",
- "Kaduna",
- "Kano",
- "Kogi",
- "Kwara",
- "Lagos",
- "Nasarawa",
- "Niger",
- "Ogun",
- "Ondo",
- "Osun",
- "Oyo",
- "Plateau",
- "Rivers",
- "Sokoto",
- "Taraba",
- "Yobe",
- "Zamfara",
- ],
- },
- {
- name: "South Africa",
- states: [
- "Eastern Cape",
- "Free State",
- "Gauteng",
- "KwaZulu-Natal",
- "Limpopo",
- "Mpumalanga",
- "North West",
- "Northern Cape",
- "Western Cape",
- ],
- },
-];
diff --git a/src/app/dashboard/(user-dashboard)/_components/create-organization.tsx b/src/app/dashboard/(user-dashboard)/_components/create-organization.tsx
deleted file mode 100644
index ca35e4b57..000000000
--- a/src/app/dashboard/(user-dashboard)/_components/create-organization.tsx
+++ /dev/null
@@ -1,284 +0,0 @@
-"use client";
-
-import { zodResolver } from "@hookform/resolvers/zod";
-import { useState, useTransition } from "react";
-import { useForm } from "react-hook-form";
-import * as z from "zod";
-
-import { createOrg } from "~/actions/organization";
-import { Button } from "~/components/ui/button";
-import {
- Dialog,
- DialogContent,
- DialogDescription,
- DialogFooter,
- DialogHeader,
- DialogTitle,
-} from "~/components/ui/dialog";
-import {
- Form,
- FormControl,
- FormField,
- FormItem,
- FormLabel,
- FormMessage,
-} from "~/components/ui/form";
-import { Input } from "~/components/ui/input";
-import {
- Select,
- SelectContent,
- SelectItem,
- SelectTrigger,
- SelectValue,
-} from "~/components/ui/select";
-import { useToast } from "~/components/ui/use-toast";
-import { organizationSchema } from "~/schemas";
-import { countries } from "./county";
-
-interface ModalProperties {
- isOpen: boolean;
- setIsOpen: (isOpen: boolean) => void;
-}
-
-export const CreateOrganization = ({ isOpen, setIsOpen }: ModalProperties) => {
- const [selectedCountry, setSelectedCountry] = useState();
- const [states, setStates] = useState([]);
- const [isLoading, startTransition] = useTransition();
- const { toast } = useToast();
-
- const handleCountryChange = (value: string) => {
- setSelectedCountry(value);
- const country = countries.find((c) => c.name === value);
- if (country) {
- setStates(country.states);
- }
- };
- const form = useForm>({
- resolver: zodResolver(organizationSchema),
- defaultValues: {
- email: "",
- name: "",
- description: "",
- industry: "",
- type: "",
- country: "",
- state: "",
- address: "",
- },
- });
-
- const onSubmit = async (values: z.infer) => {
- startTransition(async () => {
- await createOrg(values).then((data) => {
- if (data.status === 201) {
- setIsOpen(false);
- }
- toast({
- title:
- data.status === 201
- ? "organization created successfully"
- : "organization not created",
- description:
- data.status === 201
- ? "organization created successfully"
- : data.error,
- });
- });
- });
- };
- return (
-
-
-
- Create Organization
-
- Fill in the details to create a new organization.
-
-
-
-
-
-
- (
-
- Email
-
-
-
-
-
- )}
- />
- (
-
- Organization Name
-
-
-
-
- )}
- />
-
-
- (
-
- Description
-
-
-
-
-
- )}
- />
- (
-
- Industry
-
-
-
-
-
- )}
- />
-
-
- (
-
- Type
-
-
-
-
-
- )}
- />
- (
-
- Country
-
- {
- field.onChange(value);
- handleCountryChange(value);
- }}
- defaultValue={field.value}
- >
-
-
-
-
- {countries.map((country) => (
-
- {country.name}
-
- ))}
-
-
-
-
-
-
- )}
- />
-
-
- (
-
- State
-
-
-
-
-
-
- {states.map((state) => (
-
- {state}
-
- ))}
-
-
-
-
-
- )}
- />
- (
-
- Address
-
-
-
-
-
-
- )}
- />
-
-
- Create
-
-
-
-
-
- );
-};
diff --git a/src/app/dashboard/(user-dashboard)/_components/layout/dateselector/index.tsx b/src/app/dashboard/(user-dashboard)/_components/layout/dateselector/index.tsx
deleted file mode 100644
index 5152363ac..000000000
--- a/src/app/dashboard/(user-dashboard)/_components/layout/dateselector/index.tsx
+++ /dev/null
@@ -1,74 +0,0 @@
-"use client";
-
-import { format, subMonths } from "date-fns";
-import { CalendarDaysIcon } from "lucide-react";
-import { useState } from "react";
-import { DateRange } from "react-day-picker";
-
-import { Button } from "~/components/common/common-button";
-import { Calendar } from "~/components/ui/calendar";
-import {
- Popover,
- PopoverContent,
- PopoverTrigger,
-} from "~/components/ui/popover";
-import { cn } from "~/lib/utils";
-
-type DateSelectorProperties = {
- from?: Date;
- to?: Date;
- className?: string;
-};
-export function DateSelector({
- from = subMonths(new Date(), 1),
- to = new Date(),
- className,
-}: DateSelectorProperties) {
- const [date, setDate] = useState({
- from,
- to,
- });
-
- return (
-
-
-
-
-
-
- {date?.from ? (
- date.to ? (
- <>
- {format(date.from, "LLL dd, y")} -{" "}
- {format(date.to, "LLL dd, y")}
- >
- ) : (
- format(date.from, "LLL dd, y")
- )
- ) : (
- "Pick a date"
- )}
-
-
-
-
-
-
-
-
- );
-}
diff --git a/src/app/dashboard/(user-dashboard)/_components/layout/navbar/index.tsx b/src/app/dashboard/(user-dashboard)/_components/layout/navbar/index.tsx
deleted file mode 100644
index bf87dedb9..000000000
--- a/src/app/dashboard/(user-dashboard)/_components/layout/navbar/index.tsx
+++ /dev/null
@@ -1,85 +0,0 @@
-"use client";
-
-import { BellIcon, HelpCircle } from "lucide-react";
-
-import UnreadNotificationCard from "~/app/dashboard/(admin)/_components/unread-notification-card/UnreadNotificationCard";
-import { MobileNavlinks } from "~/app/dashboard/(user-dashboard)/_components/layout/navbar/mobile-navlinks";
-import { Navlinks } from "~/app/dashboard/(user-dashboard)/_components/layout/navbar/navlinks";
-import { Search } from "~/app/dashboard/(user-dashboard)/_components/layout/navbar/search";
-import UserCard from "~/components/card/user-card";
-import {
- Popover,
- PopoverContent,
- PopoverTrigger,
-} from "~/components/ui/popover";
-import { useOrgContext } from "~/contexts/orgContext";
-import { OrganisationSwitcher } from "./organisation-switcher";
-
-const UserNavbar = () => {
- const { notifications } = useOrgContext();
-
- const totalUnreadNotificationCount =
- notifications?.data?.total_unread_notification_count || 0;
-
- const totalNotificationCount =
- notifications?.data?.total_notification_count || 0;
- const notificationContent = notifications?.data?.notifications || [];
-
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {totalUnreadNotificationCount > 0 && (
-
- )}
-
-
-
-
-
-
-
-
-
-
- );
-};
-
-export default UserNavbar;
diff --git a/src/app/dashboard/(user-dashboard)/_components/layout/navbar/mobile-navlinks.tsx b/src/app/dashboard/(user-dashboard)/_components/layout/navbar/mobile-navlinks.tsx
deleted file mode 100644
index d068240e2..000000000
--- a/src/app/dashboard/(user-dashboard)/_components/layout/navbar/mobile-navlinks.tsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import { MenuIcon } from "lucide-react";
-
-import DashboardLogo from "~/app/dashboard/(admin)/_components/layout/logo";
-import { Navlinks } from "~/app/dashboard/(user-dashboard)/_components/layout/navbar/navlinks";
-import { Sheet, SheetContent, SheetTrigger } from "~/components/ui/sheet";
-
-export function MobileNavlinks() {
- return (
-
-
-
-
-
-
-
-
-
-
-
- );
-}
diff --git a/src/app/dashboard/(user-dashboard)/_components/layout/navbar/navlinks.tsx b/src/app/dashboard/(user-dashboard)/_components/layout/navbar/navlinks.tsx
deleted file mode 100644
index 0376147b5..000000000
--- a/src/app/dashboard/(user-dashboard)/_components/layout/navbar/navlinks.tsx
+++ /dev/null
@@ -1,62 +0,0 @@
-"use client";
-
-import Link from "next/link";
-import { usePathname } from "next/navigation";
-
-import { cn } from "~/lib/utils";
-
-const links = [
- {
- route: "Overview",
- link: "/dashboard",
- id: "dashboard",
- },
- {
- route: "Customers",
- link: "/dashboard/customers",
- id: "customers",
- },
- {
- route: "Products",
- link: "/dashboard/products",
- id: "products",
- },
- {
- route: "Users",
- link: "/dashboard/users",
- id: "Users",
- },
-];
-
-type NavlinksProperties = {
- className?: string;
- mobile?: boolean;
-};
-
-export function Navlinks({ className, mobile }: NavlinksProperties) {
- const pathname = usePathname();
- const currentPath = pathname?.split("/").at(-1) ?? "";
-
- return (
-
- {links.map((item, index) => (
-
- {item.route}
-
- ))}
-
- );
-}
diff --git a/src/app/dashboard/(user-dashboard)/_components/layout/navbar/organisation-switcher.tsx b/src/app/dashboard/(user-dashboard)/_components/layout/navbar/organisation-switcher.tsx
deleted file mode 100644
index 6f5b447e6..000000000
--- a/src/app/dashboard/(user-dashboard)/_components/layout/navbar/organisation-switcher.tsx
+++ /dev/null
@@ -1,82 +0,0 @@
-"use client";
-
-import { useSession } from "next-auth/react";
-import { useState } from "react";
-
-import { Avatar, AvatarFallback, AvatarImage } from "~/components/ui/avatar";
-import { Button } from "~/components/ui/button";
-import {
- Select,
- SelectContent,
- SelectItem,
- SelectTrigger,
- SelectValue,
-} from "~/components/ui/select";
-import { Skeleton } from "~/components/ui/skeleton";
-import { useOrgContext } from "~/contexts/orgContext";
-import { CreateOrganization } from "../../create-organization";
-
-export const OrganisationSwitcher = () => {
- const { data: session } = useSession();
- const { isLoading, switchOrganization } = useOrgContext();
-
- // Ensure that switchOrganization is properly defined and used
- const handleOrgChange = (currentOrgId: string) => {
- switchOrganization(currentOrgId);
- };
-
- // Ensure currentOrg is correctly derived
- const currentOrg = session?.userOrg?.find(
- (org) => org.organisation_id === session.currentOrgId,
- );
-
- // State to manage the modal visibility
- const [isOpen, setIsOpen] = useState(false);
-
- return (
- <>
-
- handleOrgChange(value)}
- >
-
- {isLoading ? (
-
- ) : (
-
-
- {currentOrg?.name || "No Organization Selected"}
-
-
- )}
-
-
- {session?.userOrg?.map((org) => (
-
-
-
-
-
- {org.name?.charAt(0)}
-
-
- {org.name}
-
-
- ))}
- setIsOpen(!isOpen)}
- >
- Create Organization
-
-
-
- >
- );
-};
diff --git a/src/app/dashboard/(user-dashboard)/_components/layout/navbar/search/index.tsx b/src/app/dashboard/(user-dashboard)/_components/layout/navbar/search/index.tsx
deleted file mode 100644
index 1a607f6d8..000000000
--- a/src/app/dashboard/(user-dashboard)/_components/layout/navbar/search/index.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-import { SearchIcon } from "lucide-react";
-
-export function Search() {
- return (
- <>
-
-
-
-
-
- >
- );
-}
diff --git a/src/app/dashboard/(user-dashboard)/_components/layout/tablinks/index.tsx b/src/app/dashboard/(user-dashboard)/_components/layout/tablinks/index.tsx
deleted file mode 100644
index 6caf7bfd5..000000000
--- a/src/app/dashboard/(user-dashboard)/_components/layout/tablinks/index.tsx
+++ /dev/null
@@ -1,34 +0,0 @@
-"use client";
-
-import type { Route } from "next";
-import Link from "next/link";
-import { usePathname } from "next/navigation";
-
-import { cn } from "~/lib/utils";
-
-type TablinksProperties = {
- links: {
- title: string;
- href: Route;
- }[];
-};
-
-export function Tablinks({ links }: TablinksProperties) {
- const pathname = usePathname();
- return (
-
- {links.map(({ title, href }) => (
-
- {title}
-
- ))}
-
- );
-}
diff --git a/src/app/dashboard/(user-dashboard)/_components/overview-chart/index.tsx b/src/app/dashboard/(user-dashboard)/_components/overview-chart/index.tsx
deleted file mode 100644
index 4b35a5510..000000000
--- a/src/app/dashboard/(user-dashboard)/_components/overview-chart/index.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-"use client";
-
-import { Chart } from "~/components/userDashboard/Chart";
-import { chartConfig, chartData } from "~/components/userDashboard/chartData";
-import { useOrgContext } from "~/contexts/orgContext";
-
-type OverviewChartProperties = {
- className?: string;
-};
-export function OverviewChart({ className }: OverviewChartProperties) {
- const { monthlyData } = useOrgContext();
- return (
-
- );
-}
diff --git a/src/app/dashboard/(user-dashboard)/_components/overview-revenue/index.tsx b/src/app/dashboard/(user-dashboard)/_components/overview-revenue/index.tsx
deleted file mode 100644
index 1e3335ebf..000000000
--- a/src/app/dashboard/(user-dashboard)/_components/overview-revenue/index.tsx
+++ /dev/null
@@ -1,62 +0,0 @@
-"use client";
-
-import { revenueData } from "~/app/dashboard/(user-dashboard)/_components/overview-revenue/revenueData";
-import CardComponent from "~/components/common/DashboardCard/CardComponent";
-import { useOrgContext } from "~/contexts/orgContext";
-
-export function OverviewRevenue() {
- const { isLoading, dashboardData } = useOrgContext();
-
- // If dashboardData is undefined or still loading, render a loading state
- if (isLoading || !dashboardData) {
- return (
-
- {/* Placeholder card components or a loading spinner */}
- {revenueData.map((data, index) => (
-
- ))}
-
- );
- }
-
- return (
-
-
-
-
-
-
- );
-}
diff --git a/src/app/dashboard/(user-dashboard)/_components/overview-revenue/revenueData.ts b/src/app/dashboard/(user-dashboard)/_components/overview-revenue/revenueData.ts
deleted file mode 100644
index e9ea81128..000000000
--- a/src/app/dashboard/(user-dashboard)/_components/overview-revenue/revenueData.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-import type { LucideIconName } from "~/components/common/lucide-icon";
-
-type CardData = {
- title: string;
- value: string;
- description: string;
- icon: LucideIconName;
-};
-
-export const revenueData: CardData[] = [
- {
- title: "Total Revenue",
- value: "$45,000.00",
- description: "+0% from last month",
- icon: "dollar-sign",
- },
- {
- title: "Subscriptions",
- value: "+2,350",
- description: "+0% from last month",
- icon: "users",
- },
- {
- title: "Sales",
- value: "15,000",
- description: "+0% from last month",
- icon: "credit-card",
- },
- {
- title: "Active Now",
- value: "574",
- description: "+0 since last hour",
- icon: "trending-up",
- },
-];
diff --git a/src/app/dashboard/(user-dashboard)/_components/overview-sales/index.tsx b/src/app/dashboard/(user-dashboard)/_components/overview-sales/index.tsx
deleted file mode 100644
index 688365366..000000000
--- a/src/app/dashboard/(user-dashboard)/_components/overview-sales/index.tsx
+++ /dev/null
@@ -1,17 +0,0 @@
-// import RecentSales from "~/app/dashboard/(user-dashboard)/_components/RecentSales";
-// import {
-// data,
-// gradients,
-// } from "~/app/dashboard/(user-dashboard)/_components/salesData";
-
-// export function OverviewSales() {
-// return (
-//
-// );
-// }
-
-import RecentSales from "~/app/dashboard/(user-dashboard)/_components/RecentSales";
-
-export function OverviewSales() {
- return ;
-}
diff --git a/src/app/dashboard/(user-dashboard)/_components/salesData.ts b/src/app/dashboard/(user-dashboard)/_components/salesData.ts
deleted file mode 100644
index c8143118a..000000000
--- a/src/app/dashboard/(user-dashboard)/_components/salesData.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-const data = [
- {
- name: "Jackson Lee",
- amount: "2999",
- email: "jackson.lee@gmail.com",
- },
- {
- name: "Olivia Martin",
- amount: "7999",
- email: "olivia.martin@gmail.com",
- },
- {
- name: "Joseph Chernysuck",
- amount: "5999",
- email: "olivia.martin@gmail.com",
- },
- {
- name: "Paul Halland",
- amount: "12999",
- email: "olivia.martin@gmail.com",
- },
- {
- name: "Eden Hazard",
- amount: "3999",
- email: "jackson.lee@gmail.com",
- },
- {
- name: "Ronaldo Messi",
- amount: "4999",
- email: "jackson.lee@gmail.com",
- },
-];
-
-const gradients = [
- "linear-gradient(180deg, #F6C790 0%, #E77F1E 100%)",
- "linear-gradient(180deg, #F81404 0%, #0F172A 100%)",
- "linear-gradient(180deg, rgba(4, 190, 248, 0.20) 0%, #0AB025 100%)",
- "linear-gradient(180deg, #FFF 0%, #7F838D 20.86%, #0F172A 100%)",
- "linear-gradient(180deg, #1E1D1C 0%, #3A1EE7 100%)",
- "linear-gradient(180deg, #EF9B38 0%, #7EA7D9 100%)",
-];
-
-export { data, gradients };
diff --git a/src/app/dashboard/(user-dashboard)/customers/page.tsx b/src/app/dashboard/(user-dashboard)/customers/page.tsx
deleted file mode 100644
index 26bf74c39..000000000
--- a/src/app/dashboard/(user-dashboard)/customers/page.tsx
+++ /dev/null
@@ -1,5 +0,0 @@
-const CustomersPage = () => {
- return CustomersPage
;
-};
-
-export default CustomersPage;
diff --git a/src/app/dashboard/(user-dashboard)/layout.tsx b/src/app/dashboard/(user-dashboard)/layout.tsx
deleted file mode 100644
index b03d8ab91..000000000
--- a/src/app/dashboard/(user-dashboard)/layout.tsx
+++ /dev/null
@@ -1,28 +0,0 @@
-import { Suspense } from "react";
-
-import Providers from "~/components/providers";
-import SettingsSidebar from "../(admin)/admin/(settings)/settings/_components/layout/sidebar";
-import UserNavbar from "./_components/layout/navbar";
-
-export default function AdminLayout({
- children,
-}: {
- children: React.ReactNode;
-}) {
- return (
-
- );
-}
diff --git a/src/app/dashboard/(user-dashboard)/products/[productId]/form-images/project-logo.tsx b/src/app/dashboard/(user-dashboard)/products/[productId]/form-images/project-logo.tsx
deleted file mode 100644
index ce822e4d4..000000000
--- a/src/app/dashboard/(user-dashboard)/products/[productId]/form-images/project-logo.tsx
+++ /dev/null
@@ -1,129 +0,0 @@
-import { X } from "lucide-react";
-import React, { useState } from "react";
-import { UseFormReturn } from "react-hook-form";
-
-import BlurImage from "~/components/miscellaneous/blur-image";
-import { Button } from "~/components/ui/button";
-import { cn } from "~/lib/utils";
-import { EditProduct } from "../../_components/schema/schema";
-
-type Properties = {
- form: UseFormReturn;
- name: string;
-};
-const handleImageChange = (event: React.ChangeEvent) => {
- event.preventDefault();
-};
-const ProjectLogo = ({ form, name }: Properties) => {
- const [isDragging, setIsDragging] = useState(false);
-
- const productImage = form.getValues("media");
-
- const handleDrop = (event: React.DragEvent) => {
- event.preventDefault();
- event.stopPropagation();
-
- const target = event.dataTransfer.files[0] as File;
-
- if (target.type === "image/gif") {
- return name;
- }
- const event_data = {
- target: {
- files: event.dataTransfer.files,
- },
- };
- handleImageChange(
- event_data as unknown as React.ChangeEvent,
- );
- setIsDragging(false);
- };
-
- return (
-
-
-
-
- Uploading... {" "}
- 10%
-
-
-
-
- {isDragging && (
-
- )}
-
- {productImage.url && typeof productImage.url === "string" ? (
-
- ) : (
-
{
- event.preventDefault();
- event.stopPropagation();
- setIsDragging(true);
- }}
- onDragLeave={(event) => {
- event.preventDefault();
- event.stopPropagation();
- setIsDragging(false);
- }}
- className="grid h-full w-full place-items-center"
- >
-
-
- Upload New
-
- Add Image or drag it here
-
-
-
- )}
-
- );
-};
-
-export default ProjectLogo;
diff --git a/src/app/dashboard/(user-dashboard)/products/[productId]/page.tsx b/src/app/dashboard/(user-dashboard)/products/[productId]/page.tsx
deleted file mode 100644
index 23c6d31c0..000000000
--- a/src/app/dashboard/(user-dashboard)/products/[productId]/page.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-const page = () => {
- return page
;
-};
-
-export default page;
-
-// import { notFound } from "next/navigation";
-
-// import ProductDetailsContent from "./product-details-content";
-
-// const ProductDetailsPage = async ({
-// params,
-// }: {
-// params: { productId: string };
-// }) => {
-// const id = params.productId;
-// if (!id) return notFound();
-
-// return ;
-// };
-
-// export default ProductDetailsPage;
diff --git a/src/app/dashboard/(user-dashboard)/products/[productId]/product-details-component.tsx b/src/app/dashboard/(user-dashboard)/products/[productId]/product-details-component.tsx
deleted file mode 100644
index fae25ca07..000000000
--- a/src/app/dashboard/(user-dashboard)/products/[productId]/product-details-component.tsx
+++ /dev/null
@@ -1,452 +0,0 @@
-"use client";
-
-import { zodResolver } from "@hookform/resolvers/zod";
-import { AnimatePresence, motion } from "framer-motion";
-import { ArrowLeft, Loader, Plus } from "lucide-react";
-import { useRouter } from "next-nprogress-bar";
-import Link from "next/link";
-import { useTransition } from "react";
-import { useForm } from "react-hook-form";
-import { z } from "zod";
-
-import WordCounter from "~/components/miscellaneous/WordCounter";
-import { Button } from "~/components/ui/button";
-import {
- Form,
- FormControl,
- FormField,
- FormItem,
- FormLabel,
- FormMessage,
-} from "~/components/ui/form";
-import { Input } from "~/components/ui/input";
-import {
- Select,
- SelectContent,
- SelectGroup,
- SelectItem,
- SelectTrigger,
- SelectValue,
-} from "~/components/ui/select";
-import { Textarea } from "~/components/ui/textarea";
-import { cn, generateId, simulateDelay } from "~/lib/utils";
-import { ProductTableProperties } from "~/types/admin-product.types";
-import { EditProductSchema, MAX_CHAR } from "../_components/schema/schema";
-import { STOCKS_SELECT } from "../data/categories.mock";
-import { shouldDisableAddStocksButton } from "../data/stocks.mock";
-import ProjectLogo from "./form-images/project-logo";
-
-const ProductDetailsComponent = ({
- product,
-}: {
- product: ProductTableProperties;
-}) => {
- const [isLoading, startTransition] = useTransition();
- const router = useRouter();
-
- const new_product_form = useForm>({
- defaultValues: {
- product_name: product.name || "",
- description: product.description || "",
- price: "",
- category: "",
- quantity: "",
- stocks: [
- {
- id: "P0001",
- size: "Small",
- stock: "0",
- price: "",
- },
- {
- id: "P0002",
- size: "Standard",
- price: String(product.price) || "",
- },
- {
- id: "P0003",
- size: "Large",
- stock: "0",
- price: "",
- },
- ],
- },
- resolver: zodResolver(EditProductSchema),
- });
- const FORM_STOCKS = new_product_form.getValues("stocks");
- const handleAddNewStock = () => {
- const previousStocks = FORM_STOCKS;
- new_product_form.setValue("stocks", [
- ...previousStocks,
- {
- id: `S${generateId(5)}`,
- size: "",
- stock: "",
- price: "",
- },
- ]);
- };
-
- const hasProjectLogo = new_product_form.getValues("media.url");
- new_product_form.watch("stocks");
- // DISABLE
- const disableAddStockButton = shouldDisableAddStocksButton({
- stocks: FORM_STOCKS,
- });
- const onSubmit = async () => {
- startTransition(async () => {
- await simulateDelay(3);
-
- new_product_form.reset();
- });
- };
-
- return (
-
-
-
-
-
-
-
-
- {product.name}
-
-
-
-
- {" "}
- {product.status === "in_stock" && "In Stock"}
- {product.status === "low_on_stock" && "Low on Stock"}
- {product.status === "out_of_stock" && "Out of Stock"}
-
-
-
-
- router.push("/dashboard/products")}
- type="button"
- variant="ghost"
- size="default"
- className="h-7 rounded-sm border bg-transparent px-1.5 py-1 text-[10px] hover:bg-orange-600 focus:outline-none focus:ring-2 focus:ring-orange-500 focus:ring-offset-2 min-[400px]:!h-8 min-[400px]:rounded-md min-[400px]:px-2 min-[400px]:py-2 min-[400px]:text-xs sm:h-10 sm:px-4 sm:py-3 sm:text-sm"
- >
- Discard
-
-
- {isLoading ? (
-
- Saving... {" "}
-
-
- ) : (
- Save changes
- )}
-
-
-
-
- {" "}
-
-
-
-
- Product Details
-
-
- Make quick changes to your product.
-
-
-
(
-
-
- Title*
-
-
-
-
-
-
- )}
- />
- (
-
-
- Description
-
-
-
-
MAX_CHAR
- ? "focus-visible:outline-red-500 focus-visible:ring-red-500"
- : "",
- )}
- {...field}
- />
-
-
- Maximum of {MAX_CHAR} characters
-
-
-
-
-
-
-
- )}
- />
-
-
-
-
- Stock
-
-
- Add and remove products
-
-
-
-
- Size
- Stock
- Price
-
-
-
- {FORM_STOCKS.map((stock, index) => (
-
- (
-
-
-
-
-
-
-
-
- )}
- />
- (
-
-
-
-
-
-
-
-
- )}
- />
- (
-
-
-
- )}
- />
-
- {/* {STOCKS.length > 1 && (
- handleRemoveStock(stock.id)}
- className="hidden place-items-center rounded-lg bg-[#585858] px-4 py-2 text-xl font-medium text-white transition-all duration-200 active:scale-90 sm:text-3xl md:grid"
- >
-
-
- )} */}
-
- ))}
-
-
-
- Add a variant
-
-
-
-
-
-
-
- Media
-
-
- Upload media for your product
-
-
-
-
- {hasProjectLogo.length === 0 &&
- new_product_form.formState.errors.media && (
-
- {new_product_form.formState.errors.media.message}
-
- )}
-
-
-
-
-
-
- Stock
-
-
-
(
-
-
- Availability
-
-
-
-
-
-
-
-
- {STOCKS_SELECT.map((stock) => (
-
- {stock.label}
-
- ))}
-
-
-
-
-
-
- )}
- />
-
-
-
-
- Archive
-
-
Archive a product
-
-
- Archive {product?.name}
-
-
-
-
-
-
- );
-};
-
-export default ProductDetailsComponent;
diff --git a/src/app/dashboard/(user-dashboard)/products/[productId]/product-details-content.tsx b/src/app/dashboard/(user-dashboard)/products/[productId]/product-details-content.tsx
deleted file mode 100644
index 2c6556361..000000000
--- a/src/app/dashboard/(user-dashboard)/products/[productId]/product-details-content.tsx
+++ /dev/null
@@ -1,36 +0,0 @@
-"use client";
-
-import { ChevronRight, Loader } from "lucide-react";
-
-import { useProducts } from "~/hooks/admin-product/use-products.persistence";
-import ProductDetailsComponent from "./product-details-component";
-
-const ProductDetailsContent = ({ productId }: { productId: string }) => {
- const { products } = useProducts();
- const product = products?.find((p) => p.product_id === productId);
-
- if (!product)
- return (
-
-
- Loading... {" "}
- .
-
-
- );
-
- return (
-
-
-
- Products
-
-
- Product Details
-
-
-
- );
-};
-
-export default ProductDetailsContent;
diff --git a/src/app/dashboard/(user-dashboard)/products/_components/form-images/project-logo.tsx b/src/app/dashboard/(user-dashboard)/products/_components/form-images/project-logo.tsx
deleted file mode 100644
index 83fc69e18..000000000
--- a/src/app/dashboard/(user-dashboard)/products/_components/form-images/project-logo.tsx
+++ /dev/null
@@ -1,114 +0,0 @@
-// type Properties = {
-// form: UseFormReturn;
-// name: string;
-// };
-// const handleImageChange = (event: React.ChangeEvent) => {
-// event.preventDefault();
-// };
-const ProjectLogo = () => {
- // const [isDragging, setIsDragging] = useState(false);
-
- // const handleDrop = (event: React.DragEvent) => {
- // event.preventDefault();
- // event.stopPropagation();
-
- // const target = event.dataTransfer.files[0] as File;
-
- // if (target.type === "image/gif") {
- // return name;
- // }
- // const event_data = {
- // target: {
- // files: event.dataTransfer.files,
- // },
- // };
- // handleImageChange(
- // event_data as unknown as React.ChangeEvent,
- // );
- // setIsDragging(false);
- // };
-
- return (
-
-
-
-
- Uploading... {" "}
- 10%
-
-
-
- {/*
- {isDragging && (
-
- )} */}
-
- {/* {projectLogo.url && typeof projectLogo.url === "string" ? (
-
- ) : (
-
{
- event.preventDefault();
- event.stopPropagation();
- setIsDragging(true);
- }}
- onDragLeave={(event) => {
- event.preventDefault();
- event.stopPropagation();
- setIsDragging(false);
- }}
- className="grid h-full w-full place-items-center"
- >
-
-
- Upload New
-
- Add Image or drag it here
-
-
-
- )} */}
-
- );
-};
-
-export default ProjectLogo;
diff --git a/src/app/dashboard/(user-dashboard)/products/_components/new-product-modal.tsx b/src/app/dashboard/(user-dashboard)/products/_components/new-product-modal.tsx
deleted file mode 100644
index 04064b833..000000000
--- a/src/app/dashboard/(user-dashboard)/products/_components/new-product-modal.tsx
+++ /dev/null
@@ -1,394 +0,0 @@
-// components/admin/NewProductModal.tsx
-
-import { zodResolver } from "@hookform/resolvers/zod";
-import { AnimatePresence, motion } from "framer-motion";
-import { Loader, X } from "lucide-react";
-import { useSession } from "next-auth/react";
-import Image from "next/image";
-import { useState, useTransition } from "react";
-import { useForm } from "react-hook-form";
-import { z } from "zod";
-
-import { createProduct } from "~/actions/product";
-import WordCounter from "~/components/miscellaneous/WordCounter";
-import { Button } from "~/components/ui/button";
-import {
- Form,
- FormControl,
- FormField,
- FormItem,
- FormLabel,
- FormMessage,
-} from "~/components/ui/form";
-import { Input } from "~/components/ui/input";
-import { Label } from "~/components/ui/label";
-import {
- Select,
- SelectContent,
- SelectGroup,
- SelectItem,
- SelectLabel,
- SelectTrigger,
- SelectValue,
-} from "~/components/ui/select";
-import { Textarea } from "~/components/ui/textarea";
-import { useToast } from "~/components/ui/use-toast";
-import { useOrgContext } from "~/contexts/orgContext";
-import { cn } from "~/lib/utils";
-import { productSchema } from "~/schemas";
-import { CloudinaryAsset } from "~/types";
-import { CATEGORIES } from "../data/categories.mock";
-import { MAX_CHAR } from "./schema/schema";
-
-const NewProductModal = () => {
- const { setIsNewModal, isNewModal } = useOrgContext();
- const [image, setImage] = useState();
- const [isLoading, startTransition] = useTransition();
- const { data: session } = useSession();
-
- const variantProperties = {
- left: "50%",
- top: "50%",
- translateX: "-50%",
- translateY: "-50%",
- };
-
- const { toast } = useToast();
-
- const newProductForm = useForm>({
- resolver: zodResolver(productSchema),
- defaultValues: {
- name: "",
- description: "",
- size: "Small",
- image_url: "",
- quantity: "0",
- price: "0",
- category: "",
- },
- });
-
- const onSubmit = async (values: z.infer) => {
- startTransition(async () => {
- const formData = new FormData();
- formData.append("file", image!);
- formData.append("upload_preset", "starterhouse");
- formData.append("api_key", "673723355315667");
-
- await fetch(`https://api.cloudinary.com/v1_1/dnik53vns/image/upload`, {
- method: "POST",
- body: formData,
- }).then(async (response) => {
- const data: CloudinaryAsset = await response.json();
- values.image_url = data.url;
- });
-
- if (session?.currentOrgId === undefined) return;
- await createProduct(values, session?.currentOrgId).then((data) => {
- if (data.status === 201) {
- newProductForm.reset();
- setIsNewModal(false);
- }
- toast({
- title: data.status === 201 ? "Success" : "Error",
- description:
- data.status === 201 ? "Product created successfully" : data.error,
- });
- });
- });
- };
-
- const SIZE_CATEGORIES = new Set(["clothes", "shoes", "hats"]);
- const [selectedCategory, setSelectedCategory] = useState("");
-
- const handleCategoryChange = (category: string) => {
- setSelectedCategory(category);
- newProductForm.setValue("category", category);
- if (!SIZE_CATEGORIES.has(category)) {
- newProductForm.setValue("size", "Small");
- }
- };
-
- return (
- <>
- setIsNewModal(false)}
- className={cn(
- "fixed left-0 top-0 z-[99] min-h-screen w-full overflow-hidden bg-[rgba(10,10,10,0.40)] transition-all duration-300",
- isNewModal
- ? "pointer-events-auto opacity-100"
- : "pointer-events-none opacity-0",
- )}
- />
-
-
- {isNewModal && (
-
-
-
-
Add a Product
-
setIsNewModal(false)}
- >
-
-
-
-
-
-
-
-
Media
- {image ? (
-
- ) : (
-
-
- setImage(
- entries.target.files
- ? entries.target.files[0]
- : undefined,
- )
- }
- accept="image/jpeg,image/png,image/svg+xml"
- />
- Add Image
-
- )}
-
-
-
- {
- setIsNewModal(false);
- newProductForm.reset();
- }}
- >
- Cancel
-
-
- {isLoading ? (
-
- ) : (
- "Add Product"
- )}
-
-
-
-
-
-
- )}
-
- >
- );
-};
-
-export default NewProductModal;
diff --git a/src/app/dashboard/(user-dashboard)/products/_components/product-body-shadcn.tsx b/src/app/dashboard/(user-dashboard)/products/_components/product-body-shadcn.tsx
deleted file mode 100644
index ceb027a34..000000000
--- a/src/app/dashboard/(user-dashboard)/products/_components/product-body-shadcn.tsx
+++ /dev/null
@@ -1,222 +0,0 @@
-/* eslint-disable react-hooks/exhaustive-deps */
-import { AnimatePresence, motion } from "framer-motion";
-import { Edit2, MoreVertical, Trash } from "lucide-react";
-import { useRouter } from "next-nprogress-bar";
-import { useEffect, useRef } from "react";
-
-import { Button } from "~/components/ui/button";
-import { Input } from "~/components/ui/input";
-import { TableCell, TableRow } from "~/components/ui/table";
-import { useProductModal } from "~/hooks/admin-product/use-product.modal";
-import { useProducts } from "~/hooks/admin-product/use-products.persistence";
-import { cn, formatPrice } from "~/lib/utils";
-import { ProductTableProperties } from "~/types/admin-product.types";
-
-type Properties = {
- subset: ProductTableProperties[];
- filteredProducts: ProductTableProperties[];
- searchTerm: string;
-};
-
-const ProductBodyShadcn = ({
- subset,
- filteredProducts,
- searchTerm,
-}: Properties) => {
- const { products } = useProducts();
- const {
- updateOpen,
- updateProductId,
- product_id,
- isActionModal,
- setIsActionModal,
- setIsDelete,
- } = useProductModal();
- const modalReference = useRef
(null);
- const router = useRouter();
-
- useEffect(() => {
- if (!isActionModal || !modalReference.current) return;
- modalReference.current.scrollIntoView({ behavior: "smooth" });
- // handle click outside modal
- const handleOutsideClick = (event: MouseEvent) => {
- if (
- modalReference.current &&
- !modalReference.current.contains(event.target as Node)
- ) {
- setIsActionModal(false);
- }
- };
- document.addEventListener("click", handleOutsideClick);
- return () => {
- document.removeEventListener("click", handleOutsideClick);
- };
- }, [isActionModal]);
- if (!products) return;
- const handleOpenDetail = (product_id: string) => {
- setIsActionModal(false);
- updateProductId(product_id);
- updateOpen(true);
- };
- const handleDeleteAction = (id: string) => {
- setIsActionModal(false);
- updateProductId(id);
- setIsDelete(true);
- };
- const handleEditAction = (id: string) => {
- setIsActionModal(false);
- router.push(`/dashboard/products/${id}`);
- };
-
- return (
- filteredProducts.length > 0 &&
- subset.length > 0 &&
- subset.map((product, index) => (
-
-
-
-
-
{" "}
- handleOpenDetail(product.product_id)}
- className="hide_scrollbar ml-0.5 w-[110px] whitespace-break-spaces text-[10px] text-neutral-dark-2 min-[376px]:text-xs sm:ml-1 md:w-[200px] md:text-base lg:w-[200px]"
- >
- {searchTerm.length > 1 ? (
- 2 ? "w-[50px] overflow-x-auto" : "",
- )}
- dangerouslySetInnerHTML={{
- __html: product.name!.replaceAll(
- new RegExp(`(${searchTerm})`, "gi"),
- (match, group) =>
- `${match} `,
- ),
- }}
- />
- ) : (
- {product.name}
- )}
-
-
- handleOpenDetail(product.product_id)}
- className="text-sm uppercase md:text-base"
- >
- {product.product_id}
-
- handleOpenDetail(product.product_id)}
- className="text-[10px] min-[376px]:text-xs md:text-base"
- >
- {product.category}
-
- handleOpenDetail(product.product_id)}
- className="text-[10px] min-[376px]:text-xs md:text-base"
- >
- {formatPrice(product.price)}
-
- handleOpenDetail(product.product_id)}
- >
-
-
- {product.status === "in_stock" && "In Stock"}
- {product.status === "low_on_stock" && "Low on Stock"}
- {product.status === "out_of_stock" && "Out of Stock"}
-
-
-
- {
- updateProductId(product.product_id);
- setIsActionModal(!isActionModal);
- }}
- variant={"ghost"}
- size={"icon"}
- >
-
-
-
- {isActionModal && product_id === product.product_id && (
-
-
- Actions
-
-
- handleEditAction(product.product_id)}
- size={"sm"}
- className={cn(
- "flex h-8 cursor-pointer items-center justify-start gap-x-2 px-2 py-1 text-xs min-[500px]:text-sm",
- )}
- >
-
-
- Edit
-
- handleDeleteAction(product.product_id)}
- variant="ghost"
- size={"sm"}
- className={cn(
- "flex h-8 cursor-pointer items-center justify-start gap-x-2 px-2 py-1 text-xs text-red-500 min-[500px]:text-sm",
- )}
- >
-
-
- Delete
-
-
-
- )}
-
-
-
- ))
- );
-};
-
-export default ProductBodyShadcn;
diff --git a/src/app/dashboard/(user-dashboard)/products/_components/product-content-view.tsx b/src/app/dashboard/(user-dashboard)/products/_components/product-content-view.tsx
deleted file mode 100644
index ef7552c6d..000000000
--- a/src/app/dashboard/(user-dashboard)/products/_components/product-content-view.tsx
+++ /dev/null
@@ -1,151 +0,0 @@
-import { AnimatePresence } from "framer-motion";
-import { useRouter } from "next-nprogress-bar";
-
-import {
- Table,
- TableBody,
- TableHead,
- TableHeader,
- TableRow,
-} from "~/components/ui/table";
-import { useOrgContext } from "~/contexts/orgContext";
-import { cn } from "~/lib/utils";
-import { Product } from "~/types";
-import { ProductGridCard } from "./product-grid-card";
-import { ProductListRow } from "./product-list-row";
-import { ProductNotFound } from "./product-not-found";
-
-type Properties = {
- subset: Product[];
- filteredProducts: Product[];
- searchTerm: string;
- view: "grid" | "list";
-};
-
-export const ProductContentView = ({
- subset,
- filteredProducts,
- searchTerm,
- view = "grid",
-}: Properties) => {
- const {
- products,
- isActionModal,
- setIsActionModal,
- updateOpen,
- setIsDelete,
-
- setSelectedProduct,
- } = useOrgContext();
- const router = useRouter();
-
- if (!products) return;
-
- const handleOpenActionModal = (product_id: string) => {
- setSelectedProduct(product_id);
- setIsActionModal(!isActionModal);
- };
-
- const handleOpenDetail = (product_id: string) => {
- setIsActionModal(false);
- setSelectedProduct(product_id);
- updateOpen(true);
- };
- const handleDeleteAction = (id: string) => {
- setIsActionModal(false);
- setSelectedProduct(id);
- setIsDelete(true);
- };
- const handleEditAction = (id: string) => {
- setIsActionModal(false);
- router.push(`/dashboard/products/${id}`);
- };
-
- return (
-
- {view === "list" && (
-
-
-
-
-
- Product Name
-
-
- Product ID
-
-
- Category
-
-
- Price
-
-
- Status
-
-
- Actions
-
-
-
-
- {filteredProducts.length > 0 &&
- subset.length > 0 &&
- subset.map((product, index) => (
- setIsActionModal(false)}
- onOpenDetails={() => handleOpenDetail(product.id)}
- onEdit={() => handleEditAction(product.id)}
- onDelete={() => handleDeleteAction(product.id)}
- onOpenActionModal={() => handleOpenActionModal(product.id)}
- {...product}
- />
- ))}
-
- {filteredProducts.length === 0 && searchTerm.length > 1 && (
-
- )}
-
-
- )}
- {view === "grid" && (
-
-
- {filteredProducts.length > 0 &&
- subset.length > 0 &&
- subset.map((product) => (
-
- ))}
-
- {filteredProducts.length === 0 && searchTerm.length > 1 && (
-
- )}
-
- )}
-
- );
-};
diff --git a/src/app/dashboard/(user-dashboard)/products/_components/product-content.tsx b/src/app/dashboard/(user-dashboard)/products/_components/product-content.tsx
deleted file mode 100644
index 2f236ca90..000000000
--- a/src/app/dashboard/(user-dashboard)/products/_components/product-content.tsx
+++ /dev/null
@@ -1,175 +0,0 @@
-import { AnimatePresence, motion } from "framer-motion";
-import { ChevronLeft, ChevronRight } from "lucide-react";
-import dynamic from "next/dynamic";
-import { useEffect, useMemo, useState } from "react";
-
-import LoadingSpinner from "~/components/miscellaneous/loading-spinner";
-import ProductCardSkeleton from "~/components/skeleton/product.skeleton";
-import { useOrgContext } from "~/contexts/orgContext";
-import { cn } from "~/lib/utils";
-import { Product } from "~/types";
-import { ProductContentView } from "./product-content-view";
-
-const Pagination = dynamic(() => import("react-paginate"), {
- ssr: false,
- loading: () => ,
-});
-
-const ProductContent = ({
- view,
- searchTerm,
-}: {
- view: "list" | "grid";
- searchTerm: string;
-}) => {
- const [totalPages, setTotalPages] = useState(0);
- const [currentPage, setCurrentPage] = useState(0);
- const [perPage, setPerPage] = useState("10");
- const { products, isOpen, active_filter } = useOrgContext();
-
- const [subset, setSubset] = useState([]);
-
- const startIndex = currentPage * Number(perPage);
- const endIndex = startIndex + Number(perPage);
-
- const handlePageChange = ({ selected }: { selected: number }) => {
- setCurrentPage(selected);
- window?.scrollTo({ top: 0, behavior: "smooth" });
- };
-
- const sortedProducts = useMemo(() => {
- if (!products) return [];
- if (products.length === 0) return [];
- return products.sort(
- (a, b) =>
- new Date(b.created_at).getTime() - new Date(a.created_at).getTime(),
- );
- }, [products]);
- // filter by active filter
- const filteredProductsByActiveFilter = useMemo(() => {
- if (!sortedProducts) return [];
- if (sortedProducts.length === 0) return [];
- return sortedProducts.filter((product) => {
- if (active_filter === "all") return product;
- return product.stock_status === active_filter;
- });
- }, [active_filter, sortedProducts]);
-
- // filter by search term
- const filteredProducts = useMemo(() => {
- if (!filteredProductsByActiveFilter) return [];
- if (filteredProductsByActiveFilter.length === 0) return [];
- return filteredProductsByActiveFilter.filter((product) => {
- if (
- !(searchTerm.length > 1) ||
- filteredProductsByActiveFilter.length === 0
- ) {
- return product;
- }
- return product.name.toLowerCase().includes(searchTerm.toLowerCase());
- });
- }, [filteredProductsByActiveFilter, searchTerm]);
-
- useEffect(() => {
- if (filteredProducts.length === 0) return;
- setTotalPages(Math.ceil(filteredProducts.length / Number(perPage)));
- setSubset(filteredProducts.slice(startIndex, endIndex));
- }, [filteredProducts, perPage, startIndex, endIndex]);
-
- useEffect(() => {
- const perPage = localStorage.getItem("perPage");
- if (perPage && typeof perPage === "string") {
- setPerPage(perPage);
- return;
- }
- }, []);
- useEffect(() => {
- document.title = `Products - ${subset.length} Product${
- subset.length > 1 ? "s" : ""
- }`;
- }, [subset.length]);
-
- return (
-
-
-
- {products && filteredProducts.length > 0 && (
-
-
-
- Showing{" "}
-
- {startIndex + 1}
- {" "}
- to{" "}
-
- {endIndex > filteredProducts.length
- ? filteredProducts.length
- : endIndex}
- {" "}
- of{" "}
-
- {filteredProducts.length}
- {" "}
- products
-
-
- {totalPages > 1 && (
-
- Next
-
-
- }
- previousLabel={
-
-
- Previous
-
- }
- previousAriaLabel="Previous"
- nextAriaLabel="Next"
- pageCount={totalPages}
- onPageChange={handlePageChange}
- pageRangeDisplayed={3}
- marginPagesDisplayed={2}
- className="flex select-none items-center justify-center rounded-md md:px-4"
- pageClassName="size-6 md:size-8 flex justify-center items-center "
- previousClassName="pr-2 lg:pr-4 text-sm md:text-base font-medium"
- nextClassName="pl-2 lg:pl-4 text-sm md:text-base font-medium"
- pageLinkClassName=" w-full h-full flex items-center justify-center"
- activeClassName="bg-transparent !text-black border font-medium rounded-md mx-4"
- renderOnZeroPageCount={undefined}
- disabledClassName="cursor-not-allowed opacity-70"
- disabledLinkClassName="cursor-not-allowed opacity-70"
- />
- )}
-
- )}
-
-
- );
-};
-
-export default ProductContent;
diff --git a/src/app/dashboard/(user-dashboard)/products/_components/product-delete-modal.tsx b/src/app/dashboard/(user-dashboard)/products/_components/product-delete-modal.tsx
deleted file mode 100644
index eb3904f82..000000000
--- a/src/app/dashboard/(user-dashboard)/products/_components/product-delete-modal.tsx
+++ /dev/null
@@ -1,118 +0,0 @@
-"use client";
-
-import { AnimatePresence, motion } from "framer-motion";
-import { useSession } from "next-auth/react";
-import { useTransition } from "react";
-
-import { deleteProduct } from "~/actions/product";
-import { Button } from "~/components/ui/button";
-import { toast } from "~/components/ui/use-toast";
-import { useOrgContext } from "~/contexts/orgContext";
-import { cn } from "~/lib/utils";
-
-const variantProperties = {
- left: "50%",
- top: "50%",
- translateX: "-50%",
- translateY: "-50%",
-};
-
-const ProductDeleteModal = () => {
- const { data: session } = useSession();
- const [isPending, startTransition] = useTransition();
- const { selectedProduct, products, isDelete, setIsDelete } = useOrgContext();
-
- const product = products.find((p) => p.id === selectedProduct);
-
- const handleDelete = async () => {
- toast({
- title: "Deleting product",
- description: "Please wait...",
- variant: "destructive",
- });
-
- startTransition(async () => {
- if (session?.currentOrgId === undefined) return;
- await deleteProduct(session?.currentOrgId, selectedProduct).then(
- (data) => {
- if (data.status === 200) {
- toast({
- title: "Product deleted",
- description: "Product deleted successfully.",
- });
- } else {
- toast({
- title: "Error",
- description: data.error || "An unexpected error occurred.",
- variant: "destructive",
- });
- }
- setIsDelete(false);
- },
- );
- });
- };
-
- return (
- <>
- setIsDelete(false)}
- className={cn(
- "fixed left-0 top-0 z-[99999] min-h-screen w-full overflow-hidden bg-neutral-700/10 transition-all duration-300 lg:hidden",
- isDelete
- ? "pointer-events-auto opacity-100"
- : "pointer-events-none opacity-0",
- )}
- />
-
-
- {isDelete && (
-
-
-
- Are you sure you want to delete {product?.name} ?
-
-
-
- Yes
-
- setIsDelete(false)}
- variant="outline"
- className="bg-white font-medium"
- >
- No
-
-
-
-
- )}
-
- >
- );
-};
-
-export default ProductDeleteModal;
diff --git a/src/app/dashboard/(user-dashboard)/products/_components/product-detail-modal.tsx b/src/app/dashboard/(user-dashboard)/products/_components/product-detail-modal.tsx
deleted file mode 100644
index a49fddded..000000000
--- a/src/app/dashboard/(user-dashboard)/products/_components/product-detail-modal.tsx
+++ /dev/null
@@ -1,243 +0,0 @@
-"use client";
-
-import { AnimatePresence, motion } from "framer-motion";
-import { Loader2, X } from "lucide-react";
-import { useSession } from "next-auth/react";
-import { useRouter } from "next-nprogress-bar";
-import { startTransition, useEffect, useState, useTransition } from "react";
-
-import { deleteProduct, getProductDetails } from "~/actions/product";
-import BlurImage from "~/components/miscellaneous/blur-image";
-import { Button } from "~/components/ui/button";
-import { toast } from "~/components/ui/use-toast";
-import { useOrgContext } from "~/contexts/orgContext";
-import useWindowWidth from "~/hooks/use-window-width";
-import { cn, formatPrice } from "~/lib/utils";
-import { Product } from "~/types";
-
-const variantProperties = {
- left: "50%",
- top: "50%",
- translateX: "-50%",
- translateY: "-50%",
-};
-
-const ProductDetailModal = () => {
- const router = useRouter();
-
- const [product, setProduct] = useState
();
-
- const { selectedProduct, updateOpen, isOpen, isDelete, setIsDelete } =
- useOrgContext();
-
- const [isLoading, startLoading] = useTransition();
- const { data: session } = useSession();
- const { winWidth } = useWindowWidth();
-
- useEffect(() => {
- if (selectedProduct === "") {
- setProduct(undefined);
- }
- startTransition(() => {
- getProductDetails(selectedProduct).then((data) => {
- setProduct(data.products);
- });
- });
- }, [selectedProduct]);
-
- const handleDelete = async () => {
- toast({
- title: "Deleting product",
- description: "Please wait...",
- variant: "destructive",
- });
-
- startLoading(() => {
- if (session?.currentOrgId === undefined) return;
- deleteProduct(session?.currentOrgId, selectedProduct).then(
- async (data) => {
- toast({
- title:
- data.status === 200 ? `Product deleted` : "an error occurred",
- description: (
-
- {product?.name} {" "}
- {data.status === 200 ? " has been deleted." : data.error}
-
- ),
- variant: "default",
- className: "z-[99999]",
- });
- if (data.status === 200) {
- updateOpen(false);
- setIsDelete(false);
- }
- },
- );
- });
- };
- const handleEditAction = (id: string) => {
- updateOpen(false);
- router.push(`/dashboard/products/${id}`);
- };
-
- useEffect(() => {
- document.body.style.overflow =
- isOpen && winWidth < 1024 ? "hidden" : "unset";
- }, [isOpen, winWidth]);
- useEffect(() => {
- document.title = isOpen
- ? `Product - ${product?.name}`
- : "Products - HNG Boilerplate";
- }, [isOpen, product?.name]);
- return (
- <>
- {
- updateOpen(false);
- }}
- className={cn(
- "fixed left-0 top-0 z-[99999] min-h-screen w-full overflow-hidden bg-neutral-700/0 transition-all duration-300 lg:hidden",
- isOpen
- ? "pointer-events-auto opacity-100"
- : "pointer-events-none opacity-0",
- )}
- />
-
-
- {isOpen && (
-
-
-
- Are you sure you want to delete {product?.name} ?
-
-
-
- Yes
-
- setIsDelete(false)}
- variant="outline"
- className="bg-white font-medium"
- >
- No
-
-
-
-
-
{product?.name}
- {
- updateOpen(false);
- }}
- >
-
-
-
-
-
-
-
- Product ID
-
- {product?.id}
-
-
-
- Category
- {product?.category}
-
-
- Date added
-
- {product?.created_at}
-
-
-
- Stock
-
- {product?.quantity} {product!.quantity! > 1 ? "pcs" : "pc"}
-
-
-
- Stock
-
- {formatPrice(product!.price! ?? 0)}
-
-
-
-
-
-
Description
-
{product?.description}
-
-
-
- setIsDelete(true)}
- variant="outline"
- className="bg-white font-medium text-error"
- >
- {isLoading ? (
-
- Deleting... {" "}
-
-
- ) : (
- Delete
- )}
-
- handleEditAction(selectedProduct)}
- variant="outline"
- className="bg-white font-medium"
- >
- Edit
-
-
-
- )}
-
- >
- );
-};
-
-export default ProductDetailModal;
diff --git a/src/app/dashboard/(user-dashboard)/products/_components/product-detail-view.tsx b/src/app/dashboard/(user-dashboard)/products/_components/product-detail-view.tsx
deleted file mode 100644
index cfbf51e0f..000000000
--- a/src/app/dashboard/(user-dashboard)/products/_components/product-detail-view.tsx
+++ /dev/null
@@ -1,197 +0,0 @@
-"use client";
-
-import { AnimatePresence, motion } from "framer-motion";
-import { X } from "lucide-react";
-import { useSession } from "next-auth/react";
-import { useRouter } from "next-nprogress-bar";
-import { useEffect, useTransition } from "react";
-
-import { deleteProduct } from "~/actions/product";
-import BlurImage from "~/components/miscellaneous/blur-image";
-import LoadingSpinner from "~/components/miscellaneous/loading-spinner";
-import { Button } from "~/components/ui/button";
-import { toast } from "~/components/ui/use-toast";
-import { useOrgContext } from "~/contexts/orgContext";
-import { cn, formatPrice } from "~/lib/utils";
-
-const ProductDetailView = () => {
- const {
- products,
- selectedProduct,
- isDelete,
- setIsDelete,
- updateOpen,
- isOpen,
- } = useOrgContext();
- const router = useRouter();
-
- const [isLoading, startTransition] = useTransition();
-
- const product = products.find((p) => p.id === selectedProduct);
- const { data: session } = useSession();
-
- const handleDelete = async () => {
- toast({
- title: "Deleting product",
- description: "Please wait...",
- variant: "destructive",
- });
-
- startTransition(async () => {
- if (session?.currentOrgId === undefined) return;
- await deleteProduct(session?.currentOrgId, selectedProduct).then(
- (data) => {
- if (data.status === 200) {
- toast({
- title: "Product deleted",
- description: "Product deleted successfully.",
- });
- } else {
- toast({
- title: "Error",
- description: data.error || "An unexpected error occurred.",
- variant: "destructive",
- });
- }
- setIsDelete(false);
- },
- );
- });
- };
- const handleEditAction = (id: string) => {
- setIsDelete(false);
- router.push(`/dashboard/products/${id}`);
- };
-
- useEffect(() => {
- document.title = isOpen
- ? `Product - ${product?.name}`
- : "Products - HNG Boilerplate";
- }, [isOpen, product?.name]);
-
- return (
-
- {isOpen && (
-
-
-
- Are you sure you want to delete {product?.name} ?
-
-
-
- Yes
-
- setIsDelete(false)}
- variant="outline"
- className="bg-white font-medium"
- >
- No
-
-
-
-
-
- {product?.name}
-
- {
- updateOpen(false);
- }}
- >
-
-
-
-
-
-
-
- Product ID
-
- {product?.id}
-
-
-
- Category
- {product?.category}
-
-
- Date added
-
- {product?.created_at},
-
-
- {/*
- Stock
-
- {product?.stock} {product!.stock! > 1 ? "pcs" : "pc"}
-
-
*/}
-
- Stock
-
- {formatPrice(product!.price! ?? 0)}
-
-
-
-
-
-
Description
-
{product?.description}
-
-
-
- setIsDelete(true)}
- variant="outline"
- className="bg-white font-medium text-error"
- >
- {isLoading ? (
-
- Deleting... {" "}
-
-
- ) : (
- Delete
- )}
-
- handleEditAction(selectedProduct)}
- variant="outline"
- className="bg-white font-medium"
- >
- Edit
-
-
-
- )}
-
- );
-};
-
-export default ProductDetailView;
diff --git a/src/app/dashboard/(user-dashboard)/products/_components/product-filter.tsx b/src/app/dashboard/(user-dashboard)/products/_components/product-filter.tsx
deleted file mode 100644
index 41ae93e91..000000000
--- a/src/app/dashboard/(user-dashboard)/products/_components/product-filter.tsx
+++ /dev/null
@@ -1,159 +0,0 @@
-import { AnimatePresence, motion } from "framer-motion";
-import { Filter, Grid, List, Search } from "lucide-react";
-import { Dispatch, SetStateAction, useEffect, useRef } from "react";
-
-import { Button } from "~/components/ui/button";
-import { useProductModal } from "~/hooks/admin-product/use-product.modal";
-import { cn } from "~/lib/utils";
-
-type ProductFilterProperties = {
- view: "list" | "grid";
- setView: Dispatch
>;
-};
-
-const ProductFilter = ({ view, setView }: ProductFilterProperties) => {
- const { isOpenFilterModal, updateFilterModal } = useProductModal();
-
- const filterReference = useRef(null);
- const filterTriggerReference = useRef(null);
-
- useEffect(() => {
- document.body.style.overflow = isOpenFilterModal ? "hidden" : "unset";
- }, [isOpenFilterModal]);
-
- useEffect(() => {
- const handleClickOutside = (event: MouseEvent) => {
- if (
- filterReference.current &&
- !(
- filterReference.current.contains(event.target as Node) ||
- filterTriggerReference.current?.contains(event.target as Node)
- )
- ) {
- updateFilterModal(false);
- }
- };
- document.addEventListener("mousedown", handleClickOutside);
- return () => {
- document.removeEventListener("mousedown", handleClickOutside);
- };
- });
-
- return (
-
-
- {/* setSearchTerm(event.target.value)}
- placeholder="search products..."
- className="h-8 w-full bg-transparent px-8 text-sm min-[500px]:h-10"
- /> */}
- {/* setSearchTerm("")}
- variant="ghost"
- size="icon"
- className={cn(
- "absolute right-0 top-1/2 -translate-y-1/2 transition-opacity duration-300",
- searchTerm
- ? "pointer-events-auto opacity-100"
- : "pointer-events-none opacity-0",
- )}
- >
-
- */}
-
-
-
-
- setView("grid")}
- disabled={view === "grid"}
- variant="outline"
- size="icon"
- className={cn(
- "flex items-center gap-x-2 bg-transparent p-2 text-sm hover:!bg-black hover:text-white disabled:!opacity-85 md:rounded-[6px]",
- view === "grid"
- ? "bg-black text-white transition-all duration-300 hover:!opacity-80 active:scale-90"
- : "",
- )}
- >
-
-
- setView("list")}
- disabled={view === "list"}
- variant="outline"
- size="icon"
- className={cn(
- "flex items-center gap-x-2 p-2 text-sm hover:!bg-black hover:text-white disabled:!cursor-not-allowed disabled:!opacity-85 md:rounded-[6px]",
- view === "list"
- ? "bg-black text-white transition-all duration-300 hover:!opacity-80 active:scale-90"
- : "",
- )}
- >
-
-
-
-
-
updateFilterModal(!isOpenFilterModal)}
- ref={filterTriggerReference}
- variant="outline"
- className="relative grid w-8 place-items-center bg-transparent px-2 text-sm min-[500px]:flex min-[500px]:w-[82px] min-[500px]:items-center min-[500px]:justify-between min-[500px]:gap-x-2 min-[500px]:text-base"
- >
-
- Filter
-
-
-
- {isOpenFilterModal && (
-
-
- Filters
-
- {/* {filters.map((filter) => (
- {
- router.push(`?filter=${filter.value}`);
- updateFilter(filter.value);
- updateFilterModal(false);
- }}
- >
-
-
- {filter.label}
-
- ))} */}
-
- )}
-
- {/*
*/}
-
-
- );
-};
-
-export default ProductFilter;
diff --git a/src/app/dashboard/(user-dashboard)/products/_components/product-grid-card.tsx b/src/app/dashboard/(user-dashboard)/products/_components/product-grid-card.tsx
deleted file mode 100644
index e7f0d335b..000000000
--- a/src/app/dashboard/(user-dashboard)/products/_components/product-grid-card.tsx
+++ /dev/null
@@ -1,70 +0,0 @@
-import CustomButton from "~/components/common/common-button/common-button";
-import BlurImage from "~/components/miscellaneous/blur-image";
-import { Input } from "~/components/ui/input";
-import { formatPrice } from "~/lib/utils";
-import { Product } from "~/types";
-import { ProductHighlightTerm } from "./product-highlight-term";
-
-interface ProductGridCardProperties extends Product {
- searchTerm: string;
-}
-
-export function ProductGridCard({
- image,
- price = 15,
- searchTerm = "",
- category,
- name,
-}: ProductGridCardProperties) {
- return (
-
-
-
-
-
-
-
-
-
{formatPrice(price)}
-
-
-
- {/*
- {stock.label}
- */}
-
-
-
-
- Edit
-
-
- Delete
-
-
-
-
- );
-}
diff --git a/src/app/dashboard/(user-dashboard)/products/_components/product-header.tsx b/src/app/dashboard/(user-dashboard)/products/_components/product-header.tsx
deleted file mode 100644
index 840f18ba0..000000000
--- a/src/app/dashboard/(user-dashboard)/products/_components/product-header.tsx
+++ /dev/null
@@ -1,33 +0,0 @@
-import { Plus } from "lucide-react";
-
-import { Button } from "~/components/ui/button";
-import { useOrgContext } from "~/contexts/orgContext";
-
-const ProductHeader = () => {
- const { setIsNewModal } = useOrgContext();
-
- return (
-
-
-
- Products
-
-
- Manage your products efficiently
-
-
-
-
setIsNewModal(true)}
- variant="default"
- className="flex items-center gap-x-1 text-[10px] max-[450px]:px-1 min-[380px]:text-xs min-[450px]:gap-x-2 min-[450px]:text-sm"
- >
-
- Add a Product
-
-
-
- );
-};
-
-export default ProductHeader;
diff --git a/src/app/dashboard/(user-dashboard)/products/_components/product-highlight-term.tsx b/src/app/dashboard/(user-dashboard)/products/_components/product-highlight-term.tsx
deleted file mode 100644
index f1e612241..000000000
--- a/src/app/dashboard/(user-dashboard)/products/_components/product-highlight-term.tsx
+++ /dev/null
@@ -1,37 +0,0 @@
-import { cn } from "~/lib/utils";
-
-type ProductHighlightTermProperties = {
- searchTerm: string;
- name: string;
-};
-
-export function ProductHighlightTerm({
- name,
- searchTerm = "",
-}: ProductHighlightTermProperties) {
- return (
- <>
- {searchTerm.length > 1 ? (
- 2 ? "w-[50px] overflow-x-auto" : "",
- )}
- dangerouslySetInnerHTML={{
- __html: name.replaceAll(
- new RegExp(`(${searchTerm})`, "gi"),
- (match, group) =>
- `${match} `,
- ),
- }}
- />
- ) : (
- {name}
- )}
- >
- );
-}
diff --git a/src/app/dashboard/(user-dashboard)/products/_components/product-list-row.tsx b/src/app/dashboard/(user-dashboard)/products/_components/product-list-row.tsx
deleted file mode 100644
index 85f7b0ffd..000000000
--- a/src/app/dashboard/(user-dashboard)/products/_components/product-list-row.tsx
+++ /dev/null
@@ -1,181 +0,0 @@
-import { AnimatePresence, motion } from "framer-motion";
-import { Edit2, MoreVertical, Trash } from "lucide-react";
-import { useEffect, useRef } from "react";
-
-import BlurImage from "~/components/miscellaneous/blur-image";
-import { Button } from "~/components/ui/button";
-import { Input } from "~/components/ui/input";
-import { TableCell, TableRow } from "~/components/ui/table";
-import { useOrgContext } from "~/contexts/orgContext";
-import { cn, formatPrice } from "~/lib/utils";
-import { Product } from "~/types";
-import { ProductHighlightTerm } from "./product-highlight-term";
-
-interface ProductListRowProperties extends Product {
- searchTerm: string;
- isBottomRow: boolean;
- isActionModal: boolean;
- onOpenActionModal: () => void;
- onCloseActionModal: () => void;
- onEdit: () => void; // (id: string) => void;
- onDelete: () => void; // (id: string) => void;
- onSelect?: () => void; // (id: string) => void;
- onOpenDetails: () => void;
-}
-
-export function ProductListRow({
- id,
- price,
- category,
- image,
- searchTerm = "",
- isBottomRow,
- isActionModal,
- onCloseActionModal,
- onOpenActionModal,
- onEdit,
- onDelete,
- name,
- stock_status,
- onOpenDetails,
-}: ProductListRowProperties) {
- const { selectedProduct } = useOrgContext();
- const modalReference = useRef(null);
- useEffect(() => {
- if (!isActionModal || !modalReference.current) return;
- modalReference.current.scrollIntoView({ behavior: "smooth" });
-
- const handleOutsideClick = (event: MouseEvent) => {
- if (
- modalReference.current &&
- !modalReference.current.contains(event.target as Node)
- ) {
- onCloseActionModal();
- }
- };
- document.addEventListener("click", handleOutsideClick);
- return () => {
- document.removeEventListener("click", handleOutsideClick);
- };
- }, [isActionModal, onCloseActionModal]);
- return (
-
-
-
-
-
-
-
-
-
-
-
- {id}
-
-
- {category}
-
-
- {formatPrice(price)}
-
-
-
-
- {stock_status === "in stock" && "In Stock"}
- {stock_status === "preorder" && "Low on Stock"}
- {stock_status === "out of stock" && "Out of Stock"}
-
-
-
-
-
-
-
- {isActionModal && selectedProduct === id && (
-
-
- Actions
-
-
-
-
-
- Edit
-
-
-
-
- Delete
-
-
-
- )}
-
-
-
- );
-}
diff --git a/src/app/dashboard/(user-dashboard)/products/_components/product-not-found.tsx b/src/app/dashboard/(user-dashboard)/products/_components/product-not-found.tsx
deleted file mode 100644
index 8df78e0e4..000000000
--- a/src/app/dashboard/(user-dashboard)/products/_components/product-not-found.tsx
+++ /dev/null
@@ -1,11 +0,0 @@
-export function ProductNotFound({ term }: { term: string }) {
- return (
-
-
- No product found for "
- {term}
- "
-
-
- );
-}
diff --git a/src/app/dashboard/(user-dashboard)/products/_components/productcadrcomponent.tsx b/src/app/dashboard/(user-dashboard)/products/_components/productcadrcomponent.tsx
deleted file mode 100644
index e77bc85ed..000000000
--- a/src/app/dashboard/(user-dashboard)/products/_components/productcadrcomponent.tsx
+++ /dev/null
@@ -1,67 +0,0 @@
-"use client";
-
-import Image, { StaticImageData } from "next/image";
-
-interface ProductCardProperties {
- title: string;
- price: string;
- description: string;
- inStock: boolean;
- imageUrl: string | StaticImageData;
-}
-
-const Delete = () => {
- alert("Are you sure you want to delete");
-};
-
-const Edit = () => {
- alert("Proceed to edit");
-};
-
-const ProductCard: React.FC = ({
- title,
- price,
- description,
- inStock,
- imageUrl,
-}) => {
- return (
-
-
-
-
-
{description}
-
- {inStock ? "In stock" : "Out of stock"}
-
-
-
- Edit
-
-
- Delete
-
-
-
-
- );
-};
-
-export default ProductCard;
diff --git a/src/app/dashboard/(user-dashboard)/products/_components/schema/schema.ts b/src/app/dashboard/(user-dashboard)/products/_components/schema/schema.ts
deleted file mode 100644
index 2462a2538..000000000
--- a/src/app/dashboard/(user-dashboard)/products/_components/schema/schema.ts
+++ /dev/null
@@ -1,120 +0,0 @@
-import { z } from "zod";
-
-export const MAX_CHAR = 170;
-export const EditProductSchema = z.object({
- product_name: z.string().min(3, { message: "Product name is required" }),
- description: z
- .string()
- .min(3, { message: "Description is required" })
- .max(MAX_CHAR, { message: "Description is too long" }),
- category: z.string().min(3, { message: "Availability is required" }),
- price: z
- .string()
- .min(1, { message: "Price is required" })
- .refine(
- (value) => {
- if (typeof Number(value) === "number") {
- return Number(value) > 0;
- }
- return true;
- },
- {
- message: "Price must be a positive number",
- },
- ),
- quantity: z
- .string()
- .min(1, { message: "Quantity is required" })
- .refine(
- (value) => {
- if (typeof Number(value) === "number") {
- return Number(value) > 0;
- }
- return true;
- },
- {
- message: "Quantity must be a positive number",
- },
- ),
- media: z.object(
- {
- url: z.string(),
- id: z.string(),
- },
- { message: "Media is required" },
- ),
- stocks: z.array(
- z.object({
- id: z.string(),
- size: z.string(),
- stock: z.string().refine(
- (value) => {
- if (typeof Number(value) === "number") {
- return Number(value) > 0;
- }
- return true;
- },
- {
- message: "stock is required",
- },
- ),
- price: z.string().refine(
- (value) => {
- if (typeof Number(value) === "number") {
- return Number(value) > 0;
- }
- return true;
- },
- {
- message: "price is required",
- },
- ),
- }),
- ),
-});
-export const NewProductSchema = z.object({
- product_name: z.string().min(3, { message: "Product name is required" }),
- description: z
- .string()
- .min(3, { message: "Description is required" })
- .max(MAX_CHAR, { message: "Description is too long" }),
- category: z.string().min(3, { message: "Category is required" }),
- price: z
- .string()
- .min(1, { message: "Price is required" })
- .refine(
- (value) => {
- if (typeof Number(value) === "number") {
- return Number(value) > 0;
- }
- return true;
- },
- {
- message: "Price must be a positive number",
- },
- ),
- quantity: z
- .string()
- .min(1, { message: "Quantity is required" })
- .refine(
- (value) => {
- if (typeof Number(value) === "number") {
- return Number(value) > 0;
- }
- return true;
- },
- {
- message: "Quantity must be a positive number",
- },
- ),
- // media: z.object(
- // {
- // url: z.string(),
- // id: z.string(),
- // },
- // { message: "Media is required" },
- // ),
-});
-
-export type NewProduct = z.infer;
-export type EditProduct = z.infer;
diff --git a/src/app/dashboard/(user-dashboard)/products/data/categories.mock.ts b/src/app/dashboard/(user-dashboard)/products/data/categories.mock.ts
deleted file mode 100644
index bd04bf881..000000000
--- a/src/app/dashboard/(user-dashboard)/products/data/categories.mock.ts
+++ /dev/null
@@ -1,39 +0,0 @@
-export type CategoriesType = {
- name?: string;
- value: string;
- label: string;
-};
-
-export const CATEGORIES: CategoriesType[] = [
- { label: "Clothes", value: "clothes" },
- { label: "Shoes", value: "shoes" },
- { label: "Hats", value: "hats" },
- { label: "Electronics", value: "electronics" },
- { label: "Furniture", value: "furniture" },
- { label: "Books", value: "books" },
- { label: "Toys", value: "toys" },
- { label: "Accessories", value: "accessories" },
- { label: "Beauty Products", value: "beauty_products" },
- { label: "Kitchenware", value: "kitchenware" },
- { label: "Sports Equipment", value: "sports_equipment" },
- { label: "Jewelry", value: "jewelry" },
- { label: "Automobiles", value: "automobiles" },
- { label: "Garden Tools", value: "garden_tools" },
-];
-export const STOCKS_SELECT: CategoriesType[] = [
- {
- value: "in_stock",
- label: "In Stock",
- name: "",
- },
- {
- value: "low_on_stock",
- label: "Low on Stock",
- name: "",
- },
- {
- value: "out_of_stock",
- label: "Out of Stock",
- name: "",
- },
-];
diff --git a/src/app/dashboard/(user-dashboard)/products/data/product.mock.ts b/src/app/dashboard/(user-dashboard)/products/data/product.mock.ts
deleted file mode 100644
index 34c8ce5eb..000000000
--- a/src/app/dashboard/(user-dashboard)/products/data/product.mock.ts
+++ /dev/null
@@ -1,299 +0,0 @@
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-nocheck
-
-import { ProductTableProperties } from "~/types/admin-product.types";
-
-type ProductNavProperties = {
- name: string;
- label: string;
-};
-
-export const PRODUCT_NAV: ProductNavProperties[] = [
- {
- name: "product_name",
- label: "Product Name",
- },
- {
- name: "product_id",
- label: "Product ID",
- },
- {
- name: "category",
- label: "Category",
- },
- {
- name: "price",
- label: "Price",
- },
- {
- name: "status",
- label: "Status",
- },
- {
- name: "actions",
- label: "Actions",
- },
-];
-
-export const PRODUCT_TABLE: ProductTableProperties[] = [
- {
- product_id: "1",
- name: "Wireless Mouse",
- description:
- "Ergonomic wireless mouse with adjustable DPI settings, designed for maximum comfort and precision. Perfect for both casual browsing and intense gaming sessions.",
- price: 29.99,
- image: "/product/product-image.webp",
- category: "Electronics",
- status: "in_stock",
- stock: 10,
- date_added: "2023-01-15",
- time: "12:34:56",
- },
- {
- product_id: "2",
- name: "Mechanical Keyboard",
- description:
- "RGB mechanical keyboard with blue switches for a satisfying clicky sound and tactile feedback. Features customizable lighting effects and durable keycaps.",
- price: 79.99,
- image: "/product/product-image.webp",
- category: "Electronics",
- status: "low_on_stock",
- stock: 10,
- date_added: "2023-02-10",
- time: "12:34:56",
- },
- {
- product_id: "3",
- name: "Gaming Headset",
- description:
- "Surround sound gaming headset with noise-cancelling microphone. Offers immersive audio experience, comfortable ear cups, and an adjustable headband for long gaming sessions.",
- price: 49.99,
- image: "/product/product-image.webp",
- category: "Accessories",
- status: "in_stock",
- stock: 10,
- date_added: "2023-03-05",
- time: "12:34:56",
- },
- {
- product_id: "4",
- name: "4K Monitor",
- description:
- "Ultra HD 4K monitor with vibrant colors and crystal-clear image quality. Features a slim bezel design and multiple input options, perfect for professional and entertainment use.",
- price: 299.99,
- image: "/product/product-image.webp",
- category: "Electronics",
- status: "out_of_stock",
- stock: 10,
- date_added: "2023-04-12",
- time: "12:34:56",
- },
- {
- product_id: "5",
- name: "Bluetooth Speaker",
- description:
- "Portable Bluetooth speaker with powerful sound and deep bass. Water-resistant and with a long-lasting battery, ideal for outdoor activities and parties.",
- price: 59.99,
- image: "/product/product-image.webp",
- category: "Audio",
- status: "in_stock",
- stock: 10,
- date_added: "2023-05-18",
- time: "12:34:56",
- },
- {
- product_id: "6",
- name: "Smartwatch",
- description:
- "Feature-rich smartwatch with fitness tracking, heart rate monitoring, and notifications. Stylish design with interchangeable bands, compatible with both Android and iOS.",
- price: 199.99,
- image: "/product/product-image.webp",
- category: "Wearables",
- status: "low_on_stock",
- stock: 10,
- date_added: "2023-06-21",
- time: "12:34:56",
- },
- {
- product_id: "7",
- name: "Drone",
- description:
- "Compact drone with high-definition camera for stunning aerial photography and videography. Easy to control with smartphone app and comes with multiple flight modes.",
- price: 399.99,
- image: "/product/product-image.webp",
- category: "Toys",
- status: "in_stock",
- stock: 10,
- date_added: "2023-07-15",
- time: "12:34:56",
- },
- {
- product_id: "8",
- name: "Electric Toothbrush",
- description:
- "Rechargeable electric toothbrush with multiple brushing modes and a smart timer. Provides thorough cleaning and improves oral hygiene, suitable for all ages.",
- price: 89.99,
- image: "/product/product-image.webp",
- category: "Health",
- status: "in_stock",
- stock: 10,
- date_added: "2023-08-10",
- time: "12:34:56",
- },
- {
- product_id: "9",
- name: "Fitness Tracker",
- description:
- "Advanced fitness tracker with activity monitoring, sleep analysis, and water resistance. Lightweight and comfortable to wear, ideal for fitness enthusiasts.",
- price: 69.99,
- image: "/product/product-image.webp",
- category: "Wearables",
- status: "low_on_stock",
- stock: 10,
- date_added: "2023-09-05",
- time: "12:34:56",
- },
- {
- product_id: "10",
- name: "Noise-Cancelling Headphones",
- description:
- "High-fidelity noise-cancelling headphones with superior sound quality and long battery life. Comfortable over-ear design, perfect for travel and work.",
- price: 249.99,
- image: "/product/product-image.webp",
- category: "Audio",
- status: "in_stock",
- stock: 10,
- date_added: "2023-10-20",
- time: "12:34:56",
- },
- {
- product_id: "11",
- name: "Smart Home Hub",
- description:
- "Centralized smart home hub that connects and controls all your smart devices seamlessly. Compatible with various smart home ecosystems for enhanced convenience.",
- price: 129.99,
- image: "/product/product-image.webp",
- category: "Home",
- status: "in_stock",
- stock: 10,
- date_added: "2023-11-05",
- time: "12:34:56",
- },
- {
- product_id: "12",
- name: "Robot Vacuum Cleaner",
- description:
- "Automatic robot vacuum cleaner with powerful suction and smart navigation. Effortlessly cleans your floors and carpets, with scheduled cleaning and app control.",
- price: 499.99,
- image: "/product/product-image.webp",
- category: "Home",
- status: "low_on_stock",
- stock: 10,
- date_added: "2023-12-01",
- time: "12:34:56",
- },
- {
- product_id: "13",
- name: "Electric Kettle",
- description:
- "Fast-boiling electric kettle with temperature control and auto shut-off. Stylish design with a large capacity, perfect for making tea, coffee, and instant meals.",
- price: 39.99,
- image: "/product/product-image.webp",
- category: "Kitchen",
- status: "in_stock",
- stock: 10,
- date_added: "2023-12-15",
- time: "12:34:56",
- },
- {
- product_id: "14",
- name: "Instant Pot",
- description:
- "Multi-functional Instant Pot with pressure cooking, slow cooking, and sautéing features. Saves time and effort in the kitchen, with various preset programs.",
- price: 99.99,
- image: "/product/product-image.webp",
- category: "Kitchen",
- status: "out_of_stock",
- stock: 10,
- date_added: "2024-01-10",
- time: "12:34:56",
- },
- {
- product_id: "15",
- name: "Air Purifier",
- description:
- "High-efficiency air purifier with HEPA filter and quiet operation. Removes allergens, dust, and pollutants, providing clean and fresh air in your home.",
- price: 149.99,
- image: "/product/product-image.webp",
- category: "Home",
- status: "in_stock",
- stock: 10,
- date_added: "2024-01-25",
- time: "12:34:56",
- },
- {
- product_id: "16",
- name: "Smart Thermostat",
- description:
- "Energy-saving smart thermostat with remote control and learning capabilities. Adjusts to your preferences and schedule, ensuring optimal comfort and efficiency.",
- price: 249.99,
- image: "/product/product-image.webp",
- category: "Home",
- status: "low_on_stock",
- stock: 10,
- date_added: "2024-02-14",
- time: "12:34:56",
- },
- {
- product_id: "17",
- name: "Portable Projector",
- description:
- "Compact portable projector with high-definition resolution and built-in speakers. Ideal for home entertainment, business presentations, and outdoor movie nights.",
- price: 199.99,
- image: "/product/product-image.webp",
- category: "Electronics",
- status: "in_stock",
- stock: 10,
- date_added: "2024-03-02",
- time: "12:34:56",
- },
- {
- product_id: "18",
- name: "Electric Scooter",
- description:
- "Eco-friendly electric scooter with a powerful motor and long-lasting battery. Features a foldable design for easy portability and storage, perfect for urban commuting.",
- price: 599.99,
- image: "/product/product-image.webp",
- category: "Outdoors",
- status: "out_of_stock",
- stock: 10,
- date_added: "2024-03-20",
- time: "12:34:56",
- },
- {
- product_id: "19",
- name: "Digital Camera",
- description:
- "High-performance digital camera with interchangeable lenses and 4K video recording. Perfect for photography enthusiasts and professionals seeking high-quality images.",
- price: 899.99,
- image: "/product/product-image.webp",
- category: "Photography",
- status: "in_stock",
- stock: 10,
- date_added: "2024-04-05",
- time: "12:34:56",
- },
- {
- product_id: "20",
- name: "Smart Doorbell",
- description:
- "Smart doorbell with HD video, two-way audio, and motion detection. Enhances home security by allowing you to see and communicate with visitors remotely.",
- price: 179.99,
- image: "/product/product-image.webp",
- category: "Home",
- status: "low_on_stock",
- stock: 10,
- date_added: "2024-04-20",
- time: "12:34:56",
- },
-];
diff --git a/src/app/dashboard/(user-dashboard)/products/data/stocks.mock.ts b/src/app/dashboard/(user-dashboard)/products/data/stocks.mock.ts
deleted file mode 100644
index ec640d483..000000000
--- a/src/app/dashboard/(user-dashboard)/products/data/stocks.mock.ts
+++ /dev/null
@@ -1,39 +0,0 @@
-import { EditProduct } from "../_components/schema/schema";
-
-export const STOCKS: EditProduct["stocks"] = [
- {
- id: "P0001",
- size: "Small",
- stock: "",
- price: "",
- },
- {
- id: "P0002",
- size: "Medium",
- stock: "",
- price: "",
- },
- {
- id: "P0003",
- size: "Large",
- stock: "",
- price: "S",
- },
-];
-
-export const shouldDisableAddStocksButton = ({
- stocks,
-}: {
- stocks: typeof STOCKS;
-}) => {
- if (stocks.length === 0) return false;
-
- return stocks.some(
- (stock) =>
- stock.size!.length === 0 ||
- stock.stock!.length === 0 ||
- stock.price!.length === 0,
- )
- ? true
- : false;
-};
diff --git a/src/app/dashboard/(user-dashboard)/products/layout.tsx b/src/app/dashboard/(user-dashboard)/products/layout.tsx
deleted file mode 100644
index 0d2eb19e3..000000000
--- a/src/app/dashboard/(user-dashboard)/products/layout.tsx
+++ /dev/null
@@ -1,37 +0,0 @@
-// /* eslint-disable react-hooks/exhaustive-deps */
-// "use client";
-
-// import { useEffect } from "react";
-
-// import { useProducts } from "~/hooks/admin-product/use-products.persistence";
-// import { PRODUCT_TABLE } from "./data/product.mock";
-
-// export default function UserProductLayout({
-// children,
-// }: {
-// children: React.ReactNode;
-// }) {
-// const { addProducts } = useProducts();
-// useEffect(() => {
-// const is_saved = localStorage.getItem("admin_products");
-// if (is_saved) {
-// const parse_data = JSON.parse(is_saved);
-// if (parse_data.state.products) return;
-// setTimeout(() => {
-// addProducts(PRODUCT_TABLE);
-// }, 5000);
-// }
-// }, []);
-
-// return <>{children}>;
-// }
-
-"use client";
-
-export default function UserProductLayout({
- children,
-}: {
- children: React.ReactNode;
-}) {
- return <>{children}>;
-}
diff --git a/src/app/dashboard/(user-dashboard)/products/mainproductdetailpage/page.tsx b/src/app/dashboard/(user-dashboard)/products/mainproductdetailpage/page.tsx
deleted file mode 100644
index 55ba4ce42..000000000
--- a/src/app/dashboard/(user-dashboard)/products/mainproductdetailpage/page.tsx
+++ /dev/null
@@ -1,382 +0,0 @@
-"use client";
-
-import Image from "next/image";
-import Link from "next/link";
-import { ChangeEvent, FormEvent, useState } from "react";
-
-import user from "../../../../../../public/images/user.png";
-
-const Discard = () => {
- alert("Changes discard");
-};
-
-const ProductDetail = () => {
- const [textValue, setTextValue] = useState("Product 2");
- const [messageValue, setmessageValue] = useState(
- "A fusion of ripe bananas, pure honey, and succulent raspberries with our bread. Crafted to perfection.",
- );
- const [image, setImage] = useState();
- const [smallQuantity, setSmallQuantity] = useState(0);
- const [standardQuantity, setStandardQuantity] = useState(24);
- const [largeQuantity, setLargeQuantity] = useState(0);
- const [smallPrice, setSmallPrice] = useState("$12.00");
- const [standardPrice, setStandardPrice] = useState("$29.00");
- const [largePrice, setLargePrice] = useState("$32.00");
-
- const handleSubmit = (event: FormEvent) => {
- event.preventDefault();
-
- if (
- !textValue.trim() ||
- !messageValue.trim() ||
- !smallQuantity ||
- !standardQuantity ||
- !largeQuantity ||
- !smallPrice ||
- !standardPrice ||
- !largePrice ||
- !largePrice ||
- !image
- ) {
- alert(
- "Please fill in all the necessary fields including your image before submitting.",
- );
- return;
- }
- alert("Details updated");
- };
-
- const handleSmallQty = (event: ChangeEvent) => {
- setSmallQuantity(Number(event.target.value));
- };
-
- const handleStandardQty = (event: ChangeEvent) => {
- setStandardQuantity(Number(event.target.value));
- };
-
- const handleLargeQty = (event: ChangeEvent) => {
- setLargeQuantity(Number(event.target.value));
- };
-
- //upload media section
- const handleImageChange = (event: ChangeEvent) => {
- const file = event.target.files?.[0];
- if (file) {
- const reader = new FileReader();
- reader.onloadend = () => {
- setImage(reader.result as string);
- };
- reader.readAsDataURL(file);
- }
- };
-
- //comment section
- const [comments, setComments] = useState([
- {
- name: "Adetunji Oluwatobi",
- date: "02 Jan, 2020",
- time: "Wed 02:30pm",
- comment: "Living a balanced lifestyle is essential...",
- },
- {
- name: "Afolabi Oyewole",
- date: "02 Jan, 2020",
- time: "Wed 02:30pm",
- comment: "Living a balanced lifestyle is essential...",
- },
- ]);
- const [newComment, setNewComment] = useState("");
-
- const handleCommentChange = (
- event: React.ChangeEvent,
- ) => {
- setNewComment(event.target.value);
- };
-
- const handleCommentSubmit = () => {
- if (newComment.trim()) {
- const currentDate = new Date();
- const formattedDate = `${currentDate.getDate()} ${currentDate.toLocaleString("default", { month: "short" })}, ${currentDate.getFullYear()}`;
- const formattedTime = `${currentDate.toLocaleString("default", { weekday: "short" })} ${currentDate.getHours()}:${currentDate.getMinutes() < 10 ? "0" : ""}${currentDate.getMinutes()}pm`;
-
- const commentToAdd = {
- name: "New User",
- date: formattedDate,
- time: formattedTime,
- comment: newComment,
- };
-
- setComments([...comments, commentToAdd]);
- setNewComment("");
- }
- };
-
- return (
-
-
-
-
-
- Products
-
-
- {">"}
-
-
- Product Details
-
-
-
-
-
-
- ←
-
-
Product 2
- ● In stock
-
-
-
- Discard
-
-
- Save changes
-
-
-
-
-
-
-
-
Product Details
-
- Make quick changes to your product.
-
-
-
-
-
- Title* {" "}
-
- setTextValue(event.target.value)}
- placeholder="Product title"
- className="w-full rounded-md border border-gray-300 p-2 focus:outline-none"
- />
-
-
-
- Description:
-
- setmessageValue(event.target.value)}
- className="w-full rounded-md border border-gray-300 p-2 focus:outline-none"
- rows={4}
- maxLength={170}
- placeholder="Product description."
- >
-
-
-
-
-
Stock
-
Add and remove products
-
-
-
-
- Add a Variant
-
-
-
-
-
-
-
Media
-
-
- Upload media for your product.
-
-
-
- {image ? (
-
- ) : (
-
Image here
- )}
-
-
-
- +
-
-
-
-
-
-
-
Status
-
Availability
-
-
- In Stock
- Out of Stock
- Low in Stock
-
-
-
-
Archive
-
Archive a product.
-
-
- Archive Product 2
-
-
-
-
-
-
-
-
-
Comments
- {comments.map((comment, index) => (
-
-
-
-
-
{comment.name}
-
{`${comment.date} ${comment.time}`}
-
-
-
{comment.comment}
-
- ))}
-
-
-
- Reply
-
-
-
-
- );
-};
-
-export default ProductDetail;
diff --git a/src/app/dashboard/(user-dashboard)/products/page.tsx b/src/app/dashboard/(user-dashboard)/products/page.tsx
deleted file mode 100644
index 5c53a59a3..000000000
--- a/src/app/dashboard/(user-dashboard)/products/page.tsx
+++ /dev/null
@@ -1,43 +0,0 @@
-"use client";
-
-import { AnimatePresence, motion } from "framer-motion";
-import { useState } from "react";
-
-import { useOrgContext } from "~/contexts/orgContext";
-import NewProductModal from "./_components/new-product-modal";
-import ProductContent from "./_components/product-content";
-import ProductDeleteModal from "./_components/product-delete-modal";
-import ProductDetailModal from "./_components/product-detail-modal";
-import ProductDetailView from "./_components/product-detail-view";
-import ProductFilter from "./_components/product-filter";
-import ProductHeader from "./_components/product-header";
-
-const ProductPage = () => {
- const [view, setView] = useState<"list" | "grid">("grid");
- const { isOpen } = useOrgContext();
-
- return (
-
-
-
-
-
-
-
-
-
- {isOpen && }
-
-
-
-
-
- );
-};
-
-export default ProductPage;
diff --git a/src/app/dashboard/(user-dashboard)/products/productcard/page.tsx b/src/app/dashboard/(user-dashboard)/products/productcard/page.tsx
deleted file mode 100644
index baca39210..000000000
--- a/src/app/dashboard/(user-dashboard)/products/productcard/page.tsx
+++ /dev/null
@@ -1,19 +0,0 @@
-import productimage from "/public/images/productimage.png";
-
-import ProductCard from "../_components/productcadrcomponent";
-
-const Home: React.FC = () => {
- return (
-
- );
-};
-
-export default Home;
diff --git a/src/app/dashboard/(user-dashboard)/settings/_components/MemberCard/index.tsx b/src/app/dashboard/(user-dashboard)/settings/_components/MemberCard/index.tsx
deleted file mode 100644
index dd0e40cec..000000000
--- a/src/app/dashboard/(user-dashboard)/settings/_components/MemberCard/index.tsx
+++ /dev/null
@@ -1,51 +0,0 @@
-import { Avatar, AvatarFallback, AvatarImage } from "~/components/ui/avatar";
-import { CardContent } from "~/components/ui/card";
-import DeleteDropDown from "../deleteDropDown";
-import RoleDropDown from "../roleDropDown";
-
-interface MemberCardProperty {
- name: string;
- email: string;
- image: string;
- deleteHandle: () => void;
- setRole: (role: string) => void;
-}
-
-const MemberCard = ({
- name,
- email,
- image,
- deleteHandle,
- setRole,
-}: MemberCardProperty) => {
- return (
-
-
-
- {
- setRole(data);
- }}
- />
-
-
-
-
-
- );
-};
-
-export default MemberCard;
diff --git a/src/app/dashboard/(user-dashboard)/settings/_components/MemberDeleteModal/index.tsx b/src/app/dashboard/(user-dashboard)/settings/_components/MemberDeleteModal/index.tsx
deleted file mode 100644
index 318640982..000000000
--- a/src/app/dashboard/(user-dashboard)/settings/_components/MemberDeleteModal/index.tsx
+++ /dev/null
@@ -1,52 +0,0 @@
-"use client";
-
-import React from "react";
-
-import CustomButton from "~/components/common/common-button/common-button";
-import {
- Dialog,
- DialogContent,
- DialogDescription,
- DialogOverlay,
- DialogTitle,
-} from "~/components/ui/dialog";
-
-interface ModalProperties {
- show: boolean;
- onClose: () => void;
- // memberId?: string;
-}
-
-const DeleteSuccessModal: React.FC = ({
- show,
- onClose,
- // memberId,
-}) => {
- return (
-
-
-
-
- Delete Member
-
-
- Are you sure you want to delete Chad Bosewick ? All of your data will
- be permanently removed. This action cannot be undone. All
-
-
-
- Cancel
-
-
- Delete
-
-
-
-
- );
-};
-
-export default DeleteSuccessModal;
diff --git a/src/app/dashboard/(user-dashboard)/settings/_components/MemberInviteModal/index.tsx b/src/app/dashboard/(user-dashboard)/settings/_components/MemberInviteModal/index.tsx
deleted file mode 100644
index a1b63fc8c..000000000
--- a/src/app/dashboard/(user-dashboard)/settings/_components/MemberInviteModal/index.tsx
+++ /dev/null
@@ -1,67 +0,0 @@
-"use client";
-
-import { Link } from "lucide-react";
-import React from "react";
-
-import CustomButton from "~/components/common/common-button/common-button";
-import CustomInput from "~/components/common/input/input";
-import { Avatar, AvatarFallback } from "~/components/ui/avatar";
-import {
- Dialog,
- DialogContent,
- DialogOverlay,
- DialogTitle,
-} from "~/components/ui/dialog";
-import SelectInput from "../SelectInput";
-
-interface ModalProperties {
- show: boolean;
- onClose: () => void;
-}
-
-const InviteModal: React.FC = ({ show, onClose }) => {
- return (
-
-
-
-
-
- CN
- {" "}
-
- Invite to your Organization
-
-
-
-
-
{}}
- options={["Github", "Youtube"]}
- placeHolder="Select Organization"
- />
-
- }
- isLeftIconVisible={true}
- >
- Invite with link
-
- Send invites
-
-
-
-
- );
-};
-
-export default InviteModal;
diff --git a/src/app/dashboard/(user-dashboard)/settings/_components/ProfilePictureModal/index.tsx b/src/app/dashboard/(user-dashboard)/settings/_components/ProfilePictureModal/index.tsx
deleted file mode 100644
index 6d047a78a..000000000
--- a/src/app/dashboard/(user-dashboard)/settings/_components/ProfilePictureModal/index.tsx
+++ /dev/null
@@ -1,165 +0,0 @@
-"use client";
-
-import axios from "axios";
-import Image from "next/image";
-import { useState } from "react";
-
-import defaultProfilePic from "~/../public/images/pfp.jpg";
-import { getApiUrl } from "~/actions/getApiUrl";
-import CustomButton from "~/components/common/common-button/common-button";
-import { toast } from "~/components/ui/use-toast";
-import { CloudinaryAsset } from "~/types";
-
-interface ProfilePictureModalProperties {
- show: boolean;
- onClose: () => void;
- email: string;
- accessToken: string;
- profilePic: string;
- onUploadSuccess: (url: string | undefined) => void;
-}
-
-export default function ProfilePictureModal({
- show,
- onClose,
- email,
- accessToken,
- onUploadSuccess,
- profilePic,
-}: ProfilePictureModalProperties) {
- const [image, setImage] = useState();
- const [isPending, setIsPending] = useState(false);
-
- const uploadProfilePicture = async () => {
- if (!image) return;
-
- try {
- const formData = new FormData();
- formData.append("file", image);
- formData.append("DisplayPhoto", image);
- formData.append("upload_preset", "starterhouse");
- formData.append("api_key", "673723355315667");
-
- const response = await fetch(
- `https://api.cloudinary.com/v1_1/dnik53vns/image/upload`,
- {
- method: "POST",
- body: formData,
- },
- );
-
- const data: CloudinaryAsset = await response.json();
- const profilePictureUrl = data.url;
-
- const API_URL = `${await getApiUrl()}/api/v1/profile/${email}/picture`;
-
- setIsPending(true);
-
- await axios.put(
- API_URL,
- { DisplayPhoto: profilePictureUrl, Email: email },
- {
- headers: {
- Authorization: `Bearer ${accessToken}`,
- },
- },
- );
-
- toast({
- title: "Success!",
- description: "Profile picture updated successfully",
- });
-
- onUploadSuccess(profilePictureUrl);
- onClose();
- } catch {
- toast({
- title: "Error",
- description: "Failed to upload profile picture. Please try again.",
- });
- } finally {
- setIsPending(false);
- }
- };
-
- const deleteProfilePicture = async () => {
- try {
- const API_URL = `${await getApiUrl()}/api/v1/profile/${email}/picture`;
-
- await axios.delete(API_URL, {
- headers: {
- Authorization: `Bearer ${accessToken}`,
- },
- });
-
- toast({
- title: "Success!",
- description: "Profile picture deleted successfully",
- });
-
- // onUploadSuccess();
- onClose();
- } catch {
- toast({
- title: "Error",
- description: "Failed to delete profile picture. Please try again.",
- });
- }
- };
-
- if (!show) return;
-
- return (
-
-
-
Update Profile Picture
-
-
- {image ? (
-
- ) : (
-
- )}
-
-
-
- setImage(entries.target.files ? entries.target.files[0] : undefined)
- }
- className="mb-4"
- />
-
-
- Delete Picture
-
-
-
- Cancel
-
-
- Upload Picture
-
-
-
-
-
- );
-}
diff --git a/src/app/dashboard/(user-dashboard)/settings/_components/Search/index.tsx b/src/app/dashboard/(user-dashboard)/settings/_components/Search/index.tsx
deleted file mode 100644
index 3785681cc..000000000
--- a/src/app/dashboard/(user-dashboard)/settings/_components/Search/index.tsx
+++ /dev/null
@@ -1,26 +0,0 @@
-import { SearchIcon } from "lucide-react";
-
-interface SearcInputProperties {
- onSearch: (data: string) => void;
- placeholder: string;
-}
-const SearchInput = ({ onSearch, placeholder }: SearcInputProperties) => {
- return (
-
-
- {
- onSearch("");
- }}
- />
-
- );
-};
-
-export default SearchInput;
diff --git a/src/app/dashboard/(user-dashboard)/settings/_components/SelectInput/index.tsx b/src/app/dashboard/(user-dashboard)/settings/_components/SelectInput/index.tsx
deleted file mode 100644
index 333cda85a..000000000
--- a/src/app/dashboard/(user-dashboard)/settings/_components/SelectInput/index.tsx
+++ /dev/null
@@ -1,49 +0,0 @@
-import { ChevronDown } from "lucide-react";
-import { useState } from "react";
-
-interface SelectInputProperties {
- placeHolder: string;
- onSelect: (data: string) => void;
- label: string;
- value: string;
- options: string[];
-}
-const SelectInput = ({
- placeHolder,
- onSelect,
- label,
- value,
- options,
-}: SelectInputProperties) => {
- const [isDropdownOpen, setIsDropdownOpen] = useState(false);
- return (
-
-
-
- {label}
-
-
setIsDropdownOpen(!isDropdownOpen)}
- value={value}
- placeholder={placeHolder}
- />
-
- {isDropdownOpen && (
-
- {options.map((option) => (
-
onSelect(option)}
- >
- {option}
-
- ))}
-
- )}
-
- );
-};
-
-export default SelectInput;
diff --git a/src/app/dashboard/(user-dashboard)/settings/_components/deleteDropDown/index.tsx b/src/app/dashboard/(user-dashboard)/settings/_components/deleteDropDown/index.tsx
deleted file mode 100644
index 30519a616..000000000
--- a/src/app/dashboard/(user-dashboard)/settings/_components/deleteDropDown/index.tsx
+++ /dev/null
@@ -1,77 +0,0 @@
-import {
- DropdownMenu,
- DropdownMenuContent,
- DropdownMenuItem,
- DropdownMenuSeparator,
- DropdownMenuTrigger,
-} from "@radix-ui/react-dropdown-menu";
-import { Ellipsis } from "lucide-react";
-import { useEffect, useRef, useState } from "react";
-
-interface DeleteDropDownProperties {
- onDelete: () => void;
-}
-
-const DeleteDropDown = ({ onDelete }: DeleteDropDownProperties) => {
- const containerReference = useRef(null);
- const [open, setOpen] = useState(false);
-
- useEffect(() => {
- const handleClickOutside = (event: MouseEvent) => {
- if (
- containerReference.current &&
- !containerReference.current.contains(event.target as Node)
- ) {
- setOpen(false);
- }
- };
-
- if (open) {
- document.addEventListener("click", handleClickOutside);
- } else {
- document.removeEventListener("click", handleClickOutside);
- }
-
- return () => {
- document.removeEventListener("click", handleClickOutside);
- };
- }, [open]);
-
- const options: string[] = ["Delete Member"];
-
- return (
-
-
-
- {
- setOpen((previous) => !previous);
- }}
- >
-
-
-
-
-
- {open && (
-
-
- {options.map((option, index) => (
-
-
- {option}
-
-
- ))}
-
- )}
-
-
- );
-};
-
-export default DeleteDropDown;
diff --git a/src/app/dashboard/(user-dashboard)/settings/_components/member/index.tsx b/src/app/dashboard/(user-dashboard)/settings/_components/member/index.tsx
deleted file mode 100644
index 4df3a0290..000000000
--- a/src/app/dashboard/(user-dashboard)/settings/_components/member/index.tsx
+++ /dev/null
@@ -1,154 +0,0 @@
-import { ArrowRight } from "lucide-react";
-import { useEffect, useState } from "react";
-
-import CustomButton from "~/components/common/common-button/common-button";
-import { Card, CardContent, CardTitle } from "~/components/ui/card";
-import { Switch } from "~/components/ui/switch";
-import useApiUrl from "../../organization/members/member";
-import MemberCard from "../MemberCard";
-import DeleteSuccessModal from "../MemberDeleteModal";
-import InviteModal from "../MemberInviteModal";
-import SearchInput from "../Search";
-
-const Member = () => {
- const [showDeleteModal, setShowDeleteModal] = useState(false);
- const [showInviteModal, setShowInviteModal] = useState(false);
- const apiUrl = useApiUrl();
-
- useEffect(() => {
- const fetchData = async () => {
- // if (apiUrl) {
- // try {
- // const data = await fetchOrganization(apiUrl);
- // } catch (error) {
- // console.error("Error fetching organization data:", error);
- // }
- // }
- };
-
- fetchData();
- }, [apiUrl]);
-
- return (
-
-
- Member
-
- Manage who has access to this workspace
-
-
-
-
-
-
Invite Link
-
- This provides a unique URL that allows anyone to join your
- workspace
-
-
-
-
-
-
-
- This provides a unique URL that allows anyone to join your
- workspace
-
-
-
{
- // setShowInviteModal(true);
- }}
- >
- Copy
-
-
-
-
-
-
-
Manage members
-
- On the Free plan all members in a workspace are administrators.
- Upgrade to a paid plan to add the ability to assign or remove
- administrator roles.
-
- Go to Plans
-
-
-
-
-
-
-
-
- {}}
- />
-
-
{
- setShowInviteModal(true);
- }}
- >
- Invite People
-
-
- {
- setShowDeleteModal(true);
- }}
- setRole={() => {}}
- name="Emosivbe Promise"
- email="Promiseejiro43@gmail.com"
- image="https://github.com/shadcn.png"
- />
- {
- setShowDeleteModal(true);
- }}
- setRole={() => {}}
- name="Emosivbe Promise"
- email="Promiseejiro43@gmail.com"
- image="https://github.com/shadcn.png"
- />
-
-
-
-
- Export Members List
-
-
- Export a CSV with information of all members of your team
-
-
-
Export CSV
-
-
- {
- setShowDeleteModal(false);
- }}
- />
- {
- setShowInviteModal(false);
- }}
- show={showInviteModal}
- />
-
- );
-};
-
-export default Member;
diff --git a/src/app/dashboard/(user-dashboard)/settings/_components/roleDropDown/index.tsx b/src/app/dashboard/(user-dashboard)/settings/_components/roleDropDown/index.tsx
deleted file mode 100644
index 863dfcf6d..000000000
--- a/src/app/dashboard/(user-dashboard)/settings/_components/roleDropDown/index.tsx
+++ /dev/null
@@ -1,90 +0,0 @@
-import {
- DropdownMenu,
- DropdownMenuContent,
- DropdownMenuItem,
- DropdownMenuSeparator,
- DropdownMenuTrigger,
-} from "@radix-ui/react-dropdown-menu";
-import { ChevronDown } from "lucide-react";
-import { useEffect, useRef, useState } from "react";
-
-interface RoleDropDownProperties {
- onChange: (data: string) => void;
-}
-
-const RoleDropDown = ({ onChange }: RoleDropDownProperties) => {
- const containerReference = useRef(null);
- const [open, setOpen] = useState(false);
- const [value, setValue] = useState("Admin");
-
- useEffect(() => {
- const handleClickOutside = (event: MouseEvent) => {
- if (
- containerReference.current &&
- !containerReference.current.contains(event.target as Node)
- ) {
- setOpen(false);
- }
- };
-
- if (open) {
- document.addEventListener("click", handleClickOutside);
- } else {
- document.removeEventListener("click", handleClickOutside);
- }
-
- return () => {
- document.removeEventListener("click", handleClickOutside);
- };
- }, [open]);
-
- const options: string[] = ["Admin", "User", "Guest"];
-
- return (
-
-
-
- {
- setOpen((previous) => !previous);
- }}
- >
-
- {value}
-
-
-
-
-
-
- {open && (
-
-
-
- {options.map((option, index) => (
- {
- setValue(option);
- }}
- >
- {
- setOpen(false);
- onChange(option);
- }}
- className={`cursor-pointer rounded px-[8px] py-[6px] text-[14px] hover:border-none hover:bg-slate-50 hover:outline-none`}
- >
- {option}
-
-
- ))}
-
- )}
-
-
- );
-};
-
-export default RoleDropDown;
diff --git a/src/app/dashboard/(user-dashboard)/settings/general/icons.tsx b/src/app/dashboard/(user-dashboard)/settings/general/icons.tsx
deleted file mode 100644
index 8a0b8c8e1..000000000
--- a/src/app/dashboard/(user-dashboard)/settings/general/icons.tsx
+++ /dev/null
@@ -1,59 +0,0 @@
-export const XIcon = ({ className }: { className?: string }) => {
- return (
-
-
-
- );
-};
-
-export const InstagramIcon = ({ className }: { className?: string }) => {
- return (
-
-
-
- );
-};
-
-export const LinkedinIcon = ({ className }: { className?: string }) => {
- return (
-
-
-
- );
-};
diff --git a/src/app/dashboard/(user-dashboard)/settings/general/page.tsx b/src/app/dashboard/(user-dashboard)/settings/general/page.tsx
deleted file mode 100644
index e4a0013b0..000000000
--- a/src/app/dashboard/(user-dashboard)/settings/general/page.tsx
+++ /dev/null
@@ -1,340 +0,0 @@
-"use client";
-
-import axios from "axios";
-import { useSession } from "next-auth/react";
-import Image from "next/image";
-import { ChangeEvent, useEffect, useState } from "react";
-
-import defaultProfilePic from "~/../public/images/pfp.jpg";
-import { getApiUrl } from "~/actions/getApiUrl";
-import CustomButton from "~/components/common/common-button/common-button";
-import CustomInput from "~/components/common/input/input";
-import ProfileUpdateSuccessModal from "~/components/common/modals/profile-update-success";
-import { Textarea } from "~/components/common/text-area";
-import {
- Select,
- SelectContent,
- SelectItem,
- SelectTrigger,
- SelectValue,
-} from "~/components/ui/select";
-import { useToast } from "~/components/ui/use-toast";
-import ProfilePictureModal from "../_components/ProfilePictureModal";
-import { InstagramIcon, LinkedinIcon, XIcon } from "./icons";
-
-const pronouns = [
- { value: "He/Him", label: "He/Him" },
- { value: "She/Her", label: "She/Her" },
- { value: "Other", label: "Other" },
-];
-
-export default function UserSettingsPage() {
- const { toast } = useToast();
- const { data } = useSession();
-
- const [error, setError] = useState();
- const [isSuccess, setIsSuccess] = useState(false);
- const [showProfilePictureModal, setShowProfilePictureModal] = useState(false);
- const [profilePicture, setProfilePicture] = useState();
- const openProfilePictureModal = () => setShowProfilePictureModal(true);
-
- const [isPending, setIsPending] = useState(false);
-
- const [pronoun, setPronoun] = useState("");
-
- const [formData, setFormData] = useState({
- user_name: "",
- job_title: "",
- department: "",
- email: "",
- bio: "",
- first_name: "",
- last_name: "",
- facebook_link: "",
- twitter_link: "",
- linkedin_link: "",
- });
-
- const formDataHandler = (
- event: ChangeEvent,
- ) => {
- setFormData((previous) => ({
- ...previous,
- [event.target.name]: event.target.value,
- }));
- };
-
- useEffect(() => {
- (async () => {
- const baseUrl = await getApiUrl();
- const API_URL = `${baseUrl}/api/v1/users/${data?.user.id}`;
- try {
- const response = await axios.get(API_URL, {
- headers: {
- Authorization: `Bearer ${data?.access_token}`,
- },
- });
-
- if (response?.data) {
- const userData = response?.data?.profile;
- setPronoun(userData.pronoun || "");
-
- setFormData({
- bio: userData.bio || "",
- job_title: userData.job_title || "",
- email: userData.email || "",
- department: userData.department || "",
- user_name: userData.user_name || "",
- first_name: userData.first_name || "",
- last_name: userData.last_name || "",
- facebook_link: userData.facebook_link || "",
- twitter_link: userData.twitter_link || "",
- linkedin_link: userData.linkedin_link || "",
- });
- setProfilePicture(response?.data.avatar_url || defaultProfilePic.src);
- }
- } catch {
- setError("An error occurred while retrieving your information");
- }
- })();
- }, [data?.access_token, data?.user.id]);
-
- const submit = async () => {
- if (!isValidInstagramUrl(formData.facebook_link)) {
- return toast({
- title: "Warning!",
- description: "Enter a valid Instagram url",
- });
- }
- if (!isValidLinkedInUrl(formData.linkedin_link)) {
- return toast({
- title: "Warning!",
- description: "Enter a valid Linkedin url",
- });
- }
-
- try {
- setIsPending(true);
-
- setIsSuccess(true);
- } catch {
- setIsPending(false);
- } finally {
- setIsPending(false);
- }
- };
-
- return (
-
-
-
-
setShowProfilePictureModal(false)}
- accessToken={data?.access_token ?? ""}
- onUploadSuccess={(newProfilePictureUrl) =>
- setProfilePicture(newProfilePictureUrl)
- }
- />
-
-
-
-
-
-
-
- Pronouns
-
- setPronoun(value)}
- >
-
-
-
-
- {pronouns.map((pronoun) => (
-
- {pronoun.label}
-
- ))}
-
-
-
-
-
-
-
-
-
-
-
-
- Bio
-
-
-
-
- Maximum of 64 characters
-
-
-
-
-
Connect Social Links
-
-
-
-
-
- Cancel
-
-
- Save Changes
-
-
- {isSuccess && (
-
setIsSuccess(false)}
- />
- )}
-
-
- );
-}
-
-function isValidLinkedInUrl(url: string) {
- const linkedInRegex = /^(https?:\/\/)?(www\.)?linkedin\.com\/[\w/-]+\/?$/;
- return linkedInRegex.test(url);
-}
-
-function isValidInstagramUrl(url: string) {
- const instagramRegex = /^(https?:\/\/)?(www\.)?instagram\.com\/[\w.]+\/?$/;
- return instagramRegex.test(url);
-}
diff --git a/src/app/dashboard/(user-dashboard)/settings/organization/members/member.ts b/src/app/dashboard/(user-dashboard)/settings/organization/members/member.ts
deleted file mode 100644
index bd613b121..000000000
--- a/src/app/dashboard/(user-dashboard)/settings/organization/members/member.ts
+++ /dev/null
@@ -1,73 +0,0 @@
-import axios from "axios";
-import { useEffect, useState } from "react";
-
-import { getApiUrl } from "~/actions/getApiUrl";
-import { useToast } from "~/components/ui/use-toast";
-
-const useApiUrl = () => {
- const [apiUrl, setApiUrl] = useState("");
- const { toast } = useToast();
-
- useEffect(() => {
- const fetchApiUrl = async () => {
- try {
- const url = await getApiUrl();
- setApiUrl(url);
- } catch {
- toast({
- title: "Error",
- description: "Failed to fetch API URL",
- variant: "destructive",
- });
- }
- };
-
- fetchApiUrl();
- }, [toast]);
-
- return apiUrl;
-};
-
-export default useApiUrl;
-
-// Function to fetch organization members
-export const fetchOrganization = async (apiUrl: string) => {
- const response = await axios.get(`${apiUrl}/api/v1/`);
- return response.data;
-};
-
-// Function to fetch a member
-export const fetchMember = async (apiUrl: string) => {
- const response = await axios.get(`${apiUrl}/api/v1/:org_id/members`);
- return response.data;
-};
-
-// Function to update member role
-export const updateMemberRole = async (apiUrl: string, data: object) => {
- const response = await axios.patch(`${apiUrl}/api/v1/member/:id`, data);
- return response.data;
-};
-
-// Function to delete a member
-export const deleteMember = async (apiUrl: string) => {
- const response = await axios.delete(`${apiUrl}/api/v1/members/:id`);
- return response.data;
-};
-
-// Function to export members
-export const exportMembers = async (apiUrl: string) => {
- const response = await axios.get(`${apiUrl}/api/v1/members/export`);
- return response.data;
-};
-
-// Function to generate an invite link
-export const generateInviteLink = async (apiUrl: string) => {
- const response = await axios.patch(`${apiUrl}/api/v1/invite/`);
- return response.data;
-};
-
-// Function to send invites to members
-export const sendInviteToMembers = async (apiUrl: string) => {
- const response = await axios.post(`${apiUrl}/api/v1/invite`);
- return response.data;
-};
diff --git a/src/app/dashboard/(user-dashboard)/settings/organization/members/page.tsx b/src/app/dashboard/(user-dashboard)/settings/organization/members/page.tsx
deleted file mode 100644
index 439fcbe1e..000000000
--- a/src/app/dashboard/(user-dashboard)/settings/organization/members/page.tsx
+++ /dev/null
@@ -1,211 +0,0 @@
-"use client";
-
-import { EllipsisIcon } from "lucide-react";
-import { useState } from "react";
-
-import CustomButton from "~/components/common/common-button/common-button";
-import { Input } from "~/components/common/input";
-import InviteMemberModal from "~/components/common/modals/invite-member";
-import {
- Select,
- SelectContent,
- SelectGroup,
- SelectItem,
- SelectLabel,
- SelectTrigger,
- SelectValue,
-} from "~/components/ui/select";
-import { useToast } from "~/components/ui/use-toast";
-
-type Member = {
- avatar?: string;
- id: number;
- name: string;
- email: string;
- role: string;
-};
-
-const memberData: Member[] = [
- {
- avatar: "CB",
- id: 1,
- name: "Chad Bosewick",
- email: "ChadBoseW@gmail.com",
- role: "Admin",
- },
- {
- avatar: "SN",
- id: 2,
- name: "Chad Bosewick",
- email: "ChadBoseW@gmail.com",
- role: "Admin",
- },
- {
- avatar: "CB",
- id: 3,
- name: "Chad Bosewick",
- email: "ChadBoseW@gmail.com",
- role: "Admin",
- },
- {
- avatar: "CB",
- id: 4,
- name: "Chad Bosewick",
- email: "ChadBoseW@gmail.com",
- role: "Admin",
- },
- {
- avatar: "CB",
- id: 5,
- name: "Chad Bosewick",
- email: "ChadBoseW@gmail.com",
- role: "Admin",
- },
-];
-
-const activeMembers: number = memberData.length;
-
-const Members = () => {
- const [isModalOpen, setIsModalOpen] = useState(false);
-
- const { toast } = useToast();
- const handleCopy = () => {
- navigator.clipboard.writeText("https://example.com").then(() => {
- toast({
- description: "Invite link copied to clipboard.",
- });
- });
- };
-
- const handleModalOpen = () => {
- setIsModalOpen(true);
- };
-
- const handleModalClose = () => {
- setIsModalOpen(false);
- };
- return (
-
-
-
Members
-
- Manage who has access to this workspace
-
-
-
-
-
-
Invite Link
-
- This provides a unique URL that allows anyone to join your
- workspace
-
-
-
-
-
-
-
- https://www.figma.com/design/7hCSTNzQOJLl9aww6wEEd1/Managing-Users----Team-Learn-AI?node-i
-
-
- Copy link
-
-
-
-
-
Manage members
-
- On the Free plan all members in a workspace are administrators.
- Upgrade to a paid plan to add the ability to assign or remove
- administrator roles. Go to Plans
-
-
-
-
-
-
-
-
-
-
-
- Roles
- Name
- Email
-
-
-
-
-
- Invite people
-
-
-
-
{activeMembers} active members
-
-
-
-
Export Members List
-
- Export a CSV with information of all members of your team
-
-
-
Export CSV
-
-
-
-
- );
-};
-
-export default Members;
diff --git a/src/app/dashboard/(user-dashboard)/settings/payment-information/upgrade/_components/upgrade.tsx b/src/app/dashboard/(user-dashboard)/settings/payment-information/upgrade/_components/upgrade.tsx
deleted file mode 100644
index 8ad078e4c..000000000
--- a/src/app/dashboard/(user-dashboard)/settings/payment-information/upgrade/_components/upgrade.tsx
+++ /dev/null
@@ -1,232 +0,0 @@
-"use client";
-
-import { ArrowLeft, ChevronDown, ChevronUp } from "lucide-react";
-import Image from "next/image";
-import Link from "next/link";
-import { useRouter } from "next/navigation";
-import { useState } from "react";
-
-import CustomButton from "~/components/common/common-button/common-button";
-import CustomInput from "~/components/common/input/input";
-import PlanUpgradeSuccessfulModal from "~/components/common/modals/plan-upgrade-successful";
-
-const billingOption = [
- {
- name: "Pay monthly",
- description: "$20/ month/member ",
- },
- {
- name: "Pay yearly",
- description: "$200/ year/member ",
- },
-];
-
-const paymentMethod = [
- {
- name: "Credit Card",
- icon: "/user-dashboard/svg/credit-card.svg",
- width: 64,
- },
- {
- name: "Stripe Payment",
- icon: "/user-dashboard/svg/stripe-logo.svg",
- width: 84,
- },
- {
- name: "Paypal Payment",
- icon: "/user-dashboard/svg/paypal-logo.svg",
- width: 153,
- },
-];
-
-const Upgrade = () => {
- const [open, setOpen] = useState(false);
- const router = useRouter();
-
- const [isDetailsVisible, setIsDetailsVisible] = useState(false);
-
- const toggleDetails = () => {
- setIsDetailsVisible(!isDetailsVisible);
- };
-
- return (
-
-
-
-
- router.back()} title="Back">
-
-
-
- Upgrade to Basic
-
-
-
- Do more with unlimited users and Integration when you upgrade
-
-
-
-
-
-
-
-
-
-
- Billing Option
-
-
-
- {billingOption.map((item, index) => (
-
-
-
-
-
-
{item.name}
-
- {item.description}
-
-
-
-
-
-
- ))}
-
-
-
-
- $20 /month
- : }
- isRightIconVisible={true}
- size="sm"
- onClick={toggleDetails}
- >
- Details
-
-
-
- {isDetailsVisible && (
-
-
- Members in your workspace
- 1
-
-
- x$20/month/member
- $20
-
-
-
- Subtotal
- $20
-
-
- Tax if applicable
- $20
-
-
- )}
-
-
-
-
-
- Choose Payment Method
-
-
-
-
-
-
-
-
-
-
- By submitting this form, you confirm that you agree to our{" "}
-
- Terms of Service
- {" "}
- and{" "}
-
- Privacy Policy
-
- .
-
-
-
-
-
setOpen(true)}
- >
- Proceed to Payment
-
-
-
- setOpen(!open)} show={open} />
-
- );
-};
-
-export default Upgrade;
diff --git a/src/app/dashboard/(user-dashboard)/settings/payment-information/upgrade/page.tsx b/src/app/dashboard/(user-dashboard)/settings/payment-information/upgrade/page.tsx
deleted file mode 100644
index 936f4f49c..000000000
--- a/src/app/dashboard/(user-dashboard)/settings/payment-information/upgrade/page.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-import Upgrade from "./_components/upgrade";
-
-const page = () => {
- return ;
-};
-
-export default page;
diff --git a/src/app/dashboard/(user-dashboard)/users/page.tsx b/src/app/dashboard/(user-dashboard)/users/page.tsx
deleted file mode 100644
index 82e20d09f..000000000
--- a/src/app/dashboard/(user-dashboard)/users/page.tsx
+++ /dev/null
@@ -1,127 +0,0 @@
-"use client";
-
-import {
- Select,
- SelectContent,
- SelectGroup,
- SelectItem,
- SelectLabel,
- SelectTrigger,
- SelectValue,
-} from "@radix-ui/react-select";
-import { Download, Filter, Printer } from "lucide-react";
-import { useEffect, useState } from "react";
-
-import { fetchUserData } from "~/actions/user";
-import { users } from "~/components/adminDashboard/userData";
-import CardComponent from "~/components/common/DashboardCard/CardComponent";
-import { UserLoginData, UserTable } from "../_components/UserTable/page";
-
-function formatDateTime(dateTimeString: string): string {
- const date = new Date(dateTimeString);
- const options: Intl.DateTimeFormatOptions = {
- year: "numeric",
- month: "long",
- day: "numeric",
- hour: "2-digit",
- minute: "2-digit",
- second: "2-digit",
- hour12: true,
- };
-
- return date.toLocaleString(undefined, options);
-}
-
-const Users = () => {
- const [userData, setUserData] = useState([]);
- const [loading, setLoading] = useState(true);
- const [error, setError] = useState();
-
- useEffect(() => {
- const loadData = async () => {
- if (error) {
- return;
- }
- try {
- const userdata = await fetchUserData();
- if (userdata?.data?.data) {
- const mappedData: UserLoginData[] = userdata.data.data.map(
- (item: UserLoginData, index: number) => ({
- id: index + 1, // Ensure id is a number
- name: "Oladipo Munirat",
- email: "oladipomunirat@gmail.com",
- img: "",
- role: "User",
- loginTime: formatDateTime(item.loginTime),
- status: item.logoutTime ? "success" : "failure",
- ipAddress: item.ipAddress,
- logoutTime: item.logoutTime ?? undefined, // Handle null if logoutTime can be undefined
- }),
- );
- setUserData(mappedData);
- } else {
- setError("No data available");
- }
- } catch (error) {
- const errorMessage =
- (error as Error).message || "Failed to fetch user data";
- setError(errorMessage);
- } finally {
- setLoading(false);
- }
- };
-
- loadData();
- }, [error]);
-
- return (
-
-
- {users.map((card, index) => (
-
- ))}
-
-
-
-
Users Tracking
-
Manage Users & Track Activity
-
-
-
-
-
-
-
-
-
-
- Filter by:
- Inactive
- Latest Records
- Oldest Records
- Roles
-
-
-
-
-
-
- {loading ?
Loading...
:
}
-
- );
-};
-
-export default Users;
diff --git a/src/app/dashboard/layout.tsx b/src/app/dashboard/layout.tsx
deleted file mode 100644
index 84430821d..000000000
--- a/src/app/dashboard/layout.tsx
+++ /dev/null
@@ -1,41 +0,0 @@
-import { getAllNotifications } from "~/actions/notifications/getAllNotifications";
-import { getAnalytics, getStatistics } from "~/actions/organization";
-import { getAllProduct } from "~/actions/product";
-import OrgContextProvider from "~/contexts/orgContext";
-import { auth } from "~/lib/auth";
-
-interface GeneralLayoutProperties {
- children: React.ReactNode;
-}
-
-export default async function GeneralLayout(
- properties: GeneralLayoutProperties,
-) {
- const session = await auth();
-
- if (!session || !session.currentOrgId) {
- return;
- }
-
- const { children } = properties;
-
- const [notifications, statistics, analytics, products] = await Promise.all([
- getAllNotifications(),
- getStatistics(),
- getAnalytics(),
- getAllProduct(session?.currentOrgId),
- ]);
-
- return (
-
- {children}
-
- );
-}
diff --git a/src/app/error.tsx b/src/app/error.tsx
deleted file mode 100644
index 9454372b6..000000000
--- a/src/app/error.tsx
+++ /dev/null
@@ -1,29 +0,0 @@
-"use client";
-
-import { CircleAlert } from "lucide-react";
-import { useEffect } from "react";
-
-export default function Error({
- error,
- reset,
-}: {
- error: Error & { digest?: string };
- reset: () => void;
-}) {
- useEffect(() => {}, [error]);
-
- return (
-
-
-
- Something went wrong!
-
- reset()}
- >
- Try again
-
-
- );
-}
diff --git a/src/app/error/page.tsx b/src/app/error/page.tsx
deleted file mode 100644
index 54d3a366d..000000000
--- a/src/app/error/page.tsx
+++ /dev/null
@@ -1,39 +0,0 @@
-"use client";
-
-import { useSearchParams } from "next/navigation";
-
-enum Error {
- Configuration = "Configuration",
-}
-
-const errorMap = {
- [Error.Configuration]: (
-
- There was a problem when trying to authenticate. Please contact us if this
- error persists. Unique error code:{" "}
- Configuration
-
- ),
-};
-
-export default function AuthErrorPage() {
- const search = useSearchParams();
- const error = search.get("error") as Error;
-
- return (
-
- );
-}
diff --git a/src/app/globals.css b/src/app/globals.css
index 0c2b47f84..cc5b9bfcf 100644
--- a/src/app/globals.css
+++ b/src/app/globals.css
@@ -1,12 +1,11 @@
+@import 'swiper/css';
+@import 'swiper/css/navigation';
+@import 'swiper/css/pagination';
+@import 'swiper/css/scrollbar';
@tailwind base;
@tailwind components;
@tailwind utilities;
-@import "swiper/css";
-@import "swiper/css/navigation";
-@import "swiper/css/pagination";
-@import "swiper/css/scrollbar";
-
@layer base {
:root {
--background: 0 0% 98%;
@@ -91,78 +90,6 @@
}
}
-#nprogress .bar {
- background: linear-gradient(90deg, #fff0bf, #f85318) !important;
- box-shadow: 10px 0px 20px rgba(255, 240, 191, 0.641) !important;
- position: fixed;
- z-index: 99999999 !important;
- top: 0;
- left: 0;
- width: 100%;
- height: 4px !important;
-}
-@layer base {
- * {
- @apply border-border;
- }
- body {
- @apply bg-background text-foreground;
- }
-}
-
-[data-placeholder="true"] {
- background: linear-gradient(
- 90deg,
- rgba(0, 0, 0, 0) 0%,
- rgba(0, 0, 0, 0.129) 50%,
- rgba(7, 7, 7, 0) 100%
- );
- background-size: cover;
- transform: translateX(-120%);
-
- animation: shimmer 1s ease-in-out infinite;
-}
-
-@keyframes shimmer {
- 0% {
- transform: translateX(-120%);
- }
- 50% {
- transform: translateX(-120%);
- }
- 100% {
- transform: translateX(100%);
- }
-}
-.spinner_V8m1 {
- transform-origin: center;
- animation: spinner_zKoa 2s linear infinite;
-}
-.spinner_V8m1 circle {
- stroke-linecap: round;
- animation: spinner_YpZS 1.5s ease-in-out infinite;
-}
-@keyframes spinner_zKoa {
- 100% {
- transform: rotate(360deg);
- }
-}
-@keyframes spinner_YpZS {
- 0% {
- stroke-dasharray: 0 150;
- stroke-dashoffset: 0;
- }
- 47.5% {
- stroke-dasharray: 42 150;
- stroke-dashoffset: -16;
- }
- 95%,
- 100% {
- stroke-dasharray: 42 150;
- stroke-dashoffset: -59;
- }
-}
-
.show_scrollbar::-webkit-scrollbar {
height: 8px;
}
@@ -210,3 +137,75 @@
body {
-ms-overflow-style: scrollbar; /* Standard scrollbar */
}
+
+/* Framer Btn */
+.radial-gradient {
+ background: radial-gradient(
+ circle at 50% 0%,
+ hsl(25 95% 53%),
+ transparent 60%
+ ),
+ hsl(25 95% 53%);
+}
+.linear-mask {
+ mask-image: linear-gradient(
+ -75deg,
+ white calc(var(--x) + 20%),
+ transparent calc(var(--x) + 30%),
+ white calc(var(--x) + 100%)
+ );
+
+ -webkit-mask-image: linear-gradient(
+ -75deg,
+ white calc(var(--x) + 20%),
+ transparent calc(var(--x) + 30%),
+ white calc(var(--x) + 100%)
+ );
+}
+.linear-overlay {
+ background: linear-gradient(
+ -75deg,
+ hsl(25 95% 53%) calc(var(--x) + 20%),
+ rgb(255, 255, 255) calc(var(--x) + 25%),
+ hsl(25 95% 53%) calc(var(--x) + 100%)
+ );
+ mask:
+ linear-gradient(black, black) content-box,
+ linear-gradient(black, black);
+ -webkit-mask:
+ linear-gradient(black, black) content-box,
+ linear-gradient(black, black);
+ mask-composite: exclude;
+ -webkit-mask-composite: xor;
+}
+
+/* Framer Btn */
+
+.spinner_V8m1 {
+ transform-origin: center;
+ animation: spinner_zKoa 2s linear infinite;
+}
+.spinner_V8m1 circle {
+ stroke-linecap: round;
+ animation: spinner_YpZS 1.5s ease-in-out infinite;
+}
+@keyframes spinner_zKoa {
+ 100% {
+ transform: rotate(360deg);
+ }
+}
+@keyframes spinner_YpZS {
+ 0% {
+ stroke-dasharray: 0 150;
+ stroke-dashoffset: 0;
+ }
+ 47.5% {
+ stroke-dasharray: 42 150;
+ stroke-dashoffset: -16;
+ }
+ 95%,
+ 100% {
+ stroke-dasharray: 42 150;
+ stroke-dashoffset: -59;
+ }
+}
diff --git a/src/app/guides/page.tsx b/src/app/guides/page.tsx
deleted file mode 100644
index 2219118d0..000000000
--- a/src/app/guides/page.tsx
+++ /dev/null
@@ -1,306 +0,0 @@
-"use client";
-
-import { Orbit, Plus } from "lucide-react";
-import { FC } from "react";
-
-import CustomButton from "~/components/common/common-button/common-button";
-
-const StyleGuide: FC = () => {
- return (
-
- Color Guides
-
-
- bg-default, text-background
-
-
- bg-background, text-foreground
-
-
- bg-primary, text-background
-
-
- bg-subtle, text-foreground
-
-
- bg-neutral-dark-1, text-background
-
-
- bg-neutral-dark-2, text-background
-
-
-
- bg-error, text-background
-
-
- bg-destructive, text-background
-
-
- bg-warning, text-background
-
-
- bg-success, text-background
-
-
- border-border, text-foreground
-
-
- Button Variants
-
-
-
Default Button
-
- Button CTA
-
-
-
-
Primary Button
-
- Button CTA
-
-
-
-
Destructive Button
-
- Button CTA
-
-
-
-
Subtle Button
-
- Button CTA
-
-
-
-
- With Icon Default Button
-
-
- }>
- Button CTA
-
-
-
-
-
- With Icon Primary Button
-
-
- }
- >
- Button CTA
-
-
-
-
-
-
Outline Button
-
- Button CTA
-
-
-
-
- Link With Left Icon Button
-
-
- }
- >
- Button CTA
-
-
-
-
-
- Link With Right Icon Button
-
-
- }
- >
- Button CTA
-
-
-
-
-
Link Button
-
-
- Button CTA
-
-
-
-
-
Icon Only Button
-
- }
- />
-
-
-
-
- Icon Only Circle Button
-
-
- }
- />
-
-
-
- Usage
-
-
-
Import the custom button component
-
-
- import CustomButton from{" "}
-
- "~/components/common/Button/button"
-
- ;
-
-
-
-
-
Variant Types
-
-
- type Variant {"{"}
-
-
- default
- primary
- destructive
- subtle
- loading
- outline
- link
-
- {"}"}
-
-
-
-
Size Types
-
-
- type Size {"{"}
-
-
- default
- sm
- lg
- link
- icon
- circle
-
- {"}"}
-
-
-
-
Accepted Custom Button Props
-
-
- ButtonProps {"{"}
-
-
- variant?: Variant;
-
- size?: Size;
-
- icon?: React.ReactNode;
-
- children?:
- React.ReactNode;
-
- isLoading?: boolean;
-
- isIconOnly?: boolean;
-
- isLeftIconVisible?:
- boolean;
-
- isRightIconVisible?:
- boolean;
-
- isDisabled?: boolean;
-
- ariaLabel?: string;
-
- {"}"}
-
-
-
-
Example
-
-
- return (
-
-
- {"<"}
- CustomButton
-
-
- variant=
- "subtle" {" "}
-
-
-
- icon={"{ }"} {" "}
-
-
-
- isLeftIconVisible=
- {"{true}"}
-
-
- isLoading={false }{" "}
-
-
-
- isDisabled={false }{" "}
-
-
- {">"}
- Click Me
- {"<"} /
- CustomButton
- {">"}
-
-
);
-
-
-
-
- );
-};
-
-export default StyleGuide;
diff --git a/src/app/invite/page.tsx b/src/app/invite/page.tsx
deleted file mode 100644
index e03c03903..000000000
--- a/src/app/invite/page.tsx
+++ /dev/null
@@ -1,73 +0,0 @@
-"use client";
-
-import { useRouter } from "next/navigation"; // Import from next/navigation
-import { useCallback, useEffect } from "react";
-
-import { acceptInviteRequest } from "~/actions/inviteMembers";
-
-const extractToken = () => {
- const queryString = window.location.search.slice(1); // Remove the leading '?'
- const ampersandIndex = queryString.indexOf("&");
- return ampersandIndex === -1
- ? queryString
- : queryString.slice(0, Math.max(0, ampersandIndex));
-};
-
-const AcceptInvitePage = () => {
- const router = useRouter();
-
- // Memoized function to handle invite acceptance
- const handleAcceptInvite = useCallback(async () => {
- // Extract token using the function
- const token = extractToken();
-
- if (!token) {
- router.push("/error?message=Invalid invite link");
- return;
- }
-
- try {
- const response = await acceptInviteRequest(token);
-
- switch (response.status) {
- case 200: {
- // User was added, redirect to login page
- router.push("/login?message=Invite accepted, please login");
- break;
- }
- case 202: {
- // Redirect to registration page
- router.push("/register?message=Please complete registration");
- break;
- }
- case 422: {
- // Bad invite code, redirect to error page
- router.push("/error?message=Invalid invite code");
- break;
- }
- default: {
- // Handle unexpected status codes
- router.push(
- `/error?message=${response.error || "Unexpected error occurred"}`,
- );
- }
- }
- } catch {
- // Handle unexpected errors
- router.push("/error?message=An unexpected error occurred");
- }
- }, [router]);
-
- // Process the invite on page load
- useEffect(() => {
- handleAcceptInvite();
- }, [handleAcceptInvite]);
-
- return (
-
- );
-};
-
-export default AcceptInvitePage;
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index 8483b61e9..e281f6ed0 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -1,41 +1,25 @@
-import type { Metadata } from "next";
-import { Inter } from "next/font/google";
+import type { Metadata } from 'next'
+import { Inter } from 'next/font/google'
+import './globals.css'
+import { cn } from '~/utils'
+import { Providers } from './provider'
-import "./globals.css";
+const inter = Inter({ subsets: ['latin'] })
-import { NextIntlClientProvider } from "next-intl";
-import { getLocale, getMessages } from "next-intl/server";
-
-import Providers from "~/components/providers";
-import { Toaster } from "~/components/ui/toaster";
-import AuthProvider from "~/contexts/authContext";
-
-const inter = Inter({ subsets: ["latin"] });
export const metadata: Metadata = {
- title: "HNG Boilerplate",
- description: "HNG Boilerplate",
-};
-
-export default async function RootLayout({
+ title: 'HNG Boilerplate',
+ description: 'HNG Boilerplate',
+}
+export default function RootLayout({
children,
}: Readonly<{
- children: React.ReactNode;
+ children: React.ReactNode
}>) {
- const locale = await getLocale();
- const messages = await getMessages();
return (
-
-
-
-
-
-
- {children}
-
-
-
-
+
+
+ {children}
- );
+ )
}
diff --git a/src/app/not-found.tsx b/src/app/not-found.tsx
deleted file mode 100644
index b2dc0240f..000000000
--- a/src/app/not-found.tsx
+++ /dev/null
@@ -1,52 +0,0 @@
-"use client";
-
-import { ArrowLeft, Home } from "lucide-react";
-import Image from "next/image";
-import Link from "next/link";
-import { useRouter } from "next/navigation";
-
-import Particles404 from "~/components/error/Particles404";
-
-const NotFoundPage = () => {
- const router = useRouter();
-
- return (
-
-
-
-
-
- Page Not Found
-
-
-
-
router.back()}
- className="hover:text-accent-color pointer-events-auto flex items-center gap-x-2 rounded-xl border border-gray-200 bg-white px-4 py-2 transition-colors duration-300"
- >
-
- Back
-
-
-
- Home
-
-
-
-
- );
-};
-
-export default NotFoundPage;
diff --git a/src/app/provider.tsx b/src/app/provider.tsx
new file mode 100644
index 000000000..0b3113a67
--- /dev/null
+++ b/src/app/provider.tsx
@@ -0,0 +1,63 @@
+'use client'
+
+import {
+ QueryClient,
+ QueryClientProvider,
+ defaultShouldDehydrateQuery,
+ isServer,
+} from '@tanstack/react-query'
+import { ReactQueryDevtools } from '@tanstack/react-query-devtools'
+import { SessionProvider } from 'next-auth/react'
+import { Toaster as Sonner } from '~ui/sonner'
+import { AppProgressBar as ProgressBar } from 'next-nprogress-bar'
+import { ReactLenis } from 'lenis/react'
+import EnvironmentSwitcher from '~/components/enviroment-switcher'
+
+function makeQueryClient() {
+ return new QueryClient({
+ defaultOptions: {
+ queries: {
+ gcTime: 10 * MINUTE,
+ staleTime: 1 * MINUTE,
+ },
+ dehydrate: {
+ shouldDehydrateQuery: (query) =>
+ defaultShouldDehydrateQuery(query) ||
+ query.state.status === 'pending',
+ },
+ },
+ })
+}
+
+let browserQueryClient: QueryClient | undefined = undefined
+
+function getQueryClient() {
+ if (isServer) {
+ return makeQueryClient()
+ } else {
+ if (!browserQueryClient) browserQueryClient = makeQueryClient()
+ return browserQueryClient
+ }
+}
+
+const MINUTE = 1000 * 60
+
+export function Providers({ children }: { children: React.ReactNode }) {
+ const queryClient = getQueryClient()
+
+ return (
+
+
+
+ {children}
+
+
+
+
+
+ )
+}
diff --git a/src/app/special/page.tsx b/src/app/special/page.tsx
deleted file mode 100644
index d33eb7f5b..000000000
--- a/src/app/special/page.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-import PricingCard from "~/components/PricingCard";
-
-function Special() {
- return ;
-}
-
-export default Special;
diff --git a/src/app/status/layout.tsx b/src/app/status/layout.tsx
deleted file mode 100644
index fea466730..000000000
--- a/src/app/status/layout.tsx
+++ /dev/null
@@ -1,14 +0,0 @@
-import Navbar from "~/components/layouts/navbar";
-
-export default function StatusLayout({
- children,
-}: {
- children: React.ReactNode;
-}) {
- return (
- <>
-
- {children}
- >
- );
-}
diff --git a/src/app/status/page.tsx b/src/app/status/page.tsx
deleted file mode 100644
index 047c97b4c..000000000
--- a/src/app/status/page.tsx
+++ /dev/null
@@ -1,51 +0,0 @@
-import { Check } from "lucide-react";
-import { NextPage } from "next";
-import Link from "next/link";
-
-import PastIncidents from "~/components/status/PastIncidents";
-import StatusGrid from "~/components/status/StatusTable";
-
-const StatusPage: NextPage = () => {
- return (
-
-
-
- API Status Page
-
-
- This status page displays the API health status of HNG Boilerplate.
-
-
-
-
-
-
-
- All Systems Operational
-
-
-
-
-
- This status page displays the API health status of HNG Boilerplate.
-
-
-
- Uptime over the past 30 days.{" "}
-
- View historical uptime.
-
-
-
-
-
- );
-};
-
-export default StatusPage;
diff --git a/src/auth.ts b/src/auth.ts
new file mode 100644
index 000000000..819a8816e
--- /dev/null
+++ b/src/auth.ts
@@ -0,0 +1,29 @@
+import NextAuth, { type DefaultSession } from 'next-auth'
+
+import authConfig from '~/config/auth.config'
+import { Organisation, User } from '~/types'
+
+export const {
+ handlers: { GET, POST },
+ auth,
+ unstable_update,
+} = NextAuth({
+ ...authConfig,
+})
+
+declare module 'next-auth' {
+ interface Session {
+ user: {
+ id: User['id']
+ first_name: User['first_name']
+ last_name: User['last_name']
+ email: User['email']
+ image: User['avatar_url']
+ bio?: string
+ username?: string
+ is_superadmin?: boolean
+ } & DefaultSession['user']
+ access_token?: string
+ userOrg?: Organisation[]
+ }
+}
diff --git a/src/components/LenisProvider.tsx b/src/components/LenisProvider.tsx
deleted file mode 100644
index 6bd929bb8..000000000
--- a/src/components/LenisProvider.tsx
+++ /dev/null
@@ -1,9 +0,0 @@
-"use client";
-
-import { ReactLenis } from "lenis/react";
-
-function LenisProvider({ children }: { children: React.ReactNode }) {
- return {children} ;
-}
-
-export default LenisProvider;
diff --git a/src/components/PricingCard.tsx b/src/components/PricingCard.tsx
deleted file mode 100644
index 6abbda909..000000000
--- a/src/components/PricingCard.tsx
+++ /dev/null
@@ -1,51 +0,0 @@
-import { Check } from "lucide-react";
-
-function PricingCard() {
- return (
-
-
-
Advanced
-
-
- The essensitals to provide your best work for clients.
-
-
-
-
-
-
-
-
-
Up to 100 subscribers
-
-
-
-
-
-
-
24-hour support response time
-
-
-
-
-
-
- Upgrade to Advanced{" "}
-
-
- );
-}
-
-export default PricingCard;
diff --git a/src/components/layouts/aboutUs/CoreValues.tsx b/src/components/about/CoreValues.tsx
similarity index 55%
rename from src/components/layouts/aboutUs/CoreValues.tsx
rename to src/components/about/CoreValues.tsx
index 1d3145f64..e907cdf56 100644
--- a/src/components/layouts/aboutUs/CoreValues.tsx
+++ b/src/components/about/CoreValues.tsx
@@ -1,17 +1,15 @@
-import { useTranslations } from "next-intl";
-
const CoreValues = () => {
- const t = useTranslations("coreValues");
return (
-
- {t("title")}
+
+ Our Core Values
- {t("description")}
+ Our Value shapes the core of our organization, and defines the
+ character of our industry
@@ -21,19 +19,26 @@ const CoreValues = () => {
className="mb-3 text-[18px] font-[700] text-primary sm:text-[20px]"
data-testid="integrity"
>
- {t("values.integrity.title")}
+ Integrity
- {t("values.integrity.description")}
+ We uphold the highest ethical standards in everything we do,
+ fostering trust and transparency with our clients, partners, and
+ employees. We believe that honesty and integrity are the
+ foundation of lasting success.
- {t("values.customerCentricity.title")}
+ Customer Centricity
- {t("values.customerCentricity.description")}
+ Our customers are at the heart of our business. We strive to
+ understand their needs, exceed their expectations, and build
+ lasting relationships based on trust and mutual respect. We
+ believe that putting our customers first is the key to long-term
+ success.
@@ -42,26 +47,34 @@ const CoreValues = () => {
className="mb-3 text-[18px] font-[700] text-primary sm:text-[20px]"
data-testid="innovation"
>
- {t("values.innovation.title")}
+ Innovation
- {t("values.innovation.description")}
+ We embrace a culture of continuous improvement and creativity,
+ constantly seeking new ways to evolve and enhance our products,
+ services, and processes. We encourage experimentation and
+ risk-taking, recognizing that innovation is essential for
+ growth.
- {t("values.excellence.title")}
+ Excellence
- {t("values.excellence.description")}
+ We are committed to delivering exceptional quality in everything
+ we do, from our products and services to our customer
+ interactions and internal processes. We strive for continuous
+ improvement and hold ourselves to the highest standards of
+ performance.
- );
-};
+ )
+}
-export default CoreValues;
+export default CoreValues
diff --git a/src/components/layouts/aboutUs/ExecutiveTeam.tsx b/src/components/about/ExecutiveTeam.tsx
similarity index 95%
rename from src/components/layouts/aboutUs/ExecutiveTeam.tsx
rename to src/components/about/ExecutiveTeam.tsx
index 50bf68d6b..edb0dfd8e 100644
--- a/src/components/layouts/aboutUs/ExecutiveTeam.tsx
+++ b/src/components/about/ExecutiveTeam.tsx
@@ -1,4 +1,4 @@
-import TeamCard from "~/components/common/TeamCard/teamcard";
+import TeamCard from '../card/teamcard'
const ExecutiveTeam = () => {
return (
@@ -62,7 +62,7 @@ const ExecutiveTeam = () => {
- );
-};
+ )
+}
-export default ExecutiveTeam;
+export default ExecutiveTeam
diff --git a/src/components/about/Hero.tsx b/src/components/about/Hero.tsx
new file mode 100644
index 000000000..c2cc2ce57
--- /dev/null
+++ b/src/components/about/Hero.tsx
@@ -0,0 +1,29 @@
+import Image from 'next/image'
+import Heading from '../miscellaneous/heading'
+
+const Hero = () => {
+ return (
+
+ )
+}
+
+export default Hero
diff --git a/src/components/layouts/aboutUs/Join.tsx b/src/components/about/Join.tsx
similarity index 87%
rename from src/components/layouts/aboutUs/Join.tsx
rename to src/components/about/Join.tsx
index ae08331b7..1f759e617 100644
--- a/src/components/layouts/aboutUs/Join.tsx
+++ b/src/components/about/Join.tsx
@@ -1,10 +1,6 @@
-"use client";
-
-import Link from "next/link";
+import Link from 'next/link'
const Join = () => {
- //
-
return (
@@ -20,13 +16,13 @@ const Join = () => {
View
- );
-};
+ )
+}
-export default Join;
+export default Join
diff --git a/src/components/layouts/aboutUs/Mission.tsx b/src/components/about/Mission.tsx
similarity index 72%
rename from src/components/layouts/aboutUs/Mission.tsx
rename to src/components/about/Mission.tsx
index e8275a997..94bdacb02 100644
--- a/src/components/layouts/aboutUs/Mission.tsx
+++ b/src/components/about/Mission.tsx
@@ -1,8 +1,6 @@
-import { useTranslations } from "next-intl";
-import Image from "next/image";
+import Image from 'next/image'
const Mission = () => {
- const t = useTranslations("mission");
return (
@@ -21,21 +19,23 @@ const Mission = () => {
className="mb-3 text-lg font-[700] text-primary sm:text-xl"
data-testid="mission web"
>
- {t("title")}
+ Our Mission & Vision
- {t("subtitle")}
+ Leading the Way, Redefining Industries
- {t("description")}
+ At Hng Boilerplate, we are dedicated to exceeding your expectations.
+ We strive to understand your unique needs and challenges, providing
+ tailored solutions that drive real results and empower your success.
- );
-};
+ )
+}
-export default Mission;
+export default Mission
diff --git a/src/components/layouts/aboutUs/OurServices.tsx b/src/components/about/OurServices.tsx
similarity index 72%
rename from src/components/layouts/aboutUs/OurServices.tsx
rename to src/components/about/OurServices.tsx
index b6670e6dd..e8b19c343 100644
--- a/src/components/layouts/aboutUs/OurServices.tsx
+++ b/src/components/about/OurServices.tsx
@@ -1,20 +1,16 @@
-"use client";
-
-import { useTranslations } from "next-intl";
-import Image from "next/image";
+import Image from 'next/image'
const OurServices = () => {
- const t = useTranslations("ourServices");
return (
- {t("title")}
+ Our Services
- {t("description")}
+ Trained to Give You The Best
{
- {t("details")}
+ Since our founding in, Hng Boilerplate has been dedicated to
+ constantly evolving to stay ahead of the curve. Our agile mindset
+ and relentless pursuit of innovation ensure that you're always
+ equipped with the most effective tools and strategies.
- );
-};
+ )
+}
-export default OurServices;
+export default OurServices
diff --git a/src/components/adminDashboard/Chart.tsx b/src/components/adminDashboard/Chart.tsx
deleted file mode 100644
index 573982824..000000000
--- a/src/components/adminDashboard/Chart.tsx
+++ /dev/null
@@ -1,61 +0,0 @@
-import { Bar, BarChart, CartesianGrid, XAxis, YAxis } from "recharts";
-
-import { CardContent } from "~/components/ui/card";
-import {
- ChartConfig,
- ChartContainer,
- ChartTooltip,
- ChartTooltipContent,
-} from "~/components/ui/chart";
-
-type ChartProperties = {
- chartData: { month: string; revenue: number }[];
- chartConfig: ChartConfig;
-};
-
-export function Chart({ chartData = [], chartConfig }: ChartProperties) {
- return (
- <>
-
-
-
-
-
- value.slice(0, 3)}
- />
- `$${value}`}
- />
- }
- />
-
-
-
-
-
- >
- );
-}
diff --git a/src/components/adminDashboard/TopProductsComponent.tsx b/src/components/adminDashboard/TopProductsComponent.tsx
deleted file mode 100644
index 418e533d0..000000000
--- a/src/components/adminDashboard/TopProductsComponent.tsx
+++ /dev/null
@@ -1,70 +0,0 @@
-import { ArrowUpRightIcon } from "lucide-react";
-import { FC } from "react";
-
-import { Card } from "../ui/card";
-
-type ProductData = {
- name: string;
- amount: string;
-};
-
-type TopProductsProperties = {
- data: ProductData[];
- gradients: string[];
-};
-
-const TopProductsComponent: FC
= ({
- data,
- gradients,
-}) => {
- return (
-
-
-
-
- Top Products
-
-
- Your top selling products appear
- here.
-
-
-
- View All
-
-
-
-
- {data.map((item, index) => (
-
-
-
- {item.amount}
-
-
- ))}
-
-
- );
-};
-
-export default TopProductsComponent;
diff --git a/src/components/adminDashboard/cardData.ts b/src/components/adminDashboard/cardData.ts
deleted file mode 100644
index 0ecfe1135..000000000
--- a/src/components/adminDashboard/cardData.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-import type { LucideIconName } from "~/components/common/lucide-icon";
-
-type CardData = {
- title: string;
- value: string;
- description: string;
- icon: LucideIconName;
-};
-
-export const cardData: CardData[] = [
- {
- title: "Total Revenue",
- value: "$45,000.00",
- description: "+20% from last month",
- icon: "dollar-sign",
- },
- {
- title: "Total Users",
- value: "+4,000",
- description: "+10% from last month",
- icon: "user",
- },
- {
- title: "Total Products",
- value: "1,000",
- description: "+20% from last month",
- icon: "box",
- },
- {
- title: "Lifetime Sales",
- value: "$450,000.00",
- description: "+150% from last month",
- icon: "arrow-up-right",
- },
-];
diff --git a/src/components/adminDashboard/chartData.ts b/src/components/adminDashboard/chartData.ts
deleted file mode 100644
index 4314df6e2..000000000
--- a/src/components/adminDashboard/chartData.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import { ChartConfig } from "~/components/ui/chart";
-
-export const generateRandomRevenue = () =>
- (Math.floor(Math.random() * 11) + 1) * 500;
-
-export const chartData = [
- { month: "January", revenue: generateRandomRevenue() },
- { month: "February", revenue: generateRandomRevenue() },
- { month: "March", revenue: generateRandomRevenue() },
- { month: "April", revenue: generateRandomRevenue() },
- { month: "May", revenue: generateRandomRevenue() },
- { month: "June", revenue: generateRandomRevenue() },
- { month: "July", revenue: generateRandomRevenue() },
- { month: "August", revenue: generateRandomRevenue() },
- { month: "September", revenue: generateRandomRevenue() },
- { month: "October", revenue: generateRandomRevenue() },
- { month: "November", revenue: generateRandomRevenue() },
- { month: "December", revenue: generateRandomRevenue() },
-];
-
-export const chartConfig: ChartConfig = {
- desktop: {
- label: "Revenue",
- color: "#F97316",
- },
- mobile: {
- label: "Mobile",
- color: "#F97316",
- },
-};
diff --git a/src/components/adminDashboard/productData.ts b/src/components/adminDashboard/productData.ts
deleted file mode 100644
index 697e26b0f..000000000
--- a/src/components/adminDashboard/productData.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-const data = [
- {
- name: "The Lemonade blender",
- amount: "500 sales",
- },
- {
- name: "Bean Cake Powder",
- amount: "250 sales",
- },
- {
- name: "Flour Mixer",
- amount: "230 sales",
- },
- {
- name: "Blender",
- amount: "500 sales",
- },
- {
- name: "A Food Product",
- amount: "150 sales",
- },
- {
- name: "Cake Powder",
- amount: "100 sales",
- },
-];
-
-const gradients = [
- " linear-gradient(180deg, #F6C790 0%, #E77F1E 100%)",
- "linear-gradient(180deg, #D6F690 0%, #D7E71E 100%)",
- "linear-gradient(180deg, #9290F6 0%, #461EE7 100%)",
- " linear-gradient(180deg, #F690A8 0%, #E71E4E 100%)",
- "linear-gradient(180deg, #B4F690 0%, #64E71E 100%)",
- "linear-gradient(180deg, #E990F6 0%, #CB1EE7 100%)",
-];
-
-export { data, gradients };
diff --git a/src/components/adminDashboard/userData.ts b/src/components/adminDashboard/userData.ts
deleted file mode 100644
index 0300b0ebd..000000000
--- a/src/components/adminDashboard/userData.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import type { LucideIconName } from "~/components/common/lucide-icon";
-
-type UserData = {
- title: string;
- value: string;
- description: string;
- icon: LucideIconName;
-};
-
-export const users: UserData[] = [
- {
- title: "Total Users",
- value: "0",
- description: "+10% from last month",
- icon: "user",
- },
- {
- title: "Active Users",
- value: "0",
- description: "+10% from last month",
- icon: "box",
- },
- {
- title: "Inactive Users",
- value: "0",
- description: "+20% from last month",
- icon: "arrow-up-right",
- },
-];
diff --git a/src/components/auth/login.tsx b/src/components/auth/login.tsx
new file mode 100644
index 000000000..62d1e2d28
--- /dev/null
+++ b/src/components/auth/login.tsx
@@ -0,0 +1,261 @@
+'use client'
+
+import { zodResolver } from '@hookform/resolvers/zod'
+import { Eye, EyeOff, ShieldCheck } from 'lucide-react'
+import { signIn, useSession } from 'next-auth/react'
+import { useRouter } from 'next-nprogress-bar'
+import Link from 'next/link'
+import { useEffect, useState, useTransition } from 'react'
+import { useForm } from 'react-hook-form'
+import { toast } from 'sonner'
+import * as z from 'zod'
+import { credentialsAuth } from '~/actions/auth'
+import { setBackend } from '~/actions/nextauth'
+import { Checkbox } from '~/components/ui/checkbox'
+import {
+ Form,
+ FormControl,
+ FormField,
+ FormItem,
+ FormLabel,
+ FormMessage,
+} from '~/components/ui/form'
+import useEnvironmentStore from '~/hooks/global/use-enviroment'
+import { cn } from '~/utils'
+import { LoginSchema } from '~/schemas'
+import { Input } from '../ui/input'
+import GoogleLogo from '../icons/google-logo'
+import { Button } from '../ui/button'
+import FramerButton from '../ui/framer-button'
+
+const Login = () => {
+ const router = useRouter()
+ const [isLoading, startTransition] = useTransition()
+ const [showPassword, setShowPassword] = useState(false)
+ const { status } = useSession()
+ const { backend } = useEnvironmentStore()
+
+ useEffect(() => {
+ if (status === 'authenticated') {
+ router.push('/dashboard')
+ }
+ }, [status, router])
+
+ const form = useForm>({
+ resolver: zodResolver(LoginSchema),
+ defaultValues: {
+ email: '',
+ password: '',
+ rememberMe: false,
+ },
+ })
+ const onSubmit = async (values: z.infer) => {
+ const { email, password } = values
+
+ startTransition(async () => {
+ await setBackend(backend)
+ await credentialsAuth(values).then(async (result) => {
+ console.log(result)
+ if (result.success) {
+ await signIn('credentials', {
+ email,
+ password,
+ redirect: false,
+ })
+ toast.success('Login success', {
+ description: 'Redirecting',
+ })
+ router.push('/dashboard')
+ } else {
+ toast.error('Login failed', {
+ description: result.message || 'An error occurred during login',
+ })
+ }
+ })
+ })
+ }
+
+ const togglePasswordVisibility = () => {
+ setShowPassword(!showPassword)
+ }
+
+ return (
+
+
+
+
+ Login
+
+
+ Welcome back, you've been missed!
+
+
+
+ {
+ await setBackend(backend)
+ signIn('google', { redirectTo: '/' })
+ }}
+ disabled={isLoading || status === 'authenticated'}
+ variant="outline"
+ className="h-10 w-full gap-x-3"
+ >
+
+
+ Continue with Google
+
+
+
+
+
+ OR
+
+
+
+
+
+ (
+
+
+ Email
+
+
+
+
+
+
+ )}
+ />
+ (
+
+
+ Password
+
+
+
+
+
+ {showPassword ? (
+
+ ) : (
+
+ )}
+
+
+
+
+
+ )}
+ />
+
+
(
+
+
+
+
+
+ Remember me
+
+
+ )}
+ />
+
+
+ Forgot Password?
+
+
+
+
+
+
+
+
+ Sign in with magic link
+
+
+
+ Don't Have An Account?{' '}
+
+ Sign Up
+
+
+
+
+
+ By logging in, you agree to the{' '}
+
+ Terms of Service
+ {' '}
+ and{' '}
+
+ Privacy Policy
+
+
+
+
+ )
+}
+
+export default Login
diff --git a/src/components/auth/register.tsx b/src/components/auth/register.tsx
new file mode 100644
index 000000000..5761aedf4
--- /dev/null
+++ b/src/components/auth/register.tsx
@@ -0,0 +1,257 @@
+'use client'
+
+import { zodResolver } from '@hookform/resolvers/zod'
+import { Eye, EyeOff } from 'lucide-react'
+import { signIn, useSession } from 'next-auth/react'
+import { useRouter } from 'next-nprogress-bar'
+import Link from 'next/link'
+import { useState, useTransition } from 'react'
+import { useForm } from 'react-hook-form'
+import * as z from 'zod'
+import { registerUser } from '~/actions/auth'
+import {
+ Form,
+ FormControl,
+ FormField,
+ FormItem,
+ FormLabel,
+ FormMessage,
+} from '~/components/ui/form'
+import { cn } from '~/utils'
+import { RegisterSchema } from '~/schemas'
+import { Input } from '../ui/input'
+import { toast } from 'sonner'
+import { Button } from '~ui/button'
+import GoogleLogo from '../icons/google-logo'
+import FramerButton from '../ui/framer-button'
+import useEnvironmentStore from '~/hooks/global/use-enviroment'
+import { setBackend } from '~/actions/nextauth'
+
+const Register = () => {
+ const router = useRouter()
+ const { status } = useSession()
+ const [isLoading, startTransition] = useTransition()
+ const [showPassword, setShowPassword] = useState(false)
+ const { backend } = useEnvironmentStore()
+
+ if (status === 'authenticated') {
+ router.push('/dashboard')
+ }
+
+ const form = useForm>({
+ resolver: zodResolver(RegisterSchema),
+ defaultValues: {
+ email: '',
+ password: '',
+ first_name: '',
+ last_name: '',
+ },
+ })
+
+ const onSubmit = async (values: z.infer) => {
+ startTransition(async () => {
+ await registerUser(values, backend).then(async (data) => {
+ console.log(data)
+ toast[data.status === 201 ? 'success' : 'error'](
+ data.status === 201
+ ? 'Account created successfully'
+ : 'an error occurred',
+ {
+ description:
+ data.status === 201 ? 'verify your account' : data.error,
+ }
+ )
+ })
+ })
+ }
+
+ return (
+
+
+
+
+ Sign Up
+
+
+ Create an account to get started with us.
+
+
+
+ {
+ await setBackend(backend)
+ signIn('google', { redirectTo: '/' })
+ }}
+ disabled={isLoading || status === 'authenticated'}
+ variant="outline"
+ className="h-10 w-full gap-x-3"
+ >
+
+
+ Continue with Google
+
+
+
+
+
+ OR
+
+
+
+
+
+ (
+
+
+ First Name
+
+
+
+
+
+
+ )}
+ />
+ (
+
+
+ Last Name
+
+
+
+
+
+
+ )}
+ />
+ (
+
+
+ Email
+
+
+
+
+
+
+ )}
+ />
+ (
+
+
+ Password
+
+
+
+
+ setShowPassword(!showPassword)}
+ className="absolute inset-y-0 right-0 flex items-center pr-3"
+ >
+ {showPassword ? (
+
+ ) : (
+
+ )}
+
+
+
+
+
+ )}
+ />
+
+ {/*
+ {isLoading ? (
+
+ Logging in... {' '}
+
+
+ ) : (
+ Create Account
+ )}
+ */}
+
+
+
+
+ Already Have An Account?{' '}
+
+ Login
+
+
+
+
+ )
+}
+
+export default Register
diff --git a/src/components/blog/BlogCard.tsx b/src/components/blog/BlogCard.tsx
deleted file mode 100644
index 1a7dbae04..000000000
--- a/src/components/blog/BlogCard.tsx
+++ /dev/null
@@ -1,65 +0,0 @@
-import Image from "next/image";
-
-type New = {
- id: number;
- thumbnailUrl: string;
-};
-
-type newTypes = {
- id: number;
- name: string;
- color: string;
- title: string;
- date: string;
- timeRead: string;
-};
-
-const BlogCard = ({
- article,
- newsType,
-}: {
- article: New;
- newsType: newTypes;
-}) => {
- const { thumbnailUrl } = article;
- return (
-
-
-
-
- {newsType.title}
-
-
-
- {newsType.date}
-
-
-
- {newsType.timeRead}
-
-
-
-
-
- );
-};
-
-export default BlogCard;
diff --git a/src/components/card/card-platform.tsx b/src/components/card/card-platform.tsx
deleted file mode 100644
index 71074a5f9..000000000
--- a/src/components/card/card-platform.tsx
+++ /dev/null
@@ -1,90 +0,0 @@
-import Image from "next/image";
-
-import { cn } from "~/lib/utils";
-
-type PlatformCardProperties = {
- /**
- * Displaying the platform name or title.
- */
- heading: string;
- /**
- * Displaying the platform logo or icon.
- */
- logo: string;
- /**
- * Providing a brief overview of the platform.
- */
- description: string;
- /**
- * Additional class names for customizing the container style.
- */
- containerClassName?: string;
- /**
- * active status of the platform, true or false.
- */
- isActive: boolean;
- /**
- * onClick event to toggle the isActive status of a platform.
- */
- toggleSwitchHandler: () => void;
-};
-
-/**
- * A card component that displays platform details including a heading, logo, description, and a toggle switch.
- * The toggle switch allows admins to activate or deactivate the platform.
- *
- * @param {PlatformCardProps} props - The properties for the component.
- * @returns The CardPlatform component.
- */
-
-export default function CardPlatform({
- heading,
- logo,
- description,
- containerClassName,
- isActive,
- toggleSwitchHandler,
-}: PlatformCardProperties) {
- return (
-
-
-
-
- {heading}
-
-
{description}
-
-
- );
-}
diff --git a/src/components/common/TeamCard/teamcard.tsx b/src/components/card/teamcard.tsx
similarity index 79%
rename from src/components/common/TeamCard/teamcard.tsx
rename to src/components/card/teamcard.tsx
index ffaa5c2b3..6c5dc55a2 100644
--- a/src/components/common/TeamCard/teamcard.tsx
+++ b/src/components/card/teamcard.tsx
@@ -1,18 +1,17 @@
-import { Facebook, Instagram, Twitter } from "lucide-react";
-import Image from "next/image";
-import Link from "next/link";
-
-import { Card, CardContent, CardFooter } from "~/components/ui/card";
+import { Facebook, Instagram, Twitter } from 'lucide-react'
+import Image from 'next/image'
+import Link from 'next/link'
+import { Card, CardContent, CardFooter } from '~/components/ui/card'
interface TeamCardProperties {
- name: string;
- imageSrc: string;
- imageAlt: string;
- role: string;
- description: string;
- facebookURL?: string;
- instagramURL?: string;
- twitterURL?: string;
+ name: string
+ imageSrc: string
+ imageAlt: string
+ role: string
+ description: string
+ facebookURL?: string
+ instagramURL?: string
+ twitterURL?: string
}
const TeamCard: React.FC = ({
@@ -26,7 +25,7 @@ const TeamCard: React.FC = ({
twitterURL,
}) => {
return (
-
+
= ({
- );
-};
+ )
+}
-export default TeamCard;
+export default TeamCard
diff --git a/src/components/card/user-card.tsx b/src/components/card/user-card.tsx
index ed6fac9af..f7a0a381b 100644
--- a/src/components/card/user-card.tsx
+++ b/src/components/card/user-card.tsx
@@ -1,8 +1,13 @@
-import { ChevronDown } from "lucide-react";
-import { signOut, useSession } from "next-auth/react";
-import Link from "next/link";
+// eslint-disable-next-line @typescript-eslint/ban-ts-comment
+// @ts-nocheck
-import { Avatar, AvatarFallback, AvatarImage } from "~/components/ui/avatar";
+// TODO: remove the ts-checks after auth
+
+import { ChevronDown } from 'lucide-react'
+import { signOut, useSession } from 'next-auth/react'
+import Link from 'next/link'
+
+import { Avatar, AvatarFallback, AvatarImage } from '~/components/ui/avatar'
import {
DropdownMenu,
DropdownMenuContent,
@@ -12,30 +17,30 @@ import {
DropdownMenuSeparator,
DropdownMenuShortcut,
DropdownMenuTrigger,
-} from "~/components/ui/dropdown-menu";
-import { cn } from "~/lib/utils";
+} from '~/components/ui/dropdown-menu'
+import { cn } from '~/utils'
const handleLogout = async () => {
await signOut({
- callbackUrl: "/",
- });
-};
+ callbackUrl: '/',
+ })
+}
const UserCard = () => {
- const { data: session, status } = useSession();
+ const { data: session, status } = useSession()
return (
- {status === "loading" && (
-
+ {status === 'loading' && (
+
)}
- {status === "authenticated" && (
+ {status === 'authenticated' && (
{
@@ -59,8 +64,8 @@ const UserCard = () => {
{session?.user?.first_name} {session?.user?.last_name}
-
- {session?.user?.email ?? "Signed In"}
+
+ {session?.user?.email ?? 'Signed In'}
@@ -96,7 +101,7 @@ const UserCard = () => {
- );
-};
+ )
+}
-export default UserCard;
+export default UserCard
diff --git a/src/components/common/CareerCard/CareerCard.tsx b/src/components/common/CareerCard/CareerCard.tsx
deleted file mode 100644
index 9b9b409a6..000000000
--- a/src/components/common/CareerCard/CareerCard.tsx
+++ /dev/null
@@ -1,54 +0,0 @@
-"use client";
-
-import Link from "next/link";
-import { FC } from "react";
-
-import { Card, CardContent, CardFooter } from "~/components/ui/card";
-
-interface CareerCardProperties {
- jobTitle?: string;
- location?: string;
- description?: string;
- amount?: string;
- company?: string;
- onViewDetails: () => void;
-}
-
-const CareerCard: FC = ({
- jobTitle,
- location,
- description,
- amount,
- company,
- onViewDetails,
-}) => {
- return (
-
-
- {jobTitle}
- {company}
- {location}
- {description}
-
-
-
-
- {amount}
- /month
-
- {
- event.preventDefault();
- onViewDetails();
- }}
- className="rounded bg-primary px-4 py-2 text-[14px] text-background hover:bg-destructive"
- >
- View Details
-
-
-
- );
-};
-
-export default CareerCard;
diff --git a/src/components/common/CareerCard/Jobs.ts b/src/components/common/CareerCard/Jobs.ts
deleted file mode 100644
index 5c4c14c5e..000000000
--- a/src/components/common/CareerCard/Jobs.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-export interface Job {
- id: string;
- title: string;
- description: string;
- location: string;
- salary_range: string;
- company_name: string;
- job_type: string;
- job_mode: string;
- deadline: string;
-}
diff --git a/src/components/common/CareerCard/index.tsx b/src/components/common/CareerCard/index.tsx
deleted file mode 100644
index a00865944..000000000
--- a/src/components/common/CareerCard/index.tsx
+++ /dev/null
@@ -1,31 +0,0 @@
-import { FC } from "react";
-
-import CareerCard from "./CareerCard";
-import { Job } from "./Jobs";
-
-interface CareerCardParentProperties {
- job: Job;
- location?: string;
- description?: string;
- amount?: string;
- company?: string;
- onViewDetails: () => void;
-}
-
-const CareerCardParent: FC = ({
- job,
- onViewDetails,
-}) => {
- return (
-
- );
-};
-
-export default CareerCardParent;
diff --git a/src/components/common/DashboardCard/CardComponent.tsx b/src/components/common/DashboardCard/CardComponent.tsx
deleted file mode 100644
index 8ff62af10..000000000
--- a/src/components/common/DashboardCard/CardComponent.tsx
+++ /dev/null
@@ -1,51 +0,0 @@
-import { ComponentProps, FC } from "react";
-
-import Icon from "~/components/common/lucide-icon";
-import { Skeleton } from "~/components/ui/skeleton";
-
-interface CardProperties {
- title: string;
- value?: string | number;
- description?: string;
- icon: ComponentProps["name"];
- loading?: boolean;
- isUser?: boolean;
- percentage?: string | number;
-}
-
-const CardComponent: FC = ({
- title,
- value,
- icon,
- loading,
- isUser,
- percentage,
-}) => {
- return (
-
-
-
- {title}
-
-
-
-
-
-
- {loading ? (
-
- ) : (
-
- {value}
-
- )}
-
- `{!isUser && "+"}${percentage}%`{" "}
- {isUser ? "since last hour " : "from last month"}
-
-
-
- );
-};
-
-export default CardComponent;
diff --git a/src/components/common/Dialog.tsx b/src/components/common/Dialog.tsx
deleted file mode 100644
index 8433a7e39..000000000
--- a/src/components/common/Dialog.tsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import React from "react";
-
-import { Dialog, DialogContent } from "~/components/ui/dialog";
-
-interface DialogDemoProperties {
- open: boolean;
- onOpenChanged: (open: boolean) => void;
- children: React.ReactNode;
-}
-
-export function DialogDemo({
- open,
- onOpenChanged,
- children,
-}: DialogDemoProperties) {
- return (
-
- {children}
-
- );
-}
diff --git a/src/components/common/FaqAccordion/FaqAccordion.test.tsx b/src/components/common/FaqAccordion/FaqAccordion.test.tsx
deleted file mode 100644
index b4162def9..000000000
--- a/src/components/common/FaqAccordion/FaqAccordion.test.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import { render } from "~/test/utils";
-import FaqAccordion from "./index";
-
-describe("accordion tests", () => {
- it("should render correctly", () => {
- expect.assertions(1);
-
- render( );
-
- expect(true).toBeTruthy();
- });
-});
diff --git a/src/components/common/FaqAccordion/index.tsx b/src/components/common/FaqAccordion/index.tsx
deleted file mode 100644
index ea7e12667..000000000
--- a/src/components/common/FaqAccordion/index.tsx
+++ /dev/null
@@ -1,33 +0,0 @@
-import React from "react";
-
-import {
- Accordion,
- AccordionContent,
- AccordionItem,
- AccordionTrigger,
-} from "~/components/ui/accordion";
-
-interface FaqAccordionProperties {
- question: string;
- answer: string;
-}
-
-const FaqAccordion: React.FC = ({
- question,
- answer,
-}) => {
- return (
-
-
-
-
- {question}
-
- {answer}
-
-
-
- );
-};
-
-export default FaqAccordion;
diff --git a/src/components/common/Faqs/Faqs.test.tsx b/src/components/common/Faqs/Faqs.test.tsx
deleted file mode 100644
index 95f99a6cd..000000000
--- a/src/components/common/Faqs/Faqs.test.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import { render } from "~/test/utils";
-import Faqs from "./index";
-
-describe("accordion tests", () => {
- it("should render correctly", () => {
- expect.assertions(1);
-
- render( );
-
- expect(true).toBeTruthy();
- });
-});
diff --git a/src/components/common/Faqs/index.tsx b/src/components/common/Faqs/index.tsx
deleted file mode 100644
index 5811891eb..000000000
--- a/src/components/common/Faqs/index.tsx
+++ /dev/null
@@ -1,87 +0,0 @@
-"use client";
-
-import { useState } from "react";
-
-import FaqAccordion from "../FaqAccordion";
-import Search from "../SearchFaq";
-
-export default function Faqs() {
- const [searchValue, setSearchValue] = useState("");
- const [filteredAccordions, setFilteredAccordions] = useState(
- [],
- );
-
- const accordions = [
- ,
- ,
- ,
- ,
- ,
- ,
- ,
- ,
- ,
- ];
-
- const handleSearch = (value: string) => {
- setSearchValue(value);
-
- if (!value.trim()) {
- setFilteredAccordions([]);
- return;
- }
-
- const filtered = accordions.filter(
- (accordion) =>
- accordion.props.question.toLowerCase().includes(value.toLowerCase()) ||
- accordion.props.answer.toLowerCase().includes(value.toLowerCase()),
- );
-
- setFilteredAccordions(filtered);
- };
-
- return (
-
-
-
- {searchValue.trim() === "" ? (
-
- {accordions}
-
- ) : filteredAccordions.length > 0 ? (
-
{filteredAccordions}
- ) : (
-
No results found.
- )}
-
-
- );
-}
diff --git a/src/components/common/SearchFaq/SearchFaq.test.tsx b/src/components/common/SearchFaq/SearchFaq.test.tsx
deleted file mode 100644
index bf20006d4..000000000
--- a/src/components/common/SearchFaq/SearchFaq.test.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-import { render } from "~/test/utils";
-import Search from "./index";
-
-describe("search tests", () => {
- it("should render correctly", () => {
- expect.assertions(1);
-
- render(
- ,
- );
-
- expect(true).toBeTruthy();
- });
-});
diff --git a/src/components/common/SearchFaq/index.tsx b/src/components/common/SearchFaq/index.tsx
deleted file mode 100644
index f2d699984..000000000
--- a/src/components/common/SearchFaq/index.tsx
+++ /dev/null
@@ -1,52 +0,0 @@
-"use client";
-
-import { ChangeEvent, useState } from "react";
-
-export type SearchProperties = {
- onSearch: (value: string) => void;
-};
-const Search = (properties: SearchProperties) => {
- const { onSearch } = properties;
- const [value, setValue] = useState("What do you want to know about?");
- const handleOnChange = (event: ChangeEvent) => {
- const { target } = event;
- setValue(target.value);
- };
- const handleKeyDown = (event: React.KeyboardEvent) => {
- if (event.key === "Enter") {
- onSearch(value);
- }
- };
- return (
-
-
-
onSearch(value)}
- type="submit"
- className="absolute left-4 top-1 mr-4 mt-3"
- >
-
-
-
-
-
- );
-};
-
-export default Search;
diff --git a/src/components/common/blogCard/BlogCard.tsx b/src/components/common/blogCard/BlogCard.tsx
deleted file mode 100644
index ed4086475..000000000
--- a/src/components/common/blogCard/BlogCard.tsx
+++ /dev/null
@@ -1,98 +0,0 @@
-"use client";
-
-import clsx from "clsx";
-import Image from "next/image";
-import Link from "next/link";
-import { useEffect, useState } from "react";
-
-import { Card, CardDescription, CardHeader, CardTitle } from "../../ui/card";
-
-interface blogCardProperties {
- tag: string;
- date: string;
- link: string;
- title: string;
- authorPfP: string;
- blogImage: string;
- authorName: string;
- description: string;
- timeOfReading: number;
-}
-
-const BlogCard = (properties: blogCardProperties) => {
- const [leading, setLeading] = useState(false);
-
- useEffect(() => {
- if (window.innerWidth > 768) {
- setLeading(true);
- }
- }, []);
-
- return (
-
-
-
-
-
·
-
- {properties.tag}
-
-
-
- {properties.title}
-
-
- {properties.description}
-
-
-
-
-
- {properties.authorName}
-
-
-
-
{properties.timeOfReading} mins Read
-
·
-
{properties.date}
-
-
-
-
-
-
-
-
- );
-};
-
-export default BlogCard;
diff --git a/src/components/common/blogCard/blogCard.test.tsx b/src/components/common/blogCard/blogCard.test.tsx
deleted file mode 100644
index 921c909a8..000000000
--- a/src/components/common/blogCard/blogCard.test.tsx
+++ /dev/null
@@ -1,52 +0,0 @@
-import { render, screen } from "@testing-library/react";
-
-import "@testing-library/jest-dom";
-
-import { vi } from "vitest";
-
-import BlogCard from "./BlogCard";
-
-const setScreenSize = (width: number) => {
- window.innerWidth = width;
- window.dispatchEvent(new Event("resize"));
-};
-
-describe("blog Card Template", () => {
- const properties = {
- tag: "Business",
- title: "5 Mistakes That kill your start-up before it takes off",
- description:
- " We often hear about the ENIAC, hailed as the first computer, but its story is just one thread in a rich tapestry woven by brilliant",
- authorName: "Rahul Sharma",
- date: "2022-02-02",
- link: "",
- authorPfP: "",
- blogImage: "",
- timeOfReading: 7,
- };
-
- describe("responsiveComponent", () => {
- beforeEach(() => {
- vi.resetModules();
- });
-
- it("renders correctly on mobile screens", () => {
- expect.assertions(2);
- setScreenSize(375);
- render( );
- const mobileElement = screen.getByTestId("mobile-element");
- expect(mobileElement).toBeInTheDocument();
- expect(mobileElement).toBeVisible();
- });
- });
-
- describe("page tests", () => {
- it("navbar renders", () => {
- expect.assertions(1);
-
- const view = render( );
-
- expect(view.baseElement).toBeInTheDocument();
- });
- });
-});
diff --git a/src/components/common/breadcrumb/breadcrumb.tsx b/src/components/common/breadcrumb/breadcrumb.tsx
deleted file mode 100644
index cbdb44d44..000000000
--- a/src/components/common/breadcrumb/breadcrumb.tsx
+++ /dev/null
@@ -1,125 +0,0 @@
-import { Slot } from "@radix-ui/react-slot";
-import { ChevronRight, MoreHorizontal } from "lucide-react";
-import {
- forwardRef,
- type ComponentProps,
- type ComponentPropsWithoutRef,
- type ReactNode,
-} from "react";
-
-import { cn } from "~/lib/utils";
-
-const Breadcrumb = forwardRef<
- HTMLElement,
- ComponentPropsWithoutRef<"nav"> & {
- separator?: ReactNode;
- }
->(({ ...properties }, reference) => (
-
-));
-Breadcrumb.displayName = "Breadcrumb";
-
-const BreadcrumbList = forwardRef<
- HTMLOListElement,
- ComponentPropsWithoutRef<"ol">
->(({ className, ...properties }, reference) => (
-
-));
-BreadcrumbList.displayName = "BreadcrumbList";
-
-const BreadcrumbItem = forwardRef<
- HTMLLIElement,
- ComponentPropsWithoutRef<"li">
->(({ className, ...properties }, reference) => (
-
-));
-BreadcrumbItem.displayName = "BreadcrumbItem";
-
-const BreadcrumbLink = forwardRef<
- HTMLAnchorElement,
- ComponentPropsWithoutRef<"a"> & {
- asChild?: boolean;
- }
->(({ asChild, className, ...properties }, reference) => {
- const Comp = asChild ? Slot : "a";
-
- return (
-
- );
-});
-BreadcrumbLink.displayName = "BreadcrumbLink";
-
-const BreadcrumbPage = forwardRef<
- HTMLSpanElement,
- ComponentPropsWithoutRef<"span">
->(({ className, ...properties }, reference) => (
-
-));
-BreadcrumbPage.displayName = "BreadcrumbPage";
-
-const BreadcrumbSeparator = ({
- children,
- className,
- ...properties
-}: ComponentProps<"li">) => (
- svg]:size-3.5", className)}
- {...properties}
- >
- {children ?? }
-
-);
-BreadcrumbSeparator.displayName = "BreadcrumbSeparator";
-
-const BreadcrumbEllipsis = ({
- className,
- ...properties
-}: ComponentProps<"span">) => (
-
-
- More
-
-);
-BreadcrumbEllipsis.displayName = "BreadcrumbElipssis";
-
-export {
- Breadcrumb,
- BreadcrumbList,
- BreadcrumbItem,
- BreadcrumbLink,
- BreadcrumbPage,
- BreadcrumbSeparator,
- BreadcrumbEllipsis,
-};
diff --git a/src/components/common/breadcrumb/index.tsx b/src/components/common/breadcrumb/index.tsx
deleted file mode 100644
index 1b6f75053..000000000
--- a/src/components/common/breadcrumb/index.tsx
+++ /dev/null
@@ -1,118 +0,0 @@
-"use client";
-
-import Link from "next/link";
-import { usePathname } from "next/navigation";
-import { Fragment } from "react";
-
-import {
- Breadcrumb as BreadcrumbBase,
- BreadcrumbEllipsis,
- BreadcrumbItem,
- BreadcrumbLink,
- BreadcrumbList,
- BreadcrumbPage,
- BreadcrumbSeparator,
-} from "~/components/common/breadcrumb/breadcrumb";
-import { cn } from "~/lib/utils";
-
-type PagesList = {
- /** Specifies the page name */
- name: string;
- /** Specifies the page URL */
- href: string;
- /** Specifies if the page is the current page */
- isCurrent?: boolean;
-};
-
-export type BreadcrumbProperties = {
- /** Specifies the pages to display in the breadcrumb */
- pages?: PagesList[];
- /** Specifies the maximum number of pages to display in the breadcrumb */
- maxPages?: number;
- /** Specifies the breadcrumb style variant */
- variant?: "primary" | "default";
-};
-
-export function Breadcrumb({
- pages,
- maxPages = 3,
- variant = "default",
-}: BreadcrumbProperties) {
- const paths = usePathname()?.split("/");
-
- const generatedPages: PagesList[] =
- paths?.map((path, index, _paths) => {
- const isHomePath = path.trim().length === 0;
- return {
- name: isHomePath ? "Home" : path.replaceAll("-", " "),
- href: isHomePath ? "/" : "" + _paths.slice(0, index + 1).join("/"),
- isCurrent: index === _paths.length - 1,
- };
- }) ?? [];
- const isStatic = pages && pages.length > 0;
- const breadcrumbs = isStatic ? pages : generatedPages;
- const firstBreadcrumb = breadcrumbs[0];
- const hasEllipsis = breadcrumbs.length > maxPages;
- const isPrimary = variant === "primary";
-
- return (
-
-
-
- {firstBreadcrumb.isCurrent ? (
-
- {firstBreadcrumb.name}
-
- ) : (
-
- {firstBreadcrumb.name}
-
- )}
-
- {hasEllipsis && (
- <>
-
-
-
-
-
-
-
-
- >
- )}
- {breadcrumbs
- .slice(hasEllipsis ? -maxPages + 1 : 1)
- .map(({ name, href, isCurrent }) => {
- return (
-
-
- {isCurrent ? (
-
-
- {name}
-
-
- ) : (
-
-
- {name}
-
-
- )}
-
- );
- })}
-
-
- );
-}
diff --git a/src/components/common/comment-component/button-wrapper.tsx b/src/components/common/comment-component/button-wrapper.tsx
deleted file mode 100644
index 1f7b8cb73..000000000
--- a/src/components/common/comment-component/button-wrapper.tsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import { FC, ReactNode } from "react";
-
-type ButtonWrapperProperties = {
- "data-testid": string;
- children: ReactNode;
- [key: string]: unknown; // To allow passing other props to the wrapped button
-};
-
-const ButtonWrapper: FC = ({
- "data-testid": testId,
- children,
- ...properties
-}) => {
- return (
-
- {children}
-
- );
-};
-
-export default ButtonWrapper;
diff --git a/src/components/common/comment-component/comment-actions.tsx b/src/components/common/comment-component/comment-actions.tsx
deleted file mode 100644
index f705337c9..000000000
--- a/src/components/common/comment-component/comment-actions.tsx
+++ /dev/null
@@ -1,99 +0,0 @@
-import { MessageCircle, Share2, ThumbsDown, ThumbsUp } from "lucide-react";
-
-import CustomButton from "../common-button/common-button";
-import ButtonWrapper from "./button-wrapper";
-
-type CommentActionsProperties = {
- type: "comment" | "reply";
- likes: number;
- dislikes: number;
- isReplyActive: boolean;
- onLike: () => void;
- onDislike: () => void;
- onReply?: () => void;
-};
-
-const CommentActions = ({
- type,
- likes,
- dislikes,
- onLike,
- onDislike,
- onReply,
- isReplyActive,
-}: CommentActionsProperties) => {
- return (
-
-
- 0 ? "px-2" : "pl-2 pr-4"}`}
- aria-label="Like Button"
- >
-
- {likes > 0 && (
-
- {likes}
-
- )}
-
-
-
- 0 ? "px-[5.33px] sm:px-2" : "pl-[5.33px] pr-[10.67px] sm:pl-2 sm:pr-4"}`}
- aria-label="Dislike Button"
- >
-
- {dislikes > 0 && (
-
- {dislikes}
-
- )}
-
-
-
-
-
-
-
- {type === "comment" && onReply && (
- onReply?.()}>
-
-
-
-
- )}
-
- );
-};
-
-export default CommentActions;
diff --git a/src/components/common/comment-component/comment-body.tsx b/src/components/common/comment-component/comment-body.tsx
deleted file mode 100644
index 07bdf6720..000000000
--- a/src/components/common/comment-component/comment-body.tsx
+++ /dev/null
@@ -1,105 +0,0 @@
-import moment from "moment";
-import { Session } from "next-auth";
-
-import { Avatar, AvatarFallback, AvatarImage } from "~/components/ui/avatar";
-import CommentActions from "./comment-actions";
-
-export type CommentBodyProperties = {
- type: "comment" | "reply";
- id: string;
- avatar: string;
- name: string;
- username: string;
- content: string;
- timestamp: string;
- likes: number;
- dislikes: number;
- session: Session | null;
- isReplyActive: boolean;
- onLike: () => void;
- onDislike: () => void;
- onReply?: () => void;
-};
-
-export function CommentBody({
- type,
- id,
- avatar,
- name,
- username,
- content,
- timestamp,
- likes,
- dislikes,
- isReplyActive,
- session,
- onLike,
- onDislike,
- onReply,
-}: CommentBodyProperties) {
- return (
-
-
-
-
- {name.charAt(0)}
-
-
-
-
-
-
- {`@${username}`}
-
-
-
-
- {content}
-
-
- {moment(timestamp).format("DD MMM, YYYY")}
-
- {moment(timestamp).format("ddd hh:mma")}
-
-
-
- {session && (
-
-
-
- )}
-
-
- );
-}
diff --git a/src/components/common/comment-component/comment-reply.tsx b/src/components/common/comment-component/comment-reply.tsx
deleted file mode 100644
index b9793bf48..000000000
--- a/src/components/common/comment-component/comment-reply.tsx
+++ /dev/null
@@ -1,78 +0,0 @@
-import { Session } from "next-auth";
-import { useState } from "react";
-
-import { Avatar, AvatarFallback, AvatarImage } from "~/components/ui/avatar";
-import { Textarea } from "~/components/ui/textarea";
-import CustomButton from "../common-button/common-button";
-import ButtonWrapper from "./button-wrapper";
-
-export type ReplyFormProperties = {
- onSubmit: (content: string) => void;
- session: Session | null;
-};
-
-export function ReplyForm({ onSubmit, session }: ReplyFormProperties) {
- const [replyContent, setReplyContent] = useState("");
- const [error, setError] = useState(false);
-
- const handleSubmit = () => {
- if (replyContent.trim() === "") {
- setError(true);
- return;
- }
- onSubmit(replyContent);
- setReplyContent("");
- setError(false);
- };
-
- const handleChange = (event_: React.ChangeEvent) => {
- setReplyContent(event_.target.value);
- if (error) {
- setError(false);
- }
- };
-
- return (
-
-
-
-
- {session?.user?.name?.charAt(0) ?? "U"}
-
-
-
-
- {error && (
-
- Please enter a reply before submitting.
-
- )}
-
-
-
- Reply
-
-
-
-
-
- );
-}
diff --git a/src/components/common/comment-component/index.tsx b/src/components/common/comment-component/index.tsx
deleted file mode 100644
index 56c86882f..000000000
--- a/src/components/common/comment-component/index.tsx
+++ /dev/null
@@ -1,176 +0,0 @@
-"use client";
-
-import { AnimatePresence, AnimationProps, motion } from "framer-motion";
-import { Session } from "next-auth";
-import React, { useState } from "react";
-
-import { cn } from "../../../lib/utils";
-import { Card, CardContent } from "../../ui/card";
-import { CommentBody } from "./comment-body";
-import { ReplyForm } from "./comment-reply";
-
-export type CommentProperties = React.ComponentProps & {
- id: string;
- avatar: string;
- name: string;
- username: string;
- content: string;
- timestamp: string;
- date?: string;
- likes: number;
- dislikes: number;
- className?: string;
- session: Session | null;
-};
-
-export type ReplyProperties = Omit;
-
-const Comment = ({
- id,
- className,
- avatar,
- name,
- username,
- content,
- timestamp,
- likes: initialLikes,
- dislikes: initialDislikes,
- session,
- ...properties
-}: CommentProperties) => {
- const [showReply, setShowReply] = useState(false);
- const [replies, setReplies] = useState([]);
- const [likes, setLikes] = useState(initialLikes);
- const [dislikes, setDislikes] = useState(initialDislikes);
-
- const animation: AnimationProps = {
- initial: { opacity: 0, height: 0 },
- animate: { opacity: 1, height: "auto" },
- exit: {
- opacity: 0,
- height: 0,
- transition: { duration: 0.3 },
- },
- };
-
- const handleReplySubmit = (replyContent: string) => {
- if (replyContent.trim()) {
- const newReply: ReplyProperties = {
- id: Date.now().toString(),
- avatar: "/path/to/default/avatar.png",
- name: session?.user?.name ?? "Current User",
- username: session?.user?.name?.[0]?.toLowerCase() ?? "currentuser",
- content: replyContent,
- timestamp: new Date().toISOString(),
- likes: 0,
- dislikes: 0,
- session,
- };
- setReplies([newReply, ...replies]);
- setShowReply(false);
- }
- };
-
- const handleLike = (type: "comment" | "reply", id: string) => {
- if (type === "comment") {
- setLikes((previous) => previous + 1);
- } else {
- setReplies((previous) =>
- previous.map((reply) =>
- reply.id === id ? { ...reply, likes: reply.likes + 1 } : reply,
- ),
- );
- }
- };
-
- const handleDislike = (type: "comment" | "reply", id: string) => {
- if (type === "comment") {
- setDislikes((previous) => previous + 1);
- } else {
- setReplies((previous) =>
- previous.map((reply) =>
- reply.id === id ? { ...reply, dislikes: reply.dislikes + 1 } : reply,
- ),
- );
- }
- };
-
- return (
-
-
-
- handleLike("comment", id)}
- onDislike={() => handleDislike("comment", id)}
- onReply={() => setShowReply(!showReply)}
- isReplyActive={showReply}
- />
-
-
-
-
0 || showReply ? "pt-3 sm:pt-6" : "pt-0"}`}
- >
-
- {showReply && (
-
-
-
- )}
-
- {replies.length > 0 && (
-
- {replies.map((reply) => (
-
-
-
- handleLike("reply", reply.id)}
- onDislike={() => handleDislike("reply", reply.id)}
- />
-
-
-
- ))}
-
- )}
-
-
- );
-};
-
-export default Comment;
diff --git a/src/components/common/comment-component/sample-comments.ts b/src/components/common/comment-component/sample-comments.ts
deleted file mode 100644
index 071678fc5..000000000
--- a/src/components/common/comment-component/sample-comments.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-import { CommentProperties } from ".";
-
-export const sampleComments: Omit[] = [
- {
- id: "1",
- avatar: "",
- name: "Uduak Essien",
- username: "Uduess",
- content:
- "Living a balanced lifestyle is essential. Focus on healthy eating, regular exercise, and mental well-being. A well-rounded lifestyle leads to a happier, more fulfilling life. Embrace positive habits and enjoy the journey.",
- timestamp: "2024-07-24T06:53:16.073Z",
- likes: 0,
- dislikes: 0,
- },
- {
- id: "2",
- avatar: "",
- name: "John Doe",
- username: "johnd",
- content:
- "Technology is rapidly changing our world. It's fascinating to see how AI and machine learning are revolutionizing various industries. We need to stay adaptable and keep learning to thrive in this digital age.",
- timestamp: "2024-07-24T06:53:16.073Z",
- likes: 15,
- dislikes: 2,
- },
- {
- id: "3",
- avatar: "",
- name: "Jane Smith",
- username: "janes",
- content:
- "Climate change is a pressing issue that requires immediate action. We all need to do our part in reducing our carbon footprint. Small changes in our daily lives can make a big difference when we act collectively.",
- timestamp: "2024-07-24T06:53:16.073Z",
- likes: 30,
- dislikes: 3,
- },
-];
diff --git a/src/components/common/common-button/common-button.tsx b/src/components/common/common-button/common-button.tsx
deleted file mode 100644
index 9c2e90d3f..000000000
--- a/src/components/common/common-button/common-button.tsx
+++ /dev/null
@@ -1,163 +0,0 @@
-import { LoaderCircle, Plus } from "lucide-react";
-import Link from "next/link";
-import {
- cloneElement,
- FC,
- MouseEventHandler,
- ReactElement,
- ReactNode,
-} from "react";
-
-import { Button } from "~/components/common/common-button";
-
-type Variant =
- | "default"
- | "primary"
- | "destructive"
- | "subtle"
- | "loading"
- | "outline"
- | "secondary"
- | "ghost"
- | "link";
-type Size = "default" | "sm" | "lg" | "link" | "icon" | "circle";
-
-interface ButtonProperties {
- type?: "submit" | "button" | "reset";
- /** Specifies the button style variant */
- variant?: Variant;
- /** Specifies the size of the button */
- size?: Size;
- /** Icon to be displayed inside the button */
- icon?: ReactNode;
- /** Text or elements to be displayed inside the button */
- children?: ReactNode;
- /** Indicates if the button is in a loading state */
- isLoading?: boolean;
- /** Indicates if the button is icon only */
- isIconOnly?: boolean;
- /** Indicates if the left icon is visible */
- isLeftIconVisible?: boolean;
- /** Indicates if the right icon is visible */
- isRightIconVisible?: boolean;
- /** Disables the button if true */
- isDisabled?: boolean;
- /** Accessibility label for the button */
- ariaLabel?: string;
- /** Href to link button to a URL or route */
- href?: string;
- /** Class for custom styling */
- className?: string;
- /** Click event handler for the button */
- onClick?: MouseEventHandler;
-}
-
-/**
- * CustomButton component to render a button with various styles and states.
- *
- * @param {ButtonProps} props - Properties to configure the button.
- * @returns {JSX.Element} The rendered button component.
- */
-const CustomButton: FC = ({
- type = "button",
- variant,
- size,
- children,
- isLoading = false,
- isLeftIconVisible = false,
- isRightIconVisible = false,
- icon,
- isDisabled = false,
- isIconOnly = false,
- ariaLabel,
- href,
- className,
- onClick,
-}) => {
- const modifiedIcon = icon ? (
- cloneElement(icon as ReactElement, {
- className: "w-[1rem] h-[1rem]",
- "data-testid": "icon",
- })
- ) : (
-
- );
-
- const buttonContent = (
- <>
- {isLeftIconVisible && !isLoading && modifiedIcon}
- {isLoading && (
-
- )}
- {isIconOnly && !isLoading && modifiedIcon}
- {!isIconOnly && children}
- {!isIconOnly && !children && isLoading && "Loading"}
- {isRightIconVisible && !isLoading && modifiedIcon}
- >
- );
-
- if (href) {
- const isExternal = /^https?:\/\//.test(href);
-
- if (isExternal) {
- return (
-
-
- {buttonContent}
-
-
- );
- }
-
- return (
-
-
- {buttonContent}
-
-
- );
- }
-
- return (
- <>
-
- {buttonContent}
-
- >
- );
-};
-
-export default CustomButton;
diff --git a/src/components/common/common-button/index.tsx b/src/components/common/common-button/index.tsx
deleted file mode 100644
index db2229bbe..000000000
--- a/src/components/common/common-button/index.tsx
+++ /dev/null
@@ -1,63 +0,0 @@
-import { Slot } from "@radix-ui/react-slot";
-import { cva, type VariantProps } from "class-variance-authority";
-import { ButtonHTMLAttributes, forwardRef } from "react";
-
-import { cn } from "~/lib/utils";
-
-const buttonVariants = cva(
- "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50",
- {
- variants: {
- variant: {
- default: "bg-default text-default-foreground shadow",
- primary: "bg-primary text-primary-foreground shadow",
- destructive:
- "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive-hover",
- subtle:
- "bg-subtle text-subtle-foreground shadow-sm hover:bg-subtle-hover",
- loading:
- "bg-loading text-loading-foreground shadow-sm hover:bg-loading-hover opacity-50 hover:opacity-100 transition-opacity duration-500 ease-out",
- outline:
- "bg-outline text-outline-foreground shadow-sm border border-border hover:bg-outline-hover",
- secondary:
- "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",
- ghost: "hover:bg-accent hover:text-accent-foreground",
- link: "text-link underline-offset-4 hover:underline",
- },
- size: {
- default: "h-9 px-4 py-2",
- sm: "h-8 rounded-md px-3 text-xs",
- lg: "h-10 rounded-md px-8",
- link: "h-9 px-0 py-2",
- icon: "px-2 py-2",
- circle: "px-3 py-3 rounded-full",
- },
- },
- defaultVariants: {
- variant: "default",
- size: "default",
- },
- },
-);
-
-export interface ButtonProperties
- extends ButtonHTMLAttributes,
- VariantProps {
- asChild?: boolean;
-}
-
-const Button = forwardRef(
- ({ className, variant, size, asChild = false, ...properties }, reference) => {
- const Comp = asChild ? Slot : "button";
- return (
-
- );
- },
-);
-Button.displayName = "Button";
-
-export { Button, buttonVariants };
diff --git a/src/components/common/contact-us-form/index.tsx b/src/components/common/contact-us-form/index.tsx
deleted file mode 100644
index 1d8f692bc..000000000
--- a/src/components/common/contact-us-form/index.tsx
+++ /dev/null
@@ -1,237 +0,0 @@
-"use client";
-
-import { Mail } from "lucide-react";
-import { useSession } from "next-auth/react";
-import { useEffect, useState } from "react";
-import { z, ZodError } from "zod";
-
-import { getApiUrl } from "~/actions/getApiUrl";
-import { Toaster } from "~/components/ui/toaster";
-import { useToast } from "~/components/ui/use-toast";
-import CustomButton from "../common-button/common-button";
-import InputField from "./inputfield";
-
-const schema = z.object({
- name: z.string().min(5, "Name is required"),
- email: z.string().email("Email is invalid"),
- phone: z
- .string()
- .min(8, "Phone number is required")
- .regex(/^\+?\d{10,15}$/, "Phone number is invalid"),
- message: z.string().min(1, "Message is required"),
-});
-
-type FormData = z.infer;
-
-const initialFormData: FormData = {
- name: "",
- email: "",
- phone: "",
- message: "",
-};
-
-interface TransformedData {
- full_name: string;
- email: string;
- phone_number: string;
- message: string;
- org_id: string;
-}
-
-const ContactForm: React.FC = () => {
- const [formData, setFormData] = useState({ ...initialFormData });
- const [errors, setErrors] = useState<{ [key: string]: string }>({});
- const [status, setStatus] = useState();
- const [message, setMessage] = useState();
- const [loading, setLoading] = useState(false);
- const { data: session } = useSession();
- const { toast } = useToast();
-
- useEffect(() => {
- if (status !== undefined) {
- const timer = setTimeout(() => {
- setStatus(undefined);
- }, 3000);
- return () => clearTimeout(timer);
- }
- }, [status]);
-
- const validate = () => {
- try {
- schema.parse(formData);
- return {};
- } catch (error) {
- if (error instanceof ZodError) {
- const errorMessages: { [key: string]: string } = {};
- for (const { path, message } of error.errors) {
- errorMessages[path[0]] = message;
- }
- return errorMessages;
- }
- return {};
- }
- };
-
- const handleChange = (
- event: React.ChangeEvent,
- ) => {
- const { name, value } = event.target;
- setFormData({ ...formData, [name]: value });
- };
-
- const handleSubmit = async (event: React.FormEvent) => {
- event.preventDefault();
- const validationErrors = validate();
- if (Object.keys(validationErrors).length > 0) {
- setErrors(validationErrors);
- return;
- }
- try {
- const baseUrl = await getApiUrl();
- const apiData: TransformedData = {
- full_name: formData.name,
- email: formData.email,
- phone_number: formData.phone,
- message: formData.message,
- org_id: session?.currentOrgId ?? "",
- };
- setLoading(true);
- const response = await fetch(`${baseUrl}/api/v1/contact`, {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- },
- body: JSON.stringify(apiData),
- });
-
- const responseData = await response.json();
-
- if (!response.ok) {
- // throw new Error(responseData.message || "Failed to submit the form.");
- toast({
- title: "Submission Failed",
- description:
- "There was an error submitting your message. Please check your internet connection and try again. If the problem persists, contact our support team.",
- variant: "destructive",
- });
- return;
- }
-
- setStatus(true);
- toast({
- title: "Message Sent!",
- description:
- "Thank you for reaching out to us. Your message has been received, and we'll get back to you shortly.",
- variant: "default",
- });
- setMessage(responseData?.message || "Form submitted successfully!");
- setFormData({ ...initialFormData });
- setErrors({});
- } catch {
- toast({
- title: "Submission Failed",
- description:
- "There was an error submitting your message. Please check your internet connection and try again. If the problem persists, contact our support team.",
- variant: "destructive",
- });
- setStatus(false);
- setMessage("Failed to submit the form. Please try again.");
- } finally {
- setLoading(false);
- }
- };
-
- const inputFields = [
- {
- label: "Name",
- name: "name",
- type: "text",
- placeholder: "Enter full name",
- required: true,
- },
- {
- label: "Email",
- name: "email",
- type: "email",
- placeholder: "Enter email address",
- required: true,
- },
- {
- label: "Phone Number",
- name: "phone",
- type: "tel",
- placeholder: "Enter phone number",
- required: true,
- },
- ];
-
- return (
- <>
-
-
- {inputFields.map((field) => (
-
-
- {errors[field.name] && (
-
- {errors[field.name]}
-
- )}
-
- ))}
-
-
- Message
-
-
- {errors.message && (
-
- {errors.message}
-
- )}
-
-
-
- Send
-
-
- {status !== undefined && (
-
- {message}
-
- )}
-
-
-
-
- >
- );
-};
-
-export default ContactForm;
diff --git a/src/components/common/contact-us-form/inputfield.tsx b/src/components/common/contact-us-form/inputfield.tsx
deleted file mode 100644
index 1435fc7f8..000000000
--- a/src/components/common/contact-us-form/inputfield.tsx
+++ /dev/null
@@ -1,38 +0,0 @@
-import React from "react";
-
-interface InputFieldProperties {
- value: string;
- type: string;
- onChange: (event: React.ChangeEvent) => void;
- placeholder: string;
- id: string;
- name: string;
- label: string;
-}
-
-const InputField: React.FC = ({
- value,
- type,
- onChange,
- placeholder,
- id,
- name,
- label,
-}) => (
-
-
- {label}
-
-
-
-);
-
-export default InputField;
diff --git a/src/components/common/input-otp/index.tsx b/src/components/common/input-otp/index.tsx
deleted file mode 100644
index 87717ceb7..000000000
--- a/src/components/common/input-otp/index.tsx
+++ /dev/null
@@ -1,41 +0,0 @@
-import {
- InputOTP,
- InputOTPGroup,
- InputOTPSlot,
-} from "~/components/ui/input-otp";
-import { cn } from "~/lib/utils";
-
-interface Properties {
- maxLength?: number;
- slotClassName?: string;
- className?: string;
- onChange?: (value: string) => void;
- onComplete?: (value: string) => void;
-}
-
-export function InputOtp(properties: Properties) {
- const {
- maxLength = 6,
- slotClassName,
- className,
- onChange,
- onComplete,
- ...rest
- } = properties;
- return (
-
-
- {/* eslint-disable unicorn/no-useless-spread */}
- {/* eslint-disable unicorn/no-new-array */}
- {[...new Array(maxLength)].map((_, index) => (
-
- ))}
-
-
- );
-}
diff --git a/src/components/common/input/index.tsx b/src/components/common/input/index.tsx
deleted file mode 100644
index 0376e33e7..000000000
--- a/src/components/common/input/index.tsx
+++ /dev/null
@@ -1,126 +0,0 @@
-import { Slot } from "@radix-ui/react-slot";
-import { cva, type VariantProps } from "class-variance-authority";
-import * as React from "react";
-
-import CustomButton from "~/components/common/common-button/common-button";
-import { cn } from "~/lib/utils";
-
-const inputVariants = cva("text-sm rounded-md transition-colors", {
- variants: {
- variant: {
- primary:
- "border-primary text-primary focus:outline-none focus:border-primary",
- border:
- "border-border text-foreground focus:outline-none focus:border-border",
- },
- state: {
- default: "border-border",
- active: "border-primary",
- invalid: "border-error",
- },
- gap: {
- sm: "gap-1.5",
- md: "gap-2",
- lg: "gap-2.5",
- },
- labelPosition: {
- top: "flex-col",
- side: "flex-row",
- },
- },
- defaultVariants: {
- variant: "primary",
- state: "default",
- gap: "md",
- labelPosition: "top",
- },
-});
-
-export interface InputProperties
- extends React.InputHTMLAttributes,
- VariantProps {
- label?: string;
- labelClassName?: string;
- height?: string | number;
- asChild?: boolean;
- isButtonVisible?: boolean;
- buttonContent?: string;
- buttonDisabled?: boolean;
- onButtonClick?: React.MouseEventHandler;
-}
-
-const Input = React.forwardRef(
- (
- {
- label,
- variant,
- state,
- gap,
- labelPosition,
- asChild = false,
- isButtonVisible = false,
- buttonContent,
- buttonDisabled = false,
- onButtonClick,
- className,
- labelClassName,
- ...properties
- },
- reference,
- ) => {
- const Comp = asChild ? Slot : "input";
-
- return (
-
- {label && (
-
- {label}
-
- )}
-
-
- {isButtonVisible && (
-
-
- {buttonContent}
-
-
- )}
-
-
- );
- },
-);
-
-Input.displayName = "Input";
-
-export { Input, inputVariants };
diff --git a/src/components/common/input/input.tsx b/src/components/common/input/input.tsx
deleted file mode 100644
index 92fe6c969..000000000
--- a/src/components/common/input/input.tsx
+++ /dev/null
@@ -1,73 +0,0 @@
-import React from "react";
-
-import { Input } from "~/components/common/input";
-import { cn } from "~/lib/utils";
-
-interface CustomInputProperties {
- label?: string;
- name?: string;
- labelClassName?: string;
- placeholder: string;
- type?: string;
- value?: string;
- onChange?: React.ChangeEventHandler;
- onFocus?: React.FocusEventHandler;
- isButtonVisible?: boolean;
- buttonContent?: string;
- onButtonClick?: React.MouseEventHandler;
- isDisabled?: boolean;
- gap?: "sm" | "md" | "lg";
- labelPosition?: "top" | "side";
- variant?: "primary" | "border";
- className?: string;
-}
-
-const CustomInput: React.FC = ({
- label,
- name,
- labelClassName,
- placeholder,
- type = "text",
- value,
- onChange,
- onFocus,
- isButtonVisible = false,
- buttonContent = "Button",
- onButtonClick,
- isDisabled = false,
- gap = "md",
- labelPosition = "top",
- variant = "primary",
- className,
-}) => {
- const isValid =
- type === "email" && value ? /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value) : true;
- const inputState = isValid ? (value ? "active" : "default") : "invalid";
-
- return (
-
- );
-};
-
-export default CustomInput;
diff --git a/src/components/common/lucide-icon/index.tsx b/src/components/common/lucide-icon/index.tsx
deleted file mode 100644
index f07fbf21c..000000000
--- a/src/components/common/lucide-icon/index.tsx
+++ /dev/null
@@ -1,19 +0,0 @@
-import { LucideProps } from "lucide-react";
-import dynamicIconImports from "lucide-react/dynamicIconImports";
-import dynamic from "next/dynamic";
-
-interface ILucideIcon {
- name: keyof typeof dynamicIconImports;
-}
-
-export type LucideIconName = ILucideIcon["name"];
-
-interface IconProperties extends Omit, ILucideIcon {}
-
-const Icon = ({ name, ...properties }: IconProperties) => {
- const LucideIcon = dynamic(dynamicIconImports[name]);
-
- return ;
-};
-
-export default Icon;
diff --git a/src/components/common/modals/invite-member/DeleteMembers/index.tsx b/src/components/common/modals/invite-member/DeleteMembers/index.tsx
deleted file mode 100644
index eb5c7e6ec..000000000
--- a/src/components/common/modals/invite-member/DeleteMembers/index.tsx
+++ /dev/null
@@ -1,61 +0,0 @@
-"use client";
-
-import { Button } from "~/components/ui/button";
-import {
- Dialog,
- DialogContent,
- DialogDescription,
- DialogHeader,
- DialogTitle,
-} from "~/components/ui/dialog";
-
-interface ModalProperties {
- show: boolean;
- onClose: () => void;
-}
-
-const DeleteMember: React.FC = ({ show, onClose }) => {
- return (
-
-
-
-
-
- {" "}
-
- Delete Member
-
-
-
-
- Are you sure you want to delete Chad Bosewick ? All data will be
- permanently removed. This action cannot be undone.
-
-
-
-
-
- Cancel
-
-
-
- Delete
-
-
-
-
-
-
-
-
- );
-};
-
-export default DeleteMember;
diff --git a/src/components/common/modals/invite-member/config.ts b/src/components/common/modals/invite-member/config.ts
deleted file mode 100644
index 5c334c159..000000000
--- a/src/components/common/modals/invite-member/config.ts
+++ /dev/null
@@ -1 +0,0 @@
-export const apiUrl = process.env.API_URL;
diff --git a/src/components/common/modals/invite-member/index.tsx b/src/components/common/modals/invite-member/index.tsx
deleted file mode 100644
index ee93cd2b4..000000000
--- a/src/components/common/modals/invite-member/index.tsx
+++ /dev/null
@@ -1,207 +0,0 @@
-"use client";
-
-import { Link2Icon } from "lucide-react";
-import { useCallback, useState } from "react";
-
-import {
- fetchOrganizations,
- generateInviteLink,
- inviteMembers,
-} from "~/actions/inviteMembers";
-import CustomButton from "~/components/common/common-button/common-button";
-import {
- Dialog,
- DialogContent,
- DialogDescription,
- DialogHeader,
- DialogTitle,
-} from "~/components/ui/dialog";
-import {
- Select,
- SelectContent,
- SelectGroup,
- SelectItem,
- SelectTrigger,
- SelectValue,
-} from "~/components/ui/select";
-import { useToast } from "~/components/ui/use-toast";
-
-interface ModalProperties {
- show: boolean;
- onClose: () => void;
-}
-
-const InviteMemberModal: React.FC = ({ show, onClose }) => {
- const [emails, setEmails] = useState("");
- const [organization, setOrganization] = useState("");
- const [organizations, setOrganizations] = useState<
- { id: string; name: string }[]
- >([]);
- const [inviteLink, setInviteLink] = useState("");
- const [linkGenerated, setLinkGenerated] = useState(false);
- const [error, setError] = useState("");
- const [organizationsLoaded, setOrganizationsLoaded] = useState(false);
-
- const { toast } = useToast();
-
- const loadOrganizations = useCallback(async () => {
- if (organizationsLoaded) return;
-
- const response = await fetchOrganizations();
- if (response?.error) {
- setError(response.error);
- } else {
- setOrganizations(response.data || []);
- setOrganizationsLoaded(true);
- }
- }, [organizationsLoaded]);
-
- const handleEmailChange = (event: React.ChangeEvent) => {
- setEmails(event.target.value);
- };
-
- const handleOrganizationChange = (value: string) => {
- setOrganization(value);
- };
-
- const handleOrganizationDropdownOpen = () => {
- if (!organizationsLoaded) {
- loadOrganizations();
- }
- };
-
- // Clear error after a timeout
- const clearError = () => setTimeout(() => setError(""), 3000);
-
- // Function to handle invite submission via email
- const handleSubmit = async () => {
- setError("");
-
- const response = await inviteMembers(emails, organization);
- if (response?.error) {
- setError(response.error);
- } else {
- toast({
- title: "Success",
- description: "Your invite has been sent successfully to members' email",
- variant: "default",
- });
- setEmails("");
- onClose();
- }
- };
-
- // Function to generate the invite link
- const generateAndCopyInviteLink = async () => {
- if (!organization) {
- setError("Please select an organization first.");
- clearError();
- return;
- }
-
- const { data: inviteLinkData, error: inviteLinkError } =
- await generateInviteLink(organization);
-
- if (inviteLinkError) {
- setError(inviteLinkError);
- clearError();
- } else {
- setInviteLink(inviteLinkData); // Store the invite link
- setLinkGenerated(true);
-
- try {
- if (document.hasFocus()) {
- await navigator.clipboard.writeText(inviteLinkData);
- toast({
- title: "Invite Link",
- description: "Invite link copied to clipboard!",
- });
- } else {
- setError("Failed to copy invite link. Please manually copy it.");
- clearError();
- }
- } catch {
- setError("Failed to copy invite link to clipboard.");
- clearError();
- }
- }
- };
-
- return (
-
-
-
-
-
- 0P
-
-
- Invite to your Organization
-
-
-
-
-
- Email
-
-
-
-
-
- Invite as
-
-
-
-
-
-
-
- {organizations.map((org) => (
-
- {org.name}
-
- ))}
-
-
-
-
-
-
-
-
- Invite with link
-
-
-
-
- Send Invites
-
-
- {linkGenerated && (
-
- {inviteLink}
-
- )}
-
- {error && {error}
}
-
-
-
-
- );
-};
-
-export default InviteMemberModal;
diff --git a/src/components/common/modals/notification-settings-saved/index.tsx b/src/components/common/modals/notification-settings-saved/index.tsx
deleted file mode 100644
index 0f45bc3c8..000000000
--- a/src/components/common/modals/notification-settings-saved/index.tsx
+++ /dev/null
@@ -1,58 +0,0 @@
-"use client";
-
-import { usePathname } from "next/navigation";
-import React from "react";
-
-import CustomButton from "~/components/common/common-button/common-button";
-import {
- Dialog,
- DialogContent,
- DialogDescription,
- DialogOverlay,
- DialogTitle,
-} from "~/components/ui/dialog";
-
-interface ModalProperties {
- show: boolean;
- onClose: () => void;
-}
-
-const NotificationSettingSavedModal: React.FC = ({
- show,
- onClose,
-}) => {
- const pathname = usePathname();
- /**
- * @kinxlo
- * check if pathname == "notification", apply the blur effect
- */
- const isNotificationPath = pathname.includes("notification");
-
- return (
-
-
- event.stopPropagation()}
- >
-
- Notification Updated!
-
-
- Notification preferences updated successfully. Remember, you can
- always adjust these settings later.
-
-
-
-
- );
-};
-
-export default NotificationSettingSavedModal;
diff --git a/src/components/common/modals/password-successful/index.tsx b/src/components/common/modals/password-successful/index.tsx
deleted file mode 100644
index 6b7446fa3..000000000
--- a/src/components/common/modals/password-successful/index.tsx
+++ /dev/null
@@ -1,50 +0,0 @@
-"use client";
-
-import React from "react";
-
-import CustomButton from "~/components/common/common-button/common-button";
-import {
- Dialog,
- DialogContent,
- DialogDescription,
- DialogOverlay,
- DialogTitle,
-} from "~/components/ui/dialog";
-
-interface ModalProperties {
- show: boolean;
- onClose: () => void;
-}
-
-const PasswordSuccessfulModal: React.FC = ({
- show,
- onClose,
-}) => {
- return (
-
-
- event.stopPropagation()}
- >
-
- Password Successfully Updated!
-
-
- Your password has been successfully updated! You can now log in with
- your new password.
-
-
-
-
- );
-};
-
-export default PasswordSuccessfulModal;
diff --git a/src/components/common/modals/plan-upgrade-failed/index.tsx b/src/components/common/modals/plan-upgrade-failed/index.tsx
deleted file mode 100644
index 6a0f15515..000000000
--- a/src/components/common/modals/plan-upgrade-failed/index.tsx
+++ /dev/null
@@ -1,50 +0,0 @@
-"use client";
-
-import React from "react";
-
-import CustomButton from "~/components/common/common-button/common-button";
-import {
- Dialog,
- DialogContent,
- DialogDescription,
- DialogOverlay,
- DialogTitle,
-} from "~/components/ui/dialog";
-
-interface ModalProperties {
- show: boolean;
- onClose: () => void;
-}
-
-const PlanUpgradeFailedModal: React.FC = ({
- show,
- onClose,
-}) => {
- return (
-
-
- event.stopPropagation()}
- >
-
- Error: Unable to Process Payment!
-
-
- We apologize, but there seems to be an issue processing your upgrade
- to the Basic plan. Don't worry, your current plan remains active.
-
-
-
-
- );
-};
-
-export default PlanUpgradeFailedModal;
diff --git a/src/components/common/modals/plan-upgrade-successful/index.tsx b/src/components/common/modals/plan-upgrade-successful/index.tsx
deleted file mode 100644
index 80e0b3c39..000000000
--- a/src/components/common/modals/plan-upgrade-successful/index.tsx
+++ /dev/null
@@ -1,51 +0,0 @@
-"use client";
-
-import React from "react";
-
-import CustomButton from "~/components/common/common-button/common-button";
-import {
- Dialog,
- DialogContent,
- DialogDescription,
- DialogOverlay,
- DialogTitle,
-} from "~/components/ui/dialog";
-
-interface ModalProperties {
- show: boolean;
- onClose: () => void;
-}
-
-const PlanUpgradeSuccessfulModal: React.FC = ({
- show,
- onClose,
-}) => {
- return (
-
-
- event.stopPropagation()}
- >
-
- Success! You've Upgraded Your Plan!
-
-
- Congratulations! You've successfully upgraded to Basic, This
- means you now have access to all the powerful features that will help
- you manage your team effectively
-
-
-
-
- );
-};
-
-export default PlanUpgradeSuccessfulModal;
diff --git a/src/components/common/modals/profile-update-success/index.tsx b/src/components/common/modals/profile-update-success/index.tsx
deleted file mode 100644
index 58c00dfdb..000000000
--- a/src/components/common/modals/profile-update-success/index.tsx
+++ /dev/null
@@ -1,49 +0,0 @@
-"use client";
-
-import React from "react";
-
-import CustomButton from "~/components/common/common-button/common-button";
-import {
- Dialog,
- DialogContent,
- DialogDescription,
- DialogOverlay,
- DialogTitle,
-} from "~/components/ui/dialog";
-
-interface ModalProperties {
- show: boolean;
- onClose: () => void;
-}
-
-const ProfileUpdateSuccessModal: React.FC = ({
- show,
- onClose,
-}) => {
- return (
-
-
- event.stopPropagation()}
- >
-
- Profile Updated!
-
-
- Your profile has been successfully updated.
-
-
-
-
- );
-};
-
-export default ProfileUpdateSuccessModal;
diff --git a/src/components/common/modals/role-creation-success/index.tsx b/src/components/common/modals/role-creation-success/index.tsx
deleted file mode 100644
index cd64848ec..000000000
--- a/src/components/common/modals/role-creation-success/index.tsx
+++ /dev/null
@@ -1,57 +0,0 @@
-"use client";
-
-import Image from "next/image";
-
-import CustomButton from "~/components/common/common-button/common-button";
-import {
- Dialog,
- DialogContent,
- DialogDescription,
- DialogHeader,
- DialogTitle,
-} from "~/components/ui/dialog";
-import checkmark from "../../../../../public/images/role-success-checkmark.png";
-
-interface ModalProperties {
- show: boolean;
- onClose: () => void;
-}
-
-const RoleCreationSuccessModal: React.FC = ({
- show,
- onClose,
-}) => {
- return (
- <>
-
-
-
-
-
-
-
-
- Success
-
-
- You have created a new role successfully
-
-
-
-
- Continue
-
-
-
-
-
-
- >
- );
-};
-
-export default RoleCreationSuccessModal;
diff --git a/src/components/common/modals/role-creation/index.tsx b/src/components/common/modals/role-creation/index.tsx
deleted file mode 100644
index 110a52d6a..000000000
--- a/src/components/common/modals/role-creation/index.tsx
+++ /dev/null
@@ -1,65 +0,0 @@
-"use client";
-
-import CustomButton from "~/components/common/common-button/common-button";
-import {
- Dialog,
- DialogContent,
- DialogDescription,
- DialogHeader,
- DialogTitle,
-} from "~/components/ui/dialog";
-
-interface ModalProperties {
- show: boolean;
- onClose: () => void;
-}
-
-const RoleCreationModal: React.FC = ({ show, onClose }) => {
- return (
- <>
-
-
-
-
-
- Create Role
-
-
-
-
- Define customized responsibilities for collaborative success.
-
-
-
- Name of role
-
-
-
-
-
- Role Descriotion
-
-
-
-
-
- Cancel
-
- Create Role
-
-
-
-
-
- >
- );
-};
-
-export default RoleCreationModal;
diff --git a/src/components/common/modals/roles-permissions-creation/index.tsx b/src/components/common/modals/roles-permissions-creation/index.tsx
deleted file mode 100644
index 493924c5c..000000000
--- a/src/components/common/modals/roles-permissions-creation/index.tsx
+++ /dev/null
@@ -1,114 +0,0 @@
-"use client";
-
-import { Dispatch, SetStateAction } from "react";
-
-import LoadingSpinner from "~/components/miscellaneous/loading-spinner";
-import {
- Dialog,
- DialogClose,
- DialogContent,
- DialogDescription,
- DialogHeader,
- DialogTitle,
- DialogTrigger,
-} from "~/components/ui/dialog";
-
-type Permission = {
- id: string;
- name: string;
- description: string;
- value: boolean;
-};
-
-function RolePreferencesCreationModal({
- permissions,
- handleChange,
-}: {
- permissions: Permission[];
- handleChange: Dispatch<
- SetStateAction<
- | {
- id: string;
- name: string;
- description: string;
- value: boolean;
- }[]
- | []
- >
- >;
-}) {
- const handleToggle = (index: number, checked: boolean) => {
- const currentElement = permissions.at(index);
- if (currentElement) {
- currentElement.value = checked;
- handleChange([
- ...permissions.slice(0, index),
- currentElement,
- ...permissions.slice(index + 1),
- ]);
- }
- };
- return (
- <>
-
-
- Add Permissions
-
-
-
-
- Permissions
-
-
- See the list of permissions for this role
-
-
- {permissions.length > 0 ? (
-
-
- {permissions.map((permission, index) => (
-
-
- {permission.name
- .replaceAll("_", " ")
- .replaceAll(/\b\w/g, (l) => l.toUpperCase())}
-
-
-
- handleToggle(index, event.target.checked)
- }
- />
-
-
-
- ))}
-
-
-
- Done
-
-
-
- ) : (
-
- )}
-
-
- >
- );
-}
-
-export default RolePreferencesCreationModal;
diff --git a/src/components/common/password-check/index.tsx b/src/components/common/password-check/index.tsx
deleted file mode 100644
index 27c1489d8..000000000
--- a/src/components/common/password-check/index.tsx
+++ /dev/null
@@ -1,104 +0,0 @@
-"use client";
-
-import { CircleCheck } from "lucide-react";
-import React, { useEffect, useState } from "react";
-
-interface PasswordCheckProperties {
- minLength: number;
- password: string;
- onStrengthChange: (strength: PasswordCheck) => void;
-}
-
-interface PasswordCheck {
- minLengthCheck: boolean;
- containsUppercase: boolean;
- containNumber: boolean;
-}
-
-const handlerContainsNumber = (value: string) => {
- const regex = /\d/;
- return regex.test(value);
-};
-
-const handleContainsUpperCase = (value: string) => {
- const regex = /[A-Z]/;
- return regex.test(value);
-};
-
-const PasswordCheck: React.FC = ({
- password,
- minLength,
- onStrengthChange,
-}) => {
- const [checkPassword, setCheckPassword] = useState({
- minLengthCheck: false,
- containsUppercase: false,
- containNumber: false,
- });
-
- useEffect(() => {
- const handleCheckPassword = (password: string) => {
- const containsUpperCase = handleContainsUpperCase(password);
- const containsNumber = handlerContainsNumber(password);
- const minLengthCheck = password.length >= minLength;
-
- const newStrength: PasswordCheck = {
- minLengthCheck,
- containsUppercase: containsUpperCase,
- containNumber: containsNumber,
- };
-
- setCheckPassword(newStrength);
- onStrengthChange(newStrength);
- };
- handleCheckPassword(password);
- }, [password, minLength, onStrengthChange]);
-
- return (
-
-
-
-
Weak password. Must contain:
-
-
-
At least 1 uppercase
-
-
-
-
-
At least {minLength} characters
-
-
-
- );
-};
-
-export default PasswordCheck;
diff --git a/src/components/common/password-input/index.tsx b/src/components/common/password-input/index.tsx
deleted file mode 100644
index 5f87dee32..000000000
--- a/src/components/common/password-input/index.tsx
+++ /dev/null
@@ -1,57 +0,0 @@
-"use client";
-
-import { EyeIcon, EyeOff } from "lucide-react";
-import { useState } from "react";
-
-import { Input } from "~/components/ui/input";
-
-interface PasswordToggleProperties {
- password: string;
- onPasswordChange: (password: string) => void;
- name: string;
- placeholder: string;
- id: string;
-}
-
-const PasswordInput: React.FC = ({
- password,
- onPasswordChange,
- name,
- id,
- placeholder,
-}) => {
- const [isPasswordHidden, setPasswordHidden] = useState(true);
-
- const handleChange = (event: React.ChangeEvent) => {
- onPasswordChange(event.target.value);
- };
-
- return (
-
-
- setPasswordHidden(!isPasswordHidden)}
- aria-label={isPasswordHidden ? "Show password" : "Hide password"}
- title={isPasswordHidden ? "Show password" : "Hide password"}
- >
- {isPasswordHidden ? : }
-
-
-
-
-
- );
-};
-
-export { PasswordInput };
diff --git a/src/components/common/text-area/index.tsx b/src/components/common/text-area/index.tsx
deleted file mode 100644
index 6238c290d..000000000
--- a/src/components/common/text-area/index.tsx
+++ /dev/null
@@ -1,57 +0,0 @@
-import { Slot } from "@radix-ui/react-slot";
-import { cva, type VariantProps } from "class-variance-authority";
-import * as React from "react";
-
-import { cn } from "~/lib/utils";
-
-const textareaVariants = cva("text-sm rounded-md transition-colors", {
- variants: {
- variant: {
- primary:
- "border-primary text-primary focus:outline-none focus:border-primary",
- border:
- "border-border text-foreground focus:outline-none focus:border-border",
- },
- state: {
- default: "border-border",
- active: "border-primary",
- invalid: "border-error",
- },
- },
- defaultVariants: {
- variant: "primary",
- state: "default",
- },
-});
-
-export interface TextareaProperties
- extends React.TextareaHTMLAttributes,
- VariantProps {
- asChild?: boolean;
-}
-
-const Textarea = React.forwardRef(
- (
- { variant, state, asChild = false, className, ...properties },
- reference,
- ) => {
- const Comp = asChild ? Slot : "textarea";
-
- return (
-
- );
- },
-);
-
-Textarea.displayName = "Textarea";
-
-export { Textarea, textareaVariants };
diff --git a/src/components/common/text-area/textarea.tsx b/src/components/common/text-area/textarea.tsx
deleted file mode 100644
index 209ba2656..000000000
--- a/src/components/common/text-area/textarea.tsx
+++ /dev/null
@@ -1,24 +0,0 @@
-import * as React from "react";
-
-import { cn } from "~/lib/utils";
-
-export interface TextareaProperties
- extends React.TextareaHTMLAttributes {}
-
-const Textarea = React.forwardRef(
- ({ className, ...properties }, reference) => {
- return (
-
- );
- },
-);
-Textarea.displayName = "Textarea";
-
-export { Textarea };
diff --git a/src/components/dashboard/main.tsx b/src/components/dashboard/main.tsx
new file mode 100644
index 000000000..927d1acd9
--- /dev/null
+++ b/src/components/dashboard/main.tsx
@@ -0,0 +1,7 @@
+import React from 'react'
+
+const main = () => {
+ return main
+}
+
+export default main
diff --git a/src/components/enviroment-switcher.tsx b/src/components/enviroment-switcher.tsx
new file mode 100644
index 000000000..d4e629699
--- /dev/null
+++ b/src/components/enviroment-switcher.tsx
@@ -0,0 +1,145 @@
+'use client'
+
+import { motion } from 'framer-motion'
+import { useEffect, useState } from 'react'
+import useEnvironmentStore from '~/hooks/global/use-enviroment'
+import { signOut } from 'next-auth/react'
+import { cn } from '~/utils'
+
+export default function EnvironmentSwitcher() {
+ const { backend, setBackend } = useEnvironmentStore()
+ const [mounted, setMounted] = useState(false)
+
+ useEffect(() => {
+ setMounted(true)
+ }, [])
+
+ if (!mounted) {
+ return null
+ }
+
+ const currentBackend = backend || 'default'
+
+ return (
+
+ Backend Environment
+
+
{
+ const newBackend = currentBackend === 'python' ? 'php' : 'python'
+ setBackend(newBackend)
+ await signOut({
+ callbackUrl: '/',
+ })
+ }}
+ aria-label={`Switch to ${currentBackend === 'python' ? 'PHP' : 'Python'}`}
+ >
+
+
+
+
+
+ {currentBackend === 'python'
+ ? 'Python'
+ : currentBackend === 'php'
+ ? 'PHP'
+ : 'Default'}
+
+
+
+ {
+ setBackend('')
+ await signOut({
+ callbackUrl: '/',
+ })
+ }}
+ >
+ Default
+
+
+
+ )
+}
+
+function PythonIcon({ className }: { className?: string }) {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+function PhpIcon({ className }: { className?: string }) {
+ return (
+
+
+
+ )
+}
diff --git a/src/components/error/Particles404.tsx b/src/components/error/Particles404.tsx
deleted file mode 100644
index 07b5101e1..000000000
--- a/src/components/error/Particles404.tsx
+++ /dev/null
@@ -1,51 +0,0 @@
-import React, { useEffect } from "react";
-
-import useWindowWidth from "~/hooks/use-window-width";
-import { handleMouseEnter } from "~/lib/utils";
-import { particlesCanvas } from "./particles";
-
-const Particles404 = () => {
- const canvaReference = React.useRef(null);
- const { winWidth } = useWindowWidth();
-
- useEffect(() => {
- setTimeout(() => {
- if (!canvaReference.current) return;
- particlesCanvas(canvaReference.current);
- }, 500);
- }, [winWidth]);
- return (
-
-
-
-
-
- 404
-
-
- This is not the page you are looking for
-
-
-
- );
-};
-
-export default Particles404;
diff --git a/src/components/error/particles.ts b/src/components/error/particles.ts
deleted file mode 100644
index 4c801df8e..000000000
--- a/src/components/error/particles.ts
+++ /dev/null
@@ -1,152 +0,0 @@
-interface Mouse {
- radius: number;
- x: number;
- y: number;
-}
-
-export function particlesCanvas(canvasElement: HTMLCanvasElement) {
- const context = canvasElement.getContext("2d");
-
- const canvas = canvasElement;
- canvas.width = window.innerWidth * window.devicePixelRatio;
- canvas.height = window.innerHeight * window.devicePixelRatio;
-
- canvas.style.width = `${window.innerWidth}px`;
- canvas.style.height = `${window.innerHeight}px`;
-
- // Particles Class
- class Particle {
- private originX: number;
- private originY: number;
- private x: number;
- private y: number;
- private effect: Effect;
- private ctx: CanvasRenderingContext2D;
- private vx: number;
- private vy: number;
- private ease: number;
- private friction: number;
- private dx: number;
- private dy: number;
- private distance: number;
- private force: number;
- private angle: number;
- private size: number;
- public spread: number;
-
- constructor(x: number, y: number, effect: Effect) {
- this.originX = x;
- this.originY = y;
- this.effect = effect;
- this.x = Math.floor(x);
- this.y = Math.floor(y);
- this.ctx = effect.ctx;
- this.ctx.fillStyle = "#f97415";
- this.vx = 0;
- this.vy = 0;
- this.ease = 0.05;
- this.friction = 0.9;
- this.dx = 0;
- this.dy = 0;
- this.distance = 0;
- this.force = 0;
- this.angle = 0;
- // this.size = Math.floor(Math.random() * 5 + 2);
- this.size = 3;
- this.spread = 20;
- this.draw();
- }
- draw() {
- this.ctx.beginPath();
- this.ctx.fillRect(this.x, this.y, this.size, this.size);
- }
- update() {
- this.dx = this.effect.mouse.x - this.x;
- this.dy = this.effect.mouse.y - this.y;
- this.distance = this.dx * this.dx + this.dy * this.dy;
- this.force = (-this.effect.mouse.radius / this.distance) * this.spread;
-
- if (this.distance < this.effect.mouse.radius) {
- this.angle = Math.atan2(this.dy, this.dx);
- this.vx += this.force * Math.cos(this.angle);
- this.vy += this.force * Math.sin(this.angle);
- }
-
- this.x +=
- (this.vx *= this.friction) + (this.originX - this.x) * this.ease;
- this.y +=
- (this.vy *= this.friction) + (this.originY - this.y) * this.ease;
- this.draw();
- }
- }
-
- // Effect class
- class Effect {
- private width: number;
- private height: number;
- private gap: number;
- public ctx: CanvasRenderingContext2D;
- private particlesArray: Particle[];
- public readonly mouse: Mouse;
- constructor(
- width: number,
- height: number,
- context: CanvasRenderingContext2D,
- ) {
- this.width = width;
- this.height = height;
- this.ctx = context;
- this.particlesArray = [];
- this.gap = 20;
- this.mouse = {
- radius: 3000,
- x: 0,
- y: 0,
- };
-
- window.addEventListener("mousemove", (event) => {
- this.mouse.x = event.clientX * window.devicePixelRatio;
- this.mouse.y = event.pageY * window.devicePixelRatio;
- this.mouse.radius = 3000;
- });
- window.addEventListener("mouseout", () => {
- this.mouse.x = 0;
- this.mouse.y = 0;
- this.mouse.radius = 0;
- });
- window.addEventListener("resize", () => {
- canvas.width = window.innerWidth * window.devicePixelRatio;
- canvas.height = window.innerHeight * window.devicePixelRatio;
- this.width = canvas.width;
- this.height = canvas.height;
-
- canvas.style.width = `${window.innerWidth}px`;
- canvas.style.height = `${window.innerHeight}px`;
-
- this.particlesArray = [];
- });
-
- this.init();
- }
-
- init() {
- for (let x = 0; x < this.width; x += this.gap) {
- for (let y = 0; y < this.height; y += this.gap) {
- this.particlesArray.push(new Particle(x, y, this));
- }
- }
- }
- update() {
- this.ctx.clearRect(0, 0, this.width, this.height);
- for (let index = 0; index < this.particlesArray.length; index++) {
- this.particlesArray[index].update();
- }
- }
- }
- const effect = new Effect(canvas.width, canvas.height, context!);
- function animate() {
- effect.update();
- requestAnimationFrame(animate);
- }
- animate();
-}
diff --git a/src/components/extDynamicPages/blogCollection/BlogPageHero.tsx b/src/components/extDynamicPages/blogCollection/BlogPageHero.tsx
deleted file mode 100644
index 2c2b0cf3c..000000000
--- a/src/components/extDynamicPages/blogCollection/BlogPageHero.tsx
+++ /dev/null
@@ -1,36 +0,0 @@
-import Image from "next/image";
-
-import CustomButton from "~/components/common/common-button/common-button";
-import { blogHero } from "../../../../public/images/blogPage/utils";
-
-const HeroSection: React.FC = () => {
- return (
-
-
-
-
-
-
- Unlock Industry Insights: Get Essential Tips & Boilerplate Hacks
-
-
-
- Read More
-
-
-
- );
-};
-
-export default HeroSection;
diff --git a/src/components/external_static_page/Pagination.tsx b/src/components/external_static_page/Pagination.tsx
deleted file mode 100644
index 518f63d46..000000000
--- a/src/components/external_static_page/Pagination.tsx
+++ /dev/null
@@ -1,130 +0,0 @@
-"use client";
-
-import {
- Pagination as PaginationComponent,
- PaginationContent,
- PaginationItem,
- PaginationLink,
- PaginationNext,
- PaginationPrevious,
-} from "~/components/ui/pagination";
-
-export interface PaginationProperties {
- total: number;
- pageSize: number;
- currentPage: number;
- activeVariant?: "default" | "outline";
- navigationVariant?: "semibold" | "medium";
- onChange?: (page: number) => void;
-}
-
-const Pagination = ({
- total,
- pageSize,
- currentPage,
- activeVariant = "default",
- navigationVariant = "medium",
- onChange,
-}: PaginationProperties) => {
- const totalPages = Math.ceil(total / pageSize);
-
- const handleChange = (page: number) => {
- if (onChange) {
- onChange(page);
- }
- };
-
- const getPageNumbers = () => {
- const pages = [];
- const showEllipsis = totalPages > 3;
-
- if (showEllipsis === false) {
- for (let index = 1; index <= totalPages; index++) {
- pages.push(index);
- }
- } else {
- pages.push(1);
- if (currentPage > 4) {
- pages.push("...");
- }
-
- const firstPage = Math.max(2, currentPage - 2);
- const lastPage = Math.min(totalPages - 1, currentPage + 2);
-
- for (let index = firstPage; index <= lastPage; index++) {
- pages.push(index);
- }
-
- if (currentPage < totalPages - 3) {
- pages.push("...");
- }
- pages.push(totalPages);
- }
-
- return pages;
- };
-
- return (
-
-
-
- currentPage > 1 && handleChange(currentPage - 1)}
- className={`${
- navigationVariant === "semibold"
- ? "text-xl font-semibold leading-normal"
- : "text-base font-medium leading-6"
- } ${
- currentPage > 1
- ? "cursor-pointer"
- : "cursor-not-allowed text-stroke-colors-stroke hover:bg-transparent hover:text-stroke-colors-stroke"
- }`}
- href={currentPage > 1 ? `?page=${currentPage - 1}` : "#"}
- />
-
- {getPageNumbers().map((page, index) =>
- typeof page === "number" ? (
- handleChange(page)}>
-
- {page}
-
-
- ) : (
-
- {page}
-
- ),
- )}
-
- currentPage < totalPages && handleChange(currentPage + 1)
- }
- >
-
-
-
-
- );
-};
-
-export default Pagination;
diff --git a/src/components/external_static_page/SubPageHero.test.tsx b/src/components/external_static_page/SubPageHero.test.tsx
deleted file mode 100644
index e8cf40353..000000000
--- a/src/components/external_static_page/SubPageHero.test.tsx
+++ /dev/null
@@ -1,30 +0,0 @@
-import { render, screen } from "@testing-library/react";
-import { describe, expect, it } from "vitest";
-
-import SubPageHero from "./SubPageHero";
-
-describe(" ", () => {
- it("renders default heading and description", () => {
- expect.hasAssertions();
- render( );
- const heading = screen.getByText("Build Your Product Faster");
- const description = screen.getByText("Get Your Free Boilerplate Samples!");
-
- expect(heading).toBeInTheDocument();
- expect(description).toBeInTheDocument();
- });
-
- it("renders custom heading and description", () => {
- expect.hasAssertions();
- const customHeading = "Custom Heading";
- const customDescription = "Custom Description";
- render(
- ,
- );
- const heading = screen.getByText(customHeading);
- const description = screen.getByText(customDescription);
-
- expect(heading).toHaveTextContent(customHeading);
- expect(description).toBeInTheDocument();
- });
-});
diff --git a/src/components/external_static_page/SubPageHero.tsx b/src/components/external_static_page/SubPageHero.tsx
deleted file mode 100644
index 6f8f11019..000000000
--- a/src/components/external_static_page/SubPageHero.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-interface SubPageHeroProperty {
- heading?: string;
- description?: string;
-}
-
-const SubPageHero = ({
- heading = "Build Your Product Faster",
- description = "Get Your Free Boilerplate Samples!",
-}: SubPageHeroProperty) => {
- return (
-
-
-
{heading}
-
- {description}
-
-
-
- );
-};
-
-export default SubPageHero;
diff --git a/src/components/layouts/accordion/FaqAccordion.tsx b/src/components/faq/accordin.tsx
similarity index 52%
rename from src/components/layouts/accordion/FaqAccordion.tsx
rename to src/components/faq/accordin.tsx
index de0ab3991..363c6be34 100644
--- a/src/components/layouts/accordion/FaqAccordion.tsx
+++ b/src/components/faq/accordin.tsx
@@ -1,17 +1,17 @@
-import clsx from "clsx";
+import { cn } from '~/utils'
import {
Accordion,
AccordionContent,
AccordionItem,
AccordionTrigger,
-} from "~/components/ui/accordion";
+} from '~/components/ui/accordion'
interface FaqAccordionProperties {
- faqs: { question: string; answer: string }[];
- containerClassName?: string;
- triggerClassName?: string;
- contentClassName?: string;
+ faqs: { question: string; answer: string }[]
+ containerClassName?: string
+ triggerClassName?: string
+ contentClassName?: string
}
const FaqAccordion = ({
@@ -23,26 +23,26 @@ const FaqAccordion = ({
return (
{faqs?.map((faq, index) => (
{faq.question}
{faq.answer}
@@ -51,7 +51,7 @@ const FaqAccordion = ({
))}
- );
-};
+ )
+}
-export default FaqAccordion;
+export default FaqAccordion
diff --git a/src/components/faq/faqpage.tsx b/src/components/faq/faqpage.tsx
new file mode 100644
index 000000000..46223701e
--- /dev/null
+++ b/src/components/faq/faqpage.tsx
@@ -0,0 +1,93 @@
+'use client'
+
+import React, { useEffect } from 'react'
+import { useQuery } from '@tanstack/react-query'
+import useExternalStore from '~/hooks/external/use-external'
+import { getFaqs } from '~/actions/external/faq'
+import { FAQData } from '~/types'
+import useEnvironmentStore from '~/hooks/global/use-enviroment'
+import { Skeleton } from '../ui/skeleton'
+import Heading from '../miscellaneous/heading'
+import FaqAccordion from './accordin'
+
+interface QueryRes {
+ data?: FAQData
+ success: boolean
+ message?: string
+ status_code?: number
+}
+
+const FaqPage = () => {
+ const { setFAQs, faqs } = useExternalStore()
+ const { backend } = useEnvironmentStore()
+
+ const { data, error, isLoading } = useQuery({
+ queryKey: ['faqs', backend],
+ queryFn: () => getFaqs(backend),
+ })
+
+ useEffect(() => {
+ if (data && data.success && data.data) {
+ setFAQs(data.data)
+ }
+ }, [data, setFAQs])
+
+ if (isLoading) {
+ return (
+
+
+ {Array.from({ length: 4 }).map((_, index) => (
+
+
+
+ ))}
+
+ )
+ }
+
+ if (error) {
+ return an error {error.message} occured
+ }
+
+ return (
+
+
+
+ {faqs ? (
+ <>
+ {Object.entries(faqs).map(
+ ([category, questions], categoryIndex) => (
+
+
{category}
+
+
+ )
+ )}
+ >
+ ) : (
+
No results found.
+ )}
+
+
+ )
+}
+
+export default FaqPage
diff --git a/src/components/common/logo/logo.tsx b/src/components/global/logo.tsx
similarity index 76%
rename from src/components/common/logo/logo.tsx
rename to src/components/global/logo.tsx
index 0f8c6481f..03a94fd19 100644
--- a/src/components/common/logo/logo.tsx
+++ b/src/components/global/logo.tsx
@@ -1,11 +1,11 @@
-import Image from "next/image";
+import Image from 'next/image'
interface Properties {
- size: "big" | "small";
+ size: 'big' | 'small'
}
const Logo = ({ size }: Properties) => {
- const isSmall = size === "small";
+ const isSmall = size === 'small'
return (
<>
{isSmall ? (
@@ -24,7 +24,7 @@ const Logo = ({ size }: Properties) => {
/>
)}
>
- );
-};
+ )
+}
-export default Logo;
+export default Logo
diff --git a/src/components/common/logo/index.tsx b/src/components/global/main-logo.tsx
similarity index 80%
rename from src/components/common/logo/index.tsx
rename to src/components/global/main-logo.tsx
index a147d4365..5881900d2 100644
--- a/src/components/common/logo/index.tsx
+++ b/src/components/global/main-logo.tsx
@@ -1,5 +1,5 @@
-import Image from "next/image";
-import Link from "next/link";
+import Image from 'next/image'
+import Link from 'next/link'
const Logo = () => {
return (
@@ -16,7 +16,7 @@ const Logo = () => {
className="h-full w-full object-contain"
/>
- );
-};
+ )
+}
-export default Logo;
+export default Logo
diff --git a/src/components/layouts/homepage/Hero.tsx b/src/components/homepage/Hero.tsx
similarity index 88%
rename from src/components/layouts/homepage/Hero.tsx
rename to src/components/homepage/Hero.tsx
index 43b911e18..26a8c2702 100644
--- a/src/components/layouts/homepage/Hero.tsx
+++ b/src/components/homepage/Hero.tsx
@@ -1,16 +1,13 @@
-"use client";
+'use client'
-import { useTranslations } from "next-intl";
-import Image from "next/image";
-import Link from "next/link";
-import { A11y, Autoplay, Pagination, Scrollbar } from "swiper/modules";
-import { Swiper, SwiperSlide } from "swiper/react";
+import Image from 'next/image'
+import Link from 'next/link'
+import { A11y, Autoplay, Pagination, Scrollbar } from 'swiper/modules'
+import { Swiper, SwiperSlide } from 'swiper/react'
-import { HeroBoilerPlate, HeroChat, HeroCheckMark } from "./svgs";
+import { HeroBoilerPlate, HeroChat, HeroCheckMark } from './svgs'
const Hero = () => {
- const t = useTranslations("hero");
-
//
return (
@@ -19,7 +16,7 @@ const Hero = () => {
- {t("headline")}
+ Focus on What Matters. We've Got the Foundation Covered.
@@ -33,7 +30,8 @@ const Hero = () => {
- {t("description")}
+ Streamline your processes with a boilerplate built for efficiency
+ and optimal productivity.
{
className="rounded bg-primary px-8 py-4 text-background hover:bg-destructive"
data-testid="get-started"
>
- {t("cta")}
+ Get Started
-
- );
-};
+ )
+}
-export default Hero;
+export default Hero
diff --git a/src/components/homepage/HowItWorks.tsx b/src/components/homepage/HowItWorks.tsx
new file mode 100644
index 000000000..7bac13795
--- /dev/null
+++ b/src/components/homepage/HowItWorks.tsx
@@ -0,0 +1,87 @@
+import { Easy, Prebuilt, Scalable } from './svgs'
+
+const HowItWorks = () => {
+ return (
+
+
+
+
+
+ How It Works: Experience the
+ benefits of using our product with every step.
+
+
+ {` We designed our product to simplify your life. It offers a comprehensive solution. Here's how it works and how it benefits you at each stage.`}
+
+
+
+
+
+
+
+
+ Pre-Built Sections
+
+
+ {` Leverage pre-built sections like "Features," "Benefits," "Pricing," and "Testimonials" to showcase your product effectively.`}
+
+
+
+
+
+
+
+
+
+
+ Scalable Foundation
+
+
+ Our boilerplate is designed to grow with your product. Easily
+ add new features and functionalities as needed.
+
+
+
+
+
+
+
+
+
+
+ Easy Customization
+
+
+ Tailor the experience to your specific needs and preferences
+ for maximum results.
+
+
+
+
+
+
+
+ )
+}
+
+export default HowItWorks
diff --git a/src/components/layouts/homepage/PerfectFit.tsx b/src/components/homepage/PerfectFit.tsx
similarity index 57%
rename from src/components/layouts/homepage/PerfectFit.tsx
rename to src/components/homepage/PerfectFit.tsx
index d0e2ce196..683cf73e5 100644
--- a/src/components/layouts/homepage/PerfectFit.tsx
+++ b/src/components/homepage/PerfectFit.tsx
@@ -1,31 +1,25 @@
-"use client";
-
-import { useTranslations } from "next-intl";
-import Link from "next/link";
-
-//
+import Link from 'next/link'
const PerfectFit = () => {
- const t = useTranslations("perfectFit");
- //
-
return (
-
{t("title")}
+
Find The Perfect Fit
- {t("description")}
+ Choose the boilerplate plan that best suits your project needs and
+ budget. All plans include access to our comprehensive library of
+ pre-built sections, drag-and-drop customization.
- {t("cta")}
+ See Our Pricing Plan
- );
-};
+ )
+}
-export default PerfectFit;
+export default PerfectFit
diff --git a/src/components/layouts/homepage/TestimonialCard.tsx b/src/components/homepage/TestimonialCard.tsx
similarity index 75%
rename from src/components/layouts/homepage/TestimonialCard.tsx
rename to src/components/homepage/TestimonialCard.tsx
index c85d75621..ede5f73c2 100644
--- a/src/components/layouts/homepage/TestimonialCard.tsx
+++ b/src/components/homepage/TestimonialCard.tsx
@@ -1,21 +1,19 @@
-import { useTranslations } from "next-intl";
-import Image from "next/image";
+import Image from 'next/image'
-import { Rating } from "./svgs";
+import { Rating } from './svgs'
interface Properties {
- image: string;
- content: string;
- name: string;
- stack: string;
+ image: string
+ content: string
+ name: string
+ stack: string
}
const TestimonialCard = (properties: Properties) => {
- const t = useTranslations("testimonials");
return (
- {t(`${properties?.content}`)}
+ {properties?.content}
@@ -39,7 +37,7 @@ const TestimonialCard = (properties: Properties) => {
{properties?.stack}
- );
-};
+ )
+}
-export default TestimonialCard;
+export default TestimonialCard
diff --git a/src/components/layouts/homepage/Testimonials.tsx b/src/components/homepage/Testimonials.tsx
similarity index 79%
rename from src/components/layouts/homepage/Testimonials.tsx
rename to src/components/homepage/Testimonials.tsx
index 52757b910..b82adf0fa 100644
--- a/src/components/layouts/homepage/Testimonials.tsx
+++ b/src/components/homepage/Testimonials.tsx
@@ -1,38 +1,28 @@
-"use client";
+'use client'
-import { useTranslations } from "next-intl";
import {
A11y,
Autoplay,
Navigation,
Pagination,
Scrollbar,
-} from "swiper/modules";
-import { Swiper, SwiperSlide } from "swiper/react";
-
-import { TestimonialLeftArrow, TestimonialRightArrow } from "./svgs";
-
-import "swiper/css";
-import "swiper/css/navigation";
-import "swiper/css/pagination";
-import "swiper/css/scrollbar";
-
-import TestimonialCard from "./TestimonialCard";
-import { testimonials } from "./testimonials-data";
+} from 'swiper/modules'
+import { Swiper, SwiperSlide } from 'swiper/react'
+import { TestimonialLeftArrow, TestimonialRightArrow } from './svgs'
+import TestimonialCard from './TestimonialCard'
+import { testimonials } from './testimonials-data'
const Testimonials = () => {
- const t = useTranslations("testimonials");
-
return (
- {t("title")}
+ Client Testimonials
- {t("description")}
+ {` Don't just take our word for it - see what actual users of our product have to say about their experience.`}
@@ -58,8 +48,8 @@ const Testimonials = () => {
slidesPerView={1}
spaceBetween={20}
navigation={{
- nextEl: ".custom-next",
- prevEl: ".custom-prev",
+ nextEl: '.custom-next',
+ prevEl: '.custom-prev',
}}
// autoplay={{
// delay: 1000,
@@ -92,7 +82,7 @@ const Testimonials = () => {
- );
-};
+ )
+}
-export default Testimonials;
+export default Testimonials
diff --git a/src/components/layouts/homepage/UserSection.tsx b/src/components/homepage/UserSection.tsx
similarity index 77%
rename from src/components/layouts/homepage/UserSection.tsx
rename to src/components/homepage/UserSection.tsx
index 44a2ed3db..acf374768 100644
--- a/src/components/layouts/homepage/UserSection.tsx
+++ b/src/components/homepage/UserSection.tsx
@@ -1,17 +1,12 @@
-import { useTranslations } from "next-intl";
-
-import { Descript, Grammarly, Intercom, Notion, UnSplash } from "./svgs";
+import { Descript, Grammarly, Intercom, Notion, UnSplash } from './svgs'
const UserSection = () => {
- const t = useTranslations("userSection");
-
return (
- {t("userSectionMoreThan")}{" "}
- {t("userSectionUsers")} {" "}
- {t("userSectionUsage")}
+ More than 200 Users make use of
+ our Boilerplate
@@ -39,7 +34,7 @@ const UserSection = () => {
- );
-};
+ )
+}
-export default UserSection;
+export default UserSection
diff --git a/src/components/layouts/homepage/Video.tsx b/src/components/homepage/Video.tsx
similarity index 92%
rename from src/components/layouts/homepage/Video.tsx
rename to src/components/homepage/Video.tsx
index 37f0eb6c1..6cdbef29d 100644
--- a/src/components/layouts/homepage/Video.tsx
+++ b/src/components/homepage/Video.tsx
@@ -11,6 +11,6 @@ const Video = () => {
Your browser does not support the video tag.
- );
-};
-export default Video;
+ )
+}
+export default Video
diff --git a/src/components/layouts/homepage/svgs.tsx b/src/components/homepage/svgs.tsx
similarity index 99%
rename from src/components/layouts/homepage/svgs.tsx
rename to src/components/homepage/svgs.tsx
index c37f98b03..035169b35 100644
--- a/src/components/layouts/homepage/svgs.tsx
+++ b/src/components/homepage/svgs.tsx
@@ -14,8 +14,8 @@ export const HeroLine = () => {
strokeLinecap="round"
/>
- );
-};
+ )
+}
export const HeroCheckMark = () => {
return (
@@ -39,8 +39,8 @@ export const HeroCheckMark = () => {
strokeWidth="2"
/>
- );
-};
+ )
+}
export const HeroChat = () => {
return (
@@ -78,8 +78,8 @@ export const HeroChat = () => {
- );
-};
+ )
+}
export const HeroBoilerPlate = () => {
return (
@@ -107,8 +107,8 @@ export const HeroBoilerPlate = () => {
fill="#A9A7B6"
/>
- );
-};
+ )
+}
export const UnSplash = () => {
return (
@@ -136,8 +136,8 @@ export const UnSplash = () => {
- );
-};
+ )
+}
export const Notion = () => {
return (
@@ -176,8 +176,8 @@ export const Notion = () => {
/>
- );
-};
+ )
+}
export const Intercom = () => {
return (
@@ -244,8 +244,8 @@ export const Intercom = () => {
/>
- );
-};
+ )
+}
export const Descript = () => {
return (
@@ -269,8 +269,8 @@ export const Descript = () => {
/>
- );
-};
+ )
+}
export const Grammarly = () => {
return (
@@ -299,8 +299,8 @@ export const Grammarly = () => {
/>
- );
-};
+ )
+}
export const Prebuilt = () => {
return (
@@ -361,8 +361,8 @@ export const Prebuilt = () => {
- );
-};
+ )
+}
export const Scalable = () => {
return (
@@ -429,8 +429,8 @@ export const Scalable = () => {
- );
-};
+ )
+}
export const Easy = () => {
return (
@@ -490,8 +490,8 @@ export const Easy = () => {
- );
-};
+ )
+}
export const Rating = () => {
return (
@@ -525,8 +525,8 @@ export const Rating = () => {
/>
- );
-};
+ )
+}
export const TestimonialLeftArrow = () => {
return (
@@ -552,8 +552,8 @@ export const TestimonialLeftArrow = () => {
strokeLinejoin="round"
/>
- );
-};
+ )
+}
export const TestimonialRightArrow = () => {
return (
@@ -579,5 +579,5 @@ export const TestimonialRightArrow = () => {
strokeLinejoin="round"
/>
- );
-};
+ )
+}
diff --git a/src/components/homepage/testimonials-data.ts b/src/components/homepage/testimonials-data.ts
new file mode 100644
index 000000000..f8cfea3b9
--- /dev/null
+++ b/src/components/homepage/testimonials-data.ts
@@ -0,0 +1,44 @@
+export const testimonials = [
+ {
+ id: 1,
+ image: '/images/testimonial-image1.svg',
+ stack: 'Freelance Designer',
+ name: 'Jane Smith',
+ content: `“I've been using this web hosting service for over a year and I'm really impressed with the uptime and support. The website has never gone down and the customer service is always quick to help with any issues I have. Highly recommend!”`,
+ },
+ {
+ id: 2,
+ image: '/images/testimonial-image2.svg',
+ stack: 'Software Developer',
+ name: 'Tom Williams',
+ content: `“I've been using this web hosting service for a few months now and overall it's been fine.The uptime has been good and I haven't had any major issues. The pricing is also reasonable. Nothing particularly stands out as exceptional, but it gets the job done.”`,
+ },
+ {
+ id: 3,
+ image: '/images/testimonial-image3.svg',
+ stack: 'Online Entrepreneur',
+ name: 'Michael Brown',
+ content: `“I've been using this web hosting service for a few months and it's been nothing but problems. My website has gone down multiple times and the customer service has been unresponsive. I would not recommend this company."`,
+ },
+ {
+ id: 4,
+ image: '/images/testimonial-image1.svg',
+ stack: 'Freelance Designer',
+ name: 'Jane Smith',
+ content: `“I've been using this web hosting service for over a year and I'm really impressed with the uptime and support. The website has never gone down and the customer service is always quick to help with any issues I have. Highly recommend!”`,
+ },
+ {
+ id: 5,
+ image: '/images/testimonial-image2.svg',
+ stack: 'Software Developer',
+ name: 'Tom Williams',
+ content: `“I've been using this web hosting service for a few months now and overall it's been fine.The uptime has been good and I haven't had any major issues. The pricing is also reasonable. Nothing particularly stands out as exceptional, but it gets the job done.”`,
+ },
+ {
+ id: 6,
+ image: '/images/testimonial-image3.svg',
+ stack: 'Online Entrepreneur',
+ name: 'Michael Brown',
+ content: `“I've been using this web hosting service for a few months and it's been nothing but problems. My website has gone down multiple times and the customer service has been unresponsive. I would not recommend this company."`,
+ },
+]
diff --git a/src/components/icons/google-logo.tsx b/src/components/icons/google-logo.tsx
new file mode 100644
index 000000000..283b28c0d
--- /dev/null
+++ b/src/components/icons/google-logo.tsx
@@ -0,0 +1,50 @@
+import { cn } from '~/utils'
+import React, { forwardRef } from 'react'
+export interface SVGProps extends React.SVGAttributes {
+ children?: React.ReactNode
+}
+
+const GoogleLogo = forwardRef(
+ ({ className, ...props }, ref) => {
+ return (
+
+
+
+
+
+
+ )
+ }
+)
+
+GoogleLogo.displayName = 'GoogleLogo'
+export default GoogleLogo
diff --git a/src/components/languageSwitcher/languageSwitcher.tsx b/src/components/languageSwitcher/languageSwitcher.tsx
deleted file mode 100644
index d0479e2d8..000000000
--- a/src/components/languageSwitcher/languageSwitcher.tsx
+++ /dev/null
@@ -1,78 +0,0 @@
-import Image from "next/image";
-import { useEffect, useState } from "react";
-
-import { Locale } from "~/utils/config";
-import { Language, languages } from "~/utils/languages";
-import { setUserLocale } from "~/utils/locale";
-
-const LanguageSwitcher: React.FC = () => {
- const [selectedLanguage, setSelectedLanguage] = useState(
- localStorage.getItem("preferredLanguage") || "en",
- );
- const [isOpen, setIsOpen] = useState(false);
-
- useEffect(() => {
- localStorage.setItem("preferredLanguage", selectedLanguage);
- }, [selectedLanguage]);
-
- const handleLanguageChange = (language: Language) => {
- const locale = language.code as Locale;
- setUserLocale(locale);
- setSelectedLanguage(language.code);
- setIsOpen(false);
- };
-
- const toggleDropdown = () => {
- setIsOpen(!isOpen);
- };
-
- const findFlag = (code: string) => {
- const language = languages.find((lang) => lang.code === code);
- return language ? language.flag : "/images/flags/en.svg";
- };
-
- const flagPath = findFlag(selectedLanguage);
-
- return (
- <>
-
-
-
-
- {selectedLanguage}
-
-
- {isOpen && (
-
-
-
- SELECT YOUR LANGUAGE
-
- {languages.map((language) => (
-
- handleLanguageChange(language)}
- >
-
-
{language.name}
-
-
- ))}
-
-
- )}
-
- >
- );
-};
-
-export default LanguageSwitcher;
diff --git a/src/components/layout.tsx b/src/components/layout.tsx
deleted file mode 100644
index b72e26461..000000000
--- a/src/components/layout.tsx
+++ /dev/null
@@ -1,17 +0,0 @@
-"use client";
-
-import Providers from "~/components/providers";
-import AuthProvider from "~/contexts/authContext";
-
-export default function RootLayout({
- children,
-}: Readonly<{
- children: React.ReactNode;
-}>) {
- return (
-
-
- {children}
-
- );
-}
diff --git a/src/components/layouts/BlogCards/index.tsx b/src/components/layouts/BlogCards/index.tsx
deleted file mode 100644
index 001c190c5..000000000
--- a/src/components/layouts/BlogCards/index.tsx
+++ /dev/null
@@ -1,54 +0,0 @@
-import Image from "next/image";
-
-import BlogLabel from "~/app/(landing-routes)/blog/_component/label";
-import { Card, CardHeader, CardTitle } from "~/components/ui/card";
-
-interface BlogCardProperties {
- title: string;
- date: string;
- readTime: string;
- category: string;
- image: string;
- labelClassName: string;
- onClick?: () => void;
-}
-
-const BlogCard: React.FC = ({
- title,
- date,
- readTime,
- category,
- image,
- onClick,
-}) => {
- return (
-
-
-
-
-
-
-
-
-
- {title}
-
-
- {date}
- {readTime} mins read
-
-
-
- );
-};
-
-export default BlogCard;
diff --git a/src/components/layouts/Legal/PrivacyPolicy/PrivacyPolicyContent.tsx b/src/components/layouts/Legal/PrivacyPolicy/PrivacyPolicyContent.tsx
deleted file mode 100644
index f883a8b3d..000000000
--- a/src/components/layouts/Legal/PrivacyPolicy/PrivacyPolicyContent.tsx
+++ /dev/null
@@ -1,62 +0,0 @@
-import Link from "next/link";
-
-import {
- LegalTermContentItem,
- LegalTermData,
-} from "~/components/layouts/Legal/PrivacyPolicy/constants/privacyPolicyData";
-import { cn } from "~/lib/utils";
-
-type PrivacyPolicyContentProperties = {
- className?: string;
- content: LegalTermData;
-};
-
-export default function PrivacyPolicyContent({
- className,
- content,
-}: PrivacyPolicyContentProperties) {
- const renderContent = (content: LegalTermContentItem) => {
- return content.list ? (
-
-
{content.text}
-
-
- {content.list.map((item, index) => (
-
- {item.title} {item.body}
-
- ))}
-
-
- ) : (
- {content.text}
- );
- };
-
- return (
-
- {content.map((section) => (
-
-
- {section.title}
-
- {renderContent(section.description)}
-
- ))}
-
- For more information about our terms and conditions, please visit
- our
-
- Terms and Conditions page
-
- .
-
-
- );
-}
diff --git a/src/components/layouts/Legal/PrivacyPolicy/constants/privacyPolicyData.ts b/src/components/layouts/Legal/PrivacyPolicy/constants/privacyPolicyData.ts
deleted file mode 100644
index 0f9038b8d..000000000
--- a/src/components/layouts/Legal/PrivacyPolicy/constants/privacyPolicyData.ts
+++ /dev/null
@@ -1,157 +0,0 @@
-export type LegalTermContentItem = {
- text: string;
- list?: {
- title: string;
- body: string;
- }[];
-};
-
-export type LegalTermData = {
- id: string;
- title: string;
- description: LegalTermContentItem;
-}[];
-
-const privacyPolicyData: LegalTermData = [
- {
- id: "intro",
- title: "Introduction",
- description: {
- text: "At Boilerplate Hng, we prioritize your privacy and are committed to protecting your personal information. This Privacy Policy outlines the types of information we collect, how we use it, and the measures we take to ensure its security. By using our services, you agree to the collection and use of information in accordance with this policy.",
- },
- },
- {
- id: "info-we-collect",
- title: "Information We Collect",
- description: {
- text: "We collect various types of information in connection with the services we provide, including:",
- list: [
- {
- title: "Personal Information:",
- body: "This includes any information that can be used to identify you personally, such as your name, email address, phone number, and payment information. We collect personal information when you create an account, make a purchase, or interact with our customer support.",
- },
- {
- title: "Usage Information:",
- body: "This refers to information about how you use our services, such as your IP address, browser type, pages visited, and the time spent on those pages. We collect this information to understand how our users interact with our services and to improve our offerings.",
- },
- {
- title: "Cookies and Tracking Technologies:",
- body: "We use cookies and other tracking technologies to enhance your experience on our website, analyze site traffic, and for security purposes. Cookies are small data files stored on your device that help us recognize you and provide a more personalized experience.",
- },
- ],
- },
- },
- {
- id: "how-we-use-your-info",
- title: "How We Use Your Information",
- description: {
- text: "We use the information we collect to:",
- list: [
- {
- title: "Provide and Improve Our Services:",
- body: "Your information helps us deliver the services you request and improve our offerings based on your feedback and interactions.",
- },
- {
- title: "Personalize Your Experience:",
- body: "We use your information to tailor our services to your preferences and provide you with relevant description and recommendations.",
- },
- {
- title: "Communicate with You:",
- body: "We may use your contact information to send you updates, newsletters, and promotional materials. You can opt-out of receiving marketing communications at any time.",
- },
- {
- title: "Ensure Security and Prevent Fraud:",
- body: "Your information helps us protect your account and our services from unauthorized access and other security threats.",
- },
- {
- title: "Comply with Legal Obligations:",
- body: "We may use your information to comply with legal requirements, such as tax regulations and data protection laws.",
- },
- ],
- },
- },
- {
- id: "sharing-your-info",
- title: "Sharing Your Information",
- description: {
- text: "We do not sell your personal information to third parties. We may share your information with:",
- list: [
- {
- title: "Service Providers:",
- body: "We work with trusted third-party companies that perform services on our behalf, such as payment processing, data analysis, and customer support. These service providers have access to your information only to perform these tasks and are obligated to protect your information.",
- },
- {
- title: "Legal Authorities:",
- body: "We may disclose your information if required by law or if we believe that such action is necessary to comply with legal processes, protect our rights, or ensure the safety of our users.",
- },
- {
- title: "Business Transfers:",
- body: "If we are involved in a merger, acquisition, or sale of assets, your information may be transferred as part of that transaction. We will notify you of any such changes and the choices you have regarding your information.",
- },
- ],
- },
- },
-
- {
- id: "your-choices-and-rights",
- title: "Your Choices and Rights",
- description: {
- text: "You have certain rights regarding your personal information, including:",
- list: [
- {
- title: "Access and Correction:",
- body: "You can request access to and correction of your personal information by contacting us at [Your Contact Information].",
- },
- {
- title: "Deletion:",
- body: "You can request the deletion of your personal information, subject to certain legal obligations we may have to retain your information.",
- },
- {
- title: "Opt-Out of Marketing Communications:",
- body: "You can opt-out of receiving marketing communications from us by following the unsubscribe instructions in the emails or contacting us directly.",
- },
- {
- title: "Cookies Management:",
- body: "You can manage your cookie preferences through your browser settings. However, disabling cookies may affect your ability to use some features of our services.",
- },
- ],
- },
- },
- {
- id: "security-measures",
- title: "Security Measures",
- description: {
- text: "We implement robust security measures to protect your information from unauthorized access, disclosure, alteration, and destruction. These measures include encryption, secure servers, and regular security assessments. However, no security system is completely infallible, and we cannot guarantee the absolute security of your information.",
- },
- },
- {
- id: "changes-to-this-privacy-policy",
- title: "Changes to This Privacy Policy",
- description: {
- text: "We may update this Privacy Policy from time to time to reflect changes in our practices or legal requirements. When we make changes, we will notify you by updating the date at the top of this policy and providing a more prominent notice if the changes are significant. We encourage you to review this policy periodically to stay informed about how we are protecting your information.",
- },
- },
- {
- id: "contact-us",
- title: "Contact Us",
- description: {
- text: "If you have any questions or concerns about this Privacy Policy or our data practices, please contact us at [Your Contact Information].",
- },
- },
- {
- id: "last-updated",
- title: "Last Updated",
- description: {
- text: "This Privacy Policy was last updated on 13/07/2024.",
- },
- },
-];
-
-export const getTableOfContents = (data: LegalTermData) => {
- return data.map((section) => ({
- href: `#${section.id}`,
- label: section.title,
- }));
-};
-
-export default privacyPolicyData;
diff --git a/src/components/layouts/Legal/TableOfContent.tsx b/src/components/layouts/Legal/TableOfContent.tsx
deleted file mode 100644
index 53273edd8..000000000
--- a/src/components/layouts/Legal/TableOfContent.tsx
+++ /dev/null
@@ -1,31 +0,0 @@
-import { cn } from "~/lib/utils";
-import TableOfContentItem from "./TableOfContentItem";
-
-type TableOfContentProperties = {
- className?: string;
- listOfContent: { href: string; label: string }[];
-};
-
-export default function TableOfContent({
- className,
- listOfContent,
-}: TableOfContentProperties) {
- return (
-
-
- Table of Content
-
-
-
- {listOfContent.map((item) => (
-
- {item.label}
-
- ))}
-
-
- );
-}
diff --git a/src/components/layouts/Legal/TableOfContentItem.tsx b/src/components/layouts/Legal/TableOfContentItem.tsx
deleted file mode 100644
index 8381ef473..000000000
--- a/src/components/layouts/Legal/TableOfContentItem.tsx
+++ /dev/null
@@ -1,37 +0,0 @@
-import Link, { LinkProps } from "next/link";
-import { DetailedHTMLProps, LiHTMLAttributes, ReactNode } from "react";
-
-import { cn } from "~/lib/utils";
-
-type TableOfContentItemProperties = DetailedHTMLProps<
- LiHTMLAttributes,
- HTMLLIElement
-> & {
- className?: string;
- children: ReactNode;
- href: LinkProps["href"];
-};
-
-export default function TableOfContentItem({
- className,
- children,
- href,
- ...rest
-}: TableOfContentItemProperties) {
- return (
-
-
- {children}
-
-
- );
-}
diff --git a/src/components/layouts/Legal/Terms&Conditions/AcceptableUse.tsx b/src/components/layouts/Legal/Terms&Conditions/AcceptableUse.tsx
deleted file mode 100644
index 24dbc272f..000000000
--- a/src/components/layouts/Legal/Terms&Conditions/AcceptableUse.tsx
+++ /dev/null
@@ -1,35 +0,0 @@
-import { AcceptableUsePolicy } from "./constants/constant";
-
-interface TermsType {
- title: string;
- value: string;
-}
-
-const AcceptableUse = () => {
- return (
-
-
- Acceptable Use Policy
-
-
-
- To maintain a positive and productive environment, we have established
- the following acceptable use policy:
-
-
- {AcceptableUsePolicy.map((list: TermsType) => (
-
- {list.title} {" "}
- {list.value}
-
- ))}
-
-
-
- );
-};
-
-export default AcceptableUse;
diff --git a/src/components/layouts/Legal/Terms&Conditions/Disclaimer.tsx b/src/components/layouts/Legal/Terms&Conditions/Disclaimer.tsx
deleted file mode 100644
index 549cf0cc0..000000000
--- a/src/components/layouts/Legal/Terms&Conditions/Disclaimer.tsx
+++ /dev/null
@@ -1,36 +0,0 @@
-import { Disclaimers } from "./constants/constant";
-
-interface TermsType {
- title: string;
- value: string;
-}
-
-const Disclaimer = () => {
- return (
-
-
- Disclaimers and Limitations of Liability
-
-
-
- To ensure clarity regarding our responsibilities and your
- expectations, the following disclaimers and limitations of liability
- apply:
-
-
- {Disclaimers.map((list: TermsType) => (
-
- {list.title} {" "}
- {list.value}
-
- ))}
-
-
-
- );
-};
-
-export default Disclaimer;
diff --git a/src/components/layouts/Legal/Terms&Conditions/GoverningLaws.tsx b/src/components/layouts/Legal/Terms&Conditions/GoverningLaws.tsx
deleted file mode 100644
index 2763d7060..000000000
--- a/src/components/layouts/Legal/Terms&Conditions/GoverningLaws.tsx
+++ /dev/null
@@ -1,35 +0,0 @@
-import { GoverningLaw } from "./constants/constant";
-
-interface TermsType {
- title: string;
- value: string;
-}
-
-const GoverningLaws = () => {
- return (
-
-
- Governing Law and Dispute Resolution
-
-
-
- To address any disputes that may arise, the following provisions
- apply:
-
-
- {GoverningLaw.map((list: TermsType) => (
-
- {list.title} {" "}
- {list.value}
-
- ))}
-
-
-
- );
-};
-
-export default GoverningLaws;
diff --git a/src/components/layouts/Legal/Terms&Conditions/IntellectualProperty.tsx b/src/components/layouts/Legal/Terms&Conditions/IntellectualProperty.tsx
deleted file mode 100644
index e07d8bead..000000000
--- a/src/components/layouts/Legal/Terms&Conditions/IntellectualProperty.tsx
+++ /dev/null
@@ -1,36 +0,0 @@
-import { IntellectualPropertyRight } from "./constants/constant";
-
-interface TermsType {
- title: string;
- value: string;
-}
-
-const IntellectualProperty = () => {
- return (
-
-
- Intellectual Property Rights
-
-
-
- We value and respect intellectual property rights and expect our users
- to do the same. The following guidelines outline our stance on
- intellectual property:
-
-
- {IntellectualPropertyRight.map((list: TermsType) => (
-
- {list.title} {" "}
- {list.value}
-
- ))}
-
-
-
- );
-};
-
-export default IntellectualProperty;
diff --git a/src/components/layouts/Legal/Terms&Conditions/Main.tsx b/src/components/layouts/Legal/Terms&Conditions/Main.tsx
deleted file mode 100644
index 55a705838..000000000
--- a/src/components/layouts/Legal/Terms&Conditions/Main.tsx
+++ /dev/null
@@ -1,137 +0,0 @@
-"use client";
-
-import Link from "next/link";
-import { useEffect } from "react";
-
-import AcceptableUse from "./AcceptableUse";
-import Disclaimer from "./Disclaimer";
-import GoverningLaws from "./GoverningLaws";
-import IntellectualProperty from "./IntellectualProperty";
-import TableOfContents from "./TableOfContents";
-import UserObligations from "./UserObligations";
-
-const dateSuffix = (day: number) => {
- if (day > 3 && day < 21) return "th";
- switch (day % 10) {
- case 1: {
- return "st";
- }
- case 2: {
- return "nd";
- }
- case 3: {
- return "rd";
- }
- default: {
- return "th";
- }
- }
-};
-
-const formattedDate = (date: Date) => {
- const day = date.getDate();
- const month = date.toLocaleString("default", { month: "long" });
- const year = date.getFullYear();
-
- return `${day}${dateSuffix(day)} ${month}, ${year}`;
-};
-
-const Main = () => {
- const lastUpdate = new Date("2024-07-20");
-
- useEffect(() => {
- document.documentElement.style.scrollPaddingTop = "80px";
- document.documentElement.style.scrollBehavior = "smooth";
- return () => {
- document.documentElement.style.scrollPaddingTop = "";
- document.documentElement.style.scrollBehavior = "";
- };
- }, []);
-
- //
-
- return (
-
-
-
-
-
- Introduction
-
-
- Welcome to Boilerplate Hng. These Terms and Conditions govern your
- use of our website and services. By accessing or using our site,
- you agree to comply with and be bound by these terms. If you do
- not agree, please do not use our website..
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Changes to Terms
-
-
- We reserve the right to modify these Terms and Conditions at any
- time. Changes will be effective immediately upon posting on our
- website. Your continued use of the site constitutes your
- acceptance of the revised terms. We encourage you to review these
- terms periodically to stay informed of any updates
-
-
-
-
-
- Last Updated
-
-
- These Terms and Conditions were last updated on [
- {formattedDate(lastUpdate)}]. Please review them periodically for
- any changes.
-
-
-
- For more information about our privacy practices, please visit our{" "}
-
- Privacy Policy page.
-
-
-
-
-
-
- );
-};
-
-export default Main;
diff --git a/src/components/layouts/Legal/Terms&Conditions/SubPageHero.tsx b/src/components/layouts/Legal/Terms&Conditions/SubPageHero.tsx
deleted file mode 100644
index 78f22f96a..000000000
--- a/src/components/layouts/Legal/Terms&Conditions/SubPageHero.tsx
+++ /dev/null
@@ -1,54 +0,0 @@
-interface SubPageHeroProperty {
- subheading?: string;
- heading?: string;
- description?: string;
- wordToStyleIndex?: number;
- styledWordClassName?: string;
-}
-
-const SubPageHero = ({
- subheading,
- heading,
- description,
- wordToStyleIndex,
-}: SubPageHeroProperty) => {
- const words = heading?.split(" ");
-
- return (
-
-
- {subheading && (
-
- {subheading}
-
- )}
- {heading && (
-
- {words?.map((word, index) => (
-
- {word}{" "}
-
- ))}
-
- )}
- {description && (
-
- {description}
-
- )}
-
-
- );
-};
-
-export default SubPageHero;
diff --git a/src/components/layouts/Legal/Terms&Conditions/TableOfContents.tsx b/src/components/layouts/Legal/Terms&Conditions/TableOfContents.tsx
deleted file mode 100644
index 4df08c438..000000000
--- a/src/components/layouts/Legal/Terms&Conditions/TableOfContents.tsx
+++ /dev/null
@@ -1,30 +0,0 @@
-import Link from "next/link";
-
-import { Contents } from "./constants/constant";
-
-interface ContentProperties {
- id: string;
- text: string;
-}
-
-const TableOfContents = () => {
- return (
-
-
- Table of Contents
-
-
- {Contents.map((list: ContentProperties) => (
-
- {list.text}
-
- ))}
-
-
- );
-};
-
-export default TableOfContents;
diff --git a/src/components/layouts/Legal/Terms&Conditions/UserObligations.tsx b/src/components/layouts/Legal/Terms&Conditions/UserObligations.tsx
deleted file mode 100644
index 1eb0ff9d3..000000000
--- a/src/components/layouts/Legal/Terms&Conditions/UserObligations.tsx
+++ /dev/null
@@ -1,35 +0,0 @@
-import { Obligations } from "./constants/constant";
-
-interface TermsType {
- title: string;
- value: string;
-}
-
-const UserObligations = () => {
- return (
-
-
- User Obligations
-
-
-
- As a user of our services, you are expected to adhere to the following
- obligations to ensure a safe and enjoyable experience for all users:
-
-
- {Obligations.map((list: TermsType) => (
-
- {list.title} {" "}
- {list.value}
-
- ))}
-
-
-
- );
-};
-
-export default UserObligations;
diff --git a/src/components/layouts/Legal/Terms&Conditions/constants/constant.ts b/src/components/layouts/Legal/Terms&Conditions/constants/constant.ts
deleted file mode 100644
index 9bf49bac8..000000000
--- a/src/components/layouts/Legal/Terms&Conditions/constants/constant.ts
+++ /dev/null
@@ -1,137 +0,0 @@
-export const Obligations = [
- {
- title: " Provide Accurate Information:",
- value:
- " When creating an account, you must provide accurate and complete information. This includes your name, email address, and any other required details. Providing false information can result in the termination of your account.",
- },
- {
- title: " Maintain Account Security:",
- value:
- " You are responsible for maintaining the confidentiality of your account credentials. Do not share your password with anyone and notify us immediately if you suspect any unauthorized use of your account. We are not liable for any loss or damage arising from your failure to comply with this security obligation.",
- },
- {
- title: " Comply with Applicable Laws:",
- value:
- "Your use of our services must comply with all applicable laws and regulations. This includes local, state, national, and international laws. Any illegal activity will result in the immediate termination of your account and may be reported to the relevant authorities.",
- },
- {
- title: "Respect Intellectual Property Rights: ",
- value:
- " You must respect the intellectual property rights of others. Do not upload, share, or distribute content that infringes on someone else's intellectual property rights. This includes copyrighted materials, trademarks, and any other proprietary information.",
- },
- {
- title: "Prohibited Conduct:",
- value:
- " You must not engage in any conduct that is harmful, offensive, or disruptive. This includes, but is not limited to, harassment, spamming, phishing, or distributing malware. Any behavior that we deem inappropriate will result in the termination of your account.",
- },
- {
- title: "Use Services as Intended:",
- value:
- "You must use our services only for their intended purposes. Do not attempt to exploit or misuse our services in any way. This includes circumventing any security measures, using automated tools to access our services, or interfering with the",
- },
-];
-
-export const AcceptableUsePolicy = [
- {
- title: "Respectful Communication",
- value:
- "All interactions on our platform must be respectful and professional. Do not use offensive, abusive, or inflammatory language. Treat all users with respect and courtesy.",
- },
- {
- title: "No Misrepresentation:",
- value:
- " Do not impersonate any person or entity, or falsely state or otherwise misrepresent your affiliation with a person or entity. Authenticity is crucial to maintaining trust on our platform.",
- },
- {
- title: "Privacy Protection",
- value:
- "Do not collect or store personal data about other users without their express permission. Respect the privacy of others and adhere to all applicable privacy laws and regulations.",
- },
- {
- title: "Appropriate Content",
- value:
- "All content shared on our platform must be appropriate and lawful. Do not share content that is obscene, defamatory, threatening, or otherwise objectionable. This includes text, images, videos, and any other form of media.",
- },
- {
- title: "Compliance with Policies:",
- value:
- "You must comply with all our policies, including our Privacy Policy and any additional guidelines we may provide. Familiarize yourself with our policies to ensure you are using our services appropriately.",
- },
-];
-export const IntellectualPropertyRight = [
- {
- title: "Ownership of Content:",
- value:
- "All content on our website, including text, graphics, logos, and images, is the property of boilerplate Hng or its content suppliers and is protected by intellectual property laws. You may not use, reproduce, or distribute any content without our express written permission.",
- },
- {
- title: "User-Generated Content:",
- value:
- "By submitting content to our platform, you grant us a non-exclusive, royalty-free, perpetual, and worldwide license to use, reproduce, modify, publish, and distribute your content. You retain all rights to your content, but you grant us the right to use it in connection with our services.",
- },
- {
- title: "Infringement Claims:",
- value:
- "If you believe that your intellectual property rights have been infringed, please contact us with detailed information about the alleged infringement. We will investigate the matter and take appropriate action, which may include removing the infringing content and terminating the accounts of repeat infringers.",
- },
- {
- title: "Trademarks",
- value:
- " Our trademarks and trade dress may not be used in connection with any product or service without our prior written consent. Any unauthorized use of our trademarks is strictly prohibited.",
- },
-];
-
-export const Disclaimers = [
- {
- title: "No Warranties:",
- value:
- 'Our website and services are provided "as is" without any warranties, express or implied. We do not guarantee the accuracy, completeness, or reliability of the content on our site. Your use of our services is at your own risk.',
- },
- {
- title: "Limitation of Liability",
- value:
- "To the fullest extent permitted by law, [Your Company Name] disclaims all liability for any damages arising from your use of our website and services. This includes direct, indirect, incidental, consequential, and punitive damages.",
- },
- {
- title: "Third-Party Content:",
- value:
- "Our website may contain links to third-party websites and content. We do not endorse or assume any responsibility for any third-party content. Your interactions with third-party websites are solely between you and the third party.",
- },
- {
- title: "Indemnification:",
- value:
- "You agree to indemnify and hold harmless [Your Company Name] and its affiliates, officers, agents, and employees from any claims, liabilities, damages, losses, and expenses arising from your use of our services or your violation of these Terms and Conditions.",
- },
-];
-
-export const GoverningLaw = [
- {
- title: "Governing Law:",
- value:
- "These Terms and Conditions are governed by the laws of [Your Country/State], without regard to its conflict of laws principles. Any legal action or proceeding arising under these terms will be brought exclusively in the courts of [Your Jurisdiction].",
- },
- {
- title: "Dispute Resolution:",
- value:
- "We are committed to resolving disputes amicably and efficiently. In the event of a dispute, you agree to first attempt to resolve the matter informally by contacting us. If the dispute cannot be resolved informally, we agree to submit the matter to mediation before pursuing any other form of dispute resolution.",
- },
- {
- title: "Arbitration:",
- value:
- "If mediation fails, any dispute arising from these Terms and Conditions will be resolved by binding arbitration in accordance with the rules of [Arbitration Organization]. The arbitration will be conducted in [Location], and the arbitrator's decision will be final and binding",
- },
-];
-
-export const SECTIONS = [
- { id: "introduction", text: "Introduction" },
- { id: "user-obligations", text: "User Obligations" },
- { id: "acceptable-use-policy", text: "Acceptable Use Policy" },
- { id: "intellectual-property", text: "Intellectual Property Right" },
- { id: "disclaimer", text: "Disclaimer and Limitation of Liability" },
- { id: "governing-law", text: "Governing Law and Dispute Resolution" },
- { id: "changes-to-terms", text: "Changes to Terms" },
- { id: "contact-information", text: "Contact Information" },
- { id: "last-updated", text: "Last Updated Date" },
-] as const;
-
-export const Contents = SECTIONS.map(({ id, text }) => ({ id, text }));
diff --git a/src/components/layouts/aboutUs/Blog.tsx b/src/components/layouts/aboutUs/Blog.tsx
deleted file mode 100644
index bdbbf1986..000000000
--- a/src/components/layouts/aboutUs/Blog.tsx
+++ /dev/null
@@ -1,44 +0,0 @@
-const Blog = () => {
- return (
-
-
-
-
-
- 10 years
-
-
- In Business
-
-
-
-
- 75,000+
-
-
- Customers
-
-
-
-
- 100k+
-
-
- Monthly Blog Readers
-
-
-
-
- 1.2m+
-
-
- Social Followers
-
-
-
-
-
- );
-};
-
-export default Blog;
diff --git a/src/components/layouts/aboutUs/Hero.tsx b/src/components/layouts/aboutUs/Hero.tsx
deleted file mode 100644
index ffc364218..000000000
--- a/src/components/layouts/aboutUs/Hero.tsx
+++ /dev/null
@@ -1,53 +0,0 @@
-"use client";
-
-import { getCookie } from "cookies-next";
-import Image from "next/image";
-
-import Heading from "../heading";
-
-const Hero = () => {
- const locale = getCookie("NEXT_LOCALE") || "en";
-
- return (
-
- );
-};
-
-export default Hero;
diff --git a/src/components/layouts/accordion/FaqsAccordion.tsx b/src/components/layouts/accordion/FaqsAccordion.tsx
deleted file mode 100644
index 22c994db0..000000000
--- a/src/components/layouts/accordion/FaqsAccordion.tsx
+++ /dev/null
@@ -1,59 +0,0 @@
-import clsx from "clsx";
-import { useTranslations } from "next-intl";
-
-import {
- Accordion,
- AccordionContent,
- AccordionItem,
- AccordionTrigger,
-} from "~/components/ui/accordion";
-
-interface FaqAccordionProperties {
- faqs: { question: string; content: string }[]; // Define the shape of faq objects
- containerClassName?: string;
- triggerClassName?: string;
- contentClassName?: string;
-}
-
-const FaqAccordion = ({
- faqs,
- triggerClassName,
- contentClassName,
- containerClassName,
-}: FaqAccordionProperties) => {
- const t = useTranslations("faq");
- return (
-
-
- {faqs?.map((faq, index) => (
-
-
- {t(`${faq.question}`)}
-
-
- {t(`${faq.content}`)}
-
-
- ))}
-
-
- );
-};
-
-export default FaqAccordion;
diff --git a/src/components/layouts/accordion/TopicAccordion.tsx b/src/components/layouts/accordion/TopicAccordion.tsx
deleted file mode 100644
index 761c030cc..000000000
--- a/src/components/layouts/accordion/TopicAccordion.tsx
+++ /dev/null
@@ -1,42 +0,0 @@
-/* eslint-disable @typescript-eslint/no-explicit-any */
-import {
- Accordion,
- AccordionContent,
- AccordionItem,
- AccordionTrigger,
-} from "~/components/ui/accordion";
-
-const TopicsAccordions = ({ topics }: { topics: any[] }) => {
- return (
-
- {topics.map((topic: any, index: number) => (
-
-
- {topic.title}
-
-
- {topic.content}
-
-
- ))}
-
- );
-};
-
-export default TopicsAccordions;
diff --git a/src/components/layouts/footer/footer.test.tsx b/src/components/layouts/footer/footer.test.tsx
deleted file mode 100644
index 4fa8c349b..000000000
--- a/src/components/layouts/footer/footer.test.tsx
+++ /dev/null
@@ -1,13 +0,0 @@
-import Footer from ".";
-
-import { renderWithIntl } from "~/test/utils";
-
-describe("page tests", () => {
- it("footer renders", () => {
- expect.assertions(1);
-
- const view = renderWithIntl();
-
- expect(view.baseElement).toBeInTheDocument();
- });
-});
diff --git a/src/components/layouts/footer/index.tsx b/src/components/layouts/footer/index.tsx
deleted file mode 100644
index 3786a41a0..000000000
--- a/src/components/layouts/footer/index.tsx
+++ /dev/null
@@ -1,345 +0,0 @@
-"use client";
-
-import axios from "axios";
-import {
- Copyright,
- Facebook,
- Instagram,
- Linkedin,
- XIcon,
- Youtube,
-} from "lucide-react";
-import { useTranslations } from "next-intl";
-import Image from "next/image";
-import Link from "next/link";
-import { useState } from "react";
-
-import { getApiUrl } from "~/actions/getApiUrl";
-import CustomButton from "~/components/common/common-button/common-button";
-import { Input } from "~/components/common/input";
-import LoadingSpinner from "~/components/miscellaneous/loading-spinner";
-import { Toaster } from "~/components/ui/toaster";
-import { useToast } from "~/components/ui/use-toast";
-
-const Footer = () => {
- const [email, setEmail] = useState("");
- const [error, setError] = useState(false);
- const [loading, setLoading] = useState(false);
- const { toast } = useToast();
- const t = useTranslations("footer");
- const locale = localStorage.getItem("preferredLanguage");
- const toastDesc =
- locale === "fr"
- ? "Veuillez fournir votre e-mail"
- : locale === "es"
- ? "Por favor, proporcione su correo electrónico"
- : "Please provide a valid email";
-
- const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
- const isValidEmail = (email: string): boolean => emailRegex.test(email);
-
- const handleSubmit = async () => {
- if (!isValidEmail(email)) {
- setError(true);
-
- toast({
- title: "Error",
- description: toastDesc,
- variant: "destructive",
- });
- return;
- }
- setLoading(true);
-
- const apiUrl = await getApiUrl();
- await axios
- .post(
- `${apiUrl}/api/v1/newsletter-subscription`,
- { email },
- {
- headers: {
- "Content-Type": "application/json",
- },
- },
- )
- .then(() => {
- toast({
- title: "Thank you for subscribing!",
- description:
- "You've successfully joined our newsletter. We're excited to keep you updated with our latest news and offers!",
- variant: "default",
- });
- setLoading(false);
- setEmail("");
- })
- .catch((error) => {
- if (error?.response) {
- const errorData = error.response.data;
- if (errorData.status_code === 400) {
- toast({
- title: "You're already subscribed!",
- description:
- "It looks like you're already on our list. Thank you for being part of our community!",
- variant: "default",
- });
- } else {
- toast({
- title: "Oops! Something went wrong.",
- description:
- "We encountered an issue while trying to subscribe you to our newsletter. Check your internet connection or contact support if the problem persists.",
- variant: "destructive",
- });
- setLoading(false);
- }
- setLoading(false);
- return;
- }
- });
- };
-
- const footerLinks = [
- {
- title: t("navigation"),
- links: [
- { route: "home", link: "/" },
- { route: "aboutUs", link: "/about-us" },
- { route: "career", link: "/career" },
- { route: "features", link: "/" },
- { route: "blog", link: "/blog" },
- { route: "status", link: "/status" },
- ],
- },
- {
- title: t("support"),
- links: [
- { route: "helpCenter", link: "/help-center" },
- { route: "faq", link: "/faqs" },
- { route: "waitingList", link: "/waitlist" },
- { route: "pricingExperience", link: "/pricing" },
- { route: "contactUs", link: "/contact-us" },
- ],
- },
- {
- title: t("legal"),
- links: [
- { route: "privacyPolicy", link: "/privacy-policy" },
- { route: "termsAndConditions", link: "/terms-and-conditions" },
- ],
- },
- ];
-
- const socialLinks = [
- {
- icon: XIcon,
- link: "https://twitter.com/hnginternship",
- },
- {
- icon: Youtube,
- link: "https://youtube.com",
- },
- {
- icon: Instagram,
- link: "https://instagram.com/hngtech",
- },
- {
- icon: Linkedin,
- link: "https://linkedin.com/company/hng-internship/",
- },
- {
- icon: Facebook,
- link: " https://m.facebook.com/hngtech/",
- },
- ];
-
- const footerBottom = [
- { route: "privacyPolicy", link: "/privacy-policy" },
- { route: "termsOfUse", link: "/terms-and-conditions" },
- ];
-
- return (
-
-
-
-
-
-
-
- HNG Boilerplate
-
-
- 10111, Hornchurch, London, United Kingdom
-
-
-
-
- {t("newsletterSignUp")}
-
-
-
-
- setEmail(event.target.value)}
- value={email}
- onBlur={() =>
- email.length === 0 ? setError(true) : setError(false)
- }
- />
-
-
- {loading ? (
-
- ) : (
- "Subscribe"
- )}
-
-
- {error && (
-
- Please provide your email
-
- )}
-
-
-
-
- {footerLinks.map((item, index) => {
- return (
-
-
- {item.title}
-
-
- {item.links.map((item, index) => {
- return (
-
-
- {t(`links.${item.route}`)}
-
-
- );
- })}
-
-
- );
- })}
-
-
-
- {t("newsletterSignUp")}
-
-
-
-
- setEmail(event.target.value)}
- value={email}
- onBlur={() =>
- email.length === 0 ? setError(true) : setError(false)
- }
- />
-
- {loading ? (
-
- ) : (
- "Subscribe"
- )}
-
-
- {error && (
-
- Please provide your email
-
- )}
-
-
-
-
-
- {t("followUs")}
-
-
- {socialLinks.map((item, index) => {
- return (
-
-
-
- );
- })}
-
-
-
-
-
-
-
-
-
-
- {socialLinks.map((item, index) => {
- return (
-
-
-
- );
- })}
-
-
-
- {t("footerBottom.companyName")}
-
- {t("footerBottom.copyright")}
-
-
-
- {footerBottom.map((item, index) => {
- return (
-
-
- {t(`footerBottom.${item.route}`)}
-
-
- );
- })}
-
-
-
-
-
-
-
- );
-};
-
-export default Footer;
diff --git a/src/components/layouts/homepage/HowItWorks.tsx b/src/components/layouts/homepage/HowItWorks.tsx
deleted file mode 100644
index 1b96b066c..000000000
--- a/src/components/layouts/homepage/HowItWorks.tsx
+++ /dev/null
@@ -1,111 +0,0 @@
-import { useTranslations } from "next-intl";
-
-import { Easy, Prebuilt, Scalable } from "./svgs";
-
-const HowItWorks = () => {
- const t = useTranslations("howItWorks");
- return (
-
-
-
- {/* Text Content */}
-
-
- {t("howItWorksTitlePrefix")} {" "}
- {t("howItWorksTitleHighlight")}
-
-
- {t("howItWorksDescription")}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {t("prebuiltTitle")}
-
-
- {t("prebuiltDescription")}
-
-
-
-
-
-
-
- {t("scalableTitle")}
-
-
- {t("scalableDescription")}
-
-
-
-
-
-
-
- {t("easyTitle")}
-
-
- {t("easyDescription")}
-
-
-
-
-
-
-
- );
-};
-
-export default HowItWorks;
diff --git a/src/components/layouts/homepage/MarketingAd.tsx b/src/components/layouts/homepage/MarketingAd.tsx
deleted file mode 100644
index 70a8775bc..000000000
--- a/src/components/layouts/homepage/MarketingAd.tsx
+++ /dev/null
@@ -1,17 +0,0 @@
-const MarketingAd = () => {
- return (
-
-
- Your browser does not support the video tag.
-
-
- );
-};
-
-export default MarketingAd;
diff --git a/src/components/layouts/homepage/testimonials-data.tsx b/src/components/layouts/homepage/testimonials-data.tsx
deleted file mode 100644
index 66783c801..000000000
--- a/src/components/layouts/homepage/testimonials-data.tsx
+++ /dev/null
@@ -1,44 +0,0 @@
-export const testimonials = [
- {
- id: 1,
- image: "/images/testimonial-image1.svg",
- stack: "Freelance Designer",
- name: "Jane Smith",
- content: "content",
- },
- {
- id: 2,
- image: "/images/testimonial-image2.svg",
- stack: "Software Developer",
- name: "Tom Williams",
- content: "content",
- },
- {
- id: 3,
- image: "/images/testimonial-image3.svg",
- stack: "Online Entrepreneur",
- name: "Michael Brown",
- content: "content",
- },
- {
- id: 4,
- image: "/images/testimonial-image1.svg",
- stack: "Freelance Designer",
- name: "Jane Smith",
- content: "content",
- },
- {
- id: 5,
- image: "/images/testimonial-image2.svg",
- stack: "Software Developer",
- name: "Tom Williams",
- content: "content",
- },
- {
- id: 6,
- image: "/images/testimonial-image3.svg",
- stack: "Online Entrepreneur",
- name: "Michael Brown",
- content: "content",
- },
-];
diff --git a/src/components/layouts/index.tsx b/src/components/layouts/index.tsx
deleted file mode 100644
index a26424b83..000000000
--- a/src/components/layouts/index.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-import React from "react";
-
-import Footer from "./footer";
-import Navbar from "./navbar";
-
-interface IProperties {
- children: React.ReactNode;
-}
-
-const index: React.FC = ({ children }) => {
- return (
-
- );
-};
-
-export default index;
diff --git a/src/components/layouts/navbar/index.tsx b/src/components/layouts/navbar/index.tsx
deleted file mode 100644
index f1d0b0090..000000000
--- a/src/components/layouts/navbar/index.tsx
+++ /dev/null
@@ -1,90 +0,0 @@
-"use client";
-
-import { useSession } from "next-auth/react";
-import { useTranslations } from "next-intl";
-import Link from "next/link";
-import { usePathname } from "next/navigation";
-import { useEffect, useState } from "react";
-
-import useVersionSync from "~/actions/useVersionSync";
-import UserCard from "~/components/card/user-card";
-import Logo from "~/components/common/logo";
-import LanguageSwitcher from "~/components/languageSwitcher/languageSwitcher";
-import { cn } from "~/lib/utils";
-import { NAV_LINKS } from "./links";
-import MobileNav from "./mobile-navbar";
-
-const Navbar = () => {
- const [scrolling, setIsScrolling] = useState(false);
- const { status } = useSession();
- const pathname = usePathname();
- const t = useTranslations();
-
- const version = "v1.0";
- useVersionSync(version);
-
- const handleScrollEvent = () => {
- if (window.scrollY > 1) {
- setIsScrolling(true);
- } else {
- setIsScrolling(false);
- }
- };
- useEffect(() => {
- window.addEventListener("scroll", handleScrollEvent);
-
- return () => {
- window.removeEventListener("scroll", handleScrollEvent);
- };
- });
- return (
-
-
-
-
-
-
- {NAV_LINKS.map((item, index) => {
- return (
-
- {t(`${item.route}`)}
-
- );
- })}
-
-
- {status !== "authenticated" && (
-
-
- {t("navbar.login")}
-
-
- {t("navbar.register")}
-
-
- )}
- {status === "authenticated" &&
}
-
-
- );
-};
-
-export default Navbar;
diff --git a/src/components/layouts/navbar/links.ts b/src/components/layouts/navbar/links.ts
deleted file mode 100644
index a8f0aaa8e..000000000
--- a/src/components/layouts/navbar/links.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-export const NAV_LINKS = [
- { route: "navLinks.home", link: "/" },
- { route: "navLinks.pricing", link: "/pricing" },
- { route: "navLinks.careers", link: "/career" },
-];
diff --git a/src/components/layouts/pagination/Pagination.tsx b/src/components/layouts/pagination/Pagination.tsx
deleted file mode 100644
index 332c4481f..000000000
--- a/src/components/layouts/pagination/Pagination.tsx
+++ /dev/null
@@ -1,171 +0,0 @@
-"use client";
-
-import {
- Pagination as PaginationComponent,
- PaginationContent,
- PaginationItem,
- PaginationLink,
- PaginationNext,
- PaginationPrevious,
-} from "~/components/ui/pagination";
-
-export interface PaginationProperties {
- total: number;
- pageSize: number;
- currentPage: number;
- activeVariant?: "default" | "outline";
- navigationVariant?: "semibold" | "medium";
- onChange?: (page: number) => void;
-}
-
-const Pagination = ({
- total,
- pageSize,
- currentPage,
- activeVariant = "default",
- navigationVariant = "medium",
- onChange,
-}: PaginationProperties) => {
- const totalPages = Math.ceil(total / pageSize);
-
- const handleChange = (page: number, event?: React.MouseEvent) => {
- if (event) {
- event.preventDefault();
- }
- if (onChange) {
- onChange(page);
- }
- };
-
- const getPageNumbers = () => {
- const pages = [];
- const showEllipsis = totalPages > 3;
-
- if (showEllipsis === false) {
- for (let index = 1; index <= totalPages; index++) {
- pages.push(index);
- }
- } else {
- pages.push(1);
- if (currentPage > 4) {
- pages.push("...");
- }
-
- const firstPage = Math.max(2, currentPage - 2);
- const lastPage = Math.min(totalPages - 1, currentPage + 2);
-
- for (let index = firstPage; index <= lastPage; index++) {
- pages.push(index);
- }
-
- if (currentPage < totalPages - 3) {
- pages.push("...");
- }
- pages.push(totalPages);
- }
-
- return pages;
- };
-
- return (
-
-
-
- 1
- ? "cursor-pointer"
- : "cursor-not-allowed text-stroke-colors-stroke hover:bg-transparent hover:text-stroke-colors-stroke"
- }`}
- onClick={() => currentPage > 1 && handleChange(currentPage - 1)}
- >
-
1
- ? "cursor-pointer border-none bg-inherit"
- : "cursor-not-allowed text-stroke-colors-stroke hover:bg-transparent hover:text-stroke-colors-stroke"
- }`}
- onClick={(event) => {
- event.preventDefault();
- if (currentPage > 1) handleChange(currentPage - 1);
- }}
- />
- Previous
-
-
-
- {getPageNumbers().map((page, index) =>
- typeof page === "number" ? (
- handleChange(page)}>
- {
- event.preventDefault();
- handleChange(page);
- }}
- isActive={currentPage === page}
- activeVariant={activeVariant}
- className={
- currentPage === page && activeVariant === "default"
- ? "cursor-pointer bg-primary"
- : "cursor-pointer border-none bg-inherit text-neutral-dark-1"
- }
- >
- {page}
-
-
- ) : (
-
- {page}
-
- ),
- )}
-
-
- currentPage < totalPages && handleChange(currentPage + 1)
- }
- >
-
- {" "}
- Next
-
{
- event.preventDefault();
- if (currentPage < totalPages) handleChange(currentPage + 1);
- }}
- />{" "}
-
-
-
-
- );
-};
-
-export default Pagination;
diff --git a/src/components/miscellaneous/WordCounter.tsx b/src/components/miscellaneous/WordCounter.tsx
deleted file mode 100644
index 458bde43d..000000000
--- a/src/components/miscellaneous/WordCounter.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-import { cn } from "~/lib/utils";
-
-const WordCounter = ({ word, length }: { word?: string; length: number }) => {
- return (
- 0 ? "opacity-80" : "pointer-events-none opacity-0",
- )}
- >
-
- {word!.length}
-
- /
- {length}
-
- );
-};
-
-export default WordCounter;
diff --git a/src/components/miscellaneous/blur-image.tsx b/src/components/miscellaneous/blur-image.tsx
deleted file mode 100644
index 37c4ee648..000000000
--- a/src/components/miscellaneous/blur-image.tsx
+++ /dev/null
@@ -1,27 +0,0 @@
-"use client";
-
-import Image from "next/image";
-import { useState, type ComponentProps } from "react";
-
-import { cn } from "~/lib/utils";
-
-export default function BlurImage(properties: ComponentProps) {
- const [isLoading, setLoading] = useState(true);
-
- return (
- {
- setTimeout(() => {
- setLoading(false);
- }, 500);
- }}
- />
- );
-}
diff --git a/src/components/miscellaneous/goto-top.tsx b/src/components/miscellaneous/goto-top.tsx
index 193930da9..0633044b2 100644
--- a/src/components/miscellaneous/goto-top.tsx
+++ b/src/components/miscellaneous/goto-top.tsx
@@ -1,48 +1,50 @@
-"use client";
+'use client'
-import { ChevronUp } from "lucide-react";
-import { useEffect, useState } from "react";
+import { ChevronUp } from 'lucide-react'
+import { useEffect, useState } from 'react'
+import useWindowHeight from '~/hooks/global/use-window-height'
-import useWindowHeight from "~/hooks/util-hooks/use-window-height";
-import { cn } from "~/lib/utils";
+import { cn } from '~/utils'
const handleTop = () => {
- window && window.scroll({ top: 0, behavior: "smooth" });
-};
+ if (typeof window !== 'undefined') {
+ window.scroll({ top: 0, behavior: 'smooth' })
+ }
+}
const GotoTop = () => {
- const { scrollY } = useWindowHeight();
+ const { scrollY } = useWindowHeight()
- const [hideToTop, setHideToTop] = useState(false);
+ const [hideToTop, setHideToTop] = useState(false)
useEffect(() => {
- let previousScrollpos = window.scrollY;
+ let previousScrollpos = window.scrollY
// console.log("PREV", prevScrollpos);
- window.addEventListener("scroll", () => {
- const currentScrollPos = window.scrollY;
+ window.addEventListener('scroll', () => {
+ const currentScrollPos = window.scrollY
if (previousScrollpos >= currentScrollPos) {
- setHideToTop(false);
+ setHideToTop(false)
} else {
- setHideToTop(true);
+ setHideToTop(true)
}
- previousScrollpos = currentScrollPos;
- });
- }, []);
+ previousScrollpos = currentScrollPos
+ })
+ }, [])
return hideToTop ? undefined : (
1000
- ? "translate-x-0 opacity-100 shadow-[0_0_40px_0_rgba(0,0,0,0.16)]"
- : "translate-x-20 opacity-0",
+ ? 'translate-x-0 opacity-100 shadow-[0_0_40px_0_rgba(0,0,0,0.16)]'
+ : 'translate-x-20 opacity-0'
)}
>
- );
-};
+ )
+}
-export default GotoTop;
+export default GotoTop
diff --git a/src/components/layouts/heading/index.tsx b/src/components/miscellaneous/heading/index.tsx
similarity index 75%
rename from src/components/layouts/heading/index.tsx
rename to src/components/miscellaneous/heading/index.tsx
index a10e4d821..b41236ea6 100644
--- a/src/components/layouts/heading/index.tsx
+++ b/src/components/miscellaneous/heading/index.tsx
@@ -1,24 +1,24 @@
interface Properties {
- tag: string;
- title: string;
- content: string;
+ tag: string
+ title: string
+ content: string
}
const renderTitle = (title: string) => {
- const parts = title.split(/({{[^}]+}})/).filter(Boolean);
+ const parts = title.split(/({{[^}]+}})/).filter(Boolean)
return parts.map((part, index) => {
- if (part.startsWith("{{") && part.endsWith("}}")) {
- const styledText = part.slice(2, -2);
+ if (part.startsWith('{{') && part.endsWith('}}')) {
+ const styledText = part.slice(2, -2)
return (
{styledText}
- );
+ )
}
- return {part} ;
- });
-};
+ return {part}
+ })
+}
const Heading = (properties: Properties) => {
return (
@@ -43,7 +43,7 @@ const Heading = (properties: Properties) => {
{properties?.content}
- );
-};
+ )
+}
-export default Heading;
+export default Heading
diff --git a/src/components/miscellaneous/loading-spinner.tsx b/src/components/miscellaneous/loading-spinner.tsx
index 29517b439..2453302de 100644
--- a/src/components/miscellaneous/loading-spinner.tsx
+++ b/src/components/miscellaneous/loading-spinner.tsx
@@ -1,12 +1,11 @@
-import React, { forwardRef } from "react";
-
-import { cn } from "~/lib/utils";
+import React, { forwardRef } from 'react'
+import { cn } from '~/utils'
export interface SVGProperties extends React.SVGAttributes {
- asChild?: boolean;
- useGsap?: boolean;
- children?: React.ReactNode;
- href?: string;
+ asChild?: boolean
+ useGsap?: boolean
+ children?: React.ReactNode
+ href?: string
}
const LoadingSpinner = forwardRef(
@@ -18,16 +17,16 @@ const LoadingSpinner = forwardRef(
xmlns="http://www.w3.org/2000/svg"
fill="currentColor"
ref={reference}
- className={cn("size-6", className)}
+ className={cn('size-6', className)}
{...properties}
>
- );
- },
-);
+ )
+ }
+)
-LoadingSpinner.displayName = "LoadingSpinner";
-export default LoadingSpinner;
+LoadingSpinner.displayName = 'LoadingSpinner'
+export default LoadingSpinner
diff --git a/src/components/navigation/footer/index.tsx b/src/components/navigation/footer/index.tsx
new file mode 100644
index 000000000..35f0f10d4
--- /dev/null
+++ b/src/components/navigation/footer/index.tsx
@@ -0,0 +1,259 @@
+'use client'
+
+import {
+ Copyright,
+ Facebook,
+ Instagram,
+ Linkedin,
+ XIcon,
+ Youtube,
+} from 'lucide-react'
+import Link from 'next/link'
+import { useState, useTransition } from 'react'
+import LoadingSpinner from '~/components/miscellaneous/loading-spinner'
+import { Input } from '~ui/input'
+import { Button } from '~ui/button'
+import { makeSubscription } from '~/actions/subscription'
+import { toast } from 'sonner'
+import useEnvironmentStore from '~/hooks/global/use-enviroment'
+import Image from 'next/image'
+
+const Footer = () => {
+ const [values, setValues] = useState('')
+ const [isPending, startTransition] = useTransition()
+ const { backend } = useEnvironmentStore()
+
+ console.log(backend)
+
+ const handleSubmit = async () => {
+ startTransition(async () => {
+ await makeSubscription(values, backend).then((res) => {
+ toast[res.success ? 'success' : 'error'](res.message)
+ })
+ })
+ }
+
+ const footerLinks = [
+ {
+ title: 'Navigation',
+ links: [
+ { route: 'Home', link: '/' },
+ { route: 'About us', link: '/about-us' },
+ { route: 'Career', link: '/career' },
+ { route: 'Features', link: '/' },
+ { route: 'Blog', link: '/blog' },
+ ],
+ },
+ {
+ title: 'Support',
+ links: [
+ { route: 'Help center', link: '/help-center' },
+ { route: 'FAQ', link: '/faqs' },
+ { route: 'Waiting List', link: '/waitlist' },
+ { route: 'Pricing Experience', link: '/pricing' },
+ { route: 'Contact Us', link: '/contact-us' },
+ ],
+ },
+ {
+ title: 'Legal',
+ links: [
+ { route: 'Privacy Policy', link: '/privacy-policy' },
+ { route: 'Terms and condition', link: '/terms-and-conditions' },
+ ],
+ },
+ ]
+
+ const socialLinks = [
+ {
+ icon: XIcon,
+ link: '/',
+ },
+ {
+ icon: Youtube,
+ link: '/',
+ },
+ {
+ icon: Instagram,
+ link: '/',
+ },
+ {
+ icon: Linkedin,
+ link: '/',
+ },
+ {
+ icon: Facebook,
+ link: '/',
+ },
+ ]
+
+ const footerBottom = [
+ { route: 'Privacy Policy', link: '/' },
+ { route: 'Terms of Use', link: '/' },
+ ]
+
+ //
+
+ return (
+
+
+
+
+
+
+
+ HNG Boilerplate
+
+
+ 10111, Hornchurch, London, United Kingdom
+
+
+
+
+ Sign Up For Newsletters
+
+
+ setValues(event.target.value)}
+ value={values}
+ />
+
+ {isPending ? (
+
+ Loading {' '}
+
+
+ ) : (
+ 'Subscibe'
+ )}
+
+
+
+
+
+ {footerLinks.map((item, index) => {
+ return (
+
+
+ {item.title}
+
+
+ {item.links.map((item, index) => {
+ return (
+
+
+ {item.route}
+
+
+ )
+ })}
+
+
+ )
+ })}
+
+
+
+ Sign Up For Newsletter
+
+
+ setValues(event.target.value)}
+ value={values}
+ />
+
+ {isPending ? (
+
+ Loading {' '}
+
+
+ ) : (
+ 'Subscibe'
+ )}
+
+
+
+
+
+
+ Follow Us
+
+
+ {socialLinks.map((item, index) => {
+ return (
+
+
+
+ )
+ })}
+
+
+
+
+
+
+
+
+
+
+ {socialLinks.map((item, index) => {
+ return (
+
+
+
+ )
+ })}
+
+
+
+
+ 2024 All Rights Reserved
+
+
+
+ {footerBottom.map((item, index) => {
+ return (
+
+
+ {item.route}
+
+
+ )
+ })}
+
+
+
+
+
+ )
+}
+
+export default Footer
diff --git a/src/components/navigation/navbar/index.tsx b/src/components/navigation/navbar/index.tsx
new file mode 100644
index 000000000..414b3c573
--- /dev/null
+++ b/src/components/navigation/navbar/index.tsx
@@ -0,0 +1,92 @@
+'use client'
+
+import { useSession } from 'next-auth/react'
+import Link from 'next/link'
+import { usePathname } from 'next/navigation'
+import { useEffect, useState } from 'react'
+
+import useVersionSync from '~/actions/useVersionSync'
+import UserCard from '~/components/card/user-card'
+import Logo from '~/components/global/main-logo'
+import { cn } from '~/utils'
+import { NAV_LINKS } from './links'
+import MobileNav from './mobile-navbar'
+
+const Navbar = () => {
+ const [scrolling, setIsScrolling] = useState(false)
+ const { status } = useSession()
+ const pathname = usePathname()
+
+ const version = 'v1.0'
+ useVersionSync(version)
+
+ const handleScrollEvent = () => {
+ if (window.scrollY > 1) {
+ setIsScrolling(true)
+ } else {
+ setIsScrolling(false)
+ }
+ }
+ useEffect(() => {
+ window.addEventListener('scroll', handleScrollEvent)
+
+ return () => {
+ window.removeEventListener('scroll', handleScrollEvent)
+ }
+ })
+ return (
+
+
+
+
+
+
+ {NAV_LINKS.map((item, index) => {
+ return (
+
+ {item.route}
+
+ )
+ })}
+
+ {status !== 'authenticated' && (
+
+
+ Log in
+
+
+ Get Started
+
+
+ )}
+ {status === 'authenticated' &&
}
+
+
+ )
+}
+
+export default Navbar
diff --git a/src/components/navigation/navbar/links.ts b/src/components/navigation/navbar/links.ts
new file mode 100644
index 000000000..27a33cdc9
--- /dev/null
+++ b/src/components/navigation/navbar/links.ts
@@ -0,0 +1,5 @@
+export const NAV_LINKS = [
+ { route: 'home', link: '/' },
+ { route: 'pricing', link: '/pricing' },
+ { route: 'careers', link: '/career' },
+]
diff --git a/src/components/layouts/navbar/menu.css b/src/components/navigation/navbar/menu.css
similarity index 84%
rename from src/components/layouts/navbar/menu.css
rename to src/components/navigation/navbar/menu.css
index 45148aa79..5dcb72ae2 100644
--- a/src/components/layouts/navbar/menu.css
+++ b/src/components/navigation/navbar/menu.css
@@ -12,17 +12,17 @@
transform-origin: center;
}
-[data-menu-open="true"] span:nth-child(1) {
+[data-menu-open='true'] span:nth-child(1) {
transform: translate3d(0, 8px, 0) rotate(40deg);
background: #fff;
}
-[data-menu-open="true"] span:nth-child(2) {
+[data-menu-open='true'] span:nth-child(2) {
opacity: 0;
transform: scaleX(0);
}
-[data-menu-open="true"] span:nth-child(3) {
+[data-menu-open='true'] span:nth-child(3) {
transform: translate3d(0, -6px, 0) rotate(-45deg);
background: #fff;
}
diff --git a/src/components/layouts/navbar/mobile-navbar.tsx b/src/components/navigation/navbar/mobile-navbar.tsx
similarity index 60%
rename from src/components/layouts/navbar/mobile-navbar.tsx
rename to src/components/navigation/navbar/mobile-navbar.tsx
index c81c18627..1238edaf3 100644
--- a/src/components/layouts/navbar/mobile-navbar.tsx
+++ b/src/components/navigation/navbar/mobile-navbar.tsx
@@ -1,65 +1,63 @@
-import "./menu.css";
+import './menu.css'
-import { motion, stagger, useAnimate } from "framer-motion";
-import { useSession } from "next-auth/react";
-import { useTranslations } from "next-intl";
-import Link from "next/link";
-import { useEffect, useState } from "react";
+import { motion, stagger, useAnimate } from 'framer-motion'
+import { useSession } from 'next-auth/react'
+import Link from 'next/link'
+import { useEffect, useState } from 'react'
-import { cn } from "~/lib/utils";
-import { NAV_LINKS } from "./links";
+import { cn } from '~/utils'
+import { NAV_LINKS } from './links'
export default function MobileNav() {
- const [open, setOpen] = useState(false);
- const [scope, animate] = useAnimate();
- const t = useTranslations();
- const { data: session } = useSession();
- const user = session?.user;
+ const [open, setOpen] = useState(false)
+ const [scope, animate] = useAnimate()
+ const { data: session } = useSession()
+ const user = session?.user
// the stagger effect
- const staggerList = stagger(0.1, { startDelay: 0.25 });
+ const staggerList = stagger(0.1, { startDelay: 0.25 })
// create the animations that will be applied
// whenever the open state is toggled
useEffect(() => {
animate(
- "ul",
+ 'ul',
{
width: open ? 180 : 0,
height: open && user?.email ? 140 : open ? 250 : 0,
opacity: open ? 1 : 0,
},
{
- type: "spring",
+ type: 'spring',
bounce: 0,
duration: 0.4,
- },
- );
+ }
+ )
animate(
- "li",
+ 'li',
open
? { opacity: 1, scale: 1, x: 0 }
: { opacity: 0, scale: 0.3, x: -50 },
{
duration: 0.2,
delay: open ? staggerList : 0,
- },
- );
- }, [animate, open, staggerList, user?.email]);
+ }
+ )
+ }, [animate, open, staggerList, user?.email])
return (
<>
{
- setOpen(false);
+ setOpen(false)
}}
/>
@@ -69,7 +67,7 @@ export default function MobileNav() {
>
>
- );
+ )
}
diff --git a/src/components/providers.tsx b/src/components/providers.tsx
deleted file mode 100644
index 896c5d345..000000000
--- a/src/components/providers.tsx
+++ /dev/null
@@ -1,15 +0,0 @@
-"use client";
-
-import { AppProgressBar as ProgressBar } from "next-nprogress-bar";
-
-const Providers = () => {
- return (
-
- );
-};
-
-export default Providers;
diff --git a/src/components/skeleton/faqskeleton.tsx b/src/components/skeleton/faqskeleton.tsx
deleted file mode 100644
index 456b2acdb..000000000
--- a/src/components/skeleton/faqskeleton.tsx
+++ /dev/null
@@ -1,18 +0,0 @@
-"use client";
-
-import { Skeleton } from "~/components/ui/skeleton";
-
-//
-
-const FaqSkeleton = () => {
- return Array.from({ length: 4 }).map((_, index) => (
-
-
-
- ));
-};
-
-export default FaqSkeleton;
diff --git a/src/components/skeleton/helpcenterskeleton.tsx b/src/components/skeleton/helpcenterskeleton.tsx
deleted file mode 100644
index 1c01da453..000000000
--- a/src/components/skeleton/helpcenterskeleton.tsx
+++ /dev/null
@@ -1,26 +0,0 @@
-"use client";
-
-import { Card, CardContent } from "~/components/ui/card";
-import { Skeleton } from "~/components/ui/skeleton";
-
-const HelpCenterSkeleton = () => {
- return (
-
- {Array.from({ length: 6 }).map((_, index) => (
-
-
-
-
-
- ))}
-
- );
-};
-
-export default HelpCenterSkeleton;
diff --git a/src/components/skeleton/jobskeleton.tsx b/src/components/skeleton/jobskeleton.tsx
deleted file mode 100644
index 4fe7fa774..000000000
--- a/src/components/skeleton/jobskeleton.tsx
+++ /dev/null
@@ -1,34 +0,0 @@
-"use client";
-
-import { Card, CardContent, CardFooter } from "~/components/ui/card";
-import { Skeleton } from "~/components/ui/skeleton";
-
-const JobSkeleton = () => {
- return (
-
- {Array.from({ length: 4 }).map((_, index) => (
-
-
-
-
-
-
-
-
-
-
- ))}
-
- );
-};
-
-export default JobSkeleton;
diff --git a/src/components/skeleton/pricingcardskeleton.tsx b/src/components/skeleton/pricingcardskeleton.tsx
deleted file mode 100644
index 22a743253..000000000
--- a/src/components/skeleton/pricingcardskeleton.tsx
+++ /dev/null
@@ -1,42 +0,0 @@
-"use client";
-
-import { Skeleton } from "~/components/ui/skeleton";
-
-//
-
-const PricingCardSkeleton = () => {
- return Array.from({ length: 4 }).map((_, index) => (
-
-
-
-
-
-
-
-
-
- ));
-};
-
-export default PricingCardSkeleton;
diff --git a/src/components/skeleton/product.skeleton.tsx b/src/components/skeleton/product.skeleton.tsx
deleted file mode 100644
index 5f7e91f08..000000000
--- a/src/components/skeleton/product.skeleton.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-type Properties = {
- count?: number;
-};
-
-const ProductCardSkeleton = ({ count }: Properties) => {
- return Array.from({ length: count || 5 }).map((_, index) => (
-
- ));
-};
-
-export default ProductCardSkeleton;
diff --git a/src/components/skeleton/tableskeleton.tsx b/src/components/skeleton/tableskeleton.tsx
deleted file mode 100644
index 3b4b5be21..000000000
--- a/src/components/skeleton/tableskeleton.tsx
+++ /dev/null
@@ -1,39 +0,0 @@
-"use client";
-
-import { Skeleton } from "~/components/ui/skeleton";
-import { TableCell, TableRow } from "~/components/ui/table";
-
-//
-
-const TableSkeleton = () => {
- return Array.from({ length: 6 }).map((_, index) => (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ));
-};
-
-export default TableSkeleton;
diff --git a/src/components/status/PastIncidents.tsx b/src/components/status/PastIncidents.tsx
deleted file mode 100644
index 47de7dc40..000000000
--- a/src/components/status/PastIncidents.tsx
+++ /dev/null
@@ -1,81 +0,0 @@
-"use client";
-
-import { ArrowDown, ArrowUp } from "lucide-react";
-import { useState } from "react";
-
-interface Incident {
- date: string;
- report: string;
-}
-
-const incidents: Incident[] = [
- {
- date: "Aug 22, 2024",
- report: "No incidents reported today.",
- },
- {
- date: "Aug 21, 2024",
- report: "No incidents reported.",
- },
- {
- date: "Aug 20, 2024",
- report: "Minor server outage from 2 PM to 3 PM.",
- },
- {
- date: "Aug 19, 2024",
- report: "Scheduled maintenance completed successfully.",
- },
- {
- date: "Aug 18, 2024",
- report: "System update applied, no issues reported.",
- },
-];
-
-const PastIncidents = () => {
- const [showAll, setShowAll] = useState(false);
-
- const toggleShowAll = () => setShowAll(!showAll);
-
- const initialCount = 2;
- const visibleIncidents = showAll
- ? incidents
- : incidents.slice(0, initialCount);
-
- return (
-
-
-
-
- {visibleIncidents.map((incident, index) => (
-
-
- {incident.date}
-
-
- {incident.report}
-
-
- ))}
-
-
- {showAll ? (
-
- Show Less
-
- ) : (
-
- Show More
-
- )}
-
-
-
- );
-};
-
-export default PastIncidents;
diff --git a/src/components/status/StatusTable.tsx b/src/components/status/StatusTable.tsx
deleted file mode 100644
index 7d9c4c7b5..000000000
--- a/src/components/status/StatusTable.tsx
+++ /dev/null
@@ -1,79 +0,0 @@
-interface ApiStatus {
- apiGroup: string;
- status: "Operational" | "Degraded" | "Down";
- lastChecked: string;
- responseTime: string;
- details: string;
-}
-
-const data: ApiStatus[] = [
- {
- apiGroup: "Authentication",
- status: "Operational",
- lastChecked: "2024-08-20 10:00 AM UTC",
- responseTime: "320ms",
- details: "All tests passed",
- },
- {
- apiGroup: "Payment",
- status: "Degraded",
- lastChecked: "2024-08-20 10:00 AM UTC",
- responseTime: "450ms",
- details: "High response time detected",
- },
- {
- apiGroup: "Blog",
- status: "Down",
- lastChecked: "2024-08-20 10:00 AM UTC",
- responseTime: "-",
- details: "API not responding (HTTP 503)",
- },
- {
- apiGroup: "Inventory",
- status: "Operational",
- lastChecked: "2024-08-20 10:00 AM UTC",
- responseTime: "280ms",
- details: "All tests passed",
- },
- {
- apiGroup: "Notification",
- status: "Operational",
- lastChecked: "2024-08-20 10:00 AM UTC",
- responseTime: "340ms",
- details: "All tests passed",
- },
-];
-
-const StatusGrid = () => {
- return (
-
-
-
-
- {data.map((item, index) => (
-
-
-
{item.apiGroup}
-
- {item.status}
-
-
-
- ))}
-
-
- );
-};
-
-export default StatusGrid;
diff --git a/src/components/ui/accordion.tsx b/src/components/ui/accordion.tsx
index f5c209a7a..b65abb20c 100644
--- a/src/components/ui/accordion.tsx
+++ b/src/components/ui/accordion.tsx
@@ -1,12 +1,11 @@
-"use client";
+'use client'
-import * as AccordionPrimitive from "@radix-ui/react-accordion";
-import { ChevronDown } from "lucide-react";
-import React from "react";
+import * as AccordionPrimitive from '@radix-ui/react-accordion'
+import { ChevronDown } from 'lucide-react'
+import React from 'react'
+import { cn } from '~/utils'
-import { cn } from "../../lib/utils";
-
-const Accordion = AccordionPrimitive.Root;
+const Accordion = AccordionPrimitive.Root
const AccordionItem = React.forwardRef<
React.ElementRef,
@@ -14,11 +13,11 @@ const AccordionItem = React.forwardRef<
>(({ className, ...properties }, reference) => (
-));
-AccordionItem.displayName = "AccordionItem";
+))
+AccordionItem.displayName = 'AccordionItem'
const AccordionTrigger = React.forwardRef<
React.ElementRef,
React.ComponentPropsWithoutRef
@@ -27,8 +26,8 @@ const AccordionTrigger = React.forwardRef<
svg]:rotate-180",
- className,
+ 'flex flex-1 items-center justify-between py-4 font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180',
+ className
)}
{...properties}
>
@@ -36,8 +35,8 @@ const AccordionTrigger = React.forwardRef<
-));
-AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName;
+))
+AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName
const AccordionContent = React.forwardRef<
React.ElementRef,
@@ -48,10 +47,10 @@ const AccordionContent = React.forwardRef<
className="overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down"
{...properties}
>
- {children}
+ {children}
-));
+))
-AccordionContent.displayName = AccordionPrimitive.Content.displayName;
+AccordionContent.displayName = AccordionPrimitive.Content.displayName
-export { Accordion, AccordionItem, AccordionTrigger, AccordionContent };
+export { Accordion, AccordionItem, AccordionTrigger, AccordionContent }
diff --git a/src/components/ui/avatar.tsx b/src/components/ui/avatar.tsx
index a01cb13ca..79a399643 100644
--- a/src/components/ui/avatar.tsx
+++ b/src/components/ui/avatar.tsx
@@ -1,50 +1,50 @@
-"use client";
+'use client'
-import * as AvatarPrimitive from "@radix-ui/react-avatar";
-import * as React from "react";
+import * as React from 'react'
+import * as AvatarPrimitive from '@radix-ui/react-avatar'
-import { cn } from "~/lib/utils";
+import { cn } from '~/utils'
const Avatar = React.forwardRef<
React.ElementRef,
React.ComponentPropsWithoutRef
->(({ className, ...properties }, reference) => (
+>(({ className, ...props }, ref) => (
-));
-Avatar.displayName = AvatarPrimitive.Root.displayName;
+))
+Avatar.displayName = AvatarPrimitive.Root.displayName
const AvatarImage = React.forwardRef<
React.ElementRef,
React.ComponentPropsWithoutRef
->(({ className, ...properties }, reference) => (
+>(({ className, ...props }, ref) => (
-));
-AvatarImage.displayName = AvatarPrimitive.Image.displayName;
+))
+AvatarImage.displayName = AvatarPrimitive.Image.displayName
const AvatarFallback = React.forwardRef<
React.ElementRef,
React.ComponentPropsWithoutRef
->(({ className, ...properties }, reference) => (
+>(({ className, ...props }, ref) => (
-));
-AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;
+))
+AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName
-export { Avatar, AvatarImage, AvatarFallback };
+export { Avatar, AvatarImage, AvatarFallback }
diff --git a/src/components/ui/badge.tsx b/src/components/ui/badge.tsx
deleted file mode 100644
index 2ec8c6011..000000000
--- a/src/components/ui/badge.tsx
+++ /dev/null
@@ -1,45 +0,0 @@
-import { cva, type VariantProps } from "class-variance-authority";
-import * as React from "react";
-
-import { cn } from "~/lib/utils";
-
-const badgeVariants = cva(
- "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
- {
- variants: {
- variant: {
- default:
- "border-transparent bg-primary text-primary-foreground hover:bg-primary/80",
- secondary:
- "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
- destructive:
- "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",
- "success-dot":
- "bg-success-50 text-success-700 border-transparent before:mr-1 before:content-['•_'] before:text-success",
- "error-dot":
- "bg-error-50 text-error-700 border-transparent before:mr-1 before:content-['•_'] before:text-error",
- "warning-dot":
- "bg-warning-50 text-warning border-transparent before:mr-1 before:content-['•_'] before:text-warning",
- outline: "text-foreground",
- },
- },
- defaultVariants: {
- variant: "default",
- },
- },
-);
-
-export interface BadgeProperties
- extends React.HTMLAttributes,
- VariantProps {}
-
-function Badge({ className, variant, ...properties }: BadgeProperties) {
- return (
-
- );
-}
-
-export { Badge, badgeVariants };
diff --git a/src/components/ui/breadcrumb.tsx b/src/components/ui/breadcrumb.tsx
deleted file mode 100644
index 53367f37e..000000000
--- a/src/components/ui/breadcrumb.tsx
+++ /dev/null
@@ -1,117 +0,0 @@
-import { Slot } from "@radix-ui/react-slot";
-import { ChevronRight, MoreHorizontal } from "lucide-react";
-import * as React from "react";
-
-import { cn } from "~/lib/utils";
-
-const Breadcrumb = React.forwardRef<
- HTMLElement,
- React.ComponentPropsWithoutRef<"nav"> & {
- separator?: React.ReactNode;
- }
->(({ ...properties }, reference) => (
-
-));
-Breadcrumb.displayName = "Breadcrumb";
-
-const BreadcrumbList = React.forwardRef<
- HTMLOListElement,
- React.ComponentPropsWithoutRef<"ol">
->(({ className, ...properties }, reference) => (
-
-));
-BreadcrumbList.displayName = "BreadcrumbList";
-
-const BreadcrumbItem = React.forwardRef<
- HTMLLIElement,
- React.ComponentPropsWithoutRef<"li">
->(({ className, ...properties }, reference) => (
-
-));
-BreadcrumbItem.displayName = "BreadcrumbItem";
-
-const BreadcrumbLink = React.forwardRef<
- HTMLAnchorElement,
- React.ComponentPropsWithoutRef<"a"> & {
- asChild?: boolean;
- }
->(({ asChild, className, ...properties }, reference) => {
- const Comp = asChild ? Slot : "a";
-
- return (
-
- );
-});
-BreadcrumbLink.displayName = "BreadcrumbLink";
-
-const BreadcrumbPage = React.forwardRef<
- HTMLSpanElement,
- React.ComponentPropsWithoutRef<"span">
->(({ className, ...properties }, reference) => (
-
-));
-BreadcrumbPage.displayName = "BreadcrumbPage";
-
-const BreadcrumbSeparator = ({
- children,
- className,
- ...properties
-}: React.ComponentProps<"li">) => (
- svg]:size-3.5", className)}
- {...properties}
- >
- {children ?? }
-
-);
-BreadcrumbSeparator.displayName = "BreadcrumbSeparator";
-
-const BreadcrumbEllipsis = ({
- className,
- ...properties
-}: React.ComponentProps<"span">) => (
-
-
- More
-
-);
-BreadcrumbEllipsis.displayName = "BreadcrumbElipssis";
-
-export {
- Breadcrumb,
- BreadcrumbList,
- BreadcrumbItem,
- BreadcrumbLink,
- BreadcrumbPage,
- BreadcrumbSeparator,
- BreadcrumbEllipsis,
-};
diff --git a/src/components/ui/button.tsx b/src/components/ui/button.tsx
index 4a6b6cd5c..84665fd67 100644
--- a/src/components/ui/button.tsx
+++ b/src/components/ui/button.tsx
@@ -1,59 +1,58 @@
-import { Slot } from "@radix-ui/react-slot";
-import { cva, type VariantProps } from "class-variance-authority";
-import * as React from "react";
-
-import { cn } from "~/lib/utils";
+import { Slot } from '@radix-ui/react-slot'
+import { cva, type VariantProps } from 'class-variance-authority'
+import * as React from 'react'
+import { cn } from '~/utils'
const buttonVariants = cva(
- "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
+ 'inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',
{
variants: {
variant: {
- default: "bg-primary text-primary-foreground hover:bg-primary/90",
+ default: 'bg-primary text-primary-foreground hover:bg-orange-500',
destructive:
- "bg-destructive text-destructive-foreground hover:bg-destructive/90",
+ 'bg-destructive text-destructive-foreground hover:bg-destructive/90',
outline:
- "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
+ 'border border-input bg-background hover:bg-accent hover:text-accent-foreground',
secondary:
- "bg-secondary text-secondary-foreground hover:bg-secondary/80",
- ghost: "hover:bg-accent hover:text-accent-foreground",
- link: "text-primary underline-offset-4 hover:underline",
+ 'bg-secondary text-secondary-foreground hover:bg-secondary/80',
+ ghost: 'hover:bg-accent hover:text-accent-foreground',
+ link: 'text-primary underline-offset-4 hover:underline',
primary:
- "border border-primary text-primary hover:bg-primary hover:text-white transition duration-200 focus:outline-none",
+ 'border border-primary text-primary hover:bg-primary hover:text-white transition duration-200 focus:outline-none',
},
size: {
- default: "h-8 min-[500px]:h-10 px-4 py-2",
- sm: "h-9 rounded-md px-3",
- lg: "h-11 rounded-md px-8",
- xl: "h-16 rounded-md py-2 px-4 text-base",
- icon: "size-8 min-[500px]:size-10",
+ default: 'h-8 min-[500px]:h-10 px-4 py-2',
+ sm: 'h-9 rounded-md px-3',
+ lg: 'h-11 rounded-md px-8',
+ xl: 'h-16 rounded-md py-2 px-4 text-base',
+ icon: 'size-8 min-[500px]:size-10',
},
},
defaultVariants: {
- variant: "default",
- size: "default",
+ variant: 'default',
+ size: 'default',
},
- },
-);
+ }
+)
export interface ButtonProperties
extends React.ButtonHTMLAttributes,
VariantProps {
- asChild?: boolean;
+ asChild?: boolean
}
const Button = React.forwardRef(
({ className, variant, size, asChild = false, ...properties }, reference) => {
- const Comp = asChild ? Slot : "button";
+ const Comp = asChild ? Slot : 'button'
return (
- );
- },
-);
-Button.displayName = "Button";
+ )
+ }
+)
+Button.displayName = 'Button'
-export { Button, buttonVariants };
+export { Button, buttonVariants }
diff --git a/src/components/ui/calendar.tsx b/src/components/ui/calendar.tsx
deleted file mode 100644
index f73e53e23..000000000
--- a/src/components/ui/calendar.tsx
+++ /dev/null
@@ -1,66 +0,0 @@
-"use client";
-
-import { ChevronLeft, ChevronRight } from "lucide-react";
-import * as React from "react";
-import { DayPicker } from "react-day-picker";
-
-import { buttonVariants } from "~/components/common/common-button";
-import { cn } from "~/lib/utils";
-
-export type CalendarProperties = React.ComponentProps;
-
-function Calendar({
- className,
- classNames,
- showOutsideDays = true,
- ...properties
-}: CalendarProperties) {
- return (
- ,
- IconRight: () => ,
- }}
- {...properties}
- />
- );
-}
-Calendar.displayName = "Calendar";
-
-export { Calendar };
diff --git a/src/components/ui/card.tsx b/src/components/ui/card.tsx
index 153881b0a..ff0ea418a 100644
--- a/src/components/ui/card.tsx
+++ b/src/components/ui/card.tsx
@@ -1,6 +1,5 @@
-import * as React from "react";
-
-import { cn } from "~/lib/utils";
+import * as React from 'react'
+import { cn } from '~/utils'
const Card = React.forwardRef<
HTMLDivElement,
@@ -9,13 +8,13 @@ const Card = React.forwardRef<
-));
-Card.displayName = "Card";
+))
+Card.displayName = 'Card'
const CardHeader = React.forwardRef<
HTMLDivElement,
@@ -23,11 +22,11 @@ const CardHeader = React.forwardRef<
>(({ className, ...properties }, reference) => (
-));
-CardHeader.displayName = "CardHeader";
+))
+CardHeader.displayName = 'CardHeader'
const CardTitle = React.forwardRef<
HTMLParagraphElement,
@@ -37,12 +36,12 @@ const CardTitle = React.forwardRef<
ref={reference}
className={cn(
className,
- "text-2xl font-semibold leading-none tracking-tight",
+ 'text-2xl font-semibold leading-none tracking-tight'
)}
{...properties}
/>
-));
-CardTitle.displayName = "CardTitle";
+))
+CardTitle.displayName = 'CardTitle'
const CardDescription = React.forwardRef<
HTMLParagraphElement,
@@ -50,19 +49,19 @@ const CardDescription = React.forwardRef<
>(({ className, ...properties }, reference) => (
-));
-CardDescription.displayName = "CardDescription";
+))
+CardDescription.displayName = 'CardDescription'
const CardContent = React.forwardRef<
HTMLDivElement,
React.HTMLAttributes
>(({ className, ...properties }, reference) => (
-
-));
-CardContent.displayName = "CardContent";
+
+))
+CardContent.displayName = 'CardContent'
const CardFooter = React.forwardRef<
HTMLDivElement,
@@ -70,17 +69,10 @@ const CardFooter = React.forwardRef<
>(({ className, ...properties }, reference) => (
-));
-CardFooter.displayName = "CardFooter";
+))
+CardFooter.displayName = 'CardFooter'
-export {
- Card,
- CardHeader,
- CardFooter,
- CardTitle,
- CardDescription,
- CardContent,
-};
+export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }
diff --git a/src/components/ui/chart.tsx b/src/components/ui/chart.tsx
deleted file mode 100644
index 94664dbb6..000000000
--- a/src/components/ui/chart.tsx
+++ /dev/null
@@ -1,367 +0,0 @@
-"use client";
-
-import * as React from "react";
-import * as RechartsPrimitive from "recharts";
-
-import { cn } from "~/lib/utils";
-
-// Format: { THEME_NAME: CSS_SELECTOR }
-const THEMES = { light: "", dark: ".dark" } as const;
-
-export type ChartConfig = {
- [k in string]: {
- label?: React.ReactNode;
- icon?: React.ComponentType;
- } & (
- | { color?: string; theme?: never }
- | { color?: never; theme: Record }
- );
-};
-
-type ChartContextProperties = {
- config: ChartConfig;
-};
-
-const ChartContext = React.createContext(
- undefined,
-);
-
-function useChart() {
- const context = React.useContext(ChartContext);
-
- if (!context) {
- throw new Error("useChart must be used within a ");
- }
-
- return context;
-}
-
-const ChartContainer = React.forwardRef<
- HTMLDivElement,
- React.ComponentProps<"div"> & {
- config: ChartConfig;
- children: React.ComponentProps<
- typeof RechartsPrimitive.ResponsiveContainer
- >["children"];
- }
->(({ id, className, children, config, ...properties }, reference) => {
- const uniqueId = React.useId();
- const chartId = `chart-${id || uniqueId.replaceAll(":", "")}`;
-
- return (
-
-
-
-
- {children}
-
-
-
- );
-});
-ChartContainer.displayName = "Chart";
-
-const ChartStyle = ({ id, config }: { id: string; config: ChartConfig }) => {
- const colorConfig = Object.entries(config).filter(
- ([, config]) => config.theme || config.color,
- );
-
- if (colorConfig.length === 0) {
- return;
- }
-
- return (
-
- handleClick("Payments")}
- >
-
-
-
-
- Payments
-
-
-
- handleClick("Safety")}
- >
-
-
-
-
- Safety
-
-
-
- handleClick("Database")}
- >
-
-
-
-
- Database
-
-
-
- handleClick("Email management")}
- >
-
-
-
-
- Email management
-
-
-
-
-
- {renderContent()}
-
-
-
- );
-};
-
-export default WaitlistPayment;
diff --git a/src/config/auth.config.ts b/src/config/auth.config.ts
index 1bb31a242..4bb977a94 100644
--- a/src/config/auth.config.ts
+++ b/src/config/auth.config.ts
@@ -1,14 +1,11 @@
-import { NextAuthConfig, Session } from "next-auth";
-import { JWT } from "next-auth/jwt";
-import Credentials from "next-auth/providers/credentials";
-import Google from "next-auth/providers/google";
-import Twitter from "next-auth/providers/twitter";
-
-import { credentialsAuth, googleAuth, twitterAuth } from "~/actions/userAuth";
-import { LoginSchema } from "~/schemas";
-import { CustomJWT } from "~/types";
-
-const isDevelopment = process.env.NODE_ENV === "development";
+import { NextAuthConfig, Session } from 'next-auth'
+import { JWT } from 'next-auth/jwt'
+import Credentials from 'next-auth/providers/credentials'
+import Google from 'next-auth/providers/google'
+import { nextLogin, googleAuth } from '~/actions/nextauth'
+import { inDevEnvironment } from '~/utils'
+import { LoginSchema } from '~/schemas'
+import { CustomJWT } from '~/types'
export default {
providers: [
@@ -17,137 +14,114 @@ export default {
clientSecret: process.env.GOOGLE_CLIENT_SECRET!,
authorization: {
params: {
- prompt: "consent",
- access_type: "offline",
- response_type: "code",
+ prompt: 'consent',
+ access_type: 'offline',
+ response_type: 'code',
},
},
}),
- Twitter({
- clientId: process.env.TWITTER_CLIENT_ID!,
- clientSecret: process.env.TWITTER_CLIENT_SECRET!,
- }),
Credentials({
async authorize(credentials) {
- const validatedFields = LoginSchema.safeParse(credentials);
+ const validatedFields = LoginSchema.safeParse(credentials)
if (!validatedFields.success) {
- // eslint-disable-next-line unicorn/no-null
- return null;
+ return null
}
- const { email, password, rememberMe } = validatedFields.data;
- const response = await credentialsAuth({ email, password, rememberMe });
+ const { email, password, rememberMe } = validatedFields.data
+ const response = await nextLogin({ email, password, rememberMe })
if (!response) {
- // eslint-disable-next-line unicorn/no-null
- return null;
+ return null
}
- if (!response || !("data" in response)) {
- // eslint-disable-next-line unicorn/no-null
- return null;
+ if (!response || !('data' in response)) {
+ return null
}
- const user = response.data as CustomJWT;
- user.access_token = response.access_token;
- return user;
+ const user = response.data as CustomJWT
+ user.access_token = response.access_token
+ return user
},
}),
],
session: {
- strategy: "jwt",
+ strategy: 'jwt',
},
- debug: isDevelopment,
+ debug: inDevEnvironment,
callbacks: {
async signIn({ account, profile, user }) {
- if (account?.provider === "google" && profile?.email) {
- return true;
+ if (account?.provider === 'google' && profile?.email) {
+ return true
}
- if (account?.provider === "twitter") {
- return true;
+ if (account?.provider === 'twitter') {
+ return true
}
- return !!user;
+ return !!user
},
async jwt({ token, user, account }) {
- if (account?.provider === "google") {
+ if (account?.provider === 'google') {
if (!account?.id_token) {
- return token;
+ return token
}
- const response = await googleAuth(account?.id_token);
+ const response = await googleAuth(account?.id_token)
- if (!response || !("data" in response)) {
- return token;
- }
-
- token = response.data as CustomJWT;
- token.access_token = response.access_token;
- return token;
- }
+ console.log(response, 'google response')
- if (account?.provider === "twitter") {
- if (!account?.access_token) {
- return token;
+ if (!response || !('data' in response)) {
+ return token
}
- const response = await twitterAuth(account?.access_token);
-
- if (!response || !("data" in response)) {
- return token;
- }
-
- token = response.data as CustomJWT;
- token.access_token = response.access_token;
- return token;
+ token = response.data as CustomJWT
+ token.access_token = response.access_token
+ return token
}
return {
...token,
...user,
- } as CustomJWT;
+ } as CustomJWT
},
async session({ session, token }: { session: Session; token: JWT }) {
- const customToken = token as CustomJWT;
+ const customToken = token as CustomJWT
+ console.log(customToken, 'token from res')
if (!customToken || !customToken.id) {
return {
...session,
user: {
- id: "",
- first_name: "",
- last_name: "",
- email: "",
- image: "",
+ id: '',
+ first_name: '',
+ last_name: '',
+ email: '',
+ image: '',
},
access_token: undefined,
userOrg: undefined,
currentOrgId: undefined,
expires: new Date(0).toISOString(),
- };
+ }
}
session.user = {
id: customToken.id as string,
first_name: customToken.first_name,
last_name: customToken.last_name,
- image: customToken.avatar_url || "",
+ image: customToken.avatar_url || '',
email: customToken.email as string,
- };
- session.access_token = customToken.access_token;
- session.userOrg = customToken.organisations;
- session.currentOrgId =
- customToken.organisations &&
- customToken.organisations[0]?.organisation_id;
+ }
+ session.access_token = customToken.access_token
+ session.userOrg = customToken.organisations
- return session;
+ return session
},
},
pages: {
- signIn: "/login",
- error: "/error",
+ signIn: '/login',
+ error: '/error',
},
secret: process.env.AUTH_SECRET,
trustHost: true,
-} satisfies NextAuthConfig;
+} satisfies NextAuthConfig
diff --git a/src/constants/faqsdata.ts b/src/constants/faqsdata.ts
deleted file mode 100644
index 420020512..000000000
--- a/src/constants/faqsdata.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-export const faqData = [
- {
- question: "question1",
- content: "answer1",
- },
- {
- question: "question2",
- content: "answer2",
- },
- {
- question: "question3",
- content: "answer3",
- },
-];
diff --git a/src/constants/templateList.ts b/src/constants/templateList.ts
deleted file mode 100644
index 72d424ee8..000000000
--- a/src/constants/templateList.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-const templateTableList = [
- { id: 1, name: "Alani", image: "" },
- { id: 2, name: "Alani1", image: "" },
- { id: 3, name: "Alani2", image: "" },
- { id: 4, name: "Alani3", image: "" },
- { id: 5, name: "Alani4", image: "" },
- { id: 6, name: "Alani5", image: "" },
- { id: 7, name: "Alani6", image: "" },
- { id: 8, name: "Alani7", image: "" },
- { id: 9, name: "Alani8", image: "" },
- { id: 10, name: "Alani9", image: "" },
- { id: 11, name: "Alani10", image: "" },
- { id: 12, name: "Alani11", image: "" },
- { id: 13, name: "Alani12", image: "" },
- { id: 14, name: "Alani13", image: "" },
- { id: 15, name: "Alani14", image: "" },
- { id: 16, name: "Alani15", image: "" },
- { id: 17, name: "Alani16", image: "" },
- { id: 18, name: "Alani17", image: "" },
- { id: 19, name: "Alani18", image: "" },
- { id: 20, name: "Alani19", image: "" },
- { id: 21, name: "Alani20", image: "" },
- { id: 22, name: "Alani21", image: "" },
- { id: 23, name: "Alani22", image: "" },
-];
-
-export default templateTableList;
diff --git a/src/constants/topicsdata.ts b/src/constants/topicsdata.ts
deleted file mode 100644
index e5b61e58a..000000000
--- a/src/constants/topicsdata.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-export const topics = [
- {
- id: "item-1",
- question: "What is EcoClean?",
- answer: "Lorem ipsum dolor sit amet, consectetur elit.",
- },
- {
- id: "item-2",
- question: "How does EcoClean work?",
- answer: "Lorem ipsum dolor sit amet consectetur elit.",
- },
- {
- id: "item-3",
- question: "What are the key features of EcoClean?",
- answer: "Lorem ipsum dolor sit amet, consectetur elit.",
- },
- {
- id: "item-4",
- question: "Who can benefit from using EcoClean?",
- answer: "Lorem ipsum dolor sit amet consectetur elit.",
- },
- {
- id: "item-5",
- question: "What are the system requirements for EcoClean?",
- answer: "Lorem ipsum dolor sit amet consectetur elit.",
- },
- {
- id: "item-6",
- question: "How do I use EcoClean?",
- answer: "Lorem ipsum dolor sit amet, consectetur elit.",
- },
- {
- id: "item-7",
- question: "How do I store EcoClean?",
- answer: "Lorem ipsum dolor sit amet, consectetur elit.",
- },
- {
- id: "item-8",
- question: "How much does EcoClean cost?",
- answer: "Lorem ipsum dolor sit amet, consectetur elit.",
- },
- {
- id: "item-9",
- question: "Are there any discounts available?",
- answer: "Lorem ipsum dolor sit amet, consectetur elit.",
- },
-];
diff --git a/src/contexts/authContext.tsx b/src/contexts/authContext.tsx
deleted file mode 100644
index 856839a76..000000000
--- a/src/contexts/authContext.tsx
+++ /dev/null
@@ -1,26 +0,0 @@
-"use client";
-
-import { SessionProvider, useSession } from "next-auth/react";
-import { ReactNode } from "react";
-
-interface AuthProviderProperties {
- children: ReactNode;
-}
-
-function SessionChecker({ children }: AuthProviderProperties) {
- const { status } = useSession();
-
- if (status === "loading") {
- return;
- }
-
- return <>{children}>;
-}
-
-export default function AuthProvider({ children }: AuthProviderProperties) {
- return (
-
- {children}
-
- );
-}
diff --git a/src/contexts/orgContext.tsx b/src/contexts/orgContext.tsx
deleted file mode 100644
index 9712adfaa..000000000
--- a/src/contexts/orgContext.tsx
+++ /dev/null
@@ -1,158 +0,0 @@
-"use client";
-
-import { useSession } from "next-auth/react";
-import React, {
- createContext,
- useCallback,
- useContext,
- useEffect,
- useState,
-} from "react";
-
-import { DashboardData, MonthlyData, Organisation, Product } from "~/types";
-
-type ActiveFilter = "in stock" | "out of stock" | "preorder" | "all";
-
-interface NotificationPreview {
- message: string;
- created_at: string;
- is_read: boolean;
- id: string;
-}
-
-interface NotificationsData {
- data: {
- total_unread_notification_count: number;
- total_notification_count: number;
- notifications: NotificationPreview[];
- };
- message: string;
-}
-
-interface OrgContextProperties {
- organizations: Organisation[];
- isLoading: boolean;
- monthlyData: MonthlyData | undefined;
- dashboardData: DashboardData | undefined;
- products: Product[];
- selectedProduct: string;
- setSelectedProduct: React.Dispatch>;
- active_filter: ActiveFilter;
- setActive_filter: React.Dispatch>;
- isNewModal: boolean;
- setIsNewModal: React.Dispatch>;
- isDelete: boolean;
- setIsDelete: React.Dispatch>;
- isOpen: boolean;
- updateOpen: React.Dispatch>;
- isActionModal: boolean;
- setIsActionModal: React.Dispatch>;
- switchOrganization: (orgId: string) => void;
- notifications: NotificationsData | undefined;
-}
-
-interface SessionCheckerProperties {
- children: React.ReactNode;
-}
-
-export const OrgContext = createContext({} as OrgContextProperties);
-
-interface ProviderProperties {
- children: React.ReactNode;
- initialData: {
- monthlyData?: MonthlyData;
- dashboardData?: DashboardData;
- products?: Product[];
- notifications?: NotificationsData;
- };
-}
-const OrgContextProvider = (properties: ProviderProperties) => {
- const { children, initialData } = properties;
-
- const monthlyData = initialData.monthlyData;
- const dashboardData = initialData.dashboardData;
- const products = initialData.products || [];
- const notifications = initialData.notifications;
-
- const { data: session, update, status } = useSession();
-
- const [selectedProduct, setSelectedProduct] = useState("");
- const [isNewModal, setIsNewModal] = useState(false);
- const [isDelete, setIsDelete] = useState(false);
- const [isOpen, updateOpen] = useState(false);
- const [isActionModal, setIsActionModal] = useState(false);
- const [active_filter, setActive_filter] = useState("all");
- const isAnyModalOpen = isNewModal || isDelete || isOpen || isActionModal;
- const isLoading = status === "loading";
-
- const switchOrganization = useCallback(
- (orgId: string) => {
- if (session) {
- const updatedSession = { ...session, currentOrgId: orgId };
- update(() => updatedSession);
- }
- },
- [session, update],
- );
- useEffect(() => {
- const handleKeyDown = (event: KeyboardEvent) => {
- if (event.key === "Escape") {
- setIsNewModal(false);
- setIsDelete(false);
- updateOpen(false);
- setIsActionModal(false);
- }
- };
-
- document.body.style.overflow = isAnyModalOpen ? "hidden" : "auto";
- document.addEventListener("keydown", handleKeyDown);
- return () => document.removeEventListener("keydown", handleKeyDown);
- }, [isAnyModalOpen]);
-
- function SessionChecker({ children }: SessionCheckerProperties) {
- if (status === "loading") {
- return Loading...
;
- }
-
- return <>{children}>;
- }
-
- return (
-
- {children}
-
- );
-};
-
-export const useOrgContext = () => {
- const context = useContext(OrgContext);
-
- if (!context) {
- throw new Error("useOrgContext must be used within a OrgContextProvider");
- }
- return context;
-};
-
-export default OrgContextProvider;
diff --git a/src/email/config/tailwind.config.ts b/src/email/config/tailwind.config.ts
deleted file mode 100644
index 373b1baa3..000000000
--- a/src/email/config/tailwind.config.ts
+++ /dev/null
@@ -1,167 +0,0 @@
-/* eslint-disable unicorn/prefer-module */
-/**
- *
- * THIS IS A TEST CONFIGUARATION FOR EMAIL-TEMPLETES
- * DURING DEVELOPMENT WE NOTICED THAT, THE EMAIL TEMPLATE COMPONENTS DOES NOT REFLECT THE TAILWIND VARIABLES BEEN PASSED INTO THE CLASSNAMES E.G
- * =================================
- * neutral: {
- dark: {
- 1: "hsl(var(--neutralColor-dark-1))",
- 2: "hsl(var(--neutralColor-dark-2))",
- },
- },
- =================================
- INSTEAD IT ACCEPTS:
- =================================
- neutral: {
- dark: {
- 1: "hsl(0, 0%, 32%)",
- 2: "hsl(0, 0%, 4%)",
- },
- },
- =================================
-
- HENCE THE CREATION OF THIS FILE HERE..IT DOES FEEL REDUNDANT, BUT TO ACCEPT A UNIFIRM DESIGN CONSISTENCY WITHT THE APP.
- */
-
-import type { Config } from "tailwindcss";
-
-export const emailTemplateConfig = {
- darkMode: ["class"],
- content: [],
- prefix: "",
- theme: {
- container: {
- center: true,
- padding: "2rem",
- screens: {
- "2xl": "1400px",
- },
- },
- extend: {
- colors: {
- border: "hsl(214, 32%, 91%)",
- input: "hsl(214, 32%, 91%)",
- ring: "hsl(222.2, 84%, 4.9%)",
- toastBg: "hsl(128, 50%, 94%)",
- toastBorder: "hsl(126, 50%, 58%)",
- defaultBadgeBg: "hsla(222, 47%, 11%, 0.1)",
- primaryBadgeBg: "hsla(25, 95%, 53%, 0.1)",
- successBadgeBg: "hsla(102, 51%, 52%, 0.1)",
- errorBadgeBg: "hsla(0, 72%, 51%, 0.1)",
- background: "hsl(0, 0%, 98%)",
- foreground: "hsl(222.2, 84%, 4.9%)",
- default: {
- DEFAULT: "hsl(222, 47%, 11%)",
- foreground: "hsl(0, 0%, 100%)",
- },
- primary: {
- DEFAULT: "hsl(25, 95%, 53%)",
- foreground: "hsl(0, 0%, 100%)",
- },
- secondary: {
- DEFAULT: "hsl(210, 40%, 96.1%)",
- foreground: "hsl(222.2, 47.4%, 11.2%)",
- },
- destructive: {
- DEFAULT: "hsl(0, 84%, 60%)",
- hover: "hsl(0, 72%, 51%)",
- foreground: "hsl(0, 0%, 100%)",
- },
- subtle: {
- DEFAULT: "hsl(210, 40%, 96%)",
- hover: "hsl(214, 32%, 91%)",
- foreground: "hsl(222, 47%, 11%)",
- },
- loading: {
- DEFAULT: "hsl(222, 47%, 11%)",
- hover: "hsl(215, 25%, 27%)",
- foreground: "hsl(0, 0%, 100%)",
- },
- outline: {
- DEFAULT: "hsl(0, 0%, 100%)",
- hover: "hsl(210, 40%, 96%)",
- foreground: "hsl(222, 47%, 11%)",
- },
- link: "hsl(222, 47%, 11%)",
- muted: {
- DEFAULT: "hsl(210, 40%, 96.1%)",
- foreground: "hsl(215.4, 16.3%, 46.9%)",
- },
- accent: {
- DEFAULT: "hsl(210, 40%, 96.1%)",
- foreground: "hsl(222.2, 47.4%, 11.2%)",
- },
- popover: {
- DEFAULT: "hsl(0, 0%, 100%)",
- foreground: "hsl(222.2, 84%, 4.9%)",
- },
- card: {
- DEFAULT: "hsl(0, 0%, 100%)",
- foreground: "hsl(222.2, 84%, 4.9%)",
- },
- error: {
- DEFAULT: "hsl(0, 72%, 51%)",
- "50": "hsl(0, 85%, 95%)",
- "700": "hsl(0, 90%, 34%)",
- },
- success: {
- DEFAULT: "hsl(102, 51%, 52%)",
- "50": "hsl(128, 50%, 94%)",
- "700": "hsl(126, 84%, 26%)",
- },
- warning: {
- DEFAULT: "hsl(45, 93%, 47%)",
- "50": "hsl(25, 100%, 98%)",
- },
- neutral: {
- dark: {
- 1: "hsl(0, 0%, 32%)",
- 2: "hsl(0, 0%, 4%)",
- },
- },
- stroke: {
- "colors-stroke": "hsl(213, 27%, 84%)",
- },
- breadcrumb: {
- page: "hsl(0, 0%, 42%)",
- foreground: "hsl(0, 0%, 13%)",
- },
- desaturatedBlue: "hsl(212.73, 26.83%, 83.92%)",
- grey50: "hsl(0, 0%, 85.1%)",
- blog: {
- relatedBg: "hsl(0, 0%, 98%)",
- relatedHeading: "hsl(0, 0%, 32%)",
- relatedTimeReadBg: "hsl(220, 14%, 96%)",
- },
- },
- borderRadius: {
- lg: "0.5rem",
- md: "calc(0.5rem - 2px)",
- sm: "calc(0.5rem - 4px)",
- },
- boxShadow: {
- spread: "0px 1px 18px 0px #0A39B01F",
- },
- keyframes: {
- "accordion-down": {
- from: { height: "0" },
- to: { height: "var(--radix-accordion-content-height)" },
- },
- "accordion-up": {
- from: { height: "var(--radix-accordion-content-height)" },
- to: { height: "0" },
- },
- },
- animation: {
- "accordion-down": "accordion-down 0.2s ease-out",
- "accordion-up": "accordion-up 0.2s ease-out",
- },
- },
- },
-
- plugins: [
- require("tailwindcss-animate"),
- require("@mertasan/tailwindcss-variables"),
- ],
-} satisfies Config;
diff --git a/src/email/layout/layout.tsx b/src/email/layout/layout.tsx
deleted file mode 100644
index 0d5f10ad5..000000000
--- a/src/email/layout/layout.tsx
+++ /dev/null
@@ -1,36 +0,0 @@
-import { Body, Container, Font, Head, Html } from "@react-email/components";
-
-import EmailFooter from "../templates/_components/template-footer/EmailFooter";
-import EmailHeader from "../templates/_components/template-header/EmailHeader";
-import TailwindWrapper from "../templates/_tailwindWrapper";
-
-export default function Layout({
- children,
-}: Readonly<{
- children: React.ReactNode;
-}>) {
- return (
-
-
-
-
-
-
-
-
- {children}
-
-
-
-
- );
-}
diff --git a/src/email/templates/_components/CustomButton.tsx b/src/email/templates/_components/CustomButton.tsx
deleted file mode 100644
index 60052b19e..000000000
--- a/src/email/templates/_components/CustomButton.tsx
+++ /dev/null
@@ -1,19 +0,0 @@
-import { Link } from "@react-email/components";
-import { ButtonHTMLAttributes, FC } from "react";
-
-interface IProperties extends ButtonHTMLAttributes {
- title: string;
- link: string;
-}
-
-const CustomButton: FC = ({ title, link, ...properties }) => {
- return (
-
-
- {title}
-
-
- );
-};
-
-export default CustomButton;
diff --git a/src/email/templates/_components/_assets/email-verification.png b/src/email/templates/_components/_assets/email-verification.png
deleted file mode 100644
index 6cd86d244..000000000
Binary files a/src/email/templates/_components/_assets/email-verification.png and /dev/null differ
diff --git a/src/email/templates/_components/template-footer/EmailFooter.tsx b/src/email/templates/_components/template-footer/EmailFooter.tsx
deleted file mode 100644
index 090810760..000000000
--- a/src/email/templates/_components/template-footer/EmailFooter.tsx
+++ /dev/null
@@ -1,171 +0,0 @@
-import {
- Column,
- Container,
- Hr,
- Img,
- Link,
- Row,
- Section,
- Text,
-} from "@react-email/components";
-
-const EmailFooter = () => (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Thank you for choosing Boilerplate. Need help?{" "}
-
- Contact our customer support
-
-
-
-
-
-
-
- You are receiving this email because you signed up at{" "}
-
- Boilerplate.com
-
- . Want to change how you receive these emails?
-
-
- You can{" "}
-
- update your preferences
- {" "}
- or{" "}
-
- unsubscribe from this list.
-
-
-
-
-);
-
-const footerContainer: React.CSSProperties = {
- backgroundColor: "#E1D6D666",
- padding: "32px 48px",
- textAlign: "left",
- fontSize: "14px",
- color: "#5B5B5D",
- maxWidth: "792px",
- margin: "0 auto",
-};
-
-const socialLinksRow: React.CSSProperties = {
- width: "fit-content",
- display: "flex",
- justifyContent: "center",
- alignItems: "center",
- flexWrap: "wrap",
- marginBottom: "32px",
- marginTop: "32px",
-};
-
-const socialIcon: React.CSSProperties = {
- width: "24px",
- height: "24px",
- margin: "0 15px", // Reduce margin for smaller screens
-};
-
-const paragraph: React.CSSProperties = {
- margin: "0 0 16px 0",
- lineHeight: "1.6",
-};
-
-const link: React.CSSProperties = {
- color: "#5B5B5D",
- textDecoration: "underline",
-};
-
-const linkBold: React.CSSProperties = {
- color: "#5B5B5D",
- fontWeight: "bold",
- textDecoration: "underline",
-};
-
-const divider: React.CSSProperties = {
- border: "0",
- borderTop: "1px dashed #5B5B5D20",
- margin: "30px 0",
-};
-
-export default EmailFooter;
diff --git a/src/email/templates/_components/template-header/EmailHeader.tsx b/src/email/templates/_components/template-header/EmailHeader.tsx
deleted file mode 100644
index b998d1829..000000000
--- a/src/email/templates/_components/template-header/EmailHeader.tsx
+++ /dev/null
@@ -1,57 +0,0 @@
-import { Column, Container, Img, Row, Text } from "@react-email/components";
-
-const EmailHeader = () => (
-
-
-
-
- Boilerplate.
-
-
-
-);
-
-const headerContainerStyle = {
- backgroundColor: "#E1D6D666",
- border: "1px solid #E1D6D666",
- padding: "10px",
- textAlign: "center",
- maxWidth: "792px",
- height: "122px",
- margin: "0 auto",
-} as React.CSSProperties;
-
-const headerRowStyle: React.CSSProperties = {
- width: "fit-content",
- display: "flex",
- flexDirection: "column" as const,
- alignItems: "center" as const,
- justifyContent: "center" as const,
- gap: "10px",
-};
-
-const headerColumnStyle: React.CSSProperties = {
- display: "flex",
- justifyContent: "center" as const,
- alignItems: "center" as const,
- height: "fit-content",
-};
-
-const imgStyle: React.CSSProperties = {
- display: "inline-block",
- marginRight: "10px",
-};
-
-const textStyle: React.CSSProperties = {
- fontSize: "24px",
- fontWeight: "bold",
- margin: 0,
-};
-
-export default EmailHeader;
diff --git a/src/email/templates/_components/template-table/TemplateTable.tsx b/src/email/templates/_components/template-table/TemplateTable.tsx
deleted file mode 100644
index 4c92bb6d1..000000000
--- a/src/email/templates/_components/template-table/TemplateTable.tsx
+++ /dev/null
@@ -1,87 +0,0 @@
-import { Heading, Section, Text } from "@react-email/components";
-import React, { ReactNode } from "react";
-
-export interface ITemplateTableProperties {
- title?: string;
- subTitle?: string;
- data: {
- key: string;
- values: (string | ReactNode)[];
- }[];
-}
-
-const tableStyles: React.CSSProperties = {
- backgroundColor: "#F6F8FB",
- borderCollapse: "collapse",
- width: "100%",
-};
-
-const tableCellStyles: React.CSSProperties = {
- border: "1px solid #E1E1E1",
- padding: "24px",
-};
-
-const headingStyles: React.CSSProperties = {
- fontSize: "18px",
- color: "#333",
- margin: "0",
-};
-
-const subHeadingStyles: React.CSSProperties = {
- fontSize: "16px",
- color: "#666",
- margin: "0",
-};
-
-const rowSeparatorStyles: React.CSSProperties = {
- // borderBottom: "1px solid #E1E1E1",
-};
-
-export function TemplateTable({
- data,
- title,
- subTitle,
-}: ITemplateTableProperties) {
- return (
- <>
-
-
- {title}
-
- {subTitle}
-
-
-
- {data.map((item, index) => (
-
-
-
- {item.key}
-
- {item.values.map((value, valueIndex) => (
-
- {value}
-
- ))}
-
-
-
-
-
- ))}
-
-
- >
- );
-}
diff --git a/src/email/templates/_tailwindWrapper/index.tsx b/src/email/templates/_tailwindWrapper/index.tsx
deleted file mode 100644
index 0972429f4..000000000
--- a/src/email/templates/_tailwindWrapper/index.tsx
+++ /dev/null
@@ -1,14 +0,0 @@
-import { Tailwind } from "@react-email/components";
-import React from "react";
-
-import { emailTemplateConfig } from "~/email/config/tailwind.config";
-
-interface Properties {
- children: React.ReactNode;
-}
-
-export default function TailwindWrapper(properties: Properties) {
- return (
- {properties.children}
- );
-}
diff --git a/src/email/templates/account-activation-successful/image.tsx b/src/email/templates/account-activation-successful/image.tsx
deleted file mode 100644
index b851da6b6..000000000
--- a/src/email/templates/account-activation-successful/image.tsx
+++ /dev/null
@@ -1,141 +0,0 @@
-import {
- Container,
- Heading,
- Img,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-import React from "react";
-
-import Layout from "../../layout/layout";
-
-interface AccountActivationSuccessfulProperties {
- username: string;
- link: string;
-}
-
-const AccountActivationSuccessful = ({
- username,
-}: AccountActivationSuccessfulProperties) => {
- return (
-
-
- {username}, your account was activated successfully
-
-
-
-
-
-
-
- Your Account is Now Active!
-
-
-
- Hi {username},
-
- Congratulations! Your account with Boilerplate is now active and
- ready to use.
-
-
- We're thrilled to have you as part of our community and
- look forward to helping you make the most out of your experience
- with us.
-
-
- You can now log in and start exploring all the features and
- benefits we have to offer.
-
-
- Thank you for joining Boilerplate!
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
-
- );
-};
-
-const sectionStyle: React.CSSProperties = {
- margin: "56px 0",
-};
-
-const imageContainerStyle: React.CSSProperties = {
- margin: "0 auto",
- display: "flex",
- alignItems: "center",
- justifyContent: "center",
- maxWidth: "fit-content",
-};
-
-const imageStyle: React.CSSProperties = {
- width: "100%",
- height: "100%",
-};
-
-const containerStyle: React.CSSProperties = {
- padding: "0 48px",
- maxWidth: "680px",
- margin: "0 auto",
-};
-
-const textSectionStyle: React.CSSProperties = {
- marginTop: "56px",
- display: "flex",
- flexDirection: "column",
- alignItems: "center",
- justifyContent: "center",
-};
-
-const headingStyle: React.CSSProperties = {
- margin: "0 0 56px 0",
- textAlign: "center",
- fontSize: "24px",
- lineHeight: "28px",
- color: "#121212",
-};
-
-const greetingTextStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0 0 32px 0",
-};
-
-const descriptionTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
- margin: "0 0 16px 0",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-AccountActivationSuccessful.PreviewProps = {
- username: "John Doe",
- link: "www.boilerplate.com",
-} satisfies AccountActivationSuccessfulProperties;
-
-export default AccountActivationSuccessful;
diff --git a/src/email/templates/account-activation-successful/no-image.tsx b/src/email/templates/account-activation-successful/no-image.tsx
deleted file mode 100644
index b18c6beea..000000000
--- a/src/email/templates/account-activation-successful/no-image.tsx
+++ /dev/null
@@ -1,117 +0,0 @@
-import {
- Container,
- Heading,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-import React from "react";
-
-import Layout from "../../layout/layout";
-
-interface AccountActivationSuccessfulProperties {
- username: string;
-}
-
-const AccountActivationSuccessful = ({
- username,
-}: AccountActivationSuccessfulProperties) => {
- return (
-
-
- {username}, your account was activated successfully
-
-
-
- Your Account is Now Active!
-
-
-
- Hi {username},
-
- Congratulations! Your account with Boilerplate is now active and
- ready to use.
-
-
- We're thrilled to have you as part of our community and
- look forward to helping you make the most out of your experience
- with us.
-
-
- You can now log in and start exploring all the features and
- benefits we have to offer.
-
-
- Thank you for joining Boilerplate!
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
-
- );
-};
-
-const sectionStyle: React.CSSProperties = {
- marginBottom: "56px",
-};
-
-const containerStyle: React.CSSProperties = {
- padding: "0 48px",
- maxWidth: "680px",
- margin: "0 auto",
-};
-
-const textSectionStyle: React.CSSProperties = {
- marginTop: "56px",
- display: "flex",
- flexDirection: "column",
- alignItems: "center",
- justifyContent: "center",
-};
-
-const headingStyle: React.CSSProperties = {
- margin: "0 0 56px 0",
- textAlign: "center",
- fontSize: "24px",
- lineHeight: "28px",
- color: "#121212",
-};
-
-const greetingTextStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0 0 32px 0",
-};
-
-const descriptionTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
- margin: "0 0 16px 0",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-AccountActivationSuccessful.PreviewProps = {
- username: "John Doe",
-} satisfies AccountActivationSuccessfulProperties;
-
-export default AccountActivationSuccessful;
diff --git a/src/email/templates/account-activation/image.tsx b/src/email/templates/account-activation/image.tsx
deleted file mode 100644
index c4397d0e4..000000000
--- a/src/email/templates/account-activation/image.tsx
+++ /dev/null
@@ -1,153 +0,0 @@
-import {
- Button,
- Container,
- Heading,
- Img,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-import React from "react";
-
-import Layout from "../../layout/layout";
-
-interface AccountActivationProperties {
- username: string;
- link: string;
-}
-
-const AccountActivation = ({ username, link }: AccountActivationProperties) => {
- return (
-
- {username}, Activate your account
-
-
-
-
-
-
-
-
- Activate Your Account
-
-
-
- Hi {username},
-
- We recently detected a login attempt to your account from an
- unfamiliar device. To ensure the security of your account, we
- haven't granted access.
-
-
- To activate your account and secure it, please click the button
- below:
-
-
-
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-};
-
-const sectionStyle: React.CSSProperties = {
- margin: "56px 0",
-};
-
-const imageContainerStyle: React.CSSProperties = {
- margin: "0 auto",
- display: "flex",
- alignItems: "center",
- justifyContent: "center",
- maxWidth: "fit-content",
-};
-
-const imageStyle: React.CSSProperties = {
- width: "100%",
- height: "100%",
-};
-
-const containerStyle: React.CSSProperties = {
- padding: "0 48px",
- maxWidth: "792px",
- margin: "0 auto",
-};
-
-const textSectionStyle: React.CSSProperties = {
- marginTop: "56px",
- display: "flex",
- flexDirection: "column",
- alignItems: "center",
- justifyContent: "center",
-};
-
-const headingStyle: React.CSSProperties = {
- margin: "0 0 56px 0",
- textAlign: "center",
- fontSize: "24px",
- lineHeight: "28px",
- color: "#121212",
-};
-
-const greetingTextStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0 0 32px 0",
-};
-
-const descriptionTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
- margin: "0 0 16px 0",
-};
-
-const buttonContainerStyle: React.CSSProperties = {
- width: "100%",
- textAlign: "center",
- marginTop: "28px",
-};
-
-const buttonStyle: React.CSSProperties = {
- borderRadius: "8px",
- backgroundColor: "#F97316",
- color: "#FAFAFA",
- padding: "16px",
- textAlign: "center",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-AccountActivation.PreviewProps = {
- username: "John Doe",
- link: "www.boilerplate.com",
-} satisfies AccountActivationProperties;
-
-export default AccountActivation;
diff --git a/src/email/templates/account-activation/no-image.tsx b/src/email/templates/account-activation/no-image.tsx
deleted file mode 100644
index 2b3d60d4f..000000000
--- a/src/email/templates/account-activation/no-image.tsx
+++ /dev/null
@@ -1,131 +0,0 @@
-import {
- Button,
- Container,
- Heading,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-import React from "react";
-
-import Layout from "../../layout/layout";
-
-interface AccountActivationProperties {
- username: string;
- link: string;
-}
-
-const AccountActivation = ({ username, link }: AccountActivationProperties) => {
- return (
-
- {username}, Activate your account
-
-
-
-
- Activate Your Account
-
-
-
- Hi {username},
-
- We recently detected a login attempt to your account from an
- unfamiliar device. To ensure the security of your account, we
- haven't granted access.
-
-
- To activate your account and secure it, please click the button
- below:
-
-
-
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-};
-
-const sectionStyle: React.CSSProperties = {
- marginBottom: "56px",
-};
-
-const containerStyle: React.CSSProperties = {
- padding: "0 48px",
- maxWidth: "792px",
- margin: "0 auto",
-};
-
-const textSectionStyle: React.CSSProperties = {
- marginTop: "56px",
- display: "flex",
- flexDirection: "column",
- alignItems: "center",
- justifyContent: "center",
-};
-
-const headingStyle: React.CSSProperties = {
- margin: "0 0 56px 0",
- textAlign: "center",
- fontSize: "24px",
- lineHeight: "28px",
- color: "#121212",
-};
-
-const greetingTextStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0 0 32px 0",
-};
-
-const descriptionTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
- margin: "0 0 16px 0",
-};
-
-const buttonContainerStyle: React.CSSProperties = {
- width: "100%",
- textAlign: "center",
- marginTop: "28px",
-};
-
-const buttonStyle: React.CSSProperties = {
- borderRadius: "8px",
- backgroundColor: "#F97316",
- color: "#FAFAFA",
- padding: "16px",
- textAlign: "center",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-AccountActivation.PreviewProps = {
- username: "John Doe",
- link: "www.boilerplate.com",
-} satisfies AccountActivationProperties;
-
-export default AccountActivation;
diff --git a/src/email/templates/account-deactivation-inactivity/image.tsx b/src/email/templates/account-deactivation-inactivity/image.tsx
deleted file mode 100644
index eb5a42ace..000000000
--- a/src/email/templates/account-deactivation-inactivity/image.tsx
+++ /dev/null
@@ -1,280 +0,0 @@
-import {
- Button,
- Container,
- Heading,
- Img,
- Link,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-import React from "react";
-
-import Layout from "../../layout/layout";
-
-interface AccountDeactivationInactivityProperties {
- username: string;
- link: string;
- data: Array<{
- key: string;
- value: string;
- }>;
-}
-
-const AccountDeactivationInactivity = ({
- username,
- link,
- data,
-}: AccountDeactivationInactivityProperties) => {
- return (
-
-
-
- {username}, your account was deactivated due to inactivity
-
-
-
-
-
-
-
-
- Account Deactivation Notice
-
-
-
- Hi {username},
-
- We wanted to inform you that your Boilerplate account has been
- deactivated due to a prolonged period of inactivity.
-
-
-
-
-
- Your deactivation details:
-
-
-
-
-
-
-
- If you would like to re-activate your account, you can easily do
- so by contacting our support team via the details below.
-
-
- Give us a call at (+234)-456-7890 or shoot us an
- email at{" "}
-
- support@llaihng.com
-
-
-
- We value your membership and would love to have you back.
-
-
-
-
-
- Reactivate My Account
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-};
-
-AccountDeactivationInactivity.defaultProps = {
- username: "John Doe",
- link: "www.boilerplate.com",
- expireTime: "17th September, 2024",
- data: [
- {
- key: "Account Email",
- value: "johndoe@gmail.com",
- },
- {
- key: "Last Active",
- value: "17th June, 2024 / 11:56pm",
- },
- {
- key: "Deactivation Date",
- value: "20th July, 2024 / 11:56pm",
- },
- ],
-};
-
-const sectionStyle: React.CSSProperties = {
- margin: "56px 0",
-};
-
-const imageContainerStyle: React.CSSProperties = {
- margin: "0 auto",
- display: "flex",
- alignItems: "center",
- justifyContent: "center",
- maxWidth: "fit-content",
-};
-
-const imageStyle: React.CSSProperties = {
- width: "100%",
- height: "100%",
-};
-
-const containerStyle: React.CSSProperties = {
- padding: "0 48px",
- maxWidth: "792px",
- margin: "0 auto",
-};
-
-const textSectionStyle: React.CSSProperties = {
- marginTop: "40px",
- display: "flex",
- flexDirection: "column",
- alignItems: "center",
- justifyContent: "center",
-};
-
-const headingStyle: React.CSSProperties = {
- margin: "0 0 56px 0",
- textAlign: "center",
- fontSize: "24px",
- lineHeight: "28px",
- color: "#121212",
-};
-
-const greetingTextStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0 0 32px 0",
-};
-
-const descriptionTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
- margin: "0 0 16px 0",
-};
-
-const detailsSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const detailsHeadingStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0",
- marginBottom: "20px",
-};
-
-const listStyle: React.CSSProperties = {
- listStyle: "none",
- paddingLeft: "0",
- margin: "0",
-};
-
-const listItemStyle: React.CSSProperties = {
- display: "flex",
- alignItems: "center",
- fontSize: "14px",
- marginBottom: "1rem",
-};
-
-const iconContainerStyle: React.CSSProperties = {
- marginRight: "8px",
- flexShrink: "0",
-};
-
-const iconStyle: React.CSSProperties = {
- width: "10px",
- height: "10px",
-};
-
-const keyStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-const valueStyle: React.CSSProperties = {
- color: "#525252",
-};
-
-const infoSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const infoTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "left",
- marginBottom: "28px",
-};
-
-const buttonContainerStyle: React.CSSProperties = {
- width: "100%",
- textAlign: "center",
- marginTop: "32px",
-};
-
-const buttonStyle: React.CSSProperties = {
- borderRadius: "8px",
- backgroundColor: "#F97316",
- color: "#FAFAFA",
- padding: "16px",
- textAlign: "center",
- display: "inline-block",
- width: "fit-content",
- maxWidth: "300px",
- textDecoration: "none",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "40px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-const linkStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#525252",
- textDecoration: "underline",
-};
-
-export default AccountDeactivationInactivity;
diff --git a/src/email/templates/account-deactivation-inactivity/no-image.tsx b/src/email/templates/account-deactivation-inactivity/no-image.tsx
deleted file mode 100644
index 30a29bc3a..000000000
--- a/src/email/templates/account-deactivation-inactivity/no-image.tsx
+++ /dev/null
@@ -1,259 +0,0 @@
-import {
- Button,
- Container,
- Heading,
- Img,
- Link,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-import React from "react";
-
-import Layout from "../../layout/layout";
-
-interface AccountDeactivationInactivityProperties {
- username: string;
- link: string;
- data: Array<{
- key: string;
- value: string;
- }>;
-}
-
-const AccountDeactivationInactivity = ({
- username,
- link,
- data,
-}: AccountDeactivationInactivityProperties) => {
- return (
-
-
-
- {username}, your account was deactivated due to inactivity
-
-
-
-
- Account Deactivation Notice
-
-
-
- Hi {username},
-
- We wanted to inform you that your Boilerplate account has been
- deactivated due to a prolonged period of inactivity.
-
-
-
-
-
- Your deactivation details:
-
-
-
-
-
-
-
- If you would like to re-activate your account, you can easily do
- so by contacting our support team via the details below.
-
-
- Give us a call at (+234)-456-7890 or shoot us an
- email at{" "}
-
- support@llaihng.com
-
-
-
- We value your membership and would love to have you back.
-
-
-
-
-
- Reactivate My Account
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-};
-
-AccountDeactivationInactivity.defaultProps = {
- username: "John Doe",
- link: "www.boilerplate.com",
- expireTime: "17th September, 2024",
- data: [
- {
- key: "Account Email",
- value: "johndoe@gmail.com",
- },
- {
- key: "Last Active",
- value: "17th June, 2024 / 11:56pm",
- },
- {
- key: "Deactivation Date",
- value: "20th July, 2024 / 11:56pm",
- },
- ],
-};
-
-const sectionStyle: React.CSSProperties = {
- margin: "0 0 56px",
-};
-
-const containerStyle: React.CSSProperties = {
- padding: "0 48px",
- maxWidth: "792px",
- margin: "0 auto",
-};
-
-const textSectionStyle: React.CSSProperties = {
- marginTop: "40px",
- display: "flex",
- flexDirection: "column",
- alignItems: "center",
- justifyContent: "center",
-};
-
-const headingStyle: React.CSSProperties = {
- margin: "0 0 56px 0",
- textAlign: "center",
- fontSize: "24px",
- lineHeight: "28px",
- color: "#121212",
-};
-
-const greetingTextStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0 0 32px 0",
-};
-
-const descriptionTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
- margin: "0 0 16px 0",
-};
-
-const detailsSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const detailsHeadingStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0",
- marginBottom: "20px",
-};
-
-const listStyle: React.CSSProperties = {
- listStyle: "none",
- paddingLeft: "0",
- margin: "0",
-};
-
-const listItemStyle: React.CSSProperties = {
- display: "flex",
- alignItems: "center",
- fontSize: "14px",
- marginBottom: "1rem",
-};
-
-const iconContainerStyle: React.CSSProperties = {
- marginRight: "8px",
- flexShrink: "0",
-};
-
-const iconStyle: React.CSSProperties = {
- width: "10px",
- height: "10px",
-};
-
-const keyStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-const valueStyle: React.CSSProperties = {
- color: "#525252",
-};
-
-const infoSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const infoTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "left",
- marginBottom: "28px",
-};
-
-const buttonContainerStyle: React.CSSProperties = {
- width: "100%",
- textAlign: "center",
- marginTop: "32px",
-};
-
-const buttonStyle: React.CSSProperties = {
- borderRadius: "8px",
- backgroundColor: "#F97316",
- color: "#FAFAFA",
- padding: "16px",
- textAlign: "center",
- display: "inline-block",
- width: "fit-content",
- maxWidth: "300px",
- textDecoration: "none",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "40px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-const linkStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#525252",
- textDecoration: "underline",
-};
-
-export default AccountDeactivationInactivity;
diff --git a/src/email/templates/account-deactivation-successful/image.tsx b/src/email/templates/account-deactivation-successful/image.tsx
deleted file mode 100644
index 4cd7bd95e..000000000
--- a/src/email/templates/account-deactivation-successful/image.tsx
+++ /dev/null
@@ -1,255 +0,0 @@
-import {
- Container,
- Heading,
- Img,
- Link,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-
-import Layout from "../../layout/layout";
-
-interface AccountDeactivationSuccessfulProperties {
- username: string;
- data: Array<{
- key: string;
- value: string;
- }>;
-}
-
-const AccountDeactivationSuccessful = ({
- username,
- data,
-}: AccountDeactivationSuccessfulProperties) => {
- return (
-
-
- {username}, your account was deactivated successfully
-
-
-
-
-
-
- Account Deactivation Successful
-
-
-
- Hi {username},
-
- We wanted to let you know that your Boilerplate account has been
- successfully deactivated as per your request.
-
-
-
-
-
- Your deactivation details:
-
-
-
-
-
-
-
- If you would like to re-activate your account, you can easily do
- so by contacting our support team via the details below.
-
-
- Give us a call at{" "}
- (+234)-456-7890 or shoot us
- an email at{" "}
-
- support@llaihng.com
-
-
-
- We value your membership and would love to have you back.
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-};
-
-const imageContainerStyle: React.CSSProperties = {
- margin: "0 auto",
- display: "flex",
- alignItems: "center",
- justifyContent: "center",
- maxWidth: "fit-content",
-};
-
-const imageStyle: React.CSSProperties = {
- width: "100%",
- height: "100%",
-};
-
-const containerStyle: React.CSSProperties = {
- padding: "0 48px",
- maxWidth: "680px",
- margin: "0 auto",
-};
-
-const sectionStyle: React.CSSProperties = {
- margin: "56px 0",
-};
-
-const textSectionStyle: React.CSSProperties = {
- marginTop: "40px",
- display: "flex",
- flexDirection: "column",
- alignItems: "center",
- justifyContent: "center",
-};
-
-const headingStyle: React.CSSProperties = {
- margin: "0 0 56px 0",
- textAlign: "center",
- fontSize: "24px",
- lineHeight: "28px",
- color: "#121212",
-};
-
-const greetingTextStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0 0 32px 0",
-};
-
-const descriptionTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
- margin: "0 0 16px 0",
-};
-
-const detailsSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const detailsHeadingStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0",
- marginBottom: "20px",
-};
-
-const listStyle: React.CSSProperties = {
- listStyle: "none",
- paddingLeft: "0",
- margin: "0",
-};
-
-const listItemStyle: React.CSSProperties = {
- display: "flex",
- alignItems: "start",
- fontSize: "14px",
- marginBottom: "1rem",
-};
-
-const iconContainerStyle: React.CSSProperties = {
- marginRight: "8px",
- flexShrink: "0",
-};
-
-const iconStyle: React.CSSProperties = {
- width: "10px",
- height: "10px",
-};
-
-const keyStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-const valueStyle: React.CSSProperties = {
- color: "#525252",
-};
-
-const infoSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const infoTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "left",
- marginBottom: "28px",
-};
-
-const contactTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "left",
- marginBottom: "28px",
-};
-
-const fontWeightStyle: React.CSSProperties = {
- fontWeight: "600",
-};
-
-const linkStyle: React.CSSProperties = {
- color: "#525252",
- textDecoration: "underline",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "40px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-AccountDeactivationSuccessful.PreviewProps = {
- username: "John Doe",
- data: [
- {
- key: "Account Email",
- value: "johndoe@gmail.com",
- },
- {
- key: "Deactivation Date",
- value: "20th July, 2024 / 11:56pm",
- },
- ],
-} satisfies AccountDeactivationSuccessfulProperties;
-
-export default AccountDeactivationSuccessful;
diff --git a/src/email/templates/account-deactivation-successful/no-image.tsx b/src/email/templates/account-deactivation-successful/no-image.tsx
deleted file mode 100644
index 417c91256..000000000
--- a/src/email/templates/account-deactivation-successful/no-image.tsx
+++ /dev/null
@@ -1,235 +0,0 @@
-import {
- Container,
- Heading,
- Img,
- Link,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-
-import Layout from "../../layout/layout";
-
-interface AccountDeactivationSuccessfulProperties {
- username: string;
- data: Array<{
- key: string;
- value: string;
- }>;
-}
-
-const AccountDeactivationSuccessful = ({
- username,
- data,
-}: AccountDeactivationSuccessfulProperties) => {
- return (
-
-
- {username}, your account was deactivated successfully
-
-
-
- Account Deactivation Successful
-
-
-
- Hi {username},
-
- We wanted to let you know that your Boilerplate account has been
- successfully deactivated as per your request.
-
-
-
-
-
- Your deactivation details:
-
-
-
-
-
-
-
- If you would like to re-activate your account, you can easily do
- so by contacting our support team via the details below.
-
-
- Give us a call at{" "}
- (+234)-456-7890 or shoot us
- an email at{" "}
-
- support@llaihng.com
-
-
-
- We value your membership and would love to have you back.
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-};
-
-const containerStyle: React.CSSProperties = {
- padding: "0 48px",
- maxWidth: "680px",
- margin: "0 auto",
-};
-
-const sectionStyle: React.CSSProperties = {
- margin: "0 0 56px",
-};
-
-const textSectionStyle: React.CSSProperties = {
- marginTop: "40px",
- display: "flex",
- flexDirection: "column",
- alignItems: "center",
- justifyContent: "center",
-};
-
-const headingStyle: React.CSSProperties = {
- margin: "0 0 56px 0",
- textAlign: "center",
- fontSize: "24px",
- lineHeight: "28px",
- color: "#121212",
-};
-
-const greetingTextStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0 0 32px 0",
-};
-
-const descriptionTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
- margin: "0 0 16px 0",
-};
-
-const detailsSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const detailsHeadingStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0",
- marginBottom: "20px",
-};
-
-const listStyle: React.CSSProperties = {
- listStyle: "none",
- paddingLeft: "0",
- margin: "0",
-};
-
-const listItemStyle: React.CSSProperties = {
- display: "flex",
- alignItems: "center",
- fontSize: "14px",
- marginBottom: "1rem",
-};
-
-const iconContainerStyle: React.CSSProperties = {
- marginRight: "8px",
- flexShrink: "0",
-};
-
-const iconStyle: React.CSSProperties = {
- width: "10px",
- height: "10px",
-};
-
-const keyStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-const valueStyle: React.CSSProperties = {
- color: "#525252",
-};
-
-const infoSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const infoTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "left",
- marginBottom: "28px",
-};
-
-const contactTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "left",
- marginBottom: "28px",
-};
-
-const fontWeightStyle: React.CSSProperties = {
- fontWeight: "600",
-};
-
-const linkStyle: React.CSSProperties = {
- color: "#525252",
- textDecoration: "underline",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "40px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-AccountDeactivationSuccessful.PreviewProps = {
- username: "John Doe",
- data: [
- {
- key: "Account Email",
- value: "johndoe@gmail.com",
- },
- {
- key: "Deactivation Date",
- value: "20th July, 2024 / 11:56pm",
- },
- ],
-} satisfies AccountDeactivationSuccessfulProperties;
-
-export default AccountDeactivationSuccessful;
diff --git a/src/email/templates/account-deactivation/image.tsx b/src/email/templates/account-deactivation/image.tsx
deleted file mode 100644
index 770028b0b..000000000
--- a/src/email/templates/account-deactivation/image.tsx
+++ /dev/null
@@ -1,274 +0,0 @@
-import {
- Button,
- Container,
- Heading,
- Img,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-import React from "react";
-
-import Layout from "../../layout/layout";
-
-interface AccountDeactivationProperties {
- username: string;
- link: string;
- deactivationDaysLeft: string;
- expireTime: string;
- data: Array<{
- key: string;
- value: string;
- }>;
-}
-
-const AccountDeactivation = ({
- username,
- link,
- deactivationDaysLeft,
- expireTime,
- data,
-}: AccountDeactivationProperties) => {
- return (
-
-
- {username}, account deactivation notice
-
-
-
-
-
-
-
- Account Deactivation Notice{" "}
- {deactivationDaysLeft}
-
-
-
- Hi {username},
-
- We noticed that you haven't logged into your Boilerplate
- account for quite some time. As part of our ongoing efforts to
- maintain a secure and efficient service, we will be deactivating
- inactive accounts.
-
-
-
-
-
- Your deactivation details:
-
-
-
-
-
-
-
- To keep your account active, simply log in before the deactivation
- date ({expireTime}). However, if you no longer wish to use your
- account, no further action is needed on your part.
-
-
-
-
-
- Activate My Account
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-};
-
-const sectionStyle: React.CSSProperties = {
- margin: "56px 0",
-};
-
-const imageContainerStyle: React.CSSProperties = {
- margin: "0 auto",
- display: "flex",
- alignItems: "center",
- justifyContent: "center",
- maxWidth: "fit-content",
-};
-
-const imageStyle: React.CSSProperties = {
- width: "100%",
- height: "100%",
-};
-
-const containerStyle: React.CSSProperties = {
- padding: "0 48px",
- maxWidth: "792px",
- margin: "0 auto",
-};
-
-const textSectionStyle: React.CSSProperties = {
- marginTop: "40px",
- display: "flex",
- flexDirection: "column",
- alignItems: "center",
- justifyContent: "center",
-};
-
-const headingStyle: React.CSSProperties = {
- margin: "0 0 56px 0",
- textAlign: "center",
- fontSize: "24px",
- lineHeight: "28px",
- color: "#121212",
-};
-
-const highlightStyle: React.CSSProperties = {
- color: "#DC2626",
-};
-
-const greetingTextStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0 0 32px 0",
-};
-
-const descriptionTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
- margin: "0 0 16px 0",
-};
-
-const detailsSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const detailsHeadingStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0",
- marginBottom: "20px",
-};
-
-const listStyle: React.CSSProperties = {
- listStyle: "none",
- paddingLeft: "0",
- margin: "0",
-};
-
-const listItemStyle: React.CSSProperties = {
- display: "flex",
- alignItems: "start",
- fontSize: "14px",
- marginBottom: "1rem",
-};
-
-const iconContainerStyle: React.CSSProperties = {
- marginRight: "8px",
- flexShrink: "0",
-};
-
-const iconStyle: React.CSSProperties = {
- width: "24px",
- height: "24px",
-};
-
-const keyStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-const valueStyle: React.CSSProperties = {
- color: "#525252",
-};
-
-const infoSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const infoTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "left",
- marginBottom: "28px",
-};
-
-const buttonContainerStyle: React.CSSProperties = {
- width: "100%",
- textAlign: "center",
- marginTop: "32px",
-};
-
-const buttonStyle: React.CSSProperties = {
- borderRadius: "8px",
- backgroundColor: "#F97316",
- color: "#FAFAFA",
- padding: "16px",
- textAlign: "center",
- display: "inline-block",
- width: "fit-content",
- maxWidth: "300px", // Adjust max-width for larger screens
- textDecoration: "none",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "40px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-AccountDeactivation.PreviewProps = {
- username: "John Doe",
- link: "www.boilerplate.com",
- deactivationDaysLeft: "Two Days!",
- expireTime: "20th July, 2024 / 11:56pm",
- data: [
- {
- key: "Account Email",
- value: "johndoe@gmail.com",
- },
- {
- key: "Last Active",
- value: "17th June, 2024 / 11:56pm",
- },
- {
- key: "Deactivation Date",
- value: "20th July, 2024 / 11:56pm",
- },
- ],
-} satisfies AccountDeactivationProperties;
-
-export default AccountDeactivation;
diff --git a/src/email/templates/account-deactivation/no-image.tsx b/src/email/templates/account-deactivation/no-image.tsx
deleted file mode 100644
index e662dc29f..000000000
--- a/src/email/templates/account-deactivation/no-image.tsx
+++ /dev/null
@@ -1,253 +0,0 @@
-import {
- Button,
- Container,
- Heading,
- Img,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-import React from "react";
-
-import Layout from "../../layout/layout";
-
-interface AccountDeactivationProperties {
- username: string;
- link: string;
- deactivationDaysLeft: string;
- expireTime: string;
- data: Array<{
- key: string;
- value: string;
- }>;
-}
-
-const AccountDeactivation = ({
- username,
- link,
- deactivationDaysLeft,
- expireTime,
- data,
-}: AccountDeactivationProperties) => {
- return (
-
-
- {username}, account deactivation notice
-
-
-
- Account Deactivation Notice{" "}
- {deactivationDaysLeft}
-
-
-
- Hi {username},
-
- We noticed that you haven't logged into your Boilerplate
- account for quite some time. As part of our ongoing efforts to
- maintain a secure and efficient service, we will be deactivating
- inactive accounts.
-
-
-
-
-
- Your deactivation details:
-
-
-
-
-
-
-
- To keep your account active, simply log in before the deactivation
- date ({expireTime}). However, if you no longer wish to use your
- account, no further action is needed on your part.
-
-
-
-
-
- Activate My Account
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-};
-
-const sectionStyle: React.CSSProperties = {
- margin: " 0 0 56px",
-};
-
-const containerStyle: React.CSSProperties = {
- padding: "0 48px",
- maxWidth: "792px",
- margin: "0 auto",
-};
-
-const textSectionStyle: React.CSSProperties = {
- marginTop: "40px",
- display: "flex",
- flexDirection: "column",
- alignItems: "center",
- justifyContent: "center",
-};
-
-const headingStyle: React.CSSProperties = {
- margin: "0 0 56px 0",
- textAlign: "center",
- fontSize: "24px",
- lineHeight: "28px",
- color: "#121212",
-};
-
-const highlightStyle: React.CSSProperties = {
- color: "#DC2626",
-};
-
-const greetingTextStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0 0 32px 0",
-};
-
-const descriptionTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
- margin: "0 0 16px 0",
-};
-
-const detailsSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const detailsHeadingStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0",
- marginBottom: "20px",
-};
-
-const listStyle: React.CSSProperties = {
- listStyle: "none",
- paddingLeft: "0",
- margin: "0",
-};
-
-const listItemStyle: React.CSSProperties = {
- display: "flex",
- alignItems: "start",
- fontSize: "14px",
- marginBottom: "1rem",
-};
-
-const iconContainerStyle: React.CSSProperties = {
- marginRight: "8px",
- flexShrink: "0",
-};
-
-const iconStyle: React.CSSProperties = {
- width: "24px",
- height: "24px",
-};
-
-const keyStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-const valueStyle: React.CSSProperties = {
- color: "#525252",
-};
-
-const infoSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const infoTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "left",
- marginBottom: "28px",
-};
-
-const buttonContainerStyle: React.CSSProperties = {
- width: "100%",
- textAlign: "center",
- marginTop: "32px",
-};
-
-const buttonStyle: React.CSSProperties = {
- borderRadius: "8px",
- backgroundColor: "#F97316",
- color: "#FAFAFA",
- padding: "16px",
- textAlign: "center",
- display: "inline-block",
- width: "fit-content",
- maxWidth: "300px", // Adjust max-width for larger screens
- textDecoration: "none",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "40px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-AccountDeactivation.PreviewProps = {
- username: "John Doe",
- link: "www.boilerplate.com",
- deactivationDaysLeft: "Two Days!",
- expireTime: "20th July, 2024 / 11:56pm",
- data: [
- {
- key: "Account Email",
- value: "johndoe@gmail.com",
- },
- {
- key: "Last Active",
- value: "17th June, 2024 / 11:56pm",
- },
- {
- key: "Deactivation Date",
- value: "20th July, 2024 / 11:56pm",
- },
- ],
-} satisfies AccountDeactivationProperties;
-
-export default AccountDeactivation;
diff --git a/src/email/templates/account-link-expired/image.tsx b/src/email/templates/account-link-expired/image.tsx
deleted file mode 100644
index 09e4124ac..000000000
--- a/src/email/templates/account-link-expired/image.tsx
+++ /dev/null
@@ -1,156 +0,0 @@
-import {
- Container,
- Heading,
- Img,
- Link,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-
-import Layout from "../../layout/layout";
-
-interface AccountLinkExpiredProperties {
- username: string;
- link: string;
-}
-
-const AccountLinkExpired = ({
- username,
- link,
-}: AccountLinkExpiredProperties) => {
- return (
-
-
- {username}, your account link has expired
-
-
-
-
-
-
- Activation Link Expired
-
-
- Hi {username},
-
- We noticed that your account activation link has expired. For
- your security, activation links are only valid for a specific
- time period.
-
-
- Don’t worry, you can easily request a new activation link by
- clicking the button below:
-
-
-
-
- Send Another Active Link
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-};
-
-const containerStyle: React.CSSProperties = {
- padding: "0 48px",
- maxWidth: "792px",
- margin: "0 auto",
-};
-
-const sectionStyle: React.CSSProperties = {
- margin: "56px 0",
-};
-
-const imageContainerStyle: React.CSSProperties = {
- margin: "0 auto",
- display: "flex",
- alignItems: "center",
- justifyContent: "center",
- maxWidth: "fit-content",
-};
-
-const imageStyle: React.CSSProperties = {
- width: "100%",
- height: "100%",
-};
-
-const textSectionStyle: React.CSSProperties = {
- marginTop: "40px",
- display: "flex",
- flexDirection: "column",
- alignItems: "center",
- justifyContent: "center",
-};
-
-const headingStyle: React.CSSProperties = {
- margin: "0 0 56px 0",
- textAlign: "center",
- fontSize: "24px",
- lineHeight: "28px",
- color: "#121212",
-};
-
-const greetingTextStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0 0 32px 0",
-};
-
-const descriptionTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
- margin: "0 0 16px 0",
-};
-
-const buttonSectionStyle: React.CSSProperties = {
- textAlign: "center",
- marginTop: "32px",
-};
-
-const buttonStyle: React.CSSProperties = {
- display: "inline-block",
- width: "100%",
- maxWidth: "200px",
- padding: "16px",
- backgroundColor: "#F97316",
- color: "#FAFAFA",
- textAlign: "center",
- textDecoration: "none",
- borderRadius: "8px",
- fontSize: "16px",
- fontWeight: "600",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "40px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-AccountLinkExpired.PreviewProps = {
- username: "John Doe",
- link: "www.boilerplate.com",
-} satisfies AccountLinkExpiredProperties;
-
-export default AccountLinkExpired;
diff --git a/src/email/templates/account-link-expired/no-image.tsx b/src/email/templates/account-link-expired/no-image.tsx
deleted file mode 100644
index acc7eb648..000000000
--- a/src/email/templates/account-link-expired/no-image.tsx
+++ /dev/null
@@ -1,135 +0,0 @@
-import {
- Container,
- Heading,
- Link,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-
-import Layout from "../../layout/layout";
-
-interface AccountLinkExpiredProperties {
- username: string;
- link: string;
-}
-
-const AccountLinkExpired = ({
- username,
- link,
-}: AccountLinkExpiredProperties) => {
- return (
-
-
- {username}, your account link has expired
-
-
-
- Activation Link Expired
-
-
- Hi {username},
-
- We noticed that your account activation link has expired. For
- your security, activation links are only valid for a specific
- time period.
-
-
- Don’t worry, you can easily request a new activation link by
- clicking the button below:
-
-
-
-
- Send Another Active Link
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-};
-
-const containerStyle: React.CSSProperties = {
- padding: "0 48px",
- maxWidth: "792px",
- margin: "0 auto",
-};
-
-const sectionStyle: React.CSSProperties = {
- margin: "0 0 56px",
-};
-
-const textSectionStyle: React.CSSProperties = {
- marginTop: "40px",
- display: "flex",
- flexDirection: "column",
- alignItems: "center",
- justifyContent: "center",
-};
-
-const headingStyle: React.CSSProperties = {
- margin: "0 0 56px 0",
- textAlign: "center",
- fontSize: "24px",
- lineHeight: "28px",
- color: "#121212",
-};
-
-const greetingTextStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0 0 32px 0",
-};
-
-const descriptionTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
- margin: "0 0 16px 0",
-};
-
-const buttonSectionStyle: React.CSSProperties = {
- textAlign: "center",
- marginTop: "32px",
-};
-
-const buttonStyle: React.CSSProperties = {
- display: "inline-block",
- width: "100%",
- maxWidth: "200px",
- padding: "16px",
- backgroundColor: "#F97316",
- color: "#FAFAFA",
- textAlign: "center",
- textDecoration: "none",
- borderRadius: "8px",
- fontSize: "16px",
- fontWeight: "600",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "40px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-AccountLinkExpired.PreviewProps = {
- username: "John Doe",
- link: "www.boilerplate.com",
-} satisfies AccountLinkExpiredProperties;
-
-export default AccountLinkExpired;
diff --git a/src/email/templates/activation-link-sent/image.tsx b/src/email/templates/activation-link-sent/image.tsx
deleted file mode 100644
index 2e38b30cc..000000000
--- a/src/email/templates/activation-link-sent/image.tsx
+++ /dev/null
@@ -1,150 +0,0 @@
-import {
- Button,
- Container,
- Heading,
- Img,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-
-import Layout from "../../layout/layout";
-
-interface ActivationLinkSentProperties {
- username: string;
- link: string;
-}
-
-const ActivationLinkSent = ({
- username,
- link,
-}: ActivationLinkSentProperties) => {
- return (
-
- {username}, account link sent.
-
-
-
-
-
-
-
-
- New Activation Link Sent
-
-
-
- Hi {username},
-
- We have sent you a new activation link for your Boilerplate
- account. Please click the button below to activate your account:
-
-
-
-
-
-
- Activate My Account
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-};
-
-const containerStyle: React.CSSProperties = {
- padding: "0 48px",
- maxWidth: "792px",
- margin: "0 auto",
-};
-
-const sectionStyle: React.CSSProperties = {
- margin: "56px 0",
-};
-
-const imageContainerStyle: React.CSSProperties = {
- margin: "0 auto",
- display: "flex",
- alignItems: "center",
- justifyContent: "center",
- maxWidth: "fit-content",
-};
-
-const imageStyle: React.CSSProperties = {
- width: "100%",
- height: "auto",
-};
-
-const textSectionStyle: React.CSSProperties = {
- marginTop: "56px",
- display: "flex",
- flexDirection: "column",
- alignItems: "center",
- justifyContent: "center",
-};
-
-const headingStyle: React.CSSProperties = {
- margin: "0 0 56px 0",
- textAlign: "center",
- fontSize: "24px",
- lineHeight: "28px",
- color: "#121212",
-};
-
-const greetingTextStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0 0 32px 0",
-};
-
-const descriptionTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
- margin: "0 0 16px 0",
-};
-
-const buttonContainerStyle: React.CSSProperties = {
- width: "100%",
- textAlign: "center",
- marginTop: "28px",
-};
-
-const buttonStyle: React.CSSProperties = {
- borderRadius: "8px",
- backgroundColor: "#F97316",
- color: "#FAFAFA",
- padding: "16px",
- textAlign: "center",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-ActivationLinkSent.PreviewProps = {
- username: "John Doe",
- link: "www.boilerplate.com",
-} satisfies ActivationLinkSentProperties;
-
-export default ActivationLinkSent;
diff --git a/src/email/templates/activation-link-sent/no-image.tsx b/src/email/templates/activation-link-sent/no-image.tsx
deleted file mode 100644
index f3dc2d423..000000000
--- a/src/email/templates/activation-link-sent/no-image.tsx
+++ /dev/null
@@ -1,128 +0,0 @@
-import {
- Button,
- Container,
- Heading,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-
-import Layout from "../../layout/layout";
-
-interface ActivationLinkSentProperties {
- username: string;
- link: string;
-}
-
-const ActivationLinkSent = ({
- username,
- link,
-}: ActivationLinkSentProperties) => {
- return (
-
- {username}, account link sent.
-
-
-
-
- New Activation Link Sent
-
-
-
- Hi {username},
-
- We have sent you a new activation link for your Boilerplate
- account. Please click the button below to activate your account:
-
-
-
-
-
-
- Activate My Account
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-};
-
-const containerStyle: React.CSSProperties = {
- padding: "0 48px",
- maxWidth: "792px",
- margin: "0 auto",
-};
-
-const sectionStyle: React.CSSProperties = {
- margin: "0 0 56px",
-};
-
-const textSectionStyle: React.CSSProperties = {
- marginTop: "56px",
- display: "flex",
- flexDirection: "column",
- alignItems: "center",
- justifyContent: "center",
-};
-
-const headingStyle: React.CSSProperties = {
- margin: "0 0 56px 0",
- textAlign: "center",
- fontSize: "24px",
- lineHeight: "28px",
- color: "#121212",
-};
-
-const greetingTextStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0 0 32px 0",
-};
-
-const descriptionTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
- margin: "0 0 16px 0",
-};
-
-const buttonContainerStyle: React.CSSProperties = {
- width: "100%",
- textAlign: "center",
- marginTop: "28px",
-};
-
-const buttonStyle: React.CSSProperties = {
- borderRadius: "8px",
- backgroundColor: "#F97316",
- color: "#FAFAFA",
- padding: "16px",
- textAlign: "center",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-ActivationLinkSent.PreviewProps = {
- username: "John Doe",
- link: "www.boilerplate.com",
-} satisfies ActivationLinkSentProperties;
-
-export default ActivationLinkSent;
diff --git a/src/email/templates/email-confirmation/image.tsx b/src/email/templates/email-confirmation/image.tsx
deleted file mode 100644
index 5f49a548a..000000000
--- a/src/email/templates/email-confirmation/image.tsx
+++ /dev/null
@@ -1,152 +0,0 @@
-import {
- Button,
- Container,
- Heading,
- Img,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-
-import Layout from "../../layout/layout";
-
-interface EmailConfirmationProperties {
- username: string;
- link: string;
-}
-
-const EmailConfirmation = ({ username, link }: EmailConfirmationProperties) => {
- return (
-
- {username}, email confirmed
-
-
-
-
-
-
-
-
- Email Confirmation
-
-
-
- Hi {username},
-
- We are thrilled to inform you that your email has been
- successfully verified and confirmed!
-
-
- You can now fully enjoy all the features and benefits we offer,
- including exclusive access to key features, special discounts,
- and personalized content.
-
-
-
-
-
-
- Proceed to Account
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-};
-
-const containerStyle: React.CSSProperties = {
- padding: "0 48px",
- maxWidth: "792px",
- margin: "0 auto",
-};
-
-const sectionStyle: React.CSSProperties = {
- margin: "56px 0",
-};
-
-const imageContainerStyle: React.CSSProperties = {
- margin: "0 auto",
- display: "flex",
- alignItems: "center",
- justifyContent: "center",
- maxWidth: "fit-content",
-};
-
-const imageStyle: React.CSSProperties = {
- width: "100%",
- height: "auto",
-};
-
-const textSectionStyle: React.CSSProperties = {
- marginTop: "56px",
- display: "flex",
- flexDirection: "column",
- alignItems: "center",
- justifyContent: "center",
-};
-
-const headingStyle: React.CSSProperties = {
- margin: "0 0 56px 0",
- textAlign: "center",
- fontSize: "24px",
- lineHeight: "28px",
- color: "#121212",
-};
-
-const greetingTextStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0 0 32px 0",
-};
-
-const descriptionTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
- margin: "0 0 16px 0",
-};
-
-const buttonContainerStyle: React.CSSProperties = {
- width: "100%",
- textAlign: "center",
- marginTop: "28px",
-};
-
-const buttonStyle: React.CSSProperties = {
- borderRadius: "8px",
- backgroundColor: "#F97316",
- color: "#FAFAFA",
- padding: "16px",
- textAlign: "center",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-EmailConfirmation.PreviewProps = {
- username: "John Doe",
- link: "www.boilerplate.com",
-} satisfies EmailConfirmationProperties;
-
-export default EmailConfirmation;
diff --git a/src/email/templates/email-confirmation/no-image.tsx b/src/email/templates/email-confirmation/no-image.tsx
deleted file mode 100644
index 782901f3d..000000000
--- a/src/email/templates/email-confirmation/no-image.tsx
+++ /dev/null
@@ -1,130 +0,0 @@
-import {
- Button,
- Container,
- Heading,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-
-import Layout from "../../layout/layout";
-
-interface EmailConfirmationProperties {
- username: string;
- link: string;
-}
-
-const EmailConfirmation = ({ username, link }: EmailConfirmationProperties) => {
- return (
-
- {username}, email confirmed
-
-
-
-
- Email Confirmation
-
-
-
- Hi {username},
-
- We are thrilled to inform you that your email has been
- successfully verified and confirmed!
-
-
- You can now fully enjoy all the features and benefits we offer,
- including exclusive access to key features, special discounts,
- and personalized content.
-
-
-
-
-
-
- Proceed to Account
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-};
-
-const containerStyle: React.CSSProperties = {
- padding: "0 48px",
- maxWidth: "792px",
- margin: "0 auto",
-};
-
-const sectionStyle: React.CSSProperties = {
- margin: " 0 0 56px",
-};
-
-const textSectionStyle: React.CSSProperties = {
- marginTop: "56px",
- display: "flex",
- flexDirection: "column",
- alignItems: "center",
- justifyContent: "center",
-};
-
-const headingStyle: React.CSSProperties = {
- margin: "0 0 56px 0",
- textAlign: "center",
- fontSize: "24px",
- lineHeight: "28px",
- color: "#121212",
-};
-
-const greetingTextStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0 0 32px 0",
-};
-
-const descriptionTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
- margin: "0 0 16px 0",
-};
-
-const buttonContainerStyle: React.CSSProperties = {
- width: "100%",
- textAlign: "center",
- marginTop: "28px",
-};
-
-const buttonStyle: React.CSSProperties = {
- borderRadius: "8px",
- backgroundColor: "#F97316",
- color: "#FAFAFA",
- padding: "16px",
- textAlign: "center",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-EmailConfirmation.PreviewProps = {
- username: "John Doe",
- link: "www.boilerplate.com",
-} satisfies EmailConfirmationProperties;
-
-export default EmailConfirmation;
diff --git a/src/email/templates/email-verification/image.tsx b/src/email/templates/email-verification/image.tsx
deleted file mode 100644
index ee9fe1b6e..000000000
--- a/src/email/templates/email-verification/image.tsx
+++ /dev/null
@@ -1,181 +0,0 @@
-import {
- Button,
- Container,
- Heading,
- Img,
- Link,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-
-import Layout from "../../layout/layout";
-
-interface EmailVerificationProperties {
- username: string;
- link: string;
-}
-
-export const EmailVerification = ({
- username,
- link,
-}: EmailVerificationProperties) => {
- return (
-
- {username}, email verified
-
-
-
-
-
-
-
-
- Email Verification
-
-
-
- Hi {username},
-
- Thanks for registering your account with us at Boilerplate.
- Before we get started, we just need to confirm that this is you.
-
-
- This link will expire 30 minutes after this email has been sent.
- If you did not make this request, you can ignore this email.
-
-
-
-
-
-
-
-
- Or copy this link:
-
- {link}
-
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-};
-
-const containerStyle: React.CSSProperties = {
- padding: "0 48px",
- maxWidth: "792px",
- margin: "0 auto",
-};
-
-const sectionStyle: React.CSSProperties = {
- margin: "56px 0",
-};
-
-const imageContainerStyle: React.CSSProperties = {
- margin: "0 auto",
- display: "flex",
- alignItems: "center",
- justifyContent: "center",
- maxWidth: "fit-content",
-};
-
-const imageStyle: React.CSSProperties = {
- width: "100%",
- height: "auto",
-};
-
-const textSectionStyle: React.CSSProperties = {
- marginTop: "56px",
- display: "flex",
- flexDirection: "column",
- alignItems: "center",
- justifyContent: "center",
-};
-
-const headingStyle: React.CSSProperties = {
- margin: "0 0 56px 0",
- textAlign: "center",
- fontSize: "24px",
- lineHeight: "28px",
- color: "#121212",
-};
-
-const greetingTextStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0 0 32px 0",
-};
-
-const descriptionTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
- margin: "0 0 16px 0",
-};
-
-const buttonContainerStyle: React.CSSProperties = {
- width: "100%",
- textAlign: "center",
- marginTop: "28px",
-};
-
-const buttonStyle: React.CSSProperties = {
- borderRadius: "8px",
- backgroundColor: "#F97316",
- color: "#FAFAFA",
- padding: "16px",
- textAlign: "center",
-};
-
-const linkContainerStyle: React.CSSProperties = {
- marginTop: "40px",
- textAlign: "left",
-};
-
-const copyLinkTextStyle: React.CSSProperties = {
- fontSize: "1rem",
- lineHeight: "1.5rem",
- color: "#525252",
-};
-
-const linkStyle: React.CSSProperties = {
- color: "#F97316",
- textDecoration: "underline",
- wordBreak: "break-all",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-EmailVerification.PreviewProps = {
- username: "John Doe",
- link: "www.boilerplate.com",
-} satisfies EmailVerificationProperties;
-
-export default EmailVerification;
diff --git a/src/email/templates/email-verification/no-image.tsx b/src/email/templates/email-verification/no-image.tsx
deleted file mode 100644
index 0438d56fb..000000000
--- a/src/email/templates/email-verification/no-image.tsx
+++ /dev/null
@@ -1,159 +0,0 @@
-import {
- Button,
- Container,
- Heading,
- Link,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-
-import Layout from "../../layout/layout";
-
-interface EmailVerificationProperties {
- username: string;
- link: string;
-}
-
-export const EmailVerification = ({
- username,
- link,
-}: EmailVerificationProperties) => {
- return (
-
- {username}, email verified
-
-
-
-
- Email Verification
-
-
-
- Hi {username},
-
- Thanks for registering your account with us at Boilerplate.
- Before we get started, we just need to confirm that this is you.
-
-
- This link will expire 30 minutes after this email has been sent.
- If you did not make this request, you can ignore this email.
-
-
-
-
-
-
-
-
- Or copy this link:
-
- {link}
-
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-};
-
-const containerStyle: React.CSSProperties = {
- padding: "0 48px",
- maxWidth: "792px",
- margin: "0 auto",
-};
-
-const sectionStyle: React.CSSProperties = {
- marginBottom: "56px",
-};
-
-const textSectionStyle: React.CSSProperties = {
- marginTop: "56px",
- display: "flex",
- flexDirection: "column",
- alignItems: "center",
- justifyContent: "center",
-};
-
-const headingStyle: React.CSSProperties = {
- margin: "0 0 56px 0",
- textAlign: "center",
- fontSize: "24px",
- lineHeight: "28px",
- color: "#121212",
-};
-
-const greetingTextStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0 0 32px 0",
-};
-
-const descriptionTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
- margin: "0 0 16px 0",
-};
-
-const buttonContainerStyle: React.CSSProperties = {
- width: "100%",
- textAlign: "center",
- marginTop: "28px",
-};
-
-const buttonStyle: React.CSSProperties = {
- borderRadius: "8px",
- backgroundColor: "#F97316",
- color: "#FAFAFA",
- padding: "16px",
- textAlign: "center",
-};
-
-const linkContainerStyle: React.CSSProperties = {
- marginTop: "40px",
- textAlign: "left",
-};
-
-const copyLinkTextStyle: React.CSSProperties = {
- fontSize: "1rem",
- lineHeight: "1.5rem",
- color: "#525252",
-};
-
-const linkStyle: React.CSSProperties = {
- color: "#F97316",
- textDecoration: "underline",
- wordBreak: "break-all",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-EmailVerification.PreviewProps = {
- username: "John Doe",
- link: "www.boilerplate.com",
-} satisfies EmailVerificationProperties;
-
-export default EmailVerification;
diff --git a/src/email/templates/invoice/image.tsx b/src/email/templates/invoice/image.tsx
deleted file mode 100644
index 3c8324acb..000000000
--- a/src/email/templates/invoice/image.tsx
+++ /dev/null
@@ -1,275 +0,0 @@
-import {
- Button,
- Container,
- Heading,
- Img,
- Link,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-
-import { Separator } from "~/components/ui/separator";
-import {
- ITemplateTableProperties,
- TemplateTable,
-} from "../_components/template-table/TemplateTable";
-import Layout from "../../layout/layout";
-
-interface InvoiceTemplateProperties {
- username: string;
- link: string;
- tableData: ITemplateTableProperties;
- tableDataTwo: ITemplateTableProperties;
- tableDataThree: ITemplateTableProperties;
-}
-
-export const InvoiceTemplate = ({
- username,
- link,
- tableData,
- tableDataTwo,
- tableDataThree,
-}: InvoiceTemplateProperties) => {
- return (
-
- {username}, your invoice receipt.
-
-
-
-
-
-
-
-
- Invoice
-
-
-
- Hi {username},
-
- We hope you are doing well. Thank you for your recent purchase
- from Boilerplate. Please find your invoice attached to this
- email.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Or copy this link:
-
- {link}
-
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-};
-
-const containerStyle: React.CSSProperties = {
- padding: "0 48px",
- maxWidth: "792px",
- margin: "0 auto",
-};
-
-const sectionStyle: React.CSSProperties = {
- margin: "56px 0",
-};
-
-const imageContainerStyle: React.CSSProperties = {
- margin: "0 auto",
- display: "flex",
- alignItems: "center",
- justifyContent: "center",
- maxWidth: "fit-content",
-};
-
-const imageStyle: React.CSSProperties = {
- width: "100%",
- height: "auto",
-};
-
-const textSectionStyle: React.CSSProperties = {
- marginTop: "56px",
- display: "flex",
- flexDirection: "column",
- alignItems: "center",
- justifyContent: "center",
-};
-
-const headingStyle: React.CSSProperties = {
- margin: "0 0 56px 0",
- textAlign: "center",
- fontSize: "24px",
- lineHeight: "28px",
- color: "#121212",
-};
-
-const greetingTextStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0 0 32px 0",
-};
-
-const descriptionTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
- margin: "0 0 16px 0",
-};
-
-const tableContainerStyle: React.CSSProperties = {
- margin: "28px 0",
-};
-
-const buttonContainerStyle: React.CSSProperties = {
- width: "100%",
- textAlign: "center",
- marginTop: "28px",
-};
-
-const buttonStyle: React.CSSProperties = {
- borderRadius: "8px",
- backgroundColor: "#F97316",
- color: "#FAFAFA",
- padding: "16px",
- textAlign: "center",
- width: "150px",
-};
-
-const linkContainerStyle: React.CSSProperties = {
- marginTop: "40px",
- textAlign: "left",
-};
-
-const copyLinkTextStyle: React.CSSProperties = {
- fontSize: "1rem",
- lineHeight: "1.5rem",
- color: "#525252",
-};
-
-const linkStyle: React.CSSProperties = {
- color: "#F97316",
- textDecoration: "underline",
- wordBreak: "break-all",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-InvoiceTemplate.PreviewProps = {
- username: "John Doe",
- link: "www.boilerplate.com",
- tableData: {
- title: "Invoice Details",
- data: [
- {
- key: "Invoice Number",
- values: ["#EJ78465"],
- },
- {
- key: "Date of Issue",
- values: ["July 17, 2024"],
- },
- {
- key: "Due Date",
- values: ["July 19, 2024"],
- },
- ],
- },
- tableDataTwo: {
- title: "Order Summary",
- data: [
- {
- key: "Item",
- values: ["5", "$200"],
- },
- {
- key: "Item",
- values: ["3", "$120"],
- },
- {
- key: "VAT",
- values: ["10%", "$32"],
- },
- {
- key: "Total",
- values: ["100%", "$352"],
- },
- ],
- },
- tableDataThree: {
- title: "Payment Details",
- data: [
- {
- key: "Amount",
- values: ["$352"],
- },
- {
- key: "Payment Method",
- values: ["Bank"],
- },
- {
- key: "Bank Name",
- values: ["Guaranty Trust Bank"],
- },
- {
- key: "Account Number",
- values: ["0115917164"],
- },
- {
- key: "Account Name",
- values: ["Kingsley Solomon Ifijeh"],
- },
- ],
- },
-} satisfies InvoiceTemplateProperties;
-
-export default InvoiceTemplate;
diff --git a/src/email/templates/invoice/no-image.tsx b/src/email/templates/invoice/no-image.tsx
deleted file mode 100644
index b13468ecd..000000000
--- a/src/email/templates/invoice/no-image.tsx
+++ /dev/null
@@ -1,251 +0,0 @@
-import {
- Button,
- Container,
- Heading,
- Link,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-
-import {
- ITemplateTableProperties,
- TemplateTable,
-} from "../_components/template-table/TemplateTable";
-import Layout from "../../layout/layout";
-
-interface InvoiceTemplateProperties {
- username: string;
- link: string;
- tableData: ITemplateTableProperties;
- tableDataTwo: ITemplateTableProperties;
- tableDataThree: ITemplateTableProperties;
-}
-
-export const InvoiceTemplate = ({
- username,
- link,
- tableData,
- tableDataTwo,
- tableDataThree,
-}: InvoiceTemplateProperties) => {
- return (
-
- {username}, your invoice receipt.
-
-
-
-
- Invoice
-
-
-
- Hi {username},
-
- We hope you are doing well. Thank you for your recent purchase
- from Boilerplate. Please find your invoice attached to this
- email.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Or copy this link:
-
- {link}
-
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-};
-
-const containerStyle: React.CSSProperties = {
- padding: "0 48px",
- maxWidth: "792px",
- margin: "0 auto",
-};
-
-const sectionStyle: React.CSSProperties = {
- margin: "0 0 56px",
-};
-
-const textSectionStyle: React.CSSProperties = {
- marginTop: "56px",
- display: "flex",
- flexDirection: "column",
- alignItems: "center",
- justifyContent: "center",
-};
-
-const headingStyle: React.CSSProperties = {
- margin: "0 0 56px 0",
- textAlign: "center",
- fontSize: "24px",
- lineHeight: "28px",
- color: "#121212",
-};
-
-const greetingTextStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0 0 32px 0",
-};
-
-const descriptionTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
- margin: "0 0 16px 0",
-};
-
-const tableContainerStyle: React.CSSProperties = {
- margin: "28px 0",
-};
-
-const buttonContainerStyle: React.CSSProperties = {
- width: "100%",
- textAlign: "center",
- marginTop: "28px",
-};
-
-const buttonStyle: React.CSSProperties = {
- borderRadius: "8px",
- backgroundColor: "#F97316",
- color: "#FAFAFA",
- padding: "16px",
- textAlign: "center",
-};
-
-const linkContainerStyle: React.CSSProperties = {
- marginTop: "40px",
- textAlign: "left",
-};
-
-const copyLinkTextStyle: React.CSSProperties = {
- fontSize: "1rem",
- lineHeight: "1.5rem",
- color: "#525252",
-};
-
-const linkStyle: React.CSSProperties = {
- color: "#F97316",
- textDecoration: "underline",
- wordBreak: "break-all",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-InvoiceTemplate.PreviewProps = {
- username: "John Doe",
- link: "www.boilerplate.com",
- tableData: {
- title: "Invoice Details",
- data: [
- {
- key: "Invoice Number",
- values: ["#EJ78465"],
- },
- {
- key: "Date of Issue",
- values: ["July 17, 2024"],
- },
- {
- key: "Due Date",
- values: ["July 19, 2024"],
- },
- ],
- },
- tableDataTwo: {
- title: "Order Summary",
- data: [
- {
- key: "Item",
- values: ["5", "$200"],
- },
- {
- key: "Item",
- values: ["3", "$120"],
- },
- {
- key: "VAT",
- values: ["10%", "$32"],
- },
- {
- key: "Total",
- values: ["100%", "$352"],
- },
- ],
- },
- tableDataThree: {
- title: "Payment Details",
- data: [
- {
- key: "Amount",
- values: ["$352"],
- },
- {
- key: "Payment Method",
- values: ["Bank"],
- },
- {
- key: "Bank Name",
- values: ["Guaranty Trust Bank"],
- },
- {
- key: "Account Number",
- values: ["0115917164"],
- },
- {
- key: "Account Name",
- values: ["Kingsley Solomon Ifijeh"],
- },
- ],
- },
-} satisfies InvoiceTemplateProperties;
-
-export default InvoiceTemplate;
diff --git a/src/email/templates/new-feature-anouncement/image.tsx b/src/email/templates/new-feature-anouncement/image.tsx
deleted file mode 100644
index bf05952bd..000000000
--- a/src/email/templates/new-feature-anouncement/image.tsx
+++ /dev/null
@@ -1,252 +0,0 @@
-import {
- Button,
- Container,
- Heading,
- Img,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-
-import Layout from "../../layout/layout";
-
-interface NewFeatureAnnouncementProperties {
- username: string;
- link: string;
-}
-
-export const NewFeatureAnnouncement = ({
- username,
- link,
-}: NewFeatureAnnouncementProperties) => {
- return (
-
- {username}, our latest features.
-
-
-
-
-
-
-
-
- Introducing Our Latest Feature: Boilerplate Pro
-
-
-
- Hi {username},
-
- We're thrilled to announce the launch of our newest
- feature: Boilerplate Pro. Boilerplate Pro is designed to help
- you create shared spaces for collaboration. Invite team members,
- share files, and work together seamlessly. From project planning
- to brainstorming sessions, collaborative spaces foster
- productivity.
-
-
- Whether you’re a seasoned user or just getting started, this
- enhancement will transform your experience.
-
-
-
-
-
- Benefits of Boilerplate Pro:
-
-
-
-
-
- Efficient Team Collaboration: Collaborative
- Spaces allow you to create dedicated areas for teamwork.
- Whether it’s a project, brainstorming session, or ongoing
- discussion, team members can collaborate seamlessly within
- these spaces.
-
-
-
-
-
- Improved Accountability: With Collaborative
- Spaces, accountability becomes clearer. Each team member’s
- contributions are visible within the shared space.
-
-
-
-
-
-
-
-
- Boilerplate Pro is now live!
-
-
- You can start using it immediately. Click the button below to dive
- into our comprehensive guide.
-
-
-
-
-
- Want to explore all the details? Click the button below to dive
- into our comprehensive guide
-
-
- Learn More
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-};
-
-const containerStyle: React.CSSProperties = {
- padding: "0 48px",
- maxWidth: "792px",
- margin: "0 auto",
-};
-
-const sectionStyle: React.CSSProperties = {
- margin: "56px 0",
-};
-
-const imageContainerStyle: React.CSSProperties = {
- margin: "0 auto",
- display: "flex",
- alignItems: "center",
- justifyContent: "center",
- maxWidth: "fit-content",
-};
-
-const imageStyle: React.CSSProperties = {
- width: "178px",
- height: "178px",
-};
-
-const textSectionStyle: React.CSSProperties = {
- margin: "40px 0",
- display: "flex",
- flexDirection: "column",
- alignItems: "center",
- justifyContent: "center",
-};
-
-const headingStyle: React.CSSProperties = {
- margin: "0 0 56px 0",
- textAlign: "center",
- fontSize: "24px",
- lineHeight: "28px",
- color: "#121212",
-};
-
-const greetingTextStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0 0 32px 0",
-};
-
-const descriptionTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
- margin: "0 0 16px 0",
-};
-
-const subHeadingStyle: React.CSSProperties = {
- margin: "16px 0",
- fontSize: "16px",
- color: "#121212",
-};
-
-const listStyle: React.CSSProperties = {
- listStyleType: "none",
- padding: 0,
-};
-
-const listItemStyle: React.CSSProperties = {
- display: "flex",
- alignItems: "flex-start",
- marginTop: "20px",
- fontSize: "14px",
- color: "#525252",
-};
-
-const iconStyle: React.CSSProperties = {
- width: "24px",
- height: "24px",
- marginRight: "8px",
-};
-
-const benefitTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#121212",
-};
-
-const ctaSectionStyle: React.CSSProperties = {
- backgroundColor: "#F97316",
- color: "#FAFAFA",
- textAlign: "center",
- padding: "39px",
- marginTop: "40px",
-};
-
-const ctaHeadingStyle: React.CSSProperties = {
- fontSize: "24px",
- margin: "0 0 16px 0",
-};
-
-const ctaTextStyle: React.CSSProperties = {
- fontSize: "16px",
- margin: "0 0 28px 0",
-};
-
-const buttonContainerStyle: React.CSSProperties = {
- textAlign: "center",
-};
-
-const buttonStyle: React.CSSProperties = {
- borderRadius: "8px",
- backgroundColor: "#F97316",
- color: "#FAFAFA",
- padding: "16px 32px",
- textAlign: "center",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "40px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-NewFeatureAnnouncement.PreviewProps = {
- username: "John Doe",
- link: "www.boilerplate.com",
-} satisfies NewFeatureAnnouncementProperties;
-
-export default NewFeatureAnnouncement;
diff --git a/src/email/templates/new-feature-anouncement/no-image.tsx b/src/email/templates/new-feature-anouncement/no-image.tsx
deleted file mode 100644
index 53b225772..000000000
--- a/src/email/templates/new-feature-anouncement/no-image.tsx
+++ /dev/null
@@ -1,231 +0,0 @@
-import {
- Button,
- Container,
- Heading,
- Img,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-
-import Layout from "../../layout/layout";
-
-interface NewFeatureAnnouncementProperties {
- username: string;
- link: string;
-}
-
-export const NewFeatureAnnouncement = ({
- username,
- link,
-}: NewFeatureAnnouncementProperties) => {
- return (
-
- {username}, our latest features.
-
-
-
-
- Introducing Our Latest Feature: Boilerplate Pro
-
-
-
- Hi {username},
-
- We're thrilled to announce the launch of our newest
- feature: Boilerplate Pro. Boilerplate Pro is designed to help
- you create shared spaces for collaboration. Invite team members,
- share files, and work together seamlessly. From project planning
- to brainstorming sessions, collaborative spaces foster
- productivity.
-
-
- Whether you’re a seasoned user or just getting started, this
- enhancement will transform your experience.
-
-
-
-
-
- Benefits of Boilerplate Pro:
-
-
-
-
-
- Efficient Team Collaboration: Collaborative
- Spaces allow you to create dedicated areas for teamwork.
- Whether it’s a project, brainstorming session, or ongoing
- discussion, team members can collaborate seamlessly within
- these spaces.
-
-
-
-
-
- Improved Accountability: With Collaborative
- Spaces, accountability becomes clearer. Each team member’s
- contributions are visible within the shared space.
-
-
-
-
-
-
-
-
- Boilerplate Pro is now live!
-
-
- You can start using it immediately. Click the button below to dive
- into our comprehensive guide.
-
-
-
-
-
- Want to explore all the details? Click the button below to dive
- into our comprehensive guide
-
-
- Learn More
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-};
-
-const containerStyle: React.CSSProperties = {
- padding: "0 48px",
- maxWidth: "792px",
- margin: "0 auto",
-};
-
-const sectionStyle: React.CSSProperties = {
- margin: "0 0 56px",
-};
-
-const textSectionStyle: React.CSSProperties = {
- margin: "40px 0",
- display: "flex",
- flexDirection: "column",
- alignItems: "center",
- justifyContent: "center",
-};
-
-const headingStyle: React.CSSProperties = {
- margin: "0 0 56px 0",
- textAlign: "center",
- fontSize: "24px",
- lineHeight: "28px",
- color: "#121212",
-};
-
-const greetingTextStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0 0 32px 0",
-};
-
-const descriptionTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
- margin: "0 0 16px 0",
-};
-
-const subHeadingStyle: React.CSSProperties = {
- margin: "16px 0",
- fontSize: "16px",
- color: "#121212",
-};
-
-const listStyle: React.CSSProperties = {
- listStyleType: "none",
- padding: 0,
-};
-
-const listItemStyle: React.CSSProperties = {
- display: "flex",
- alignItems: "flex-start",
- marginTop: "20px",
- fontSize: "14px",
- color: "#525252",
-};
-
-const iconStyle: React.CSSProperties = {
- width: "24px",
- height: "24px",
- marginRight: "8px",
-};
-
-const benefitTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#121212",
-};
-
-const ctaSectionStyle: React.CSSProperties = {
- backgroundColor: "#F97316",
- color: "#FAFAFA",
- textAlign: "center",
- padding: "39px",
- marginTop: "40px",
-};
-
-const ctaHeadingStyle: React.CSSProperties = {
- fontSize: "24px",
- margin: "0 0 16px 0",
-};
-
-const ctaTextStyle: React.CSSProperties = {
- fontSize: "16px",
- margin: "0 0 28px 0",
-};
-
-const buttonContainerStyle: React.CSSProperties = {
- textAlign: "center",
-};
-
-const buttonStyle: React.CSSProperties = {
- borderRadius: "8px",
- backgroundColor: "#F97316",
- color: "#FAFAFA",
- padding: "16px 32px",
- textAlign: "center",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "40px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-NewFeatureAnnouncement.PreviewProps = {
- username: "John Doe",
- link: "www.boilerplate.com",
-} satisfies NewFeatureAnnouncementProperties;
-
-export default NewFeatureAnnouncement;
diff --git a/src/email/templates/newsletter/images.tsx b/src/email/templates/newsletter/images.tsx
deleted file mode 100644
index a5add52cb..000000000
--- a/src/email/templates/newsletter/images.tsx
+++ /dev/null
@@ -1,282 +0,0 @@
-import {
- Button,
- Container,
- Heading,
- Img,
- Link,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-
-import Layout from "../../layout/layout";
-
-interface IProperties {
- mainHeading: string;
- image: string;
- imageOne: string;
- description: string;
- username: string;
- offer: string;
- link: string;
- star: string;
- storeData: Array<{
- key: string;
- value: string;
- }>;
- boilerData: Array<{
- key: string;
- value: string;
- }>;
-}
-
-export default function Newsletter(properties: IProperties) {
- const {
- link,
- star,
- storeData,
- boilerData,
- image,
- imageOne,
- username,
- mainHeading,
- description,
- } = properties;
-
- return (
-
- t{username}, our Newletter.
-
-
-
-
-
-
-
-
-
-
-
- Hi {username},
-
-
- {description}
-
-
-
-
-
- What’s in Store
-
-
-
-
-
- Exclusive Savings
-
-
- For a limited time, enjoy 25% off your purchase of any of these
- groundbreaking products. Simply use the code TECHSAVVY at
- checkout to unlock your savings.
-
-
-
-
- Why Choose Boilerplate?
-
-
-
-
- Follow{" "}
-
- our Blog
- {" "}
- for more information.
-
-
-
- How To Redeem Your Offer
-
-
-
-
-
-
- Recover your account here:{" "}
-
- www.boilerplate.com
-
-
-
- Browse our selection of cutting-edge tech.
-
- Add your desired products to the cart.
-
- Enter the code TECHSAVVY at checkout to apply your discount.
- Don’t miss out on this opportunity to upgrade your tech and
- stay ahead of the game. This exclusive offer is valid until
- 30th July, so act fast!
-
-
-
-
- Thank you for being a valued customer. We look forward to helping
- you enhance your tech experience. Should you have any questions or
- concerns during this process, do not hesitate to reach out to us
- via email at{" "}
-
- support@boilerplate.com
-
-
-
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-}
-
-Newsletter.PreviewProps = {
- offer:
- "Enjoy special promotions and discounts available only to our members.",
- link: "www.boilerData.com",
- image: "https://imgur.com/qZADxEg.png",
- imageOne: " https://imgur.com/ViexxCL.png",
- username: "John Doe",
- mainHeading: "Stay Ahead: Exclusive Offer on Cutting-Edge Tech!",
- star: "https://i.imgur.com/bmprMwh.png",
- description:
- "We're excited to bring you an exclusive offer that will keep you ahead of the curve! At Boilerplate, we pride ourselves on providing the latest and greatest in technology, and this time, we have something truly special for you.",
-
- storeData: [
- {
- key: "The Ultimate Smartwatch",
- value:
- "Experience the future with this state-of-the-art device, designed to enhance your daily life.",
- },
- {
- key: "The High-Performance Laptop",
- value:
- "A perfect blend of innovation and performance, ideal for both work and play.",
- },
- {
- key: "The Wireless Noise-Cancelling Headphones",
- value:
- "Sleek, powerful, and user-friendly, this product is a must-have for any tech enthusiast.",
- },
- ],
- boilerData: [
- {
- key: "Cutting-Edge Technology",
- value:
- " We source the most innovative products to ensure you have access to the best.",
- },
- {
- key: "Unmatched Quality",
- value:
- "Our products undergo rigorous testing to meet the highest standards.",
- },
- {
- key: "Exceptional Customer Support",
- value:
- "Our team is always here to assist you with any questions or concerns.",
- },
- ],
-} satisfies IProperties;
diff --git a/src/email/templates/newsletter/no-image.tsx b/src/email/templates/newsletter/no-image.tsx
deleted file mode 100644
index 6c408288b..000000000
--- a/src/email/templates/newsletter/no-image.tsx
+++ /dev/null
@@ -1,265 +0,0 @@
-import {
- Button,
- Container,
- Heading,
- Img,
- Link,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-
-import Layout from "../../layout/layout";
-
-interface IProperties {
- mainHeading: string;
- description: string;
- username: string;
- offer: string;
- link: string;
- star: string;
- storeData: Array<{
- key: string;
- value: string;
- }>;
- boilerData: Array<{
- key: string;
- value: string;
- }>;
-}
-
-export default function Newsletter(properties: IProperties) {
- const {
- link,
- star,
- storeData,
- boilerData,
- username,
- mainHeading,
- description,
- } = properties;
-
- return (
-
- t{username}, our Newletter.
-
-
-
-
-
-
-
- Hi {username},
-
-
- {description}
-
-
-
-
-
- What’s in Store
-
-
-
-
-
- Exclusive Savings
-
-
- For a limited time, enjoy 25% off your purchase of any of these
- groundbreaking products. Simply use the code TECHSAVVY at
- checkout to unlock your savings.
-
-
-
-
- Why Choose Boilerplate?
-
-
-
-
- Follow{" "}
-
- our Blog
- {" "}
- for more information.
-
-
-
- How To Redeem Your Offer
-
-
-
- Recover your account here:{" "}
-
- www.boilerplate.com
-
-
-
- Browse our selection of cutting-edge tech.
-
- Add your desired products to the cart.
-
- Enter the code TECHSAVVY at checkout to apply your discount.
- Don’t miss out on this opportunity to upgrade your tech and
- stay ahead of the game. This exclusive offer is valid until
- 30th July, so act fast!
-
-
-
-
- Thank you for being a valued customer. We look forward to helping
- you enhance your tech experience. Should you have any questions or
- concerns during this process, do not hesitate to reach out to us
- via email at{" "}
-
- support@boilerplate.com
-
-
-
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-}
-
-Newsletter.PreviewProps = {
- offer:
- "Enjoy special promotions and discounts available only to our members.",
- link: "www.boilerData.com",
- username: "John Doe",
- mainHeading: "Stay Ahead: Exclusive Offer on Cutting-Edge Tech!",
- star: "https://i.imgur.com/bmprMwh.png",
- description:
- "We're excited to bring you an exclusive offer that will keep you ahead of the curve! At Boilerplate, we pride ourselves on providing the latest and greatest in technology, and this time, we have something truly special for you.",
-
- storeData: [
- {
- key: "The Ultimate Smartwatch",
- value:
- "Experience the future with this state-of-the-art device, designed to enhance your daily life.",
- },
- {
- key: "The High-Performance Laptop",
- value:
- "A perfect blend of innovation and performance, ideal for both work and play.",
- },
- {
- key: "The Wireless Noise-Cancelling Headphones",
- value:
- "Sleek, powerful, and user-friendly, this product is a must-have for any tech enthusiast.",
- },
- ],
- boilerData: [
- {
- key: "Cutting-Edge Technology",
- value:
- " We source the most innovative products to ensure you have access to the best.",
- },
- {
- key: "Unmatched Quality",
- value:
- "Our products undergo rigorous testing to meet the highest standards.",
- },
- {
- key: "Exceptional Customer Support",
- value:
- "Our team is always here to assist you with any questions or concerns.",
- },
- ],
-} satisfies IProperties;
diff --git a/src/email/templates/open-ticket/image.tsx b/src/email/templates/open-ticket/image.tsx
deleted file mode 100644
index d00d020ff..000000000
--- a/src/email/templates/open-ticket/image.tsx
+++ /dev/null
@@ -1,237 +0,0 @@
-import {
- Button,
- Container,
- Heading,
- Img,
- Link,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-
-import { TemplateTable } from "../_components/template-table/TemplateTable";
-import Layout from "../../layout/layout";
-
-interface InvoiceTemplateProperties {
- username: string;
- link: string;
- tableData: {
- data: {
- key: string;
- values: JSX.Element[];
- }[];
- };
-}
-
-export const InvoiceTemplate = ({
- username,
- link,
- tableData,
-}: InvoiceTemplateProperties) => {
- return (
-
- {username}, your invoice receipt
-
-
-
-
-
-
-
-
- Your ticket has been opened
-
-
-
- Hi {username},
-
- Thank you for contacting our support team. A support ticket has
- now been opened for your request. You will be notified when a
- response is made by email. The details of your ticket are shown
- below.
-
-
-
-
-
-
-
-
- You can easily review your ticket{" "}
-
- here
-
-
-
-
-
-
- Learn More About Us
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-};
-
-const containerStyle: React.CSSProperties = {
- padding: "0 48px",
- maxWidth: "792px",
- margin: "0 auto",
-};
-
-const sectionStyle: React.CSSProperties = {
- margin: "56px 0",
-};
-
-const imageContainerStyle: React.CSSProperties = {
- margin: "0 auto",
- display: "flex",
- alignItems: "center",
- justifyContent: "center",
- maxWidth: "fit-content",
-};
-
-const imageStyle: React.CSSProperties = {
- width: "100%",
- height: "auto",
-};
-
-const textSectionStyle: React.CSSProperties = {
- marginTop: "56px",
- display: "flex",
- flexDirection: "column",
- alignItems: "center",
- justifyContent: "center",
-};
-
-const headingStyle: React.CSSProperties = {
- margin: "0 0 56px 0",
- textAlign: "center",
- fontSize: "24px",
- lineHeight: "28px",
- color: "#121212",
-};
-
-const greetingTextStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0 0 32px 0",
-};
-
-const descriptionTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
- margin: "0 0 16px 0",
-};
-
-const tableContainerStyle: React.CSSProperties = {
- marginBottom: "28px",
-};
-
-const linkSectionStyle: React.CSSProperties = {
- marginTop: "56px",
- textAlign: "center",
-};
-
-const linkTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#121212",
-};
-
-const linkStyle: React.CSSProperties = {
- color: "#F97316",
- textDecoration: "underline",
-};
-
-const buttonContainerStyle: React.CSSProperties = {
- width: "100%",
- textAlign: "center",
- marginTop: "28px",
-};
-
-const buttonStyle: React.CSSProperties = {
- borderRadius: "8px",
- backgroundColor: "#F97316",
- color: "#FAFAFA",
- padding: "16px",
- textAlign: "center",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-InvoiceTemplate.PreviewProps = {
- username: "John Doe",
- link: "www.boilerplate.com",
- tableData: {
- data: [
- {
- key: "Ticket ID",
- values: [
-
- BP01733
- ,
- ],
- },
- {
- key: "Subject",
- values: [
-
- Account Login issue
- ,
- ],
- },
- {
- key: "Description",
- values: [
-
- I tried to log into my account and I have been getting errors
- ,
- ],
- },
- {
- key: "Priority",
- values: [
-
- High
- ,
- ],
- },
- {
- key: "Status",
- values: [
-
- Open
- ,
- ],
- },
- ],
- },
-} satisfies InvoiceTemplateProperties;
-
-export default InvoiceTemplate;
diff --git a/src/email/templates/open-ticket/no-image.tsx b/src/email/templates/open-ticket/no-image.tsx
deleted file mode 100644
index d4ce12ac2..000000000
--- a/src/email/templates/open-ticket/no-image.tsx
+++ /dev/null
@@ -1,215 +0,0 @@
-import {
- Button,
- Container,
- Heading,
- Link,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-
-import { TemplateTable } from "../_components/template-table/TemplateTable";
-import Layout from "../../layout/layout";
-
-interface InvoiceTemplateProperties {
- username: string;
- link: string;
- tableData: {
- data: {
- key: string;
- values: JSX.Element[];
- }[];
- };
-}
-
-export const InvoiceTemplate = ({
- username,
- link,
- tableData,
-}: InvoiceTemplateProperties) => {
- return (
-
- {username}, your invoice receipt
-
-
-
-
- Your ticket has been opened
-
-
-
- Hi {username},
-
- Thank you for contacting our support team. A support ticket has
- now been opened for your request. You will be notified when a
- response is made by email. The details of your ticket are shown
- below.
-
-
-
-
-
-
-
-
- You can easily review your ticket{" "}
-
- here
-
-
-
-
-
-
- Learn More About Us
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-};
-
-const containerStyle: React.CSSProperties = {
- padding: "0 48px",
- maxWidth: "792px",
- margin: "0 auto",
-};
-
-const sectionStyle: React.CSSProperties = {
- margin: "0 0 56px",
-};
-
-const textSectionStyle: React.CSSProperties = {
- marginTop: "56px",
- display: "flex",
- flexDirection: "column",
- alignItems: "center",
- justifyContent: "center",
-};
-
-const headingStyle: React.CSSProperties = {
- margin: "0 0 56px 0",
- textAlign: "center",
- fontSize: "24px",
- lineHeight: "28px",
- color: "#121212",
-};
-
-const greetingTextStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0 0 32px 0",
-};
-
-const descriptionTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
- margin: "0 0 16px 0",
-};
-
-const tableContainerStyle: React.CSSProperties = {
- marginBottom: "28px",
-};
-
-const linkSectionStyle: React.CSSProperties = {
- marginTop: "56px",
- textAlign: "center",
-};
-
-const linkTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#121212",
-};
-
-const linkStyle: React.CSSProperties = {
- color: "#F97316",
- textDecoration: "underline",
-};
-
-const buttonContainerStyle: React.CSSProperties = {
- width: "100%",
- textAlign: "center",
- marginTop: "28px",
-};
-
-const buttonStyle: React.CSSProperties = {
- borderRadius: "8px",
- backgroundColor: "#F97316",
- color: "#FAFAFA",
- padding: "16px",
- textAlign: "center",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-InvoiceTemplate.PreviewProps = {
- username: "John Doe",
- link: "www.boilerplate.com",
- tableData: {
- data: [
- {
- key: "Ticket ID",
- values: [
-
- BP01733
- ,
- ],
- },
- {
- key: "Subject",
- values: [
-
- Account Login issue
- ,
- ],
- },
- {
- key: "Description",
- values: [
-
- I tried to log into my account and I have been getting errors
- ,
- ],
- },
- {
- key: "Priority",
- values: [
-
- High
- ,
- ],
- },
- {
- key: "Status",
- values: [
-
- Open
- ,
- ],
- },
- ],
- },
-} satisfies InvoiceTemplateProperties;
-
-export default InvoiceTemplate;
diff --git a/src/email/templates/password-change-confirmation/image.tsx b/src/email/templates/password-change-confirmation/image.tsx
deleted file mode 100644
index afc0cedd8..000000000
--- a/src/email/templates/password-change-confirmation/image.tsx
+++ /dev/null
@@ -1,169 +0,0 @@
-import {
- Container,
- Heading,
- Img,
- Link,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-
-import Layout from "../../layout/layout";
-
-interface PasswordChangeConfirmation {
- username: string;
- link: string;
-}
-
-export const PasswordConfirmation = ({
- username,
- link,
-}: PasswordChangeConfirmation) => {
- return (
-
- {username}, password reset completed
-
-
-
-
-
-
-
-
- Password Reset Complete
-
-
-
- Hi {username},
-
- The password for your Boilerplate account has been successfully
- changed. You can now continue to access your account as usual.
-
-
- If this wasn't done by you, please immediately reset the
- password to your Boilerplate account by following the steps
- below:
-
-
-
-
-
-
- Recover your account here:
-
- {link}
-
-
-
- Review your phone numbers and email addresses and remove the
- ones that don’t belong to you once you gain access to your
- account.
-
-
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-};
-
-const containerStyle: React.CSSProperties = {
- padding: "0 48px",
- maxWidth: "792px",
- margin: "0 auto",
-};
-
-const sectionStyle: React.CSSProperties = {
- margin: "56px 0",
-};
-
-const imageContainerStyle: React.CSSProperties = {
- margin: "0 auto",
- display: "flex",
- alignItems: "center",
- justifyContent: "center",
- maxWidth: "fit-content",
-};
-
-const imageStyle: React.CSSProperties = {
- width: "100%",
- height: "auto",
-};
-
-const textSectionStyle: React.CSSProperties = {
- marginTop: "56px",
- display: "flex",
- flexDirection: "column",
- alignItems: "center",
- justifyContent: "center",
-};
-
-const headingStyle: React.CSSProperties = {
- margin: "0 0 56px 0",
- textAlign: "center",
- fontSize: "24px",
- lineHeight: "28px",
- color: "#121212",
-};
-
-const greetingTextStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0 0 32px 0",
-};
-
-const descriptionTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
- margin: "0 0 16px 0",
-};
-
-const listSectionStyle: React.CSSProperties = {
- marginTop: "32px",
- textAlign: "left",
-};
-
-const listStyle: React.CSSProperties = {
- paddingLeft: "16px",
-};
-
-const listItemStyle: React.CSSProperties = {
- marginBottom: "16px",
-};
-
-const linkStyle: React.CSSProperties = {
- color: "#F97316",
- textDecoration: "underline",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-PasswordConfirmation.PreviewProps = {
- username: "John Doe",
- link: "https://login.boilerplate.com/forgot",
-} satisfies PasswordChangeConfirmation;
-
-export default PasswordConfirmation;
diff --git a/src/email/templates/password-change-confirmation/no-image.tsx b/src/email/templates/password-change-confirmation/no-image.tsx
deleted file mode 100644
index aad042916..000000000
--- a/src/email/templates/password-change-confirmation/no-image.tsx
+++ /dev/null
@@ -1,147 +0,0 @@
-import {
- Container,
- Heading,
- Link,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-
-import Layout from "../../layout/layout";
-
-interface PasswordChangeConfirmation {
- username: string;
- link: string;
-}
-
-export const PasswordConfirmation = ({
- username,
- link,
-}: PasswordChangeConfirmation) => {
- return (
-
- {username}, password reset completed
-
-
-
-
- Password Reset Complete
-
-
-
- Hi {username},
-
- The password for your Boilerplate account has been successfully
- changed. You can now continue to access your account as usual.
-
-
- If this wasn't done by you, please immediately reset the
- password to your Boilerplate account by following the steps
- below:
-
-
-
-
-
-
- Recover your account here:
-
- {link}
-
-
-
- Review your phone numbers and email addresses and remove the
- ones that don’t belong to you once you gain access to your
- account.
-
-
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-};
-
-const containerStyle: React.CSSProperties = {
- padding: "0 48px",
- maxWidth: "792px",
- margin: "0 auto",
-};
-
-const sectionStyle: React.CSSProperties = {
- margin: "0 0 56px",
-};
-
-const textSectionStyle: React.CSSProperties = {
- marginTop: "56px",
- display: "flex",
- flexDirection: "column",
- alignItems: "center",
- justifyContent: "center",
-};
-
-const headingStyle: React.CSSProperties = {
- margin: "0 0 56px 0",
- textAlign: "center",
- fontSize: "24px",
- lineHeight: "28px",
- color: "#121212",
-};
-
-const greetingTextStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0 0 32px 0",
-};
-
-const descriptionTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
- margin: "0 0 16px 0",
-};
-
-const listSectionStyle: React.CSSProperties = {
- marginTop: "32px",
- textAlign: "left",
-};
-
-const listStyle: React.CSSProperties = {
- paddingLeft: "16px",
-};
-
-const listItemStyle: React.CSSProperties = {
- marginBottom: "16px",
-};
-
-const linkStyle: React.CSSProperties = {
- color: "#F97316",
- textDecoration: "underline",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-PasswordConfirmation.PreviewProps = {
- username: "John Doe",
- link: "https://login.boilerplate.com/forgot",
-} satisfies PasswordChangeConfirmation;
-
-export default PasswordConfirmation;
diff --git a/src/email/templates/payment-receipt/image.tsx b/src/email/templates/payment-receipt/image.tsx
deleted file mode 100644
index 1fd3ff5b4..000000000
--- a/src/email/templates/payment-receipt/image.tsx
+++ /dev/null
@@ -1,234 +0,0 @@
-import {
- Container,
- Heading,
- Img,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-
-import { Separator } from "~/components/ui/separator";
-import {
- ITemplateTableProperties,
- TemplateTable,
-} from "../_components/template-table/TemplateTable";
-import Layout from "../../layout/layout";
-
-interface InvoiceTemplateProperties {
- price: string;
- username: string;
- link: string;
- tableData: ITemplateTableProperties;
- tableDataThree: ITemplateTableProperties;
-}
-
-const InvoiceTemplate = ({
- price,
- username,
- tableData,
- tableDataThree,
-}: InvoiceTemplateProperties) => {
- return (
-
- {username}, your invoice receipt.
-
-
-
-
-
-
-
-
-
- We have received your payment.
-
-
- {price}
-
-
-
-
-
-
-
-
-
-
- Have any questions about your order?
-
-
- Give us a call at{" "}
- (+234)-456-7890 or Email
- us at support@llaihng.com
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-};
-
-const containerStyle: React.CSSProperties = {
- padding: "0 48px",
- maxWidth: "792px",
- margin: "0 auto",
-};
-
-const sectionStyle: React.CSSProperties = {
- margin: "56px 0",
-};
-
-const imageContainerStyle: React.CSSProperties = {
- margin: "0 auto",
- display: "flex",
- alignItems: "center",
- justifyContent: "center",
- maxWidth: "fit-content",
-};
-
-const imageStyle: React.CSSProperties = {
- width: "100%",
- height: "auto",
-};
-
-const paymentSectionStyle: React.CSSProperties = {
- backgroundColor: "#F6F8FB",
- padding: "40px",
- borderRadius: "8px",
- textAlign: "center",
-};
-
-const paymentTextStyle: React.CSSProperties = {
- fontSize: "18px",
- fontWeight: "600",
- color: "#121212",
- margin: "0",
-};
-
-const priceHeadingStyle: React.CSSProperties = {
- margin: "0",
- fontSize: "24px",
- color: "#121212",
-};
-
-const separatorStyle: React.CSSProperties = {
- margin: "28px 0",
- backgroundColor: "#e0e0e0",
-};
-
-const tableSectionStyle: React.CSSProperties = {
- marginBottom: "28px",
-};
-
-const contactSectionStyle: React.CSSProperties = {
- marginTop: "56px",
- color: "#121212",
-};
-
-const contactTextStyle: React.CSSProperties = {
- margin: "0 0 8px",
- fontWeight: "500",
- fontSize: "14px",
-};
-
-const contactDetailTextStyle: React.CSSProperties = {
- margin: "0",
- fontSize: "12px",
-};
-
-const contactDetailBold: React.CSSProperties = {
- fontWeight: "600",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-InvoiceTemplate.PreviewProps = {
- price: `$400.00`,
- username: "John Doe",
- link: "www.boilerplate.com",
- tableData: {
- title: "Order Summary",
- data: [
- {
- key: "Item",
- values: [`5`, `$200`],
- },
- {
- key: "Item",
- values: [`3`, `$120`],
- },
- {
- key: "VAT",
- values: [`10%`, `$32`],
- },
- {
- key: "Total",
- values: [`100%`, `$352`],
- },
- ],
- },
- tableDataThree: {
- title: "Payment Details",
- data: [
- {
- key: "Amount",
- values: [`$352`],
- },
- {
- key: "Payment Method",
- values: [
-
-
-
- Mastercard ending in{" "}
- 5429
-
- ,
- ],
- },
- {
- key: "Reference ID",
- values: [`R4558990`],
- },
- {
- key: "Date",
- values: [`July 17, 2024`],
- },
- ],
- },
-} satisfies InvoiceTemplateProperties;
-
-export default InvoiceTemplate;
diff --git a/src/email/templates/payment-receipt/no-image.tsx b/src/email/templates/payment-receipt/no-image.tsx
deleted file mode 100644
index 0d420cbb0..000000000
--- a/src/email/templates/payment-receipt/no-image.tsx
+++ /dev/null
@@ -1,213 +0,0 @@
-import {
- Container,
- Heading,
- Img,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-
-import { Separator } from "~/components/ui/separator";
-import {
- ITemplateTableProperties,
- TemplateTable,
-} from "../_components/template-table/TemplateTable";
-import Layout from "../../layout/layout";
-
-interface InvoiceTemplateProperties {
- price: string;
- username: string;
- link: string;
- tableData: ITemplateTableProperties;
- tableDataThree: ITemplateTableProperties;
-}
-
-const InvoiceTemplate = ({
- price,
- username,
- tableData,
- tableDataThree,
-}: InvoiceTemplateProperties) => {
- return (
-
- {username}, your invoice receipt.
-
-
-
-
-
- We have received your payment.
-
-
- {price}
-
-
-
-
-
-
-
-
-
-
- Have any questions about your order?
-
-
- Give us a call at{" "}
- (+234)-456-7890 or Email
- us at support@llaihng.com
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-};
-
-const containerStyle: React.CSSProperties = {
- padding: "0 48px",
- maxWidth: "792px",
- margin: "0 auto",
-};
-
-const sectionStyle: React.CSSProperties = {
- margin: "56px 0",
-};
-
-const paymentSectionStyle: React.CSSProperties = {
- backgroundColor: "#F6F8FB",
- padding: "40px",
- borderRadius: "8px",
- textAlign: "center",
-};
-
-const paymentTextStyle: React.CSSProperties = {
- fontSize: "18px",
- fontWeight: "600",
- color: "#121212",
- margin: "0",
-};
-
-const priceHeadingStyle: React.CSSProperties = {
- margin: "0",
- fontSize: "24px",
- color: "#121212",
-};
-
-const separatorStyle: React.CSSProperties = {
- margin: "28px 0",
- backgroundColor: "#e0e0e0",
-};
-
-const tableSectionStyle: React.CSSProperties = {
- marginBottom: "28px",
-};
-
-const contactSectionStyle: React.CSSProperties = {
- marginTop: "56px",
- color: "#121212",
-};
-
-const contactTextStyle: React.CSSProperties = {
- margin: "0 0 8px",
- fontWeight: "500",
- fontSize: "14px",
-};
-
-const contactDetailTextStyle: React.CSSProperties = {
- margin: "0",
- fontSize: "12px",
-};
-
-const contactDetailBold: React.CSSProperties = {
- fontWeight: "600",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-InvoiceTemplate.PreviewProps = {
- price: `$400.00`,
- username: "John Doe",
- link: "www.boilerplate.com",
- tableData: {
- title: "Order Summary",
- data: [
- {
- key: "Item",
- values: [`5`, `$200`],
- },
- {
- key: "Item",
- values: [`3`, `$120`],
- },
- {
- key: "VAT",
- values: [`10%`, `$32`],
- },
- {
- key: "Total",
- values: [`100%`, `$352`],
- },
- ],
- },
- tableDataThree: {
- title: "Payment Details",
- data: [
- {
- key: "Amount",
- values: [`$352`],
- },
- {
- key: "Payment Method",
- values: [
-
-
-
- Mastercard ending in{" "}
- 5429
-
- ,
- ],
- },
- {
- key: "Reference ID",
- values: [`R4558990`],
- },
- {
- key: "Date",
- values: [`July 17, 2024`],
- },
- ],
- },
-} satisfies InvoiceTemplateProperties;
-
-export default InvoiceTemplate;
diff --git a/src/email/templates/reset-password/image.tsx b/src/email/templates/reset-password/image.tsx
deleted file mode 100644
index 1f6a794b4..000000000
--- a/src/email/templates/reset-password/image.tsx
+++ /dev/null
@@ -1,152 +0,0 @@
-import {
- Button,
- Container,
- Heading,
- Img,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-
-import Layout from "../../layout/layout";
-
-interface PasswordResetProperties {
- username: string;
- link: string;
-}
-
-export const PasswordReset = ({ username, link }: PasswordResetProperties) => {
- return (
-
-
- {username}, reset your password.
-
-
-
-
-
-
-
- Reset Your Password
-
-
- Hi {username},
-
- You recently requested to reset your password. If you did not
- make this request, you can ignore this email.
-
-
-
-
-
-
- To reset your password, please click the button below.
-
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-};
-
-const containerStyle: React.CSSProperties = {
- padding: "0 48px",
- maxWidth: "792px",
- margin: "0 auto",
-};
-
-const sectionStyle: React.CSSProperties = {
- margin: "56px 0",
-};
-
-const imageContainerStyle: React.CSSProperties = {
- margin: "0 auto",
- display: "flex",
- alignItems: "center",
- justifyContent: "center",
- maxWidth: "316px",
-};
-
-const imageStyle: React.CSSProperties = {
- width: "100%",
- height: "auto",
-};
-
-const headingStyle: React.CSSProperties = {
- margin: "56px 0",
- textAlign: "center",
- fontSize: "24px",
- lineHeight: "28px",
- color: "#121212",
-};
-
-const greetingStyle: React.CSSProperties = {
- margin: "0",
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
-};
-
-const descriptionStyle: React.CSSProperties = {
- textAlign: "justify",
- fontSize: "14px",
- lineHeight: "19.36px",
- color: "#525252",
-};
-
-const buttonSectionStyle: React.CSSProperties = {
- textAlign: "center",
-};
-
-const buttonTextStyle: React.CSSProperties = {
- textAlign: "left",
- lineHeight: "19px",
- color: "#525252",
-};
-
-const buttonWrapperStyle: React.CSSProperties = {
- marginTop: "32px",
- textAlign: "center",
-};
-
-const buttonStyle: React.CSSProperties = {
- borderRadius: "8px",
- backgroundColor: "#F97316",
- padding: "16px",
- color: "#FAFAFA",
- textAlign: "center",
- textDecoration: "none",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-PasswordReset.PreviewProps = {
- username: "John Doe",
- link: "https://www.boilerplate.com/reset-password",
-} satisfies PasswordResetProperties;
-
-export default PasswordReset;
diff --git a/src/email/templates/reset-password/no-image.tsx b/src/email/templates/reset-password/no-image.tsx
deleted file mode 100644
index fb5880ebc..000000000
--- a/src/email/templates/reset-password/no-image.tsx
+++ /dev/null
@@ -1,128 +0,0 @@
-import {
- Button,
- Container,
- Heading,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-
-import Layout from "../../layout/layout";
-
-interface PasswordResetProperties {
- username: string;
- link: string;
-}
-
-export const PasswordReset = ({ username, link }: PasswordResetProperties) => {
- return (
-
-
- {username}, reset your password.
-
-
- Reset Your Password
-
-
- Hi {username},
-
- You recently requested to reset your password. If you did not
- make this request, you can ignore this email.
-
-
-
-
-
-
- To reset your password, please click the button below.
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-};
-
-const containerStyle: React.CSSProperties = {
- padding: "0 48px",
- maxWidth: "792px",
- margin: "0 auto",
-};
-
-const sectionStyle: React.CSSProperties = {
- margin: "56px 0",
-};
-
-const headingStyle: React.CSSProperties = {
- margin: "0 0 56px",
- textAlign: "center",
- fontSize: "24px",
- lineHeight: "28px",
- color: "#121212",
-};
-
-const greetingStyle: React.CSSProperties = {
- margin: "0",
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
-};
-
-const descriptionStyle: React.CSSProperties = {
- textAlign: "justify",
- fontSize: "14px",
- lineHeight: "19.36px",
- color: "#525252",
-};
-
-const buttonSectionStyle: React.CSSProperties = {
- textAlign: "center",
-};
-
-const buttonTextStyle: React.CSSProperties = {
- textAlign: "left",
- lineHeight: "19px",
- color: "#525252",
-};
-
-const buttonWrapperStyle: React.CSSProperties = {
- marginTop: "32px",
- textAlign: "center",
-};
-
-const buttonStyle: React.CSSProperties = {
- borderRadius: "8px",
- backgroundColor: "#F97316",
- padding: "16px",
- color: "#FAFAFA",
- textAlign: "center",
- textDecoration: "none",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-PasswordReset.PreviewProps = {
- username: "John Doe",
- link: "https://www.boilerplate.com/reset-password",
-} satisfies PasswordResetProperties;
-
-export default PasswordReset;
diff --git a/src/email/templates/sample/image.tsx b/src/email/templates/sample/image.tsx
deleted file mode 100644
index 6534d6457..000000000
--- a/src/email/templates/sample/image.tsx
+++ /dev/null
@@ -1,112 +0,0 @@
-import {
- Body,
- Button,
- Container,
- Head,
- Hr,
- Html,
- Img,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-
-interface KoalaWelcomeEmailProperties {
- userFirstname: string;
-}
-
-const baseUrl = process.env.VERCEL_URL
- ? `https://${process.env.VERCEL_URL}`
- : "";
-
-export const KoalaWelcomeEmail = ({
- userFirstname,
-}: KoalaWelcomeEmailProperties) => (
-
-
-
- The sales intelligence platform that helps you uncover qualified leads.
-
-
-
-
- Hi {userFirstname},
-
- Welcome to Koala, the sales intelligence platform that helps you
- uncover qualified leads and close deals faster.
-
-
-
- Best,
-
- The Koala team
-
-
-
- 470 Noor Ave STE B #1148, South San Francisco, CA 94080
-
-
-
-
-);
-
-KoalaWelcomeEmail.PreviewProps = {
- userFirstname: "Alan",
-} as KoalaWelcomeEmailProperties;
-
-export default KoalaWelcomeEmail;
-
-const main = {
- backgroundColor: "#ffffff",
- fontFamily:
- '-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif',
-};
-
-const container = {
- margin: "0 auto",
- padding: "20px 0 48px",
-};
-
-const logo = {
- margin: "0 auto",
-};
-
-const paragraph = {
- fontSize: "16px",
- lineHeight: "26px",
-};
-
-const buttonContainer = {
- textAlign: "center" as const,
-};
-
-const button = {
- backgroundColor: "#5F51E8",
- borderRadius: "3px",
- color: "#fff",
- fontSize: "16px",
- textDecoration: "none",
- textAlign: "center" as const,
- display: "block",
- padding: "12px",
-};
-
-const hr = {
- borderColor: "#cccccc",
- margin: "20px 0",
-};
-
-const footer = {
- color: "#8898aa",
- fontSize: "12px",
-};
diff --git a/src/email/templates/subscription-cancellation-confirmed/image.tsx b/src/email/templates/subscription-cancellation-confirmed/image.tsx
deleted file mode 100644
index 790ef1df7..000000000
--- a/src/email/templates/subscription-cancellation-confirmed/image.tsx
+++ /dev/null
@@ -1,243 +0,0 @@
-import {
- Button,
- Container,
- Heading,
- Img,
- Link,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-
-import Layout from "../../layout/layout";
-
-interface SubscriptionCancelConfirmationProperties {
- username: string;
- link: string;
- data: Array<{
- key: string;
- value: string;
- }>;
-}
-
-export const SubscriptionCancelConfirmation = ({
- username,
- link,
- data,
-}: SubscriptionCancelConfirmationProperties) => {
- return (
-
- {username}, subscription cancelled
-
-
-
-
-
-
-
-
- Subscription Cancelled
-
-
-
- Hi {username},
-
- We regret to inform you that your subscription has been
- cancelled. We appreciate your support and hope you’ve enjoyed
- our services during your subscription period.
-
-
-
-
-
-
-
- Proceed to Account
-
-
-
-
-
- If you have any questions or need further assistance, please don’t
- hesitate to reach out to our customer{" "}
-
- support
- {" "}
- team or send a mail to us on{" "}
-
- boilerplate@gmail.com.
- {" "}
- Thank you for being a part of our community. We hope to serve you
- again in the future!
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-};
-
-const containerStyle: React.CSSProperties = {
- padding: "0 48px",
- maxWidth: "792px",
- margin: "0 auto",
-};
-
-const sectionStyle: React.CSSProperties = {
- margin: "56px 0",
-};
-
-const imageContainerStyle: React.CSSProperties = {
- margin: "0 auto",
- display: "flex",
- alignItems: "center",
- justifyContent: "center",
- maxWidth: "fit-content",
-};
-
-const imageStyle: React.CSSProperties = {
- width: "100%",
- height: "auto",
-};
-
-const textSectionStyle: React.CSSProperties = {
- marginTop: "56px",
- display: "flex",
- flexDirection: "column",
- alignItems: "center",
- justifyContent: "center",
-};
-
-const headingStyle: React.CSSProperties = {
- margin: "0 0 56px 0",
- textAlign: "center",
- fontSize: "24px",
- lineHeight: "28px",
- color: "#121212",
-};
-
-const greetingTextStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0 0 32px 0",
-};
-
-const descriptionTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
- margin: "0 0 16px 0",
-};
-
-const listStyle: React.CSSProperties = {
- margin: "0",
- padding: "0",
- listStyleType: "none",
-};
-
-const listItemStyle: React.CSSProperties = {
- marginTop: "1rem",
- display: "flex",
- alignItems: "start",
- fontSize: "16px",
-};
-
-const iconContainerStyle: React.CSSProperties = {
- marginRight: "0.5rem",
- flexShrink: "0",
-};
-
-const iconStyle: React.CSSProperties = {
- width: "24px",
- height: "24px",
-};
-
-const keyStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-const valueStyle: React.CSSProperties = {
- color: "#525252",
-};
-
-const buttonContainerStyle: React.CSSProperties = {
- width: "100%",
- textAlign: "center",
- marginTop: "28px",
-};
-
-const buttonStyle: React.CSSProperties = {
- borderRadius: "8px",
- backgroundColor: "#F97316",
- color: "#FAFAFA",
- padding: "16px",
- textAlign: "center",
-};
-
-const supportLinkStyle: React.CSSProperties = {
- color: "#F97316",
- textDecoration: "underline",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-SubscriptionCancelConfirmation.PreviewProps = {
- username: "John Doe",
- link: "www.boilerplate.com",
- data: [
- {
- key: "Subscription ID",
- value: "123456",
- },
- {
- key: "Subscription Plan",
- value: "Bi-monthly Feature",
- },
- {
- key: "Cancellation Date",
- value: "17th July, 2024",
- },
- ],
-} satisfies SubscriptionCancelConfirmationProperties;
-
-export default SubscriptionCancelConfirmation;
diff --git a/src/email/templates/subscription-cancellation-confirmed/no-image.tsx b/src/email/templates/subscription-cancellation-confirmed/no-image.tsx
deleted file mode 100644
index a8020728b..000000000
--- a/src/email/templates/subscription-cancellation-confirmed/no-image.tsx
+++ /dev/null
@@ -1,222 +0,0 @@
-import {
- Button,
- Container,
- Heading,
- Img,
- Link,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-
-import Layout from "../../layout/layout";
-
-interface SubscriptionCancelConfirmationProperties {
- username: string;
- link: string;
- data: Array<{
- key: string;
- value: string;
- }>;
-}
-
-export const SubscriptionCancelConfirmation = ({
- username,
- link,
- data,
-}: SubscriptionCancelConfirmationProperties) => {
- return (
-
- {username}, subscription cancelled
-
-
-
-
- Subscription Cancelled
-
-
-
- Hi {username},
-
- We regret to inform you that your subscription has been
- cancelled. We appreciate your support and hope you’ve enjoyed
- our services during your subscription period.
-
-
-
-
-
-
-
- Proceed to Account
-
-
-
-
-
- If you have any questions or need further assistance, please don’t
- hesitate to reach out to our customer{" "}
-
- support
- {" "}
- team or send a mail to us on{" "}
-
- boilerplate@gmail.com.
- {" "}
- Thank you for being a part of our community. We hope to serve you
- again in the future!
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-};
-
-const containerStyle: React.CSSProperties = {
- padding: "0 48px",
- maxWidth: "792px",
- margin: "0 auto",
-};
-
-const sectionStyle: React.CSSProperties = {
- margin: "0 0 56px",
-};
-
-const textSectionStyle: React.CSSProperties = {
- marginTop: "56px",
- display: "flex",
- flexDirection: "column",
- alignItems: "center",
- justifyContent: "center",
-};
-
-const headingStyle: React.CSSProperties = {
- margin: "0 0 56px 0",
- textAlign: "center",
- fontSize: "24px",
- lineHeight: "28px",
- color: "#121212",
-};
-
-const greetingTextStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0 0 32px 0",
-};
-
-const descriptionTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
- margin: "0 0 16px 0",
-};
-
-const listStyle: React.CSSProperties = {
- margin: "0",
- padding: "0",
- listStyleType: "none",
-};
-
-const listItemStyle: React.CSSProperties = {
- marginTop: "1rem",
- display: "flex",
- alignItems: "start",
- fontSize: "16px",
-};
-
-const iconContainerStyle: React.CSSProperties = {
- marginRight: "0.5rem",
- flexShrink: "0",
-};
-
-const iconStyle: React.CSSProperties = {
- width: "24px",
- height: "24px",
-};
-
-const keyStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-const valueStyle: React.CSSProperties = {
- color: "#525252",
-};
-
-const buttonContainerStyle: React.CSSProperties = {
- width: "100%",
- textAlign: "center",
- marginTop: "28px",
-};
-
-const buttonStyle: React.CSSProperties = {
- borderRadius: "8px",
- backgroundColor: "#F97316",
- color: "#FAFAFA",
- padding: "16px",
- textAlign: "center",
-};
-
-const supportLinkStyle: React.CSSProperties = {
- color: "#F97316",
- textDecoration: "underline",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-SubscriptionCancelConfirmation.PreviewProps = {
- username: "John Doe",
- link: "www.boilerplate.com",
- data: [
- {
- key: "Subscription ID",
- value: "123456",
- },
- {
- key: "Subscription Plan",
- value: "Bi-monthly Feature",
- },
- {
- key: "Cancellation Date",
- value: "17th July, 2024",
- },
- ],
-} satisfies SubscriptionCancelConfirmationProperties;
-
-export default SubscriptionCancelConfirmation;
diff --git a/src/email/templates/subscription-confirmation/image.tsx b/src/email/templates/subscription-confirmation/image.tsx
deleted file mode 100644
index 36765d026..000000000
--- a/src/email/templates/subscription-confirmation/image.tsx
+++ /dev/null
@@ -1,286 +0,0 @@
-import {
- Button,
- Container,
- Heading,
- Img,
- Link,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-
-import Layout from "../../layout/layout";
-
-interface SubscriptionConfirmationProperties {
- username: string;
- link: string;
- data: Array<{
- key: string;
- value: string;
- }>;
-}
-
-export const SubscriptionConfirmation = ({
- username,
- link,
- data,
-}: SubscriptionConfirmationProperties) => {
- return (
-
- {username}, subscription confirmed
-
-
-
-
-
-
-
-
- Subscription Confirmed
-
-
-
- Hi {username},
-
- Your payment was processed successfully. Thank you for
- subscribing to our Bi-monthly feature! We’re excited to have you
- on board. You’ll receive a separate receipt via email. Below are
- the details of your subscription:
-
-
-
-
-
-
-
-
- The estimated expiry date
-
- 17th September, 2024
-
-
-
-
-
-
- Learn More About Us
-
-
-
-
-
- If you have any questions or need further assistance, please don’t
- hesitate to reach out to our customer{" "}
-
- support
- {" "}
- team or send a mail to us on{" "}
-
- boilerplate@gmail.com.
- {" "}
- We look forward to providing you with an exceptional experience.
- Thank you for choosing our product!
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-};
-
-const containerStyle: React.CSSProperties = {
- padding: "0 48px",
- maxWidth: "792px",
- margin: "0 auto",
-};
-
-const sectionStyle: React.CSSProperties = {
- margin: "56px 0",
-};
-
-const imageContainerStyle: React.CSSProperties = {
- margin: "0 auto",
- display: "flex",
- alignItems: "center",
- justifyContent: "center",
- maxWidth: "fit-content",
-};
-
-const imageStyle: React.CSSProperties = {
- width: "100%",
- height: "auto",
-};
-
-const textSectionStyle: React.CSSProperties = {
- marginTop: "56px",
- display: "flex",
- flexDirection: "column",
- alignItems: "center",
- justifyContent: "center",
-};
-
-const headingStyle: React.CSSProperties = {
- margin: "0 0 56px 0",
- textAlign: "center",
- fontSize: "24px",
- lineHeight: "28px",
- color: "#121212",
-};
-
-const greetingTextStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0 0 32px 0",
-};
-
-const descriptionTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
- margin: "0 0 16px 0",
-};
-
-const listStyle: React.CSSProperties = {
- margin: "0",
- padding: "0",
- listStyleType: "none",
-};
-
-const listItemStyle: React.CSSProperties = {
- marginTop: "1rem",
- display: "flex",
- alignItems: "start",
- fontSize: "16px",
-};
-
-const iconContainerStyle: React.CSSProperties = {
- marginRight: "0.5rem",
- flexShrink: "0",
-};
-
-const iconStyle: React.CSSProperties = {
- width: "24px",
- height: "24px",
-};
-
-const keyStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-const valueStyle: React.CSSProperties = {
- color: "#525252",
-};
-
-const buttonContainerStyle: React.CSSProperties = {
- width: "100%",
- textAlign: "center",
- marginTop: "28px",
-};
-
-const buttonStyle: React.CSSProperties = {
- borderRadius: "8px",
- backgroundColor: "#F97316",
- color: "#FAFAFA",
- padding: "16px",
- textAlign: "center",
-};
-
-const supportLinkStyle: React.CSSProperties = {
- color: "#F97316",
- textDecoration: "underline",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-const bannerSectionStyle: React.CSSProperties = {
- backgroundColor: "#F97316",
- padding: "39px 0",
- textAlign: "center",
- color: "#FAFAFA",
- marginTop: "28px",
-};
-
-const bannerContainerStyle: React.CSSProperties = {
- maxWidth: "680px",
- margin: "0 auto",
- padding: "0 48px",
-};
-
-const bannerTextStyle: React.CSSProperties = {
- fontSize: "18px",
- margin: "0",
-};
-
-const bannerHeadingStyle: React.CSSProperties = {
- fontSize: "28px",
- margin: "0",
-};
-
-SubscriptionConfirmation.PreviewProps = {
- username: "John Doe",
- link: "www.boilerplate.com",
- data: [
- {
- key: "Email Address",
- value: "johndoe@gmail.com",
- },
- {
- key: "Subscription Plan",
- value: "Bi-monthly Feature",
- },
- {
- key: "Cost",
- value: "$20.89",
- },
- {
- key: "Duration",
- value: "2 Months",
- },
- {
- key: "Subscription Date",
- value: "17th July, 2024",
- },
- ],
-} satisfies SubscriptionConfirmationProperties;
-
-export default SubscriptionConfirmation;
diff --git a/src/email/templates/subscription-confirmation/no-image.tsx b/src/email/templates/subscription-confirmation/no-image.tsx
deleted file mode 100644
index faccc74b8..000000000
--- a/src/email/templates/subscription-confirmation/no-image.tsx
+++ /dev/null
@@ -1,265 +0,0 @@
-import {
- Button,
- Container,
- Heading,
- Img,
- Link,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-
-import Layout from "../../layout/layout";
-
-interface SubscriptionConfirmationProperties {
- username: string;
- link: string;
- data: Array<{
- key: string;
- value: string;
- }>;
-}
-
-export const SubscriptionConfirmation = ({
- username,
- link,
- data,
-}: SubscriptionConfirmationProperties) => {
- return (
-
- {username}, subscription confirmed
-
-
-
-
- Subscription Confirmed
-
-
-
- Hi {username},
-
- Your payment was processed successfully. Thank you for
- subscribing to our Bi-monthly feature! We’re excited to have you
- on board. You’ll receive a separate receipt via email. Below are
- the details of your subscription:
-
-
-
-
-
-
-
-
- The estimated expiry date
-
- 17th September, 2024
-
-
-
-
-
-
- Learn More About Us
-
-
-
-
-
- If you have any questions or need further assistance, please don’t
- hesitate to reach out to our customer{" "}
-
- support
- {" "}
- team or send a mail to us on{" "}
-
- boilerplate@gmail.com.
- {" "}
- We look forward to providing you with an exceptional experience.
- Thank you for choosing our product!
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-};
-
-const containerStyle: React.CSSProperties = {
- padding: "0 48px",
- maxWidth: "792px",
- margin: "0 auto",
-};
-
-const sectionStyle: React.CSSProperties = {
- margin: "0 0 56px",
-};
-
-const textSectionStyle: React.CSSProperties = {
- marginTop: "56px",
- display: "flex",
- flexDirection: "column",
- alignItems: "center",
- justifyContent: "center",
-};
-
-const headingStyle: React.CSSProperties = {
- margin: "0 0 56px 0",
- textAlign: "center",
- fontSize: "24px",
- lineHeight: "28px",
- color: "#121212",
-};
-
-const greetingTextStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0 0 32px 0",
-};
-
-const descriptionTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
- margin: "0 0 16px 0",
-};
-
-const listStyle: React.CSSProperties = {
- margin: "0",
- padding: "0",
- listStyleType: "none",
-};
-
-const listItemStyle: React.CSSProperties = {
- marginTop: "1rem",
- display: "flex",
- alignItems: "start",
- fontSize: "16px",
-};
-
-const iconContainerStyle: React.CSSProperties = {
- marginRight: "0.5rem",
- flexShrink: "0",
-};
-
-const iconStyle: React.CSSProperties = {
- width: "24px",
- height: "24px",
-};
-
-const keyStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-const valueStyle: React.CSSProperties = {
- color: "#525252",
-};
-
-const buttonContainerStyle: React.CSSProperties = {
- width: "100%",
- textAlign: "center",
- marginTop: "28px",
-};
-
-const buttonStyle: React.CSSProperties = {
- borderRadius: "8px",
- backgroundColor: "#F97316",
- color: "#FAFAFA",
- padding: "16px",
- textAlign: "center",
-};
-
-const supportLinkStyle: React.CSSProperties = {
- color: "#F97316",
- textDecoration: "underline",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-const bannerSectionStyle: React.CSSProperties = {
- backgroundColor: "#F97316",
- padding: "39px 0",
- textAlign: "center",
- color: "#FAFAFA",
- marginTop: "28px",
-};
-
-const bannerContainerStyle: React.CSSProperties = {
- maxWidth: "680px",
- margin: "0 auto",
- padding: "0 48px",
-};
-
-const bannerTextStyle: React.CSSProperties = {
- fontSize: "18px",
- margin: "0",
-};
-
-const bannerHeadingStyle: React.CSSProperties = {
- fontSize: "28px",
- margin: "0",
-};
-
-SubscriptionConfirmation.PreviewProps = {
- username: "John Doe",
- link: "www.boilerplate.com",
- data: [
- {
- key: "Email Address",
- value: "johndoe@gmail.com",
- },
- {
- key: "Subscription Plan",
- value: "Bi-monthly Feature",
- },
- {
- key: "Cost",
- value: "$20.89",
- },
- {
- key: "Duration",
- value: "2 Months",
- },
- {
- key: "Subscription Date",
- value: "17th July, 2024",
- },
- ],
-} satisfies SubscriptionConfirmationProperties;
-
-export default SubscriptionConfirmation;
diff --git a/src/email/templates/subscription-renewal-disabled/image.tsx b/src/email/templates/subscription-renewal-disabled/image.tsx
deleted file mode 100644
index cb53e7ae1..000000000
--- a/src/email/templates/subscription-renewal-disabled/image.tsx
+++ /dev/null
@@ -1,183 +0,0 @@
-import {
- Button,
- Container,
- Heading,
- Img,
- Link,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-
-import Layout from "../../layout/layout";
-
-interface SubscriptionRenewalDisabledProperties {
- username: string;
- link: string;
- upgradeLink: string;
-}
-
-export const SubscriptionRenewalDisabled = ({
- username,
- link,
- upgradeLink,
-}: SubscriptionRenewalDisabledProperties) => {
- return (
-
- {username}, subscription renewal disabled
-
-
-
-
-
-
-
- Subscription Renewal Disabled
-
-
-
- Hi {username},
-
- As requested, your next subscription renewal has been disabled.
- You will continue to enjoy benefits of this subscription until
- further notice.
-
-
- We are so sad to see you go. However, if you change your mind,
- you can always reactivate your subscription or upgrade your
- subscription plan.
-
-
-
-
-
-
-
- Send Another Active Link
-
-
-
-
- Upgrade Plan
-
-
-
-
-
-
- If you have questions, please visit our{" "}
-
- FAQs
-
- , or email us at{" "}
-
- help@boilerplate.com
-
- . Our team can answer questions about your subscription status. To
- unsubscribe from future subscription renewal reminders,{" "}
-
- click here.
-
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-};
-
-const containerStyle: React.CSSProperties = {
- padding: "0 48px",
- maxWidth: "792px",
- margin: "0 auto",
-};
-
-const sectionStyle: React.CSSProperties = {
- margin: "56px 0",
-};
-
-const imageContainerStyle: React.CSSProperties = {
- margin: "0 auto",
- display: "flex",
- alignItems: "center",
- justifyContent: "center",
- maxWidth: "534px",
-};
-
-const textSectionStyle: React.CSSProperties = {
- marginTop: "56px",
- display: "flex",
- flexDirection: "column",
- alignItems: "center",
- justifyContent: "center",
-};
-
-const headingStyle: React.CSSProperties = {
- margin: "0 0 56px 0",
- textAlign: "center",
- fontSize: "24px",
- lineHeight: "28px",
- color: "#121212",
-};
-
-const greetingTextStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0 0 32px 0",
-};
-
-const descriptionTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
- margin: "0 0 16px 0",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "56px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-const supportTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
-};
-
-const supportLinkStyle: React.CSSProperties = {
- color: "#F97316",
- textDecoration: "underline",
-};
-
-const unsubscribeLinkStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#F97316",
- textDecoration: "underline",
-};
-
-SubscriptionRenewalDisabled.PreviewProps = {
- username: "John Doe",
- link: "www.boilerplate.com",
- upgradeLink: "www.boilerplate.com",
-} satisfies SubscriptionRenewalDisabledProperties;
-
-export default SubscriptionRenewalDisabled;
diff --git a/src/email/templates/subscription-renewal-disabled/no-image.tsx b/src/email/templates/subscription-renewal-disabled/no-image.tsx
deleted file mode 100644
index 8f2a18c24..000000000
--- a/src/email/templates/subscription-renewal-disabled/no-image.tsx
+++ /dev/null
@@ -1,167 +0,0 @@
-import {
- Button,
- Container,
- Heading,
- Link,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-
-import Layout from "../../layout/layout";
-
-interface SubscriptionRenewalDisabledProperties {
- username: string;
- link: string;
- upgradeLink: string;
-}
-
-export const SubscriptionRenewalDisabled = ({
- username,
- link,
- upgradeLink,
-}: SubscriptionRenewalDisabledProperties) => {
- return (
-
- {username}, subscription renewal disabled
-
-
-
-
- Subscription Renewal Disabled
-
-
-
- Hi {username},
-
- As requested, your next subscription renewal has been disabled.
- You will continue to enjoy benefits of this subscription until
- further notice.
-
-
- We are so sad to see you go. However, if you change your mind,
- you can always reactivate your subscription or upgrade your
- subscription plan.
-
-
-
-
-
-
-
- Send Another Active Link
-
-
-
-
- Upgrade Plan
-
-
-
-
-
-
- If you have questions, please visit our{" "}
-
- FAQs
-
- , or email us at{" "}
-
- help@boilerplate.com
-
- . Our team can answer questions about your subscription status. To
- unsubscribe from future subscription renewal reminders,{" "}
-
- click here.
-
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-};
-
-const containerStyle: React.CSSProperties = {
- padding: "0 48px",
- maxWidth: "792px",
- margin: "0 auto",
-};
-
-const sectionStyle: React.CSSProperties = {
- margin: "56px 0",
-};
-
-const textSectionStyle: React.CSSProperties = {
- marginTop: "56px",
- display: "flex",
- flexDirection: "column",
- alignItems: "center",
- justifyContent: "center",
-};
-
-const headingStyle: React.CSSProperties = {
- margin: "0 0 56px 0",
- textAlign: "center",
- fontSize: "24px",
- lineHeight: "28px",
- color: "#121212",
-};
-
-const greetingTextStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0 0 32px 0",
-};
-
-const descriptionTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
- margin: "0 0 16px 0",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "56px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-const supportTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
-};
-
-const supportLinkStyle: React.CSSProperties = {
- color: "#F97316",
- textDecoration: "underline",
-};
-
-const unsubscribeLinkStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#F97316",
- textDecoration: "underline",
-};
-
-SubscriptionRenewalDisabled.PreviewProps = {
- username: "John Doe",
- link: "www.boilerplate.com",
- upgradeLink: "www.boilerplate.com",
-} satisfies SubscriptionRenewalDisabledProperties;
-
-export default SubscriptionRenewalDisabled;
diff --git a/src/email/templates/subscription-renewal-failed/image.tsx b/src/email/templates/subscription-renewal-failed/image.tsx
deleted file mode 100644
index 57c4aad82..000000000
--- a/src/email/templates/subscription-renewal-failed/image.tsx
+++ /dev/null
@@ -1,276 +0,0 @@
-import {
- Button,
- Container,
- Heading,
- Img,
- Link,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-import React from "react";
-
-import Layout from "../../layout/layout";
-
-interface SubscriptionenewalFailedProperties {
- username: string;
- link: string;
- data: Array<{
- value: string;
- }>;
-}
-
-const SubscriptionenewalFailed = ({
- username,
- link,
- data,
-}: SubscriptionenewalFailedProperties) => {
- return (
-
-
- {username}, subscription renewal failed
-
-
-
-
-
-
-
- Subscription Renewal Failed
-
-
-
- Hi {username},
-
- We are having some trouble processing your subscription renewal
- payment for your Bi-monthly Features. This could be because of
- either of the following reasons:
-
-
-
-
-
- {data.map((userData, index) => (
-
-
-
-
-
- {userData.value}
-
-
- ))}
-
-
-
-
-
-
- To keep enjoying your Bi-monthly Features, please check your bank
- or update your payment details.
-
-
-
-
- Update Payment Details
-
-
-
-
-
-
- If you have questions, please visit our{" "}
-
- FAQs
-
- , or email us at{" "}
-
- help@boilerplate.com
-
- . Our team can answer questions about your subscription status. To
- unsubscribe from future subscription renewal reminders,{" "}
-
- click here.
-
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-};
-
-SubscriptionenewalFailed.defaultProps = {
- username: "John Doe",
- link: "www.boilerplate.com",
- data: [
- {
- value: "Your payment card has been blocked by your bank.",
- },
- {
- value: "Your payment card has expired.",
- },
- {
- value: "You have insufficient funds in your account.",
- },
- ],
-};
-
-const sectionStyle: React.CSSProperties = {
- margin: "56px 0",
-};
-
-const imageContainerStyle: React.CSSProperties = {
- margin: "0 auto",
- display: "flex",
- alignItems: "center",
- justifyContent: "center",
- maxWidth: "fit-content",
-};
-
-const imageStyle: React.CSSProperties = {
- width: "100%",
- height: "100%",
-};
-
-const containerStyle: React.CSSProperties = {
- padding: "0 48px",
- maxWidth: "792px",
- margin: "0 auto",
-};
-
-const textSectionStyle: React.CSSProperties = {
- marginTop: "40px",
- display: "flex",
- flexDirection: "column",
- alignItems: "center",
- justifyContent: "center",
-};
-
-const headingStyle: React.CSSProperties = {
- margin: "0 0 56px 0",
- textAlign: "center",
- fontSize: "24px",
- lineHeight: "28px",
- color: "#121212",
-};
-
-const greetingTextStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0 0 32px 0",
-};
-
-const descriptionTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
- margin: "0 0 16px 0",
-};
-
-const detailsSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const listStyle: React.CSSProperties = {
- listStyle: "none",
- paddingLeft: "0",
- margin: "0",
-};
-
-const listItemStyle: React.CSSProperties = {
- display: "flex",
- alignItems: "center",
- fontSize: "14px",
- marginBottom: "1rem",
-};
-
-const iconContainerStyle: React.CSSProperties = {
- marginRight: "8px",
- flexShrink: "0",
-};
-
-const iconStyle: React.CSSProperties = {
- width: "24px",
- height: "24px",
-};
-
-const valueStyle: React.CSSProperties = {
- color: "#525252",
-};
-
-const infoSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const infoTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "left",
- marginBottom: "28px",
-};
-
-const buttonContainerStyle: React.CSSProperties = {
- width: "100%",
- textAlign: "center",
- marginTop: "32px",
-};
-
-const buttonStyle: React.CSSProperties = {
- borderRadius: "8px",
- backgroundColor: "#F97316",
- color: "#FAFAFA",
- padding: "16px",
- textAlign: "center",
- display: "inline-block",
- width: "fit-content",
- maxWidth: "300px",
- textDecoration: "none",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "40px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-const contactSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const contactTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
-};
-
-const linkStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#F67316",
- textDecoration: "underline",
-};
-
-export default SubscriptionenewalFailed;
diff --git a/src/email/templates/subscription-renewal-failed/no-image.tsx b/src/email/templates/subscription-renewal-failed/no-image.tsx
deleted file mode 100644
index 8d72e2877..000000000
--- a/src/email/templates/subscription-renewal-failed/no-image.tsx
+++ /dev/null
@@ -1,255 +0,0 @@
-import {
- Button,
- Container,
- Heading,
- Img,
- Link,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-import React from "react";
-
-import Layout from "../../layout/layout";
-
-interface SubscriptionenewalFailedProperties {
- username: string;
- link: string;
- data: Array<{
- value: string;
- }>;
-}
-
-const SubscriptionenewalFailed = ({
- username,
- link,
- data,
-}: SubscriptionenewalFailedProperties) => {
- return (
-
-
- {username}, subscription renewal failed
-
-
-
- Subscription Renewal Failed
-
-
-
- Hi {username},
-
- We are having some trouble processing your subscription renewal
- payment for your Bi-monthly Features. This could be because of
- either of the following reasons:
-
-
-
-
-
- {data.map((userData, index) => (
-
-
-
-
-
- {userData.value}
-
-
- ))}
-
-
-
-
-
-
- To keep enjoying your Bi-monthly Features, please check your bank
- or update your payment details.
-
-
-
-
- Update Payment Details
-
-
-
-
-
-
- If you have questions, please visit our{" "}
-
- FAQs
-
- , or email us at{" "}
-
- help@boilerplate.com
-
- . Our team can answer questions about your subscription status. To
- unsubscribe from future subscription renewal reminders,{" "}
-
- click here.
-
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-};
-
-SubscriptionenewalFailed.defaultProps = {
- username: "John Doe",
- link: "www.boilerplate.com",
- data: [
- {
- value: "Your payment card has been blocked by your bank.",
- },
- {
- value: "Your payment card has expired.",
- },
- {
- value: "You have insufficient funds in your account.",
- },
- ],
-};
-
-const sectionStyle: React.CSSProperties = {
- margin: "0 0 56px",
-};
-
-const containerStyle: React.CSSProperties = {
- padding: "0 48px",
- maxWidth: "792px",
- margin: "0 auto",
-};
-
-const textSectionStyle: React.CSSProperties = {
- marginTop: "40px",
- display: "flex",
- flexDirection: "column",
- alignItems: "center",
- justifyContent: "center",
-};
-
-const headingStyle: React.CSSProperties = {
- margin: "0 0 56px 0",
- textAlign: "center",
- fontSize: "24px",
- lineHeight: "28px",
- color: "#121212",
-};
-
-const greetingTextStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0 0 32px 0",
-};
-
-const descriptionTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
- margin: "0 0 16px 0",
-};
-
-const detailsSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const listStyle: React.CSSProperties = {
- listStyle: "none",
- paddingLeft: "0",
- margin: "0",
-};
-
-const listItemStyle: React.CSSProperties = {
- display: "flex",
- alignItems: "center",
- fontSize: "14px",
- marginBottom: "1rem",
-};
-
-const iconContainerStyle: React.CSSProperties = {
- marginRight: "8px",
- flexShrink: "0",
-};
-
-const iconStyle: React.CSSProperties = {
- width: "24px",
- height: "24px",
-};
-
-const valueStyle: React.CSSProperties = {
- color: "#525252",
-};
-
-const infoSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const infoTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "left",
- marginBottom: "28px",
-};
-
-const buttonContainerStyle: React.CSSProperties = {
- width: "100%",
- textAlign: "center",
- marginTop: "32px",
-};
-
-const buttonStyle: React.CSSProperties = {
- borderRadius: "8px",
- backgroundColor: "#F97316",
- color: "#FAFAFA",
- padding: "16px",
- textAlign: "center",
- display: "inline-block",
- width: "fit-content",
- maxWidth: "300px",
- textDecoration: "none",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "40px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-const contactSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const contactTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
-};
-
-const linkStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#F67316",
- textDecoration: "underline",
-};
-
-export default SubscriptionenewalFailed;
diff --git a/src/email/templates/subscription-renewal-reminder/image.tsx b/src/email/templates/subscription-renewal-reminder/image.tsx
deleted file mode 100644
index 2483c38d8..000000000
--- a/src/email/templates/subscription-renewal-reminder/image.tsx
+++ /dev/null
@@ -1,254 +0,0 @@
-import {
- Button,
- Container,
- Heading,
- Img,
- Link,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-import React from "react";
-
-import Layout from "../../layout/layout";
-
-interface SubscriptionenewaleminderProperties {
- username: string;
- link: string;
- expiredTime: string;
-}
-
-const Subscriptionenewaleminder = ({
- username,
- link,
- expiredTime,
-}: SubscriptionenewaleminderProperties) => {
- return (
-
-
- {username}, Subscription Renewal Reminder
-
-
-
-
-
-
-
- Subscription Renewal Reminder
-
-
-
- Hi {username},
-
- We hope you are enjoying your subscription, which will renew
- soon.
-
-
-
-
-
- Your Renewal Date
-
- {expiredTime}
-
-
-
-
-
- Your subscription for{" "}
- $20.89/Bi-monthly features will
- automatically renew on {expiredTime}. To avoid being charged, you
- should cancel at least a day before the renewal date. To learn
- more or cancel,{" "}
-
- review subscription
-
-
-
- To keep your subscription, you can renew your plan for the next
- month.
-
-
-
-
- Renew Subscription
-
-
-
-
-
-
- If you have questions, please visit our{" "}
-
- FAQs
-
- , or email us at{" "}
-
- help@boilerplate.com
-
- . Our team can answer questions about your subscription status. To
- unsubscribe from future subscription renewal reminders,{" "}
-
- click here.
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-};
-
-Subscriptionenewaleminder.defaultProps = {
- username: "John Doe",
- link: "www.boilerplate.com",
- expiredTime: "17th September, 2024",
-};
-
-const containerStyle: React.CSSProperties = {
- padding: "0 48px",
- maxWidth: "792px",
- margin: "0 auto",
-};
-
-const sectionStyle: React.CSSProperties = {
- margin: "56px 0",
-};
-
-const imageContainerStyle: React.CSSProperties = {
- margin: "0 auto",
- display: "flex",
- alignItems: "center",
- justifyContent: "center",
- maxWidth: "fit-content",
-};
-
-const imageStyle: React.CSSProperties = {
- width: "100%",
- height: "auto",
-};
-
-const textSectionStyle: React.CSSProperties = {
- marginTop: "56px",
-};
-
-const headingStyle: React.CSSProperties = {
- margin: "0 0 56px 0",
- textAlign: "center",
- fontSize: "24px",
- lineHeight: "28px",
- color: "#121212",
-};
-
-const greetingTextStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
-};
-
-const descriptionTextStyle: React.CSSProperties = {
- fontSize: "14px",
- lineHeight: "19.36px",
- color: "#525252",
- textAlign: "justify",
- marginBottom: "32px",
-};
-
-const bannerSectionStyle: React.CSSProperties = {
- marginTop: "28px",
- backgroundColor: "#F97316",
- padding: "39px 0",
- textAlign: "center",
- color: "#FAFAFA",
-};
-
-const bannerTextStyle: React.CSSProperties = {
- margin: "0",
- fontSize: "16px",
- fontWeight: "normal",
-};
-
-const bannerHeadingStyle: React.CSSProperties = {
- margin: "0",
- fontSize: "24px",
- fontWeight: "normal",
-};
-
-const infoSectionStyle: React.CSSProperties = {
- marginTop: "32px",
-};
-
-const infoTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19px",
-};
-
-const priceStyle: React.CSSProperties = {
- fontWeight: "600",
-};
-
-const buttonSectionStyle: React.CSSProperties = {
- textAlign: "center",
- marginTop: "32px",
-};
-
-const buttonStyle: React.CSSProperties = {
- borderRadius: "8px",
- backgroundColor: "#F97316",
- color: "#FAFAFA",
- padding: "16px",
- textAlign: "center",
- textDecoration: "none",
- display: "inline-block",
- width: "fit-content",
- maxWidth: "300px",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "56px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-const contactSectionStyle: React.CSSProperties = {
- marginTop: "32px",
-};
-
-const contactTextStyle: React.CSSProperties = {
- fontSize: "14px",
- lineHeight: "19.36px",
- color: "#525252",
- textAlign: "justify",
-};
-
-const faqLinkStyle: React.CSSProperties = {
- color: "#F67316",
- fontWeight: "600",
-};
-
-const emailLinkStyle: React.CSSProperties = {
- color: "#F67316",
-};
-
-const unsubscribeLinkStyle: React.CSSProperties = {
- color: "#525252",
- fontWeight: "600",
- textDecoration: "underline",
-};
-
-export default Subscriptionenewaleminder;
diff --git a/src/email/templates/subscription-renewal-reminder/no-image.tsx b/src/email/templates/subscription-renewal-reminder/no-image.tsx
deleted file mode 100644
index 1a5989a6e..000000000
--- a/src/email/templates/subscription-renewal-reminder/no-image.tsx
+++ /dev/null
@@ -1,131 +0,0 @@
-// import { Html } from "@react-email/components";
-import {
- Button,
- Container,
- Heading,
- Link,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-
-import Layout from "../../layout/layout";
-
-interface SubscriptionenewaleminderProperties {
- title: string;
- username: string;
-
- link: string;
- description: string;
-}
-
-const Subscriptionenewaleminder = ({
- title,
- username,
-
- link,
- description,
-}: SubscriptionenewaleminderProperties) => {
- return (
-
- {username}, Subscription Renewal Reminder
-
-
-
-
- {title}
-
-
-
- Hi {username},
-
-
- {description}
-
-
-
-
-
-
-
- Your Renewal Date
-
-
- 17th September, 2024
-
-
-
-
-
-
- Your subscription for{" "}
- $20.89/Bi-monthly features {" "}
- will automatically renew on 17th September, 2024. To avoid being
- charged, you should cancel at least a day before the renewal date.
- To learn more or cancel,{" "}
-
- review subscription
-
-
-
- To keep your subscription, you can renew your plan for the next
- month.
-
-
-
-
-
-
- Renew Subscription
-
-
-
-
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
-
-
- If you have questions, please visit our{" "}
- FAQs, or email us at{" "}
- help@boilerplate.com. Our
- team can answer questions about your subscription status. To
- unsubscribe from future subscription renewal reminders,{" "}
-
- click here.
-
-
-
-
-
-
- );
-};
-
-Subscriptionenewaleminder.PreviewProps = {
- title: "Subscription Renewal Reminder",
- username: "John Doe",
- description:
- "We hope you are enjoying your subscription, which will renew soon.",
-
- link: "wwww.boilerplate.com",
-} satisfies SubscriptionenewaleminderProperties;
-
-export default Subscriptionenewaleminder;
diff --git a/src/email/templates/support-ticket-acknowledgement/image.tsx b/src/email/templates/support-ticket-acknowledgement/image.tsx
deleted file mode 100644
index f039dbba7..000000000
--- a/src/email/templates/support-ticket-acknowledgement/image.tsx
+++ /dev/null
@@ -1,259 +0,0 @@
-import {
- Container,
- Heading,
- Img,
- Link,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-
-import { Separator } from "~/components/ui/separator";
-import Layout from "../../layout/layout";
-
-interface SupportTicketAcknowledgementProperties {
- title: string;
- username: string;
- image: string;
- description: string;
- link: string;
-}
-
-const SupportTicketAcknowledgement = ({
- title,
- username,
- image,
- description,
- link,
-}: SupportTicketAcknowledgementProperties) => {
- return (
-
- {username}, Activate your account
-
-
-
-
-
-
-
-
- {title}
-
-
-
- Hi {username},
- {description}
-
-
-
-
- Resolution Summary
-
- Your issue with the login process was due to a server
- configuration error. We have corrected the configuration, and you
- should now be able to log in without any issues.
-
-
-
-
- Next Steps
-
- If you have any further questions or concerns, feel free to reach
- out to our support team.
-
-
-
-
-
- We value your feedback and would love to hear about your
- experience with our support team. Please take a moment to fill out
- our short survey:{" "}
-
- Feedback Survey Link
-
-
-
-
-
-
-
-
- For any additional support, you can contact us at:
-
-
- Email:
- support@boilerplate.com
-
-
- Phone: 080boilerplate
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-};
-
-const containerStyle: React.CSSProperties = {
- padding: "0 48px",
- maxWidth: "792px",
- margin: "0 auto",
-};
-
-const sectionStyle: React.CSSProperties = {
- margin: "56px 0",
-};
-
-const imageContainerStyle: React.CSSProperties = {
- margin: "0 auto",
- display: "flex",
- alignItems: "center",
- justifyContent: "center",
- maxWidth: "fit-content",
-};
-
-const imageStyle: React.CSSProperties = {
- width: "100%",
- height: "auto",
-};
-
-const textSectionStyle: React.CSSProperties = {
- marginTop: "56px",
- display: "flex",
- flexDirection: "column",
- alignItems: "center",
- justifyContent: "center",
-};
-
-const headingStyle: React.CSSProperties = {
- margin: "0 0 56px 0",
- textAlign: "center",
- fontSize: "24px",
- lineHeight: "28px",
- color: "#121212",
-};
-
-const greetingTextStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0 0 32px 0",
-};
-
-const descriptionTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
- margin: "0 0 16px 0",
-};
-
-const summarySectionStyle: React.CSSProperties = {
- marginBottom: "28px",
- backgroundColor: "#F6F8FB",
- padding: "28px",
- borderRadius: "8px",
-};
-
-const summaryHeadingStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0 0 16px 0",
-};
-
-const summaryTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
-};
-
-const nextStepsSectionStyle: React.CSSProperties = {
- marginTop: "1rem",
- backgroundColor: "#F6F8FB",
- padding: "28px",
- borderRadius: "8px",
-};
-
-const nextStepsHeadingStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0 0 16px 0",
-};
-
-const nextStepsTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
-};
-
-const feedbackSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const feedbackTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
-};
-
-const feedbackLinkStyle: React.CSSProperties = {
- color: "#F97316",
- textDecoration: "underline",
-};
-
-const separatorStyle: React.CSSProperties = {
- margin: "28px 0",
- backgroundColor: "#E0E0E0",
-};
-
-const contactSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const contactTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
-};
-
-const contactInfoStyle: React.CSSProperties = {
- fontSize: "16px",
-};
-
-const contactLabelStyle: React.CSSProperties = {
- fontWeight: "700",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-SupportTicketAcknowledgement.PreviewProps = {
- title: "Your Support Ticket BP01733 Has Been Resolved",
- username: "John Doe",
- image: "https://imgur.com/dSnsvKy.png",
- link: "www.boilerplate.com",
- description:
- "We are pleased to inform you that your support ticket BP01733 has been successfully resolved.",
-} satisfies SupportTicketAcknowledgementProperties;
-
-export default SupportTicketAcknowledgement;
diff --git a/src/email/templates/support-ticket-acknowledgement/no-image.tsx b/src/email/templates/support-ticket-acknowledgement/no-image.tsx
deleted file mode 100644
index 8133f5c90..000000000
--- a/src/email/templates/support-ticket-acknowledgement/no-image.tsx
+++ /dev/null
@@ -1,240 +0,0 @@
-import {
- Container,
- Heading,
- Link,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-
-import { Separator } from "~/components/ui/separator";
-import Layout from "../../layout/layout";
-
-interface SupportTicketAknowledgementProperties {
- title: string;
- username: string;
- image: string;
- description: string;
- link: string;
-}
-
-const SupportTicketAknowledgement = ({
- title,
- username,
- description,
- link,
-}: SupportTicketAknowledgementProperties) => {
- return (
-
- {username}, Activate your account
-
-
-
-
- {title}
-
-
-
- Hi {username},
- {description}
-
-
-
-
- Resolution Summary
-
- Your issue with the login process was due to a server
- configuration error. We have corrected the configuration, and you
- should now be able to log in without any issues.
-
-
-
-
- Next Steps
-
- If you have any further questions or concerns, feel free to reach
- out to our support team.
-
-
-
-
-
- We value your feedback and would love to hear about your
- experience with our support team. Please take a moment to fill out
- our short survey:{" "}
-
- Feedback Survey Link
-
-
-
-
-
-
-
-
- For any additional support, you can contact us at:
-
-
- Email:
- support@boilerplate.com
-
-
- Phone: 080boilerplate
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-};
-
-const containerStyle: React.CSSProperties = {
- padding: "0 48px",
- maxWidth: "792px",
- margin: "0 auto",
-};
-
-const sectionStyle: React.CSSProperties = {
- margin: "0 0 56px",
-};
-
-const textSectionStyle: React.CSSProperties = {
- marginTop: "56px",
- display: "flex",
- flexDirection: "column",
- alignItems: "center",
- justifyContent: "center",
-};
-
-const headingStyle: React.CSSProperties = {
- margin: "0 0 56px 0",
- textAlign: "center",
- fontSize: "24px",
- lineHeight: "28px",
- color: "#121212",
-};
-
-const greetingTextStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0 0 32px 0",
-};
-
-const descriptionTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
- margin: "0 0 16px 0",
-};
-
-const summarySectionStyle: React.CSSProperties = {
- marginBottom: "28px",
- backgroundColor: "#F6F8FB",
- padding: "28px",
- borderRadius: "8px",
-};
-
-const summaryHeadingStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0 0 16px 0",
-};
-
-const summaryTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
-};
-
-const nextStepsSectionStyle: React.CSSProperties = {
- marginTop: "1rem",
- backgroundColor: "#F6F8FB",
- padding: "28px",
- borderRadius: "8px",
-};
-
-const nextStepsHeadingStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
- margin: "0 0 16px 0",
-};
-
-const nextStepsTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
-};
-
-const feedbackSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const feedbackTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
-};
-
-const feedbackLinkStyle: React.CSSProperties = {
- color: "#F97316",
- textDecoration: "underline",
-};
-
-const separatorStyle: React.CSSProperties = {
- margin: "28px 0",
- backgroundColor: "#E0E0E0",
-};
-
-const contactSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const contactTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
-};
-
-const contactInfoStyle: React.CSSProperties = {
- fontSize: "16px",
-};
-
-const contactLabelStyle: React.CSSProperties = {
- fontWeight: "700",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "28px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-SupportTicketAknowledgement.PreviewProps = {
- title: "Your Support Ticket BP01733 Has Been Resolved",
- username: "John Doe",
- image: "https://imgur.com/dSnsvKy.png",
- link: "www.boilerplate.com",
- description:
- "We are pleased to inform you that your support ticket BP01733 has been successfully resolved.",
-} satisfies SupportTicketAknowledgementProperties;
-
-export default SupportTicketAknowledgement;
diff --git a/src/email/templates/welcome/image.tsx b/src/email/templates/welcome/image.tsx
deleted file mode 100644
index 414a75141..000000000
--- a/src/email/templates/welcome/image.tsx
+++ /dev/null
@@ -1,252 +0,0 @@
-import {
- Button,
- Container,
- Heading,
- Img,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-
-import Layout from "../../layout/layout";
-
-interface IProperties {
- username: string;
- link: string;
-}
-
-export default function WelcomeEmail(properties: IProperties) {
- const { link, username } = properties;
-
- return (
-
- {username} welcome to Boilerplate
-
-
-
-
-
-
-
-
- Welcome to Boilerplate
-
- Thanks for signing up
-
-
-
- Hi {username},
-
- We're thrilled to have you join us. Experience quality and
- innovation like never before. Our product is made to fit your
- needs and make your life easier.
-
-
-
-
-
- Here’s what you can look forward to
-
-
-
-
-
-
-
- Exclusive Offers:
-
- Enjoy special promotions and discounts available only to our
- members.
-
-
-
-
-
-
-
-
- Exclusive Offers:
-
- Enjoy special promotions and discounts available only to our
- members.
-
-
-
-
-
-
-
-
- Exclusive Offers:
-
- Enjoy special promotions and discounts available only to our
- members.
-
-
-
-
-
-
-
-
- Learn More About us
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-}
-
-const sectionStyle: React.CSSProperties = {
- margin: "56px 0",
- width: "100%",
- maxWidth: "678px",
- padding: "56px 0",
-};
-
-const imageContainerStyle: React.CSSProperties = {
- margin: "0 auto",
- display: "flex",
- alignItems: "center",
- justifyContent: "center",
- maxWidth: "534px",
-};
-
-const imageStyle: React.CSSProperties = {
- width: "100%",
- height: "100%",
-};
-
-const containerStyle: React.CSSProperties = {
- maxWidth: "792px",
- padding: "0 48px",
- margin: "0 auto",
-};
-
-const headingSectionStyle: React.CSSProperties = {
- margin: "56px 0",
- textAlign: "center",
-};
-
-const headingStyle: React.CSSProperties = {
- margin: "0",
- fontSize: "24px",
- lineHeight: "28px",
- color: "#121212",
-};
-
-const subHeadingStyle: React.CSSProperties = {
- marginTop: "12px",
- fontSize: "1rem",
- color: "#121212",
-};
-
-const greetingTextStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
-};
-
-const descriptionTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
- margin: "16px 0",
-};
-
-const listSectionStyle: React.CSSProperties = {
- marginTop: "32px",
- width: "100%",
-};
-
-const listHeadingStyle: React.CSSProperties = {
- marginBottom: "20px",
- marginTop: "16px",
- fontSize: "16px",
- color: "#121212",
-};
-
-const listStyle: React.CSSProperties = {
- listStyle: "none",
- padding: "0",
-};
-
-const listItemStyle: React.CSSProperties = {
- display: "flex",
- alignItems: "start",
- fontSize: "14px",
- marginBottom: "20px",
-};
-
-const iconContainerStyle: React.CSSProperties = {
- marginRight: "8px",
-};
-
-const iconStyle: React.CSSProperties = {
- width: "24px",
- height: "24px",
-};
-
-const listItemTitleStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-const listItemDescriptionStyle: React.CSSProperties = {
- color: "#525252",
- lineHeight: "19.36px",
-};
-
-const buttonContainerStyle: React.CSSProperties = {
- textAlign: "center",
- marginTop: "32px",
-};
-
-const buttonStyle: React.CSSProperties = {
- borderRadius: "8px",
- backgroundColor: "#F97316",
- color: "#FAFAFA",
- padding: "16px",
- textAlign: "center",
- width: "fit-content",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "32px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-WelcomeEmail.PreviewProps = {
- username: "John Doe",
- link: "www.boilerplate.com",
-} satisfies IProperties;
diff --git a/src/email/templates/welcome/no-image.tsx b/src/email/templates/welcome/no-image.tsx
deleted file mode 100644
index b3a2d309b..000000000
--- a/src/email/templates/welcome/no-image.tsx
+++ /dev/null
@@ -1,230 +0,0 @@
-import {
- Button,
- Container,
- Heading,
- Img,
- Preview,
- Section,
- Text,
-} from "@react-email/components";
-
-import Layout from "../../layout/layout";
-
-interface IProperties {
- username: string;
- link: string;
-}
-
-export default function WelcomeEmail(properties: IProperties) {
- const { link, username } = properties;
-
- return (
-
- {username} welcome to Boilerplate
-
-
-
-
- Welcome to Boilerplate
-
- Thanks for signing up
-
-
-
- Hi {username},
-
- We're thrilled to have you join us. Experience quality and
- innovation like never before. Our product is made to fit your
- needs and make your life easier.
-
-
-
-
-
- Here’s what you can look forward to
-
-
-
-
-
-
-
- Exclusive Offers:
-
- Enjoy special promotions and discounts available only to our
- members.
-
-
-
-
-
-
-
-
- Exclusive Offers:
-
- Enjoy special promotions and discounts available only to our
- members.
-
-
-
-
-
-
-
-
- Exclusive Offers:
-
- Enjoy special promotions and discounts available only to our
- members.
-
-
-
-
-
-
-
-
- Learn More About us
-
-
-
-
-
- Regards,
-
- Boilerplate
-
-
-
-
-
- );
-}
-
-const sectionStyle: React.CSSProperties = {
- width: "100%",
- maxWidth: "678px",
- padding: "56px 0",
-};
-
-const containerStyle: React.CSSProperties = {
- maxWidth: "792px",
- padding: "0 48px",
- margin: "0 auto",
-};
-
-const headingSectionStyle: React.CSSProperties = {
- marginBottom: "56px",
- textAlign: "center",
-};
-
-const headingStyle: React.CSSProperties = {
- margin: "0",
- fontSize: "24px",
- lineHeight: "28px",
- color: "#121212",
-};
-
-const subHeadingStyle: React.CSSProperties = {
- marginTop: "12px",
- fontSize: "1rem",
- color: "#121212",
-};
-
-const greetingTextStyle: React.CSSProperties = {
- fontSize: "16px",
- fontWeight: "600",
- color: "#121212",
-};
-
-const descriptionTextStyle: React.CSSProperties = {
- fontSize: "16px",
- color: "#525252",
- lineHeight: "19.36px",
- textAlign: "justify",
- margin: "16px 0",
-};
-
-const listSectionStyle: React.CSSProperties = {
- marginTop: "32px",
- width: "100%",
-};
-
-const listHeadingStyle: React.CSSProperties = {
- marginBottom: "20px",
- marginTop: "16px",
- fontSize: "16px",
- color: "#121212",
-};
-
-const listStyle: React.CSSProperties = {
- listStyle: "none",
- padding: "0",
-};
-
-const listItemStyle: React.CSSProperties = {
- display: "flex",
- alignItems: "start",
- fontSize: "14px",
- marginBottom: "20px",
-};
-
-const iconContainerStyle: React.CSSProperties = {
- marginRight: "8px",
-};
-
-const iconStyle: React.CSSProperties = {
- width: "24px",
- height: "24px",
-};
-
-const listItemTitleStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-const listItemDescriptionStyle: React.CSSProperties = {
- color: "#525252",
- lineHeight: "19.36px",
-};
-
-const buttonContainerStyle: React.CSSProperties = {
- textAlign: "center",
- marginTop: "32px",
-};
-
-const buttonStyle: React.CSSProperties = {
- borderRadius: "8px",
- backgroundColor: "#F97316",
- color: "#FAFAFA",
- padding: "16px",
- textAlign: "center",
- width: "fit-content",
-};
-
-const footerSectionStyle: React.CSSProperties = {
- marginTop: "32px",
-};
-
-const footerTextStyle: React.CSSProperties = {
- fontWeight: "600",
- color: "#121212",
-};
-
-WelcomeEmail.PreviewProps = {
- username: "John Doe",
- link: "www.boilerplate.com",
-} satisfies IProperties;
diff --git a/src/env.ts b/src/env.ts
deleted file mode 100644
index 7c66072de..000000000
--- a/src/env.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-/* eslint-disable unicorn/prevent-abbreviations */
-import { createEnv } from "@t3-oss/env-nextjs";
-import { z } from "zod";
-
-export const env = createEnv({
- server: {},
- client: {
- NEXT_PUBLIC_BACKEND_PROBE_URL: z.string().url(),
- },
- // For Next.js >= 13.4.4, you only need to destructure client variables:
- experimental__runtimeEnv: {
- NEXT_PUBLIC_BACKEND_PROBE_URL: process.env.NEXT_PUBLIC_BACKEND_PROBE_URL,
- },
-});
diff --git a/src/hooks/admin-product/services.ts b/src/hooks/admin-product/services.ts
deleted file mode 100644
index cfbe71400..000000000
--- a/src/hooks/admin-product/services.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-// services/productService.ts
-import axios from "axios";
-
-import { getApiUrl } from "~/actions/getApiUrl";
-
-const createAxiosInstanceWithAuth = (accessToken: string) => {
- const axiosInstance = axios.create({
- headers: {
- Authorization: `Bearer ${accessToken}`,
- },
- });
-
- return axiosInstance;
-};
-
-export const addProductService = async (
- product: { name: string; quantity: number; price: number; category: string },
- accessToken: string,
-) => {
- const apiUrl = await getApiUrl();
- const orgId = localStorage.getItem("current_orgid");
- if (!orgId) throw new Error("Organization ID not found.");
-
- const axiosWithAuth = createAxiosInstanceWithAuth(accessToken);
-
- const response = await axiosWithAuth.post(
- `${apiUrl}/api/v1/organizations/${orgId}/products`,
- product,
- );
-
- return response.data;
-};
diff --git a/src/hooks/admin-product/use-product.modal.ts b/src/hooks/admin-product/use-product.modal.ts
deleted file mode 100644
index 9a1aa9587..000000000
--- a/src/hooks/admin-product/use-product.modal.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-import { create } from "zustand";
-
-type ModalProperties = {
- isOpen: boolean;
- updateOpen: (open: boolean) => void;
- product_id: string;
- updateProductId: (product_id: string) => void;
- isDelete: boolean;
- setIsDelete: (isDelete: boolean) => void;
- updateFilterModal: (isOpenFilterModal: boolean) => void;
- isOpenFilterModal: boolean;
- isNewModal: boolean;
- setIsNewModal: (isNewModal: boolean) => void;
- isActionModal: boolean;
- setIsActionModal: (isActionModal: boolean) => void;
-};
-
-export const useProductModal = create()((set) => ({
- isOpen: false,
- product_id: "",
- isDelete: false,
- isOpenFilterModal: false,
- isNewModal: false,
- isActionModal: false,
- setIsActionModal: (isActionModal) => set({ isActionModal }),
- setIsNewModal: (isNewModal) => set({ isNewModal }),
- updateFilterModal: (isOpenFilterModal) =>
- set({ isOpenFilterModal: isOpenFilterModal }),
- setIsDelete: (isDelete) => set({ isDelete }),
- updateOpen: (open) => set({ isOpen: open }),
- updateProductId: (product_id) => set({ product_id }),
-}));
diff --git a/src/hooks/admin-product/use-products.-filters.persistence.ts b/src/hooks/admin-product/use-products.-filters.persistence.ts
deleted file mode 100644
index b95f2d584..000000000
--- a/src/hooks/admin-product/use-products.-filters.persistence.ts
+++ /dev/null
@@ -1,49 +0,0 @@
-import { create } from "zustand";
-import { persist, PersistStorage } from "zustand/middleware";
-
-interface FilterType {
- label: string;
- value: string;
-}
-
-const initialFilters = [
- { label: "All", value: "all" },
- { label: "In Stock", value: "in_stock" },
- {
- label: "Low on Stock",
- value: "low_on_stock",
- },
- {
- label: "Out of Stock",
- value: "out_of_stock",
- },
-];
-
-type ProductsStateProperties = {
- filters: FilterType[];
- active_filter: string;
- updateFilter: (label: string) => void;
-};
-
-const storage: PersistStorage = {
- getItem: (name) => {
- const string_ = localStorage.getItem(name);
- if (!string_) return;
- return JSON.parse(string_);
- },
- setItem: (name, value) => {
- localStorage.setItem(name, JSON.stringify(value));
- },
- removeItem: (name) => localStorage.removeItem(name),
-};
-
-export const useProductsFilters = create()(
- persist(
- (set) => ({
- filters: initialFilters,
- active_filter: "all",
- updateFilter: (label) => set({ active_filter: label }),
- }),
- { name: "admin_products_filters", storage },
- ),
-);
diff --git a/src/hooks/admin-product/use-products.persistence.ts b/src/hooks/admin-product/use-products.persistence.ts
deleted file mode 100644
index ff442195c..000000000
--- a/src/hooks/admin-product/use-products.persistence.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-// stores/productStore.ts
-import { create } from "zustand";
-import { persist } from "zustand/middleware";
-
-import { ProductTableProperties } from "~/types/admin-product.types";
-import { addProductService } from "./services";
-
-type ProductsStateProperties = {
- products: ProductTableProperties[] | undefined;
- addProduct: (
- product: ProductTableProperties,
- accessToken: string,
- ) => Promise;
-};
-
-export const useProducts = create()(
- persist(
- (set) => ({
- products: undefined,
-
- addProduct: async (product, accessToken) => {
- const newProduct = await addProductService(product, accessToken);
- set((state) => ({
- products: [...(state?.products ?? []), newProduct],
- }));
- },
- }),
- { name: "admin_products" },
- ),
-);
diff --git a/src/hooks/external/use-external.ts b/src/hooks/external/use-external.ts
new file mode 100644
index 000000000..9142deb0f
--- /dev/null
+++ b/src/hooks/external/use-external.ts
@@ -0,0 +1,14 @@
+import { create } from 'zustand'
+import { FAQData } from '~/types'
+
+type ExternalData = {
+ faqs: FAQData | null
+ setFAQs: (data: FAQData) => void
+}
+
+const useExternalStore = create((set) => ({
+ faqs: null,
+ setFAQs: (data) => set({ faqs: data }),
+}))
+
+export default useExternalStore
diff --git a/src/hooks/global/use-enviroment.ts b/src/hooks/global/use-enviroment.ts
new file mode 100644
index 000000000..dbc6d1f7b
--- /dev/null
+++ b/src/hooks/global/use-enviroment.ts
@@ -0,0 +1,21 @@
+import { create } from 'zustand'
+import { persist } from 'zustand/middleware'
+
+type EnvironmentStore = {
+ backend: '' | 'python' | 'php'
+ setBackend: (backend: 'python' | 'php' | '') => void
+}
+
+const useEnvironmentStore = create()(
+ persist(
+ (set) => ({
+ backend: '', // Default backend is an empty string
+ setBackend: (backend) => set({ backend }),
+ }),
+ {
+ name: 'environment-storage',
+ }
+ )
+)
+
+export default useEnvironmentStore
diff --git a/src/hooks/util-hooks/use-window-height.ts b/src/hooks/global/use-window-height.ts
similarity index 63%
rename from src/hooks/util-hooks/use-window-height.ts
rename to src/hooks/global/use-window-height.ts
index a07ff8e50..1e6280918 100644
--- a/src/hooks/util-hooks/use-window-height.ts
+++ b/src/hooks/global/use-window-height.ts
@@ -1,43 +1,43 @@
-"use client";
+'use client'
-import { useEffect, useState } from "react";
+import { useEffect, useState } from 'react'
interface DimensionProperties {
- scrollY: number;
- totalHeight: number;
- winHeight: number;
+ scrollY: number
+ totalHeight: number
+ winHeight: number
}
const useWindowHeight = () => {
const [dimensions, setDimensions] = useState({
scrollY: 0,
totalHeight: 0,
winHeight: 0,
- });
+ })
useEffect(() => {
setDimensions({
scrollY: window.scrollY,
totalHeight: document.documentElement.scrollHeight,
winHeight: window.innerHeight,
- });
+ })
const handleScroll = () => {
setDimensions({
scrollY: window.scrollY,
totalHeight: document.documentElement.scrollHeight,
winHeight: window.innerHeight,
- });
- };
+ })
+ }
- window.addEventListener("scroll", handleScroll);
+ window.addEventListener('scroll', handleScroll)
return () => {
- window.removeEventListener("scroll", handleScroll);
- };
- }, []);
+ window.removeEventListener('scroll', handleScroll)
+ }
+ }, [])
// console.log(scrollY);
- return dimensions;
-};
+ return dimensions
+}
-export default useWindowHeight;
+export default useWindowHeight
diff --git a/src/hooks/navigation/use-menu.ts b/src/hooks/navigation/use-menu.ts
deleted file mode 100644
index 50d282d16..000000000
--- a/src/hooks/navigation/use-menu.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { create } from "zustand";
-
-type MenuProperties = {
- isOpen: boolean;
- updateOpen: (open: boolean) => void;
-};
-
-export const useMenu = create()((set) => ({
- isOpen: false,
- updateOpen: (open) => set({ isOpen: open }),
-}));
diff --git a/src/hooks/use-generate-pagination.ts b/src/hooks/use-generate-pagination.ts
deleted file mode 100644
index c88b236e8..000000000
--- a/src/hooks/use-generate-pagination.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-const useGeneratePagesNumbers = (currentPage: number, totalPage: number) => {
- const before = [];
- const after = [];
-
- for (let index = 2; index >= 1; index--) {
- if (currentPage - index > 0) {
- before.push(currentPage - index);
- }
- }
-
- for (let index = 1; index <= 2; index++) {
- if (currentPage + index <= totalPage) {
- after.push(currentPage + index);
- }
- }
-
- return { before, after };
-};
-
-export default useGeneratePagesNumbers;
diff --git a/src/hooks/use-local-storage.ts b/src/hooks/use-local-storage.ts
deleted file mode 100644
index d83f80094..000000000
--- a/src/hooks/use-local-storage.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { useState } from "react";
-
-export const useLocalStorage = (
- key: string,
- initialValue: T,
-): [T, (value: T) => void] => {
- const [storedValue, setStoredValue] = useState(() => {
- try {
- const item = window.localStorage.getItem(key);
-
- return item ? JSON.parse(item) : initialValue;
- } catch {
- return initialValue;
- }
- });
-
- const setValue = (value: T) => {
- setStoredValue(value);
- window.localStorage.setItem(key, JSON.stringify(value));
- };
-
- return [storedValue, setValue];
-};
diff --git a/src/hooks/use-window-width.ts b/src/hooks/use-window-width.ts
deleted file mode 100644
index fc479fd3f..000000000
--- a/src/hooks/use-window-width.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-"use client";
-
-import { useEffect, useState } from "react";
-
-const useWindowWidth = () => {
- const [winWidth, setWinWidth] = useState(0);
- useEffect(() => {
- const timeout: ReturnType = setTimeout(() => {
- setWinWidth(window.innerWidth);
- }, 300);
-
- const handleResize = () => {
- setWinWidth(window.innerWidth);
- };
- window.addEventListener("resize", handleResize);
- return () => {
- window.removeEventListener("resize", handleResize);
- clearTimeout(timeout);
- };
- }, []);
-
- return { winWidth };
-};
-
-export default useWindowWidth;
diff --git a/src/hooks/useTestHook.tsx b/src/hooks/useTestHook.tsx
deleted file mode 100644
index 9a4a43df1..000000000
--- a/src/hooks/useTestHook.tsx
+++ /dev/null
@@ -1,8 +0,0 @@
-import { useState } from "react";
-
-export function UseTestHook() {
- const [isOkay, setIsOkay] = useState("Hello World");
- setIsOkay("Hello World!");
-
- return isOkay;
-}
diff --git a/src/hooks/user/use-user.ts b/src/hooks/user/use-user.ts
deleted file mode 100644
index 57bce0982..000000000
--- a/src/hooks/user/use-user.ts
+++ /dev/null
@@ -1,38 +0,0 @@
-import { create } from "zustand";
-import { persist, PersistStorage } from "zustand/middleware";
-
-type UserProperties = {
- name: string | undefined;
- email: string | undefined;
-};
-
-type ProductsStateProperties = {
- user: UserProperties;
-
- updateUser: (user: UserProperties) => void;
-};
-
-const storage: PersistStorage = {
- getItem: (name) => {
- const string_ = localStorage.getItem(name);
- if (!string_) return;
- return JSON.parse(string_);
- },
- setItem: (name, value) => {
- localStorage.setItem(name, JSON.stringify(value));
- },
- removeItem: (name) => localStorage.removeItem(name),
-};
-
-export const useUser = create()(
- persist(
- (set) => ({
- user: {
- name: undefined,
- email: undefined,
- },
- updateUser: (user) => set({ user }),
- }),
- { name: "user_session", storage },
- ),
-);
diff --git a/src/i18n.ts b/src/i18n.ts
deleted file mode 100644
index b285e94e9..000000000
--- a/src/i18n.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { getRequestConfig } from "next-intl/server";
-
-import { getUserLocale } from "./utils/locale";
-
-export default getRequestConfig(async () => {
- const locale = await getUserLocale();
- const messagesResponse = await import(`../public/messages/${locale}.json`);
-
- return {
- locale,
- messages: messagesResponse.default,
- };
-});
diff --git a/src/lib/auth.ts b/src/lib/auth.ts
deleted file mode 100644
index 347e07c7c..000000000
--- a/src/lib/auth.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import NextAuth, { type DefaultSession } from "next-auth";
-
-import authConfig from "~/config/auth.config";
-import { Organisation, User } from "~/types";
-
-export const {
- handlers: { GET, POST },
- auth,
- unstable_update,
-} = NextAuth({
- ...authConfig,
-});
-
-declare module "next-auth" {
- interface Session {
- user: {
- id: User["id"];
- first_name: User["first_name"];
- last_name: User["last_name"];
- email: User["email"];
- image: User["avatar_url"];
- bio?: string;
- username?: string;
- is_superadmin?: boolean;
- } & DefaultSession["user"];
- access_token?: string;
- currentOrgId?: string;
- userOrg?: Organisation[];
- }
-}
diff --git a/src/lib/routes.ts b/src/lib/routes.ts
deleted file mode 100644
index d585115a4..000000000
--- a/src/lib/routes.ts
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
- * An array of routes that are accessible to the public
- * These routes do not require authentication
- * @type {string[]}
- */
-export const publicRoutes = [
- "/",
- "/career",
- "/faqs",
- "privacy-policy",
- "/terms",
- "/about-us",
- "/pricing",
- "/contact-us",
- "/waitlist",
- "/blog",
-];
-
-export const authRoutes = [
- "/register",
- "/login",
- "/forgot-password",
- "/reset-password",
- "/verify-otp",
- "/recovery",
-];
-
-export const superAdminRoutes = ["dashboard/admin/faqs"];
-
-export const apiAuthPrefix = "/api/";
-
-/**
- * The default redirect after login
- * @type {string}
- */
-export const DEFAULT_LOGIN_REDIRECT = "/dashboard";
-
-/**
- * An array of routes that are accessible to the client
- * These routes require authentication
- * @type {string[]}
- */
-export const clientRoutes = [
- "/dashboard",
- "/hisory",
- "messages",
- "/notifications",
- "/profile",
-];
diff --git a/src/lib/services/session.ts b/src/lib/services/session.ts
deleted file mode 100644
index ebefa26de..000000000
--- a/src/lib/services/session.ts
+++ /dev/null
@@ -1,83 +0,0 @@
-"use server";
-
-// import "server-only"
-import { deleteCookie, getCookie, setCookie } from "cookies-next";
-import { jwtVerify, SignJWT } from "jose";
-import { cookies } from "next/headers";
-import { redirect } from "next/navigation";
-
-type SessionPayload = {
- email: string | number;
- expiresAt: Date;
-};
-const secretKey = "VxrwwYPcY5Cjv3uEXrQefzbm7GgWmJu";
-const key = new TextEncoder().encode(secretKey);
-
-export async function joseEncrypt(payload: SessionPayload) {
- return new SignJWT(payload)
- .setProtectedHeader({ alg: "HS256" })
- .setIssuedAt()
- .setExpirationTime("1d")
- .sign(key);
-}
-
-export async function joseDecrypt(session: string | undefined = "") {
- try {
- const { payload } = await jwtVerify(session, key, {
- algorithms: ["HS256"],
- });
-
- return payload;
- } catch {
- return;
- }
-}
-
-export async function createSession(email: string) {
- const expiresAt = new Date(Date.now() + 1 * 24 * 60 * 60 * 1000); // 1 days
- const session = await joseEncrypt({ email, expiresAt });
-
- setCookie("session", session, {
- httpOnly: true,
- secure: true,
- expires: expiresAt,
- sameSite: "lax",
- path: "/",
- cookies,
- });
- // redirect("/");
-}
-
-export async function verifySession() {
- const cookie = getCookie("session", { cookies });
- const session = await joseDecrypt(cookie!);
- if (!session?.email) {
- return redirect("/login");
- }
- return {
- isAuth: true,
- email: session.email,
- };
-}
-
-export async function updateSession() {
- const session = getCookie("session", { cookies });
- const payload = (await joseDecrypt(session)) as SessionPayload;
- if (!session || !payload) return redirect("/login");
-
- const expires = new Date(Date.now() + 1 * 24 * 60 * 60 * 1000); // 1 days
-
- setCookie("session", session, {
- httpOnly: true,
- secure: true,
- expires: expires,
- sameSite: "lax",
- path: "/",
- cookies,
- });
-}
-
-export async function deleteSession() {
- deleteCookie("session");
- deleteCookie("session", { cookies });
-}
diff --git a/src/lib/services/user.ts b/src/lib/services/user.ts
deleted file mode 100644
index 747f704c0..000000000
--- a/src/lib/services/user.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { cache } from "react";
-
-import { verifySession } from "./session";
-
-export const getCurrentUser = cache(async () => {
- const data = await verifySession();
-
- const user = {
- email: data?.email,
- };
-
- return user;
-});
diff --git a/src/lib/utils.ts b/src/lib/utils.ts
deleted file mode 100644
index cd806c673..000000000
--- a/src/lib/utils.ts
+++ /dev/null
@@ -1,119 +0,0 @@
-import { clsx, type ClassValue } from "clsx";
-import moment from "moment";
-import { twMerge } from "tailwind-merge";
-
-export function cn(...inputs: ClassValue[]) {
- return twMerge(clsx(inputs));
-}
-
-export const isMobileDevice = () => {
- if (typeof window === "undefined") {
- return false;
- }
- return (
- /android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(
- navigator?.userAgent,
- ) || navigator?.maxTouchPoints > 0
- );
-};
-
-export function getCurrentDateTime() {
- const now = new Date();
-
- // Using moment to format the date and time
- const date_added = moment(now).format("YYYY-MM-DD");
- const time = moment(now).format("HH:mm:ss");
-
- return {
- date_added,
- time,
- };
-}
-export const generateId = (length: number = 14): string => {
- let result = "";
- const characters = "ab_cdefghijklmnopqrstuvwxyz0123456789";
- const charactersLength = characters.length;
-
- for (let index = 0; index < length; index++) {
- result += characters.charAt(Math.floor(Math.random() * charactersLength));
- }
-
- return result;
-};
-
-/**
- * Returns a simulated promise that resolves after the specified number of seconds.
- *
- * @param sec The number of seconds to wait before resolving the promise.
- * @returns A promise that resolves after the specified number of seconds.
- */
-export const simulateDelay = (sec: number) =>
- new Promise((resolve) => setTimeout(resolve, sec * 1000));
-
-export function formatPrice(
- price: number | string,
- options: {
- currency?: "USD" | "EUR" | "GBP" | "BDT";
- notation?: Intl.NumberFormatOptions["notation"];
- } = {},
-) {
- const { currency = "USD", notation = "compact" } = options;
-
- const numericPrice =
- typeof price === "string" ? Number.parseFloat(price) : price;
- const newPrice = new Intl.NumberFormat("en-US", {
- currency,
- notation,
- style: "currency",
- maximumFractionDigits: 2,
- }).format(numericPrice);
- return newPrice;
-}
-
-const letters = "!ABCDEFGHIJKLMNOPQRSTUVWXYZ#";
-
-export const handleMouseEnter = (event: MouseEvent) => {
- if (!event) return;
- const element = event.target as HTMLDivElement;
- let iteration: number = 0;
- const speed: number = element.dataset.value!.length > 7 ? 30 : 60;
-
- let lastTimestamp: number;
- let animationFrameId: number | null;
-
- const animate = (timestamp: number) => {
- if (!lastTimestamp) {
- lastTimestamp = timestamp;
- }
-
- // deltaTime is the time elapsed since the last animation frame
- // I use am to reduce or increase speed
- const deltaTime = timestamp - lastTimestamp;
-
- if (deltaTime >= speed) {
- // @ts-expect-error Hacking the type
- element!.textContent! = [...element!.textContent!]
- .map((_: string, index: number) => {
- if (index < iteration) {
- return element.dataset.value![index];
- }
-
- return letters[Math.floor(Math.random() * letters.length)];
- })
- .join("");
-
- if (iteration >= element.dataset.value!.length) {
- // Stop the animation if completed
- return;
- }
-
- iteration += 1 / 3;
- lastTimestamp = timestamp;
- }
-
- animationFrameId = requestAnimationFrame(animate);
- };
-
- cancelAnimationFrame(animationFrameId!);
- animationFrameId = requestAnimationFrame(animate);
-};
diff --git a/src/middleware.ts b/src/middleware.ts
index 099541cbe..14b56e29e 100644
--- a/src/middleware.ts
+++ b/src/middleware.ts
@@ -1,62 +1,61 @@
-import { NextRequest, NextResponse } from "next/server";
+import { NextRequest, NextResponse } from 'next/server'
import {
apiAuthPrefix,
authRoutes,
publicRoutes,
superAdminRoutes,
-} from "~/lib/routes";
-import { auth } from "./lib/auth";
+} from '~/routes'
+import { auth } from './auth'
-const NEXT_PUBLIC_ROOT_DOMAIN = "staging.nextjs.boilerplate.hng.tech";
+const NEXT_PUBLIC_ROOT_DOMAIN = 'staging.nextjs.boilerplate.hng.tech'
export default async function middleware(request: NextRequest) {
- const { nextUrl } = request;
- const session = await auth();
+ const { nextUrl } = request
+ const session = await auth()
- const isLoggedIn = session !== null;
- const isSuperAdmin = session?.user?.is_superadmin === true;
+ const isLoggedIn = session !== null
+ const isSuperAdmin = session?.user?.is_superadmin === true
- const isApiAuthRoute = nextUrl.pathname.startsWith(apiAuthPrefix);
- const isPublicRoute = publicRoutes.includes(nextUrl.pathname);
- const isAuthRoute = authRoutes.includes(nextUrl.pathname);
- const isSuperAdminRoute = superAdminRoutes.includes(nextUrl.pathname);
+ const isApiAuthRoute = nextUrl.pathname.startsWith(apiAuthPrefix)
+ const isPublicRoute = publicRoutes.includes(nextUrl.pathname)
+ const isAuthRoute = authRoutes.includes(nextUrl.pathname)
+ const isSuperAdminRoute = superAdminRoutes.includes(nextUrl.pathname)
- if (isApiAuthRoute || isPublicRoute) return NextResponse.next();
+ if (isApiAuthRoute || isPublicRoute) return NextResponse.next()
- const url = request.nextUrl;
+ const url = request.nextUrl
let hostname = request.headers
- .get("host")!
- .replace(/\.localhost(:\d+)?/, `.${NEXT_PUBLIC_ROOT_DOMAIN}`);
+ .get('host')!
+ .replace(/\.localhost(:\d+)?/, `.${NEXT_PUBLIC_ROOT_DOMAIN}`)
- hostname = hostname.replace("www.", ""); // remove www. from domain
- const searchParameters = request.nextUrl.searchParams.toString();
+ hostname = hostname.replace('www.', '') // remove www. from domain
+ const searchParameters = request.nextUrl.searchParams.toString()
const path = `${url.pathname}${
- searchParameters.length > 0 ? `?${searchParameters}` : ""
- }`;
+ searchParameters.length > 0 ? `?${searchParameters}` : ''
+ }`
// Rewrites for dashboard pages and dev subdomains
if (hostname == `dashboard.${NEXT_PUBLIC_ROOT_DOMAIN}`) {
if (!isLoggedIn && !isAuthRoute) {
return NextResponse.redirect(
- new URL(`/login?callbackUrl=${nextUrl.pathname}`, nextUrl),
- );
+ new URL(`/login?callbackUrl=${nextUrl.pathname}`, nextUrl)
+ )
} else if (isLoggedIn && isAuthRoute) {
- return NextResponse.redirect(new URL("/", nextUrl));
+ return NextResponse.redirect(new URL('/', nextUrl))
}
if (isSuperAdminRoute && !isSuperAdmin) {
- return NextResponse.redirect(new URL("/dashboard", nextUrl));
+ return NextResponse.redirect(new URL('/dashboard', nextUrl))
}
return NextResponse.rewrite(
- new URL(`/dashboard${path === "/" ? "/" : path}`, request.url),
- );
+ new URL(`/dashboard${path === '/' ? '/' : path}`, request.url)
+ )
}
- return NextResponse.next();
+ return NextResponse.next()
}
// Optionally, don't invoke Middleware on some paths
export const config = {
- // eslint-disable-next-line unicorn/prefer-string-raw
- matcher: ["/((?!.+\\.[\\w]+$|_next).*)", "/", "/(api|trpc)(.*)"],
-};
+ matcher: ['/((?!.+\\.[\\w]+$|_next).*)', '/', '/(api|trpc)(.*)'],
+}
diff --git a/src/routes.ts b/src/routes.ts
new file mode 100644
index 000000000..781b16968
--- /dev/null
+++ b/src/routes.ts
@@ -0,0 +1,49 @@
+/**
+ * An array of routes that are accessible to the public
+ * These routes do not require authentication
+ * @type {string[]}
+ */
+export const publicRoutes: string[] = [
+ '/',
+ '/career',
+ '/faqs',
+ 'privacy-policy',
+ '/terms',
+ '/about-us',
+ '/pricing',
+ '/contact-us',
+ '/waitlist',
+ '/blog',
+]
+
+export const authRoutes = [
+ '/register',
+ '/login',
+ '/forgot-password',
+ '/reset-password',
+ '/verify-otp',
+ '/recovery',
+]
+
+export const superAdminRoutes = ['dashboard/admin/faqs']
+
+export const apiAuthPrefix = '/api/'
+
+/**
+ * The default redirect after login
+ * @type {string}
+ */
+export const DEFAULT_LOGIN_REDIRECT: string = '/dashboard'
+
+/**
+ * An array of routes that are accessible to the client
+ * These routes require authentication
+ * @type {string[]}
+ */
+export const clientRoutes: string[] = [
+ '/dashboard',
+ '/hisory',
+ '/messages',
+ '/notifications',
+ '/profile',
+]
diff --git a/src/schemas/index.ts b/src/schemas/index.ts
index 03bf949cc..e58253d54 100644
--- a/src/schemas/index.ts
+++ b/src/schemas/index.ts
@@ -1,145 +1,45 @@
-import * as z from "zod";
-
-const passwordSchema = z
- .string()
- .min(1, { message: "Password is required" })
- .min(8, { message: "Password must be at least 8 characters long" })
- .refine((value) => /[a-z]/.test(value), {
- message: "Password must contain at least one lowercase letter",
- })
- .refine((value) => /[A-Z]/.test(value), {
- message: "Password must contain at least one uppercase letter",
- })
- .refine((value) => /\d/.test(value), {
- message: "Password must contain at least one number",
- })
- .refine((value) => /[\W_]/.test(value), {
- message: "Password must contain at least one special character",
- });
-
-export const RegisterSchema = z.object({
- first_name: z.string().min(1, { message: "First name is required." }).min(3, {
- message: "First name must be at least 3 characters",
- }),
- last_name: z.string().min(1, { message: "Last name is required." }).min(3, {
- message: "Last name must be at least 3 characters",
- }),
- email: z.string().min(1, { message: "Field is required" }).email({
- message: "Invalid email address",
- }),
- password: passwordSchema,
-});
+import * as z from 'zod'
export const LoginSchema = z.object({
- email: z.string().min(1, { message: "Email is required" }).email({
- message: "Invalid email address",
+ password: z.string().min(8, {
+ message: 'Password is required',
}),
- password: passwordSchema,
+ email: z
+ .string()
+ .min(1, {
+ message: 'Email is required',
+ })
+ .email({
+ message: 'Invalid email address',
+ }),
rememberMe: z.boolean().default(false).optional(),
-});
+})
-export const organizationSchema = z.object({
- email: z.string().email({
- message: "Email must be a valid email address.",
- }),
- name: z.string().min(2, {
- message: "Company name must be at least 2 characters.",
- }),
- description: z.string().min(2, {
- message: "Company description must be at least 2 characters.",
- }),
- industry: z.string().min(1, {
- message: "Please select an industry.",
- }),
- type: z.string().min(1, {
- message: "Please select an organization type.",
+export const RegisterSchema = z.object({
+ first_name: z.string().min(1, { message: 'First name is required.' }).min(3, {
+ message: 'First name must be at least 3 characters',
}),
- country: z.string().min(1, {
- message: "Please select a country.",
+ last_name: z.string().min(1, { message: 'Last name is required.' }).min(3, {
+ message: 'Last name must be at least 3 characters',
}),
- state: z.string().min(1, {
- message: "Please select a state.",
+ email: z.string().min(1, { message: 'Field is required' }).email({
+ message: 'Invalid email address',
}),
- address: z.string().min(1, {
- message: "Please enter company address.",
+ password: z.string().min(8, {
+ message: 'Password is required',
}),
-});
+})
export const ResetPasswordSchema = z
.object({
- password: passwordSchema,
+ password: z.string().min(8, {
+ message: 'Password is required',
+ }),
confirmPassword: z
.string()
- .min(1, { message: "Confirm Password is required" }),
+ .min(8, { message: 'Confirm Password is required' }),
})
.refine((data) => data.password === data.confirmPassword, {
- message: "Passwords do not match",
- path: ["confirmPassword"],
- });
-
-export const OtpSchema = z.object({
- token: z.string(),
- email: z.string().email().optional(),
-});
-
-export const ContactSchema = z.object({
- email: z
- .string()
- .min(1, { message: "Email is required" })
- .email({ message: "Email is invalid" }),
- name: z.string().min(1, { message: "Name is required" }),
- phone: z.string().min(1, { message: "Phone is required" }),
- message: z.string().min(1, { message: "Message is required" }),
-});
-
-export const productSchema = z.object({
- name: z.string().min(2, {
- message: "name is required",
- }),
- description: z.string().min(2, {
- message: "Company description must be at least 2 characters.",
- }),
- size: z
- .enum(["Small", "Standard", "Large"], {
- errorMap: () => ({
- message:
- "Size must be one of the following values: Small, Standard, Large",
- }),
- })
- .optional(),
- image_url: z.string().optional(),
- quantity: z.string(),
- price: z.string(),
- category: z.string(),
-});
-
-export const permissionsSchema = z.object({
- "Can view transactions": z.boolean(),
- "Can view refunds": z.boolean(),
- "Can log refunds": z.boolean(),
- "Can view users": z.boolean(),
- "Can create users": z.boolean(),
- "Can blacklist/whitelist users": z.boolean(),
-});
-
-export const roleSchema = z.object({
- name: z
- .string()
- .min(2, { message: "Name is required" })
- .max(50, { message: "Name must be 50 characters or less" })
- .regex(/^[\d !(),.?A-Za-z-]+$/, {
- message:
- "Name can only include letters, numbers, spaces, and common punctuation marks",
- }),
- description: z
- .string()
- .min(10, { message: "Role description must be at least 10 characters" })
- .max(200, { message: "Role description must be 200 characters or less" })
- .regex(/^[\d !(),.?A-Za-z-]+$/, {
- message:
- "Description can only include letters, numbers, spaces, and common punctuation marks",
- }),
- permissions: z
- .array(z.string().uuid())
- .nonempty("At least one permission must be selected"),
-});
+ message: 'Passwords do not match',
+ path: ['confirmPassword'],
+ })
diff --git a/src/test/auth-routes/organisation/organisation.testx.tsx b/src/test/auth-routes/organisation/organisation.testx.tsx
deleted file mode 100644
index 049e06afb..000000000
--- a/src/test/auth-routes/organisation/organisation.testx.tsx
+++ /dev/null
@@ -1,41 +0,0 @@
-// Organisation.test.tsx
-import { fireEvent, render, screen } from "@testing-library/react";
-import { describe, expect, it } from "vitest";
-
-import Organisation from "~/app/(auth-routes)/register/organisation/page"; // Adjust the path as needed
-
-describe("organisation Component", () => {
- it("renders the form and handles submission correctly", () => {
- expect.assertions(3); // Ensure that at least 3 assertions are called
-
- render( );
-
- // Check if the form fields are rendered
- expect(
- screen.getByPlaceholderText("Enter your company name"),
- ).toBeInTheDocument();
- expect(
- screen.getByPlaceholderText("Enter your email address"),
- ).toBeInTheDocument();
- expect(
- screen.getByPlaceholderText("Enter your company address"),
- ).toBeInTheDocument();
-
- // Simulate form input
- fireEvent.change(screen.getByPlaceholderText("Enter your company name"), {
- target: { value: "My Company" },
- });
- fireEvent.change(screen.getByPlaceholderText("Enter your email address"), {
- target: { value: "company@example.com" },
- });
- fireEvent.change(
- screen.getByPlaceholderText("Enter your company address"),
- {
- target: { value: "123 Main St" },
- },
- );
-
- // Simulate form submission
- fireEvent.submit(screen.getByText("Create Account"));
- });
-});
diff --git a/src/test/auth-routes/register.testx.tsx b/src/test/auth-routes/register.testx.tsx
deleted file mode 100644
index d5b4d717b..000000000
--- a/src/test/auth-routes/register.testx.tsx
+++ /dev/null
@@ -1,95 +0,0 @@
-import { fireEvent, render, screen, waitFor } from "@testing-library/react";
-
-import "@testing-library/jest-dom";
-
-import SignUp from "~/app/(auth-routes)/register/page";
-
-describe("signUp Component", () => {
- it("renders sign-up form", async () => {
- expect.assertions(4);
-
- render( );
-
- await waitFor(() => {
- expect(screen.getByText("Sign Up")).toBeInTheDocument();
- });
-
- await waitFor(() => {
- expect(
- screen.getByPlaceholderText("Enter your fullname"),
- ).toBeInTheDocument();
- });
-
- await waitFor(() => {
- expect(
- screen.getByPlaceholderText("Enter your email address"),
- ).toBeInTheDocument();
- });
-
- await waitFor(() => {
- expect(
- screen.getByPlaceholderText("Enter your password"),
- ).toBeInTheDocument();
- });
- });
-
- it("validates form inputs", async () => {
- expect.assertions(3);
-
- render( );
-
- fireEvent.change(screen.getByPlaceholderText("Enter your fullname"), {
- target: { value: "A" },
- });
- fireEvent.change(screen.getByPlaceholderText("Enter your email address"), {
- target: { value: "a" },
- });
- fireEvent.change(screen.getByPlaceholderText("Enter your password"), {
- target: { value: "a" },
- });
-
- fireEvent.click(screen.getByText("Create Account"));
-
- await waitFor(() => {
- expect(
- screen.getByText("Fullname must be at least 2 characters."),
- ).toBeInTheDocument();
- });
-
- await waitFor(() => {
- expect(
- screen.getByText("Email must be at least 2 characters."),
- ).toBeInTheDocument();
- });
-
- await waitFor(() => {
- expect(
- screen.getByText("Password must be at least 2 characters."),
- ).toBeInTheDocument();
- });
- });
-
- it("opens dialog on form submit", async () => {
- expect.assertions(1);
-
- render( );
-
- fireEvent.change(screen.getByPlaceholderText("Enter your fullname"), {
- target: { value: "John Doe" },
- });
- fireEvent.change(screen.getByPlaceholderText("Enter your email address"), {
- target: { value: "john.doe@example.com" },
- });
- fireEvent.change(screen.getByPlaceholderText("Enter your password"), {
- target: { value: "password123" },
- });
-
- fireEvent.click(screen.getByText("Create Account"));
-
- await waitFor(() => {
- expect(
- screen.getByText("Choose your sign-up method:"),
- ).toBeInTheDocument();
- });
- });
-});
diff --git a/src/test/blog/comment/button-wrapper.test.tsx b/src/test/blog/comment/button-wrapper.test.tsx
deleted file mode 100644
index fce9b759d..000000000
--- a/src/test/blog/comment/button-wrapper.test.tsx
+++ /dev/null
@@ -1,37 +0,0 @@
-import { render, screen } from "@testing-library/react";
-
-import ButtonWrapper from "~/components/common/comment-component/button-wrapper";
-
-describe("button wrapper component", () => {
- it("should render children correctly", () => {
- expect.assertions(1);
- render(
-
- Click Me
- ,
- );
- expect(screen.getByText("Click Me")).toBeInTheDocument();
- });
-
- it("should apply the correct data-testid attribute", () => {
- expect.assertions(1);
- render(
-
- Click Me
- ,
- );
- expect(screen.getByTestId("test-button-wrapper")).toBeInTheDocument();
- });
-
- it("should pass additional props to the wrapper div", () => {
- expect.assertions(1);
- render(
-
- Click Me
- ,
- );
- expect(screen.getByTestId("test-button-wrapper")).toHaveClass(
- "custom-class",
- );
- });
-});
diff --git a/src/test/blog/comment/comment-actions.test.tsx b/src/test/blog/comment/comment-actions.test.tsx
deleted file mode 100644
index c6e0436e5..000000000
--- a/src/test/blog/comment/comment-actions.test.tsx
+++ /dev/null
@@ -1,86 +0,0 @@
-import { fireEvent, render, screen } from "@testing-library/react";
-
-import CommentActions from "~/components/common/comment-component/comment-actions";
-
-describe("comment actions component", () => {
- const mockOnLike = vi.fn();
- const mockOnDislike = vi.fn();
- const mockOnReply = vi.fn();
-
- it('should render all buttons correctly when type is "comment"', () => {
- expect.assertions(4);
- render(
- ,
- );
-
- expect(screen.getByTestId("like-button")).toBeInTheDocument();
- expect(screen.getByTestId("dislike-button")).toBeInTheDocument();
- expect(screen.getByTestId("share-button")).toBeInTheDocument();
- expect(screen.getByTestId("reply-button")).toBeInTheDocument();
- });
-
- it('should render all buttons correctly when type is "reply"', () => {
- expect.assertions(4);
- render(
- ,
- );
-
- expect(screen.getByTestId("like-button")).toBeInTheDocument();
- expect(screen.getByTestId("dislike-button")).toBeInTheDocument();
- expect(screen.getByTestId("share-button")).toBeInTheDocument();
- expect(screen.queryByTestId("reply-button")).not.toBeInTheDocument();
- });
-
- it("should call onLike when the like button is clicked", () => {
- expect.assertions(1);
- render(
- ,
- );
-
- const likeButton = screen.getByTestId("like-button");
- fireEvent.click(likeButton);
- expect(mockOnLike).toHaveBeenCalledTimes(1);
- });
-
- it("should call onDislike when the dislike button is clicked", () => {
- expect.assertions(1);
- render(
- ,
- );
-
- const dislikeButton = screen.getByTestId("dislike-button");
- fireEvent.click(dislikeButton);
- expect(mockOnDislike).toHaveBeenCalledTimes(1);
- });
-});
diff --git a/src/test/blog/comment/comment-body.test.tsx b/src/test/blog/comment/comment-body.test.tsx
deleted file mode 100644
index a486ccbf1..000000000
--- a/src/test/blog/comment/comment-body.test.tsx
+++ /dev/null
@@ -1,155 +0,0 @@
-import { fireEvent, render, screen } from "@testing-library/react";
-import moment from "moment";
-import { Session } from "next-auth";
-
-import { CommentBody } from "~/components/common/comment-component/comment-body";
-
-describe("comment body component", () => {
- const mockSession: Session = {
- user: {
- id: "12345",
- name: "Current User",
- first_name: "Current",
- last_name: "User",
- email: "user@example.com",
- image: "path/to/image",
- },
- access_token: "some-token",
- expires: "1",
- };
- it("should display content, timestamp, and action buttons correctly", async () => {
- expect.assertions(3);
- render(
- ,
- );
- expect(screen.getByTestId("comment-text")).toHaveTextContent(
- "This is a reply.",
- );
- expect(screen.getByTestId("comment-timestamp")).toHaveTextContent(
- moment("2024-07-20T01:00:00Z").format("DD MMM, YYYY"),
- );
- expect(screen.getByTestId("action-buttons-container")).toBeInTheDocument();
- });
-
- it("should call onLike and onDislike functions when buttons are clicked", () => {
- expect.assertions(2);
- const mockOnLike = vi.fn();
- const mockOnDislike = vi.fn();
- render(
- ,
- );
-
- const likeButton = screen.getByTestId("like-button");
- const dislikeButton = screen.getByTestId("dislike-button");
-
- fireEvent.click(likeButton);
- fireEvent.click(dislikeButton);
-
- expect(mockOnLike).toHaveBeenCalledTimes(1);
- expect(mockOnDislike).toHaveBeenCalledTimes(1);
- });
-
- it("should not display reply button if onReply is not provided", () => {
- expect.assertions(1);
- render(
- ,
- );
-
- expect(
- screen.queryByRole("button", { name: /reply/i }),
- ).not.toBeInTheDocument();
- });
-
- it("should display reply button if onReply is provided", () => {
- expect.assertions(1);
- render(
- ,
- );
-
- expect(screen.getByTestId("reply-button")).toBeInTheDocument();
- });
-
- it("should not display comment actions if session is not provided i.e user is not logged in", () => {
- expect.assertions(1);
- render(
- ,
- );
- expect(
- screen.queryByTestId("action-buttons-container"),
- ).not.toBeInTheDocument();
- });
-});
diff --git a/src/test/blog/comment/comment-reply.test.tsx b/src/test/blog/comment/comment-reply.test.tsx
deleted file mode 100644
index 9af91c8be..000000000
--- a/src/test/blog/comment/comment-reply.test.tsx
+++ /dev/null
@@ -1,78 +0,0 @@
-import { fireEvent, render, screen } from "@testing-library/react";
-import { Session } from "next-auth";
-
-import { ReplyForm } from "~/components/common/comment-component/comment-reply";
-
-describe("comment reply component", () => {
- const mockSession: Session = {
- user: {
- id: "12345",
- name: "Current User",
- first_name: "Current",
- last_name: "User",
- email: "user@example.com",
- image: "path/to/image",
- },
- access_token: "some-token",
- expires: "1",
- };
- it("should render without crashing", () => {
- expect.assertions(3);
- render( );
- /* eslint-disable testing-library/prefer-presence-queries */
- expect(
- screen.queryByTestId("reply-avatar") ||
- screen.queryByTestId("avatar-fallback"),
- ).toBeInTheDocument();
- expect(
- screen.getByPlaceholderText("Write your reply..."),
- ).toBeInTheDocument();
- expect(screen.getByText("Reply")).toBeInTheDocument();
- });
-
- it("should call onSubmit with content when form is submitted", () => {
- expect.assertions(3);
- const mockOnSubmit = vi.fn();
- render( );
-
- const textarea = screen.getByPlaceholderText("Write your reply...");
- const submitButton = screen.getByText("Reply");
-
- fireEvent.change(textarea, { target: { value: "Test reply" } });
- fireEvent.click(submitButton);
-
- expect(mockOnSubmit).toHaveBeenCalledWith("Test reply");
- expect(mockOnSubmit).toHaveBeenCalledTimes(1);
- expect(textarea).toHaveValue("");
- });
-
- it("should display error message when submitting empty reply", () => {
- expect.assertions(1);
- render( );
-
- const submitButton = screen.getByText("Reply");
- fireEvent.click(submitButton);
-
- expect(
- screen.getByText("Please enter a reply before submitting."),
- ).toBeInTheDocument();
- });
-
- it("should clear error message when user starts typing after an error", () => {
- expect.assertions(2);
- render( );
-
- const textarea = screen.getByPlaceholderText("Write your reply...");
- const submitButton = screen.getByText("Reply");
-
- fireEvent.click(submitButton);
- expect(
- screen.getByText("Please enter a reply before submitting."),
- ).toBeInTheDocument();
-
- fireEvent.change(textarea, { target: { value: "Test reply" } });
- expect(
- screen.queryByText("Please enter a reply before submitting."),
- ).not.toBeInTheDocument();
- });
-});
diff --git a/src/test/blog/comment/index.test.tsx b/src/test/blog/comment/index.test.tsx
deleted file mode 100644
index afc19231d..000000000
--- a/src/test/blog/comment/index.test.tsx
+++ /dev/null
@@ -1,96 +0,0 @@
-import { fireEvent, render, screen } from "@testing-library/react";
-import { Session } from "next-auth";
-import { describe, expect, it } from "vitest";
-
-import Comment, {
- CommentProperties,
-} from "~/components/common/comment-component";
-
-describe("comment box component", () => {
- const mockSession: Session = {
- user: {
- id: "12345",
- name: "Current User",
- first_name: "Current",
- last_name: "User",
- email: "user@example.com",
- image: "path/to/image",
- },
- access_token: "some-token",
- expires: "2100-01-01T00:00:00.000Z",
- };
- const defaultProps: CommentProperties = {
- id: "1",
- avatar: "/path/to/avatar.png",
- name: "John Doe",
- username: "johndoe",
- content: "This is a comment.",
- timestamp: "2024-07-20",
- likes: 10,
- dislikes: 2,
- className: "",
- session: mockSession,
- };
-
- it("should render the comment box correctly", () => {
- expect.assertions(5);
-
- render( );
-
- expect(screen.getByTestId("comment-box-container")).toBeInTheDocument();
- expect(screen.getByTestId("comment-card")).toBeInTheDocument();
- expect(screen.getByText(defaultProps.name)).toBeInTheDocument();
- expect(screen.getByText(`@${defaultProps.username}`)).toBeInTheDocument();
- expect(screen.getByText(defaultProps.content)).toBeInTheDocument();
- });
-
- it("should handle like button click correctly for the comment", () => {
- expect.assertions(2);
-
- render( );
-
- const likeButton = screen.getByTestId("like-button");
- fireEvent.click(likeButton);
-
- expect(likeButton).toBeInTheDocument();
- expect(screen.getByText("11")).toBeInTheDocument();
- });
-
- it("should handle dislike button click correctly for the comment", () => {
- expect.assertions(2);
-
- render( );
-
- const dislikeButton = screen.getByTestId("dislike-button");
- fireEvent.click(dislikeButton);
-
- expect(dislikeButton).toBeInTheDocument();
- expect(screen.getByText("3")).toBeInTheDocument();
- });
-
- it("should show reply form when reply button is clicked", () => {
- expect.assertions(2);
-
- render( );
-
- const replyButton = screen.getByTestId("reply-button");
- fireEvent.click(replyButton);
-
- expect(replyButton).toBeInTheDocument();
- expect(screen.getByTestId("reply-form-container")).toBeInTheDocument();
- });
-
- it("should add a reply when the reply form is submitted", () => {
- expect.assertions(1);
-
- render( );
-
- const replyButton = screen.getByTestId("reply-button");
- fireEvent.click(replyButton);
-
- const replyInput = screen.getByTestId("reply-input");
- fireEvent.change(replyInput, { target: { value: "This is a reply." } });
-
- expect(screen.getByText("This is a reply.")).toBeInTheDocument();
- });
-});
diff --git a/src/test/contact.test.tsx b/src/test/contact.test.tsx
deleted file mode 100644
index c0847a0e7..000000000
--- a/src/test/contact.test.tsx
+++ /dev/null
@@ -1,53 +0,0 @@
-import { fireEvent, render, screen, waitFor } from "@testing-library/react";
-import { SessionProvider } from "next-auth/react";
-import { ReactNode } from "react";
-
-import Contact from "~/app/(landing-routes)/contact-us/page";
-
-describe("contact Page tests", () => {
- const renderWithSession = (component: ReactNode) => {
- return render(
- {component} ,
- );
- };
-
- it("should render the Contact Us form and content card correctly", () => {
- expect.assertions(4);
- renderWithSession( );
-
- expect(screen.getByRole("form")).toBeInTheDocument();
-
- expect(screen.getByText("Contact Our Team")).toBeInTheDocument();
-
- expect(screen.getByText(/business hours/i)).toBeInTheDocument();
-
- expect(screen.getByRole("heading", { name: /faq/i })).toBeInTheDocument();
- });
-
- it("should validate the form inputs correctly", async () => {
- expect.assertions(1);
- renderWithSession( );
-
- fireEvent.change(screen.getByLabelText(/email/i), {
- target: { value: "invalid-email" },
- });
- fireEvent.submit(screen.getByRole("form"));
-
- await waitFor(() => {
- expect(screen.getByText(/email is invalid/i)).toBeInTheDocument();
- });
- });
-
- it("should be responsive", () => {
- expect.assertions(2);
- renderWithSession( );
-
- window.innerWidth = 320;
- window.dispatchEvent(new Event("resize"));
- expect(screen.getByRole("form")).toBeInTheDocument();
-
- window.innerWidth = 1024;
- window.dispatchEvent(new Event("resize"));
- expect(screen.getByRole("form")).toBeInTheDocument();
- });
-});
diff --git a/src/test/setup.ts b/src/test/setup.ts
deleted file mode 100644
index 0cfdf6a8d..000000000
--- a/src/test/setup.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import "@testing-library/jest-dom/vitest";
-import "@testing-library/jest-dom";
-
-class ResizeObserver {
- observe() {}
- unobserve() {}
- disconnect() {}
-}
-
-window.ResizeObserver = ResizeObserver;
diff --git a/src/test/utils.tsx b/src/test/utils.tsx
deleted file mode 100644
index 6a9df9ac1..000000000
--- a/src/test/utils.tsx
+++ /dev/null
@@ -1,17 +0,0 @@
-import { render } from "@testing-library/react";
-import { NextIntlClientProvider } from "next-intl";
-import { ReactNode } from "react";
-
-const renderWithIntl = (
- ui: ReactNode,
- { locale = "en", messages = {} } = {},
-) => {
- return render(
-
- {ui}
- ,
- );
-};
-
-export * from "@testing-library/react";
-export { renderWithIntl };
diff --git a/src/types/admin-product.types.ts b/src/types/admin-product.types.ts
deleted file mode 100644
index 06956d812..000000000
--- a/src/types/admin-product.types.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-export type ProductTableProperties = {
- status: string;
- product_id: string;
- // product_id: string;
- name: string;
- price: number;
- description: string;
- // image: string;
- category: string;
- // status: "in_stock" | "out_of_stock" | "low_on_stock";
- quantity: number;
- // date_added: string;
- // time: string;
-};
diff --git a/src/types/blog.types.ts b/src/types/blog.types.ts
deleted file mode 100644
index ce15d08db..000000000
--- a/src/types/blog.types.ts
+++ /dev/null
@@ -1,71 +0,0 @@
-import {
- blogCard1,
- blogCard2,
- blogCard3,
- blogCard4,
- blogCard5,
- blogCard6,
-} from "../../public/images/blogPage/utils";
-
-export const blogPosts = [
- {
- id: 1,
- title: "The Power of Networking: How to Build Meaningful Connections",
- date: "Jul 12, 2024",
- readTime: "5",
- category: "Business",
- image: blogCard1,
- labelClassName: "bg-primary",
- author: "Nora Nora",
- },
- {
- id: 2,
- title: "The Global Impact of Climate Change: A Look at the Evidence",
- date: "Jul 12, 2024",
- readTime: "5",
- category: "World News",
- image: blogCard2,
- labelClassName: "bg-warning",
- author: "Jane Doe",
- },
- {
- id: 3,
- title: "5 Easy and Delicious Recipes for Busy Weeknights",
- date: "Jul 12, 2024",
- readTime: "5",
- category: "Food",
- image: blogCard3,
- labelClassName: "bg-success",
- author: "John Doe",
- },
- {
- id: 4,
- title: "5 Simple Habits to Improve Your Mental Wellbeing",
- date: "Jul 12, 2024",
- readTime: "5",
- category: "Lifestyle",
- image: blogCard4,
- labelClassName: "bg-primary",
- author: "Jane Doe",
- },
- {
- id: 5,
- title: "The Ultimate Guide to Dressing Stylishly with Fewer Clothes",
- date: "Jul 12, 2024",
- readTime: "5",
- category: "Fashion",
- image: blogCard5,
- labelClassName: "bg-success",
- author: "John Doe",
- },
- {
- id: 6,
- title: "The Future of Travel: What Will the World Look Like in 2030?",
- date: "Jul 12, 2024",
- readTime: "5",
- category: "World News",
- image: blogCard6,
- labelClassName: "bg-warning",
- author: "Nora Nora",
- },
-];
diff --git a/src/types/index.d.ts b/src/types/index.d.ts
index a847ac733..1954775bd 100644
--- a/src/types/index.d.ts
+++ b/src/types/index.d.ts
@@ -1,132 +1,85 @@
-import { Session, type DefaultSession } from "next-auth";
-import { JWT } from "next-auth/jwt";
+import { Session, type DefaultSession } from 'next-auth'
+import { JWT } from 'next-auth/jwt'
export interface CustomJWT extends JWT {
- id?: string;
- email?: string;
- picture?: string;
- avatar_url?: string;
- first_name?: string;
- last_name?: string;
- fullname?: string;
- access_token?: string;
- organisations?: Organisation[];
+ id?: string
+ email?: string
+ picture?: string
+ avatar_url?: string
+ first_name?: string
+ last_name?: string
+ fullname?: string
+ access_token?: string
+ organisations?: Organisation[]
}
export interface CustomSession extends Session {
user: {
- id: string;
- first_name: string;
- last_name: string;
- email: string;
- image: string;
- };
- expires: DefaultSession["expires"];
- access_token?: string;
- currentOrgId?: string;
- userOrg?: Organisation[];
+ id: string
+ first_name: string
+ last_name: string
+ email: string
+ image: string
+ }
+ expires: DefaultSession['expires']
+ access_token?: string
+ userOrg?: Organisation[]
}
export interface User {
- id?: string;
- role?: string;
- email?: string;
- fullname?: string;
- avatar_url?: string;
- first_name?: string;
- last_name?: string;
- expires_in?: string;
+ id?: string
+ role?: string
+ email?: string
+ fullname?: string
+ avatar_url?: string
+ first_name?: string
+ last_name?: string
+ expires_in?: string
}
export interface extendedUser extends User {
- access_token?: string;
+ access_token?: string
}
export interface ApiResponseData {
- access_token: string;
- user: User;
+ access_token: string
+ user: User
}
export interface ApiResponse {
- status: string;
- status_code: number;
- message: string;
- data: ApiResponseData;
+ status: string
+ status_code: number
+ message: string
+ data: ApiResponseData
}
export interface Profile {
- id_token: string;
+ id_token: string
}
export interface AuthResponse {
- data: User;
- access_token: string;
+ data: User
+ access_token: string
+ success: boolean
+ message: string
}
export interface ErrorResponse {
- message: string;
- status_code?: number;
+ message: string
+ status_code?: number
+ success: boolean
}
export interface Organisation {
- id: string;
- name: string;
- description: string;
- user_role: "admin" | "manager" | "user" | string;
- organisation_id: string;
+ id: string
+ name: string
+ description: string
+ user_role: 'admin' | 'manager' | 'user' | string
+ organisation_id: string
}
-interface Metrics {
- current_month: number;
- previous_month: number;
- percentage_difference: string;
+export interface FAQ {
+ question: string
+ answer: string
}
-interface ActiveUsers {
- current: number;
- difference_an_hour_ago: number;
-}
-
-export interface DashboardData {
- revenue: Metrics;
- Subscriptions: Metrics;
- orders: Metrics;
- active_users: ActiveUsers;
-}
-
-export interface MonthlyRevenue {
- month: string;
- revenue: number;
-}
-
-export type MonthlyData = MonthlyRevenue[];
-
-export type CloudinaryAsset = {
- url: string;
-};
-
-export type UpdateProfileType = {
- username?: string;
- jobTitle?: string;
- pronouns?: string;
- department?: string;
- email?: string;
- bio?: string;
- sociallinks?: string[];
- language?: string;
- region?: string;
- timezones?: string;
- profile_pic_url?: string;
-};
-
-export interface Product {
- id: string;
- name: string;
- description: string;
- category: string;
- image: string;
- price: number;
- cost_price: number;
- quantity: number;
- size?: "Small" | "Standard" | "Large";
- stock_status: "in stock" | "out of stock" | "preorder";
- created_at: string;
- updated_at: string;
+export interface FAQData {
+ [key: string]: FAQ[]
}
diff --git a/src/utils/.gitkeep b/src/utils/.gitkeep
deleted file mode 100644
index c693f138c..000000000
--- a/src/utils/.gitkeep
+++ /dev/null
@@ -1 +0,0 @@
-keep
\ No newline at end of file
diff --git a/src/utils/config.ts b/src/utils/config.ts
deleted file mode 100644
index 7e91062fb..000000000
--- a/src/utils/config.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-export type Locale = (typeof locales)[number];
-
-export const locales = ["en", "es", "fr"] as const;
-export const defaultLocale: Locale = "en";
diff --git a/src/utils/formatDate.ts b/src/utils/formatDate.ts
deleted file mode 100644
index 67f5d2f01..000000000
--- a/src/utils/formatDate.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-export default function formatCreatedAt(createdAt: string): string {
- const createdDate = new Date(createdAt);
- const now = new Date();
- const diffInMs = now.getTime() - createdDate.getTime();
- const diffInSeconds = Math.floor(diffInMs / 1000);
- const diffInMinutes = Math.floor(diffInSeconds / 60);
- const diffInHours = Math.floor(diffInMinutes / 60);
-
- if (diffInSeconds < 60) {
- return `${diffInSeconds} second${diffInSeconds === 1 ? "" : "s"} ago`;
- } else if (diffInMinutes < 60) {
- return `${diffInMinutes} minute${diffInMinutes === 1 ? "" : "s"} ago`;
- } else if (diffInHours < 24) {
- return `${diffInHours} hour${diffInHours === 1 ? "" : "s"} ago`;
- } else {
- const options: Intl.DateTimeFormatOptions = {
- day: "numeric",
- month: "long",
- year: "numeric",
- };
- return createdDate.toLocaleDateString("en-US", options);
- }
-}
diff --git a/src/utils/index.ts b/src/utils/index.ts
index 40fb73a14..bb6f9a0e4 100644
--- a/src/utils/index.ts
+++ b/src/utils/index.ts
@@ -1,70 +1,9 @@
-/**
- * Mask the local part of an email address.
- * @function maskEmail
- * @param {string} email - The email address to be masked.
- * @returns {string} The masked email address.
- */
-export function maskEmail(email: string): string {
- const [localPart, domain] = email.split("@");
- if (localPart.length <= 2) {
- return `${localPart}***@${domain}`;
- }
- const maskedLocalPart = `${localPart.slice(0, 2)}***`;
- return `${maskedLocalPart}@${domain}`;
-}
-
-/**
- * Shrink a string to a specified length(len).
- * @function shrinkString
- * @param {string} str
- * @param {number} len
- * @returns {string}
- */
-export const shrinkString = ({
- str,
- len,
-}: {
- str?: string;
- len: number;
-}): string => {
- if (!str) return "";
- if (str.length > len) {
- return str.slice(0, Math.max(0, len)) + "...";
- }
- return str;
-};
-
-/**
- * Returns an Encrypted a string .
- * @function encryptString - Encodes or encrypts a string using a base64 Buffer
- * @returns A encoded string .
- */
-export const encryptString = (string_?: string): string => {
- if (!string_) return "";
- const buffer = Buffer.from(string_);
- return buffer.toString("base64");
-};
+import { clsx, type ClassValue } from 'clsx'
+import { twMerge } from 'tailwind-merge'
-/**
- * Decodes and Returns a string .
- * @function decryptString - Decodes or decrypts an encrypted string Buffer
- * @returns A decoded string .
- */
-
-export const decryptString = (string_?: string): string => {
- if (!string_) return "";
- const buffer = Buffer.from(string_, "base64");
- return buffer.toString();
-};
+export function cn(...inputs: ClassValue[]) {
+ return twMerge(clsx(inputs))
+}
-/**
- * Format the given time in seconds to a mm:ss string.
- * @function formatTime
- * @param {number} time - Time in seconds.
- * @returns {string} The formatted time string.
- */
-export const formatTime = (time: number): string => {
- const minutes = Math.floor(time / 60);
- const seconds = time % 60;
- return `${minutes}:${seconds < 10 ? "0" : ""}${seconds}`;
-};
+export const inDevEnvironment =
+ !!process && process.env.NODE_ENV === 'development'
diff --git a/src/utils/languages.ts b/src/utils/languages.ts
deleted file mode 100644
index c05f5ab08..000000000
--- a/src/utils/languages.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-export interface Language {
- code: string;
- name: string;
- flag: string;
-}
-
-export const languages: Language[] = [
- { code: "en", name: "EN - English", flag: "/images/flags/en.svg" },
- { code: "es", name: "ES - Español", flag: "/images/flags/es.svg" },
- { code: "fr", name: "FR - French", flag: "/images/flags/fr.svg" },
-];
diff --git a/src/utils/locale.ts b/src/utils/locale.ts
deleted file mode 100644
index 60e9cb981..000000000
--- a/src/utils/locale.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-"use server";
-
-import { cookies } from "next/headers";
-
-import { defaultLocale, Locale } from "./config";
-
-const COOKIE_NAME = "NEXT_LOCALE";
-
-export async function getUserLocale() {
- return cookies().get(COOKIE_NAME)?.value || defaultLocale;
-}
-
-export async function setUserLocale(locale: Locale) {
- cookies().set(COOKIE_NAME, locale);
-}
diff --git a/tailwind.config.ts b/tailwind.config.ts
index 53f29dd84..181562b77 100644
--- a/tailwind.config.ts
+++ b/tailwind.config.ts
@@ -1,151 +1,86 @@
-/* eslint-disable unicorn/prefer-module */
import type { Config } from "tailwindcss";
-const config = {
+const config: Config = {
darkMode: ["class"],
content: [
- "./pages/**/*.{ts,tsx}",
- "./components/**/*.{ts,tsx}",
- "./app/**/*.{ts,tsx}",
- "./src/**/*.{ts,tsx}",
+ "./src/pages/**/*.{js,ts,jsx,tsx,mdx}",
+ "./src/components/**/*.{js,ts,jsx,tsx,mdx}",
+ "./src/app/**/*.{js,ts,jsx,tsx,mdx}",
],
- prefix: "",
theme: {
- container: {
- center: true,
- padding: "2rem",
- screens: {
- "2xl": "1400px",
- },
- },
- extend: {
- colors: {
- border: "hsl(var(--border))",
- input: "hsl(var(--input))",
- ring: "hsl(var(--ring))",
- toastBg: "hsl(var(--toast-bg))",
- toastBorder: "hsl(var(--toast-border))",
- defaultBadgeBg: "hsl(var(--default-badge-bg))",
- primaryBadgeBg: "hsl(var(--primary-badge-bg))",
- successBadgeBg: "hsl(var(--success-badge-bg))",
- errorBadgeBg: "hsl(var(--red-badge-bg))",
- background: "hsl(var(--background))",
- foreground: "hsl(var(--foreground))",
- default: {
- DEFAULT: "hsl(var(--default))",
- foreground: "hsl(var(--default-foreground))",
- },
- primary: {
- DEFAULT: "hsl(var(--primary))",
- foreground: "hsl(var(--primary-foreground))",
- },
- secondary: {
- DEFAULT: "hsl(var(--secondary))",
- foreground: "hsl(var(--secondary-foreground))",
- },
- destructive: {
- DEFAULT: "hsl(var(--destructive))",
- hover: "hsl(var(--destructive-hover))",
- foreground: "hsl(var(--destructive-foreground))",
- },
- subtle: {
- DEFAULT: "hsl(var(--subtle))",
- hover: "hsl(var(--subtle-hover))",
- foreground: "hsl(var(--subtle-foreground))",
- },
- loading: {
- DEFAULT: "hsl(var(--loading))",
- hover: "hsl(var(--loading-hover))",
- foreground: "hsl(var(--loading-foreground))",
- },
- outline: {
- DEFAULT: "hsl(var(--outline))",
- hover: "hsl(var(--outline-hover))",
- foreground: "hsl(var(--outline-foreground))",
- },
- link: {
- DEFAULT: "hsl(var(--link))",
- },
- muted: {
- DEFAULT: "hsl(var(--muted))",
- foreground: "hsl(var(--muted-foreground))",
- },
- accent: {
- DEFAULT: "hsl(var(--accent))",
- foreground: "hsl(var(--accent-foreground))",
- },
- popover: {
- DEFAULT: "hsl(var(--popover))",
- foreground: "hsl(var(--popover-foreground))",
- },
- card: {
- DEFAULT: "hsl(var(--card))",
- foreground: "hsl(var(--card-foreground))",
- },
- error: {
- DEFAULT: "hsl(var(--error))",
- "50": "hsl(var(--error-50))",
- "700": "hsl(var(--error-700))",
- },
- success: {
- DEFAULT: "hsl(var(--success))",
- "50": "hsl(var(--success-50))",
- "700": "hsl(var(--success-700))",
- },
- warning: {
- DEFAULT: "hsl(var(--warning))",
- "50": "hsl(var(--warning-50))",
- },
- neutral: {
- dark: {
- 1: "hsl(var(--neutralColor-dark-1))",
- 2: "hsl(var(--neutralColor-dark-2))",
- },
- },
- stroke: {
- "colors-stroke": "hsl(var(--stroke-colors-stroke))",
- },
- breadcrumb: {
- page: "hsl(var(--breadcrumb-page))",
- foreground: "hsl(var(--breadcrumb-foreground))",
- },
- desaturatedBlue: "hsl(var(--desaturated-blue))",
- grey50: "hsl(var(--grey50))",
- blog: {
- relatedBg: "hsl(var(--blog-related-article-bg))",
- relatedHeading: "hsl(var(--blog-related-article-heading))",
- relatedTimeReadBg: "hsl(var(--blog-related-article-timeread-bg))",
- },
- },
- borderRadius: {
- lg: "var(--radius)",
- md: "calc(var(--radius) - 2px)",
- sm: "calc(var(--radius) - 4px)",
- },
- boxShadow: {
- spread: "0px 1px 18px 0px #0A39B01F",
- },
- keyframes: {
- "accordion-down": {
- from: { height: "0" },
- to: { height: "var(--radix-accordion-content-height)" },
- },
- "accordion-up": {
- from: { height: "var(--radix-accordion-content-height)" },
- to: { height: "0" },
- },
- },
- animation: {
- "accordion-down": "accordion-down 0.2s ease-out",
- "accordion-up": "accordion-up 0.2s ease-out",
- },
- },
+ extend: {
+ colors: {
+ background: 'hsl(var(--background))',
+ foreground: 'hsl(var(--foreground))',
+ card: {
+ DEFAULT: 'hsl(var(--card))',
+ foreground: 'hsl(var(--card-foreground))'
+ },
+ popover: {
+ DEFAULT: 'hsl(var(--popover))',
+ foreground: 'hsl(var(--popover-foreground))'
+ },
+ primary: {
+ DEFAULT: 'hsl(var(--primary))',
+ foreground: 'hsl(var(--primary-foreground))'
+ },
+ secondary: {
+ DEFAULT: 'hsl(var(--secondary))',
+ foreground: 'hsl(var(--secondary-foreground))'
+ },
+ muted: {
+ DEFAULT: 'hsl(var(--muted))',
+ foreground: 'hsl(var(--muted-foreground))'
+ },
+ accent: {
+ DEFAULT: 'hsl(var(--accent))',
+ foreground: 'hsl(var(--accent-foreground))'
+ },
+ destructive: {
+ DEFAULT: 'hsl(var(--destructive))',
+ foreground: 'hsl(var(--destructive-foreground))'
+ },
+ border: 'hsl(var(--border))',
+ input: 'hsl(var(--input))',
+ ring: 'hsl(var(--ring))',
+ chart: {
+ '1': 'hsl(var(--chart-1))',
+ '2': 'hsl(var(--chart-2))',
+ '3': 'hsl(var(--chart-3))',
+ '4': 'hsl(var(--chart-4))',
+ '5': 'hsl(var(--chart-5))'
+ }
+ },
+ borderRadius: {
+ lg: 'var(--radius)',
+ md: 'calc(var(--radius) - 2px)',
+ sm: 'calc(var(--radius) - 4px)'
+ },
+ keyframes: {
+ 'accordion-down': {
+ from: {
+ height: '0'
+ },
+ to: {
+ height: 'var(--radix-accordion-content-height)'
+ }
+ },
+ 'accordion-up': {
+ from: {
+ height: 'var(--radix-accordion-content-height)'
+ },
+ to: {
+ height: '0'
+ }
+ }
+ },
+ animation: {
+ 'accordion-down': 'accordion-down 0.2s ease-out',
+ 'accordion-up': 'accordion-up 0.2s ease-out'
+ }
+ }
},
-
- plugins: [
- require("tailwindcss-animate"),
- require("@mertasan/tailwindcss-variables"),
- ],
-} satisfies Config;
-
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
+ plugins: [require("tailwindcss-animate")],
+};
export default config;
diff --git a/tsconfig.json b/tsconfig.json
index 5fc51ec50..054497730 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -24,19 +24,20 @@
"paths": {
"~/*": [
"./src/*"
+ ],
+ "~ui/*": [
+ "./src/components/ui/*"
]
},
- "types": [
- "vitest/globals"
- ]
+ "target": "ES2017"
},
"include": [
"next-env.d.ts",
"**/*.ts",
"**/*.tsx",
".next/types/**/*.ts"
-, "src/app/dashboard/(user-dashboard)/settings/notification/_components" ],
+ ],
"exclude": [
"node_modules"
]
-}
\ No newline at end of file
+}
diff --git a/vitest.config.ts b/vitest.config.ts
deleted file mode 100644
index 8ef1206ac..000000000
--- a/vitest.config.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-import path from "node:path";
-import react from "@vitejs/plugin-react";
-import { defineConfig } from "vitest/config";
-
-export default defineConfig({
- plugins: [react()],
- resolve: {
- alias: {
- "~": path.resolve(import.meta.dirname, "./src"),
- },
- },
- test: {
- globals: true,
- environment: "jsdom",
- setupFiles: ["./src/test/setup.ts"],
- reporters: ["default", "html"],
- exclude: [
- "**/node_modules/**",
- "**/dist/**",
- "**/.react-email/**",
- "**/cypress/**",
- "**/.{idea,git,cache,output,temp}/**",
- "**/{karma,rollup,webpack,vite,vitest,jest,ava,babel,nyc,cypress,tsup,build,eslint,prettier}.config.*",
- ],
- coverage: {
- enabled: true,
- exclude: ["node_modules/", "src/test/", "src/main.tsx"],
- include: ["src/**/*.{js,jsx,ts,tsx}"],
- provider: "istanbul",
- reporter: ["text", "json-summary", "json", "html"],
- reportOnFailure: true,
- },
- },
-});