create-ej-app 18.0.0 → 19.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/cli.js +1 -30
  2. package/cli.ts +1 -43
  3. package/package.json +2 -3
  4. package/template/api/package.json +4 -4
  5. package/template/nextjs/.vscode/extensions.json +11 -0
  6. package/template/nextjs/.vscode/settings.json +3 -0
  7. package/template/nextjs/components.json +4 -1
  8. package/template/nextjs/package.json +25 -27
  9. package/template/nextjs/src/app/(admin)/layout.tsx +2 -2
  10. package/template/nextjs/src/app/(app)/app/page.tsx +3 -0
  11. package/template/nextjs/src/app/(app)/layout.tsx +1 -1
  12. package/template/nextjs/src/app/(auth)/login/email-login-form.tsx +33 -34
  13. package/template/nextjs/src/app/globals.css +127 -15
  14. package/template/nextjs/src/app/layout.tsx +8 -4
  15. package/template/nextjs/src/app/not-found.tsx +1 -1
  16. package/template/nextjs/src/components/theme-provider.tsx +67 -0
  17. package/template/nextjs/src/components/ui/button.tsx +22 -15
  18. package/template/nextjs/src/components/ui/card.tsx +17 -6
  19. package/template/nextjs/src/components/ui/field.tsx +238 -0
  20. package/template/nextjs/src/components/ui/input.tsx +1 -3
  21. package/template/nextjs/src/components/ui/label.tsx +1 -1
  22. package/template/nextjs/src/components/ui/separator.tsx +2 -2
  23. package/template/nextjs/src/components/ui/sonner.tsx +5 -0
  24. package/template/nextjs/src/db/common.ts +31 -0
  25. package/template/nextjs/src/db/schema.ts +2 -28
  26. package/template/nextjs/src/hooks/use-mobile.ts +19 -0
  27. package/template/nextjs/src/lib/auth.ts +2 -6
  28. package/template/nextjs/src/lib/format-currency.ts +27 -0
  29. package/template/nextjs/src/lib/format-date.ts +12 -0
  30. package/template/nextjs/src/scripts/seed.ts +11 -0
  31. package/template/nextjs/src/scripts/test-mail.ts +11 -5
  32. package/template/nextjs/tsconfig.json +2 -0
  33. package/template/nextjs/src/app/api/[[...slugs]]/route.ts +0 -25
  34. package/template/nextjs/src/components/ui/form.tsx +0 -167
  35. package/template/nextjs/src/lib/eden.ts +0 -7
package/cli.js CHANGED
@@ -18,8 +18,6 @@ const commander_1 = require("commander");
18
18
  const enquirer_1 = require("enquirer");
19
19
  const fs_1 = __importDefault(require("fs"));
20
20
  const path_1 = __importDefault(require("path"));
