Format with prettier, remove unused npm packages

This commit is contained in:
cte 2025-05-11 21:26:08 -07:00
parent 7ee4693d7b
commit c85db6b9ff
15 changed files with 69 additions and 643 deletions

View file

@ -91,24 +91,24 @@ Clone this project and use it to create your own SaaS. You can check the live de
**Live demo: [SaaS Boilerplate](https://react-saas.com)**
| Landing Page | User Dashboard |
| --- | --- |
| Landing Page | User Dashboard |
| --------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| [![Next.js Boilerplate SaaS Landing Page](public/assets/images/nextjs-boilerplate-saas-landing-page.png)](https://react-saas.com) | [![Next.js Boilerplate SaaS User Dashboard](public/assets/images/nextjs-boilerplate-saas-user-dashboard.png)](https://react-saas.com/dashboard) |
| Team Management | User Profile |
| --- | --- |
| Team Management | User Profile |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [![Next.js Boilerplate SaaS Team Management](public/assets/images/nextjs-boilerplate-saas-multi-tenancy.png)](https://react-saas.com/dashboard/organization-profile/organization-members) | [![Next.js Boilerplate SaaS User Profile](public/assets/images/nextjs-boilerplate-saas-user-profile.png)](https://react-saas.com/dashboard/user-profile) |
| Sign Up | Sign In |
| --- | --- |
| Sign Up | Sign In |
| ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
| [![Next.js Boilerplate SaaS Sign Up](public/assets/images/nextjs-boilerplate-saas-sign-up.png)](https://react-saas.com/sign-up) | [![Next.js Boilerplate SaaS Sign In](public/assets/images/nextjs-boilerplate-saas-sign-in.png)](https://react-saas.com/sign-in) |
| Landing Page with Dark Mode (Pro Version) | User Dashboard with Dark Mode (Pro Version) |
| --- | --- |
| Landing Page with Dark Mode (Pro Version) | User Dashboard with Dark Mode (Pro Version) |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [![Next.js Boilerplate SaaS Landing Page Dark Mode](public/assets/images/nextjs-boilerplate-saas-landing-page-dark-mode.png)](https://pro-demo.nextjs-boilerplate.com) | [![Next.js Boilerplate SaaS User Dashboard Dark Mode](public/assets/images/nextjs-boilerplate-saas-user-dashboard-sidebar-dark-mode.png)](https://pro-demo.nextjs-boilerplate.com/dashboard) |
| User Dashboard with Sidebar (Pro Version) |
| --- |
| User Dashboard with Sidebar (Pro Version) |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [![Next.js Boilerplate SaaS User Dashboard Sidebar](public/assets/images/nextjs-boilerplate-saas-user-dashboard-sidebar.png)](https://pro-demo.nextjs-boilerplate.com) |
### Features

View file

@ -137,4 +137,4 @@
"schemas": {},
"tables": {}
}
}
}

View file

@ -10,4 +10,4 @@
"breakpoints": true
}
]
}
}

View file

