create-tigra 2.6.5 → 2.7.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.
- package/bin/create-tigra.js +144 -0
- package/lib/patchers/email-verification.patcher.js +576 -0
- package/modules/email-verification/client/hooks/useVerification.ts +70 -0
- package/modules/email-verification/client/services/verification.service.ts +25 -0
- package/modules/email-verification/server/verification.controller.ts +28 -0
- package/modules/email-verification/server/verification.service.ts +190 -0
- package/package.json +5 -2
- package/template/_claude/rules/client/01-project-structure.md +2 -5
- package/template/_claude/rules/client/04-design-system.md +48 -43
- package/template/_claude/rules/client/core.md +2 -2
- package/template/client/src/app/globals.css +12 -12
- package/template/client/src/app/layout.tsx +1 -1
- package/template/client/src/app/page.tsx +5 -5
- package/template/client/src/app/providers.tsx +1 -1
- package/template/client/src/components/common/ThemeToggle.tsx +59 -0
- package/template/client/src/features/admin/hooks/useAdminSessions.ts +68 -0
- package/template/client/src/features/admin/hooks/useAdminStats.ts +27 -0
- package/template/client/src/features/admin/hooks/useAdminUsers.ts +132 -0
- package/template/client/src/features/admin/services/admin.service.ts +94 -0
- package/template/client/src/features/admin/types/admin.types.ts +65 -0
- package/template/client/src/features/auth/components/AuthInitializer.tsx +24 -1
- package/template/client/src/features/auth/hooks/useAuth.ts +10 -1
- package/template/client/src/features/auth/hooks/usePasswordReset.ts +57 -0
- package/template/client/src/features/auth/services/auth.service.ts +2 -2
- package/template/client/src/lib/api/axios.config.ts +20 -1
- package/template/client/src/lib/constants/api-endpoints.ts +10 -1
- package/template/client/src/lib/constants/app.constants.ts +3 -1
- package/template/client/src/lib/constants/routes.ts +7 -1
- package/template/client/src/lib/env.ts +35 -0
- package/template/client/src/lib/utils/error.ts +4 -0
- package/template/client/src/styles/themes/default.css +92 -0
- package/template/server/.env.example +29 -0
- package/template/server/.env.example.production +22 -0
- package/template/server/package-lock.json +6823 -0
- package/template/server/package.json +2 -0
- package/template/server/postman/collection.json +168 -50
- package/template/server/prisma/schema.prisma +2 -0
- package/template/server/src/config/env.ts +18 -1
- package/template/server/src/config/rate-limit.config.ts +8 -0
- package/template/server/src/jobs/cleanup-deleted-accounts.job.ts +14 -4
- package/template/server/src/libs/auth.ts +4 -1
- package/template/server/src/libs/email.ts +40 -0
- package/template/server/src/libs/prisma.ts +13 -0
- package/template/server/src/modules/admin/admin.controller.ts +130 -1
- package/template/server/src/modules/admin/admin.repo.ts +289 -0
- package/template/server/src/modules/admin/admin.routes.ts +113 -7
- package/template/server/src/modules/admin/admin.schemas.ts +49 -0
- package/template/server/src/modules/admin/admin.service.ts +154 -0
- package/template/server/src/modules/auth/auth.controller.ts +27 -1
- package/template/server/src/modules/auth/auth.repo.ts +6 -18
- package/template/server/src/modules/auth/auth.routes.ts +24 -0
- package/template/server/src/modules/auth/auth.schemas.ts +18 -0
- package/template/server/src/modules/auth/auth.service.ts +156 -32
- package/template/server/src/modules/auth/session.repo.ts +10 -5
- package/template/client/src/components/common/ThemeSwitcher.tsx +0 -112
- package/template/client/src/styles/themes/electric-indigo.css +0 -90
- package/template/client/src/styles/themes/ocean-teal.css +0 -90
- package/template/client/src/styles/themes/rose-pink.css +0 -90
- package/template/client/src/styles/themes/warm-orange.css +0 -90
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Theme: Ocean Teal
|
|
3
|
-
* Accent: Deep teal-cyan
|
|
4
|
-
* Vibe: Calm, professional, trustworthy — inspired by Stripe, Vercel
|
|
5
|
-
*
|
|
6
|
-
* Activated via data-theme="ocean-teal" attribute on <html>
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
[data-theme="ocean-teal"] {
|
|
10
|
-
--radius: 0.625rem;
|
|
11
|
-
/* Cool neutral background with ocean teal accent */
|
|
12
|
-
--background: oklch(0.98 0.003 200);
|
|
13
|
-
--foreground: oklch(0.18 0.015 210);
|
|
14
|
-
--card: oklch(1 0 0);
|
|
15
|
-
--card-foreground: oklch(0.18 0.015 210);
|
|
16
|
-
--popover: oklch(1 0 0);
|
|
17
|
-
--popover-foreground: oklch(0.18 0.015 210);
|
|
18
|
-
--primary: oklch(0.55 0.15 195);
|
|
19
|
-
--primary-foreground: oklch(1 0 0);
|
|
20
|
-
--secondary: oklch(0.95 0.006 200);
|
|
21
|
-
--secondary-foreground: oklch(0.3 0.015 210);
|
|
22
|
-
--muted: oklch(0.95 0.006 200);
|
|
23
|
-
--muted-foreground: oklch(0.55 0.012 210);
|
|
24
|
-
--accent: oklch(0.95 0.006 200);
|
|
25
|
-
--accent-foreground: oklch(0.3 0.015 210);
|
|
26
|
-
--destructive: oklch(0.577 0.245 27.325);
|
|
27
|
-
--border: oklch(0.91 0.006 200);
|
|
28
|
-
--input: oklch(0.91 0.006 200);
|
|
29
|
-
--ring: oklch(0.55 0.15 195);
|
|
30
|
-
--success: oklch(0.52 0.17 155);
|
|
31
|
-
--success-foreground: oklch(1 0 0);
|
|
32
|
-
--warning: oklch(0.75 0.15 70);
|
|
33
|
-
--warning-foreground: oklch(0.25 0.015 70);
|
|
34
|
-
--info: oklch(0.55 0.15 240);
|
|
35
|
-
--info-foreground: oklch(1 0 0);
|
|
36
|
-
--chart-1: oklch(0.55 0.15 195);
|
|
37
|
-
--chart-2: oklch(0.6 0.12 160);
|
|
38
|
-
--chart-3: oklch(0.5 0.1 250);
|
|
39
|
-
--chart-4: oklch(0.7 0.12 95);
|
|
40
|
-
--chart-5: oklch(0.6 0.15 320);
|
|
41
|
-
--sidebar: oklch(0.97 0.004 200);
|
|
42
|
-
--sidebar-foreground: oklch(0.18 0.015 210);
|
|
43
|
-
--sidebar-primary: oklch(0.3 0.015 210);
|
|
44
|
-
--sidebar-primary-foreground: oklch(0.98 0.003 200);
|
|
45
|
-
--sidebar-accent: oklch(0.95 0.006 200);
|
|
46
|
-
--sidebar-accent-foreground: oklch(0.3 0.015 210);
|
|
47
|
-
--sidebar-border: oklch(0.91 0.006 200);
|
|
48
|
-
--sidebar-ring: oklch(0.55 0.15 195);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
.dark[data-theme="ocean-teal"] {
|
|
52
|
-
/* Dark mode: deep blue-gray with brighter teal */
|
|
53
|
-
--background: oklch(0.16 0.012 210);
|
|
54
|
-
--foreground: oklch(0.93 0.006 200);
|
|
55
|
-
--card: oklch(0.21 0.012 210);
|
|
56
|
-
--card-foreground: oklch(0.93 0.006 200);
|
|
57
|
-
--popover: oklch(0.21 0.012 210);
|
|
58
|
-
--popover-foreground: oklch(0.93 0.006 200);
|
|
59
|
-
--primary: oklch(0.65 0.15 195);
|
|
60
|
-
--primary-foreground: oklch(0.16 0.012 210);
|
|
61
|
-
--secondary: oklch(0.26 0.012 210);
|
|
62
|
-
--secondary-foreground: oklch(0.93 0.006 200);
|
|
63
|
-
--muted: oklch(0.26 0.012 210);
|
|
64
|
-
--muted-foreground: oklch(0.6 0.012 210);
|
|
65
|
-
--accent: oklch(0.26 0.012 210);
|
|
66
|
-
--accent-foreground: oklch(0.93 0.006 200);
|
|
67
|
-
--destructive: oklch(0.704 0.191 22.216);
|
|
68
|
-
--border: oklch(1 0.006 200 / 12%);
|
|
69
|
-
--input: oklch(1 0.006 200 / 15%);
|
|
70
|
-
--ring: oklch(0.65 0.15 195);
|
|
71
|
-
--success: oklch(0.6 0.17 155);
|
|
72
|
-
--success-foreground: oklch(1 0 0);
|
|
73
|
-
--warning: oklch(0.8 0.15 70);
|
|
74
|
-
--warning-foreground: oklch(0.25 0.015 70);
|
|
75
|
-
--info: oklch(0.65 0.15 240);
|
|
76
|
-
--info-foreground: oklch(1 0 0);
|
|
77
|
-
--chart-1: oklch(0.65 0.15 195);
|
|
78
|
-
--chart-2: oklch(0.7 0.12 160);
|
|
79
|
-
--chart-3: oklch(0.6 0.1 250);
|
|
80
|
-
--chart-4: oklch(0.8 0.12 95);
|
|
81
|
-
--chart-5: oklch(0.7 0.15 320);
|
|
82
|
-
--sidebar: oklch(0.21 0.012 210);
|
|
83
|
-
--sidebar-foreground: oklch(0.93 0.006 200);
|
|
84
|
-
--sidebar-primary: oklch(0.65 0.15 195);
|
|
85
|
-
--sidebar-primary-foreground: oklch(0.93 0.006 200);
|
|
86
|
-
--sidebar-accent: oklch(0.26 0.012 210);
|
|
87
|
-
--sidebar-accent-foreground: oklch(0.93 0.006 200);
|
|
88
|
-
--sidebar-border: oklch(1 0.006 200 / 12%);
|
|
89
|
-
--sidebar-ring: oklch(0.65 0.15 195);
|
|
90
|
-
}
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Theme: Rose Pink
|
|
3
|
-
* Accent: Soft rose-magenta
|
|
4
|
-
* Vibe: Elegant, creative, premium — inspired by Dribbble, Notion
|
|
5
|
-
*
|
|
6
|
-
* Activated via data-theme="rose-pink" attribute on <html>
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
[data-theme="rose-pink"] {
|
|
10
|
-
--radius: 0.625rem;
|
|
11
|
-
/* Warm neutral background with rose-pink accent */
|
|
12
|
-
--background: oklch(0.98 0.004 350);
|
|
13
|
-
--foreground: oklch(0.18 0.015 340);
|
|
14
|
-
--card: oklch(1 0 0);
|
|
15
|
-
--card-foreground: oklch(0.18 0.015 340);
|
|
16
|
-
--popover: oklch(1 0 0);
|
|
17
|
-
--popover-foreground: oklch(0.18 0.015 340);
|
|
18
|
-
--primary: oklch(0.58 0.2 350);
|
|
19
|
-
--primary-foreground: oklch(1 0 0);
|
|
20
|
-
--secondary: oklch(0.95 0.006 350);
|
|
21
|
-
--secondary-foreground: oklch(0.3 0.015 340);
|
|
22
|
-
--muted: oklch(0.95 0.006 350);
|
|
23
|
-
--muted-foreground: oklch(0.55 0.012 340);
|
|
24
|
-
--accent: oklch(0.95 0.006 350);
|
|
25
|
-
--accent-foreground: oklch(0.3 0.015 340);
|
|
26
|
-
--destructive: oklch(0.577 0.245 27.325);
|
|
27
|
-
--border: oklch(0.91 0.006 350);
|
|
28
|
-
--input: oklch(0.91 0.006 350);
|
|
29
|
-
--ring: oklch(0.58 0.2 350);
|
|
30
|
-
--success: oklch(0.52 0.17 155);
|
|
31
|
-
--success-foreground: oklch(1 0 0);
|
|
32
|
-
--warning: oklch(0.75 0.15 70);
|
|
33
|
-
--warning-foreground: oklch(0.25 0.015 70);
|
|
34
|
-
--info: oklch(0.55 0.15 240);
|
|
35
|
-
--info-foreground: oklch(1 0 0);
|
|
36
|
-
--chart-1: oklch(0.58 0.2 350);
|
|
37
|
-
--chart-2: oklch(0.55 0.15 270);
|
|
38
|
-
--chart-3: oklch(0.6 0.12 195);
|
|
39
|
-
--chart-4: oklch(0.7 0.13 85);
|
|
40
|
-
--chart-5: oklch(0.5 0.1 30);
|
|
41
|
-
--sidebar: oklch(0.97 0.004 350);
|
|
42
|
-
--sidebar-foreground: oklch(0.18 0.015 340);
|
|
43
|
-
--sidebar-primary: oklch(0.3 0.015 340);
|
|
44
|
-
--sidebar-primary-foreground: oklch(0.98 0.004 350);
|
|
45
|
-
--sidebar-accent: oklch(0.95 0.006 350);
|
|
46
|
-
--sidebar-accent-foreground: oklch(0.3 0.015 340);
|
|
47
|
-
--sidebar-border: oklch(0.91 0.006 350);
|
|
48
|
-
--sidebar-ring: oklch(0.58 0.2 350);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
.dark[data-theme="rose-pink"] {
|
|
52
|
-
/* Dark mode: deep warm gray with brighter rose */
|
|
53
|
-
--background: oklch(0.16 0.012 340);
|
|
54
|
-
--foreground: oklch(0.93 0.005 350);
|
|
55
|
-
--card: oklch(0.21 0.012 340);
|
|
56
|
-
--card-foreground: oklch(0.93 0.005 350);
|
|
57
|
-
--popover: oklch(0.21 0.012 340);
|
|
58
|
-
--popover-foreground: oklch(0.93 0.005 350);
|
|
59
|
-
--primary: oklch(0.68 0.2 350);
|
|
60
|
-
--primary-foreground: oklch(0.16 0.012 340);
|
|
61
|
-
--secondary: oklch(0.26 0.012 340);
|
|
62
|
-
--secondary-foreground: oklch(0.93 0.005 350);
|
|
63
|
-
--muted: oklch(0.26 0.012 340);
|
|
64
|
-
--muted-foreground: oklch(0.6 0.012 340);
|
|
65
|
-
--accent: oklch(0.26 0.012 340);
|
|
66
|
-
--accent-foreground: oklch(0.93 0.005 350);
|
|
67
|
-
--destructive: oklch(0.704 0.191 22.216);
|
|
68
|
-
--border: oklch(1 0.005 350 / 12%);
|
|
69
|
-
--input: oklch(1 0.005 350 / 15%);
|
|
70
|
-
--ring: oklch(0.68 0.2 350);
|
|
71
|
-
--success: oklch(0.6 0.17 155);
|
|
72
|
-
--success-foreground: oklch(1 0 0);
|
|
73
|
-
--warning: oklch(0.8 0.15 70);
|
|
74
|
-
--warning-foreground: oklch(0.25 0.015 70);
|
|
75
|
-
--info: oklch(0.65 0.15 240);
|
|
76
|
-
--info-foreground: oklch(1 0 0);
|
|
77
|
-
--chart-1: oklch(0.68 0.2 350);
|
|
78
|
-
--chart-2: oklch(0.65 0.15 270);
|
|
79
|
-
--chart-3: oklch(0.7 0.12 195);
|
|
80
|
-
--chart-4: oklch(0.8 0.13 85);
|
|
81
|
-
--chart-5: oklch(0.6 0.1 30);
|
|
82
|
-
--sidebar: oklch(0.21 0.012 340);
|
|
83
|
-
--sidebar-foreground: oklch(0.93 0.005 350);
|
|
84
|
-
--sidebar-primary: oklch(0.68 0.2 350);
|
|
85
|
-
--sidebar-primary-foreground: oklch(0.93 0.005 350);
|
|
86
|
-
--sidebar-accent: oklch(0.26 0.012 340);
|
|
87
|
-
--sidebar-accent-foreground: oklch(0.93 0.005 350);
|
|
88
|
-
--sidebar-border: oklch(1 0.005 350 / 12%);
|
|
89
|
-
--sidebar-ring: oklch(0.68 0.2 350);
|
|
90
|
-
}
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Theme: Warm Orange
|
|
3
|
-
* Accent: Warm terracotta orange — inspired by Claude's palette
|
|
4
|
-
* Vibe: Earthy, warm, approachable
|
|
5
|
-
*
|
|
6
|
-
* To activate: in globals.css, set @import "../styles/themes/warm-orange.css";
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
:root {
|
|
10
|
-
--radius: 0.625rem;
|
|
11
|
-
/* Warm cream background with terracotta orange accent */
|
|
12
|
-
--background: oklch(0.964 0.007 97.5);
|
|
13
|
-
--foreground: oklch(0.205 0.015 92);
|
|
14
|
-
--card: oklch(1 0 0);
|
|
15
|
-
--card-foreground: oklch(0.205 0.015 92);
|
|
16
|
-
--popover: oklch(1 0 0);
|
|
17
|
-
--popover-foreground: oklch(0.205 0.015 92);
|
|
18
|
-
--primary: oklch(0.597 0.135 39.9);
|
|
19
|
-
--primary-foreground: oklch(1 0 0);
|
|
20
|
-
--secondary: oklch(0.935 0.009 97.5);
|
|
21
|
-
--secondary-foreground: oklch(0.3 0.015 92);
|
|
22
|
-
--muted: oklch(0.935 0.009 97.5);
|
|
23
|
-
--muted-foreground: oklch(0.748 0.017 91.6);
|
|
24
|
-
--accent: oklch(0.935 0.009 97.5);
|
|
25
|
-
--accent-foreground: oklch(0.3 0.015 92);
|
|
26
|
-
--destructive: oklch(0.577 0.245 27.325);
|
|
27
|
-
--border: oklch(0.895 0.012 97.5);
|
|
28
|
-
--input: oklch(0.895 0.012 97.5);
|
|
29
|
-
--ring: oklch(0.597 0.135 39.9);
|
|
30
|
-
--success: oklch(0.52 0.17 155);
|
|
31
|
-
--success-foreground: oklch(1 0 0);
|
|
32
|
-
--warning: oklch(0.75 0.15 70);
|
|
33
|
-
--warning-foreground: oklch(0.25 0.015 92);
|
|
34
|
-
--info: oklch(0.55 0.15 240);
|
|
35
|
-
--info-foreground: oklch(1 0 0);
|
|
36
|
-
--chart-1: oklch(0.597 0.135 39.9);
|
|
37
|
-
--chart-2: oklch(0.6 0.118 184.704);
|
|
38
|
-
--chart-3: oklch(0.398 0.07 227.392);
|
|
39
|
-
--chart-4: oklch(0.828 0.12 84);
|
|
40
|
-
--chart-5: oklch(0.748 0.017 91.6);
|
|
41
|
-
--sidebar: oklch(0.95 0.007 97.5);
|
|
42
|
-
--sidebar-foreground: oklch(0.205 0.015 92);
|
|
43
|
-
--sidebar-primary: oklch(0.3 0.015 92);
|
|
44
|
-
--sidebar-primary-foreground: oklch(0.964 0.007 97.5);
|
|
45
|
-
--sidebar-accent: oklch(0.935 0.009 97.5);
|
|
46
|
-
--sidebar-accent-foreground: oklch(0.3 0.015 92);
|
|
47
|
-
--sidebar-border: oklch(0.895 0.012 97.5);
|
|
48
|
-
--sidebar-ring: oklch(0.597 0.135 39.9);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
.dark {
|
|
52
|
-
/* Dark mode: inverted with same warm undertone */
|
|
53
|
-
--background: oklch(0.185 0.012 92);
|
|
54
|
-
--foreground: oklch(0.93 0.007 97.5);
|
|
55
|
-
--card: oklch(0.235 0.012 92);
|
|
56
|
-
--card-foreground: oklch(0.93 0.007 97.5);
|
|
57
|
-
--popover: oklch(0.235 0.012 92);
|
|
58
|
-
--popover-foreground: oklch(0.93 0.007 97.5);
|
|
59
|
-
--primary: oklch(0.66 0.135 39.9);
|
|
60
|
-
--primary-foreground: oklch(0.185 0.012 92);
|
|
61
|
-
--secondary: oklch(0.28 0.012 92);
|
|
62
|
-
--secondary-foreground: oklch(0.93 0.007 97.5);
|
|
63
|
-
--muted: oklch(0.28 0.012 92);
|
|
64
|
-
--muted-foreground: oklch(0.65 0.015 91.6);
|
|
65
|
-
--accent: oklch(0.28 0.012 92);
|
|
66
|
-
--accent-foreground: oklch(0.93 0.007 97.5);
|
|
67
|
-
--destructive: oklch(0.704 0.191 22.216);
|
|
68
|
-
--border: oklch(1 0.007 97.5 / 12%);
|
|
69
|
-
--input: oklch(1 0.007 97.5 / 15%);
|
|
70
|
-
--ring: oklch(0.66 0.135 39.9);
|
|
71
|
-
--success: oklch(0.6 0.17 155);
|
|
72
|
-
--success-foreground: oklch(1 0 0);
|
|
73
|
-
--warning: oklch(0.8 0.15 70);
|
|
74
|
-
--warning-foreground: oklch(0.25 0.015 92);
|
|
75
|
-
--info: oklch(0.65 0.15 240);
|
|
76
|
-
--info-foreground: oklch(1 0 0);
|
|
77
|
-
--chart-1: oklch(0.66 0.135 39.9);
|
|
78
|
-
--chart-2: oklch(0.696 0.17 162.48);
|
|
79
|
-
--chart-3: oklch(0.769 0.12 70);
|
|
80
|
-
--chart-4: oklch(0.627 0.18 303.9);
|
|
81
|
-
--chart-5: oklch(0.645 0.17 16.439);
|
|
82
|
-
--sidebar: oklch(0.235 0.012 92);
|
|
83
|
-
--sidebar-foreground: oklch(0.93 0.007 97.5);
|
|
84
|
-
--sidebar-primary: oklch(0.66 0.135 39.9);
|
|
85
|
-
--sidebar-primary-foreground: oklch(0.93 0.007 97.5);
|
|
86
|
-
--sidebar-accent: oklch(0.28 0.012 92);
|
|
87
|
-
--sidebar-accent-foreground: oklch(0.93 0.007 97.5);
|
|
88
|
-
--sidebar-border: oklch(1 0.007 97.5 / 12%);
|
|
89
|
-
--sidebar-ring: oklch(0.66 0.135 39.9);
|
|
90
|
-
}
|