Nguyen Thanh Hoang Hoang Nguyen commited on
Commit
4901b1e
·
unverified ·
1 Parent(s): f75d7fa

feature/homepage (#1)

Browse files

* feat(homepage): implement banner section

* feat(homepage): add 2 sections in homepage

---------

Co-authored-by: Hoang Nguyen <hoangnt@inspirelab.vn>

Files changed (40) hide show
  1. next.config.ts +20 -16
  2. package-lock.json +41 -220
  3. package.json +4 -0
  4. src/app/[locale]/(auth)/(center)/layout.tsx +0 -15
  5. src/app/[locale]/(auth)/(center)/sign-in/[[...sign-in]]/page.tsx +0 -29
  6. src/app/[locale]/(auth)/(center)/sign-up/[[...sign-up]]/page.tsx +0 -29
  7. src/app/[locale]/(auth)/dashboard/layout.tsx +0 -59
  8. src/app/[locale]/(auth)/dashboard/page.tsx +0 -24
  9. src/app/[locale]/(auth)/dashboard/user-profile/[[...user-profile]]/page.tsx +0 -32
  10. src/app/[locale]/(auth)/layout.tsx +0 -41
  11. src/app/[locale]/(marketing)/about/page.tsx +0 -54
  12. src/app/[locale]/(marketing)/api/counter/route.ts +0 -35
  13. src/app/[locale]/(marketing)/counter/page.tsx +0 -59
  14. src/app/[locale]/(marketing)/layout.tsx +0 -96
  15. src/app/[locale]/(marketing)/page.tsx +0 -120
  16. src/app/[locale]/(marketing)/portfolio/[slug]/page.tsx +0 -71
  17. src/app/[locale]/(marketing)/portfolio/page.tsx +0 -76
  18. src/app/[locale]/layout.tsx +0 -102
  19. src/app/layout.tsx +36 -0
  20. src/app/page.tsx +15 -0
  21. src/components/CounterForm.tsx +0 -63
  22. src/components/CurrentCount.tsx +0 -26
  23. src/components/DemoBadge.tsx +0 -12
  24. src/components/DemoBanner.tsx +0 -9
  25. src/components/Hello.tsx +0 -30
  26. src/components/LocaleSwitcher.tsx +0 -32
  27. src/components/Navbar.tsx +44 -0
  28. src/components/Sponsors.tsx +0 -115
  29. src/components/atoms/Badge/index.tsx +29 -0
  30. src/components/atoms/Button/index.tsx +52 -0
  31. src/components/atoms/Card/index.tsx +33 -0
  32. src/components/atoms/Input/index.tsx +29 -0
  33. src/components/atoms/index.ts +4 -0
  34. src/components/homepage/AnnouncementBanner.tsx +56 -0
  35. src/components/homepage/CustomizationSection.tsx +57 -0
  36. src/components/homepage/FeatureSection.tsx +73 -0
  37. src/middleware.ts +0 -55
  38. src/styles/global.css +70 -0
  39. src/utils/Helpers.ts +8 -0
  40. tailwind.config.ts +57 -3
next.config.ts CHANGED
@@ -1,26 +1,30 @@
1
- import withBundleAnalyzer from '@next/bundle-analyzer';
2
  import { withSentryConfig } from '@sentry/nextjs';
3
- import createNextIntlPlugin from 'next-intl/plugin';
4
  import './src/libs/Env';
5
 
6
- const withNextIntl = createNextIntlPlugin('./src/libs/i18n.ts');
7
 
8
- const bundleAnalyzer = withBundleAnalyzer({
9
- enabled: process.env.ANALYZE === 'true',
10
- });
 
 
 
 
 
 
 
 
 
 
 
 
 
11
 
12
  /** @type {import('next').NextConfig} */
13
  export default withSentryConfig(
14
- bundleAnalyzer(
15
- withNextIntl({
16
- eslint: {
17
- dirs: ['.'],
18
- },
19
- poweredByHeader: false,
20
- reactStrictMode: true,
21
- serverExternalPackages: ['@electric-sql/pglite'],
22
- }),
23
- ),
24
  {
25
  // For all available options, see:
26
  // https://github.com/getsentry/sentry-webpack-plugin#options
 
1
+ // import withBundleAnalyzer from '@next/bundle-analyzer';
2
  import { withSentryConfig } from '@sentry/nextjs';
3
+ // import createNextIntlPlugin from 'next-intl/plugin';
4
  import './src/libs/Env';
5
 
6
+ // const withNextIntl = createNextIntlPlugin('./src/libs/i18n.ts');
7
 
8
+ // const bundleAnalyzer = withBundleAnalyzer({
9
+ // enabled: process.env.ANALYZE === 'true',
10
+ // });
11
+
12
+ const nextConfig = {
13
+ images: {
14
+ remotePatterns: [
15
+ {
16
+ protocol: 'https',
17
+ hostname: '**',
18
+ port: '',
19
+ pathname: '**',
20
+ },
21
+ ],
22
+ },
23
+ };
24
 
25
  /** @type {import('next').NextConfig} */
26
  export default withSentryConfig(
27
+ nextConfig,
 
 
 
 
 
 
 
 
 
28
  {
29
  // For all available options, see:
30
  // https://github.com/getsentry/sentry-webpack-plugin#options
package-lock.json CHANGED
@@ -17,7 +17,10 @@
17
  "@sentry/nextjs": "^8.43.0",
18
  "@spotlightjs/spotlight": "^2.7.0",
19
  "@t3-oss/env-nextjs": "^0.11.1",
 
 
20
  "drizzle-orm": "^0.38.0",
 
21
  "next": "^15.1.0",
22
  "next-intl": "^3.26.0",
23
  "pg": "^8.13.1",
@@ -26,6 +29,7 @@
26
  "react": "19.0.0",
27
  "react-dom": "19.0.0",
28
  "react-hook-form": "^7.54.0",
 
29
  "zod": "^3.24.0"
30
  },
31
  "devDependencies": {
@@ -13920,6 +13924,17 @@
13920
  "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==",
13921
  "license": "MIT"
13922
  },
 
 
 
 
 
 
 
 
 
 
 
13923
  "node_modules/clean-css": {
13924
  "version": "5.3.3",
13925
  "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz",
@@ -14243,6 +14258,14 @@
14243
  "node": ">=0.8"
14244
  }
14245
  },
 
 
 
 
 
 
 
 
14246
  "node_modules/co": {
14247
  "version": "4.6.0",
14248
  "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
@@ -24792,6 +24815,14 @@
24792
  "yallist": "^3.0.2"
24793
  }
24794
  },
 
 
 
 
 
 
 
 
24795
  "node_modules/luxon": {
24796
  "version": "3.3.0",
24797
  "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.3.0.tgz",
@@ -27030,7 +27061,6 @@
27030
  },
27031
  "node_modules/npm/node_modules/@isaacs/cliui": {
27032
  "version": "8.0.2",
27033
- "dev": true,
27034
  "inBundle": true,
27035
  "license": "ISC",
27036
  "dependencies": {
@@ -27047,7 +27077,6 @@
27047
  },
27048
  "node_modules/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex": {
27049
  "version": "6.1.0",
27050
- "dev": true,
27051
  "inBundle": true,
27052
  "license": "MIT",
27053
  "engines": {
@@ -27059,13 +27088,11 @@
27059
  },
27060
  "node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex": {
27061
  "version": "9.2.2",
27062
- "dev": true,
27063
  "inBundle": true,
27064
  "license": "MIT"
27065
  },
27066
  "node_modules/npm/node_modules/@isaacs/cliui/node_modules/string-width": {
27067
  "version": "5.1.2",
27068
- "dev": true,
27069
  "inBundle": true,
27070
  "license": "MIT",
27071
  "dependencies": {
@@ -27082,7 +27109,6 @@
27082
  },
27083
  "node_modules/npm/node_modules/@isaacs/cliui/node_modules/strip-ansi": {
27084
  "version": "7.1.0",
27085
- "dev": true,
27086
  "inBundle": true,
27087
  "license": "MIT",
27088
  "dependencies": {
@@ -27097,7 +27123,6 @@
27097
  },
27098
  "node_modules/npm/node_modules/@isaacs/fs-minipass": {
27099
  "version": "4.0.1",
27100
- "dev": true,
27101
  "inBundle": true,
27102
  "license": "ISC",
27103
  "dependencies": {
@@ -27109,13 +27134,11 @@
27109
  },
27110
  "node_modules/npm/node_modules/@isaacs/string-locale-compare": {
27111
  "version": "1.1.0",
27112
- "dev": true,
27113
  "inBundle": true,
27114
  "license": "ISC"
27115
  },
27116
  "node_modules/npm/node_modules/@npmcli/agent": {
27117
  "version": "3.0.0",
27118
- "dev": true,
27119
  "inBundle": true,
27120
  "license": "ISC",
27121
  "dependencies": {
@@ -27131,7 +27154,6 @@
27131
  },
27132
  "node_modules/npm/node_modules/@npmcli/arborist": {
27133
  "version": "8.0.0",
27134
- "dev": true,
27135
  "inBundle": true,
27136
  "license": "ISC",
27137
  "dependencies": {
@@ -27180,7 +27202,6 @@
27180
  },
27181
  "node_modules/npm/node_modules/@npmcli/config": {
27182
  "version": "9.0.0",
27183
- "dev": true,
27184
  "inBundle": true,
27185
  "license": "ISC",
27186
  "dependencies": {
@@ -27199,7 +27220,6 @@
27199
  },
27200
  "node_modules/npm/node_modules/@npmcli/fs": {
27201
  "version": "4.0.0",
27202
- "dev": true,
27203
  "inBundle": true,
27204
  "license": "ISC",
27205
  "dependencies": {
@@ -27211,7 +27231,6 @@
27211
  },
27212
  "node_modules/npm/node_modules/@npmcli/git": {
27213
  "version": "6.0.1",
27214
- "dev": true,
27215
  "inBundle": true,
27216
  "license": "ISC",
27217
  "dependencies": {
@@ -27231,7 +27250,6 @@
27231
  },
27232
  "node_modules/npm/node_modules/@npmcli/installed-package-contents": {
27233
  "version": "3.0.0",
27234
- "dev": true,
27235
  "inBundle": true,
27236
  "license": "ISC",
27237
  "dependencies": {
@@ -27247,7 +27265,6 @@
27247
  },
27248
  "node_modules/npm/node_modules/@npmcli/map-workspaces": {
27249
  "version": "4.0.2",
27250
- "dev": true,
27251
  "inBundle": true,
27252
  "license": "ISC",
27253
  "dependencies": {
@@ -27262,7 +27279,6 @@
27262
  },
27263
  "node_modules/npm/node_modules/@npmcli/metavuln-calculator": {
27264
  "version": "8.0.1",
27265
- "dev": true,
27266
  "inBundle": true,
27267
  "license": "ISC",
27268
  "dependencies": {
@@ -27278,7 +27294,6 @@
27278
  },
27279
  "node_modules/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote": {
27280
  "version": "20.0.0",
27281
- "dev": true,
27282
  "inBundle": true,
27283
  "license": "ISC",
27284
  "dependencies": {
@@ -27309,7 +27324,6 @@
27309
  },
27310
  "node_modules/npm/node_modules/@npmcli/name-from-folder": {
27311
  "version": "3.0.0",
27312
- "dev": true,
27313
  "inBundle": true,
27314
  "license": "ISC",
27315
  "engines": {
@@ -27318,7 +27332,6 @@
27318
  },
27319
  "node_modules/npm/node_modules/@npmcli/node-gyp": {
27320
  "version": "4.0.0",
27321
- "dev": true,
27322
  "inBundle": true,
27323
  "license": "ISC",
27324
  "engines": {
@@ -27327,7 +27340,6 @@
27327
  },
27328
  "node_modules/npm/node_modules/@npmcli/package-json": {
27329
  "version": "6.1.0",
27330
- "dev": true,
27331
  "inBundle": true,
27332
  "license": "ISC",
27333
  "dependencies": {
@@ -27345,7 +27357,6 @@
27345
  },
27346
  "node_modules/npm/node_modules/@npmcli/promise-spawn": {
27347
  "version": "8.0.2",
27348
- "dev": true,
27349
  "inBundle": true,
27350
  "license": "ISC",
27351
  "dependencies": {
@@ -27357,7 +27368,6 @@
27357
  },
27358
  "node_modules/npm/node_modules/@npmcli/query": {
27359
  "version": "4.0.0",
27360
- "dev": true,
27361
  "inBundle": true,
27362
  "license": "ISC",
27363
  "dependencies": {
@@ -27369,7 +27379,6 @@
27369
  },
27370
  "node_modules/npm/node_modules/@npmcli/redact": {
27371
  "version": "3.0.0",
27372
- "dev": true,
27373
  "inBundle": true,
27374
  "license": "ISC",
27375
  "engines": {
@@ -27378,7 +27387,6 @@
27378
  },
27379
  "node_modules/npm/node_modules/@npmcli/run-script": {
27380
  "version": "9.0.2",
27381
- "dev": true,
27382
  "inBundle": true,
27383
  "license": "ISC",
27384
  "dependencies": {
@@ -27395,17 +27403,14 @@
27395
  },
27396
  "node_modules/npm/node_modules/@pkgjs/parseargs": {
27397
  "version": "0.11.0",
27398
- "dev": true,
27399
  "inBundle": true,
27400
  "license": "MIT",
27401
- "optional": true,
27402
  "engines": {
27403
  "node": ">=14"
27404
  }
27405
  },
27406
  "node_modules/npm/node_modules/@sigstore/protobuf-specs": {
27407
  "version": "0.3.2",
27408
- "dev": true,
27409
  "inBundle": true,
27410
  "license": "Apache-2.0",
27411
  "engines": {
@@ -27414,7 +27419,6 @@
27414
  },
27415
  "node_modules/npm/node_modules/@sigstore/tuf": {
27416
  "version": "3.0.0",
27417
- "dev": true,
27418
  "inBundle": true,
27419
  "license": "Apache-2.0",
27420
  "dependencies": {
@@ -27427,7 +27431,6 @@
27427
  },
27428
  "node_modules/npm/node_modules/@tufjs/canonical-json": {
27429
  "version": "2.0.0",
27430
- "dev": true,
27431
  "inBundle": true,
27432
  "license": "MIT",
27433
  "engines": {
@@ -27436,7 +27439,6 @@
27436
  },
27437
  "node_modules/npm/node_modules/abbrev": {
27438
  "version": "3.0.0",
27439
- "dev": true,
27440
  "inBundle": true,
27441
  "license": "ISC",
27442
  "engines": {
@@ -27445,7 +27447,6 @@
27445
  },
27446
  "node_modules/npm/node_modules/agent-base": {
27447
  "version": "7.1.1",
27448
- "dev": true,
27449
  "inBundle": true,
27450
  "license": "MIT",
27451
  "dependencies": {
@@ -27457,7 +27458,6 @@
27457
  },
27458
  "node_modules/npm/node_modules/aggregate-error": {
27459
  "version": "3.1.0",
27460
- "dev": true,
27461
  "inBundle": true,
27462
  "license": "MIT",
27463
  "dependencies": {
@@ -27470,7 +27470,6 @@
27470
  },
27471
  "node_modules/npm/node_modules/ansi-regex": {
27472
  "version": "5.0.1",
27473
- "dev": true,
27474
  "inBundle": true,
27475
  "license": "MIT",
27476
  "engines": {
@@ -27479,7 +27478,6 @@
27479
  },
27480
  "node_modules/npm/node_modules/ansi-styles": {
27481
  "version": "6.2.1",
27482
- "dev": true,
27483
  "inBundle": true,
27484
  "license": "MIT",
27485
  "engines": {
@@ -27491,25 +27489,21 @@
27491
  },
27492
  "node_modules/npm/node_modules/aproba": {
27493
  "version": "2.0.0",
27494
- "dev": true,
27495
  "inBundle": true,
27496
  "license": "ISC"
27497
  },
27498
  "node_modules/npm/node_modules/archy": {
27499
  "version": "1.0.0",
27500
- "dev": true,
27501
  "inBundle": true,
27502
  "license": "MIT"
27503
  },
27504
  "node_modules/npm/node_modules/balanced-match": {
27505
  "version": "1.0.2",
27506
- "dev": true,
27507
  "inBundle": true,
27508
  "license": "MIT"
27509
  },
27510
  "node_modules/npm/node_modules/bin-links": {
27511
  "version": "5.0.0",
27512
- "dev": true,
27513
  "inBundle": true,
27514
  "license": "ISC",
27515
  "dependencies": {
@@ -27525,7 +27519,6 @@
27525
  },
27526
  "node_modules/npm/node_modules/binary-extensions": {
27527
  "version": "2.3.0",
27528
- "dev": true,
27529
  "inBundle": true,
27530
  "license": "MIT",
27531
  "engines": {
@@ -27537,7 +27530,6 @@
27537
  },
27538
  "node_modules/npm/node_modules/brace-expansion": {
27539
  "version": "2.0.1",
27540
- "dev": true,
27541
  "inBundle": true,
27542
  "license": "MIT",
27543
  "dependencies": {
@@ -27546,7 +27538,6 @@
27546
  },
27547
  "node_modules/npm/node_modules/cacache": {
27548
  "version": "19.0.1",
27549
- "dev": true,
27550
  "inBundle": true,
27551
  "license": "ISC",
27552
  "dependencies": {
@@ -27569,7 +27560,6 @@
27569
  },
27570
  "node_modules/npm/node_modules/cacache/node_modules/chownr": {
27571
  "version": "3.0.0",
27572
- "dev": true,
27573
  "inBundle": true,
27574
  "license": "BlueOak-1.0.0",
27575
  "engines": {
@@ -27578,7 +27568,6 @@
27578
  },
27579
  "node_modules/npm/node_modules/cacache/node_modules/minizlib": {
27580
  "version": "3.0.1",
27581
- "dev": true,
27582
  "inBundle": true,
27583
  "license": "MIT",
27584
  "dependencies": {
@@ -27591,7 +27580,6 @@
27591
  },
27592
  "node_modules/npm/node_modules/cacache/node_modules/mkdirp": {
27593
  "version": "3.0.1",
27594
- "dev": true,
27595
  "inBundle": true,
27596
  "license": "MIT",
27597
  "bin": {
@@ -27606,7 +27594,6 @@
27606
  },
27607
  "node_modules/npm/node_modules/cacache/node_modules/p-map": {
27608
  "version": "7.0.2",
27609
- "dev": true,
27610
  "inBundle": true,
27611
  "license": "MIT",
27612
  "engines": {
@@ -27618,7 +27605,6 @@
27618
  },
27619
  "node_modules/npm/node_modules/cacache/node_modules/tar": {
27620
  "version": "7.4.3",
27621
- "dev": true,
27622
  "inBundle": true,
27623
  "license": "ISC",
27624
  "dependencies": {
@@ -27635,7 +27621,6 @@
27635
  },
27636
  "node_modules/npm/node_modules/cacache/node_modules/yallist": {
27637
  "version": "5.0.0",
27638
- "dev": true,
27639
  "inBundle": true,
27640
  "license": "BlueOak-1.0.0",
27641
  "engines": {
@@ -27644,7 +27629,6 @@
27644
  },
27645
  "node_modules/npm/node_modules/chalk": {
27646
  "version": "5.3.0",
27647
- "dev": true,
27648
  "inBundle": true,
27649
  "license": "MIT",
27650
  "engines": {
@@ -27656,7 +27640,6 @@
27656
  },
27657
  "node_modules/npm/node_modules/chownr": {
27658
  "version": "2.0.0",
27659
- "dev": true,
27660
  "inBundle": true,
27661
  "license": "ISC",
27662
  "engines": {
@@ -27665,7 +27648,6 @@
27665
  },
27666
  "node_modules/npm/node_modules/ci-info": {
27667
  "version": "4.1.0",
27668
- "dev": true,
27669
  "funding": [
27670
  {
27671
  "type": "github",
@@ -27680,7 +27662,6 @@
27680
  },
27681
  "node_modules/npm/node_modules/cidr-regex": {
27682
  "version": "4.1.1",
27683
- "dev": true,
27684
  "inBundle": true,
27685
  "license": "BSD-2-Clause",
27686
  "dependencies": {
@@ -27692,7 +27673,6 @@
27692
  },
27693
  "node_modules/npm/node_modules/clean-stack": {
27694
  "version": "2.2.0",
27695
- "dev": true,
27696
  "inBundle": true,
27697
  "license": "MIT",
27698
  "engines": {
@@ -27701,7 +27681,6 @@
27701
  },
27702
  "node_modules/npm/node_modules/cli-columns": {
27703
  "version": "4.0.0",
27704
- "dev": true,
27705
  "inBundle": true,
27706
  "license": "MIT",
27707
  "dependencies": {
@@ -27714,7 +27693,6 @@
27714
  },
27715
  "node_modules/npm/node_modules/cmd-shim": {
27716
  "version": "7.0.0",
27717
- "dev": true,
27718
  "inBundle": true,
27719
  "license": "ISC",
27720
  "engines": {
@@ -27723,7 +27701,6 @@
27723
  },
27724
  "node_modules/npm/node_modules/color-convert": {
27725
  "version": "2.0.1",
27726
- "dev": true,
27727
  "inBundle": true,
27728
  "license": "MIT",
27729
  "dependencies": {
@@ -27735,19 +27712,16 @@
27735
  },
27736
  "node_modules/npm/node_modules/color-name": {
27737
  "version": "1.1.4",
27738
- "dev": true,
27739
  "inBundle": true,
27740
  "license": "MIT"
27741
  },
27742
  "node_modules/npm/node_modules/common-ancestor-path": {
27743
  "version": "1.0.1",
27744
- "dev": true,
27745
  "inBundle": true,
27746
  "license": "ISC"
27747
  },
27748
  "node_modules/npm/node_modules/cross-spawn": {
27749
  "version": "7.0.6",
27750
- "dev": true,
27751
  "inBundle": true,
27752
  "license": "MIT",
27753
  "dependencies": {
@@ -27761,7 +27735,6 @@
27761
  },
27762
  "node_modules/npm/node_modules/cross-spawn/node_modules/which": {
27763
  "version": "2.0.2",
27764
- "dev": true,
27765
  "inBundle": true,
27766
  "license": "ISC",
27767
  "dependencies": {
@@ -27776,7 +27749,6 @@
27776
  },
27777
  "node_modules/npm/node_modules/cssesc": {
27778
  "version": "3.0.0",
27779
- "dev": true,
27780
  "inBundle": true,
27781
  "license": "MIT",
27782
  "bin": {
@@ -27788,7 +27760,6 @@
27788
  },
27789
  "node_modules/npm/node_modules/debug": {
27790
  "version": "4.3.7",
27791
- "dev": true,
27792
  "inBundle": true,
27793
  "license": "MIT",
27794
  "dependencies": {
@@ -27805,7 +27776,6 @@
27805
  },
27806
  "node_modules/npm/node_modules/diff": {
27807
  "version": "5.2.0",
27808
- "dev": true,
27809
  "inBundle": true,
27810
  "license": "BSD-3-Clause",
27811
  "engines": {
@@ -27814,29 +27784,24 @@
27814
  },
27815
  "node_modules/npm/node_modules/eastasianwidth": {
27816
  "version": "0.2.0",
27817
- "dev": true,
27818
  "inBundle": true,
27819
  "license": "MIT"
27820
  },
27821
  "node_modules/npm/node_modules/emoji-regex": {
27822
  "version": "8.0.0",
27823
- "dev": true,
27824
  "inBundle": true,
27825
  "license": "MIT"
27826
  },
27827
  "node_modules/npm/node_modules/encoding": {
27828
  "version": "0.1.13",
27829
- "dev": true,
27830
  "inBundle": true,
27831
  "license": "MIT",
27832
- "optional": true,
27833
  "dependencies": {
27834
  "iconv-lite": "^0.6.2"
27835
  }
27836
  },
27837
  "node_modules/npm/node_modules/env-paths": {
27838
  "version": "2.2.1",
27839
- "dev": true,
27840
  "inBundle": true,
27841
  "license": "MIT",
27842
  "engines": {
@@ -27845,19 +27810,16 @@
27845
  },
27846
  "node_modules/npm/node_modules/err-code": {
27847
  "version": "2.0.3",
27848
- "dev": true,
27849
  "inBundle": true,
27850
  "license": "MIT"
27851
  },
27852
  "node_modules/npm/node_modules/exponential-backoff": {
27853
  "version": "3.1.1",
27854
- "dev": true,
27855
  "inBundle": true,
27856
  "license": "Apache-2.0"
27857
  },
27858
  "node_modules/npm/node_modules/fastest-levenshtein": {
27859
  "version": "1.0.16",
27860
- "dev": true,
27861
  "inBundle": true,
27862
  "license": "MIT",
27863
  "engines": {
@@ -27866,7 +27828,6 @@
27866
  },
27867
  "node_modules/npm/node_modules/foreground-child": {
27868
  "version": "3.3.0",
27869
- "dev": true,
27870
  "inBundle": true,
27871
  "license": "ISC",
27872
  "dependencies": {
@@ -27882,7 +27843,6 @@
27882
  },
27883
  "node_modules/npm/node_modules/fs-minipass": {
27884
  "version": "3.0.3",
27885
- "dev": true,
27886
  "inBundle": true,
27887
  "license": "ISC",
27888
  "dependencies": {
@@ -27894,7 +27854,6 @@
27894
  },
27895
  "node_modules/npm/node_modules/glob": {
27896
  "version": "10.4.5",
27897
- "dev": true,
27898
  "inBundle": true,
27899
  "license": "ISC",
27900
  "dependencies": {
@@ -27914,13 +27873,11 @@
27914
  },
27915
  "node_modules/npm/node_modules/graceful-fs": {
27916
  "version": "4.2.11",
27917
- "dev": true,
27918
  "inBundle": true,
27919
  "license": "ISC"
27920
  },
27921
  "node_modules/npm/node_modules/hosted-git-info": {
27922
  "version": "8.0.2",
27923
- "dev": true,
27924
  "inBundle": true,
27925
  "license": "ISC",
27926
  "dependencies": {
@@ -27932,13 +27889,11 @@
27932
  },
27933
  "node_modules/npm/node_modules/http-cache-semantics": {
27934
  "version": "4.1.1",
27935
- "dev": true,
27936
  "inBundle": true,
27937
  "license": "BSD-2-Clause"
27938
  },
27939
  "node_modules/npm/node_modules/http-proxy-agent": {
27940
  "version": "7.0.2",
27941
- "dev": true,
27942
  "inBundle": true,
27943
  "license": "MIT",
27944
  "dependencies": {
@@ -27951,7 +27906,6 @@
27951
  },
27952
  "node_modules/npm/node_modules/https-proxy-agent": {
27953
  "version": "7.0.5",
27954
- "dev": true,
27955
  "inBundle": true,
27956
  "license": "MIT",
27957
  "dependencies": {
@@ -27964,10 +27918,8 @@
27964
  },
27965
  "node_modules/npm/node_modules/iconv-lite": {
27966
  "version": "0.6.3",
27967
- "dev": true,
27968
  "inBundle": true,
27969
  "license": "MIT",
27970
- "optional": true,
27971
  "dependencies": {
27972
  "safer-buffer": ">= 2.1.2 < 3.0.0"
27973
  },
@@ -27977,7 +27929,6 @@
27977
  },
27978
  "node_modules/npm/node_modules/ignore-walk": {
27979
  "version": "7.0.0",
27980
- "dev": true,
27981
  "inBundle": true,
27982
  "license": "ISC",
27983
  "dependencies": {
@@ -27989,7 +27940,6 @@
27989
  },
27990
  "node_modules/npm/node_modules/imurmurhash": {
27991
  "version": "0.1.4",
27992
- "dev": true,
27993
  "inBundle": true,
27994
  "license": "MIT",
27995
  "engines": {
@@ -27998,7 +27948,6 @@
27998
  },
27999
  "node_modules/npm/node_modules/indent-string": {
28000
  "version": "4.0.0",
28001
- "dev": true,
28002
  "inBundle": true,
28003
  "license": "MIT",
28004
  "engines": {
@@ -28007,7 +27956,6 @@
28007
  },
28008
  "node_modules/npm/node_modules/ini": {
28009
  "version": "5.0.0",
28010
- "dev": true,
28011
  "inBundle": true,
28012
  "license": "ISC",
28013
  "engines": {
@@ -28016,7 +27964,6 @@
28016
  },
28017
  "node_modules/npm/node_modules/init-package-json": {
28018
  "version": "7.0.2",
28019
- "dev": true,
28020
  "inBundle": true,
28021
  "license": "ISC",
28022
  "dependencies": {
@@ -28034,7 +27981,6 @@
28034
  },
28035
  "node_modules/npm/node_modules/ip-address": {
28036
  "version": "9.0.5",
28037
- "dev": true,
28038
  "inBundle": true,
28039
  "license": "MIT",
28040
  "dependencies": {
@@ -28047,7 +27993,6 @@
28047
  },
28048
  "node_modules/npm/node_modules/ip-regex": {
28049
  "version": "5.0.0",
28050
- "dev": true,
28051
  "inBundle": true,
28052
  "license": "MIT",
28053
  "engines": {
@@ -28059,7 +28004,6 @@
28059
  },
28060
  "node_modules/npm/node_modules/is-cidr": {
28061
  "version": "5.1.0",
28062
- "dev": true,
28063
  "inBundle": true,
28064
  "license": "BSD-2-Clause",
28065
  "dependencies": {
@@ -28071,7 +28015,6 @@
28071
  },
28072
  "node_modules/npm/node_modules/is-fullwidth-code-point": {
28073
  "version": "3.0.0",
28074
- "dev": true,
28075
  "inBundle": true,
28076
  "license": "MIT",
28077
  "engines": {
@@ -28080,13 +28023,11 @@
28080
  },
28081
  "node_modules/npm/node_modules/isexe": {
28082
  "version": "2.0.0",
28083
- "dev": true,
28084
  "inBundle": true,
28085
  "license": "ISC"
28086
  },
28087
  "node_modules/npm/node_modules/jackspeak": {
28088
  "version": "3.4.3",
28089
- "dev": true,
28090
  "inBundle": true,
28091
  "license": "BlueOak-1.0.0",
28092
  "dependencies": {
@@ -28101,13 +28042,11 @@
28101
  },
28102
  "node_modules/npm/node_modules/jsbn": {
28103
  "version": "1.1.0",
28104
- "dev": true,
28105
  "inBundle": true,
28106
  "license": "MIT"
28107
  },
28108
  "node_modules/npm/node_modules/json-parse-even-better-errors": {
28109
  "version": "4.0.0",
28110
- "dev": true,
28111
  "inBundle": true,
28112
  "license": "MIT",
28113
  "engines": {
@@ -28116,7 +28055,6 @@
28116
  },
28117
  "node_modules/npm/node_modules/json-stringify-nice": {
28118
  "version": "1.1.4",
28119
- "dev": true,
28120
  "inBundle": true,
28121
  "license": "ISC",
28122
  "funding": {
@@ -28125,7 +28063,6 @@
28125
  },
28126
  "node_modules/npm/node_modules/jsonparse": {
28127
  "version": "1.3.1",
28128
- "dev": true,
28129
  "engines": [
28130
  "node >= 0.2.0"
28131
  ],
@@ -28134,19 +28071,16 @@
28134
  },
28135
  "node_modules/npm/node_modules/just-diff": {
28136
  "version": "6.0.2",
28137
- "dev": true,
28138
  "inBundle": true,
28139
  "license": "MIT"
28140
  },
28141
  "node_modules/npm/node_modules/just-diff-apply": {
28142
  "version": "5.5.0",
28143
- "dev": true,
28144
  "inBundle": true,
28145
  "license": "MIT"
28146
  },
28147
  "node_modules/npm/node_modules/libnpmaccess": {
28148
  "version": "9.0.0",
28149
- "dev": true,
28150
  "inBundle": true,
28151
  "license": "ISC",
28152
  "dependencies": {
@@ -28159,7 +28093,6 @@
28159
  },
28160
  "node_modules/npm/node_modules/libnpmdiff": {
28161
  "version": "7.0.0",
28162
- "dev": true,
28163
  "inBundle": true,
28164
  "license": "ISC",
28165
  "dependencies": {
@@ -28178,7 +28111,6 @@
28178
  },
28179
  "node_modules/npm/node_modules/libnpmexec": {
28180
  "version": "9.0.0",
28181
- "dev": true,
28182
  "inBundle": true,
28183
  "license": "ISC",
28184
  "dependencies": {
@@ -28199,7 +28131,6 @@
28199
  },
28200
  "node_modules/npm/node_modules/libnpmfund": {
28201
  "version": "6.0.0",
28202
- "dev": true,
28203
  "inBundle": true,
28204
  "license": "ISC",
28205
  "dependencies": {
@@ -28211,7 +28142,6 @@
28211
  },
28212
  "node_modules/npm/node_modules/libnpmhook": {
28213
  "version": "11.0.0",
28214
- "dev": true,
28215
  "inBundle": true,
28216
  "license": "ISC",
28217
  "dependencies": {
@@ -28224,7 +28154,6 @@
28224
  },
28225
  "node_modules/npm/node_modules/libnpmorg": {
28226
  "version": "7.0.0",
28227
- "dev": true,
28228
  "inBundle": true,
28229
  "license": "ISC",
28230
  "dependencies": {
@@ -28237,7 +28166,6 @@
28237
  },
28238
  "node_modules/npm/node_modules/libnpmpack": {
28239
  "version": "8.0.0",
28240
- "dev": true,
28241
  "inBundle": true,
28242
  "license": "ISC",
28243
  "dependencies": {
@@ -28252,7 +28180,6 @@
28252
  },
28253
  "node_modules/npm/node_modules/libnpmpublish": {
28254
  "version": "10.0.1",
28255
- "dev": true,
28256
  "inBundle": true,
28257
  "license": "ISC",
28258
  "dependencies": {
@@ -28271,7 +28198,6 @@
28271
  },
28272
  "node_modules/npm/node_modules/libnpmsearch": {
28273
  "version": "8.0.0",
28274
- "dev": true,
28275
  "inBundle": true,
28276
  "license": "ISC",
28277
  "dependencies": {
@@ -28283,7 +28209,6 @@
28283
  },
28284
  "node_modules/npm/node_modules/libnpmteam": {
28285
  "version": "7.0.0",
28286
- "dev": true,
28287
  "inBundle": true,
28288
  "license": "ISC",
28289
  "dependencies": {
@@ -28296,7 +28221,6 @@
28296
  },
28297
  "node_modules/npm/node_modules/libnpmversion": {
28298
  "version": "7.0.0",
28299
- "dev": true,
28300
  "inBundle": true,
28301
  "license": "ISC",
28302
  "dependencies": {
@@ -28312,13 +28236,11 @@
28312
  },
28313
  "node_modules/npm/node_modules/lru-cache": {
28314
  "version": "10.4.3",
28315
- "dev": true,
28316
  "inBundle": true,
28317
  "license": "ISC"
28318
  },
28319
  "node_modules/npm/node_modules/make-fetch-happen": {
28320
  "version": "14.0.3",
28321
- "dev": true,
28322
  "inBundle": true,
28323
  "license": "ISC",
28324
  "dependencies": {
@@ -28340,7 +28262,6 @@
28340
  },
28341
  "node_modules/npm/node_modules/make-fetch-happen/node_modules/negotiator": {
28342
  "version": "1.0.0",
28343
- "dev": true,
28344
  "inBundle": true,
28345
  "license": "MIT",
28346
  "engines": {
@@ -28349,7 +28270,6 @@
28349
  },
28350
  "node_modules/npm/node_modules/minimatch": {
28351
  "version": "9.0.5",
28352
- "dev": true,
28353
  "inBundle": true,
28354
  "license": "ISC",
28355
  "dependencies": {
@@ -28364,7 +28284,6 @@
28364
  },
28365
  "node_modules/npm/node_modules/minipass": {
28366
  "version": "7.1.2",
28367
- "dev": true,
28368
  "inBundle": true,
28369
  "license": "ISC",
28370
  "engines": {
@@ -28373,7 +28292,6 @@
28373
  },
28374
  "node_modules/npm/node_modules/minipass-collect": {
28375
  "version": "2.0.1",
28376
- "dev": true,
28377
  "inBundle": true,
28378
  "license": "ISC",
28379
  "dependencies": {
@@ -28385,7 +28303,6 @@
28385
  },
28386
  "node_modules/npm/node_modules/minipass-fetch": {
28387
  "version": "4.0.0",
28388
- "dev": true,
28389
  "inBundle": true,
28390
  "license": "MIT",
28391
  "dependencies": {
@@ -28402,7 +28319,6 @@
28402
  },
28403
  "node_modules/npm/node_modules/minipass-fetch/node_modules/minizlib": {
28404
  "version": "3.0.1",
28405
- "dev": true,
28406
  "inBundle": true,
28407
  "license": "MIT",
28408
  "dependencies": {
@@ -28415,7 +28331,6 @@
28415
  },
28416
  "node_modules/npm/node_modules/minipass-flush": {
28417
  "version": "1.0.5",
28418
- "dev": true,
28419
  "inBundle": true,
28420
  "license": "ISC",
28421
  "dependencies": {
@@ -28427,7 +28342,6 @@
28427
  },
28428
  "node_modules/npm/node_modules/minipass-flush/node_modules/minipass": {
28429
  "version": "3.3.6",
28430
- "dev": true,
28431
  "inBundle": true,
28432
  "license": "ISC",
28433
  "dependencies": {
@@ -28439,7 +28353,6 @@
28439
  },
28440
  "node_modules/npm/node_modules/minipass-pipeline": {
28441
  "version": "1.2.4",
28442
- "dev": true,
28443
  "inBundle": true,
28444
  "license": "ISC",
28445
  "dependencies": {
@@ -28451,7 +28364,6 @@
28451
  },
28452
  "node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": {
28453
  "version": "3.3.6",
28454
- "dev": true,
28455
  "inBundle": true,
28456
  "license": "ISC",
28457
  "dependencies": {
@@ -28463,7 +28375,6 @@
28463
  },
28464
  "node_modules/npm/node_modules/minipass-sized": {
28465
  "version": "1.0.3",
28466
- "dev": true,
28467
  "inBundle": true,
28468
  "license": "ISC",
28469
  "dependencies": {
@@ -28475,7 +28386,6 @@
28475
  },
28476
  "node_modules/npm/node_modules/minipass-sized/node_modules/minipass": {
28477
  "version": "3.3.6",
28478
- "dev": true,
28479
  "inBundle": true,
28480
  "license": "ISC",
28481
  "dependencies": {
@@ -28487,7 +28397,6 @@
28487
  },
28488
  "node_modules/npm/node_modules/minizlib": {
28489
  "version": "2.1.2",
28490
- "dev": true,
28491
  "inBundle": true,
28492
  "license": "MIT",
28493
  "dependencies": {
@@ -28500,7 +28409,6 @@
28500
  },
28501
  "node_modules/npm/node_modules/minizlib/node_modules/minipass": {
28502
  "version": "3.3.6",
28503
- "dev": true,
28504
  "inBundle": true,
28505
  "license": "ISC",
28506
  "dependencies": {
@@ -28512,7 +28420,6 @@
28512
  },
28513
  "node_modules/npm/node_modules/mkdirp": {
28514
  "version": "1.0.4",
28515
- "dev": true,
28516
  "inBundle": true,
28517
  "license": "MIT",
28518
  "bin": {
@@ -28524,13 +28431,11 @@
28524
  },
28525
  "node_modules/npm/node_modules/ms": {
28526
  "version": "2.1.3",
28527
- "dev": true,
28528
  "inBundle": true,
28529
  "license": "MIT"
28530
  },
28531
  "node_modules/npm/node_modules/mute-stream": {
28532
  "version": "2.0.0",
28533
- "dev": true,
28534
  "inBundle": true,
28535
  "license": "ISC",
28536
  "engines": {
@@ -28539,7 +28444,6 @@
28539
  },
28540
  "node_modules/npm/node_modules/node-gyp": {
28541
  "version": "11.0.0",
28542
- "dev": true,
28543
  "inBundle": true,
28544
  "license": "MIT",
28545
  "dependencies": {
@@ -28563,7 +28467,6 @@
28563
  },
28564
  "node_modules/npm/node_modules/node-gyp/node_modules/chownr": {
28565
  "version": "3.0.0",
28566
- "dev": true,
28567
  "inBundle": true,
28568
  "license": "BlueOak-1.0.0",
28569
  "engines": {
@@ -28572,7 +28475,6 @@
28572
  },
28573
  "node_modules/npm/node_modules/node-gyp/node_modules/minizlib": {
28574
  "version": "3.0.1",
28575
- "dev": true,
28576
  "inBundle": true,
28577
  "license": "MIT",
28578
  "dependencies": {
@@ -28585,7 +28487,6 @@
28585
  },
28586
  "node_modules/npm/node_modules/node-gyp/node_modules/mkdirp": {
28587
  "version": "3.0.1",
28588
- "dev": true,
28589
  "inBundle": true,
28590
  "license": "MIT",
28591
  "bin": {
@@ -28600,7 +28501,6 @@
28600
  },
28601
  "node_modules/npm/node_modules/node-gyp/node_modules/tar": {
28602
  "version": "7.4.3",
28603
- "dev": true,
28604
  "inBundle": true,
28605
  "license": "ISC",
28606
  "dependencies": {
@@ -28617,7 +28517,6 @@
28617
  },
28618
  "node_modules/npm/node_modules/node-gyp/node_modules/yallist": {
28619
  "version": "5.0.0",
28620
- "dev": true,
28621
  "inBundle": true,
28622
  "license": "BlueOak-1.0.0",
28623
  "engines": {
@@ -28626,7 +28525,6 @@
28626
  },
28627
  "node_modules/npm/node_modules/nopt": {
28628
  "version": "8.0.0",
28629
- "dev": true,
28630
  "inBundle": true,
28631
  "license": "ISC",
28632
  "dependencies": {
@@ -28641,7 +28539,6 @@
28641
  },
28642
  "node_modules/npm/node_modules/nopt/node_modules/abbrev": {
28643
  "version": "2.0.0",
28644
- "dev": true,
28645
  "inBundle": true,
28646
  "license": "ISC",
28647
  "engines": {
@@ -28650,7 +28547,6 @@
28650
  },
28651
  "node_modules/npm/node_modules/normalize-package-data": {
28652
  "version": "7.0.0",
28653
- "dev": true,
28654
  "inBundle": true,
28655
  "license": "BSD-2-Clause",
28656
  "dependencies": {
@@ -28664,7 +28560,6 @@
28664
  },
28665
  "node_modules/npm/node_modules/npm-audit-report": {
28666
  "version": "6.0.0",
28667
- "dev": true,
28668
  "inBundle": true,
28669
  "license": "ISC",
28670
  "engines": {
@@ -28673,7 +28568,6 @@
28673
  },
28674
  "node_modules/npm/node_modules/npm-bundled": {
28675
  "version": "4.0.0",
28676
- "dev": true,
28677
  "inBundle": true,
28678
  "license": "ISC",
28679
  "dependencies": {
@@ -28685,7 +28579,6 @@
28685
  },
28686
  "node_modules/npm/node_modules/npm-install-checks": {
28687
  "version": "7.1.1",
28688
- "dev": true,
28689
  "inBundle": true,
28690
  "license": "BSD-2-Clause",
28691
  "dependencies": {
@@ -28697,7 +28590,6 @@
28697
  },
28698
  "node_modules/npm/node_modules/npm-normalize-package-bin": {
28699
  "version": "4.0.0",
28700
- "dev": true,
28701
  "inBundle": true,
28702
  "license": "ISC",
28703
  "engines": {
@@ -28706,7 +28598,6 @@
28706
  },
28707
  "node_modules/npm/node_modules/npm-package-arg": {
28708
  "version": "12.0.0",
28709
- "dev": true,
28710
  "inBundle": true,
28711
  "license": "ISC",
28712
  "dependencies": {
@@ -28721,7 +28612,6 @@
28721
  },
28722
  "node_modules/npm/node_modules/npm-packlist": {
28723
  "version": "9.0.0",
28724
- "dev": true,
28725
  "inBundle": true,
28726
  "license": "ISC",
28727
  "dependencies": {
@@ -28733,7 +28623,6 @@
28733
  },
28734
  "node_modules/npm/node_modules/npm-pick-manifest": {
28735
  "version": "10.0.0",
28736
- "dev": true,
28737
  "inBundle": true,
28738
  "license": "ISC",
28739
  "dependencies": {
@@ -28748,7 +28637,6 @@
28748
  },
28749
  "node_modules/npm/node_modules/npm-profile": {
28750
  "version": "11.0.1",
28751
- "dev": true,
28752
  "inBundle": true,
28753
  "license": "ISC",
28754
  "dependencies": {
@@ -28761,7 +28649,6 @@
28761
  },
28762
  "node_modules/npm/node_modules/npm-registry-fetch": {
28763
  "version": "18.0.2",
28764
- "dev": true,
28765
  "inBundle": true,
28766
  "license": "ISC",
28767
  "dependencies": {
@@ -28780,7 +28667,6 @@
28780
  },
28781
  "node_modules/npm/node_modules/npm-registry-fetch/node_modules/minizlib": {
28782
  "version": "3.0.1",
28783
- "dev": true,
28784
  "inBundle": true,
28785
  "license": "MIT",
28786
  "dependencies": {
@@ -28793,7 +28679,6 @@
28793
  },
28794
  "node_modules/npm/node_modules/npm-user-validate": {
28795
  "version": "3.0.0",
28796
- "dev": true,
28797
  "inBundle": true,
28798
  "license": "BSD-2-Clause",
28799
  "engines": {
@@ -28802,7 +28687,6 @@
28802
  },
28803
  "node_modules/npm/node_modules/p-map": {
28804
  "version": "4.0.0",
28805
- "dev": true,
28806
  "inBundle": true,
28807
  "license": "MIT",
28808
  "dependencies": {
@@ -28817,13 +28701,11 @@
28817
  },
28818
  "node_modules/npm/node_modules/package-json-from-dist": {
28819
  "version": "1.0.1",
28820
- "dev": true,
28821
  "inBundle": true,
28822
  "license": "BlueOak-1.0.0"
28823
  },
28824
  "node_modules/npm/node_modules/pacote": {
28825
  "version": "19.0.1",
28826
- "dev": true,
28827
  "inBundle": true,
28828
  "license": "ISC",
28829
  "dependencies": {
@@ -28854,7 +28736,6 @@
28854
  },
28855
  "node_modules/npm/node_modules/parse-conflict-json": {
28856
  "version": "4.0.0",
28857
- "dev": true,
28858
  "inBundle": true,
28859
  "license": "ISC",
28860
  "dependencies": {
@@ -28868,7 +28749,6 @@
28868
  },
28869
  "node_modules/npm/node_modules/path-key": {
28870
  "version": "3.1.1",
28871
- "dev": true,
28872
  "inBundle": true,
28873
  "license": "MIT",
28874
  "engines": {
@@ -28877,7 +28757,6 @@
28877
  },
28878
  "node_modules/npm/node_modules/path-scurry": {
28879
  "version": "1.11.1",
28880
- "dev": true,
28881
  "inBundle": true,
28882
  "license": "BlueOak-1.0.0",
28883
  "dependencies": {
@@ -28893,7 +28772,6 @@
28893
  },
28894
  "node_modules/npm/node_modules/postcss-selector-parser": {
28895
  "version": "6.1.2",
28896
- "dev": true,
28897
  "inBundle": true,
28898
  "license": "MIT",
28899
  "dependencies": {
@@ -28906,7 +28784,6 @@
28906
  },
28907
  "node_modules/npm/node_modules/proc-log": {
28908
  "version": "5.0.0",
28909
- "dev": true,
28910
  "inBundle": true,
28911
  "license": "ISC",
28912
  "engines": {
@@ -28915,7 +28792,6 @@
28915
  },
28916
  "node_modules/npm/node_modules/proggy": {
28917
  "version": "3.0.0",
28918
- "dev": true,
28919
  "inBundle": true,
28920
  "license": "ISC",
28921
  "engines": {
@@ -28924,7 +28800,6 @@
28924
  },
28925
  "node_modules/npm/node_modules/promise-all-reject-late": {
28926
  "version": "1.0.1",
28927
- "dev": true,
28928
  "inBundle": true,
28929
  "license": "ISC",
28930
  "funding": {
@@ -28933,7 +28808,6 @@
28933
  },
28934
  "node_modules/npm/node_modules/promise-call-limit": {
28935
  "version": "3.0.2",
28936
- "dev": true,
28937
  "inBundle": true,
28938
  "license": "ISC",
28939
  "funding": {
@@ -28942,13 +28816,11 @@
28942
  },
28943
  "node_modules/npm/node_modules/promise-inflight": {
28944
  "version": "1.0.1",
28945
- "dev": true,
28946
  "inBundle": true,
28947
  "license": "ISC"
28948
  },
28949
  "node_modules/npm/node_modules/promise-retry": {
28950
  "version": "2.0.1",
28951
- "dev": true,
28952
  "inBundle": true,
28953
  "license": "MIT",
28954
  "dependencies": {
@@ -28961,7 +28833,6 @@
28961
  },
28962
  "node_modules/npm/node_modules/promzard": {
28963
  "version": "2.0.0",
28964
- "dev": true,
28965
  "inBundle": true,
28966
  "license": "ISC",
28967
  "dependencies": {
@@ -28973,7 +28844,6 @@
28973
  },
28974
  "node_modules/npm/node_modules/qrcode-terminal": {
28975
  "version": "0.12.0",
28976
- "dev": true,
28977
  "inBundle": true,
28978
  "bin": {
28979
  "qrcode-terminal": "bin/qrcode-terminal.js"
@@ -28981,7 +28851,6 @@
28981
  },
28982
  "node_modules/npm/node_modules/read": {
28983
  "version": "4.0.0",
28984
- "dev": true,
28985
  "inBundle": true,
28986
  "license": "ISC",
28987
  "dependencies": {
@@ -28993,7 +28862,6 @@
28993
  },
28994
  "node_modules/npm/node_modules/read-cmd-shim": {
28995
  "version": "5.0.0",
28996
- "dev": true,
28997
  "inBundle": true,
28998
  "license": "ISC",
28999
  "engines": {
@@ -29002,7 +28870,6 @@
29002
  },
29003
  "node_modules/npm/node_modules/read-package-json-fast": {
29004
  "version": "4.0.0",
29005
- "dev": true,
29006
  "inBundle": true,
29007
  "license": "ISC",
29008
  "dependencies": {
@@ -29015,7 +28882,6 @@
29015
  },
29016
  "node_modules/npm/node_modules/retry": {
29017
  "version": "0.12.0",
29018
- "dev": true,
29019
  "inBundle": true,
29020
  "license": "MIT",
29021
  "engines": {
@@ -29024,7 +28890,6 @@
29024
  },
29025
  "node_modules/npm/node_modules/rimraf": {
29026
  "version": "5.0.10",
29027
- "dev": true,
29028
  "inBundle": true,
29029
  "license": "ISC",
29030
  "dependencies": {
@@ -29039,14 +28904,11 @@
29039
  },
29040
  "node_modules/npm/node_modules/safer-buffer": {
29041
  "version": "2.1.2",
29042
- "dev": true,
29043
  "inBundle": true,
29044
- "license": "MIT",
29045
- "optional": true
29046
  },
29047
  "node_modules/npm/node_modules/semver": {
29048
  "version": "7.6.3",
29049
- "dev": true,
29050
  "inBundle": true,
29051
  "license": "ISC",
29052
  "bin": {
@@ -29058,7 +28920,6 @@
29058
  },
29059
  "node_modules/npm/node_modules/shebang-command": {
29060
  "version": "2.0.0",
29061
- "dev": true,
29062
  "inBundle": true,
29063
  "license": "MIT",
29064
  "dependencies": {
@@ -29070,7 +28931,6 @@
29070
  },
29071
  "node_modules/npm/node_modules/shebang-regex": {
29072
  "version": "3.0.0",
29073
- "dev": true,
29074
  "inBundle": true,
29075
  "license": "MIT",
29076
  "engines": {
@@ -29079,7 +28939,6 @@
29079
  },
29080
  "node_modules/npm/node_modules/signal-exit": {
29081
  "version": "4.1.0",
29082
- "dev": true,
29083
  "inBundle": true,
29084
  "license": "ISC",
29085
  "engines": {
@@ -29091,7 +28950,6 @@
29091
  },
29092
  "node_modules/npm/node_modules/sigstore": {
29093
  "version": "3.0.0",
29094
- "dev": true,
29095
  "inBundle": true,
29096
  "license": "Apache-2.0",
29097
  "dependencies": {
@@ -29108,7 +28966,6 @@
29108
  },
29109
  "node_modules/npm/node_modules/sigstore/node_modules/@sigstore/bundle": {
29110
  "version": "3.0.0",
29111
- "dev": true,
29112
  "inBundle": true,
29113
  "license": "Apache-2.0",
29114
  "dependencies": {
@@ -29120,7 +28977,6 @@
29120
  },
29121
  "node_modules/npm/node_modules/sigstore/node_modules/@sigstore/core": {
29122
  "version": "2.0.0",
29123
- "dev": true,
29124
  "inBundle": true,
29125
  "license": "Apache-2.0",
29126
  "engines": {
@@ -29129,7 +28985,6 @@
29129
  },
29130
  "node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign": {
29131
  "version": "3.0.0",
29132
- "dev": true,
29133
  "inBundle": true,
29134
  "license": "Apache-2.0",
29135
  "dependencies": {
@@ -29146,7 +29001,6 @@
29146
  },
29147
  "node_modules/npm/node_modules/sigstore/node_modules/@sigstore/verify": {
29148
  "version": "2.0.0",
29149
- "dev": true,
29150
  "inBundle": true,
29151
  "license": "Apache-2.0",
29152
  "dependencies": {
@@ -29160,7 +29014,6 @@
29160
  },
29161
  "node_modules/npm/node_modules/smart-buffer": {
29162
  "version": "4.2.0",
29163
- "dev": true,
29164
  "inBundle": true,
29165
  "license": "MIT",
29166
  "engines": {
@@ -29170,7 +29023,6 @@
29170
  },
29171
  "node_modules/npm/node_modules/socks": {
29172
  "version": "2.8.3",
29173
- "dev": true,
29174
  "inBundle": true,
29175
  "license": "MIT",
29176
  "dependencies": {
@@ -29184,7 +29036,6 @@
29184
  },
29185
  "node_modules/npm/node_modules/socks-proxy-agent": {
29186
  "version": "8.0.4",
29187
- "dev": true,
29188
  "inBundle": true,
29189
  "license": "MIT",
29190
  "dependencies": {
@@ -29198,7 +29049,6 @@
29198
  },
29199
  "node_modules/npm/node_modules/spdx-correct": {
29200
  "version": "3.2.0",
29201
- "dev": true,
29202
  "inBundle": true,
29203
  "license": "Apache-2.0",
29204
  "dependencies": {
@@ -29208,7 +29058,6 @@
29208
  },
29209
  "node_modules/npm/node_modules/spdx-correct/node_modules/spdx-expression-parse": {
29210
  "version": "3.0.1",
29211
- "dev": true,
29212
  "inBundle": true,
29213
  "license": "MIT",
29214
  "dependencies": {
@@ -29218,13 +29067,11 @@
29218
  },
29219
  "node_modules/npm/node_modules/spdx-exceptions": {
29220
  "version": "2.5.0",
29221
- "dev": true,
29222
  "inBundle": true,
29223
  "license": "CC-BY-3.0"
29224
  },
29225
  "node_modules/npm/node_modules/spdx-expression-parse": {
29226
  "version": "4.0.0",
29227
- "dev": true,
29228
  "inBundle": true,
29229
  "license": "MIT",
29230
  "dependencies": {
@@ -29234,19 +29081,16 @@
29234
  },
29235
  "node_modules/npm/node_modules/spdx-license-ids": {
29236
  "version": "3.0.20",
29237
- "dev": true,
29238
  "inBundle": true,
29239
  "license": "CC0-1.0"
29240
  },
29241
  "node_modules/npm/node_modules/sprintf-js": {
29242
  "version": "1.1.3",
29243
- "dev": true,
29244
  "inBundle": true,
29245
  "license": "BSD-3-Clause"
29246
  },
29247
  "node_modules/npm/node_modules/ssri": {
29248
  "version": "12.0.0",
29249
- "dev": true,
29250
  "inBundle": true,
29251
  "license": "ISC",
29252
  "dependencies": {
@@ -29258,7 +29102,6 @@
29258
  },
29259
  "node_modules/npm/node_modules/string-width": {
29260
  "version": "4.2.3",
29261
- "dev": true,
29262
  "inBundle": true,
29263
  "license": "MIT",
29264
  "dependencies": {
@@ -29273,7 +29116,6 @@
29273
  "node_modules/npm/node_modules/string-width-cjs": {
29274
  "name": "string-width",
29275
  "version": "4.2.3",
29276
- "dev": true,
29277
  "inBundle": true,
29278
  "license": "MIT",
29279
  "dependencies": {
@@ -29287,7 +29129,6 @@
29287
  },
29288
  "node_modules/npm/node_modules/strip-ansi": {
29289
  "version": "6.0.1",
29290
- "dev": true,
29291
  "inBundle": true,
29292
  "license": "MIT",
29293
  "dependencies": {
@@ -29300,7 +29141,6 @@
29300
  "node_modules/npm/node_modules/strip-ansi-cjs": {
29301
  "name": "strip-ansi",
29302
  "version": "6.0.1",
29303
- "dev": true,
29304
  "inBundle": true,
29305
  "license": "MIT",
29306
  "dependencies": {
@@ -29312,7 +29152,6 @@
29312
  },
29313
  "node_modules/npm/node_modules/supports-color": {
29314
  "version": "9.4.0",
29315
- "dev": true,
29316
  "inBundle": true,
29317
  "license": "MIT",
29318
  "engines": {
@@ -29324,7 +29163,6 @@
29324
  },
29325
  "node_modules/npm/node_modules/tar": {
29326
  "version": "6.2.1",
29327
- "dev": true,
29328
  "inBundle": true,
29329
  "license": "ISC",
29330
  "dependencies": {
@@ -29341,7 +29179,6 @@
29341
  },
29342
  "node_modules/npm/node_modules/tar/node_modules/fs-minipass": {
29343
  "version": "2.1.0",
29344
- "dev": true,
29345
  "inBundle": true,
29346
  "license": "ISC",
29347
  "dependencies": {
@@ -29353,7 +29190,6 @@
29353
  },
29354
  "node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": {
29355
  "version": "3.3.6",
29356
- "dev": true,
29357
  "inBundle": true,
29358
  "license": "ISC",
29359
  "dependencies": {
@@ -29365,7 +29201,6 @@
29365
  },
29366
  "node_modules/npm/node_modules/tar/node_modules/minipass": {
29367
  "version": "5.0.0",
29368
- "dev": true,
29369
  "inBundle": true,
29370
  "license": "ISC",
29371
  "engines": {
@@ -29374,19 +29209,16 @@
29374
  },
29375
  "node_modules/npm/node_modules/text-table": {
29376
  "version": "0.2.0",
29377
- "dev": true,
29378
  "inBundle": true,
29379
  "license": "MIT"
29380
  },
29381
  "node_modules/npm/node_modules/tiny-relative-date": {
29382
  "version": "1.3.0",
29383
- "dev": true,
29384
  "inBundle": true,
29385
  "license": "MIT"
29386
  },
29387
  "node_modules/npm/node_modules/treeverse": {
29388
  "version": "3.0.0",
29389
- "dev": true,
29390
  "inBundle": true,
29391
  "license": "ISC",
29392
  "engines": {
@@ -29395,7 +29227,6 @@
29395
  },
29396
  "node_modules/npm/node_modules/tuf-js": {
29397
  "version": "3.0.1",
29398
- "dev": true,
29399
  "inBundle": true,
29400
  "license": "MIT",
29401
  "dependencies": {
@@ -29409,7 +29240,6 @@
29409
  },
29410
  "node_modules/npm/node_modules/tuf-js/node_modules/@tufjs/models": {
29411
  "version": "3.0.1",
29412
- "dev": true,
29413
  "inBundle": true,
29414
  "license": "MIT",
29415
  "dependencies": {
@@ -29422,7 +29252,6 @@
29422
  },
29423
  "node_modules/npm/node_modules/unique-filename": {
29424
  "version": "4.0.0",
29425
- "dev": true,
29426
  "inBundle": true,
29427
  "license": "ISC",
29428
  "dependencies": {
@@ -29434,7 +29263,6 @@
29434
  },
29435
  "node_modules/npm/node_modules/unique-slug": {
29436
  "version": "5.0.0",
29437
- "dev": true,
29438
  "inBundle": true,
29439
  "license": "ISC",
29440
  "dependencies": {
@@ -29446,13 +29274,11 @@
29446
  },
29447
  "node_modules/npm/node_modules/util-deprecate": {
29448
  "version": "1.0.2",
29449
- "dev": true,
29450
  "inBundle": true,
29451
  "license": "MIT"
29452
  },
29453
  "node_modules/npm/node_modules/validate-npm-package-license": {
29454
  "version": "3.0.4",
29455
- "dev": true,
29456
  "inBundle": true,
29457
  "license": "Apache-2.0",
29458
  "dependencies": {
@@ -29462,7 +29288,6 @@
29462
  },
29463
  "node_modules/npm/node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": {
29464
  "version": "3.0.1",
29465
- "dev": true,
29466
  "inBundle": true,
29467
  "license": "MIT",
29468
  "dependencies": {
@@ -29472,7 +29297,6 @@
29472
  },
29473
  "node_modules/npm/node_modules/validate-npm-package-name": {
29474
  "version": "6.0.0",
29475
- "dev": true,
29476
  "inBundle": true,
29477
  "license": "ISC",
29478
  "engines": {
@@ -29481,13 +29305,11 @@
29481
  },
29482
  "node_modules/npm/node_modules/walk-up-path": {
29483
  "version": "3.0.1",
29484
- "dev": true,
29485
  "inBundle": true,
29486
  "license": "ISC"
29487
  },
29488
  "node_modules/npm/node_modules/which": {
29489
  "version": "5.0.0",
29490
- "dev": true,
29491
  "inBundle": true,
29492
  "license": "ISC",
29493
  "dependencies": {
@@ -29502,7 +29324,6 @@
29502
  },
29503
  "node_modules/npm/node_modules/which/node_modules/isexe": {
29504
  "version": "3.1.1",
29505
- "dev": true,
29506
  "inBundle": true,
29507
  "license": "ISC",
29508
  "engines": {
@@ -29511,7 +29332,6 @@
29511
  },
29512
  "node_modules/npm/node_modules/wrap-ansi": {
29513
  "version": "8.1.0",
29514
- "dev": true,
29515
  "inBundle": true,
29516
  "license": "MIT",
29517
  "dependencies": {
@@ -29529,7 +29349,6 @@
29529
  "node_modules/npm/node_modules/wrap-ansi-cjs": {
29530
  "name": "wrap-ansi",
29531
  "version": "7.0.0",
29532
- "dev": true,
29533
  "inBundle": true,
29534
  "license": "MIT",
29535
  "dependencies": {
@@ -29546,7 +29365,6 @@
29546
  },
29547
  "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
29548
  "version": "4.3.0",
29549
- "dev": true,
29550
  "inBundle": true,
29551
  "license": "MIT",
29552
  "dependencies": {
@@ -29561,7 +29379,6 @@
29561
  },
29562
  "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex": {
29563
  "version": "6.1.0",
29564
- "dev": true,
29565
  "inBundle": true,
29566
  "license": "MIT",
29567
  "engines": {
@@ -29573,13 +29390,11 @@
29573
  },
29574
  "node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex": {
29575
  "version": "9.2.2",
29576
- "dev": true,
29577
  "inBundle": true,
29578
  "license": "MIT"
29579
  },
29580
  "node_modules/npm/node_modules/wrap-ansi/node_modules/string-width": {
29581
  "version": "5.1.2",
29582
- "dev": true,
29583
  "inBundle": true,
29584
  "license": "MIT",
29585
  "dependencies": {
@@ -29596,7 +29411,6 @@
29596
  },
29597
  "node_modules/npm/node_modules/wrap-ansi/node_modules/strip-ansi": {
29598
  "version": "7.1.0",
29599
- "dev": true,
29600
  "inBundle": true,
29601
  "license": "MIT",
29602
  "dependencies": {
@@ -29611,7 +29425,6 @@
29611
  },
29612
  "node_modules/npm/node_modules/write-file-atomic": {
29613
  "version": "6.0.0",
29614
- "dev": true,
29615
  "inBundle": true,
29616
  "license": "ISC",
29617
  "dependencies": {
@@ -29624,7 +29437,6 @@
29624
  },
29625
  "node_modules/npm/node_modules/yallist": {
29626
  "version": "4.0.0",
29627
- "dev": true,
29628
  "inBundle": true,
29629
  "license": "ISC"
29630
  },
@@ -36154,6 +35966,15 @@
36154
  "dev": true,
36155
  "license": "0BSD"
36156
  },
 
 
 
 
 
 
 
 
 
36157
  "node_modules/tailwindcss": {
36158
  "version": "3.4.16",
36159
  "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.16.tgz",
 
17
  "@sentry/nextjs": "^8.43.0",
18
  "@spotlightjs/spotlight": "^2.7.0",
19
  "@t3-oss/env-nextjs": "^0.11.1",
20
+ "class-variance-authority": "^0.7.1",
21
+ "clsx": "^2.1.1",
22
  "drizzle-orm": "^0.38.0",
23
+ "lucide-react": "^0.474.0",
24
  "next": "^15.1.0",
25
  "next-intl": "^3.26.0",
26
  "pg": "^8.13.1",
 
29
  "react": "19.0.0",
30
  "react-dom": "19.0.0",
31
  "react-hook-form": "^7.54.0",
32
+ "tailwind-merge": "^2.6.0",
33
  "zod": "^3.24.0"
34
  },
35
  "devDependencies": {
 
13924
  "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==",
13925
  "license": "MIT"
13926
  },
13927
+ "node_modules/class-variance-authority": {
13928
+ "version": "0.7.1",
13929
+ "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz",
13930
+ "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==",
13931
+ "dependencies": {
13932
+ "clsx": "^2.1.1"
13933
+ },
13934
+ "funding": {
13935
+ "url": "https://polar.sh/cva"
13936
+ }
13937
+ },
13938
  "node_modules/clean-css": {
13939
  "version": "5.3.3",
13940
  "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz",
 
14258
  "node": ">=0.8"
14259
  }
14260
  },
14261
+ "node_modules/clsx": {
14262
+ "version": "2.1.1",
14263
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
14264
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
14265
+ "engines": {
14266
+ "node": ">=6"
14267
+ }
14268
+ },
14269
  "node_modules/co": {
14270
  "version": "4.6.0",
14271
  "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
 
24815
  "yallist": "^3.0.2"
24816
  }
24817
  },
24818
+ "node_modules/lucide-react": {
24819
+ "version": "0.474.0",
24820
+ "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.474.0.tgz",
24821
+ "integrity": "sha512-CmghgHkh0OJNmxGKWc0qfPJCYHASPMVSyGY8fj3xgk4v84ItqDg64JNKFZn5hC6E0vHi6gxnbCgwhyVB09wQtA==",
24822
+ "peerDependencies": {
24823
+ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
24824
+ }
24825
+ },
24826
  "node_modules/luxon": {
24827
  "version": "3.3.0",
24828
  "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.3.0.tgz",
 
27061
  },
27062
  "node_modules/npm/node_modules/@isaacs/cliui": {
27063
  "version": "8.0.2",
 
27064
  "inBundle": true,
27065
  "license": "ISC",
27066
  "dependencies": {
 
27077
  },
27078
  "node_modules/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex": {
27079
  "version": "6.1.0",
 
27080
  "inBundle": true,
27081
  "license": "MIT",
27082
  "engines": {
 
27088
  },
27089
  "node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex": {
27090
  "version": "9.2.2",
 
27091
  "inBundle": true,
27092
  "license": "MIT"
27093
  },
27094
  "node_modules/npm/node_modules/@isaacs/cliui/node_modules/string-width": {
27095
  "version": "5.1.2",
 
27096
  "inBundle": true,
27097
  "license": "MIT",
27098
  "dependencies": {
 
27109
  },
27110
  "node_modules/npm/node_modules/@isaacs/cliui/node_modules/strip-ansi": {
27111
  "version": "7.1.0",
 
27112
  "inBundle": true,
27113
  "license": "MIT",
27114
  "dependencies": {
 
27123
  },
27124
  "node_modules/npm/node_modules/@isaacs/fs-minipass": {
27125
  "version": "4.0.1",
 
27126
  "inBundle": true,
27127
  "license": "ISC",
27128
  "dependencies": {
 
27134
  },
27135
  "node_modules/npm/node_modules/@isaacs/string-locale-compare": {
27136
  "version": "1.1.0",
 
27137
  "inBundle": true,
27138
  "license": "ISC"
27139
  },
27140
  "node_modules/npm/node_modules/@npmcli/agent": {
27141
  "version": "3.0.0",
 
27142
  "inBundle": true,
27143
  "license": "ISC",
27144
  "dependencies": {
 
27154
  },
27155
  "node_modules/npm/node_modules/@npmcli/arborist": {
27156
  "version": "8.0.0",
 
27157
  "inBundle": true,
27158
  "license": "ISC",
27159
  "dependencies": {
 
27202
  },
27203
  "node_modules/npm/node_modules/@npmcli/config": {
27204
  "version": "9.0.0",
 
27205
  "inBundle": true,
27206
  "license": "ISC",
27207
  "dependencies": {
 
27220
  },
27221
  "node_modules/npm/node_modules/@npmcli/fs": {
27222
  "version": "4.0.0",
 
27223
  "inBundle": true,
27224
  "license": "ISC",
27225
  "dependencies": {
 
27231
  },
27232
  "node_modules/npm/node_modules/@npmcli/git": {
27233
  "version": "6.0.1",
 
27234
  "inBundle": true,
27235
  "license": "ISC",
27236
  "dependencies": {
 
27250
  },
27251
  "node_modules/npm/node_modules/@npmcli/installed-package-contents": {
27252
  "version": "3.0.0",
 
27253
  "inBundle": true,
27254
  "license": "ISC",
27255
  "dependencies": {
 
27265
  },
27266
  "node_modules/npm/node_modules/@npmcli/map-workspaces": {
27267
  "version": "4.0.2",
 
27268
  "inBundle": true,
27269
  "license": "ISC",
27270
  "dependencies": {
 
27279
  },
27280
  "node_modules/npm/node_modules/@npmcli/metavuln-calculator": {
27281
  "version": "8.0.1",
 
27282
  "inBundle": true,
27283
  "license": "ISC",
27284
  "dependencies": {
 
27294
  },
27295
  "node_modules/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote": {
27296
  "version": "20.0.0",
 
27297
  "inBundle": true,
27298
  "license": "ISC",
27299
  "dependencies": {
 
27324
  },
27325
  "node_modules/npm/node_modules/@npmcli/name-from-folder": {
27326
  "version": "3.0.0",
 
27327
  "inBundle": true,
27328
  "license": "ISC",
27329
  "engines": {
 
27332
  },
27333
  "node_modules/npm/node_modules/@npmcli/node-gyp": {
27334
  "version": "4.0.0",
 
27335
  "inBundle": true,
27336
  "license": "ISC",
27337
  "engines": {
 
27340
  },
27341
  "node_modules/npm/node_modules/@npmcli/package-json": {
27342
  "version": "6.1.0",
 
27343
  "inBundle": true,
27344
  "license": "ISC",
27345
  "dependencies": {
 
27357
  },
27358
  "node_modules/npm/node_modules/@npmcli/promise-spawn": {
27359
  "version": "8.0.2",
 
27360
  "inBundle": true,
27361
  "license": "ISC",
27362
  "dependencies": {
 
27368
  },
27369
  "node_modules/npm/node_modules/@npmcli/query": {
27370
  "version": "4.0.0",
 
27371
  "inBundle": true,
27372
  "license": "ISC",
27373
  "dependencies": {
 
27379
  },
27380
  "node_modules/npm/node_modules/@npmcli/redact": {
27381
  "version": "3.0.0",
 
27382
  "inBundle": true,
27383
  "license": "ISC",
27384
  "engines": {
 
27387
  },
27388
  "node_modules/npm/node_modules/@npmcli/run-script": {
27389
  "version": "9.0.2",
 
27390
  "inBundle": true,
27391
  "license": "ISC",
27392
  "dependencies": {
 
27403
  },
27404
  "node_modules/npm/node_modules/@pkgjs/parseargs": {
27405
  "version": "0.11.0",
 
27406
  "inBundle": true,
27407
  "license": "MIT",
 
27408
  "engines": {
27409
  "node": ">=14"
27410
  }
27411
  },
27412
  "node_modules/npm/node_modules/@sigstore/protobuf-specs": {
27413
  "version": "0.3.2",
 
27414
  "inBundle": true,
27415
  "license": "Apache-2.0",
27416
  "engines": {
 
27419
  },
27420
  "node_modules/npm/node_modules/@sigstore/tuf": {
27421
  "version": "3.0.0",
 
27422
  "inBundle": true,
27423
  "license": "Apache-2.0",
27424
  "dependencies": {
 
27431
  },
27432
  "node_modules/npm/node_modules/@tufjs/canonical-json": {
27433
  "version": "2.0.0",
 
27434
  "inBundle": true,
27435
  "license": "MIT",
27436
  "engines": {
 
27439
  },
27440
  "node_modules/npm/node_modules/abbrev": {
27441
  "version": "3.0.0",
 
27442
  "inBundle": true,
27443
  "license": "ISC",
27444
  "engines": {
 
27447
  },
27448
  "node_modules/npm/node_modules/agent-base": {
27449
  "version": "7.1.1",
 
27450
  "inBundle": true,
27451
  "license": "MIT",
27452
  "dependencies": {
 
27458
  },
27459
  "node_modules/npm/node_modules/aggregate-error": {
27460
  "version": "3.1.0",
 
27461
  "inBundle": true,
27462
  "license": "MIT",
27463
  "dependencies": {
 
27470
  },
27471
  "node_modules/npm/node_modules/ansi-regex": {
27472
  "version": "5.0.1",
 
27473
  "inBundle": true,
27474
  "license": "MIT",
27475
  "engines": {
 
27478
  },
27479
  "node_modules/npm/node_modules/ansi-styles": {
27480
  "version": "6.2.1",
 
27481
  "inBundle": true,
27482
  "license": "MIT",
27483
  "engines": {
 
27489
  },
27490
  "node_modules/npm/node_modules/aproba": {
27491
  "version": "2.0.0",
 
27492
  "inBundle": true,
27493
  "license": "ISC"
27494
  },
27495
  "node_modules/npm/node_modules/archy": {
27496
  "version": "1.0.0",
 
27497
  "inBundle": true,
27498
  "license": "MIT"
27499
  },
27500
  "node_modules/npm/node_modules/balanced-match": {
27501
  "version": "1.0.2",
 
27502
  "inBundle": true,
27503
  "license": "MIT"
27504
  },
27505
  "node_modules/npm/node_modules/bin-links": {
27506
  "version": "5.0.0",
 
27507
  "inBundle": true,
27508
  "license": "ISC",
27509
  "dependencies": {
 
27519
  },
27520
  "node_modules/npm/node_modules/binary-extensions": {
27521
  "version": "2.3.0",
 
27522
  "inBundle": true,
27523
  "license": "MIT",
27524
  "engines": {
 
27530
  },
27531
  "node_modules/npm/node_modules/brace-expansion": {
27532
  "version": "2.0.1",
 
27533
  "inBundle": true,
27534
  "license": "MIT",
27535
  "dependencies": {
 
27538
  },
27539
  "node_modules/npm/node_modules/cacache": {
27540
  "version": "19.0.1",
 
27541
  "inBundle": true,
27542
  "license": "ISC",
27543
  "dependencies": {
 
27560
  },
27561
  "node_modules/npm/node_modules/cacache/node_modules/chownr": {
27562
  "version": "3.0.0",
 
27563
  "inBundle": true,
27564
  "license": "BlueOak-1.0.0",
27565
  "engines": {
 
27568
  },
27569
  "node_modules/npm/node_modules/cacache/node_modules/minizlib": {
27570
  "version": "3.0.1",
 
27571
  "inBundle": true,
27572
  "license": "MIT",
27573
  "dependencies": {
 
27580
  },
27581
  "node_modules/npm/node_modules/cacache/node_modules/mkdirp": {
27582
  "version": "3.0.1",
 
27583
  "inBundle": true,
27584
  "license": "MIT",
27585
  "bin": {
 
27594
  },
27595
  "node_modules/npm/node_modules/cacache/node_modules/p-map": {
27596
  "version": "7.0.2",
 
27597
  "inBundle": true,
27598
  "license": "MIT",
27599
  "engines": {
 
27605
  },
27606
  "node_modules/npm/node_modules/cacache/node_modules/tar": {
27607
  "version": "7.4.3",
 
27608
  "inBundle": true,
27609
  "license": "ISC",
27610
  "dependencies": {
 
27621
  },
27622
  "node_modules/npm/node_modules/cacache/node_modules/yallist": {
27623
  "version": "5.0.0",
 
27624
  "inBundle": true,
27625
  "license": "BlueOak-1.0.0",
27626
  "engines": {
 
27629
  },
27630
  "node_modules/npm/node_modules/chalk": {
27631
  "version": "5.3.0",
 
27632
  "inBundle": true,
27633
  "license": "MIT",
27634
  "engines": {
 
27640
  },
27641
  "node_modules/npm/node_modules/chownr": {
27642
  "version": "2.0.0",
 
27643
  "inBundle": true,
27644
  "license": "ISC",
27645
  "engines": {
 
27648
  },
27649
  "node_modules/npm/node_modules/ci-info": {
27650
  "version": "4.1.0",
 
27651
  "funding": [
27652
  {
27653
  "type": "github",
 
27662
  },
27663
  "node_modules/npm/node_modules/cidr-regex": {
27664
  "version": "4.1.1",
 
27665
  "inBundle": true,
27666
  "license": "BSD-2-Clause",
27667
  "dependencies": {
 
27673
  },
27674
  "node_modules/npm/node_modules/clean-stack": {
27675
  "version": "2.2.0",
 
27676
  "inBundle": true,
27677
  "license": "MIT",
27678
  "engines": {
 
27681
  },
27682
  "node_modules/npm/node_modules/cli-columns": {
27683
  "version": "4.0.0",
 
27684
  "inBundle": true,
27685
  "license": "MIT",
27686
  "dependencies": {
 
27693
  },
27694
  "node_modules/npm/node_modules/cmd-shim": {
27695
  "version": "7.0.0",
 
27696
  "inBundle": true,
27697
  "license": "ISC",
27698
  "engines": {
 
27701
  },
27702
  "node_modules/npm/node_modules/color-convert": {
27703
  "version": "2.0.1",
 
27704
  "inBundle": true,
27705
  "license": "MIT",
27706
  "dependencies": {
 
27712
  },
27713
  "node_modules/npm/node_modules/color-name": {
27714
  "version": "1.1.4",
 
27715
  "inBundle": true,
27716
  "license": "MIT"
27717
  },
27718
  "node_modules/npm/node_modules/common-ancestor-path": {
27719
  "version": "1.0.1",
 
27720
  "inBundle": true,
27721
  "license": "ISC"
27722
  },
27723
  "node_modules/npm/node_modules/cross-spawn": {
27724
  "version": "7.0.6",
 
27725
  "inBundle": true,
27726
  "license": "MIT",
27727
  "dependencies": {
 
27735
  },
27736
  "node_modules/npm/node_modules/cross-spawn/node_modules/which": {
27737
  "version": "2.0.2",
 
27738
  "inBundle": true,
27739
  "license": "ISC",
27740
  "dependencies": {
 
27749
  },
27750
  "node_modules/npm/node_modules/cssesc": {
27751
  "version": "3.0.0",
 
27752
  "inBundle": true,
27753
  "license": "MIT",
27754
  "bin": {
 
27760
  },
27761
  "node_modules/npm/node_modules/debug": {
27762
  "version": "4.3.7",
 
27763
  "inBundle": true,
27764
  "license": "MIT",
27765
  "dependencies": {
 
27776
  },
27777
  "node_modules/npm/node_modules/diff": {
27778
  "version": "5.2.0",
 
27779
  "inBundle": true,
27780
  "license": "BSD-3-Clause",
27781
  "engines": {
 
27784
  },
27785
  "node_modules/npm/node_modules/eastasianwidth": {
27786
  "version": "0.2.0",
 
27787
  "inBundle": true,
27788
  "license": "MIT"
27789
  },
27790
  "node_modules/npm/node_modules/emoji-regex": {
27791
  "version": "8.0.0",
 
27792
  "inBundle": true,
27793
  "license": "MIT"
27794
  },
27795
  "node_modules/npm/node_modules/encoding": {
27796
  "version": "0.1.13",
 
27797
  "inBundle": true,
27798
  "license": "MIT",
 
27799
  "dependencies": {
27800
  "iconv-lite": "^0.6.2"
27801
  }
27802
  },
27803
  "node_modules/npm/node_modules/env-paths": {
27804
  "version": "2.2.1",
 
27805
  "inBundle": true,
27806
  "license": "MIT",
27807
  "engines": {
 
27810
  },
27811
  "node_modules/npm/node_modules/err-code": {
27812
  "version": "2.0.3",
 
27813
  "inBundle": true,
27814
  "license": "MIT"
27815
  },
27816
  "node_modules/npm/node_modules/exponential-backoff": {
27817
  "version": "3.1.1",
 
27818
  "inBundle": true,
27819
  "license": "Apache-2.0"
27820
  },
27821
  "node_modules/npm/node_modules/fastest-levenshtein": {
27822
  "version": "1.0.16",
 
27823
  "inBundle": true,
27824
  "license": "MIT",
27825
  "engines": {
 
27828
  },
27829
  "node_modules/npm/node_modules/foreground-child": {
27830
  "version": "3.3.0",
 
27831
  "inBundle": true,
27832
  "license": "ISC",
27833
  "dependencies": {
 
27843
  },
27844
  "node_modules/npm/node_modules/fs-minipass": {
27845
  "version": "3.0.3",
 
27846
  "inBundle": true,
27847
  "license": "ISC",
27848
  "dependencies": {
 
27854
  },
27855
  "node_modules/npm/node_modules/glob": {
27856
  "version": "10.4.5",
 
27857
  "inBundle": true,
27858
  "license": "ISC",
27859
  "dependencies": {
 
27873
  },
27874
  "node_modules/npm/node_modules/graceful-fs": {
27875
  "version": "4.2.11",
 
27876
  "inBundle": true,
27877
  "license": "ISC"
27878
  },
27879
  "node_modules/npm/node_modules/hosted-git-info": {
27880
  "version": "8.0.2",
 
27881
  "inBundle": true,
27882
  "license": "ISC",
27883
  "dependencies": {
 
27889
  },
27890
  "node_modules/npm/node_modules/http-cache-semantics": {
27891
  "version": "4.1.1",
 
27892
  "inBundle": true,
27893
  "license": "BSD-2-Clause"
27894
  },
27895
  "node_modules/npm/node_modules/http-proxy-agent": {
27896
  "version": "7.0.2",
 
27897
  "inBundle": true,
27898
  "license": "MIT",
27899
  "dependencies": {
 
27906
  },
27907
  "node_modules/npm/node_modules/https-proxy-agent": {
27908
  "version": "7.0.5",
 
27909
  "inBundle": true,
27910
  "license": "MIT",
27911
  "dependencies": {
 
27918
  },
27919
  "node_modules/npm/node_modules/iconv-lite": {
27920
  "version": "0.6.3",
 
27921
  "inBundle": true,
27922
  "license": "MIT",
 
27923
  "dependencies": {
27924
  "safer-buffer": ">= 2.1.2 < 3.0.0"
27925
  },
 
27929
  },
27930
  "node_modules/npm/node_modules/ignore-walk": {
27931
  "version": "7.0.0",
 
27932
  "inBundle": true,
27933
  "license": "ISC",
27934
  "dependencies": {
 
27940
  },
27941
  "node_modules/npm/node_modules/imurmurhash": {
27942
  "version": "0.1.4",
 
27943
  "inBundle": true,
27944
  "license": "MIT",
27945
  "engines": {
 
27948
  },
27949
  "node_modules/npm/node_modules/indent-string": {
27950
  "version": "4.0.0",
 
27951
  "inBundle": true,
27952
  "license": "MIT",
27953
  "engines": {
 
27956
  },
27957
  "node_modules/npm/node_modules/ini": {
27958
  "version": "5.0.0",
 
27959
  "inBundle": true,
27960
  "license": "ISC",
27961
  "engines": {
 
27964
  },
27965
  "node_modules/npm/node_modules/init-package-json": {
27966
  "version": "7.0.2",
 
27967
  "inBundle": true,
27968
  "license": "ISC",
27969
  "dependencies": {
 
27981
  },
27982
  "node_modules/npm/node_modules/ip-address": {
27983
  "version": "9.0.5",
 
27984
  "inBundle": true,
27985
  "license": "MIT",
27986
  "dependencies": {
 
27993
  },
27994
  "node_modules/npm/node_modules/ip-regex": {
27995
  "version": "5.0.0",
 
27996
  "inBundle": true,
27997
  "license": "MIT",
27998
  "engines": {
 
28004
  },
28005
  "node_modules/npm/node_modules/is-cidr": {
28006
  "version": "5.1.0",
 
28007
  "inBundle": true,
28008
  "license": "BSD-2-Clause",
28009
  "dependencies": {
 
28015
  },
28016
  "node_modules/npm/node_modules/is-fullwidth-code-point": {
28017
  "version": "3.0.0",
 
28018
  "inBundle": true,
28019
  "license": "MIT",
28020
  "engines": {
 
28023
  },
28024
  "node_modules/npm/node_modules/isexe": {
28025
  "version": "2.0.0",
 
28026
  "inBundle": true,
28027
  "license": "ISC"
28028
  },
28029
  "node_modules/npm/node_modules/jackspeak": {
28030
  "version": "3.4.3",
 
28031
  "inBundle": true,
28032
  "license": "BlueOak-1.0.0",
28033
  "dependencies": {
 
28042
  },
28043
  "node_modules/npm/node_modules/jsbn": {
28044
  "version": "1.1.0",
 
28045
  "inBundle": true,
28046
  "license": "MIT"
28047
  },
28048
  "node_modules/npm/node_modules/json-parse-even-better-errors": {
28049
  "version": "4.0.0",
 
28050
  "inBundle": true,
28051
  "license": "MIT",
28052
  "engines": {
 
28055
  },
28056
  "node_modules/npm/node_modules/json-stringify-nice": {
28057
  "version": "1.1.4",
 
28058
  "inBundle": true,
28059
  "license": "ISC",
28060
  "funding": {
 
28063
  },
28064
  "node_modules/npm/node_modules/jsonparse": {
28065
  "version": "1.3.1",
 
28066
  "engines": [
28067
  "node >= 0.2.0"
28068
  ],
 
28071
  },
28072
  "node_modules/npm/node_modules/just-diff": {
28073
  "version": "6.0.2",
 
28074
  "inBundle": true,
28075
  "license": "MIT"
28076
  },
28077
  "node_modules/npm/node_modules/just-diff-apply": {
28078
  "version": "5.5.0",
 
28079
  "inBundle": true,
28080
  "license": "MIT"
28081
  },
28082
  "node_modules/npm/node_modules/libnpmaccess": {
28083
  "version": "9.0.0",
 
28084
  "inBundle": true,
28085
  "license": "ISC",
28086
  "dependencies": {
 
28093
  },
28094
  "node_modules/npm/node_modules/libnpmdiff": {
28095
  "version": "7.0.0",
 
28096
  "inBundle": true,
28097
  "license": "ISC",
28098
  "dependencies": {
 
28111
  },
28112
  "node_modules/npm/node_modules/libnpmexec": {
28113
  "version": "9.0.0",
 
28114
  "inBundle": true,
28115
  "license": "ISC",
28116
  "dependencies": {
 
28131
  },
28132
  "node_modules/npm/node_modules/libnpmfund": {
28133
  "version": "6.0.0",
 
28134
  "inBundle": true,
28135
  "license": "ISC",
28136
  "dependencies": {
 
28142
  },
28143
  "node_modules/npm/node_modules/libnpmhook": {
28144
  "version": "11.0.0",
 
28145
  "inBundle": true,
28146
  "license": "ISC",
28147
  "dependencies": {
 
28154
  },
28155
  "node_modules/npm/node_modules/libnpmorg": {
28156
  "version": "7.0.0",
 
28157
  "inBundle": true,
28158
  "license": "ISC",
28159
  "dependencies": {
 
28166
  },
28167
  "node_modules/npm/node_modules/libnpmpack": {
28168
  "version": "8.0.0",
 
28169
  "inBundle": true,
28170
  "license": "ISC",
28171
  "dependencies": {
 
28180
  },
28181
  "node_modules/npm/node_modules/libnpmpublish": {
28182
  "version": "10.0.1",
 
28183
  "inBundle": true,
28184
  "license": "ISC",
28185
  "dependencies": {
 
28198
  },
28199
  "node_modules/npm/node_modules/libnpmsearch": {
28200
  "version": "8.0.0",
 
28201
  "inBundle": true,
28202
  "license": "ISC",
28203
  "dependencies": {
 
28209
  },
28210
  "node_modules/npm/node_modules/libnpmteam": {
28211
  "version": "7.0.0",
 
28212
  "inBundle": true,
28213
  "license": "ISC",
28214
  "dependencies": {
 
28221
  },
28222
  "node_modules/npm/node_modules/libnpmversion": {
28223
  "version": "7.0.0",
 
28224
  "inBundle": true,
28225
  "license": "ISC",
28226
  "dependencies": {
 
28236
  },
28237
  "node_modules/npm/node_modules/lru-cache": {
28238
  "version": "10.4.3",
 
28239
  "inBundle": true,
28240
  "license": "ISC"
28241
  },
28242
  "node_modules/npm/node_modules/make-fetch-happen": {
28243
  "version": "14.0.3",
 
28244
  "inBundle": true,
28245
  "license": "ISC",
28246
  "dependencies": {
 
28262
  },
28263
  "node_modules/npm/node_modules/make-fetch-happen/node_modules/negotiator": {
28264
  "version": "1.0.0",
 
28265
  "inBundle": true,
28266
  "license": "MIT",
28267
  "engines": {
 
28270
  },
28271
  "node_modules/npm/node_modules/minimatch": {
28272
  "version": "9.0.5",
 
28273
  "inBundle": true,
28274
  "license": "ISC",
28275
  "dependencies": {
 
28284
  },
28285
  "node_modules/npm/node_modules/minipass": {
28286
  "version": "7.1.2",
 
28287
  "inBundle": true,
28288
  "license": "ISC",
28289
  "engines": {
 
28292
  },
28293
  "node_modules/npm/node_modules/minipass-collect": {
28294
  "version": "2.0.1",
 
28295
  "inBundle": true,
28296
  "license": "ISC",
28297
  "dependencies": {
 
28303
  },
28304
  "node_modules/npm/node_modules/minipass-fetch": {
28305
  "version": "4.0.0",
 
28306
  "inBundle": true,
28307
  "license": "MIT",
28308
  "dependencies": {
 
28319
  },
28320
  "node_modules/npm/node_modules/minipass-fetch/node_modules/minizlib": {
28321
  "version": "3.0.1",
 
28322
  "inBundle": true,
28323
  "license": "MIT",
28324
  "dependencies": {
 
28331
  },
28332
  "node_modules/npm/node_modules/minipass-flush": {
28333
  "version": "1.0.5",
 
28334
  "inBundle": true,
28335
  "license": "ISC",
28336
  "dependencies": {
 
28342
  },
28343
  "node_modules/npm/node_modules/minipass-flush/node_modules/minipass": {
28344
  "version": "3.3.6",
 
28345
  "inBundle": true,
28346
  "license": "ISC",
28347
  "dependencies": {
 
28353
  },
28354
  "node_modules/npm/node_modules/minipass-pipeline": {
28355
  "version": "1.2.4",
 
28356
  "inBundle": true,
28357
  "license": "ISC",
28358
  "dependencies": {
 
28364
  },
28365
  "node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": {
28366
  "version": "3.3.6",
 
28367
  "inBundle": true,
28368
  "license": "ISC",
28369
  "dependencies": {
 
28375
  },
28376
  "node_modules/npm/node_modules/minipass-sized": {
28377
  "version": "1.0.3",
 
28378
  "inBundle": true,
28379
  "license": "ISC",
28380
  "dependencies": {
 
28386
  },
28387
  "node_modules/npm/node_modules/minipass-sized/node_modules/minipass": {
28388
  "version": "3.3.6",
 
28389
  "inBundle": true,
28390
  "license": "ISC",
28391
  "dependencies": {
 
28397
  },
28398
  "node_modules/npm/node_modules/minizlib": {
28399
  "version": "2.1.2",
 
28400
  "inBundle": true,
28401
  "license": "MIT",
28402
  "dependencies": {
 
28409
  },
28410
  "node_modules/npm/node_modules/minizlib/node_modules/minipass": {
28411
  "version": "3.3.6",
 
28412
  "inBundle": true,
28413
  "license": "ISC",
28414
  "dependencies": {
 
28420
  },
28421
  "node_modules/npm/node_modules/mkdirp": {
28422
  "version": "1.0.4",
 
28423
  "inBundle": true,
28424
  "license": "MIT",
28425
  "bin": {
 
28431
  },
28432
  "node_modules/npm/node_modules/ms": {
28433
  "version": "2.1.3",
 
28434
  "inBundle": true,
28435
  "license": "MIT"
28436
  },
28437
  "node_modules/npm/node_modules/mute-stream": {
28438
  "version": "2.0.0",
 
28439
  "inBundle": true,
28440
  "license": "ISC",
28441
  "engines": {
 
28444
  },
28445
  "node_modules/npm/node_modules/node-gyp": {
28446
  "version": "11.0.0",
 
28447
  "inBundle": true,
28448
  "license": "MIT",
28449
  "dependencies": {
 
28467
  },
28468
  "node_modules/npm/node_modules/node-gyp/node_modules/chownr": {
28469
  "version": "3.0.0",
 
28470
  "inBundle": true,
28471
  "license": "BlueOak-1.0.0",
28472
  "engines": {
 
28475
  },
28476
  "node_modules/npm/node_modules/node-gyp/node_modules/minizlib": {
28477
  "version": "3.0.1",
 
28478
  "inBundle": true,
28479
  "license": "MIT",
28480
  "dependencies": {
 
28487
  },
28488
  "node_modules/npm/node_modules/node-gyp/node_modules/mkdirp": {
28489
  "version": "3.0.1",
 
28490
  "inBundle": true,
28491
  "license": "MIT",
28492
  "bin": {
 
28501
  },
28502
  "node_modules/npm/node_modules/node-gyp/node_modules/tar": {
28503
  "version": "7.4.3",
 
28504
  "inBundle": true,
28505
  "license": "ISC",
28506
  "dependencies": {
 
28517
  },
28518
  "node_modules/npm/node_modules/node-gyp/node_modules/yallist": {
28519
  "version": "5.0.0",
 
28520
  "inBundle": true,
28521
  "license": "BlueOak-1.0.0",
28522
  "engines": {
 
28525
  },
28526
  "node_modules/npm/node_modules/nopt": {
28527
  "version": "8.0.0",
 
28528
  "inBundle": true,
28529
  "license": "ISC",
28530
  "dependencies": {
 
28539
  },
28540
  "node_modules/npm/node_modules/nopt/node_modules/abbrev": {
28541
  "version": "2.0.0",
 
28542
  "inBundle": true,
28543
  "license": "ISC",
28544
  "engines": {
 
28547
  },
28548
  "node_modules/npm/node_modules/normalize-package-data": {
28549
  "version": "7.0.0",
 
28550
  "inBundle": true,
28551
  "license": "BSD-2-Clause",
28552
  "dependencies": {
 
28560
  },
28561
  "node_modules/npm/node_modules/npm-audit-report": {
28562
  "version": "6.0.0",
 
28563
  "inBundle": true,
28564
  "license": "ISC",
28565
  "engines": {
 
28568
  },
28569
  "node_modules/npm/node_modules/npm-bundled": {
28570
  "version": "4.0.0",
 
28571
  "inBundle": true,
28572
  "license": "ISC",
28573
  "dependencies": {
 
28579
  },
28580
  "node_modules/npm/node_modules/npm-install-checks": {
28581
  "version": "7.1.1",
 
28582
  "inBundle": true,
28583
  "license": "BSD-2-Clause",
28584
  "dependencies": {
 
28590
  },
28591
  "node_modules/npm/node_modules/npm-normalize-package-bin": {
28592
  "version": "4.0.0",
 
28593
  "inBundle": true,
28594
  "license": "ISC",
28595
  "engines": {
 
28598
  },
28599
  "node_modules/npm/node_modules/npm-package-arg": {
28600
  "version": "12.0.0",
 
28601
  "inBundle": true,
28602
  "license": "ISC",
28603
  "dependencies": {
 
28612
  },
28613
  "node_modules/npm/node_modules/npm-packlist": {
28614
  "version": "9.0.0",
 
28615
  "inBundle": true,
28616
  "license": "ISC",
28617
  "dependencies": {
 
28623
  },
28624
  "node_modules/npm/node_modules/npm-pick-manifest": {
28625
  "version": "10.0.0",
 
28626
  "inBundle": true,
28627
  "license": "ISC",
28628
  "dependencies": {
 
28637
  },
28638
  "node_modules/npm/node_modules/npm-profile": {
28639
  "version": "11.0.1",
 
28640
  "inBundle": true,
28641
  "license": "ISC",
28642
  "dependencies": {
 
28649
  },
28650
  "node_modules/npm/node_modules/npm-registry-fetch": {
28651
  "version": "18.0.2",
 
28652
  "inBundle": true,
28653
  "license": "ISC",
28654
  "dependencies": {
 
28667
  },
28668
  "node_modules/npm/node_modules/npm-registry-fetch/node_modules/minizlib": {
28669
  "version": "3.0.1",
 
28670
  "inBundle": true,
28671
  "license": "MIT",
28672
  "dependencies": {
 
28679
  },
28680
  "node_modules/npm/node_modules/npm-user-validate": {
28681
  "version": "3.0.0",
 
28682
  "inBundle": true,
28683
  "license": "BSD-2-Clause",
28684
  "engines": {
 
28687
  },
28688
  "node_modules/npm/node_modules/p-map": {
28689
  "version": "4.0.0",
 
28690
  "inBundle": true,
28691
  "license": "MIT",
28692
  "dependencies": {
 
28701
  },
28702
  "node_modules/npm/node_modules/package-json-from-dist": {
28703
  "version": "1.0.1",
 
28704
  "inBundle": true,
28705
  "license": "BlueOak-1.0.0"
28706
  },
28707
  "node_modules/npm/node_modules/pacote": {
28708
  "version": "19.0.1",
 
28709
  "inBundle": true,
28710
  "license": "ISC",
28711
  "dependencies": {
 
28736
  },
28737
  "node_modules/npm/node_modules/parse-conflict-json": {
28738
  "version": "4.0.0",
 
28739
  "inBundle": true,
28740
  "license": "ISC",
28741
  "dependencies": {
 
28749
  },
28750
  "node_modules/npm/node_modules/path-key": {
28751
  "version": "3.1.1",
 
28752
  "inBundle": true,
28753
  "license": "MIT",
28754
  "engines": {
 
28757
  },
28758
  "node_modules/npm/node_modules/path-scurry": {
28759
  "version": "1.11.1",
 
28760
  "inBundle": true,
28761
  "license": "BlueOak-1.0.0",
28762
  "dependencies": {
 
28772
  },
28773
  "node_modules/npm/node_modules/postcss-selector-parser": {
28774
  "version": "6.1.2",
 
28775
  "inBundle": true,
28776
  "license": "MIT",
28777
  "dependencies": {
 
28784
  },
28785
  "node_modules/npm/node_modules/proc-log": {
28786
  "version": "5.0.0",
 
28787
  "inBundle": true,
28788
  "license": "ISC",
28789
  "engines": {
 
28792
  },
28793
  "node_modules/npm/node_modules/proggy": {
28794
  "version": "3.0.0",
 
28795
  "inBundle": true,
28796
  "license": "ISC",
28797
  "engines": {
 
28800
  },
28801
  "node_modules/npm/node_modules/promise-all-reject-late": {
28802
  "version": "1.0.1",
 
28803
  "inBundle": true,
28804
  "license": "ISC",
28805
  "funding": {
 
28808
  },
28809
  "node_modules/npm/node_modules/promise-call-limit": {
28810
  "version": "3.0.2",
 
28811
  "inBundle": true,
28812
  "license": "ISC",
28813
  "funding": {
 
28816
  },
28817
  "node_modules/npm/node_modules/promise-inflight": {
28818
  "version": "1.0.1",
 
28819
  "inBundle": true,
28820
  "license": "ISC"
28821
  },
28822
  "node_modules/npm/node_modules/promise-retry": {
28823
  "version": "2.0.1",
 
28824
  "inBundle": true,
28825
  "license": "MIT",
28826
  "dependencies": {
 
28833
  },
28834
  "node_modules/npm/node_modules/promzard": {
28835
  "version": "2.0.0",
 
28836
  "inBundle": true,
28837
  "license": "ISC",
28838
  "dependencies": {
 
28844
  },
28845
  "node_modules/npm/node_modules/qrcode-terminal": {
28846
  "version": "0.12.0",
 
28847
  "inBundle": true,
28848
  "bin": {
28849
  "qrcode-terminal": "bin/qrcode-terminal.js"
 
28851
  },
28852
  "node_modules/npm/node_modules/read": {
28853
  "version": "4.0.0",
 
28854
  "inBundle": true,
28855
  "license": "ISC",
28856
  "dependencies": {
 
28862
  },
28863
  "node_modules/npm/node_modules/read-cmd-shim": {
28864
  "version": "5.0.0",
 
28865
  "inBundle": true,
28866
  "license": "ISC",
28867
  "engines": {
 
28870
  },
28871
  "node_modules/npm/node_modules/read-package-json-fast": {
28872
  "version": "4.0.0",
 
28873
  "inBundle": true,
28874
  "license": "ISC",
28875
  "dependencies": {
 
28882
  },
28883
  "node_modules/npm/node_modules/retry": {
28884
  "version": "0.12.0",
 
28885
  "inBundle": true,
28886
  "license": "MIT",
28887
  "engines": {
 
28890
  },
28891
  "node_modules/npm/node_modules/rimraf": {
28892
  "version": "5.0.10",
 
28893
  "inBundle": true,
28894
  "license": "ISC",
28895
  "dependencies": {
 
28904
  },
28905
  "node_modules/npm/node_modules/safer-buffer": {
28906
  "version": "2.1.2",
 
28907
  "inBundle": true,
28908
+ "license": "MIT"
 
28909
  },
28910
  "node_modules/npm/node_modules/semver": {
28911
  "version": "7.6.3",
 
28912
  "inBundle": true,
28913
  "license": "ISC",
28914
  "bin": {
 
28920
  },
28921
  "node_modules/npm/node_modules/shebang-command": {
28922
  "version": "2.0.0",
 
28923
  "inBundle": true,
28924
  "license": "MIT",
28925
  "dependencies": {
 
28931
  },
28932
  "node_modules/npm/node_modules/shebang-regex": {
28933
  "version": "3.0.0",
 
28934
  "inBundle": true,
28935
  "license": "MIT",
28936
  "engines": {
 
28939
  },
28940
  "node_modules/npm/node_modules/signal-exit": {
28941
  "version": "4.1.0",
 
28942
  "inBundle": true,
28943
  "license": "ISC",
28944
  "engines": {
 
28950
  },
28951
  "node_modules/npm/node_modules/sigstore": {
28952
  "version": "3.0.0",
 
28953
  "inBundle": true,
28954
  "license": "Apache-2.0",
28955
  "dependencies": {
 
28966
  },
28967
  "node_modules/npm/node_modules/sigstore/node_modules/@sigstore/bundle": {
28968
  "version": "3.0.0",
 
28969
  "inBundle": true,
28970
  "license": "Apache-2.0",
28971
  "dependencies": {
 
28977
  },
28978
  "node_modules/npm/node_modules/sigstore/node_modules/@sigstore/core": {
28979
  "version": "2.0.0",
 
28980
  "inBundle": true,
28981
  "license": "Apache-2.0",
28982
  "engines": {
 
28985
  },
28986
  "node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign": {
28987
  "version": "3.0.0",
 
28988
  "inBundle": true,
28989
  "license": "Apache-2.0",
28990
  "dependencies": {
 
29001
  },
29002
  "node_modules/npm/node_modules/sigstore/node_modules/@sigstore/verify": {
29003
  "version": "2.0.0",
 
29004
  "inBundle": true,
29005
  "license": "Apache-2.0",
29006
  "dependencies": {
 
29014
  },
29015
  "node_modules/npm/node_modules/smart-buffer": {
29016
  "version": "4.2.0",
 
29017
  "inBundle": true,
29018
  "license": "MIT",
29019
  "engines": {
 
29023
  },
29024
  "node_modules/npm/node_modules/socks": {
29025
  "version": "2.8.3",
 
29026
  "inBundle": true,
29027
  "license": "MIT",
29028
  "dependencies": {
 
29036
  },
29037
  "node_modules/npm/node_modules/socks-proxy-agent": {
29038
  "version": "8.0.4",
 
29039
  "inBundle": true,
29040
  "license": "MIT",
29041
  "dependencies": {
 
29049
  },
29050
  "node_modules/npm/node_modules/spdx-correct": {
29051
  "version": "3.2.0",
 
29052
  "inBundle": true,
29053
  "license": "Apache-2.0",
29054
  "dependencies": {
 
29058
  },
29059
  "node_modules/npm/node_modules/spdx-correct/node_modules/spdx-expression-parse": {
29060
  "version": "3.0.1",
 
29061
  "inBundle": true,
29062
  "license": "MIT",
29063
  "dependencies": {
 
29067
  },
29068
  "node_modules/npm/node_modules/spdx-exceptions": {
29069
  "version": "2.5.0",
 
29070
  "inBundle": true,
29071
  "license": "CC-BY-3.0"
29072
  },
29073
  "node_modules/npm/node_modules/spdx-expression-parse": {
29074
  "version": "4.0.0",
 
29075
  "inBundle": true,
29076
  "license": "MIT",
29077
  "dependencies": {
 
29081
  },
29082
  "node_modules/npm/node_modules/spdx-license-ids": {
29083
  "version": "3.0.20",
 
29084
  "inBundle": true,
29085
  "license": "CC0-1.0"
29086
  },
29087
  "node_modules/npm/node_modules/sprintf-js": {
29088
  "version": "1.1.3",
 
29089
  "inBundle": true,
29090
  "license": "BSD-3-Clause"
29091
  },
29092
  "node_modules/npm/node_modules/ssri": {
29093
  "version": "12.0.0",
 
29094
  "inBundle": true,
29095
  "license": "ISC",
29096
  "dependencies": {
 
29102
  },
29103
  "node_modules/npm/node_modules/string-width": {
29104
  "version": "4.2.3",
 
29105
  "inBundle": true,
29106
  "license": "MIT",
29107
  "dependencies": {
 
29116
  "node_modules/npm/node_modules/string-width-cjs": {
29117
  "name": "string-width",
29118
  "version": "4.2.3",
 
29119
  "inBundle": true,
29120
  "license": "MIT",
29121
  "dependencies": {
 
29129
  },
29130
  "node_modules/npm/node_modules/strip-ansi": {
29131
  "version": "6.0.1",
 
29132
  "inBundle": true,
29133
  "license": "MIT",
29134
  "dependencies": {
 
29141
  "node_modules/npm/node_modules/strip-ansi-cjs": {
29142
  "name": "strip-ansi",
29143
  "version": "6.0.1",
 
29144
  "inBundle": true,
29145
  "license": "MIT",
29146
  "dependencies": {
 
29152
  },
29153
  "node_modules/npm/node_modules/supports-color": {
29154
  "version": "9.4.0",
 
29155
  "inBundle": true,
29156
  "license": "MIT",
29157
  "engines": {
 
29163
  },
29164
  "node_modules/npm/node_modules/tar": {
29165
  "version": "6.2.1",
 
29166
  "inBundle": true,
29167
  "license": "ISC",
29168
  "dependencies": {
 
29179
  },
29180
  "node_modules/npm/node_modules/tar/node_modules/fs-minipass": {
29181
  "version": "2.1.0",
 
29182
  "inBundle": true,
29183
  "license": "ISC",
29184
  "dependencies": {
 
29190
  },
29191
  "node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": {
29192
  "version": "3.3.6",
 
29193
  "inBundle": true,
29194
  "license": "ISC",
29195
  "dependencies": {
 
29201
  },
29202
  "node_modules/npm/node_modules/tar/node_modules/minipass": {
29203
  "version": "5.0.0",
 
29204
  "inBundle": true,
29205
  "license": "ISC",
29206
  "engines": {
 
29209
  },
29210
  "node_modules/npm/node_modules/text-table": {
29211
  "version": "0.2.0",
 
29212
  "inBundle": true,
29213
  "license": "MIT"
29214
  },
29215
  "node_modules/npm/node_modules/tiny-relative-date": {
29216
  "version": "1.3.0",
 
29217
  "inBundle": true,
29218
  "license": "MIT"
29219
  },
29220
  "node_modules/npm/node_modules/treeverse": {
29221
  "version": "3.0.0",
 
29222
  "inBundle": true,
29223
  "license": "ISC",
29224
  "engines": {
 
29227
  },
29228
  "node_modules/npm/node_modules/tuf-js": {
29229
  "version": "3.0.1",
 
29230
  "inBundle": true,
29231
  "license": "MIT",
29232
  "dependencies": {
 
29240
  },
29241
  "node_modules/npm/node_modules/tuf-js/node_modules/@tufjs/models": {
29242
  "version": "3.0.1",
 
29243
  "inBundle": true,
29244
  "license": "MIT",
29245
  "dependencies": {
 
29252
  },
29253
  "node_modules/npm/node_modules/unique-filename": {
29254
  "version": "4.0.0",
 
29255
  "inBundle": true,
29256
  "license": "ISC",
29257
  "dependencies": {
 
29263
  },
29264
  "node_modules/npm/node_modules/unique-slug": {
29265
  "version": "5.0.0",
 
29266
  "inBundle": true,
29267
  "license": "ISC",
29268
  "dependencies": {
 
29274
  },
29275
  "node_modules/npm/node_modules/util-deprecate": {
29276
  "version": "1.0.2",
 
29277
  "inBundle": true,
29278
  "license": "MIT"
29279
  },
29280
  "node_modules/npm/node_modules/validate-npm-package-license": {
29281
  "version": "3.0.4",
 
29282
  "inBundle": true,
29283
  "license": "Apache-2.0",
29284
  "dependencies": {
 
29288
  },
29289
  "node_modules/npm/node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": {
29290
  "version": "3.0.1",
 
29291
  "inBundle": true,
29292
  "license": "MIT",
29293
  "dependencies": {
 
29297
  },
29298
  "node_modules/npm/node_modules/validate-npm-package-name": {
29299
  "version": "6.0.0",
 
29300
  "inBundle": true,
29301
  "license": "ISC",
29302
  "engines": {
 
29305
  },
29306
  "node_modules/npm/node_modules/walk-up-path": {
29307
  "version": "3.0.1",
 
29308
  "inBundle": true,
29309
  "license": "ISC"
29310
  },
29311
  "node_modules/npm/node_modules/which": {
29312
  "version": "5.0.0",
 
29313
  "inBundle": true,
29314
  "license": "ISC",
29315
  "dependencies": {
 
29324
  },
29325
  "node_modules/npm/node_modules/which/node_modules/isexe": {
29326
  "version": "3.1.1",
 
29327
  "inBundle": true,
29328
  "license": "ISC",
29329
  "engines": {
 
29332
  },
29333
  "node_modules/npm/node_modules/wrap-ansi": {
29334
  "version": "8.1.0",
 
29335
  "inBundle": true,
29336
  "license": "MIT",
29337
  "dependencies": {
 
29349
  "node_modules/npm/node_modules/wrap-ansi-cjs": {
29350
  "name": "wrap-ansi",
29351
  "version": "7.0.0",
 
29352
  "inBundle": true,
29353
  "license": "MIT",
29354
  "dependencies": {
 
29365
  },
29366
  "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
29367
  "version": "4.3.0",
 
29368
  "inBundle": true,
29369
  "license": "MIT",
29370
  "dependencies": {
 
29379
  },
29380
  "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex": {
29381
  "version": "6.1.0",
 
29382
  "inBundle": true,
29383
  "license": "MIT",
29384
  "engines": {
 
29390
  },
29391
  "node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex": {
29392
  "version": "9.2.2",
 
29393
  "inBundle": true,
29394
  "license": "MIT"
29395
  },
29396
  "node_modules/npm/node_modules/wrap-ansi/node_modules/string-width": {
29397
  "version": "5.1.2",
 
29398
  "inBundle": true,
29399
  "license": "MIT",
29400
  "dependencies": {
 
29411
  },
29412
  "node_modules/npm/node_modules/wrap-ansi/node_modules/strip-ansi": {
29413
  "version": "7.1.0",
 
29414
  "inBundle": true,
29415
  "license": "MIT",
29416
  "dependencies": {
 
29425
  },
29426
  "node_modules/npm/node_modules/write-file-atomic": {
29427
  "version": "6.0.0",
 
29428
  "inBundle": true,
29429
  "license": "ISC",
29430
  "dependencies": {
 
29437
  },
29438
  "node_modules/npm/node_modules/yallist": {
29439
  "version": "4.0.0",
 
29440
  "inBundle": true,
29441
  "license": "ISC"
29442
  },
 
35966
  "dev": true,
35967
  "license": "0BSD"
35968
  },
35969
+ "node_modules/tailwind-merge": {
35970
+ "version": "2.6.0",
35971
+ "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.0.tgz",
35972
+ "integrity": "sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==",
35973
+ "funding": {
35974
+ "type": "github",
35975
+ "url": "https://github.com/sponsors/dcastil"
35976
+ }
35977
+ },
35978
  "node_modules/tailwindcss": {
35979
  "version": "3.4.16",
35980
  "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.16.tgz",
package.json CHANGED
@@ -36,7 +36,10 @@
36
  "@sentry/nextjs": "^8.43.0",
37
  "@spotlightjs/spotlight": "^2.7.0",
38
  "@t3-oss/env-nextjs": "^0.11.1",
 
 
39
  "drizzle-orm": "^0.38.0",
 
40
  "next": "^15.1.0",
41
  "next-intl": "^3.26.0",
42
  "pg": "^8.13.1",
@@ -45,6 +48,7 @@
45
  "react": "19.0.0",
46
  "react-dom": "19.0.0",
47
  "react-hook-form": "^7.54.0",
 
48
  "zod": "^3.24.0"
49
  },
50
  "devDependencies": {
 
36
  "@sentry/nextjs": "^8.43.0",
37
  "@spotlightjs/spotlight": "^2.7.0",
38
  "@t3-oss/env-nextjs": "^0.11.1",
39
+ "class-variance-authority": "^0.7.1",
40
+ "clsx": "^2.1.1",
41
  "drizzle-orm": "^0.38.0",
42
+ "lucide-react": "^0.474.0",
43
  "next": "^15.1.0",
44
  "next-intl": "^3.26.0",
45
  "pg": "^8.13.1",
 
48
  "react": "19.0.0",
49
  "react-dom": "19.0.0",
50
  "react-hook-form": "^7.54.0",
51
+ "tailwind-merge": "^2.6.0",
52
  "zod": "^3.24.0"
53
  },
54
  "devDependencies": {
src/app/[locale]/(auth)/(center)/layout.tsx DELETED
@@ -1,15 +0,0 @@
1
- import { setRequestLocale } from 'next-intl/server';
2
-
3
- export default async function CenteredLayout(props: {
4
- children: React.ReactNode;
5
- params: Promise<{ locale: string }>;
6
- }) {
7
- const { locale } = await props.params;
8
- setRequestLocale(locale);
9
-
10
- return (
11
- <div className="flex min-h-screen items-center justify-center">
12
- {props.children}
13
- </div>
14
- );
15
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/app/[locale]/(auth)/(center)/sign-in/[[...sign-in]]/page.tsx DELETED
@@ -1,29 +0,0 @@
1
- import { getI18nPath } from '@/utils/Helpers';
2
- import { SignIn } from '@clerk/nextjs';
3
- import { getTranslations, setRequestLocale } from 'next-intl/server';
4
-
5
- type ISignInPageProps = {
6
- params: Promise<{ locale: string }>;
7
- };
8
-
9
- export async function generateMetadata(props: ISignInPageProps) {
10
- const { locale } = await props.params;
11
- const t = await getTranslations({
12
- locale,
13
- namespace: 'SignIn',
14
- });
15
-
16
- return {
17
- title: t('meta_title'),
18
- description: t('meta_description'),
19
- };
20
- }
21
-
22
- export default async function SignInPage(props: ISignInPageProps) {
23
- const { locale } = await props.params;
24
- setRequestLocale(locale);
25
-
26
- return (
27
- <SignIn path={getI18nPath('/sign-in', locale)} />
28
- );
29
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/app/[locale]/(auth)/(center)/sign-up/[[...sign-up]]/page.tsx DELETED
@@ -1,29 +0,0 @@
1
- import { getI18nPath } from '@/utils/Helpers';
2
- import { SignUp } from '@clerk/nextjs';
3
- import { getTranslations, setRequestLocale } from 'next-intl/server';
4
-
5
- type ISignUpPageProps = {
6
- params: Promise<{ locale: string }>;
7
- };
8
-
9
- export async function generateMetadata(props: ISignUpPageProps) {
10
- const { locale } = await props.params;
11
- const t = await getTranslations({
12
- locale,
13
- namespace: 'SignUp',
14
- });
15
-
16
- return {
17
- title: t('meta_title'),
18
- description: t('meta_description'),
19
- };
20
- }
21
-
22
- export default async function SignUpPage(props: ISignUpPageProps) {
23
- const { locale } = await props.params;
24
- setRequestLocale(locale);
25
-
26
- return (
27
- <SignUp path={getI18nPath('/sign-up', locale)} />
28
- );
29
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/app/[locale]/(auth)/dashboard/layout.tsx DELETED
@@ -1,59 +0,0 @@
1
- import { LocaleSwitcher } from '@/components/LocaleSwitcher';
2
- import { BaseTemplate } from '@/templates/BaseTemplate';
3
- import { SignOutButton } from '@clerk/nextjs';
4
- import { getTranslations, setRequestLocale } from 'next-intl/server';
5
- import Link from 'next/link';
6
-
7
- export default async function DashboardLayout(props: {
8
- children: React.ReactNode;
9
- params: Promise<{ locale: string }>;
10
- }) {
11
- const { locale } = await props.params;
12
- setRequestLocale(locale);
13
- const t = await getTranslations({
14
- locale,
15
- namespace: 'DashboardLayout',
16
- });
17
-
18
- return (
19
- <BaseTemplate
20
- leftNav={(
21
- <>
22
- <li>
23
- <Link
24
- href="/dashboard/"
25
- className="border-none text-gray-700 hover:text-gray-900"
26
- >
27
- {t('dashboard_link')}
28
- </Link>
29
- </li>
30
- <li>
31
- <Link
32
- href="/dashboard/user-profile/"
33
- className="border-none text-gray-700 hover:text-gray-900"
34
- >
35
- {t('user_profile_link')}
36
- </Link>
37
- </li>
38
- </>
39
- )}
40
- rightNav={(
41
- <>
42
- <li>
43
- <SignOutButton>
44
- <button className="border-none text-gray-700 hover:text-gray-900" type="button">
45
- {t('sign_out')}
46
- </button>
47
- </SignOutButton>
48
- </li>
49
-
50
- <li>
51
- <LocaleSwitcher />
52
- </li>
53
- </>
54
- )}
55
- >
56
- {props.children}
57
- </BaseTemplate>
58
- );
59
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/app/[locale]/(auth)/dashboard/page.tsx DELETED
@@ -1,24 +0,0 @@
1
- import { Hello } from '@/components/Hello';
2
- import { getTranslations } from 'next-intl/server';
3
-
4
- export async function generateMetadata(props: {
5
- params: Promise<{ locale: string }>;
6
- }) {
7
- const { locale } = await props.params;
8
- const t = await getTranslations({
9
- locale,
10
- namespace: 'Dashboard',
11
- });
12
-
13
- return {
14
- title: t('meta_title'),
15
- };
16
- }
17
-
18
- export default function Dashboard() {
19
- return (
20
- <div className="py-5 [&_p]:my-6">
21
- <Hello />
22
- </div>
23
- );
24
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/app/[locale]/(auth)/dashboard/user-profile/[[...user-profile]]/page.tsx DELETED
@@ -1,32 +0,0 @@
1
- import { getI18nPath } from '@/utils/Helpers';
2
- import { UserProfile } from '@clerk/nextjs';
3
- import { getTranslations, setRequestLocale } from 'next-intl/server';
4
-
5
- type IUserProfilePageProps = {
6
- params: Promise<{ locale: string }>;
7
- };
8
-
9
- export async function generateMetadata(props: IUserProfilePageProps) {
10
- const { locale } = await props.params;
11
- const t = await getTranslations({
12
- locale,
13
- namespace: 'UserProfile',
14
- });
15
-
16
- return {
17
- title: t('meta_title'),
18
- };
19
- }
20
-
21
- export default async function UserProfilePage(props: IUserProfilePageProps) {
22
- const { locale } = await props.params;
23
- setRequestLocale(locale);
24
-
25
- return (
26
- <div className="my-6 -ml-16">
27
- <UserProfile
28
- path={getI18nPath('/dashboard/user-profile', locale)}
29
- />
30
- </div>
31
- );
32
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/app/[locale]/(auth)/layout.tsx DELETED
@@ -1,41 +0,0 @@
1
- import { routing } from '@/libs/i18nNavigation';
2
- import { enUS, frFR } from '@clerk/localizations';
3
- import { ClerkProvider } from '@clerk/nextjs';
4
- import { setRequestLocale } from 'next-intl/server';
5
-
6
- export default async function AuthLayout(props: {
7
- children: React.ReactNode;
8
- params: Promise<{ locale: string }>;
9
- }) {
10
- const { locale } = await props.params;
11
- setRequestLocale(locale);
12
- let clerkLocale = enUS;
13
- let signInUrl = '/sign-in';
14
- let signUpUrl = '/sign-up';
15
- let dashboardUrl = '/dashboard';
16
- let afterSignOutUrl = '/';
17
-
18
- if (locale === 'fr') {
19
- clerkLocale = frFR;
20
- }
21
-
22
- if (locale !== routing.defaultLocale) {
23
- signInUrl = `/${locale}${signInUrl}`;
24
- signUpUrl = `/${locale}${signUpUrl}`;
25
- dashboardUrl = `/${locale}${dashboardUrl}`;
26
- afterSignOutUrl = `/${locale}${afterSignOutUrl}`;
27
- }
28
-
29
- return (
30
- <ClerkProvider
31
- localization={clerkLocale}
32
- signInUrl={signInUrl}
33
- signUpUrl={signUpUrl}
34
- signInFallbackRedirectUrl={dashboardUrl}
35
- signUpFallbackRedirectUrl={dashboardUrl}
36
- afterSignOutUrl={afterSignOutUrl}
37
- >
38
- {props.children}
39
- </ClerkProvider>
40
- );
41
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/app/[locale]/(marketing)/about/page.tsx DELETED
@@ -1,54 +0,0 @@
1
- import { getTranslations, setRequestLocale } from 'next-intl/server';
2
- import Image from 'next/image';
3
-
4
- type IAboutProps = {
5
- params: Promise<{ slug: string; locale: string }>;
6
- };
7
-
8
- export async function generateMetadata(props: IAboutProps) {
9
- const { locale } = await props.params;
10
- const t = await getTranslations({
11
- locale,
12
- namespace: 'About',
13
- });
14
-
15
- return {
16
- title: t('meta_title'),
17
- description: t('meta_description'),
18
- };
19
- }
20
-
21
- export default async function About(props: IAboutProps) {
22
- const { locale } = await props.params;
23
- setRequestLocale(locale);
24
- const t = await getTranslations({
25
- locale,
26
- namespace: 'About',
27
- });
28
-
29
- return (
30
- <>
31
- <p>{t('about_paragraph')}</p>
32
-
33
- <div className="mt-2 text-center text-sm">
34
- {`${t('translation_powered_by')} `}
35
- <a
36
- className="text-blue-700 hover:border-b-2 hover:border-blue-700"
37
- href="https://l.crowdin.com/next-js"
38
- >
39
- Crowdin
40
- </a>
41
- </div>
42
-
43
- <a href="https://l.crowdin.com/next-js">
44
- <Image
45
- className="mx-auto mt-2"
46
- src="/assets/images/crowdin-dark.png"
47
- alt="Crowdin Translation Management System"
48
- width={128}
49
- height={26}
50
- />
51
- </a>
52
- </>
53
- );
54
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/app/[locale]/(marketing)/api/counter/route.ts DELETED
@@ -1,35 +0,0 @@
1
- import { db } from '@/libs/DB';
2
- import { logger } from '@/libs/Logger';
3
- import { counterSchema } from '@/models/Schema';
4
- import { CounterValidation } from '@/validations/CounterValidation';
5
- import { sql } from 'drizzle-orm';
6
- import { headers } from 'next/headers';
7
- import { NextResponse } from 'next/server';
8
-
9
- export const PUT = async (request: Request) => {
10
- const json = await request.json();
11
- const parse = CounterValidation.safeParse(json);
12
-
13
- if (!parse.success) {
14
- return NextResponse.json(parse.error.format(), { status: 422 });
15
- }
16
-
17
- // `x-e2e-random-id` is used for end-to-end testing to make isolated requests
18
- // The default value is 0 when there is no `x-e2e-random-id` header
19
- const id = Number((await headers()).get('x-e2e-random-id')) ?? 0;
20
-
21
- const count = await db
22
- .insert(counterSchema)
23
- .values({ id, count: parse.data.increment })
24
- .onConflictDoUpdate({
25
- target: counterSchema.id,
26
- set: { count: sql`${counterSchema.count} + ${parse.data.increment}` },
27
- })
28
- .returning();
29
-
30
- logger.info('Counter has been incremented');
31
-
32
- return NextResponse.json({
33
- count: count[0]?.count,
34
- });
35
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/app/[locale]/(marketing)/counter/page.tsx DELETED
@@ -1,59 +0,0 @@
1
- import { CounterForm } from '@/components/CounterForm';
2
- import { CurrentCount } from '@/components/CurrentCount';
3
- import { useTranslations } from 'next-intl';
4
- import { getTranslations } from 'next-intl/server';
5
- import Image from 'next/image';
6
- import { Suspense } from 'react';
7
-
8
- export async function generateMetadata(props: {
9
- params: Promise<{ locale: string }>;
10
- }) {
11
- const { locale } = await props.params;
12
- const t = await getTranslations({
13
- locale,
14
- namespace: 'Counter',
15
- });
16
-
17
- return {
18
- title: t('meta_title'),
19
- description: t('meta_description'),
20
- };
21
- }
22
-
23
- export default function Counter() {
24
- const t = useTranslations('Counter');
25
-
26
- return (
27
- <>
28
- <CounterForm />
29
-
30
- <div className="mt-3">
31
- <Suspense fallback={<p>{t('loading_counter')}</p>}>
32
- <CurrentCount />
33
- </Suspense>
34
- </div>
35
-
36
- <div className="mt-5 text-center text-sm">
37
- {`${t('security_powered_by')} `}
38
- <a
39
- className="text-blue-700 hover:border-b-2 hover:border-blue-700"
40
- href="https://launch.arcjet.com/Q6eLbRE"
41
- >
42
- Arcjet
43
- </a>
44
- </div>
45
-
46
- <a
47
- href="https://launch.arcjet.com/Q6eLbRE"
48
- >
49
- <Image
50
- className="mx-auto mt-2"
51
- src="/assets/images/arcjet-light.svg"
52
- alt="Arcjet"
53
- width={128}
54
- height={38}
55
- />
56
- </a>
57
- </>
58
- );
59
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/app/[locale]/(marketing)/layout.tsx DELETED
@@ -1,96 +0,0 @@
1
- import { DemoBanner } from '@/components/DemoBanner';
2
- import { LocaleSwitcher } from '@/components/LocaleSwitcher';
3
- import { BaseTemplate } from '@/templates/BaseTemplate';
4
- import { getTranslations, setRequestLocale } from 'next-intl/server';
5
- import Link from 'next/link';
6
-
7
- export default async function Layout(props: {
8
- children: React.ReactNode;
9
- params: Promise<{ locale: string }>;
10
- }) {
11
- const { locale } = await props.params;
12
- setRequestLocale(locale);
13
- const t = await getTranslations({
14
- locale,
15
- namespace: 'RootLayout',
16
- });
17
-
18
- return (
19
- <>
20
- <DemoBanner />
21
- <BaseTemplate
22
- leftNav={(
23
- <>
24
- <li>
25
- <Link
26
- href="/"
27
- className="border-none text-gray-700 hover:text-gray-900"
28
- >
29
- {t('home_link')}
30
- </Link>
31
- </li>
32
- <li>
33
- <Link
34
- href="/about/"
35
- className="border-none text-gray-700 hover:text-gray-900"
36
- >
37
- {t('about_link')}
38
- </Link>
39
- </li>
40
- <li>
41
- <Link
42
- href="/counter/"
43
- className="border-none text-gray-700 hover:text-gray-900"
44
- >
45
- {t('counter_link')}
46
- </Link>
47
- </li>
48
- <li>
49
- <Link
50
- href="/portfolio/"
51
- className="border-none text-gray-700 hover:text-gray-900"
52
- >
53
- {t('portfolio_link')}
54
- </Link>
55
- </li>
56
- <li>
57
- <a
58
- className="border-none text-gray-700 hover:text-gray-900"
59
- href="https://github.com/ixartz/Next-js-Boilerplate"
60
- >
61
- GitHub
62
- </a>
63
- </li>
64
- </>
65
- )}
66
- rightNav={(
67
- <>
68
- <li>
69
- <Link
70
- href="/sign-in/"
71
- className="border-none text-gray-700 hover:text-gray-900"
72
- >
73
- {t('sign_in_link')}
74
- </Link>
75
- </li>
76
-
77
- <li>
78
- <Link
79
- href="/sign-up/"
80
- className="border-none text-gray-700 hover:text-gray-900"
81
- >
82
- {t('sign_up_link')}
83
- </Link>
84
- </li>
85
-
86
- <li>
87
- <LocaleSwitcher />
88
- </li>
89
- </>
90
- )}
91
- >
92
- <div className="py-5 text-xl [&_p]:my-6">{props.children}</div>
93
- </BaseTemplate>
94
- </>
95
- );
96
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/app/[locale]/(marketing)/page.tsx DELETED
@@ -1,120 +0,0 @@
1
- import { Sponsors } from '@/components/Sponsors';
2
- import { getTranslations, setRequestLocale } from 'next-intl/server';
3
-
4
- type IIndexProps = {
5
- params: Promise<{ locale: string }>;
6
- };
7
-
8
- export async function generateMetadata(props: IIndexProps) {
9
- const { locale } = await props.params;
10
- const t = await getTranslations({
11
- locale,
12
- namespace: 'Index',
13
- });
14
-
15
- return {
16
- title: t('meta_title'),
17
- description: t('meta_description'),
18
- };
19
- }
20
-
21
- export default async function Index(props: IIndexProps) {
22
- const { locale } = await props.params;
23
- setRequestLocale(locale);
24
- const t = await getTranslations({
25
- locale,
26
- namespace: 'Index',
27
- });
28
-
29
- return (
30
- <>
31
- <p>
32
- {`Follow `}
33
- <a
34
- className="text-blue-700 hover:border-b-2 hover:border-blue-700"
35
- href="https://twitter.com/ixartz"
36
- target="_blank"
37
- rel="noreferrer noopener"
38
- >
39
- @Ixartz on Twitter
40
- </a>
41
- {` for updates and more information about the boilerplate.`}
42
- </p>
43
- <h2 className="mt-5 text-2xl font-bold">
44
- Boilerplate Code for Your Next.js Project with Tailwind CSS
45
- </h2>
46
- <p className="text-base">
47
- Next.js Boilerplate is a developer-friendly starter code for Next.js projects, built with Tailwind CSS and TypeScript.
48
- {' '}
49
- <span role="img" aria-label="zap">
50
- ⚡️
51
- </span>
52
- {' '}
53
- Designed with developer experience in mind, it includes:
54
- </p>
55
- <ul className="mt-3 text-base">
56
- <li>🚀 Next.js with App Router support</li>
57
- <li>🔥 TypeScript for type checking</li>
58
- <li>💎 Tailwind CSS integration</li>
59
- <li>
60
- 🔒 Authentication with
61
- {' '}
62
- <a
63
- className="font-bold text-blue-700 hover:border-b-2 hover:border-blue-700"
64
- href="https://clerk.com?utm_source=github&amp;utm_medium=sponsorship&amp;utm_campaign=nextjs-boilerplate"
65
- >
66
- Clerk
67
- </a>
68
- {' '}
69
- (includes passwordless, social, and multi-factor auth)
70
- </li>
71
- <li>📦 ORM with DrizzleORM (PostgreSQL, SQLite, MySQL support)</li>
72
- <li>
73
- 🌐 Multi-language support (i18n) with next-intl and
74
- {' '}
75
- <a
76
- className="font-bold text-blue-700 hover:border-b-2 hover:border-blue-700"
77
- href="https://l.crowdin.com/next-js"
78
- >
79
- Crowdin
80
- </a>
81
- </li>
82
- <li>🔴 Form handling (React Hook Form) and validation (Zod)</li>
83
- <li>📏 Linting and formatting (ESLint, Prettier)</li>
84
- <li>🦊 Git hooks and commit linting (Husky, Commitlint)</li>
85
- <li>🦺 Testing suite (Vitest, React Testing Library, Playwright)</li>
86
- <li>🎉 Storybook for UI development</li>
87
- <li>
88
- 🚨 Error monitoring (
89
- <a
90
- className="font-bold text-blue-700 hover:border-b-2 hover:border-blue-700"
91
- href="https://sentry.io/for/nextjs/?utm_source=github&amp;utm_medium=paid-community&amp;utm_campaign=general-fy25q1-nextjs&amp;utm_content=github-banner-nextjsboilerplate-logo"
92
- >
93
- Sentry
94
- </a>
95
- ) and logging (Pino.js)
96
- </li>
97
- <li>🖥️ Monitoring as Code (Checkly)</li>
98
- <li>
99
- 🔐 Security and bot protection (
100
- <a
101
- className="font-bold text-blue-700 hover:border-b-2 hover:border-blue-700"
102
- href="https://launch.arcjet.com/Q6eLbRE"
103
- >
104
- Arcjet
105
- </a>
106
- )
107
- </li>
108
- <li>🤖 SEO optimization (metadata, JSON-LD, Open Graph tags)</li>
109
- <li>⚙️ Development tools (VSCode config, bundler analyzer, changelog generation)</li>
110
- </ul>
111
- <p className="text-base">
112
- Our sponsors&apos; exceptional support has made this project possible.
113
- Their services integrate seamlessly with the boilerplate, and we
114
- recommend trying them out.
115
- </p>
116
- <h2 className="mt-5 text-2xl font-bold">{t('sponsors_title')}</h2>
117
- <Sponsors />
118
- </>
119
- );
120
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/app/[locale]/(marketing)/portfolio/[slug]/page.tsx DELETED
@@ -1,71 +0,0 @@
1
- import { routing } from '@/libs/i18nNavigation';
2
- import { getTranslations, setRequestLocale } from 'next-intl/server';
3
- import Image from 'next/image';
4
-
5
- type IPortfolioDetailProps = {
6
- params: Promise<{ slug: string; locale: string }>;
7
- };
8
-
9
- export function generateStaticParams() {
10
- return routing.locales
11
- .map(locale =>
12
- Array.from(Array.from({ length: 6 }).keys()).map(elt => ({
13
- slug: `${elt}`,
14
- locale,
15
- })),
16
- )
17
- .flat(1);
18
- }
19
-
20
- export async function generateMetadata(props: IPortfolioDetailProps) {
21
- const { locale, slug } = await props.params;
22
- const t = await getTranslations({
23
- locale,
24
- namespace: 'PortfolioSlug',
25
- });
26
-
27
- return {
28
- title: t('meta_title', { slug }),
29
- description: t('meta_description', { slug }),
30
- };
31
- }
32
-
33
- export default async function PortfolioDetail(props: IPortfolioDetailProps) {
34
- const { locale, slug } = await props.params;
35
- setRequestLocale(locale);
36
- const t = await getTranslations({
37
- locale,
38
- namespace: 'PortfolioSlug',
39
- });
40
-
41
- return (
42
- <>
43
- <h1 className="capitalize">{t('header', { slug })}</h1>
44
- <p>{t('content')}</p>
45
-
46
- <div className="mt-5 text-center text-sm">
47
- {`${t('log_management_powered_by')} `}
48
- <a
49
- className="text-blue-700 hover:border-b-2 hover:border-blue-700"
50
- href="https://betterstack.com/?utm_source=github&utm_medium=sponsorship&utm_campaign=next-js-boilerplate"
51
- >
52
- Better Stack
53
- </a>
54
- </div>
55
-
56
- <a
57
- href="https://betterstack.com/?utm_source=github&utm_medium=sponsorship&utm_campaign=next-js-boilerplate"
58
- >
59
- <Image
60
- className="mx-auto mt-2"
61
- src="/assets/images/better-stack-dark.png"
62
- alt="Better Stack"
63
- width={128}
64
- height={22}
65
- />
66
- </a>
67
- </>
68
- );
69
- };
70
-
71
- export const dynamicParams = false;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/app/[locale]/(marketing)/portfolio/page.tsx DELETED
@@ -1,76 +0,0 @@
1
- import { getTranslations, setRequestLocale } from 'next-intl/server';
2
- import Image from 'next/image';
3
- import Link from 'next/link';
4
-
5
- type IPortfolioProps = {
6
- params: Promise<{ locale: string }>;
7
- };
8
-
9
- export async function generateMetadata(props: IPortfolioProps) {
10
- const { locale } = await props.params;
11
- const t = await getTranslations({
12
- locale,
13
- namespace: 'Portfolio',
14
- });
15
-
16
- return {
17
- title: t('meta_title'),
18
- description: t('meta_description'),
19
- };
20
- }
21
-
22
- export default async function Portfolio(props: IPortfolioProps) {
23
- const { locale } = await props.params;
24
- setRequestLocale(locale);
25
- const t = await getTranslations({
26
- locale,
27
- namespace: 'Portfolio',
28
- });
29
-
30
- return (
31
- <>
32
- <p>{t('presentation')}</p>
33
-
34
- <div className="grid grid-cols-1 justify-items-start gap-3 md:grid-cols-2 xl:grid-cols-3">
35
- {Array.from(Array.from({ length: 6 }).keys()).map(elt => (
36
- <Link
37
- className="hover:text-blue-700"
38
- key={elt}
39
- href={`/portfolio/${elt}`}
40
- >
41
- {t('portfolio_name', { name: elt })}
42
- </Link>
43
- ))}
44
- </div>
45
-
46
- <div className="mt-5 text-center text-sm">
47
- {`${t('error_reporting_powered_by')} `}
48
- <a
49
- className="text-blue-700 hover:border-b-2 hover:border-blue-700"
50
- href="https://sentry.io/for/nextjs/?utm_source=github&utm_medium=paid-community&utm_campaign=general-fy25q1-nextjs&utm_content=github-banner-nextjsboilerplate-logo"
51
- >
52
- Sentry
53
- </a>
54
- {` - ${t('coverage_powered_by')} `}
55
- <a
56
- className="text-blue-700 hover:border-b-2 hover:border-blue-700"
57
- href="https://about.codecov.io/codecov-free-trial/?utm_source=github&utm_medium=paid-community&utm_campaign=general-fy25q1-nextjs&utm_content=github-banner-nextjsboilerplate-logo"
58
- >
59
- Codecov
60
- </a>
61
- </div>
62
-
63
- <a
64
- href="https://sentry.io/for/nextjs/?utm_source=github&utm_medium=paid-community&utm_campaign=general-fy25q1-nextjs&utm_content=github-banner-nextjsboilerplate-logo"
65
- >
66
- <Image
67
- className="mx-auto mt-2"
68
- src="/assets/images/sentry-dark.png"
69
- alt="Sentry"
70
- width={128}
71
- height={38}
72
- />
73
- </a>
74
- </>
75
- );
76
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/app/[locale]/layout.tsx DELETED
@@ -1,102 +0,0 @@
1
- import type { Metadata } from 'next';
2
- import { DemoBadge } from '@/components/DemoBadge';
3
- import arcjet, { detectBot, request } from '@/libs/Arcjet';
4
- import { Env } from '@/libs/Env';
5
- import { routing } from '@/libs/i18nNavigation';
6
- import { NextIntlClientProvider } from 'next-intl';
7
- import { getMessages, setRequestLocale } from 'next-intl/server';
8
- import { notFound } from 'next/navigation';
9
- import '@/styles/global.css';
10
-
11
- export const metadata: Metadata = {
12
- icons: [
13
- {
14
- rel: 'apple-touch-icon',
15
- url: '/apple-touch-icon.png',
16
- },
17
- {
18
- rel: 'icon',
19
- type: 'image/png',
20
- sizes: '32x32',
21
- url: '/favicon-32x32.png',
22
- },
23
- {
24
- rel: 'icon',
25
- type: 'image/png',
26
- sizes: '16x16',
27
- url: '/favicon-16x16.png',
28
- },
29
- {
30
- rel: 'icon',
31
- url: '/favicon.ico',
32
- },
33
- ],
34
- };
35
-
36
- export function generateStaticParams() {
37
- return routing.locales.map(locale => ({ locale }));
38
- }
39
-
40
- // Improve security with Arcjet
41
- const aj = arcjet.withRule(
42
- detectBot({
43
- mode: 'LIVE',
44
- // Block all bots except the following
45
- allow: [
46
- // See https://docs.arcjet.com/bot-protection/identifying-bots
47
- 'CATEGORY:SEARCH_ENGINE', // Allow search engines
48
- 'CATEGORY:PREVIEW', // Allow preview links to show OG images
49
- 'CATEGORY:MONITOR', // Allow uptime monitoring services
50
- ],
51
- }),
52
- );
53
-
54
- export default async function RootLayout(props: {
55
- children: React.ReactNode;
56
- params: Promise<{ locale: string }>;
57
- }) {
58
- const { locale } = await props.params;
59
-
60
- if (!routing.locales.includes(locale)) {
61
- notFound();
62
- }
63
-
64
- setRequestLocale(locale);
65
-
66
- // Verify the request with Arcjet
67
- if (Env.ARCJET_KEY) {
68
- const req = await request();
69
- const decision = await aj.protect(req);
70
-
71
- // These errors are handled by the global error boundary, but you could also
72
- // redirect or show a custom error page
73
- if (decision.isDenied()) {
74
- if (decision.reason.isBot()) {
75
- throw new Error('No bots allowed');
76
- }
77
-
78
- throw new Error('Access denied');
79
- }
80
- }
81
-
82
- // Using internationalization in Client Components
83
- const messages = await getMessages();
84
-
85
- // The `suppressHydrationWarning` attribute in <body> is used to prevent hydration errors caused by Sentry Overlay,
86
- // which dynamically adds a `style` attribute to the body tag.
87
-
88
- return (
89
- <html lang={locale}>
90
- <body suppressHydrationWarning>
91
- <NextIntlClientProvider
92
- locale={locale}
93
- messages={messages}
94
- >
95
- {props.children}
96
-
97
- <DemoBadge />
98
- </NextIntlClientProvider>
99
- </body>
100
- </html>
101
- );
102
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/app/layout.tsx ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import type { Metadata } from 'next';
2
+ import { Navbar } from '@/components/Navbar';
3
+ import { isDevMode } from '@/utils/Helpers';
4
+ import { Inter, Outfit } from 'next/font/google';
5
+ import '../styles/global.css';
6
+
7
+ const inter = Inter({
8
+ subsets: ['latin'],
9
+ variable: '--font-sans',
10
+ });
11
+
12
+ // Use Outfit from Google Fonts instead of Cal Sans
13
+ const outfit = Outfit({
14
+ subsets: ['latin'],
15
+ variable: '--font-heading',
16
+ });
17
+
18
+ export const metadata: Metadata = {
19
+ title: 'X-App',
20
+ description: 'A clone of Jan.ai built with Next.js and Tailwind CSS',
21
+ };
22
+
23
+ export default function RootLayout({
24
+ children,
25
+ }: {
26
+ children: React.ReactNode;
27
+ }) {
28
+ return (
29
+ <html lang="en" suppressHydrationWarning>
30
+ <body className={`${inter.variable} ${outfit.variable} font-sans antialiased`} suppressHydrationWarning={isDevMode}>
31
+ <Navbar />
32
+ {children}
33
+ </body>
34
+ </html>
35
+ );
36
+ }
src/app/page.tsx ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { AnnouncementBanner } from '@/components/homepage/AnnouncementBanner';
2
+ import { CustomizationSection } from '@/components/homepage/CustomizationSection';
3
+ import { FeaturesSection } from '@/components/homepage/FeatureSection';
4
+
5
+ export default function Home() {
6
+ return (
7
+ <main className="flex min-h-screen flex-col">
8
+ <div className="flex-1 space-y-16 pb-8 pt-20 md:pb-12 md:pt-24 lg:py-32">
9
+ <AnnouncementBanner />
10
+ <FeaturesSection />
11
+ <CustomizationSection />
12
+ </div>
13
+ </main>
14
+ );
15
+ }
src/components/CounterForm.tsx DELETED
@@ -1,63 +0,0 @@
1
- 'use client';
2
-
3
- import type { z } from 'zod';
4
- import { CounterValidation } from '@/validations/CounterValidation';
5
- import { zodResolver } from '@hookform/resolvers/zod';
6
- import { useTranslations } from 'next-intl';
7
- import { useRouter } from 'next/navigation';
8
- import { useForm } from 'react-hook-form';
9
-
10
- export const CounterForm = () => {
11
- const t = useTranslations('CounterForm');
12
- const form = useForm<z.infer<typeof CounterValidation>>({
13
- resolver: zodResolver(CounterValidation),
14
- defaultValues: {
15
- increment: 0,
16
- },
17
- });
18
- const router = useRouter();
19
-
20
- const handleIncrement = form.handleSubmit(async (data) => {
21
- await fetch(`/api/counter`, {
22
- method: 'PUT',
23
- headers: {
24
- 'Content-Type': 'application/json',
25
- },
26
- body: JSON.stringify(data),
27
- });
28
-
29
- form.reset();
30
- router.refresh();
31
- });
32
-
33
- return (
34
- <form onSubmit={handleIncrement}>
35
- <p>{t('presentation')}</p>
36
- <div>
37
- <label className="text-sm font-bold text-gray-700" htmlFor="increment">
38
- {t('label_increment')}
39
- <input
40
- id="increment"
41
- type="number"
42
- className="ml-2 w-32 appearance-none rounded border px-2 py-1 text-sm leading-tight text-gray-700 focus:outline-none focus:ring focus:ring-blue-300/50"
43
- {...form.register('increment')}
44
- />
45
- </label>
46
-
47
- {form.formState.errors.increment?.message && (
48
- <div className="my-2 text-xs italic text-red-500">{form.formState.errors.increment?.message}</div>
49
- )}
50
- </div>
51
-
52
- <div className="mt-2">
53
- <button
54
- className="rounded bg-blue-500 px-5 py-1 font-bold text-white hover:bg-blue-600 focus:outline-none focus:ring focus:ring-blue-300/50 disabled:pointer-events-none disabled:opacity-50"
55
- type="submit"
56
- disabled={form.formState.isSubmitting}
57
- >
58
- {t('button_increment')}
59
- </button>
60
- </div>
61
- </form>
62
- );
63
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/components/CurrentCount.tsx DELETED
@@ -1,26 +0,0 @@
1
- import { db } from '@/libs/DB';
2
- import { logger } from '@/libs/Logger';
3
- import { counterSchema } from '@/models/Schema';
4
- import { eq } from 'drizzle-orm';
5
- import { getTranslations } from 'next-intl/server';
6
- import { headers } from 'next/headers';
7
-
8
- export const CurrentCount = async () => {
9
- const t = await getTranslations('CurrentCount');
10
-
11
- // `x-e2e-random-id` is used for end-to-end testing to make isolated requests
12
- // The default value is 0 when there is no `x-e2e-random-id` header
13
- const id = Number((await headers()).get('x-e2e-random-id')) ?? 0;
14
- const result = await db.query.counterSchema.findMany({
15
- where: eq(counterSchema.id, id),
16
- });
17
- const count = result[0]?.count ?? 0;
18
-
19
- logger.info('Counter fetched successfully');
20
-
21
- return (
22
- <div>
23
- {t('count', { count })}
24
- </div>
25
- );
26
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/components/DemoBadge.tsx DELETED
@@ -1,12 +0,0 @@
1
- export const DemoBadge = () => (
2
- <div className="fixed bottom-0 right-20 z-10">
3
- <a
4
- href="https://github.com/ixartz/Next-js-Boilerplate"
5
- >
6
- <div className="rounded-md bg-gray-900 px-3 py-2 font-semibold text-gray-100">
7
- <span className="text-gray-500">Demo of</span>
8
- {` Next.js Boilerplate`}
9
- </div>
10
- </a>
11
- </div>
12
- );
 
 
 
 
 
 
 
 
 
 
 
 
 
src/components/DemoBanner.tsx DELETED
@@ -1,9 +0,0 @@
1
- import Link from 'next/link';
2
-
3
- export const DemoBanner = () => (
4
- <div className="sticky top-0 z-50 bg-gray-900 p-4 text-center text-lg font-semibold text-gray-100 [&_a:hover]:text-indigo-500 [&_a]:text-fuchsia-500">
5
- Live Demo of Next.js Boilerplate -
6
- {' '}
7
- <Link href="/sign-up">Explore the Authentication</Link>
8
- </div>
9
- );
 
 
 
 
 
 
 
 
 
 
src/components/Hello.tsx DELETED
@@ -1,30 +0,0 @@
1
- import { currentUser } from '@clerk/nextjs/server';
2
- import { getTranslations } from 'next-intl/server';
3
- import { Sponsors } from './Sponsors';
4
-
5
- export const Hello = async () => {
6
- const t = await getTranslations('Dashboard');
7
- const user = await currentUser();
8
-
9
- return (
10
- <>
11
- <p>
12
- {`👋 `}
13
- {t('hello_message', { email: user?.emailAddresses[0]?.emailAddress })}
14
- </p>
15
- <p>
16
- {t.rich('alternative_message', {
17
- url: () => (
18
- <a
19
- className="text-blue-700 hover:border-b-2 hover:border-blue-700"
20
- href="https://nextjs-boilerplate.com/pro-saas-starter-kit"
21
- >
22
- Next.js Boilerplate SaaS
23
- </a>
24
- ),
25
- })}
26
- </p>
27
- <Sponsors />
28
- </>
29
- );
30
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/components/LocaleSwitcher.tsx DELETED
@@ -1,32 +0,0 @@
1
- 'use client';
2
-
3
- import type { ChangeEventHandler } from 'react';
4
- import { routing, usePathname } from '@/libs/i18nNavigation';
5
- import { useLocale } from 'next-intl';
6
- import { useRouter } from 'next/navigation';
7
-
8
- export const LocaleSwitcher = () => {
9
- const router = useRouter();
10
- const pathname = usePathname();
11
- const locale = useLocale();
12
-
13
- const handleChange: ChangeEventHandler<HTMLSelectElement> = (event) => {
14
- router.push(`/${event.target.value}${pathname}`);
15
- router.refresh();
16
- };
17
-
18
- return (
19
- <select
20
- defaultValue={locale}
21
- onChange={handleChange}
22
- className="border border-gray-300 font-medium focus:outline-none focus-visible:ring"
23
- aria-label="lang-switcher"
24
- >
25
- {routing.locales.map(elt => (
26
- <option key={elt} value={elt}>
27
- {elt.toUpperCase()}
28
- </option>
29
- ))}
30
- </select>
31
- );
32
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/components/Navbar.tsx ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 'use client';
2
+ import { Button, Input } from '@/components/atoms';
3
+ import { Search, Settings } from 'lucide-react';
4
+ import Link from 'next/link';
5
+
6
+ export function Navbar() {
7
+ return (
8
+ <nav className="fixed top-0 z-50 w-full border-b bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60">
9
+ <div className="container flex h-14 items-center">
10
+ <div className="mr-4 flex items-center gap-2">
11
+ <span className="text-xl">👋</span>
12
+ <Link href="/" className="font-semibold">
13
+ Jan
14
+ </Link>
15
+ </div>
16
+
17
+ <div className="flex items-center gap-6 text-sm">
18
+ <Link href="/documentation" className="hover:text-foreground/80">
19
+ Documentation
20
+ </Link>
21
+ <Link href="/changelog" className="hover:text-foreground/80">
22
+ Changelog
23
+ </Link>
24
+ <Link href="/about" className="hover:text-foreground/80">
25
+ About
26
+ </Link>
27
+ </div>
28
+
29
+ <div className="ml-auto flex items-center gap-4">
30
+ <div className="relative w-64">
31
+ <Search className="absolute left-2 top-2.5 size-4 text-muted-foreground" />
32
+ <Input placeholder="Search documentation..." className="pl-8" />
33
+ </div>
34
+ <Link href="/blog" className="hover:text-foreground/80">
35
+ Blog
36
+ </Link>
37
+ <Button variant="ghost" size="icon">
38
+ <Settings className="size-5" />
39
+ </Button>
40
+ </div>
41
+ </div>
42
+ </nav>
43
+ );
44
+ }
src/components/Sponsors.tsx DELETED
@@ -1,115 +0,0 @@
1
- /* eslint-disable react-dom/no-unsafe-target-blank */
2
- import Image from 'next/image';
3
-
4
- export const Sponsors = () => (
5
- <table className="border-collapse">
6
- <tbody>
7
- <tr className="h-56">
8
- <td className="border-2 border-gray-300 p-3">
9
- <a
10
- href="https://clerk.com?utm_source=github&utm_medium=sponsorship&utm_campaign=nextjs-boilerplate"
11
- target="_blank"
12
- rel="noopener"
13
- >
14
- <Image
15
- src="/assets/images/clerk-logo-dark.png"
16
- alt="Clerk – Authentication & User Management for Next.js"
17
- width={260}
18
- height={224}
19
- />
20
- </a>
21
- </td>
22
- <td className="border-2 border-gray-300 p-3">
23
- <a href="https://l.crowdin.com/next-js" target="_blank" rel="noopener">
24
- <Image
25
- src="/assets/images/crowdin-dark.png"
26
- alt="Crowdin"
27
- width={260}
28
- height={224}
29
- />
30
- </a>
31
- </td>
32
- <td className="border-2 border-gray-300 p-3">
33
- <a
34
- href="https://sentry.io/for/nextjs/?utm_source=github&utm_medium=paid-community&utm_campaign=general-fy25q1-nextjs&utm_content=github-banner-nextjsboilerplate-logo"
35
- target="_blank"
36
- rel="noopener"
37
- >
38
- <Image
39
- src="/assets/images/sentry-dark.png"
40
- alt="Sentry"
41
- width={260}
42
- height={224}
43
- />
44
- </a>
45
- </td>
46
- </tr>
47
- <tr className="h-56">
48
- <td className="border-2 border-gray-300 p-3">
49
- <a href="https://launch.arcjet.com/Q6eLbRE">
50
- <Image
51
- src="/assets/images/arcjet-light.svg"
52
- alt="Arcjet"
53
- width={260}
54
- height={224}
55
- />
56
- </a>
57
- </td>
58
- <td className="border-2 border-gray-300 p-3">
59
- <a
60
- href="https://posthog.com/?utm_source=github&utm_medium=sponsorship&utm_campaign=next-js-boilerplate"
61
- target="_blank"
62
- rel="noopener"
63
- >
64
- <Image
65
- src="https://posthog.com/brand/posthog-logo.svg"
66
- alt="PostHog"
67
- width={260}
68
- height={224}
69
- />
70
- </a>
71
- </td>
72
- <td className="border-2 border-gray-300 p-3">
73
- <a
74
- href="https://betterstack.com/?utm_source=github&utm_medium=sponsorship&utm_campaign=next-js-boilerplate"
75
- target="_blank"
76
- rel="noopener"
77
- >
78
- <Image
79
- src="/assets/images/better-stack-dark.png"
80
- alt="Better Stack"
81
- width={260}
82
- height={224}
83
- />
84
- </a>
85
- </td>
86
- </tr>
87
- <tr className="h-56">
88
- <td className="border-2 border-gray-300 p-3">
89
- <a
90
- href="https://www.checklyhq.com/?utm_source=github&utm_medium=sponsorship&utm_campaign=next-js-boilerplate"
91
- target="_blank"
92
- rel="noopener"
93
- >
94
- <Image
95
- src="/assets/images/checkly-logo-light.png"
96
- alt="Checkly"
97
- width={260}
98
- height={224}
99
- />
100
- </a>
101
- </td>
102
- <td className="border-2 border-gray-300 p-3">
103
- <a href="https://nextjs-boilerplate.com/pro-saas-starter-kit">
104
- <Image
105
- src="/assets/images/nextjs-boilerplate-saas.png"
106
- alt="Next.js SaaS Boilerplate"
107
- width={260}
108
- height={224}
109
- />
110
- </a>
111
- </td>
112
- </tr>
113
- </tbody>
114
- </table>
115
- );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/components/atoms/Badge/index.tsx ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import type * as React from 'react';
2
+ import { cn } from '@/utils/Helpers';
3
+ import { cva, type VariantProps } from 'class-variance-authority';
4
+
5
+ const badgeVariants = cva(
6
+ 'inline-flex items-center rounded-md 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',
7
+ {
8
+ variants: {
9
+ variant: {
10
+ default: 'border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80',
11
+ secondary: 'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80',
12
+ destructive: 'border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80',
13
+ outline: 'text-foreground',
14
+ },
15
+ },
16
+ defaultVariants: {
17
+ variant: 'default',
18
+ },
19
+ },
20
+ );
21
+
22
+ export type BadgeProps = {} & React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof badgeVariants>;
23
+
24
+ function Badge({ className, variant, ...props }: BadgeProps) {
25
+ return <div className={cn(badgeVariants({ variant }), className)} {...props} />;
26
+ }
27
+
28
+ // eslint-disable-next-line react-refresh/only-export-components
29
+ export { Badge, badgeVariants };
src/components/atoms/Button/index.tsx ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* eslint-disable react-refresh/only-export-components */
2
+ import { cn } from '@/utils/Helpers';
3
+ import { cva, type VariantProps } from 'class-variance-authority';
4
+ import { type ButtonHTMLAttributes, type FC, memo, type PropsWithChildren, type Ref } from 'react';
5
+
6
+ const buttonVariants = cva(
7
+ 'inline-flex items-center justify-center 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',
8
+ {
9
+ variants: {
10
+ variant: {
11
+ default: 'bg-primary text-primary-foreground shadow hover:bg-primary/90',
12
+ destructive: 'bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90',
13
+ outline: 'border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground',
14
+ secondary: 'bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80',
15
+ ghost: 'hover:bg-accent hover:text-accent-foreground',
16
+ link: 'text-primary underline-offset-4 hover:underline',
17
+ },
18
+ size: {
19
+ default: 'h-9 px-4 py-2',
20
+ sm: 'h-8 rounded-md px-3 text-xs',
21
+ lg: 'h-10 rounded-md px-8',
22
+ icon: 'size-9',
23
+ },
24
+ },
25
+ defaultVariants: {
26
+ variant: 'default',
27
+ size: 'default',
28
+ },
29
+ },
30
+ );
31
+
32
+ export type ButtonProps = {
33
+ className?: string;
34
+ ref?: Ref<HTMLButtonElement> ;
35
+ } & PropsWithChildren & ButtonHTMLAttributes<HTMLButtonElement> & VariantProps<typeof buttonVariants> & Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'className'>;
36
+
37
+ const Button: FC<ButtonProps> = memo(({
38
+ className = '',
39
+ variant,
40
+ size,
41
+ children = null,
42
+ ref,
43
+ ...rest
44
+ }) => {
45
+ return (
46
+ <button className={cn(buttonVariants({ variant, size, className }))} type="button" {...rest} ref={ref}>{children}</button>
47
+ );
48
+ });
49
+
50
+ Button.displayName = 'Button';
51
+
52
+ export { Button, buttonVariants };
src/components/atoms/Card/index.tsx ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { cn } from '@/utils/Helpers';
2
+ import * as React from 'react';
3
+
4
+ const Card = ({ ref, className, ...props }: React.HTMLAttributes<HTMLDivElement> & { ref?: React.RefObject<HTMLDivElement> }) => (
5
+ <div ref={ref} className={cn('rounded-lg border bg-card text-card-foreground shadow-sm', className)} {...props} />
6
+ );
7
+ Card.displayName = 'Card';
8
+
9
+ const CardHeader = ({ ref, className, ...props }: React.HTMLAttributes<HTMLDivElement> & { ref: React.RefObject<HTMLDivElement> }) => (
10
+ <div ref={ref} className={cn('flex flex-col space-y-1.5 p-6', className)} {...props} />
11
+ );
12
+ CardHeader.displayName = 'CardHeader';
13
+
14
+ const CardTitle = ({ ref, className, ...props }: React.HTMLAttributes<HTMLHeadingElement> & { ref: React.RefObject<HTMLParagraphElement> }) => (
15
+ // eslint-disable-next-line jsx-a11y/heading-has-content
16
+ <h3 ref={ref} className={cn('text-2xl font-semibold leading-none tracking-tight', className)} {...props} />
17
+ );
18
+ CardTitle.displayName = 'CardTitle';
19
+
20
+ const CardDescription = ({ ref, className, ...props }: React.HTMLAttributes<HTMLParagraphElement> & { ref: React.RefObject<HTMLParagraphElement> }) => (
21
+ <p ref={ref} className={cn('text-sm text-muted-foreground', className)} {...props} />
22
+ );
23
+ CardDescription.displayName = 'CardDescription';
24
+
25
+ const CardContent = ({ ref, className, ...props }: React.HTMLAttributes<HTMLDivElement> & { ref?: React.RefObject<HTMLDivElement> }) => <div ref={ref} className={cn('p-6 pt-0', className)} {...props} />;
26
+ CardContent.displayName = 'CardContent';
27
+
28
+ const CardFooter = ({ ref, className, ...props }: React.HTMLAttributes<HTMLDivElement> & { ref: React.RefObject<HTMLDivElement> }) => (
29
+ <div ref={ref} className={cn('flex items-center p-6 pt-0', className)} {...props} />
30
+ );
31
+ CardFooter.displayName = 'CardFooter';
32
+
33
+ export { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle };
src/components/atoms/Input/index.tsx ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { cn } from '@/utils/Helpers';
2
+ import { type FC, type InputHTMLAttributes, memo, type Ref } from 'react';
3
+
4
+ type InputProps = {
5
+ className?: string;
6
+ placeholder?: string;
7
+ ref?: Ref<HTMLInputElement> ;
8
+ } & InputHTMLAttributes<HTMLInputElement> & Omit<InputHTMLAttributes<HTMLInputElement>, 'className'>;
9
+
10
+ const Input: FC<InputProps> = memo(({
11
+ className = '',
12
+ placeholder = '',
13
+ ref,
14
+ ...rest
15
+ }) => {
16
+ const baseClassName = `flex h-9 w-full rounded-md border border-input
17
+ bg-background px-3 py-1 text-sm shadow-sm transition-colors
18
+ file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground
19
+ focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring
20
+ disabled:cursor-not-allowed disabled:opacity-50`;
21
+
22
+ return (
23
+ <input className={cn(baseClassName, className)} placeholder={placeholder} {...rest} ref={ref} />
24
+ );
25
+ });
26
+
27
+ Input.displayName = 'Input';
28
+
29
+ export { Input };
src/components/atoms/index.ts ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ export { Badge } from './Badge';
2
+ export { Button } from './Button';
3
+ export * from './Card';
4
+ export { Input } from './Input';
src/components/homepage/AnnouncementBanner.tsx ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Badge, Button } from '@/components/atoms';
2
+ import { ChevronDown, Download } from 'lucide-react';
3
+ import Image from 'next/image';
4
+
5
+ export function AnnouncementBanner() {
6
+ return (
7
+ <>
8
+ <div className="container flex flex-col items-center gap-4 text-center">
9
+ <Badge className="rounded-lg" variant="secondary">
10
+ NEW
11
+ {' '}
12
+ <span className="mx-1">+</span>
13
+ {' '}
14
+ v0.5.14 is now live on GitHub. Check it out!
15
+ </Badge>
16
+
17
+ <span className="text-4xl">❝</span>
18
+
19
+ <h1 className="font-heading text-3xl sm:text-5xl md:text-6xl lg:text-7xl">
20
+ Chat with AI
21
+ <br />
22
+ without privacy concerns
23
+ </h1>
24
+
25
+ <p className="max-w-2xl leading-normal text-muted-foreground sm:text-xl sm:leading-8">
26
+ Jan is an open source ChatGPT-alternative that runs 100% offline.
27
+ </p>
28
+
29
+ <div className="space-y-4">
30
+ <Button className="h-11 px-8" size="lg">
31
+ <Download className="mr-2 size-4" />
32
+ Download for Windows
33
+ <ChevronDown className="ml-2 size-4" />
34
+ </Button>
35
+ <p className="text-xs text-muted-foreground">
36
+ <span className="font-semibold text-yellow-500">2.5M+</span>
37
+ {' '}
38
+ downloads | Free & Open Source
39
+ </p>
40
+ </div>
41
+ </div>
42
+
43
+ <div className="container">
44
+ <div className="relative mx-auto aspect-video max-w-5xl overflow-hidden rounded-xl border bg-background shadow-xl">
45
+ <Image
46
+ src="https://sjc.microlink.io/-ax0tIqUfnMYpO1Y6sFNuRcGN_Oe6cQwpzrnQR5q5pzkpfA29UGKZ228lDnpeQCpNANORBcNBmQgFoOtLn18vw.jpeg"
47
+ alt="Jan AI Interface"
48
+ fill
49
+ className="object-cover"
50
+ priority
51
+ />
52
+ </div>
53
+ </div>
54
+ </>
55
+ );
56
+ }
src/components/homepage/CustomizationSection.tsx ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Badge, Card } from '@/components/atoms';
2
+ import Image from 'next/image';
3
+
4
+ export function CustomizationSection() {
5
+ return (
6
+ <section className="container space-y-16 py-24">
7
+ <div className="space-y-4 text-center">
8
+ <h2 className="font-heading text-4xl md:text-5xl lg:text-6xl">Highly Customizable</h2>
9
+ <p className="text-xl text-muted-foreground">Customize Jan to match your needs and preferences.</p>
10
+ </div>
11
+
12
+ <div className="grid gap-8 md:grid-cols-2">
13
+ {/* Assistants & Memory Card */}
14
+ <Card className="space-y-4 p-6">
15
+ <div className="space-y-2">
16
+ <div className="flex items-center gap-2">
17
+ <h3 className="text-2xl font-semibold">Assistants & Memory</h3>
18
+ <Badge variant="secondary" className="bg-blue-100 text-blue-700 hover:bg-blue-100">
19
+ Coming Soon
20
+ </Badge>
21
+ </div>
22
+ <p className="text-muted-foreground">
23
+ Create personalized AI assistants that remember your conversations and execute specific tasks across your
24
+ systems.
25
+ </p>
26
+ </div>
27
+
28
+ <Image
29
+ src="https://jan.ai/assets/images/homepage/assistant-light.png"
30
+ alt="App Screenshot Feature"
31
+ width={800}
32
+ height={800}
33
+ className="object-contain"
34
+ />
35
+ </Card>
36
+
37
+ {/* Extensions Card */}
38
+ <Card className="space-y-4 p-6">
39
+ <div className="space-y-2">
40
+ <h3 className="text-2xl font-semibold">Extensions</h3>
41
+ <p className="text-muted-foreground">
42
+ Customize Jan with Extensions, that range from Cloud AI connectors, tools, data connectors.
43
+ </p>
44
+ </div>
45
+
46
+ <Image
47
+ src="https://jan.ai/assets/images/homepage/extension-light.png"
48
+ alt="App Screenshot Feature"
49
+ width={800}
50
+ height={800}
51
+ className="object-contain"
52
+ />
53
+ </Card>
54
+ </div>
55
+ </section>
56
+ );
57
+ }
src/components/homepage/FeatureSection.tsx ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Badge } from '@/components/atoms';
2
+ import { Cloud, FileText, Grid, MessageCircle, Server } from 'lucide-react';
3
+ import Image from 'next/image';
4
+
5
+ const features = [
6
+ {
7
+ number: '01',
8
+ title: 'Chat with AI',
9
+ description: 'Ask your questions, brainstorm, and learn from the AI running on your device to be more productive.',
10
+ icon: MessageCircle,
11
+ },
12
+ {
13
+ number: '02',
14
+ title: 'Model Hub',
15
+ description: 'Access and manage various AI models directly from your device.',
16
+ icon: Grid,
17
+ },
18
+ {
19
+ number: '03',
20
+ title: 'Connect to Cloud AIs',
21
+ description: 'Seamlessly integrate with cloud-based AI services when needed.',
22
+ icon: Cloud,
23
+ },
24
+ {
25
+ number: '04',
26
+ title: 'Local API Server',
27
+ description: 'Run your own API server locally for complete control and privacy.',
28
+ icon: Server,
29
+ },
30
+ {
31
+ number: '05',
32
+ title: 'Chat with your files',
33
+ description: 'Interact with your documents and files using natural language.',
34
+ icon: FileText,
35
+ experimental: true,
36
+ },
37
+ ];
38
+
39
+ export function FeaturesSection() {
40
+ return (
41
+ <section className="container space-y-16 py-24">
42
+ <h2 className="font-heading text-4xl md:text-5xl lg:text-6xl">Features</h2>
43
+
44
+ <div className="grid items-start gap-8 lg:grid-cols-2">
45
+ <div className="space-y-8">
46
+ {features.map(feature => (
47
+ <div key={feature.number} className="flex items-center gap-4">
48
+ <div className="font-heading text-3xl text-muted-foreground/50">{feature.number}</div>
49
+ <div className="space-y-2">
50
+ <div className="flex items-center gap-2">
51
+ <h3 className="text-xl font-semibold">{feature.title}</h3>
52
+ {feature.experimental && (
53
+ <Badge variant="secondary" className="text-xs">
54
+ Experimental
55
+ </Badge>
56
+ )}
57
+ </div>
58
+ <p className="text-muted-foreground">{feature.description}</p>
59
+ </div>
60
+ </div>
61
+ ))}
62
+ </div>
63
+
64
+ <Image
65
+ src="https://jan.ai/assets/images/homepage/features01.png"
66
+ alt="App Screenshot Feature"
67
+ width={800}
68
+ height={800}
69
+ />
70
+ </div>
71
+ </section>
72
+ );
73
+ }
src/middleware.ts DELETED
@@ -1,55 +0,0 @@
1
- import type { NextFetchEvent, NextRequest } from 'next/server';
2
- import { clerkMiddleware, createRouteMatcher } from '@clerk/nextjs/server';
3
- import createMiddleware from 'next-intl/middleware';
4
- import { routing } from './libs/i18nNavigation';
5
-
6
- const intlMiddleware = createMiddleware(routing);
7
-
8
- const isProtectedRoute = createRouteMatcher([
9
- '/dashboard(.*)',
10
- '/:locale/dashboard(.*)',
11
- ]);
12
-
13
- const isAuthPage = createRouteMatcher([
14
- '/sign-in(.*)',
15
- '/:locale/sign-in(.*)',
16
- '/sign-up(.*)',
17
- '/:locale/sign-up(.*)',
18
- ]);
19
-
20
- export default function middleware(
21
- request: NextRequest,
22
- event: NextFetchEvent,
23
- ) {
24
- // Run Clerk middleware only when it's necessary
25
- if (
26
- isAuthPage(request) || isProtectedRoute(request)
27
- ) {
28
- return clerkMiddleware(async (auth, req) => {
29
- if (isProtectedRoute(req)) {
30
- const locale
31
- = req.nextUrl.pathname.match(/(\/.*)\/dashboard/)?.at(1) ?? '';
32
-
33
- const signInUrl = new URL(`${locale}/sign-in`, req.url);
34
-
35
- await auth.protect({
36
- // `unauthenticatedUrl` is needed to avoid error: "Unable to find `next-intl` locale because the middleware didn't run on this request"
37
- unauthenticatedUrl: signInUrl.toString(),
38
- });
39
- }
40
-
41
- return intlMiddleware(req);
42
- })(request, event);
43
- }
44
-
45
- return intlMiddleware(request);
46
- }
47
-
48
- export const config = {
49
- matcher: [
50
- // Skip Next.js internals and all static files, unless found in search params
51
- '/((?!_next|monitoring|[^?]*\\.(?:html?|css|js(?!on)|jpe?g|webp|png|gif|svg|ttf|woff2?|ico|csv|docx?|xlsx?|zip|webmanifest)).*)',
52
- // Always run for API routes
53
- '/(api|trpc)(.*)',
54
- ],
55
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/styles/global.css CHANGED
@@ -1,3 +1,73 @@
1
  @tailwind base;
2
  @tailwind components;
3
  @tailwind utilities;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  @tailwind base;
2
  @tailwind components;
3
  @tailwind utilities;
4
+
5
+ @layer base {
6
+ :root {
7
+ /* Font */
8
+ --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
9
+ --font-heading: 'Cal Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial,
10
+ sans-serif;
11
+
12
+ /* Colors */
13
+ --background: 0 0% 100%;
14
+ --foreground: 0 0% 3.9%;
15
+
16
+ --card: 0 0% 100%;
17
+ --card-foreground: 0 0% 3.9%;
18
+
19
+ --popover: 0 0% 100%;
20
+ --popover-foreground: 0 0% 3.9%;
21
+
22
+ --primary: 0 0% 9%;
23
+ --primary-foreground: 0 0% 98%;
24
+
25
+ --secondary: 0 0% 96.1%;
26
+ --secondary-foreground: 0 0% 9%;
27
+
28
+ --muted: 0 0% 96.1%;
29
+ --muted-foreground: 0 0% 45.1%;
30
+
31
+ --accent: 0 0% 96.1%;
32
+ --accent-foreground: 0 0% 9%;
33
+
34
+ --destructive: 0 84.2% 60.2%;
35
+ --destructive-foreground: 0 0% 98%;
36
+
37
+ --border: 0 0% 89.8%;
38
+ --input: 0 0% 89.8%;
39
+ --ring: 0 0% 3.9%;
40
+
41
+ --radius: 0.5rem;
42
+ }
43
+
44
+ .dark {
45
+ --background: 0 0% 3.9%;
46
+ --foreground: 0 0% 98%;
47
+
48
+ --card: 0 0% 3.9%;
49
+ --card-foreground: 0 0% 98%;
50
+
51
+ --popover: 0 0% 3.9%;
52
+ --popover-foreground: 0 0% 98%;
53
+
54
+ --primary: 0 0% 98%;
55
+ --primary-foreground: 0 0% 9%;
56
+
57
+ --secondary: 0 0% 14.9%;
58
+ --secondary-foreground: 0 0% 98%;
59
+
60
+ --muted: 0 0% 14.9%;
61
+ --muted-foreground: 0 0% 63.9%;
62
+
63
+ --accent: 0 0% 14.9%;
64
+ --accent-foreground: 0 0% 98%;
65
+
66
+ --destructive: 0 62.8% 30.6%;
67
+ --destructive-foreground: 0 0% 98%;
68
+
69
+ --border: 0 0% 14.9%;
70
+ --input: 0 0% 14.9%;
71
+ --ring: 0 0% 83.1%;
72
+ }
73
+ }
src/utils/Helpers.ts CHANGED
@@ -1,4 +1,6 @@
1
  import { routing } from '@/libs/i18nNavigation';
 
 
2
 
3
  export const getBaseUrl = () => {
4
  if (process.env.NEXT_PUBLIC_APP_URL) {
@@ -26,3 +28,9 @@ export const getI18nPath = (url: string, locale: string) => {
26
 
27
  return `/${locale}${url}`;
28
  };
 
 
 
 
 
 
 
1
  import { routing } from '@/libs/i18nNavigation';
2
+ import { type ClassValue, clsx } from 'clsx';
3
+ import { twMerge } from 'tailwind-merge';
4
 
5
  export const getBaseUrl = () => {
6
  if (process.env.NEXT_PUBLIC_APP_URL) {
 
28
 
29
  return `/${locale}${url}`;
30
  };
31
+
32
+ export function cn(...inputs: ClassValue[]) {
33
+ return twMerge(clsx(inputs));
34
+ }
35
+
36
+ export const isDevMode = process.env.NODE_ENV !== 'production';
tailwind.config.ts CHANGED
@@ -1,9 +1,63 @@
1
  import type { Config } from 'tailwindcss';
2
 
3
- export default {
4
- content: ['./src/**/*.{js,ts,jsx,tsx}'],
 
5
  theme: {
6
- extend: {},
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7
  },
8
  plugins: [],
9
  } satisfies Config;
 
 
 
1
  import type { Config } from 'tailwindcss';
2
 
3
+ const config = {
4
+ darkMode: ['class'],
5
+ content: ['./pages/**/*.{ts,tsx}', './components/**/*.{ts,tsx}', './app/**/*.{ts,tsx}', './src/**/*.{ts,tsx}'],
6
  theme: {
7
+ container: {
8
+ center: true,
9
+ padding: '2rem',
10
+ screens: {
11
+ '2xl': '1400px',
12
+ },
13
+ },
14
+ extend: {
15
+ fontFamily: {
16
+ heading: ['var(--font-heading)', 'sans-serif'],
17
+ },
18
+ colors: {
19
+ border: 'hsl(var(--border))',
20
+ input: 'hsl(var(--input))',
21
+ ring: 'hsl(var(--ring))',
22
+ background: 'hsl(var(--background))',
23
+ foreground: 'hsl(var(--foreground))',
24
+ primary: {
25
+ DEFAULT: 'hsl(var(--primary))',
26
+ foreground: 'hsl(var(--primary-foreground))',
27
+ },
28
+ secondary: {
29
+ DEFAULT: 'hsl(var(--secondary))',
30
+ foreground: 'hsl(var(--secondary-foreground))',
31
+ },
32
+ destructive: {
33
+ DEFAULT: 'hsl(var(--destructive))',
34
+ foreground: 'hsl(var(--destructive-foreground))',
35
+ },
36
+ muted: {
37
+ DEFAULT: 'hsl(var(--muted))',
38
+ foreground: 'hsl(var(--muted-foreground))',
39
+ },
40
+ accent: {
41
+ DEFAULT: 'hsl(var(--accent))',
42
+ foreground: 'hsl(var(--accent-foreground))',
43
+ },
44
+ popover: {
45
+ DEFAULT: 'hsl(var(--popover))',
46
+ foreground: 'hsl(var(--popover-foreground))',
47
+ },
48
+ card: {
49
+ DEFAULT: 'hsl(var(--card))',
50
+ foreground: 'hsl(var(--card-foreground))',
51
+ },
52
+ },
53
+ borderRadius: {
54
+ lg: 'var(--radius)',
55
+ md: 'calc(var(--radius) - 2px)',
56
+ sm: 'calc(var(--radius) - 4px)',
57
+ },
58
+ },
59
  },
60
  plugins: [],
61
  } satisfies Config;
62
+
63
+ export default config;