Autenticación local
Registro e inicio de sesión con perfil local en Targ-Apps-Finance — sin servidor.
Targ-Apps-Finance usa un perfil local (no hay API ni contraseña). El usuario se identifica con nombre y correo; los datos financieros siguen en el snapshot de Chroma-Fs / IndexedDB.
Pantalla #/auth
pages/Auth.js es una pantalla completa (sin Layout). Tipografía Grift Variable (display 750 + cuerpo 400) y paleta --cs-*. El candado emoji se sustituyó por la marca Targ (assets/logo.svg).
| Pieza | Detalle |
|---|---|
| Marca | TargMark (monograma Targ) + eyebrow «Targ Apps» + titular «Finance» |
| Copia | Perfil local, sin servidor ni contraseña; solo nombre y correo |
| Pestañas | Registrarse / Iniciar sesión (role="tablist"), indicador cobre en la activa |
| Registro | Nombre + correo → Crear perfil |
| Login | Correo del perfil local → Entrar |
| Firma visual | Rail vertical --cs-primary a la izquierda de .taf-auth-card |
| A11y | focus-visible en pestañas y envío; prefers-reduced-motion en animateAuthEnter() |
Estilos en src/styles/finance.css (.taf-auth-*). Fuente autoalojada: fonts/Grift Variable-VF.ttf vía @font-face en src/styles/theme.css.
Flujo
- Arranque — Si no hay sesión (
session.loggedIn), el guard redirige a#/auth. - Registro — Nombre + correo validados → se guarda
profileen el snapshot →sessionactiva. - Login — El correo debe coincidir con el perfil local guardado.
- Onboarding — Tras autenticarse, si no hay cuentas financieras,
#/onboarding(pantalla completa, sinLayout, misma estética que auth). El formulario no pide nombre: la primera cuenta financiera toma elprofile.namedel registro (resolveOnboardingAccountName()enlogic/onboarding.js). Si el perfil no tiene nombre (migración legacy), se usa «Mi cuenta». CTA: «Crear cuenta». - Logout — En Ajustes, «Cerrar sesión» borra la sesión y vuelve a
#/auth. El perfil y los datos financieros permanecen en disco.
Modelo en el snapshot
| Campo | Forma | Descripción |
|---|---|---|
profile | { id, name, email, createdAt } | Perfil único en este dispositivo |
session | { userId, loggedIn: true } | Sesión actual (también espejada en sessionStorage como taf:session) |
Exportación/importación JSON incluye profile y session cuando existen (logic/persistence/storage.js).
Instalaciones existentes
Si ya había cuentas u onboarding completo pero no profile, hydratePersist() crea un perfil legacy (Usuario / usuario@local) y marca la sesión como activa para no bloquear datos previos.
Archivos
| Archivo | Rol |
|---|---|
pages/Auth.js | UI con TargMark, Grift y pestañas Registrarse / Iniciar sesión |
pages/Onboarding.js | Primera cuenta — TargMark, ledger 01, AccountForm onboarding |
src/components/TargMark.js | Monograma compartido auth + onboarding |
logic/auth.js | Validación, registro, login, logout, syncAppRoute() |
logic/routes.js | AUTH_HASH, applyAppHash() (auth → onboarding → app) |
logic/persist.js | getProfile, setProfile, getSession, setSession, clearSession |
logic/onboarding.js | Onboarding solo si isAuthenticated() |
logic/router.js | Ruta #/auth |
src/App.js | Auth sin Layout (pantalla completa) |
src/animations.js | animateAuthEnter() en la tarjeta |
src/styles/finance.css | Estilos .taf-auth-* (rail cobre, pestañas, tipografía) |
src/styles/theme.css | @font-face Grift Variable + --font-sans |
fonts/Grift Variable-VF.ttf | Fuente de marca autoalojada |
assets/logo.svg | Marca Targ en la cabecera de auth |
test/logic/auth.test.js | Suite de registro, login, guards y migración |
Tests
npm test
# incluye test/logic/auth.test.js