@ -28,7 +28,6 @@
"@clerk/nextjs": "^6.18.3",
"@clerk/themes": "^2.1.36",
"@electric-sql/pglite": "^0.3.0",
"@hookform/resolvers": "^5.0.1",
"@logtail/pino": "^0.5.2",
"@radix-ui/react-dropdown-menu": "^2.1.14",
"@radix-ui/react-icons": "^1.3.2",
@ -38,14 +37,12 @@
"@spotlightjs/spotlight": "^2.5.0",
"@t3-oss/env-nextjs": "^0.13.4",
"@tailwindcss/postcss": "^4.1.6",
"@tanstack/react-table": "^8.20.5",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"drizzle-orm": "^0.43.1",
"lucide-react": "^0.509.0",
"next": "^15.3.2",
"next-intl": "^4.1.0",
"next-themes": "^0.4.6",
"pg": "^8.13.0",
"pino": "^9.5.0",
"pino-pretty": "^13.0.0",
@ -53,7 +50,6 @@
"react": "^19.1.0",
"react-dom": "^19.1.0",
"react-hook-form": "^7.53.0",
"sharp": "^0.34.1",
"stripe": "^18.1.0",
"tailwind-merge": "^3.3.0",
"zod": "^3.23.8"
@ -61,7 +57,6 @@
"devDependencies": {
"@clerk/testing": "^1.3.11",
"@eslint/js": "^9.26.0",
"@faker-js/faker": "^9.0.3",
"@next/bundle-analyzer": "^15.3.2",
"@next/eslint-plugin-next": "^15.3.2",
"@percy/cli": "1.30.10",
@ -87,7 +82,6 @@
"@vitest/expect": "^3.1.3",
"autoprefixer": "^10.4.20",
"cross-env": "^7.0.3",
"cssnano": "^7.0.6",
"dotenv-cli": "^8.0.0",
"drizzle-kit": "^0.31.1",
"eslint": "^9.26.0",

596
pnpm-lock.yaml generated
View file

@ -20,9 +20,6 @@ importers:
'@electric-sql/pglite':
specifier: ^0.3.0
version: 0.3.0
'@hookform/resolvers':
specifier: ^5.0.1
version: 5.0.1(react-hook-form@7.56.3(react@19.1.0))
'@logtail/pino':
specifier: ^0.5.2
version: 0.5.4(pino@9.6.0)
@ -50,9 +47,6 @@ importers:
'@tailwindcss/postcss':
specifier: ^4.1.6
version: 4.1.6
'@tanstack/react-table':
specifier: ^8.20.5
version: 8.21.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
class-variance-authority:
specifier: ^0.7.1
version: 0.7.1
@ -71,9 +65,6 @@ importers:
next-intl:
specifier: ^4.1.0
version: 4.1.0(next@15.3.2(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(typescript@5.8.3)
next-themes:
specifier: ^0.4.6
version: 0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
pg:
specifier: ^8.13.0
version: 8.15.6
@ -95,9 +86,6 @@ importers:
react-hook-form:
specifier: ^7.53.0
version: 7.56.3(react@19.1.0)
sharp:
specifier: ^0.34.1
version: 0.34.1
stripe:
specifier: ^18.1.0
version: 18.1.0(@types/node@22.15.17)
@ -114,9 +102,6 @@ importers:
'@eslint/js':
specifier: ^9.26.0
version: 9.26.0
'@faker-js/faker':
specifier: ^9.0.3
version: 9.7.0
'@next/bundle-analyzer':
specifier: ^15.3.2
version: 15.3.2
@ -192,9 +177,6 @@ importers:
cross-env:
specifier: ^7.0.3
version: 7.0.3
cssnano:
specifier: ^7.0.6
version: 7.0.7(postcss@8.5.3)
dotenv-cli:
specifier: ^8.0.0
version: 8.0.0
@ -1374,10 +1356,6 @@ packages:
resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@faker-js/faker@9.7.0':
resolution: {integrity: sha512-aozo5vqjCmDoXLNUJarFZx2IN/GgGaogY4TMJ6so/WLZOWpSV7fvj2dmrV6sEAnUm1O7aCrhTibjpzeDFgNqbg==}
engines: {node: '>=18.0.0', npm: '>=9.0.0'}
'@fastify/otel@0.6.0':
resolution: {integrity: sha512-lL+36KwGcFiAMcsPOLLsR+GV8ZpQuz5RLVstlgqmecTdQLTXVOe9Z8uwpMg9ktPcV++Ugp3dzzpBKNFWWWelYg==}
peerDependencies:
@ -1422,11 +1400,6 @@ packages:
'@hapi/topo@5.1.0':
resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==}
'@hookform/resolvers@5.0.1':
resolution: {integrity: sha512-u/+Jp83luQNx9AdyW2fIPGY6Y7NG68eN2ZW8FOJYL+M0i4s49+refdJdOp/A9n9HFQtQs3HIDHQvX3ZET2o7YA==}
peerDependencies:
react-hook-form: ^7.55.0
'@humanfs/core@0.19.1':
resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
engines: {node: '>=18.18.0'}
@ -3032,9 +3005,6 @@ packages:
engines: {node: '>=18'}
hasBin: true
'@standard-schema/utils@0.3.0':
resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==}
'@storybook/addon-actions@8.6.12':
resolution: {integrity: sha512-B5kfiRvi35oJ0NIo53CGH66H471A3XTzrfaa6SxXEJsgxxSeKScG5YeXcCvLiZfvANRQ7QDsmzPUgg0o3hdMXw==}
peerDependencies:
@ -3450,17 +3420,6 @@ packages:
'@tailwindcss/postcss@4.1.6':
resolution: {integrity: sha512-ELq+gDMBuRXPJlpE3PEen+1MhnHAQQrh2zF0dI1NXOlEWfr2qWf2CQdr5jl9yANv8RErQaQ2l6nIFO9OSCVq/g==}
'@tanstack/react-table@8.21.3':
resolution: {integrity: sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww==}
engines: {node: '>=12'}
peerDependencies:
react: '>=16.8'
react-dom: '>=16.8'
'@tanstack/table-core@8.21.3':
resolution: {integrity: sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==}
engines: {node: '>=12'}
'@testing-library/dom@10.4.0':
resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==}
engines: {node: '>=18'}
@ -3503,10 +3462,6 @@ packages:
'@tootallnate/quickjs-emscripten@0.23.0':
resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==}
'@trysound/sax@0.2.0':
resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==}
engines: {node: '>=10.13.0'}
'@tsconfig/node10@1.0.11':
resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==}
@ -4210,9 +4165,6 @@ packages:
resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
engines: {node: '>=10'}
caniuse-api@3.0.0:
resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==}
caniuse-lite@1.0.30001717:
resolution: {integrity: sha512-auPpttCq6BDEG8ZAuHJIplGw6GODhjw+/11e7IjpnYCxZcW/ONgPs0KVBJ0d1bY3e2+7PRe5RCLyP+PfwVgkYw==}
@ -4343,9 +4295,6 @@ packages:
resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==}
engines: {node: '>=12.5.0'}
colord@2.9.3:
resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==}
colorette@2.0.20:
resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==}
@ -4493,12 +4442,6 @@ packages:
resolution: {integrity: sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==}
engines: {node: '>= 0.10'}
css-declaration-sorter@7.2.0:
resolution: {integrity: sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==}
engines: {node: ^14 || ^16 || >=18}
peerDependencies:
postcss: ^8.0.9
css-loader@6.11.0:
resolution: {integrity: sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==}
engines: {node: '>= 12.13.0'}
@ -4514,17 +4457,6 @@ packages:
css-select@4.3.0:
resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==}
css-select@5.1.0:
resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==}
css-tree@2.2.1:
resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==}
engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
css-tree@2.3.1:
resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==}
engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
css-what@6.1.0:
resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==}
engines: {node: '>= 6'}
@ -4537,28 +4469,6 @@ packages:
engines: {node: '>=4'}
hasBin: true
cssnano-preset-default@7.0.7:
resolution: {integrity: sha512-jW6CG/7PNB6MufOrlovs1TvBTEVmhY45yz+bd0h6nw3h6d+1e+/TX+0fflZ+LzvZombbT5f+KC063w9VoHeHow==}
engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
peerDependencies:
postcss: ^8.4.32
cssnano-utils@5.0.1:
resolution: {integrity: sha512-ZIP71eQgG9JwjVZsTPSqhc6GHgEr53uJ7tK5///VfyWj6Xp2DBmixWHqJgPno+PqATzn48pL42ww9x5SSGmhZg==}
engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
peerDependencies:
postcss: ^8.4.32
cssnano@7.0.7:
resolution: {integrity: sha512-evKu7yiDIF7oS+EIpwFlMF730ijRyLFaM2o5cTxRGJR9OKHKkc+qP443ZEVR9kZG0syaAJJCPJyfv5pbrxlSng==}
engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
peerDependencies:
postcss: ^8.4.32
csso@5.0.5:
resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==}
engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
cssstyle@4.3.1:
resolution: {integrity: sha512-ZgW+Jgdd7i52AaLYCriF8Mxqft0gD/R9i9wi6RWBhs1pqdPEzPjym7rvRKi397WmQFf3SlyUsszhw+VVCbx79Q==}
engines: {node: '>=18'}
@ -4717,9 +4627,6 @@ packages:
dom-serializer@1.4.1:
resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==}
dom-serializer@2.0.0:
resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
domain-browser@4.23.0:
resolution: {integrity: sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA==}
engines: {node: '>=10'}
@ -4737,19 +4644,12 @@ packages:
resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==}
engines: {node: '>= 4'}
domhandler@5.0.3:
resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
engines: {node: '>= 4'}
domutils@1.7.0:
resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==}
domutils@2.8.0:
resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==}
domutils@3.2.2:
resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==}
dot-case@3.0.4:
resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==}
@ -4922,10 +4822,6 @@ packages:
entities@2.2.0:
resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==}
entities@4.5.0:
resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
engines: {node: '>=0.12'}
entities@6.0.0:
resolution: {integrity: sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==}
engines: {node: '>=0.12'}
@ -6313,15 +6209,9 @@ packages:
lodash.flattendeep@4.4.0:
resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==}
lodash.memoize@4.1.2:
resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==}
lodash.merge@4.6.2:
resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
lodash.uniq@4.5.0:
resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==}
lodash@4.17.21:
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
@ -6403,12 +6293,6 @@ packages:
md5.js@1.3.5:
resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==}
mdn-data@2.0.28:
resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==}
mdn-data@2.0.30:
resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==}
media-typer@1.1.0:
resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==}
engines: {node: '>= 0.8'}
@ -6565,12 +6449,6 @@ packages:
typescript:
optional: true
next-themes@0.4.6:
resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==}
peerDependencies:
react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc
react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc
next@15.3.2:
resolution: {integrity: sha512-CA3BatMyHkxZ48sgOCLdVHjFU36N7TF1HhqAHLFOkV6buwZnvMI84Cug8xD56B9mCuKrqXnLn94417GrZ/jjCQ==}
engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0}
@ -7015,48 +6893,6 @@ packages:
resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
engines: {node: '>= 0.4'}
postcss-calc@10.1.1:
resolution: {integrity: sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==}
engines: {node: ^18.12 || ^20.9 || >=22.0}
peerDependencies:
postcss: ^8.4.38
postcss-colormin@7.0.3:
resolution: {integrity: sha512-xZxQcSyIVZbSsl1vjoqZAcMYYdnJsIyG8OvqShuuqf12S88qQboxxEy0ohNCOLwVPXTU+hFHvJPACRL2B5ohTA==}
engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
peerDependencies:
postcss: ^8.4.32
postcss-convert-values@7.0.5:
resolution: {integrity: sha512-0VFhH8nElpIs3uXKnVtotDJJNX0OGYSZmdt4XfSfvOMrFw1jKfpwpZxfC4iN73CTM/MWakDEmsHQXkISYj4BXw==}
engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
peerDependencies:
postcss: ^8.4.32
postcss-discard-comments@7.0.4:
resolution: {integrity: sha512-6tCUoql/ipWwKtVP/xYiFf1U9QgJ0PUvxN7pTcsQ8Ns3Fnwq1pU5D5s1MhT/XySeLq6GXNvn37U46Ded0TckWg==}
engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
peerDependencies:
postcss: ^8.4.32
postcss-discard-duplicates@7.0.2:
resolution: {integrity: sha512-eTonaQvPZ/3i1ASDHOKkYwAybiM45zFIc7KXils4mQmHLqIswXD9XNOKEVxtTFnsmwYzF66u4LMgSr0abDlh5w==}
engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
peerDependencies:
postcss: ^8.4.32
postcss-discard-empty@7.0.1:
resolution: {integrity: sha512-cFrJKZvcg/uxB6Ijr4l6qmn3pXQBna9zyrPC+sK0zjbkDUZew+6xDltSF7OeB7rAtzaaMVYSdbod+sZOCWnMOg==}
engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
peerDependencies:
postcss: ^8.4.32
postcss-discard-overridden@7.0.1:
resolution: {integrity: sha512-7c3MMjjSZ/qYrx3uc1940GSOzN1Iqjtlqe8uoSg+qdVPYyRb0TILSqqmtlSFuE4mTDECwsm397Ya7iXGzfF7lg==}
engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
peerDependencies:
postcss: ^8.4.32
postcss-loader@8.1.1:
resolution: {integrity: sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==}
engines: {node: '>= 18.12.0'}
@ -7070,42 +6906,6 @@ packages:
webpack:
optional: true
postcss-merge-longhand@7.0.5:
resolution: {integrity: sha512-Kpu5v4Ys6QI59FxmxtNB/iHUVDn9Y9sYw66D6+SZoIk4QTz1prC4aYkhIESu+ieG1iylod1f8MILMs1Em3mmIw==}
engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
peerDependencies:
postcss: ^8.4.32
postcss-merge-rules@7.0.5:
resolution: {integrity: sha512-ZonhuSwEaWA3+xYbOdJoEReKIBs5eDiBVLAGpYZpNFPzXZcEE5VKR7/qBEQvTZpiwjqhhqEQ+ax5O3VShBj9Wg==}
engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
peerDependencies:
postcss: ^8.4.32
postcss-minify-font-values@7.0.1:
resolution: {integrity: sha512-2m1uiuJeTplll+tq4ENOQSzB8LRnSUChBv7oSyFLsJRtUgAAJGP6LLz0/8lkinTgxrmJSPOEhgY1bMXOQ4ZXhQ==}
engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
peerDependencies:
postcss: ^8.4.32
postcss-minify-gradients@7.0.1:
resolution: {integrity: sha512-X9JjaysZJwlqNkJbUDgOclyG3jZEpAMOfof6PUZjPnPrePnPG62pS17CjdM32uT1Uq1jFvNSff9l7kNbmMSL2A==}
engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
peerDependencies:
postcss: ^8.4.32
postcss-minify-params@7.0.3:
resolution: {integrity: sha512-vUKV2+f5mtjewYieanLX0xemxIp1t0W0H/D11u+kQV/MWdygOO7xPMkbK+r9P6Lhms8MgzKARF/g5OPXhb8tgg==}
engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
peerDependencies:
postcss: ^8.4.32
postcss-minify-selectors@7.0.5:
resolution: {integrity: sha512-x2/IvofHcdIrAm9Q+p06ZD1h6FPcQ32WtCRVodJLDR+WMn8EVHI1kvLxZuGKz/9EY5nAmI6lIQIrpo4tBy5+ug==}
engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
peerDependencies:
postcss: ^8.4.32
postcss-modules-extract-imports@3.1.0:
resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==}
engines: {node: ^10 || ^12 || >= 14}
@ -7130,94 +6930,10 @@ packages:
peerDependencies:
postcss: ^8.1.0
postcss-normalize-charset@7.0.1:
resolution: {integrity: sha512-sn413ofhSQHlZFae//m9FTOfkmiZ+YQXsbosqOWRiVQncU2BA3daX3n0VF3cG6rGLSFVc5Di/yns0dFfh8NFgQ==}
engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
peerDependencies:
postcss: ^8.4.32
postcss-normalize-display-values@7.0.1:
resolution: {integrity: sha512-E5nnB26XjSYz/mGITm6JgiDpAbVuAkzXwLzRZtts19jHDUBFxZ0BkXAehy0uimrOjYJbocby4FVswA/5noOxrQ==}
engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
peerDependencies:
postcss: ^8.4.32
postcss-normalize-positions@7.0.1:
resolution: {integrity: sha512-pB/SzrIP2l50ZIYu+yQZyMNmnAcwyYb9R1fVWPRxm4zcUFCY2ign7rcntGFuMXDdd9L2pPNUgoODDk91PzRZuQ==}
engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
peerDependencies:
postcss: ^8.4.32
postcss-normalize-repeat-style@7.0.1:
resolution: {integrity: sha512-NsSQJ8zj8TIDiF0ig44Byo3Jk9e4gNt9x2VIlJudnQQ5DhWAHJPF4Tr1ITwyHio2BUi/I6Iv0HRO7beHYOloYQ==}
engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
peerDependencies:
postcss: ^8.4.32
postcss-normalize-string@7.0.1:
resolution: {integrity: sha512-QByrI7hAhsoze992kpbMlJSbZ8FuCEc1OT9EFbZ6HldXNpsdpZr+YXC5di3UEv0+jeZlHbZcoCADgb7a+lPmmQ==}
engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
peerDependencies:
postcss: ^8.4.32
postcss-normalize-timing-functions@7.0.1:
resolution: {integrity: sha512-bHifyuuSNdKKsnNJ0s8fmfLMlvsQwYVxIoUBnowIVl2ZAdrkYQNGVB4RxjfpvkMjipqvbz0u7feBZybkl/6NJg==}
engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
peerDependencies:
postcss: ^8.4.32
postcss-normalize-unicode@7.0.3:
resolution: {integrity: sha512-EcoA29LvG3F+EpOh03iqu+tJY3uYYKzArqKJHxDhUYLa2u58aqGq16K6/AOsXD9yqLN8O6y9mmePKN5cx6krOw==}
engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
peerDependencies:
postcss: ^8.4.32
postcss-normalize-url@7.0.1:
resolution: {integrity: sha512-sUcD2cWtyK1AOL/82Fwy1aIVm/wwj5SdZkgZ3QiUzSzQQofrbq15jWJ3BA7Z+yVRwamCjJgZJN0I9IS7c6tgeQ==}
engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
peerDependencies:
postcss: ^8.4.32
postcss-normalize-whitespace@7.0.1:
resolution: {integrity: sha512-vsbgFHMFQrJBJKrUFJNZ2pgBeBkC2IvvoHjz1to0/0Xk7sII24T0qFOiJzG6Fu3zJoq/0yI4rKWi7WhApW+EFA==}
engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
peerDependencies:
postcss: ^8.4.32
postcss-ordered-values@7.0.2:
resolution: {integrity: sha512-AMJjt1ECBffF7CEON/Y0rekRLS6KsePU6PRP08UqYW4UGFRnTXNrByUzYK1h8AC7UWTZdQ9O3Oq9kFIhm0SFEw==}
engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
peerDependencies:
postcss: ^8.4.32
postcss-reduce-initial@7.0.3:
resolution: {integrity: sha512-RFvkZaqiWtGMlVjlUHpaxGqEL27lgt+Q2Ixjf83CRAzqdo+TsDyGPtJUbPx2MuYIJ+sCQc2TrOvRnhcXQfgIVA==}
engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
peerDependencies:
postcss: ^8.4.32
postcss-reduce-transforms@7.0.1:
resolution: {integrity: sha512-MhyEbfrm+Mlp/36hvZ9mT9DaO7dbncU0CvWI8V93LRkY6IYlu38OPg3FObnuKTUxJ4qA8HpurdQOo5CyqqO76g==}
engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
peerDependencies:
postcss: ^8.4.32
postcss-selector-parser@7.1.0:
resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==}
engines: {node: '>=4'}
postcss-svgo@7.0.2:
resolution: {integrity: sha512-5Dzy66JlnRM6pkdOTF8+cGsB1fnERTE8Nc+Eed++fOWo1hdsBptCsbG8UuJkgtZt75bRtMJIrPeZmtfANixdFA==}
engines: {node: ^18.12.0 || ^20.9.0 || >= 18}
peerDependencies:
postcss: ^8.4.32
postcss-unique-selectors@7.0.4:
resolution: {integrity: sha512-pmlZjsmEAG7cHd7uK3ZiNSW6otSZ13RHuZ/4cDN/bVglS5EpF2r2oxY99SuOHa8m7AWoBCelTS3JPpzsIs8skQ==}
engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
peerDependencies:
postcss: ^8.4.32
postcss-value-parser@4.2.0:
resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
@ -8070,12 +7786,6 @@ packages:
babel-plugin-macros:
optional: true
stylehacks@7.0.5:
resolution: {integrity: sha512-5kNb7V37BNf0Q3w+1pxfa+oiNPS++/b4Jil9e/kPDgrk1zjEd6uR7SZeJiYaLYH6RRSC1XX2/37OTeU/4FvuIA==}
engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
peerDependencies:
postcss: ^8.4.32
supports-color@5.5.0:
resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
engines: {node: '>=4'}
@ -8092,11 +7802,6 @@ packages:
resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
engines: {node: '>= 0.4'}
svgo@3.3.2:
resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==}
engines: {node: '>=14.0.0'}
hasBin: true
swr@2.3.3:
resolution: {integrity: sha512-dshNvs3ExOqtZ6kJBaAsabhPdHyeY4P2cKwRCniDVifBMoG/SVI7tfLWqPXriVspf2Rg4tPzXJTnwaihIeFw2A==}
peerDependencies:
@ -10000,8 +9705,6 @@ snapshots:
'@eslint/core': 0.13.0
levn: 0.4.1
'@faker-js/faker@9.7.0': {}
'@fastify/otel@0.6.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
@ -10064,11 +9767,6 @@ snapshots:
dependencies:
'@hapi/hoek': 9.3.0
'@hookform/resolvers@5.0.1(react-hook-form@7.56.3(react@19.1.0))':
dependencies:
'@standard-schema/utils': 0.3.0
react-hook-form: 7.56.3(react@19.1.0)
'@humanfs/core@0.19.1': {}
'@humanfs/node@0.16.6':
@ -11911,8 +11609,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@standard-schema/utils@0.3.0': {}
'@storybook/addon-actions@8.6.12(storybook@8.6.12(prettier@3.5.3))':
dependencies:
'@storybook/global': 5.0.0
@ -12440,14 +12136,6 @@ snapshots:
postcss: 8.5.3
tailwindcss: 4.1.6
'@tanstack/react-table@8.21.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
dependencies:
'@tanstack/table-core': 8.21.3
react: 19.1.0
react-dom: 19.1.0(react@19.1.0)
'@tanstack/table-core@8.21.3': {}
'@testing-library/dom@10.4.0':
dependencies:
'@babel/code-frame': 7.27.1
@ -12498,8 +12186,6 @@ snapshots:
'@tootallnate/quickjs-emscripten@0.23.0': {}
'@trysound/sax@0.2.0': {}
'@tsconfig/node10@1.0.11':
optional: true
@ -13405,13 +13091,6 @@ snapshots:
camelcase@6.3.0: {}
caniuse-api@3.0.0:
dependencies:
browserslist: 4.24.5
caniuse-lite: 1.0.30001717
lodash.memoize: 4.1.2
lodash.uniq: 4.5.0
caniuse-lite@1.0.30001717: {}
case-sensitive-paths-webpack-plugin@2.4.0: {}
@ -13532,13 +13211,13 @@ snapshots:
dependencies:
color-name: 1.1.4
simple-swizzle: 0.2.2
optional: true
color@4.2.3:
dependencies:
color-convert: 2.0.1
color-string: 1.9.1
colord@2.9.3: {}
optional: true
colorette@2.0.20: {}
@ -13702,10 +13381,6 @@ snapshots:
randombytes: 2.1.0
randomfill: 1.0.4
css-declaration-sorter@7.2.0(postcss@8.5.3):
dependencies:
postcss: 8.5.3
css-loader@6.11.0(webpack@5.99.8(@swc/core@1.11.24)(esbuild@0.25.4)):
dependencies:
icss-utils: 5.1.0(postcss@8.5.3)
@ -13727,78 +13402,12 @@ snapshots:
domutils: 2.8.0
nth-check: 2.1.1
css-select@5.1.0:
dependencies:
boolbase: 1.0.0
css-what: 6.1.0
domhandler: 5.0.3
domutils: 3.2.2
nth-check: 2.1.1
css-tree@2.2.1:
dependencies:
mdn-data: 2.0.28
source-map-js: 1.2.1
css-tree@2.3.1:
dependencies:
mdn-data: 2.0.30
source-map-js: 1.2.1
css-what@6.1.0: {}
css.escape@1.5.1: {}
cssesc@3.0.0: {}
cssnano-preset-default@7.0.7(postcss@8.5.3):
dependencies:
browserslist: 4.24.5
css-declaration-sorter: 7.2.0(postcss@8.5.3)
cssnano-utils: 5.0.1(postcss@8.5.3)
postcss: 8.5.3
postcss-calc: 10.1.1(postcss@8.5.3)
postcss-colormin: 7.0.3(postcss@8.5.3)
postcss-convert-values: 7.0.5(postcss@8.5.3)
postcss-discard-comments: 7.0.4(postcss@8.5.3)
postcss-discard-duplicates: 7.0.2(postcss@8.5.3)
postcss-discard-empty: 7.0.1(postcss@8.5.3)
postcss-discard-overridden: 7.0.1(postcss@8.5.3)
postcss-merge-longhand: 7.0.5(postcss@8.5.3)
postcss-merge-rules: 7.0.5(postcss@8.5.3)
postcss-minify-font-values: 7.0.1(postcss@8.5.3)
postcss-minify-gradients: 7.0.1(postcss@8.5.3)
postcss-minify-params: 7.0.3(postcss@8.5.3)
postcss-minify-selectors: 7.0.5(postcss@8.5.3)
postcss-normalize-charset: 7.0.1(postcss@8.5.3)
postcss-normalize-display-values: 7.0.1(postcss@8.5.3)
postcss-normalize-positions: 7.0.1(postcss@8.5.3)
postcss-normalize-repeat-style: 7.0.1(postcss@8.5.3)
postcss-normalize-string: 7.0.1(postcss@8.5.3)
postcss-normalize-timing-functions: 7.0.1(postcss@8.5.3)
postcss-normalize-unicode: 7.0.3(postcss@8.5.3)
postcss-normalize-url: 7.0.1(postcss@8.5.3)
postcss-normalize-whitespace: 7.0.1(postcss@8.5.3)
postcss-ordered-values: 7.0.2(postcss@8.5.3)
postcss-reduce-initial: 7.0.3(postcss@8.5.3)
postcss-reduce-transforms: 7.0.1(postcss@8.5.3)
postcss-svgo: 7.0.2(postcss@8.5.3)
postcss-unique-selectors: 7.0.4(postcss@8.5.3)
cssnano-utils@5.0.1(postcss@8.5.3):
dependencies:
postcss: 8.5.3
cssnano@7.0.7(postcss@8.5.3):
dependencies:
cssnano-preset-default: 7.0.7(postcss@8.5.3)
lilconfig: 3.1.3
postcss: 8.5.3
csso@5.0.5:
dependencies:
css-tree: 2.2.1
cssstyle@4.3.1:
dependencies:
'@asamuzakjp/css-color': 3.1.7
@ -13941,12 +13550,6 @@ snapshots:
domhandler: 4.3.1
entities: 2.2.0
dom-serializer@2.0.0:
dependencies:
domelementtype: 2.3.0
domhandler: 5.0.3
entities: 4.5.0
domain-browser@4.23.0: {}
domelementtype@1.3.1: {}
@ -13961,10 +13564,6 @@ snapshots:
dependencies:
domelementtype: 2.3.0
domhandler@5.0.3:
dependencies:
domelementtype: 2.3.0
domutils@1.7.0:
dependencies:
dom-serializer: 0.2.2
@ -13976,12 +13575,6 @@ snapshots:
domelementtype: 2.3.0
domhandler: 4.3.1
domutils@3.2.2:
dependencies:
dom-serializer: 2.0.0
domelementtype: 2.3.0
domhandler: 5.0.3
dot-case@3.0.4:
dependencies:
no-case: 3.0.4
@ -14074,8 +13667,6 @@ snapshots:
entities@2.2.0: {}
entities@4.5.0: {}
entities@6.0.0: {}
env-paths@2.2.1: {}
@ -15090,7 +14681,8 @@ snapshots:
is-arrayish@0.2.1: {}
is-arrayish@0.3.2: {}
is-arrayish@0.3.2:
optional: true
is-async-function@2.1.1:
dependencies:
@ -15921,12 +15513,8 @@ snapshots:
lodash.flattendeep@4.4.0: {}
lodash.memoize@4.1.2: {}
lodash.merge@4.6.2: {}
lodash.uniq@4.5.0: {}
lodash@4.17.21: {}
log-update@6.1.0:
@ -16006,10 +15594,6 @@ snapshots:
inherits: 2.0.4
safe-buffer: 5.2.1
mdn-data@2.0.28: {}
mdn-data@2.0.30: {}
media-typer@1.1.0: {}
memfs@3.5.3:
@ -16120,11 +15704,6 @@ snapshots:
optionalDependencies:
typescript: 5.8.3
next-themes@0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
dependencies:
react: 19.1.0
react-dom: 19.1.0(react@19.1.0)
next@15.3.2(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
dependencies:
'@next/env': 15.3.2
@ -16652,43 +16231,6 @@ snapshots:
possible-typed-array-names@1.1.0: {}
postcss-calc@10.1.1(postcss@8.5.3):
dependencies:
postcss: 8.5.3
postcss-selector-parser: 7.1.0
postcss-value-parser: 4.2.0
postcss-colormin@7.0.3(postcss@8.5.3):
dependencies:
browserslist: 4.24.5
caniuse-api: 3.0.0
colord: 2.9.3
postcss: 8.5.3
postcss-value-parser: 4.2.0
postcss-convert-values@7.0.5(postcss@8.5.3):
dependencies:
browserslist: 4.24.5
postcss: 8.5.3
postcss-value-parser: 4.2.0
postcss-discard-comments@7.0.4(postcss@8.5.3):
dependencies:
postcss: 8.5.3
postcss-selector-parser: 7.1.0
postcss-discard-duplicates@7.0.2(postcss@8.5.3):
dependencies:
postcss: 8.5.3
postcss-discard-empty@7.0.1(postcss@8.5.3):
dependencies:
postcss: 8.5.3
postcss-discard-overridden@7.0.1(postcss@8.5.3):
dependencies:
postcss: 8.5.3
postcss-loader@8.1.1(postcss@8.5.3)(typescript@5.8.3)(webpack@5.99.8(@swc/core@1.11.24)(esbuild@0.25.4)):
dependencies:
cosmiconfig: 9.0.0(typescript@5.8.3)
@ -16700,45 +16242,6 @@ snapshots:
transitivePeerDependencies:
- typescript
postcss-merge-longhand@7.0.5(postcss@8.5.3):
dependencies:
postcss: 8.5.3
postcss-value-parser: 4.2.0
stylehacks: 7.0.5(postcss@8.5.3)
postcss-merge-rules@7.0.5(postcss@8.5.3):
dependencies:
browserslist: 4.24.5
caniuse-api: 3.0.0
cssnano-utils: 5.0.1(postcss@8.5.3)
postcss: 8.5.3
postcss-selector-parser: 7.1.0
postcss-minify-font-values@7.0.1(postcss@8.5.3):
dependencies:
postcss: 8.5.3
postcss-value-parser: 4.2.0
postcss-minify-gradients@7.0.1(postcss@8.5.3):
dependencies:
colord: 2.9.3
cssnano-utils: 5.0.1(postcss@8.5.3)
postcss: 8.5.3
postcss-value-parser: 4.2.0
postcss-minify-params@7.0.3(postcss@8.5.3):
dependencies:
browserslist: 4.24.5
cssnano-utils: 5.0.1(postcss@8.5.3)
postcss: 8.5.3
postcss-value-parser: 4.2.0
postcss-minify-selectors@7.0.5(postcss@8.5.3):
dependencies:
cssesc: 3.0.0
postcss: 8.5.3
postcss-selector-parser: 7.1.0
postcss-modules-extract-imports@3.1.0(postcss@8.5.3):
dependencies:
postcss: 8.5.3
@ -16760,84 +16263,11 @@ snapshots:
icss-utils: 5.1.0(postcss@8.5.3)
postcss: 8.5.3
postcss-normalize-charset@7.0.1(postcss@8.5.3):
dependencies:
postcss: 8.5.3
postcss-normalize-display-values@7.0.1(postcss@8.5.3):
dependencies:
postcss: 8.5.3
postcss-value-parser: 4.2.0
postcss-normalize-positions@7.0.1(postcss@8.5.3):
dependencies:
postcss: 8.5.3
postcss-value-parser: 4.2.0
postcss-normalize-repeat-style@7.0.1(postcss@8.5.3):
dependencies:
postcss: 8.5.3
postcss-value-parser: 4.2.0
postcss-normalize-string@7.0.1(postcss@8.5.3):
dependencies:
postcss: 8.5.3
postcss-value-parser: 4.2.0
postcss-normalize-timing-functions@7.0.1(postcss@8.5.3):
dependencies:
postcss: 8.5.3
postcss-value-parser: 4.2.0
postcss-normalize-unicode@7.0.3(postcss@8.5.3):
dependencies:
browserslist: 4.24.5
postcss: 8.5.3
postcss-value-parser: 4.2.0
postcss-normalize-url@7.0.1(postcss@8.5.3):
dependencies:
postcss: 8.5.3
postcss-value-parser: 4.2.0
postcss-normalize-whitespace@7.0.1(postcss@8.5.3):
dependencies:
postcss: 8.5.3
postcss-value-parser: 4.2.0
postcss-ordered-values@7.0.2(postcss@8.5.3):
dependencies:
cssnano-utils: 5.0.1(postcss@8.5.3)
postcss: 8.5.3
postcss-value-parser: 4.2.0
postcss-reduce-initial@7.0.3(postcss@8.5.3):
dependencies:
browserslist: 4.24.5
caniuse-api: 3.0.0
postcss: 8.5.3
postcss-reduce-transforms@7.0.1(postcss@8.5.3):
dependencies:
postcss: 8.5.3
postcss-value-parser: 4.2.0
postcss-selector-parser@7.1.0:
dependencies:
cssesc: 3.0.0
util-deprecate: 1.0.2
postcss-svgo@7.0.2(postcss@8.5.3):
dependencies:
postcss: 8.5.3
postcss-value-parser: 4.2.0
svgo: 3.3.2
postcss-unique-selectors@7.0.4(postcss@8.5.3):
dependencies:
postcss: 8.5.3
postcss-selector-parser: 7.1.0
postcss-value-parser@4.2.0: {}
postcss@8.4.31:
@ -17490,6 +16920,7 @@ snapshots:
'@img/sharp-wasm32': 0.34.1
'@img/sharp-win32-ia32': 0.34.1
'@img/sharp-win32-x64': 0.34.1
optional: true
shebang-command@1.2.0:
dependencies:
@ -17544,6 +16975,7 @@ snapshots:
simple-swizzle@0.2.2:
dependencies:
is-arrayish: 0.3.2
optional: true
sirv@2.0.4:
dependencies:
@ -17851,12 +17283,6 @@ snapshots:
optionalDependencies:
'@babel/core': 7.27.1
stylehacks@7.0.5(postcss@8.5.3):
dependencies:
browserslist: 4.24.5
postcss: 8.5.3
postcss-selector-parser: 7.1.0
supports-color@5.5.0:
dependencies:
has-flag: 3.0.0
@ -17871,16 +17297,6 @@ snapshots:
supports-preserve-symlinks-flag@1.0.0: {}
svgo@3.3.2:
dependencies:
'@trysound/sax': 0.2.0
commander: 7.2.0
css-select: 5.1.0
css-tree: 2.3.1
css-what: 6.1.0
csso: 5.0.5
picocolors: 1.1.1
swr@2.3.3(react@19.1.0):
dependencies:
dequal: 2.0.3

View file

@ -1,8 +1,6 @@
export const DemoBadge = () => (
<div className="fixed bottom-0 right-20 z-10">
<a
href="https://react-saas.com"
>
<a href="https://react-saas.com">
<div className="rounded-md bg-gray-900 px-3 py-2 font-semibold text-gray-100">
<span className="text-gray-500">Demo of</span>
{' SaaS Boilerplate'}

View file

@ -4,7 +4,7 @@ import { useMenu } from './UseMenu';
describe('UseMenu', () => {
describe('Render hook', () => {
it('shouldn\'t show the menu by default', async () => {
it("shouldn't show the menu by default", async () => {
const { result } = renderHook(() => useMenu());
expect(result.current.showMenu).toBeFalsy();
@ -20,7 +20,7 @@ describe('UseMenu', () => {
expect(result.current.showMenu).toBeTruthy();
});
it('shouldn\'t make the menu visible after toggling and closing the menu', () => {
it("shouldn't make the menu visible after toggling and closing the menu", () => {
const { result } = renderHook(() => useMenu());
act(() => {
@ -30,7 +30,7 @@ describe('UseMenu', () => {
expect(result.current.showMenu).toBeFalsy();
});
it('shouldn\'t make the menu visible after toggling the menu twice', () => {
it("shouldn't make the menu visible after toggling the menu twice", () => {
const { result } = renderHook(() => useMenu());
act(() => {

View file

@ -8,7 +8,7 @@ export const useMenu = () => {
const [showMenu, setShowMenu] = useState(false);
const handleToggleMenu = () => {
setShowMenu(prevState => !prevState);
setShowMenu((prevState) => !prevState);
};
const handleClose = () => {

View file

@ -3,7 +3,10 @@ import path from 'node:path';
import { PGlite } from '@electric-sql/pglite';
import { drizzle as drizzlePg } from 'drizzle-orm/node-postgres';
import { migrate as migratePg } from 'drizzle-orm/node-postgres/migrator';
import { drizzle as drizzlePglite, type PgliteDatabase } from 'drizzle-orm/pglite';
import {
drizzle as drizzlePglite,
type PgliteDatabase,
} from 'drizzle-orm/pglite';
import { migrate as migratePglite } from 'drizzle-orm/pglite/migrator';
import { PHASE_PRODUCTION_BUILD } from 'next/dist/shared/lib/constants';
import { Client } from 'pg';
@ -27,7 +30,10 @@ if (process.env.NEXT_PHASE !== PHASE_PRODUCTION_BUILD && Env.DATABASE_URL) {
});
} else {
// Stores the db connection in the global scope to prevent multiple instances due to hot reloading with Next.js
const global = globalThis as unknown as { client: PGlite; drizzle: PgliteDatabase<typeof schema> };
const global = globalThis as unknown as {
client: PGlite;
drizzle: PgliteDatabase<typeof schema>;
};
if (!global.client) {
global.client = new PGlite();

View file

@ -16,7 +16,7 @@ export const Features = () => {
>
<div className="grid grid-cols-1 gap-x-3 gap-y-8 md:grid-cols-3">
<FeatureCard
icon={(
icon={
<svg
className="stroke-primary-foreground stroke-2"
xmlns="http://www.w3.org/2000/svg"
@ -28,14 +28,14 @@ export const Features = () => {
<path d="M0 0h24v24H0z" stroke="none" />
<path d="M12 3l8 4.5v9L12 21l-8-4.5v-9L12 3M12 12l8-4.5M12 12v9M12 12L4 7.5" />
</svg>
)}
}
title={t('feature1_title')}
>
{t('feature_description')}
</FeatureCard>
<FeatureCard
icon={(
icon={
<svg
className="stroke-primary-foreground stroke-2"
xmlns="http://www.w3.org/2000/svg"
@ -47,14 +47,14 @@ export const Features = () => {
<path d="M0 0h24v24H0z" stroke="none" />
<path d="M12 3l8 4.5v9L12 21l-8-4.5v-9L12 3M12 12l8-4.5M12 12v9M12 12L4 7.5" />
</svg>
)}
}
title={t('feature2_title')}
>
{t('feature_description')}
</FeatureCard>
<FeatureCard
icon={(
icon={
<svg
className="stroke-primary-foreground stroke-2"
xmlns="http://www.w3.org/2000/svg"
@ -66,14 +66,14 @@ export const Features = () => {
<path d="M0 0h24v24H0z" stroke="none" />
<path d="M12 3l8 4.5v9L12 21l-8-4.5v-9L12 3M12 12l8-4.5M12 12v9M12 12L4 7.5" />
</svg>
)}
}
title={t('feature3_title')}
>
{t('feature_description')}
</FeatureCard>
<FeatureCard
icon={(
icon={
<svg
className="stroke-primary-foreground stroke-2"
xmlns="http://www.w3.org/2000/svg"
@ -85,14 +85,14 @@ export const Features = () => {
<path d="M0 0h24v24H0z" stroke="none" />
<path d="M12 3l8 4.5v9L12 21l-8-4.5v-9L12 3M12 12l8-4.5M12 12v9M12 12L4 7.5" />
</svg>
)}
}
title={t('feature4_title')}
>
{t('feature_description')}
</FeatureCard>
<FeatureCard
icon={(
icon={
<svg
className="stroke-primary-foreground stroke-2"
xmlns="http://www.w3.org/2000/svg"
@ -104,14 +104,14 @@ export const Features = () => {
<path d="M0 0h24v24H0z" stroke="none" />
<path d="M12 3l8 4.5v9L12 21l-8-4.5v-9L12 3M12 12l8-4.5M12 12v9M12 12L4 7.5" />
</svg>
)}
}
title={t('feature5_title')}
>
{t('feature_description')}
</FeatureCard>
<FeatureCard
icon={(
icon={
<svg
className="stroke-primary-foreground stroke-2"
xmlns="http://www.w3.org/2000/svg"
@ -123,7 +123,7 @@ export const Features = () => {
<path d="M0 0h24v24H0z" stroke="none" />
<path d="M12 3l8 4.5v9L12 21l-8-4.5v-9L12 3M12 12l8-4.5M12 12v9M12 12L4 7.5" />
</svg>
)}
}
title={t('feature6_title')}
>
{t('feature_description')}

View file

@ -15,7 +15,7 @@ export const Footer = () => {
<CenteredFooter
logo={<Logo />}
name={AppConfig.name}
iconList={(
iconList={
<>
<li>
<Link href="/">
@ -73,8 +73,8 @@ export const Footer = () => {
</Link>
</li>
</>
)}
legalLinks={(
}
legalLinks={
<>
<li>
<Link href="/sign-up">{t('terms_of_service')}</Link>
@ -83,7 +83,7 @@ export const Footer = () => {
<Link href="/sign-up">{t('privacy_policy')}</Link>
</li>
</>
)}
}
>
<li>
<Link href="/sign-up">{t('product')}</Link>

View file

@ -1,8 +1,6 @@
import { AppConfig } from '@/utils/AppConfig';
export const Logo = (props: {
isTextHidden?: boolean;
}) => (
export const Logo = (props: { isTextHidden?: boolean }) => (
<div className="flex items-center text-xl font-semibold">
<svg
className="mr-1 size-8 stroke-current stroke-2"

View file

@ -2,18 +2,26 @@ import { expect, test } from '@playwright/test';
test.describe('I18n', () => {
test.describe('Language Switching', () => {
test('should switch language from English to French using dropdown and verify text on the homepage', async ({ page }) => {
test('should switch language from English to French using dropdown and verify text on the homepage', async ({
page,
}) => {
await page.goto('/');
await expect(page.getByText('The perfect SaaS template to build')).toBeVisible();
await expect(
page.getByText('The perfect SaaS template to build'),
).toBeVisible();
await page.getByRole('button', { name: 'lang-switcher' }).click();
await page.getByText('Français').click();
await expect(page.getByText('Le parfait SaaS template pour construire')).toBeVisible();
await expect(
page.getByText('Le parfait SaaS template pour construire'),
).toBeVisible();
});
test('should switch language from English to French using URL and verify text on the sign-in page', async ({ page }) => {
test('should switch language from English to French using URL and verify text on the sign-in page', async ({
page,
}) => {
await page.goto('/sign-in');
await expect(page.getByText('Email address')).toBeVisible();

View file

@ -17,7 +17,9 @@ test.describe('Sanity', () => {
test('should display the homepage', async ({ page, baseURL }) => {
await page.goto(`${baseURL}/`);
await expect(page.getByText('The perfect SaaS template to build')).toBeVisible();
await expect(
page.getByText('The perfect SaaS template to build'),
).toBeVisible();
});
});
});

View file

@ -6,7 +6,9 @@ test.describe('Visual testing', () => {
test('should take screenshot of the homepage', async ({ page }) => {
await page.goto('/');
await expect(page.getByText('The perfect SaaS template to build')).toBeVisible();
await expect(
page.getByText('The perfect SaaS template to build'),
).toBeVisible();
await percySnapshot(page, 'Homepage');
});
@ -14,7 +16,9 @@ test.describe('Visual testing', () => {
test('should take screenshot of the French homepage', async ({ page }) => {
await page.goto('/fr');
await expect(page.getByText('Le parfait SaaS template pour construire')).toBeVisible();
await expect(
page.getByText('Le parfait SaaS template pour construire'),
).toBeVisible();
await percySnapshot(page, 'Homepage - French');
});