ar-saas 0.3.1 → 0.3.2

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 (114) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +338 -314
  3. package/dist/cli.js +19 -0
  4. package/dist/generator.js +166 -55
  5. package/package.json +52 -50
  6. package/templates/backend/.env.example +67 -67
  7. package/templates/backend/.prettierrc +4 -4
  8. package/templates/backend/README.md +249 -168
  9. package/templates/backend/eslint.config.mjs +35 -35
  10. package/templates/backend/nest-cli.json +8 -8
  11. package/templates/backend/package-lock.json +10979 -10979
  12. package/templates/backend/package.json +88 -88
  13. package/templates/backend/src/app.controller.spec.ts +24 -24
  14. package/templates/backend/src/app.controller.ts +15 -15
  15. package/templates/backend/src/app.module.ts +40 -40
  16. package/templates/backend/src/app.service.ts +11 -11
  17. package/templates/backend/src/common/base/base.repository.ts +221 -221
  18. package/templates/backend/src/common/base/base.schema.ts +24 -24
  19. package/templates/backend/src/common/decorators/cookie.decorator.ts +9 -9
  20. package/templates/backend/src/common/decorators/current-user.decorator.ts +20 -20
  21. package/templates/backend/src/common/decorators/workspace-id.decorator.ts +14 -14
  22. package/templates/backend/src/common/filters/global-exception.filter.ts +61 -61
  23. package/templates/backend/src/common/guards/jwt-auth.guard.ts +5 -5
  24. package/templates/backend/src/common/interceptors/workspace-tenant.interceptor.ts +45 -45
  25. package/templates/backend/src/main.ts +51 -51
  26. package/templates/backend/src/modules/auth/auth.controller.ts +158 -158
  27. package/templates/backend/src/modules/auth/auth.module.ts +20 -20
  28. package/templates/backend/src/modules/auth/auth.service.ts +257 -257
  29. package/templates/backend/src/modules/auth/dto/forgot-password.dto.ts +9 -9
  30. package/templates/backend/src/modules/auth/dto/login.dto.ts +14 -14
  31. package/templates/backend/src/modules/auth/dto/refresh-token.dto.ts +12 -12
  32. package/templates/backend/src/modules/auth/dto/register.dto.ts +26 -26
  33. package/templates/backend/src/modules/auth/dto/reset-password.dto.ts +16 -16
  34. package/templates/backend/src/modules/auth/dto/verify-email.dto.ts +9 -9
  35. package/templates/backend/src/modules/auth/strategies/jwt.strategy.ts +43 -43
  36. package/templates/backend/src/modules/mail/mail.module.ts +9 -9
  37. package/templates/backend/src/modules/mail/mail.service.ts +141 -141
  38. package/templates/backend/src/modules/users/schemas/user.schema.ts +54 -54
  39. package/templates/backend/src/modules/users/users.module.ts +14 -14
  40. package/templates/backend/src/modules/users/users.repository.ts +51 -51
  41. package/templates/backend/src/modules/users/users.service.ts +104 -104
  42. package/templates/backend/src/modules/workspaces/schemas/workspace.schema.ts +26 -26
  43. package/templates/backend/src/modules/workspaces/workspaces.module.ts +16 -16
  44. package/templates/backend/src/modules/workspaces/workspaces.repository.ts +34 -34
  45. package/templates/backend/src/modules/workspaces/workspaces.service.ts +42 -42
  46. package/templates/backend/test/app.e2e-spec.ts +25 -25
  47. package/templates/backend/test/jest-e2e.json +9 -9
  48. package/templates/backend/tsconfig.build.json +4 -4
  49. package/templates/backend/tsconfig.json +26 -26
  50. package/templates/frontend/.env.local.example +1 -1
  51. package/templates/frontend/README.md +152 -0
  52. package/templates/frontend/components.json +20 -20
  53. package/templates/frontend/eslint.config.mjs +14 -14
  54. package/templates/frontend/next.config.ts +5 -5
  55. package/templates/frontend/package-lock.json +6722 -6722
  56. package/templates/frontend/package.json +48 -48
  57. package/templates/frontend/pnpm-lock.yaml +5012 -5012
  58. package/templates/frontend/pnpm-workspace.yaml +3 -3
  59. package/templates/frontend/postcss.config.mjs +7 -7
  60. package/templates/frontend/src/app/(auth)/forgot-password/page.tsx +84 -84
  61. package/templates/frontend/src/app/(auth)/layout.tsx +28 -28
  62. package/templates/frontend/src/app/(auth)/login/page.tsx +111 -111
  63. package/templates/frontend/src/app/(auth)/register/page.tsx +161 -161
  64. package/templates/frontend/src/app/(auth)/reset-password/page.tsx +120 -120
  65. package/templates/frontend/src/app/(auth)/verify-email/page.tsx +78 -78
  66. package/templates/frontend/src/app/(dashboard)/billing/page.tsx +111 -111
  67. package/templates/frontend/src/app/(dashboard)/dashboard/page.tsx +105 -105
  68. package/templates/frontend/src/app/(dashboard)/layout.tsx +38 -38
  69. package/templates/frontend/src/app/(dashboard)/profile/page.tsx +226 -226
  70. package/templates/frontend/src/app/(dashboard)/settings/page.tsx +156 -156
  71. package/templates/frontend/src/app/(dashboard)/team/page.tsx +178 -178
  72. package/templates/frontend/src/app/(legal)/privacy/page.tsx +127 -127
  73. package/templates/frontend/src/app/(legal)/terms/page.tsx +118 -118
  74. package/templates/frontend/src/app/globals.css +81 -81
  75. package/templates/frontend/src/app/layout.tsx +26 -26
  76. package/templates/frontend/src/app/page.tsx +5 -45
  77. package/templates/frontend/src/app/setup/page.tsx +371 -275
  78. package/templates/frontend/src/components/dashboard/header.tsx +89 -89
  79. package/templates/frontend/src/components/dashboard/sidebar.tsx +71 -71
  80. package/templates/frontend/src/components/dashboard/stat-card.tsx +34 -34
  81. package/templates/frontend/src/components/landing/faq.tsx +39 -39
  82. package/templates/frontend/src/components/landing/features.tsx +54 -54
  83. package/templates/frontend/src/components/landing/footer.tsx +76 -76
  84. package/templates/frontend/src/components/landing/hero.tsx +72 -72
  85. package/templates/frontend/src/components/landing/navbar.tsx +78 -78
  86. package/templates/frontend/src/components/landing/pricing.tsx +90 -90
  87. package/templates/frontend/src/components/ui/accordion.tsx +52 -52
  88. package/templates/frontend/src/components/ui/avatar.tsx +46 -46
  89. package/templates/frontend/src/components/ui/badge.tsx +30 -30
  90. package/templates/frontend/src/components/ui/button.tsx +52 -52
  91. package/templates/frontend/src/components/ui/card.tsx +50 -50
  92. package/templates/frontend/src/components/ui/checkbox.tsx +27 -27
  93. package/templates/frontend/src/components/ui/dialog.tsx +100 -100
  94. package/templates/frontend/src/components/ui/dropdown-menu.tsx +173 -173
  95. package/templates/frontend/src/components/ui/form.tsx +158 -158
  96. package/templates/frontend/src/components/ui/input.tsx +21 -21
  97. package/templates/frontend/src/components/ui/label.tsx +22 -22
  98. package/templates/frontend/src/components/ui/separator.tsx +25 -25
  99. package/templates/frontend/src/components/ui/skeleton.tsx +7 -7
  100. package/templates/frontend/src/components/ui/switch.tsx +28 -28
  101. package/templates/frontend/src/components/ui/tabs.tsx +54 -54
  102. package/templates/frontend/src/components/ui/textarea.tsx +20 -20
  103. package/templates/frontend/src/components/ui/toast.tsx +109 -109
  104. package/templates/frontend/src/components/ui/toaster.tsx +30 -30
  105. package/templates/frontend/src/config/site.ts +197 -197
  106. package/templates/frontend/src/hooks/use-toast.ts +116 -116
  107. package/templates/frontend/src/lib/api/auth.ts +39 -39
  108. package/templates/frontend/src/lib/api/client.ts +66 -66
  109. package/templates/frontend/src/lib/hooks/use-auth.ts +1 -1
  110. package/templates/frontend/src/lib/utils.ts +6 -6
  111. package/templates/frontend/src/providers/auth-provider.tsx +60 -60
  112. package/templates/frontend/src/types/api.ts +12 -12
  113. package/templates/frontend/src/types/auth.ts +27 -27
  114. package/templates/frontend/tsconfig.json +23 -23
