ar-saas 0.3.1 → 0.3.3
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/LICENSE +21 -21
- package/README.md +338 -314
- package/dist/cli.js +19 -0
- package/dist/generator.js +166 -55
- package/package.json +52 -50
- package/templates/backend/.env.example +67 -67
- package/templates/backend/.prettierrc +4 -4
- package/templates/backend/README.md +249 -168
- package/templates/backend/eslint.config.mjs +35 -35
- package/templates/backend/nest-cli.json +8 -8
- package/templates/backend/package-lock.json +10979 -10979
- package/templates/backend/package.json +88 -88
- package/templates/backend/src/app.controller.spec.ts +24 -24
- package/templates/backend/src/app.controller.ts +15 -15
- package/templates/backend/src/app.module.ts +40 -40
- package/templates/backend/src/app.service.ts +11 -11
- package/templates/backend/src/common/base/base.repository.ts +221 -221
- package/templates/backend/src/common/base/base.schema.ts +24 -24
- package/templates/backend/src/common/decorators/cookie.decorator.ts +9 -9
- package/templates/backend/src/common/decorators/current-user.decorator.ts +20 -20
- package/templates/backend/src/common/decorators/workspace-id.decorator.ts +14 -14
- package/templates/backend/src/common/filters/global-exception.filter.ts +61 -61
- package/templates/backend/src/common/guards/jwt-auth.guard.ts +5 -5
- package/templates/backend/src/common/interceptors/workspace-tenant.interceptor.ts +45 -45
- package/templates/backend/src/main.ts +51 -51
- package/templates/backend/src/modules/auth/auth.controller.ts +158 -158
- package/templates/backend/src/modules/auth/auth.module.ts +20 -20
- package/templates/backend/src/modules/auth/auth.service.ts +257 -257
- package/templates/backend/src/modules/auth/dto/forgot-password.dto.ts +9 -9
- package/templates/backend/src/modules/auth/dto/login.dto.ts +14 -14
- package/templates/backend/src/modules/auth/dto/refresh-token.dto.ts +12 -12
- package/templates/backend/src/modules/auth/dto/register.dto.ts +26 -26
- package/templates/backend/src/modules/auth/dto/reset-password.dto.ts +16 -16
- package/templates/backend/src/modules/auth/dto/verify-email.dto.ts +9 -9
- package/templates/backend/src/modules/auth/strategies/jwt.strategy.ts +43 -43
- package/templates/backend/src/modules/mail/mail.module.ts +9 -9
- package/templates/backend/src/modules/mail/mail.service.ts +141 -141
- package/templates/backend/src/modules/users/schemas/user.schema.ts +54 -54
- package/templates/backend/src/modules/users/users.module.ts +14 -14
- package/templates/backend/src/modules/users/users.repository.ts +51 -51
- package/templates/backend/src/modules/users/users.service.ts +104 -104
- package/templates/backend/src/modules/workspaces/schemas/workspace.schema.ts +26 -26
- package/templates/backend/src/modules/workspaces/workspaces.module.ts +16 -16
- package/templates/backend/src/modules/workspaces/workspaces.repository.ts +34 -34
- package/templates/backend/src/modules/workspaces/workspaces.service.ts +42 -42
- package/templates/backend/test/app.e2e-spec.ts +25 -25
- package/templates/backend/test/jest-e2e.json +9 -9
- package/templates/backend/tsconfig.build.json +4 -4
- package/templates/backend/tsconfig.json +26 -26
- package/templates/frontend/.env.local.example +1 -1
- package/templates/frontend/README.md +152 -0
- package/templates/frontend/components.json +20 -20
- package/templates/frontend/eslint.config.mjs +14 -14
- package/templates/frontend/next.config.ts +5 -5
- package/templates/frontend/package-lock.json +6722 -6722
- package/templates/frontend/package.json +48 -48
- package/templates/frontend/pnpm-lock.yaml +5012 -5012
- package/templates/frontend/pnpm-workspace.yaml +3 -3
- package/templates/frontend/postcss.config.mjs +7 -7
- package/templates/frontend/src/app/(auth)/forgot-password/page.tsx +84 -84
- package/templates/frontend/src/app/(auth)/layout.tsx +28 -28
- package/templates/frontend/src/app/(auth)/login/page.tsx +111 -111
- package/templates/frontend/src/app/(auth)/register/page.tsx +161 -161
- package/templates/frontend/src/app/(auth)/reset-password/page.tsx +120 -120
- package/templates/frontend/src/app/(auth)/verify-email/page.tsx +78 -78
- package/templates/frontend/src/app/(dashboard)/billing/page.tsx +111 -111
- package/templates/frontend/src/app/(dashboard)/dashboard/page.tsx +105 -105
- package/templates/frontend/src/app/(dashboard)/layout.tsx +38 -38
- package/templates/frontend/src/app/(dashboard)/profile/page.tsx +226 -226
- package/templates/frontend/src/app/(dashboard)/settings/page.tsx +156 -156
- package/templates/frontend/src/app/(dashboard)/team/page.tsx +178 -178
- package/templates/frontend/src/app/(legal)/privacy/page.tsx +127 -127
- package/templates/frontend/src/app/(legal)/terms/page.tsx +118 -118
- package/templates/frontend/src/app/globals.css +81 -81
- package/templates/frontend/src/app/layout.tsx +26 -26
- package/templates/frontend/src/app/page.tsx +5 -45
- package/templates/frontend/src/app/setup/page.tsx +371 -275
- package/templates/frontend/src/components/dashboard/header.tsx +89 -89
- package/templates/frontend/src/components/dashboard/sidebar.tsx +71 -71
- package/templates/frontend/src/components/dashboard/stat-card.tsx +34 -34
- package/templates/frontend/src/components/landing/faq.tsx +39 -39
- package/templates/frontend/src/components/landing/features.tsx +54 -54
- package/templates/frontend/src/components/landing/footer.tsx +76 -76
- package/templates/frontend/src/components/landing/hero.tsx +72 -72
- package/templates/frontend/src/components/landing/navbar.tsx +78 -78
- package/templates/frontend/src/components/landing/pricing.tsx +90 -90
- package/templates/frontend/src/components/ui/accordion.tsx +52 -52
- package/templates/frontend/src/components/ui/avatar.tsx +46 -46
- package/templates/frontend/src/components/ui/badge.tsx +30 -30
- package/templates/frontend/src/components/ui/button.tsx +52 -52
- package/templates/frontend/src/components/ui/card.tsx +50 -50
- package/templates/frontend/src/components/ui/checkbox.tsx +27 -27
- package/templates/frontend/src/components/ui/dialog.tsx +100 -100
- package/templates/frontend/src/components/ui/dropdown-menu.tsx +173 -173
- package/templates/frontend/src/components/ui/form.tsx +158 -158
- package/templates/frontend/src/components/ui/input.tsx +21 -21
- package/templates/frontend/src/components/ui/label.tsx +22 -22
- package/templates/frontend/src/components/ui/separator.tsx +25 -25
- package/templates/frontend/src/components/ui/skeleton.tsx +7 -7
- package/templates/frontend/src/components/ui/switch.tsx +28 -28
- package/templates/frontend/src/components/ui/tabs.tsx +54 -54
- package/templates/frontend/src/components/ui/textarea.tsx +20 -20
- package/templates/frontend/src/components/ui/toast.tsx +109 -109
- package/templates/frontend/src/components/ui/toaster.tsx +30 -30
- package/templates/frontend/src/config/site.ts +197 -197
- package/templates/frontend/src/hooks/use-toast.ts +116 -116
- package/templates/frontend/src/lib/api/auth.ts +39 -39
- package/templates/frontend/src/lib/api/client.ts +66 -66
- package/templates/frontend/src/lib/hooks/use-auth.ts +1 -1
- package/templates/frontend/src/lib/utils.ts +6 -6
- package/templates/frontend/src/providers/auth-provider.tsx +60 -60
- package/templates/frontend/src/types/api.ts +12 -12
- package/templates/frontend/src/types/auth.ts +27 -27
- 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} ("la Plataforma"),
|
|
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} ("la Plataforma"),
|
|
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 {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
+
}
|