21
- //@ts-ignore
22
- const copy_dir_1 = __importDefault(require("copy-dir"));
23
21
  const detectPackageManager = () => {
24
22
  const userAgent = process.env.npm_config_user_agent;
25
23
  if (userAgent) {
@@ -100,7 +98,7 @@ commander_1.program.action(() => __awaiter(void 0, void 0, void 0, function* ()
100
98
  }
101
99
  fs_1.default.mkdirSync(projectDir);
102
100
  const templateDir = path_1.default.join(__dirname, 'template', template);
103
- copy_dir_1.default.sync(templateDir, projectDir);
101
+ fs_1.default.cpSync(templateDir, projectDir, { recursive: true });
104
102
  const packageJsonFile = path_1.default.join(projectDir, 'package.json');
105
103
  const packageJson = JSON.parse(fs_1.default.readFileSync(packageJsonFile, 'utf-8'));
106
104
  packageJson.name = projectName;
@@ -109,33 +107,6 @@ commander_1.program.action(() => __awaiter(void 0, void 0, void 0, function* ()
109
107
  const envExampleFile = path_1.default.join(projectDir, '.env.example');
110
108
  const envExample = fs_1.default.readFileSync(envExampleFile, 'utf-8');
111
109
  fs_1.default.writeFileSync(path_1.default.join(projectDir, '.env'), envExample);
112
- if (template === 'nextjs') {
113
- const siteConfigFile = path_1.default.join(projectDir, 'src', 'lib', 'siteConfig.ts');
114
- let siteConfig = fs_1.default.readFileSync(siteConfigFile, 'utf-8');
115
- siteConfig = siteConfig.replace('Project Name', projectName);
116
- siteConfig = siteConfig.replace('Project Description', description);
117
- fs_1.default.writeFileSync(siteConfigFile, siteConfig);
118
- fs_1.default.writeFileSync(path_1.default.join(projectDir, '.gitignore'), `node_modules
119
- .next
120
- out
121
- build
122
- next-env.d.ts
123
- .DS_Store
124
- .env
125
- `);
126
- fs_1.default.writeFileSync(path_1.default.join(projectDir, 'terraform', '.gitignore'), `.terraform
127
- *.tfstate
128
- *.tfstate.*
129
- .terraform.lock.hcl
130
- `);
131
- }
132
- if (template === 'api') {
133
- fs_1.default.writeFileSync(path_1.default.join(projectDir, '.gitignore'), `node_modules
134
- .DS_Store
135
- .env
136
- server
137
- `);
138
- }
139
110
  fs_1.default.writeFileSync(path_1.default.join(projectDir, 'README.md'), `# ${projectName}
140
111
 
141
112
  ${description}
package/cli.ts CHANGED
@@ -5,8 +5,6 @@ import { program } from 'commander'
5
5
  import { prompt } from 'enquirer'
6
6
  import fs from 'fs'
7
7
  import path from 'path'
8
- //@ts-ignore
9
- import copydir from 'copy-dir'
10
8
 
11
9
  interface Response {
12
10
  projectName: string
@@ -103,7 +101,7 @@ program.action(async () => {
103
101
  fs.mkdirSync(projectDir)
104
102
 
105
103
  const templateDir = path.join(__dirname, 'template', template)
106
- copydir.sync(templateDir, projectDir)
104
+ fs.cpSync(templateDir, projectDir, { recursive: true })
107
105
 
108
106
  const packageJsonFile = path.join(projectDir, 'package.json')
109
107
  const packageJson = JSON.parse(fs.readFileSync(packageJsonFile, 'utf-8'))
@@ -115,46 +113,6 @@ program.action(async () => {
115
113
  const envExample = fs.readFileSync(envExampleFile, 'utf-8')
116
114
  fs.writeFileSync(path.join(projectDir, '.env'), envExample)
117
115
 
118
- if (template === 'nextjs') {
119
- const siteConfigFile = path.join(projectDir, 'src', 'lib', 'siteConfig.ts')
120
- let siteConfig = fs.readFileSync(siteConfigFile, 'utf-8')
121
- siteConfig = siteConfig.replace('Project Name', projectName)
122
- siteConfig = siteConfig.replace('Project Description', description)
123
- fs.writeFileSync(siteConfigFile, siteConfig)
124
-
125
- fs.writeFileSync(
126
- path.join(projectDir, '.gitignore'),
127
- `node_modules
128
- .next
129
- out
130
- build
131
- next-env.d.ts
132
- .DS_Store
133
- .env
134
- `
135
- )
136
-
137
- fs.writeFileSync(
138
- path.join(projectDir, 'terraform', '.gitignore'),
139
- `.terraform
140
- *.tfstate
141
- *.tfstate.*
142
- .terraform.lock.hcl
143
- `
144
- )
145
- }
146
-
147
- if (template === 'api') {
148
- fs.writeFileSync(
149
- path.join(projectDir, '.gitignore'),
150
- `node_modules
151
- .DS_Store
152
- .env
153
- server
154
- `
155
- )
156
- }
157
-
158
116
  fs.writeFileSync(
159
117
  path.join(projectDir, 'README.md'),
160
118
  `# ${projectName}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-ej-app",
3
- "version": "18.0.0",
3
+ "version": "19.0.0",
4
4
  "description": "Bootstrap a next.js app with my preferred setup",
5
5
  "main": "cli.js",
6
6
  "scripts": {
@@ -31,11 +31,10 @@
31
31
  "homepage": "https://github.com/ejekanshjain/create-ej-app#readme",
32
32
  "dependencies": {
33
33
  "commander": "^14.0.3",
34
- "copy-dir": "^1.3.0",
35
34
  "enquirer": "^2.4.1"
36
35
  },
37
36
  "devDependencies": {
38
- "@types/node": "^25.3.0",
37
+ "@types/node": "^25.5.0",
39
38
  "typescript": "^5.9.3"
40
39
  }
41
40
  }
@@ -17,13 +17,13 @@
17
17
  "@elysiajs/openapi": "1.4.14",
18
18
  "@t3-oss/env-core": "0.13.10",
19
19
  "drizzle-orm": "0.45.1",
20
- "elysia": "1.4.25",
20
+ "elysia": "1.4.28",
21
21
  "zod": "4.3.6"
22
22
  },
23
23
  "devDependencies": {
24
- "@types/bun": "1.3.9",
25
- "@typescript/native-preview": "7.0.0-dev.20260217.1",
26
- "drizzle-kit": "0.31.9",
24
+ "@types/bun": "1.3.11",
25
+ "@typescript/native-preview": "7.0.0-dev.20260320.1",
26
+ "drizzle-kit": "0.31.10",
27
27
  "postgres": "3.4.8",
28
28
  "prettier": "3.8.1",
29
29
  "prettier-plugin-organize-imports": "4.3.0"
@@ -0,0 +1,11 @@
1
+ {
2
+ "recommendations": [
3
+ "bradlc.vscode-tailwindcss",
4
+ "dbaeumer.vscode-eslint",
5
+ "eamodio.gitlens",
6
+ "esbenp.prettier-vscode",
7
+ "TypeScriptTeam.native-preview",
8
+ "usernamehw.errorlens",
9
+ "YoavBls.pretty-ts-errors"
10
+ ]
11
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "js/ts.experimental.useTsgo": true
3
+ }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema.json",
3
- "style": "new-york",
3
+ "style": "radix-vega",
4
4
  "rsc": true,
5
5
  "tsx": true,
6
6
  "tailwind": {
@@ -11,6 +11,7 @@
11
11
  "prefix": ""
12
12
  },
13
13
  "iconLibrary": "lucide",
14
+ "rtl": false,
14
15
  "aliases": {
15
16
  "components": "~/components",
16
17
  "utils": "~/lib/cn",
@@ -18,5 +19,7 @@
18
19
  "lib": "~/lib",
19
20
  "hooks": "~/hooks"
20
21
  },
22
+ "menuColor": "default",
23
+ "menuAccent": "subtle",
21
24
  "registries": {}
22
25
  }
@@ -13,66 +13,64 @@
13
13
  "analyze": "ANALYZE=true bun --bun next build --webpack",
14
14
  "start": "bun --bun next start",
15
15
  "lint": "eslint",
16
- "type-check": "tsc --noEmit --incremental false",
16
+ "type-check": "tsgo --incremental false",
17
17
  "format": "prettier --write \"./src/**/*.{js,cjs,mjs,jsx,ts,tsx}\"",
18
18
  "db:push": "drizzle-kit push",
19
+ "db:seed": "bun ./src/scripts/seed.ts",
19
20
  "db:studio": "drizzle-kit studio",
20
21
  "gen:auth": "bunx @better-auth/cli generate"
21
22
  },
22
23
  "dependencies": {
23
24
  "@ejekanshjain/simple-email-validator": "1.0.3",
24
- "@elysiajs/eden": "1.4.8",
25
25
  "@hookform/resolvers": "5.2.2",
26
- "@next/third-parties": "16.1.6",
26
+ "@next/third-parties": "16.2.1",
27
27
  "@opentelemetry/api": "1.9.0",
28
- "@opentelemetry/sdk-trace-base": "2.5.1",
28
+ "@opentelemetry/sdk-trace-base": "2.6.0",
29
29
  "@paralleldrive/cuid2": "3.3.0",
30
- "@radix-ui/react-label": "2.1.8",
31
- "@radix-ui/react-separator": "1.1.8",
32
- "@radix-ui/react-slot": "1.2.4",
33
- "@react-email/components": "1.0.7",
30
+ "@react-email/components": "1.0.10",
34
31
  "@react-email/render": "2.0.4",
35
32
  "@t3-oss/env-nextjs": "0.13.10",
36
- "@tanstack/react-query": "5.90.21",
33
+ "@tanstack/react-query": "5.91.3",
37
34
  "@vercel/otel": "2.1.1",
38
- "better-auth": "1.4.18",
35
+ "better-auth": "1.5.5",
39
36
  "class-variance-authority": "0.7.1",
40
37
  "clsx": "2.1.1",
41
38
  "drizzle-orm": "0.45.1",
42
- "elysia": "1.4.25",
43
- "lucide-react": "0.564.0",
44
- "next": "16.1.6",
45
- "next-safe-action": "8.0.11",
39
+ "lucide-react": "0.577.0",
40
+ "next": "16.2.1",
41
+ "next-safe-action": "8.1.8",
46
42
  "next-themes": "0.4.6",
47
43
  "nextjs-toploader": "3.9.17",
48
- "nodemailer": "8.0.1",
44
+ "nodemailer": "8.0.3",
49
45
  "postgres": "3.4.8",
46
+ "radix-ui": "1.4.3",
50
47
  "react": "19.2.4",
51
48
  "react-dom": "19.2.4",
52
- "react-hook-form": "7.71.1",
49
+ "react-hook-form": "7.71.2",
53
50
  "sonner": "2.0.7",
54
- "tailwind-merge": "3.4.1",
51
+ "tailwind-merge": "3.5.0",
55
52
  "tw-animate-css": "1.4.0",
56
- "workflow": "4.1.0-beta.57",
53
+ "workflow": "4.2.0-beta.71",
57
54
  "zod": "4.3.6"
58
55
  },
59
56
  "devDependencies": {
60
- "@next/bundle-analyzer": "16.1.6",
61
- "@react-email/preview-server": "5.2.8",
62
- "@tailwindcss/postcss": "4.1.18",
63
- "@types/bun": "1.3.9",
64
- "@types/nodemailer": "7.0.10",
57
+ "@next/bundle-analyzer": "16.2.1",
58
+ "@react-email/preview-server": "5.2.10",
59
+ "@tailwindcss/postcss": "4.2.2",
60
+ "@types/bun": "1.3.11",
61
+ "@types/nodemailer": "7.0.11",
65
62
  "@types/react": "19.2.14",
66
63
  "@types/react-dom": "19.2.3",
64
+ "@typescript/native-preview": "7.0.0-dev.20260320.1",
67
65
  "babel-plugin-react-compiler": "1.0.0",
68
- "drizzle-kit": "0.31.9",
66
+ "drizzle-kit": "0.31.10",
69
67
  "eslint": "9.39.2",
70
- "eslint-config-next": "16.1.6",
68
+ "eslint-config-next": "16.2.1",
71
69
  "prettier": "3.8.1",
72
70
  "prettier-plugin-organize-imports": "4.3.0",
73
71
  "prettier-plugin-tailwindcss": "0.7.2",
74
- "react-email": "5.2.8",
75
- "tailwindcss": "4.1.18",
72
+ "react-email": "5.2.10",
73
+ "tailwindcss": "4.2.2",
76
74
  "typescript": "5.9.3"
77
75
  },
78
76
  "trustedDependencies": [
@@ -9,11 +9,11 @@ export default async function Layout({
9
9
  const authSession = await getAuthSession()
10
10
 
11
11
  if (!authSession?.isAdmin) {
12
- notFound()
12
+ return notFound()
13
13
  }
14
14
 
15
15
  return (
16
- <div className="flex min-h-screen flex-col">
16
+ <div className="flex min-h-screen flex-col space-y-4">
17
17
  <main className="flex-1">{children}</main>
18
18
  </div>
19
19
  )
@@ -0,0 +1,3 @@
1
+ export default async function Page() {
2
+ return <div>Hello, World!</div>
3
+ }
@@ -9,7 +9,7 @@ export default async function Layout({
9
9
  const authSession = await getAuthSession()
10
10
 
11
11
  if (!authSession) {
12
- redirect('/login')
12
+ return redirect('/login')
13
13
  }
14
14
 
15
15
  return (
@@ -3,17 +3,15 @@
3
3
  import { zodResolver } from '@hookform/resolvers/zod'
4
4
  import { Mail } from 'lucide-react'
5
5
  import { useState } from 'react'
6
- import { useForm } from 'react-hook-form'
6
+ import { Controller, useForm } from 'react-hook-form'
7
7
  import { z } from 'zod'
8
8
  import { Button } from '~/components/ui/button'
9
9
  import {
10
- Form,
11
- FormControl,
12
- FormField,
13
- FormItem,
14
- FormLabel,
15
- FormMessage
16
- } from '~/components/ui/form'
10
+ Field,
11
+ FieldContent,
12
+ FieldError,
13
+ FieldLabel
14
+ } from '~/components/ui/field'
17
15
  import { Input } from '~/components/ui/input'
18
16
  import { signIn } from '~/lib/auth-client'
19
17
  import { toastErrorMessage, toastSuccessMessage } from '~/lib/toast-message'
@@ -75,31 +73,32 @@ export const EmailLoginForm = () => {
75
73
  }
76
74
 
77
75
  return (
78
- <Form {...form}>
79
- <form onSubmit={form.handleSubmit(onSubmit)} className="space-y-4">
80
- <FormField
81
- control={form.control}
82
- name="email"
83
- render={({ field }) => (
84
- <FormItem>
85
- <FormLabel>Email</FormLabel>
86
- <FormControl>
87
- <Input
88
- placeholder="name@example.com"
89
- autoCapitalize="off"
90
- autoComplete="email"
91
- autoFocus
92
- {...field}
93
- />
94
- </FormControl>
95
- <FormMessage />
96
- </FormItem>
97
- )}
98
- />
99
- <Button type="submit" className="w-full" disabled={isLoading}>
100
- {isLoading ? 'Sending...' : 'Send Magic Link'}
101
- </Button>
102
- </form>
103
- </Form>
76
+ <form onSubmit={form.handleSubmit(onSubmit)} className="space-y-4">
77
+ <Controller
78
+ control={form.control}
79
+ name="email"
80
+ render={({ field, fieldState }) => (
81
+ <Field data-invalid={fieldState.invalid}>
82
+ <FieldLabel htmlFor="email">Email</FieldLabel>
83
+ <FieldContent>
84
+ <Input
85
+ id="email"
86
+ type="email"
87
+ placeholder="name@example.com"
88
+ autoCapitalize="off"
89
+ autoComplete="email"
90
+ autoFocus
91
+ aria-invalid={fieldState.invalid}
92
+ {...field}
93
+ />
94
+ <FieldError errors={[fieldState.error]} />
95
+ </FieldContent>
96
+ </Field>
97
+ )}
98
+ />
99
+ <Button type="submit" className="w-full" disabled={isLoading}>
100
+ {isLoading ? 'Sending...' : 'Send Magic Link'}
101
+ </Button>
102
+ </form>
104
103
  )
105
104
  }
@@ -4,10 +4,6 @@
4
4
  @custom-variant dark (&:is(.dark *));
5
5
 
6
6
  @theme inline {
7
- --radius-sm: calc(var(--radius) - 4px);
8
- --radius-md: calc(var(--radius) - 2px);
9
- --radius-lg: var(--radius);
10
- --radius-xl: calc(var(--radius) + 4px);
11
7
  --color-background: var(--background);
12
8
  --color-foreground: var(--foreground);
13
9
  --color-card: var(--card);
@@ -23,6 +19,7 @@
23
19
  --color-accent: var(--accent);
24
20
  --color-accent-foreground: var(--accent-foreground);
25
21
  --color-destructive: var(--destructive);
22
+ --color-destructive-foreground: var(--destructive-foreground);
26
23
  --color-border: var(--border);
27
24
  --color-input: var(--input);
28
25
  --color-ring: var(--ring);
@@ -39,6 +36,18 @@
39
36
  --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
40
37
  --color-sidebar-border: var(--sidebar-border);
41
38
  --color-sidebar-ring: var(--sidebar-ring);
39
+
40
+ --font-heading: var(--font-geist-sans);
41
+ --font-sans: var(--font-geist-sans);
42
+ --font-mono: var(--font-geist-mono);
43
+
44
+ --radius-sm: calc(var(--radius) * 0.6);
45
+ --radius-md: calc(var(--radius) * 0.8);
46
+ --radius-lg: var(--radius);
47
+ --radius-xl: calc(var(--radius) * 1.4);
48
+ --radius-2xl: calc(var(--radius) * 1.8);
49
+ --radius-3xl: calc(var(--radius) * 2.2);
50
+ --radius-4xl: calc(var(--radius) * 2.6);
42
51
  }
43
52
 
44
53
  :root {
@@ -58,14 +67,15 @@
58
67
  --accent: oklch(0.97 0 0);
59
68
  --accent-foreground: oklch(0.205 0 0);
60
69
  --destructive: oklch(0.577 0.245 27.325);
70
+ --destructive-foreground: oklch(1 0 0);
61
71
  --border: oklch(0.922 0 0);
62
72
  --input: oklch(0.922 0 0);
63
73
  --ring: oklch(0.708 0 0);
64
- --chart-1: oklch(0.646 0.222 41.116);
65
- --chart-2: oklch(0.6 0.118 184.704);
66
- --chart-3: oklch(0.398 0.07 227.392);
67
- --chart-4: oklch(0.828 0.189 84.429);
68
- --chart-5: oklch(0.769 0.188 70.08);
74
+ --chart-1: oklch(0.87 0 0);
75
+ --chart-2: oklch(0.556 0 0);
76
+ --chart-3: oklch(0.439 0 0);
77
+ --chart-4: oklch(0.371 0 0);
78
+ --chart-5: oklch(0.269 0 0);
69
79
  --sidebar: oklch(0.985 0 0);
70
80
  --sidebar-foreground: oklch(0.145 0 0);
71
81
  --sidebar-primary: oklch(0.205 0 0);
@@ -92,14 +102,15 @@
92
102
  --accent: oklch(0.269 0 0);
93
103
  --accent-foreground: oklch(0.985 0 0);
94
104
  --destructive: oklch(0.704 0.191 22.216);
105
+ --destructive-foreground: oklch(0.985 0 0);
95
106
  --border: oklch(1 0 0 / 10%);
96
107
  --input: oklch(1 0 0 / 15%);
97
108
  --ring: oklch(0.556 0 0);
98
- --chart-1: oklch(0.488 0.243 264.376);
99
- --chart-2: oklch(0.696 0.17 162.48);
100
- --chart-3: oklch(0.769 0.188 70.08);
101
- --chart-4: oklch(0.627 0.265 303.9);
102
- --chart-5: oklch(0.645 0.246 16.439);
109
+ --chart-1: oklch(0.87 0 0);
110
+ --chart-2: oklch(0.556 0 0);
111
+ --chart-3: oklch(0.439 0 0);
112
+ --chart-4: oklch(0.371 0 0);
113
+ --chart-5: oklch(0.269 0 0);
103
114
  --sidebar: oklch(0.205 0 0);
104
115
  --sidebar-foreground: oklch(0.985 0 0);
105
116
  --sidebar-primary: oklch(0.488 0.243 264.376);
@@ -114,15 +125,116 @@
114
125
  * {
115
126
  @apply border-border outline-ring/50;
116
127
  }
128
+
129
+ html {
130
+ @apply font-sans antialiased;
131
+ }
132
+
117
133
  body {
118
- @apply text-foreground bg-background min-h-screen font-sans antialiased;
134
+ @apply text-foreground bg-background min-h-screen;
119
135
  }
136
+
120
137
  button:not([disabled]),
121
138
  [role='button']:not([disabled]) {
122
139
  cursor: pointer;
123
140
  }
124
141
  }
125
142
 
143
+ @theme inline {
144
+ @keyframes accordion-down {
145
+ from {
146
+ height: 0;
147
+ }
148
+ to {
149
+ height: var(
150
+ --radix-accordion-content-height,
151
+ var(--accordion-panel-height, auto)
152
+ );
153
+ }
154
+ }
155
+
156
+ @keyframes accordion-up {
157
+ from {
158
+ height: var(
159
+ --radix-accordion-content-height,
160
+ var(--accordion-panel-height, auto)
161
+ );
162
+ }
163
+ to {
164
+ height: 0;
165
+ }
166
+ }
167
+ }
168
+
169
+ @custom-variant data-open {
170
+ &:where([data-state='open']),
171
+ &:where([data-open]:not([data-open='false'])) {
172
+ @slot;
173
+ }
174
+ }
175
+
176
+ @custom-variant data-closed {
177
+ &:where([data-state='closed']),
178
+ &:where([data-closed]:not([data-closed='false'])) {
179
+ @slot;
180
+ }
181
+ }
182
+
183
+ @custom-variant data-checked {
184
+ &:where([data-state='checked']),
185
+ &:where([data-checked]:not([data-checked='false'])) {
186
+ @slot;
187
+ }
188
+ }
189
+
190
+ @custom-variant data-unchecked {
191
+ &:where([data-state='unchecked']),
192
+ &:where([data-unchecked]:not([data-unchecked='false'])) {
193
+ @slot;
194
+ }
195
+ }
196
+
197
+ @custom-variant data-selected {
198
+ &:where([data-selected='true']) {
199
+ @slot;
200
+ }
201
+ }
202
+
203
+ @custom-variant data-disabled {
204
+ &:where([data-disabled='true']),
205
+ &:where([data-disabled]:not([data-disabled='false'])) {
206
+ @slot;
207
+ }
208
+ }
209
+
210
+ @custom-variant data-active {
211
+ &:where([data-state='active']),
212
+ &:where([data-active]:not([data-active='false'])) {
213
+ @slot;
214
+ }
215
+ }
216
+
217
+ @custom-variant data-horizontal {
218
+ &:where([data-orientation='horizontal']) {
219
+ @slot;
220
+ }
221
+ }
222
+
223
+ @custom-variant data-vertical {
224
+ &:where([data-orientation='vertical']) {
225
+ @slot;
226
+ }
227
+ }
228
+
229
+ @utility no-scrollbar {
230
+ -ms-overflow-style: none;
231
+ scrollbar-width: none;
232
+
233
+ &::-webkit-scrollbar {
234
+ display: none;
235
+ }
236
+ }
237
+
126
238
  @utility container {
127
239
  @apply mx-auto p-4;
128
240
  }
@@ -1,9 +1,9 @@
1
1
  import type { Metadata } from 'next'
2
- import { ThemeProvider } from 'next-themes'
3
2
  import { Geist, Geist_Mono } from 'next/font/google'
4
3
  import { Loader } from '~/components/loader'
5
4
  import { ReactQueryProvider } from '~/components/react-query-provider'
6
5
  import { ScreenSize } from '~/components/screen-size'
6
+ import { ThemeProvider } from '~/components/theme-provider'
7
7
  import { Toaster } from '~/components/ui/sonner'
8
8
  import { env } from '~/env'
9
9
  import { siteConfig } from '~/lib/siteConfig'
@@ -30,10 +30,14 @@ export default function RootLayout({
30
30
  children: React.ReactNode
31
31
  }>) {
32
32
  return (
33
- <html lang="en" suppressHydrationWarning>
34
- <body className={`${geistSans.variable} ${geistMono.variable}`}>
33
+ <html
34
+ lang="en"
35
+ suppressHydrationWarning
36
+ className={`${geistSans.variable} ${geistMono.variable}`}
37
+ >
38
+ <body>
35
39
  <ReactQueryProvider>
36
- <ThemeProvider attribute="class" defaultTheme="system" enableSystem>
40
+ <ThemeProvider>
37
41
  <Loader />
38
42
  {children}
39
43
  {env.APP_ENV === 'development' ? <ScreenSize /> : null}
@@ -1,8 +1,8 @@
1
1
  'use client'
2
2
 
3
- import { Button } from '@/components/ui/button'
4
3
  import Link from 'next/link'
5
4
  import { usePathname } from 'next/navigation'
5
+ import { Button } from '~/components/ui/button'
6
6
 
7
7
  export default function NotFound() {
8
8
  const pathname = usePathname()