@@ -1,118 +1,118 @@
1
- import Link from 'next/link'
2
- import { ArrowLeft } from 'lucide-react'
3
- import { siteConfig } from '@/config/site'
4
-
5
- export default function TermsPage() {
6
- const { legal } = siteConfig
7
-
8
- return (
9
- <div className="min-h-screen bg-background">
10
- <div className="mx-auto max-w-3xl px-4 py-12">
11
- <Link
12
- href="/"
13
- className="mb-8 inline-flex items-center gap-2 text-sm text-muted-foreground hover:text-foreground"
14
- >
15
- <ArrowLeft className="size-4" />
16
- Volver al inicio
17
- </Link>
18
-
19
- <h1 className="text-3xl font-bold">Términos y Condiciones</h1>
20
- <p className="mt-2 text-sm text-muted-foreground">
21
- Última actualización: {legal.lastUpdated}
22
- </p>
23
-
24
- <div className="prose prose-neutral dark:prose-invert mt-10 max-w-none space-y-8 text-sm leading-relaxed text-foreground">
25
- <section>
26
- <h2 className="text-lg font-semibold">1. Aceptación de los términos</h2>
27
- <p className="mt-3 text-muted-foreground">
28
- Al acceder y utilizar los servicios de {legal.companyName} (&quot;la Plataforma&quot;),
29
- aceptás quedar vinculado por estos Términos y Condiciones. Si no estás de acuerdo,
30
- no utilices la Plataforma.
31
- </p>
32
- </section>
33
-
34
- <section>
35
- <h2 className="text-lg font-semibold">2. Descripción del servicio</h2>
36
- <p className="mt-3 text-muted-foreground">
37
- {legal.companyName} provee una plataforma de software como servicio (SaaS) accesible
38
- a través de la web. Nos reservamos el derecho de modificar, suspender o discontinuar
39
- cualquier aspecto del servicio en cualquier momento.
40
- </p>
41
- </section>
42
-
43
- <section>
44
- <h2 className="text-lg font-semibold">3. Registro y cuenta</h2>
45
- <p className="mt-3 text-muted-foreground">
46
- Para acceder a ciertas funcionalidades debés crear una cuenta. Sos responsable de
47
- mantener la confidencialidad de tus credenciales y de todas las actividades que
48
- ocurran bajo tu cuenta. Notificanos inmediatamente ante cualquier uso no autorizado.
49
- </p>
50
- </section>
51
-
52
- <section>
53
- <h2 className="text-lg font-semibold">4. Facturación y pagos</h2>
54
- <p className="mt-3 text-muted-foreground">
55
- Los planes de pago se facturan de forma recurrente (mensual o anual) según el plan
56
- elegido. Los precios están sujetos a cambios con previo aviso de 30 días. Las
57
- cancelaciones surten efecto al final del período facturado.
58
- </p>
59
- </section>
60
-
61
- <section>
62
- <h2 className="text-lg font-semibold">5. Propiedad intelectual</h2>
63
- <p className="mt-3 text-muted-foreground">
64
- Todo el contenido de la Plataforma (código, diseño, logos, textos) es propiedad
65
- exclusiva de {legal.companyName} o sus licenciantes. No podés copiar, modificar ni
66
- distribuir ningún elemento sin autorización expresa y escrita.
67
- </p>
68
- </section>
69
-
70
- <section>
71
- <h2 className="text-lg font-semibold">6. Datos del usuario</h2>
72
- <p className="mt-3 text-muted-foreground">
73
- Sos propietario de los datos que cargás en la Plataforma. Nos otorgás una licencia
74
- limitada para procesarlos únicamente con el fin de prestar el servicio. Consultá
75
- nuestra{' '}
76
- <Link href="/privacy" className="underline underline-offset-4 hover:text-foreground">
77
- Política de Privacidad
78
- </Link>{' '}
79
- para más detalles.
80
- </p>
81
- </section>
82
-
83
- <section>
84
- <h2 className="text-lg font-semibold">7. Limitación de responsabilidad</h2>
85
- <p className="mt-3 text-muted-foreground">
86
- En la máxima medida permitida por la ley, {legal.companyName} no será responsable
87
- por daños indirectos, incidentales, especiales o consecuentes derivados del uso o
88
- imposibilidad de uso de la Plataforma.
89
- </p>
90
- </section>
91
-
92
- <section>
93
- <h2 className="text-lg font-semibold">8. Modificaciones</h2>
94
- <p className="mt-3 text-muted-foreground">
95
- Podemos actualizar estos Términos periódicamente. Te notificaremos por email ante
96
- cambios materiales. El uso continuado de la Plataforma constituye aceptación de los
97
- nuevos términos.
98
- </p>
99
- </section>
100
-
101
- <section>
102
- <h2 className="text-lg font-semibold">9. Contacto</h2>
103
- <p className="mt-3 text-muted-foreground">
104
- Para consultas sobre estos Términos escribinos a{' '}
105
- <a
106
- href={`mailto:${legal.email}`}
107
- className="underline underline-offset-4 hover:text-foreground"
108
- >
109
- {legal.email}
110
- </a>
111
- .
112
- </p>
113
- </section>
114
- </div>
115
- </div>
116
- </div>
117
- )
118
- }
1
+ import Link from 'next/link'
2
+ import { ArrowLeft } from 'lucide-react'
3
+ import { siteConfig } from '@/config/site'
4
+
5
+ export default function TermsPage() {
6
+ const { legal } = siteConfig
7
+
8
+ return (
9
+ <div className="min-h-screen bg-background">
10
+ <div className="mx-auto max-w-3xl px-4 py-12">
11
+ <Link
12
+ href="/"
13
+ className="mb-8 inline-flex items-center gap-2 text-sm text-muted-foreground hover:text-foreground"
14
+ >
15
+ <ArrowLeft className="size-4" />
16
+ Volver al inicio
17
+ </Link>
18
+
19
+ <h1 className="text-3xl font-bold">Términos y Condiciones</h1>
20
+ <p className="mt-2 text-sm text-muted-foreground">
21
+ Última actualización: {legal.lastUpdated}
22
+ </p>
23
+
24
+ <div className="prose prose-neutral dark:prose-invert mt-10 max-w-none space-y-8 text-sm leading-relaxed text-foreground">
25
+ <section>
26
+ <h2 className="text-lg font-semibold">1. Aceptación de los términos</h2>
27
+ <p className="mt-3 text-muted-foreground">
28
+ Al acceder y utilizar los servicios de {legal.companyName} (&quot;la Plataforma&quot;),
29
+ aceptás quedar vinculado por estos Términos y Condiciones. Si no estás de acuerdo,
30
+ no utilices la Plataforma.
31
+ </p>
32
+ </section>
33
+
34
+ <section>
35
+ <h2 className="text-lg font-semibold">2. Descripción del servicio</h2>
36
+ <p className="mt-3 text-muted-foreground">
37
+ {legal.companyName} provee una plataforma de software como servicio (SaaS) accesible
38
+ a través de la web. Nos reservamos el derecho de modificar, suspender o discontinuar
39
+ cualquier aspecto del servicio en cualquier momento.
40
+ </p>
41
+ </section>
42
+
43
+ <section>
44
+ <h2 className="text-lg font-semibold">3. Registro y cuenta</h2>
45
+ <p className="mt-3 text-muted-foreground">
46
+ Para acceder a ciertas funcionalidades debés crear una cuenta. Sos responsable de
47
+ mantener la confidencialidad de tus credenciales y de todas las actividades que
48
+ ocurran bajo tu cuenta. Notificanos inmediatamente ante cualquier uso no autorizado.
49
+ </p>
50
+ </section>
51
+
52
+ <section>
53
+ <h2 className="text-lg font-semibold">4. Facturación y pagos</h2>
54
+ <p className="mt-3 text-muted-foreground">
55
+ Los planes de pago se facturan de forma recurrente (mensual o anual) según el plan
56
+ elegido. Los precios están sujetos a cambios con previo aviso de 30 días. Las
57
+ cancelaciones surten efecto al final del período facturado.
58
+ </p>
59
+ </section>
60
+
61
+ <section>
62
+ <h2 className="text-lg font-semibold">5. Propiedad intelectual</h2>
63
+ <p className="mt-3 text-muted-foreground">
64
+ Todo el contenido de la Plataforma (código, diseño, logos, textos) es propiedad
65
+ exclusiva de {legal.companyName} o sus licenciantes. No podés copiar, modificar ni
66
+ distribuir ningún elemento sin autorización expresa y escrita.
67
+ </p>
68
+ </section>
69
+
70
+ <section>
71
+ <h2 className="text-lg font-semibold">6. Datos del usuario</h2>
72
+ <p className="mt-3 text-muted-foreground">
73
+ Sos propietario de los datos que cargás en la Plataforma. Nos otorgás una licencia
74
+ limitada para procesarlos únicamente con el fin de prestar el servicio. Consultá
75
+ nuestra{' '}
76
+ <Link href="/privacy" className="underline underline-offset-4 hover:text-foreground">
77
+ Política de Privacidad
78
+ </Link>{' '}
79
+ para más detalles.
80
+ </p>
81
+ </section>
82
+
83
+ <section>
84
+ <h2 className="text-lg font-semibold">7. Limitación de responsabilidad</h2>
85
+ <p className="mt-3 text-muted-foreground">
86
+ En la máxima medida permitida por la ley, {legal.companyName} no será responsable
87
+ por daños indirectos, incidentales, especiales o consecuentes derivados del uso o
88
+ imposibilidad de uso de la Plataforma.
89
+ </p>
90
+ </section>
91
+
92
+ <section>
93
+ <h2 className="text-lg font-semibold">8. Modificaciones</h2>
94
+ <p className="mt-3 text-muted-foreground">
95
+ Podemos actualizar estos Términos periódicamente. Te notificaremos por email ante
96
+ cambios materiales. El uso continuado de la Plataforma constituye aceptación de los
97
+ nuevos términos.
98
+ </p>
99
+ </section>
100
+
101
+ <section>
102
+ <h2 className="text-lg font-semibold">9. Contacto</h2>
103
+ <p className="mt-3 text-muted-foreground">
104
+ Para consultas sobre estos Términos escribinos a{' '}
105
+ <a
106
+ href={`mailto:${legal.email}`}
107
+ className="underline underline-offset-4 hover:text-foreground"
108
+ >
109
+ {legal.email}
110
+ </a>
111
+ .
112
+ </p>
113
+ </section>
114
+ </div>
115
+ </div>
116
+ </div>
117
+ )
118
+ }
@@ -1,81 +1,81 @@
1
- @import "tailwindcss";
2
-
3
- @theme inline {
4
- --color-background: var(--background);
5
- --color-foreground: var(--foreground);
6
- --color-card: var(--card);
7
- --color-card-foreground: var(--card-foreground);
8
- --color-popover: var(--popover);
9
- --color-popover-foreground: var(--popover-foreground);
10
- --color-primary: var(--primary);
11
- --color-primary-foreground: var(--primary-foreground);
12
- --color-secondary: var(--secondary);
13
- --color-secondary-foreground: var(--secondary-foreground);
14
- --color-muted: var(--muted);
15
- --color-muted-foreground: var(--muted-foreground);
16
- --color-accent: var(--accent);
17
- --color-accent-foreground: var(--accent-foreground);
18
- --color-destructive: var(--destructive);
19
- --color-destructive-foreground: var(--destructive-foreground);
20
- --color-border: var(--border);
21
- --color-input: var(--input);
22
- --color-ring: var(--ring);
23
- --radius-sm: calc(var(--radius) - 4px);
24
- --radius-md: calc(var(--radius) - 2px);
25
- --radius-lg: var(--radius);
26
- --radius-xl: calc(var(--radius) + 4px);
27
- }
28
-
29
- :root {
30
- --background: oklch(1 0 0);
31
- --foreground: oklch(0.145 0 0);
32
- --card: oklch(1 0 0);
33
- --card-foreground: oklch(0.145 0 0);
34
- --popover: oklch(1 0 0);
35
- --popover-foreground: oklch(0.145 0 0);
36
- --primary: oklch(0.205 0 0);
37
- --primary-foreground: oklch(0.985 0 0);
38
- --secondary: oklch(0.97 0 0);
39
- --secondary-foreground: oklch(0.205 0 0);
40
- --muted: oklch(0.97 0 0);
41
- --muted-foreground: oklch(0.556 0 0);
42
- --accent: oklch(0.97 0 0);
43
- --accent-foreground: oklch(0.205 0 0);
44
- --destructive: oklch(0.577 0.245 27.325);
45
- --destructive-foreground: oklch(0.985 0 0);
46
- --border: oklch(0.922 0 0);
47
- --input: oklch(0.922 0 0);
48
- --ring: oklch(0.708 0 0);
49
- --radius: 0.625rem;
50
- }
51
-
52
- .dark {
53
- --background: oklch(0.145 0 0);
54
- --foreground: oklch(0.985 0 0);
55
- --card: oklch(0.205 0 0);
56
- --card-foreground: oklch(0.985 0 0);
57
- --popover: oklch(0.205 0 0);
58
- --popover-foreground: oklch(0.985 0 0);
59
- --primary: oklch(0.985 0 0);
60
- --primary-foreground: oklch(0.205 0 0);
61
- --secondary: oklch(0.269 0 0);
62
- --secondary-foreground: oklch(0.985 0 0);
63
- --muted: oklch(0.269 0 0);
64
- --muted-foreground: oklch(0.708 0 0);
65
- --accent: oklch(0.269 0 0);
66
- --accent-foreground: oklch(0.985 0 0);
67
- --destructive: oklch(0.704 0.191 22.216);
68
- --destructive-foreground: oklch(0.985 0 0);
69
- --border: oklch(1 0 0 / 10%);
70
- --input: oklch(1 0 0 / 15%);
71
- --ring: oklch(0.556 0 0);
72
- }
73
-
74
- * {
75
- border-color: var(--border);
76
- }
77
-
78
- body {
79
- background-color: var(--background);
80
- color: var(--foreground);
81
- }
1
+ @import "tailwindcss";
2
+
3
+ @theme inline {
4
+ --color-background: var(--background);
5
+ --color-foreground: var(--foreground);
6
+ --color-card: var(--card);
7
+ --color-card-foreground: var(--card-foreground);
8
+ --color-popover: var(--popover);
9
+ --color-popover-foreground: var(--popover-foreground);
10
+ --color-primary: var(--primary);
11
+ --color-primary-foreground: var(--primary-foreground);
12
+ --color-secondary: var(--secondary);
13
+ --color-secondary-foreground: var(--secondary-foreground);
14
+ --color-muted: var(--muted);
15
+ --color-muted-foreground: var(--muted-foreground);
16
+ --color-accent: var(--accent);
17
+ --color-accent-foreground: var(--accent-foreground);
18
+ --color-destructive: var(--destructive);
19
+ --color-destructive-foreground: var(--destructive-foreground);
20
+ --color-border: var(--border);
21
+ --color-input: var(--input);
22
+ --color-ring: var(--ring);
23
+ --radius-sm: calc(var(--radius) - 4px);
24
+ --radius-md: calc(var(--radius) - 2px);
25
+ --radius-lg: var(--radius);
26
+ --radius-xl: calc(var(--radius) + 4px);
27
+ }
28
+
29
+ :root {
30
+ --background: oklch(1 0 0);
31
+ --foreground: oklch(0.145 0 0);
32
+ --card: oklch(1 0 0);
33
+ --card-foreground: oklch(0.145 0 0);
34
+ --popover: oklch(1 0 0);
35
+ --popover-foreground: oklch(0.145 0 0);
36
+ --primary: oklch(0.205 0 0);
37
+ --primary-foreground: oklch(0.985 0 0);
38
+ --secondary: oklch(0.97 0 0);
39
+ --secondary-foreground: oklch(0.205 0 0);
40
+ --muted: oklch(0.97 0 0);
41
+ --muted-foreground: oklch(0.556 0 0);
42
+ --accent: oklch(0.97 0 0);
43
+ --accent-foreground: oklch(0.205 0 0);
44
+ --destructive: oklch(0.577 0.245 27.325);
45
+ --destructive-foreground: oklch(0.985 0 0);
46
+ --border: oklch(0.922 0 0);
47
+ --input: oklch(0.922 0 0);
48
+ --ring: oklch(0.708 0 0);
49
+ --radius: 0.625rem;
50
+ }
51
+
52
+ .dark {
53
+ --background: oklch(0.145 0 0);
54
+ --foreground: oklch(0.985 0 0);
55
+ --card: oklch(0.205 0 0);
56
+ --card-foreground: oklch(0.985 0 0);
57
+ --popover: oklch(0.205 0 0);
58
+ --popover-foreground: oklch(0.985 0 0);
59
+ --primary: oklch(0.985 0 0);
60
+ --primary-foreground: oklch(0.205 0 0);
61
+ --secondary: oklch(0.269 0 0);
62
+ --secondary-foreground: oklch(0.985 0 0);
63
+ --muted: oklch(0.269 0 0);
64
+ --muted-foreground: oklch(0.708 0 0);
65
+ --accent: oklch(0.269 0 0);
66
+ --accent-foreground: oklch(0.985 0 0);
67
+ --destructive: oklch(0.704 0.191 22.216);
68
+ --destructive-foreground: oklch(0.985 0 0);
69
+ --border: oklch(1 0 0 / 10%);
70
+ --input: oklch(1 0 0 / 15%);
71
+ --ring: oklch(0.556 0 0);
72
+ }
73
+
74
+ * {
75
+ border-color: var(--border);
76
+ }
77
+
78
+ body {
79
+ background-color: var(--background);
80
+ color: var(--foreground);
81
+ }
@@ -1,26 +1,26 @@
1
- import type { Metadata } from 'next'
2
- import { Geist, Geist_Mono } from 'next/font/google'
3
- import './globals.css'
4
- import { AuthProvider } from '@/providers/auth-provider'
5
- import { Toaster } from '@/components/ui/toaster'
6
-
7
- const geistSans = Geist({ variable: '--font-geist-sans', subsets: ['latin'] })
8
- const geistMono = Geist_Mono({ variable: '--font-geist-mono', subsets: ['latin'] })
9
-
10
- export const metadata: Metadata = {
11
- title: 'create-saas-ar',
12
- description: 'Tu SaaS listo para Argentina',
13
- }
14
-
15
- export default function RootLayout({ children }: { children: React.ReactNode }) {
16
- return (
17
- <html lang="es">
18
- <body className={`${geistSans.variable} ${geistMono.variable} antialiased`}>
19
- <AuthProvider>
20
- {children}
21
- <Toaster />
22
- </AuthProvider>
23
- </body>
24
- </html>
25
- )
26
- }
1
+ import type { Metadata } from 'next'
2
+ import { Geist, Geist_Mono } from 'next/font/google'
3
+ import './globals.css'
4
+ import { AuthProvider } from '@/providers/auth-provider'
5
+ import { Toaster } from '@/components/ui/toaster'
6
+
7
+ const geistSans = Geist({ variable: '--font-geist-sans', subsets: ['latin'] })
8
+ const geistMono = Geist_Mono({ variable: '--font-geist-mono', subsets: ['latin'] })
9
+
10
+ export const metadata: Metadata = {
11
+ title: 'create-saas-ar',
12
+ description: 'Tu SaaS listo para Argentina',
13
+ }
14
+
15
+ export default function RootLayout({ children }: { children: React.ReactNode }) {
16
+ return (
17
+ <html lang="es">
18
+ <body className={`${geistSans.variable} ${geistMono.variable} antialiased`}>
19
+ <AuthProvider>
20
+ {children}
21
+ <Toaster />
22
+ </AuthProvider>
23
+ </body>
24
+ </html>
25
+ )
26
+ }
@@ -1,45 +1,5 @@
1
- import { LandingNavbar } from '@/components/landing/navbar'
2
- import { LandingHero } from '@/components/landing/hero'
3
- import { LandingFeatures } from '@/components/landing/features'
4
- import { LandingPricing } from '@/components/landing/pricing'
5
- import { LandingFaq } from '@/components/landing/faq'
6
- import { LandingFooter } from '@/components/landing/footer'
7
- import { siteConfig } from '@/config/site'
8
- import Link from 'next/link'
9
- import { Button } from '@/components/ui/button'
10
-
11
- export default function LandingPage() {
12
- return (
13
- <div className="flex min-h-screen flex-col">
14
- <LandingNavbar />
15
- <main className="flex-1">
16
- <LandingHero />
17
- <LandingFeatures />
18
- <LandingPricing />
19
-
20
- {/* CTA final */}
21
- <section className="py-20 md:py-28">
22
- <div className="mx-auto max-w-3xl px-4 text-center">
23
- <h2 className="text-3xl font-bold tracking-tight md:text-4xl">
24
- ¿Listo para empezar?
25
- </h2>
26
- <p className="mt-4 text-muted-foreground">
27
- Creá tu cuenta gratis y tené tu SaaS funcionando en minutos.
28
- </p>
29
- <div className="mt-8 flex flex-col items-center justify-center gap-4 sm:flex-row">
30
- <Button size="lg" asChild>
31
- <Link href="/register">{siteConfig.hero.cta.label}</Link>
32
- </Button>
33
- <Button size="lg" variant="outline" asChild>
34
- <Link href="/login">Iniciar sesión</Link>
35
- </Button>
36
- </div>
37
- </div>
38
- </section>
39
-
40
- <LandingFaq />
41
- </main>
42
- <LandingFooter />
43
- </div>
44
- )
45
- }
1
+ import { redirect } from 'next/navigation'
2
+
3
+ export default function RootPage() {
4
+ redirect('/setup')
5
+ }