@imansi/templates 0.1.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/LICENSE +21 -0
- package/README.md +557 -0
- package/package.json +35 -0
- package/src/auth/ForgotPasswordPage.jsx +176 -0
- package/src/auth/LoginPage.jsx +265 -0
- package/src/auth/RegisterPage.jsx +302 -0
- package/src/auth/ResetPasswordPage.jsx +158 -0
- package/src/auth/Verify2FAPage.jsx +175 -0
- package/src/dashboard/BillingPage.jsx +345 -0
- package/src/dashboard/DashboardHome.jsx +246 -0
- package/src/dashboard/NotificationsPage.jsx +230 -0
- package/src/dashboard/ProfilePage.jsx +272 -0
- package/src/dashboard/SettingsPage.jsx +415 -0
- package/src/dashboard/UsersTablePage.jsx +317 -0
- package/src/extra/CareersPage.jsx +166 -0
- package/src/extra/ChangelogPage.jsx +127 -0
- package/src/extra/CheckoutPage.jsx +383 -0
- package/src/extra/ComingSoonPage.jsx +147 -0
- package/src/extra/ErrorPage.jsx +91 -0
- package/src/extra/InvoicePage.jsx +241 -0
- package/src/extra/LegalPage.jsx +115 -0
- package/src/extra/MaintenancePage.jsx +172 -0
- package/src/extra/OnboardingPage.jsx +197 -0
- package/src/extra/StatusPage.jsx +181 -0
- package/src/index.js +53 -0
- package/src/layouts/AuthLayout.jsx +104 -0
- package/src/layouts/DashboardLayout.jsx +249 -0
- package/src/layouts/MarketingLayout.jsx +184 -0
- package/src/marketing/AboutPage.jsx +189 -0
- package/src/marketing/BlogPage.jsx +182 -0
- package/src/marketing/BlogPostPage.jsx +192 -0
- package/src/marketing/ContactPage.jsx +546 -0
- package/src/marketing/DocsPage.jsx +256 -0
- package/src/marketing/HomePage.jsx +702 -0
- package/src/marketing/LandingPage.jsx +755 -0
- package/src/marketing/PricingPage.jsx +205 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Imansi
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,557 @@
|
|
|
1
|
+
# @imansi/templates
|
|
2
|
+
|
|
3
|
+
> **29 páginas completas + 3 layouts** para el ecosistema Imansi. Auth, marketing, dashboard y extras — todas visuales, listas para conectar a tu backend.
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/@imansi/templates)
|
|
6
|
+
[](./LICENSE)
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Tabla de contenidos
|
|
11
|
+
|
|
12
|
+
- [¿Qué es?](#qué-es)
|
|
13
|
+
- [¿Por qué?](#por-qué)
|
|
14
|
+
- [Instalación](#instalación)
|
|
15
|
+
- [Configuración](#configuración)
|
|
16
|
+
- [Uso](#uso)
|
|
17
|
+
- [Páginas disponibles](#páginas-disponibles)
|
|
18
|
+
- [Auth (5)](#auth-5)
|
|
19
|
+
- [Marketing (8)](#marketing-8)
|
|
20
|
+
- [Dashboard (6)](#dashboard-6)
|
|
21
|
+
- [Extras (10)](#extras-10)
|
|
22
|
+
- [Layouts (3)](#layouts-3)
|
|
23
|
+
- [Temas y modos](#temas-y-modos)
|
|
24
|
+
- [Personalización](#personalización)
|
|
25
|
+
- [Anatomía](#anatomía)
|
|
26
|
+
- [Roadmap](#roadmap)
|
|
27
|
+
- [Licencia](#licencia)
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## ¿Qué es?
|
|
32
|
+
|
|
33
|
+
`@imansi/templates` es el paquete de **páginas completas** del ecosistema Imansi. Contiene 29 plantillas listas para copiar, pegar y usar: login, landing, dashboard, checkout, blog, docs y más.
|
|
34
|
+
|
|
35
|
+
A diferencia de `@imansi/ui` (componentes genéricos como `Button`, `Input`, `Card`), este paquete te da **páginas enteras** ya armadas con esos componentes.
|
|
36
|
+
|
|
37
|
+
**Son puramente visuales.** No tienen lógica de negocio, no llaman APIs, no manejan estado global. Reciben props y callbacks. Vos decidís cómo conectarlas.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## ¿Por qué?
|
|
42
|
+
|
|
43
|
+
Armar un login, un dashboard o una landing desde cero lleva días. Con `@imansi/templates`:
|
|
44
|
+
|
|
45
|
+
- **Empezás con 29 páginas listas** en vez de partir de cero.
|
|
46
|
+
- **Diseño consistente** entre auth, marketing y dashboard.
|
|
47
|
+
- **6 temas incluidos** (`minimal`, `modern`, `compact`, `warm`, `red`, `yellow`).
|
|
48
|
+
- **Modo oscuro automático** con `prefers-color-scheme`.
|
|
49
|
+
- **100% responsive** — funciona en mobile, tablet y desktop.
|
|
50
|
+
- **Props para todo** — cambiás textos, rutas y callbacks sin tocar el código.
|
|
51
|
+
|
|
52
|
+
En vez de perder 3 días armando un login con OAuth, 2FA y recuperación de contraseña, importás `LoginPage` y conectás tu backend.
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## Instalación
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
npm install @imansi/templates @imansi/ui @imansi/tailwind react-router-dom
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Requiere:
|
|
63
|
+
|
|
64
|
+
| Dependencia | Versión mínima |
|
|
65
|
+
|---|---|
|
|
66
|
+
| React | 18 o 19 |
|
|
67
|
+
| React DOM | 18 o 19 |
|
|
68
|
+
| React Router | 6.0 |
|
|
69
|
+
| Tailwind CSS | 4.0 |
|
|
70
|
+
| `@imansi/tailwind` | ^0.1.1 |
|
|
71
|
+
| `@imansi/ui` | ^0.1.1 |
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Configuración
|
|
76
|
+
|
|
77
|
+
### 1. Tailwind CSS v4 + Vite
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
npm install -D tailwindcss @tailwindcss/vite
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
```js
|
|
84
|
+
// vite.config.js
|
|
85
|
+
import { defineConfig } from 'vite';
|
|
86
|
+
import react from '@vitejs/plugin-react';
|
|
87
|
+
import tailwindcss from '@tailwindcss/vite';
|
|
88
|
+
|
|
89
|
+
export default defineConfig({
|
|
90
|
+
plugins: [react(), tailwindcss()],
|
|
91
|
+
optimizeDeps: {
|
|
92
|
+
exclude: ['@imansi/ui', '@imansi/templates'],
|
|
93
|
+
},
|
|
94
|
+
});
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### 2. Importar estilos
|
|
98
|
+
|
|
99
|
+
En `src/index.css`:
|
|
100
|
+
|
|
101
|
+
```css
|
|
102
|
+
@import "tailwindcss";
|
|
103
|
+
@import "@imansi/tailwind/styles.css";
|
|
104
|
+
|
|
105
|
+
/* Escanear tu app */
|
|
106
|
+
@source "./**/*.jsx";
|
|
107
|
+
@source "./**/*.js";
|
|
108
|
+
|
|
109
|
+
/* Escanear los paquetes de Imansi */
|
|
110
|
+
@source "../node_modules/@imansi/ui/src/**/*.jsx";
|
|
111
|
+
@source "../node_modules/@imansi/templates/src/**/*.jsx";
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### 3. Configurar tema y modo en `<html>`
|
|
115
|
+
|
|
116
|
+
```html
|
|
117
|
+
<html lang="es" data-theme="modern" data-mode="light">
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
O desde JavaScript:
|
|
121
|
+
|
|
122
|
+
```js
|
|
123
|
+
document.documentElement.dataset.theme = 'modern';
|
|
124
|
+
document.documentElement.dataset.mode = 'dark';
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## Uso
|
|
130
|
+
|
|
131
|
+
### Ejemplo mínimo
|
|
132
|
+
|
|
133
|
+
```jsx
|
|
134
|
+
import { BrowserRouter, Routes, Route } from 'react-router-dom';
|
|
135
|
+
import { LoginPage, LandingPage, DashboardHome } from '@imansi/templates';
|
|
136
|
+
|
|
137
|
+
export default function App() {
|
|
138
|
+
return (
|
|
139
|
+
<BrowserRouter>
|
|
140
|
+
<Routes>
|
|
141
|
+
<Route path="/" element={<LandingPage />} />
|
|
142
|
+
<Route path="/login" element={<LoginPage />} />
|
|
143
|
+
<Route path="/panel" element={<DashboardHome />} />
|
|
144
|
+
</Routes>
|
|
145
|
+
</BrowserRouter>
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### Conectar un backend
|
|
151
|
+
|
|
152
|
+
```jsx
|
|
153
|
+
import { LoginPage } from '@imansi/templates';
|
|
154
|
+
|
|
155
|
+
function LoginRoute() {
|
|
156
|
+
const [loading, setLoading] = useState(false);
|
|
157
|
+
const [error, setError] = useState(null);
|
|
158
|
+
|
|
159
|
+
async function handleSubmit({ correo, contrasena }) {
|
|
160
|
+
setLoading(true);
|
|
161
|
+
setError(null);
|
|
162
|
+
|
|
163
|
+
try {
|
|
164
|
+
const res = await fetch('/api/auth/login', {
|
|
165
|
+
method: 'POST',
|
|
166
|
+
headers: { 'Content-Type': 'application/json' },
|
|
167
|
+
body: JSON.stringify({ correo, contrasena }),
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
if (!res.ok) throw new Error('Credenciales inválidas');
|
|
171
|
+
|
|
172
|
+
const { token } = await res.json();
|
|
173
|
+
localStorage.setItem('token', token);
|
|
174
|
+
window.location.href = '/panel';
|
|
175
|
+
} catch (err) {
|
|
176
|
+
setError(err.message);
|
|
177
|
+
} finally {
|
|
178
|
+
setLoading(false);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
return (
|
|
183
|
+
<LoginPage
|
|
184
|
+
onSubmit={handleSubmit}
|
|
185
|
+
loading={loading}
|
|
186
|
+
error={error}
|
|
187
|
+
oauthProviders={['github', 'google']}
|
|
188
|
+
onOAuthClick={(provider) => {
|
|
189
|
+
window.location.href = `/api/auth/oauth/${provider}`;
|
|
190
|
+
}}
|
|
191
|
+
/>
|
|
192
|
+
);
|
|
193
|
+
}
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## Páginas disponibles
|
|
199
|
+
|
|
200
|
+
**29 páginas + 3 layouts** organizadas en 4 categorías.
|
|
201
|
+
|
|
202
|
+
### Auth (5)
|
|
203
|
+
|
|
204
|
+
Páginas de autenticación. Todas usan el `AuthLayout` (split-pane con branding).
|
|
205
|
+
|
|
206
|
+
| Página | Descripción | Props principales |
|
|
207
|
+
|---|---|---|
|
|
208
|
+
| `LoginPage` | Login con email/password + OAuth + link a 2FA | `onSubmit`, `onOAuthClick`, `oauthProviders`, `loading`, `error` |
|
|
209
|
+
| `RegisterPage` | Registro con validación de contraseña y términos | `onSubmit`, `showName`, `showTerms`, `oauthProviders` |
|
|
210
|
+
| `ForgotPasswordPage` | Solicitud de recuperación con estado de éxito | `onSubmit`, `success`, `backToLoginHref` |
|
|
211
|
+
| `ResetPasswordPage` | Nueva contraseña con validación de coincidencia | `onSubmit`, `loginHref` |
|
|
212
|
+
| `Verify2FAPage` | Verificación de código de 6 dígitos | `onSubmit`, `onResend`, `codeLength`, `cancelHref` |
|
|
213
|
+
|
|
214
|
+
**Ejemplo:**
|
|
215
|
+
```jsx
|
|
216
|
+
<LoginPage
|
|
217
|
+
brandName="Mi Empresa"
|
|
218
|
+
brandTagline="Bienvenido de nuevo"
|
|
219
|
+
oauthProviders={['github', 'google']}
|
|
220
|
+
registerHref="/registro"
|
|
221
|
+
forgotPasswordHref="/recuperar"
|
|
222
|
+
onSubmit={async ({ correo, contrasena }) => {
|
|
223
|
+
// tu lógica
|
|
224
|
+
}}
|
|
225
|
+
/>
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
### Marketing (8)
|
|
231
|
+
|
|
232
|
+
Páginas públicas para presentar tu producto, captar usuarios y mostrar contenido.
|
|
233
|
+
|
|
234
|
+
| Página | Descripción | Props principales |
|
|
235
|
+
|---|---|---|
|
|
236
|
+
| `LandingPage` | Hero con mockup + features + tabs de producto + testimonios | `heroTitle`, `heroHighlight`, `features`, `productTabs`, `testimonials` |
|
|
237
|
+
| `HomePage` | Home tipo negocio físico (panadería, restaurante, hotel) | `heroImage`, `aboutText`, `products`, `gallery`, `visitAddress` |
|
|
238
|
+
| `PricingPage` | Planes + tabla comparativa + FAQ | `plans`, `comparisonFeatures`, `faq` |
|
|
239
|
+
| `BlogPage` | Listado con filtros y búsqueda | `posts`, `categories` |
|
|
240
|
+
| `BlogPostPage` | Artículo con TOC + sidebar + related | `post`, `author`, `tocItems`, `relatedPosts` |
|
|
241
|
+
| `ContactPage` | Formulario + métodos + oficinas | `contactMethods`, `infoItems`, `offices`, `onSubmit` |
|
|
242
|
+
| `AboutPage` | Historia + valores + equipo + stats | `storyParagraphs`, `values`, `team`, `stats` |
|
|
243
|
+
| `DocsPage` | Documentación con sidebar + TOC + nav prev/next | `sections`, `tocItems`, `prevPage`, `nextPage` |
|
|
244
|
+
|
|
245
|
+
**Ejemplo:**
|
|
246
|
+
```jsx
|
|
247
|
+
<LandingPage
|
|
248
|
+
heroBadge="Nuevo — v0.2.0"
|
|
249
|
+
heroTitle="Construí tu SaaS en días, no en meses"
|
|
250
|
+
heroHighlight="en días"
|
|
251
|
+
features={[
|
|
252
|
+
{ title: 'Rápido', description: '...', icon: <Icon /> },
|
|
253
|
+
// ...
|
|
254
|
+
]}
|
|
255
|
+
productTabs={[
|
|
256
|
+
{ value: 'components', label: 'Componentes', title: '...', mockupView: 'issues' },
|
|
257
|
+
// ...
|
|
258
|
+
]}
|
|
259
|
+
/>
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
---
|
|
263
|
+
|
|
264
|
+
### Dashboard (6)
|
|
265
|
+
|
|
266
|
+
Páginas administrativas. Todas usan `DashboardLayout` (sidebar + topbar + content).
|
|
267
|
+
|
|
268
|
+
| Página | Descripción | Props principales |
|
|
269
|
+
|---|---|---|
|
|
270
|
+
| `DashboardHome` | Panel con KPIs + chart + actividad + top items | `stats`, `chartData`, `activityItems`, `topItems` |
|
|
271
|
+
| `UsersTablePage` | Tabla con tabs, búsqueda, bulk actions, paginación | `users`, `tabs`, `statusMap`, `onAddClick`, `onRowAction` |
|
|
272
|
+
| `SettingsPage` | 4 tabs: Perfil, Cuenta, Notificaciones, Seguridad | `onSaveProfile`, `onSaveAccount`, `onSaveNotifications` |
|
|
273
|
+
| `ProfilePage` | Editar perfil con avatar + stats + seguridad | `profile`, `stats`, `onSave`, `onUploadAvatar` |
|
|
274
|
+
| `BillingPage` | Plan actual + tarjeta + planes disponibles + facturas | `currentPlan`, `paymentMethod`, `invoices`, `onUpgrade` |
|
|
275
|
+
| `NotificationsPage` | Centro de notificaciones con tabs y estados | `notifications`, `onMarkAll`, `onMarkRead`, `onNotificationClick` |
|
|
276
|
+
|
|
277
|
+
**Ejemplo:**
|
|
278
|
+
```jsx
|
|
279
|
+
<DashboardHome
|
|
280
|
+
brandName="Mi App"
|
|
281
|
+
user={{ name: 'Juan', email: 'juan@ejemplo.com' }}
|
|
282
|
+
navSections={[
|
|
283
|
+
{ title: 'Principal', items: [
|
|
284
|
+
{ href: '/panel', label: 'Panel', icon: <Home /> },
|
|
285
|
+
{ href: '/panel/usuarios', label: 'Usuarios', icon: <Users />, badge: '24' },
|
|
286
|
+
]},
|
|
287
|
+
]}
|
|
288
|
+
stats={[
|
|
289
|
+
{ label: 'Ingresos', value: '$12,450', change: '+12.5%', trend: 'up' },
|
|
290
|
+
// ...
|
|
291
|
+
]}
|
|
292
|
+
chartData={[
|
|
293
|
+
{ label: 'Lun', value: 45 },
|
|
294
|
+
// ...
|
|
295
|
+
]}
|
|
296
|
+
/>
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
---
|
|
300
|
+
|
|
301
|
+
### Extras (10)
|
|
302
|
+
|
|
303
|
+
Páginas especiales que cubren todos los casos restantes.
|
|
304
|
+
|
|
305
|
+
| Página | Descripción | Props principales |
|
|
306
|
+
|---|---|---|
|
|
307
|
+
| `ErrorPage` | 404, 500, 403 con código gigante | `code`, `title`, `subtitle`, `primaryCTA` |
|
|
308
|
+
| `ComingSoonPage` | Badge pulsante + email capture | `title`, `subtitle`, `onSubmit`, `socialLinks` |
|
|
309
|
+
| `MaintenancePage` | Countdown en vivo + status de servicios | `targetDate`, `statusItems`, `contactEmail` |
|
|
310
|
+
| `OnboardingPage` | Stepper de N pasos con contenido custom | `steps`, `onComplete`, `onSkip` |
|
|
311
|
+
| `CheckoutPage` | Formulario de pago + resumen sticky | `items`, `total`, `onSubmit` |
|
|
312
|
+
| `InvoicePage` | Factura imprimible con items y totales | `invoiceNumber`, `customer`, `items`, `total` |
|
|
313
|
+
| `ChangelogPage` | Timeline de releases con cambios tipados | `releases` |
|
|
314
|
+
| `CareersPage` | Beneficios + posiciones abiertas | `benefits`, `positions`, `ctaPrimary` |
|
|
315
|
+
| `LegalPage` | Términos con TOC lateral | `sections`, `contactEmail` |
|
|
316
|
+
| `StatusPage` | Estado de servicios en vivo + incidentes | `services`, `incidents`, `overallStatus` |
|
|
317
|
+
|
|
318
|
+
**Ejemplo:**
|
|
319
|
+
```jsx
|
|
320
|
+
<CheckoutPage
|
|
321
|
+
title="Finalizar compra"
|
|
322
|
+
items={[
|
|
323
|
+
{ id: 1, name: 'Plan Pro', description: 'Suscripción mensual', price: '$29', quantity: 1 },
|
|
324
|
+
]}
|
|
325
|
+
subtotal="$29.00"
|
|
326
|
+
tax="$6.09"
|
|
327
|
+
total="$35.09"
|
|
328
|
+
onSubmit={async (data) => {
|
|
329
|
+
// procesar pago
|
|
330
|
+
}}
|
|
331
|
+
/>
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
---
|
|
335
|
+
|
|
336
|
+
### Layouts (3)
|
|
337
|
+
|
|
338
|
+
Layouts base reutilizables para organizar grupos de páginas.
|
|
339
|
+
|
|
340
|
+
| Layout | Descripción | Usado por |
|
|
341
|
+
|---|---|---|
|
|
342
|
+
| `AuthLayout` | Split-pane: branding a la izquierda, form a la derecha | LoginPage, RegisterPage, etc. |
|
|
343
|
+
| `MarketingLayout` | Header sticky + content + footer con columnas | LandingPage, PricingPage, BlogPage, etc. |
|
|
344
|
+
| `DashboardLayout` | Sidebar colapsable + topbar + content scrollable | DashboardHome, UsersTablePage, etc. |
|
|
345
|
+
|
|
346
|
+
**Ejemplo:**
|
|
347
|
+
```jsx
|
|
348
|
+
import { DashboardLayout } from '@imansi/templates';
|
|
349
|
+
|
|
350
|
+
<DashboardLayout
|
|
351
|
+
brandName="Mi App"
|
|
352
|
+
navSections={[...]}
|
|
353
|
+
user={{ name: 'Juan', email: 'juan@ejemplo.com' }}
|
|
354
|
+
title="Mi página custom"
|
|
355
|
+
>
|
|
356
|
+
<p>Contenido personalizado</p>
|
|
357
|
+
</DashboardLayout>
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
---
|
|
361
|
+
|
|
362
|
+
## Temas y modos
|
|
363
|
+
|
|
364
|
+
Funciona con los **6 temas** de `@imansi/tailwind`:
|
|
365
|
+
|
|
366
|
+
| Tema | Descripción |
|
|
367
|
+
|---|---|
|
|
368
|
+
| `minimal` | Monocromo, editorial, sin sombras |
|
|
369
|
+
| `modern` | Índigo vibrante, radius grande |
|
|
370
|
+
| `compact` | Verde esmeralda, dashboard denso |
|
|
371
|
+
| `warm` | Serif, crema y terracota |
|
|
372
|
+
| `red` | Rojo intenso, alta energía |
|
|
373
|
+
| `yellow` | Ámbar brillante, cálido |
|
|
374
|
+
|
|
375
|
+
Y los **2 modos**:
|
|
376
|
+
|
|
377
|
+
- `light` — Colores claros
|
|
378
|
+
- `dark` — Colores oscuros
|
|
379
|
+
|
|
380
|
+
Cambiar tema es instantáneo:
|
|
381
|
+
|
|
382
|
+
```js
|
|
383
|
+
document.documentElement.dataset.theme = 'warm';
|
|
384
|
+
document.documentElement.dataset.mode = 'dark';
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
**Recomendación por tipo de página:**
|
|
388
|
+
|
|
389
|
+
| Tipo | Tema ideal |
|
|
390
|
+
|---|---|
|
|
391
|
+
| Auth | `minimal` o `modern` |
|
|
392
|
+
| Landing SaaS | `modern` o `minimal` |
|
|
393
|
+
| Home negocio físico | `warm` |
|
|
394
|
+
| Dashboard | `compact` |
|
|
395
|
+
| Marca fuerte | `red` o `yellow` |
|
|
396
|
+
|
|
397
|
+
---
|
|
398
|
+
|
|
399
|
+
## Personalización
|
|
400
|
+
|
|
401
|
+
Todas las páginas aceptan props para personalizar **textos, rutas y callbacks**. No hay nada hardcodeado salvo valores por defecto razonables.
|
|
402
|
+
|
|
403
|
+
### Textos
|
|
404
|
+
|
|
405
|
+
```jsx
|
|
406
|
+
<LoginPage
|
|
407
|
+
title="Iniciar sesión"
|
|
408
|
+
subtitle="Ingresá con tu cuenta"
|
|
409
|
+
submitText="Entrar"
|
|
410
|
+
submitLoadingText="Ingresando..."
|
|
411
|
+
emailLabel="Tu correo"
|
|
412
|
+
passwordLabel="Tu contraseña"
|
|
413
|
+
forgotPasswordText="¿La olvidaste?"
|
|
414
|
+
registerText="¿No tenés cuenta?"
|
|
415
|
+
registerLinkText="Crear una"
|
|
416
|
+
/>
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
### Rutas
|
|
420
|
+
|
|
421
|
+
```jsx
|
|
422
|
+
<LoginPage
|
|
423
|
+
registerHref="/registro"
|
|
424
|
+
forgotPasswordHref="/recuperar"
|
|
425
|
+
twoFactorHref="/verificar-2fa"
|
|
426
|
+
/>
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
### Callbacks
|
|
430
|
+
|
|
431
|
+
```jsx
|
|
432
|
+
<LoginPage
|
|
433
|
+
onSubmit={async ({ correo, contrasena, recordarme }) => {
|
|
434
|
+
// tu lógica de login
|
|
435
|
+
}}
|
|
436
|
+
onOAuthClick={(provider) => {
|
|
437
|
+
// tu lógica de OAuth
|
|
438
|
+
}}
|
|
439
|
+
error={errorExterno}
|
|
440
|
+
loading={loadingExterno}
|
|
441
|
+
/>
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
### Branding
|
|
445
|
+
|
|
446
|
+
```jsx
|
|
447
|
+
<LoginPage
|
|
448
|
+
brandName="Mi Empresa"
|
|
449
|
+
brandTagline="Autenticación moderna"
|
|
450
|
+
brandLogo={<img src="/logo.svg" alt="Logo" />}
|
|
451
|
+
/>
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
### Footer
|
|
455
|
+
|
|
456
|
+
```jsx
|
|
457
|
+
<LoginPage
|
|
458
|
+
footer="Al continuar aceptás nuestros Términos y Privacidad."
|
|
459
|
+
/>
|
|
460
|
+
```
|
|
461
|
+
|
|
462
|
+
---
|
|
463
|
+
|
|
464
|
+
## Anatomía
|
|
465
|
+
|
|
466
|
+
```
|
|
467
|
+
@imansi/templates/
|
|
468
|
+
├── src/
|
|
469
|
+
│ ├── auth/ (5 páginas)
|
|
470
|
+
│ │ ├── LoginPage.jsx
|
|
471
|
+
│ │ ├── RegisterPage.jsx
|
|
472
|
+
│ │ ├── ForgotPasswordPage.jsx
|
|
473
|
+
│ │ ├── ResetPasswordPage.jsx
|
|
474
|
+
│ │ └── Verify2FAPage.jsx
|
|
475
|
+
│ │
|
|
476
|
+
│ ├── marketing/ (8 páginas)
|
|
477
|
+
│ │ ├── LandingPage.jsx
|
|
478
|
+
│ │ ├── HomePage.jsx
|
|
479
|
+
│ │ ├── PricingPage.jsx
|
|
480
|
+
│ │ ├── BlogPage.jsx
|
|
481
|
+
│ │ ├── BlogPostPage.jsx
|
|
482
|
+
│ │ ├── ContactPage.jsx
|
|
483
|
+
│ │ ├── AboutPage.jsx
|
|
484
|
+
│ │ └── DocsPage.jsx
|
|
485
|
+
│ │
|
|
486
|
+
│ ├── dashboard/ (6 páginas)
|
|
487
|
+
│ │ ├── DashboardHome.jsx
|
|
488
|
+
│ │ ├── UsersTablePage.jsx
|
|
489
|
+
│ │ ├── SettingsPage.jsx
|
|
490
|
+
│ │ ├── ProfilePage.jsx
|
|
491
|
+
│ │ ├── BillingPage.jsx
|
|
492
|
+
│ │ └── NotificationsPage.jsx
|
|
493
|
+
│ │
|
|
494
|
+
│ ├── extra/ (10 páginas)
|
|
495
|
+
│ │ ├── ErrorPage.jsx
|
|
496
|
+
│ │ ├── ComingSoonPage.jsx
|
|
497
|
+
│ │ ├── MaintenancePage.jsx
|
|
498
|
+
│ │ ├── OnboardingPage.jsx
|
|
499
|
+
│ │ ├── CheckoutPage.jsx
|
|
500
|
+
│ │ ├── InvoicePage.jsx
|
|
501
|
+
│ │ ├── ChangelogPage.jsx
|
|
502
|
+
│ │ ├── CareersPage.jsx
|
|
503
|
+
│ │ ├── LegalPage.jsx
|
|
504
|
+
│ │ └── StatusPage.jsx
|
|
505
|
+
│ │
|
|
506
|
+
│ ├── layouts/ (3 layouts)
|
|
507
|
+
│ │ ├── AuthLayout.jsx
|
|
508
|
+
│ │ ├── MarketingLayout.jsx
|
|
509
|
+
│ │ └── DashboardLayout.jsx
|
|
510
|
+
│ │
|
|
511
|
+
│ └── index.js (entry point)
|
|
512
|
+
│
|
|
513
|
+
├── package.json
|
|
514
|
+
├── README.md
|
|
515
|
+
└── LICENSE
|
|
516
|
+
```
|
|
517
|
+
|
|
518
|
+
**Total: 32 archivos** (29 páginas + 3 layouts).
|
|
519
|
+
|
|
520
|
+
---
|
|
521
|
+
|
|
522
|
+
## Roadmap
|
|
523
|
+
|
|
524
|
+
### ✅ v0.1.0 — Primera versión (actual)
|
|
525
|
+
|
|
526
|
+
- [x] 5 páginas de auth
|
|
527
|
+
- [x] 8 páginas de marketing
|
|
528
|
+
- [x] 6 páginas de dashboard
|
|
529
|
+
- [x] 10 páginas extras
|
|
530
|
+
- [x] 3 layouts base
|
|
531
|
+
- [x] Compatible con 6 temas × 2 modos
|
|
532
|
+
- [x] 100% responsive
|
|
533
|
+
|
|
534
|
+
### ⏭️ Próximas versiones
|
|
535
|
+
|
|
536
|
+
- [ ] `v0.2.0` — Más plantillas (restaurante, hotel, gimnasio, clínica)
|
|
537
|
+
- [ ] `v0.3.0` — Variantes de páginas existentes (dark-first, minimal, etc.)
|
|
538
|
+
- [ ] `v1.0.0` — Estabilización de API
|
|
539
|
+
|
|
540
|
+
### 🌱 Ecosistema Imansi completo
|
|
541
|
+
|
|
542
|
+
- [x] `@imansi/tailwind` — Design tokens + 6 temas
|
|
543
|
+
- [x] `@imansi/ui` — 50+ componentes
|
|
544
|
+
- [x] `@imansi/templates` — 29 páginas + 3 layouts
|
|
545
|
+
- [ ] `create-imansi-app` — CLI de scaffolding
|
|
546
|
+
- [ ] `@imansi/auth-react` — Hooks de autenticación (en desarrollo)
|
|
547
|
+
- [ ] `@imansi/dashboard` — Widgets avanzados
|
|
548
|
+
|
|
549
|
+
---
|
|
550
|
+
|
|
551
|
+
## Licencia
|
|
552
|
+
|
|
553
|
+
[MIT](./LICENSE) © 2026 Imansi
|
|
554
|
+
|
|
555
|
+
---
|
|
556
|
+
|
|
557
|
+
**Hecho con ❤️ por [Imansi](https://github.com/imansi)**
|
package/package.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@imansi/templates",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Páginas completas listas para usar del ecosistema Imansi: landing, blog, login, dashboard y más. Puramente visuales.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"imansi",
|
|
7
|
+
"templates",
|
|
8
|
+
"react",
|
|
9
|
+
"landing",
|
|
10
|
+
"blog",
|
|
11
|
+
"login",
|
|
12
|
+
"dashboard",
|
|
13
|
+
"tailwind"
|
|
14
|
+
],
|
|
15
|
+
"license": "MIT",
|
|
16
|
+
"author": "Imansi",
|
|
17
|
+
"type": "module",
|
|
18
|
+
"main": "./src/index.js",
|
|
19
|
+
"files": [
|
|
20
|
+
"src/",
|
|
21
|
+
"README.md",
|
|
22
|
+
"LICENSE"
|
|
23
|
+
],
|
|
24
|
+
"exports": {
|
|
25
|
+
".": "./src/index.js",
|
|
26
|
+
"./package.json": "./package.json"
|
|
27
|
+
},
|
|
28
|
+
"peerDependencies": {
|
|
29
|
+
"@imansi/tailwind": "^0.1.1",
|
|
30
|
+
"@imansi/ui": "^0.1.1",
|
|
31
|
+
"react": "^18.0.0 || ^19.0.0",
|
|
32
|
+
"react-dom": "^18.0.0 || ^19.0.0",
|
|
33
|
+
"react-router-dom": "^6.0.0"
|
|
34
|
+
}
|
|
35
|
+
}
|