+
Firma en remoto
-
+
Genera una liga pública (vigencia 72 h) para que el cliente firme y suba sus
documentos desde su celular, sin usuario ni contraseña.
{ligaUrl && (
-
+
{ligaUrl}
{ligaCopiada && (
-
+
Liga y mensaje de WhatsApp copiados
)}
diff --git a/apps/alta-clientes/src/pages/FirmaRemotaPage.tsx b/apps/alta-clientes/src/pages/FirmaRemotaPage.tsx
index 818a3a1..7dcb174 100644
--- a/apps/alta-clientes/src/pages/FirmaRemotaPage.tsx
+++ b/apps/alta-clientes/src/pages/FirmaRemotaPage.tsx
@@ -82,10 +82,10 @@ export default function FirmaRemotaPage() {
if (errorCarga) {
return (
-
+
- FRASA
-
+ FRASA.
+
{errorCarga}
@@ -95,29 +95,29 @@ export default function FirmaRemotaPage() {
if (!cliente) {
return (
-
+
)
}
return (
-
-
+
+
-
- Hola, {cliente.nombre}
+
+ Hola, {cliente.nombre}
-
+
Proyecto {cliente.proyecto}
{cliente.unidad ? ` · Unidad ${cliente.unidad}` : ''}. Firma y sube los documentos de tu
expediente desde aquí.
@@ -125,11 +125,11 @@ export default function FirmaRemotaPage() {
-
+
Tu firma
{firmaOk ? (
-
+
Firma registrada correctamente
) : (
@@ -140,7 +140,7 @@ export default function FirmaRemotaPage() {
type="button"
disabled={enviandoFirma}
onClick={() => void enviarFirma()}
- className="mt-4 bg-accent px-5 py-2.5 text-xs font-bold uppercase tracking-widest text-white transition-colors duration-150 hover:bg-neutral-900 disabled:opacity-40"
+ className="mt-4 rounded-lg bg-accent px-5 py-2.5 text-sm font-medium text-white shadow-sm transition-all duration-100 ease-out hover:bg-accent-hover disabled:opacity-40"
>
{enviandoFirma ? 'Enviando…' : 'Enviar firma'}
@@ -149,22 +149,22 @@ export default function FirmaRemotaPage() {
-
+
Tus documentos
{SLOTS_DOCUMENTOS.map(({ slot, etiqueta }) => {
const subido = cliente.documentos.find((d) => d.tipo === slot)
return (
- -
-
{etiqueta}
+ -
+
{etiqueta}
{subido ? (
-
+
✓ {subido.nombreArchivo}
) : (
-
)}
{erroresDoc[slot] && (
diff --git a/apps/cobranza/src/components/AuthGate.tsx b/apps/cobranza/src/components/AuthGate.tsx
index baba256..b354a11 100644
--- a/apps/cobranza/src/components/AuthGate.tsx
+++ b/apps/cobranza/src/components/AuthGate.tsx
@@ -17,17 +17,17 @@ export default function AuthGate({ children }: { children: ReactNode }) {
}
return (
-
-
+
+
-
+
{sesion.usuario.nombre} · {sesion.usuario.rol}
@@ -37,7 +37,7 @@ export default function AuthGate({ children }: { children: ReactNode }) {
logout()
setSesion(null)
}}
- className="text-xs font-bold uppercase tracking-widest text-accent transition-colors duration-150 hover:text-accent-hover"
+ className="text-xs font-medium text-accent transition-colors duration-100 ease-out hover:text-accent-hover"
>
Salir
diff --git a/apps/cobranza/src/components/BadgeStatus.tsx b/apps/cobranza/src/components/BadgeStatus.tsx
index 3cd8d5e..a13f8e3 100644
--- a/apps/cobranza/src/components/BadgeStatus.tsx
+++ b/apps/cobranza/src/components/BadgeStatus.tsx
@@ -1,16 +1,16 @@
import type { StatusPago } from '../types'
const CLASES: Record
= {
- PENDIENTE: 'border-neutral-300 text-neutral-500',
- PAGADO: 'border-green-300 text-green-700',
- VENCIDO: 'border-red-300 text-red-700',
- PARCIAL: 'border-amber-300 text-amber-700',
+ PENDIENTE: 'bg-gray-100 text-gray-600',
+ PAGADO: 'bg-green-50 text-green-700',
+ VENCIDO: 'bg-red-50 text-red-700',
+ PARCIAL: 'bg-amber-50 text-amber-700',
}
export default function BadgeStatus({ status }: { status: StatusPago }) {
return (
{status}
diff --git a/apps/cobranza/src/components/CambiarPasswordModal.tsx b/apps/cobranza/src/components/CambiarPasswordModal.tsx
index 1be9e05..d049f46 100644
--- a/apps/cobranza/src/components/CambiarPasswordModal.tsx
+++ b/apps/cobranza/src/components/CambiarPasswordModal.tsx
@@ -3,8 +3,8 @@ import { validarConfirmacion, validarPasswordNueva } from '../lib/password'
import { cambiarPassword } from '../services/auth'
const CLASE_INPUT =
- 'w-full border border-neutral-300 px-4 py-3 text-sm focus:border-accent focus:outline-none'
-const CLASE_LABEL = 'mb-2 block text-xs font-bold uppercase tracking-widest text-neutral-500'
+ 'w-full rounded-lg border border-[#D1D5DB] bg-white px-3 py-2.5 text-sm transition-colors focus:border-accent focus:outline-none focus:ring-2 focus:ring-accent/20'
+const CLASE_LABEL = 'mb-2 block text-xs font-medium text-[#4B5563]'
/**
* Modal "Cambiar contraseña": actual + nueva + confirmar. Valida en cliente
@@ -45,19 +45,19 @@ export default function CambiarPasswordModal({ onCerrar }: { onCerrar: () => voi
aria-modal="true"
aria-label="Cambiar contraseña"
>
-
-
+
+
Cambiar contraseña
{exito ? (
<>
-
+
Contraseña actualizada
@@ -111,7 +111,7 @@ export default function CambiarPasswordModal({ onCerrar }: { onCerrar: () => voi
{error && (
{error}
@@ -120,14 +120,14 @@ export default function CambiarPasswordModal({ onCerrar }: { onCerrar: () => voi
diff --git a/apps/cobranza/src/components/KpiCard.tsx b/apps/cobranza/src/components/KpiCard.tsx
index e841007..422b119 100644
--- a/apps/cobranza/src/components/KpiCard.tsx
+++ b/apps/cobranza/src/components/KpiCard.tsx
@@ -2,10 +2,10 @@ import type { ReactNode } from 'react'
export default function KpiCard({ titulo, valor, detalle }: { titulo: string; valor: ReactNode; detalle?: string }) {
return (
-
-
{titulo}
-
{valor}
- {detalle &&
{detalle}
}
+
+
{titulo}
+
{valor}
+ {detalle &&
{detalle}
}
)
}
diff --git a/apps/cobranza/src/components/Layout.tsx b/apps/cobranza/src/components/Layout.tsx
index 45084db..ad5efd6 100644
--- a/apps/cobranza/src/components/Layout.tsx
+++ b/apps/cobranza/src/components/Layout.tsx
@@ -3,36 +3,37 @@ import { Link } from 'react-router-dom'
export default function Layout({ children }: { children: ReactNode }) {
return (
-
-
+
+
-
{children}
+
{children}
)
}
diff --git a/apps/cobranza/src/components/LoginScreen.tsx b/apps/cobranza/src/components/LoginScreen.tsx
index b19fcbb..45b6b22 100644
--- a/apps/cobranza/src/components/LoginScreen.tsx
+++ b/apps/cobranza/src/components/LoginScreen.tsx
@@ -22,11 +22,13 @@ export default function LoginScreen({ onLogin }: { onLogin: (usuario: UsuarioSes
}
return (
-
-
+
+
-
FRASA
-
+
+ FRASA.
+
+
Acceso al ecosistema
@@ -34,7 +36,7 @@ export default function LoginScreen({ onLogin }: { onLogin: (usuario: UsuarioSes
Usuario
@@ -46,13 +48,13 @@ export default function LoginScreen({ onLogin }: { onLogin: (usuario: UsuarioSes
autoComplete="username"
autoFocus
required
- className="w-full border border-neutral-300 px-4 py-3 text-sm focus:border-accent focus:outline-none"
+ className="w-full rounded-lg border border-[#D1D5DB] bg-white px-3 py-2.5 text-sm transition-colors focus:border-accent focus:outline-none focus:ring-2 focus:ring-accent/20"
/>
Contraseña
@@ -63,13 +65,13 @@ export default function LoginScreen({ onLogin }: { onLogin: (usuario: UsuarioSes
onChange={(e) => setPassword(e.target.value)}
autoComplete="current-password"
required
- className="w-full border border-neutral-300 px-4 py-3 text-sm focus:border-accent focus:outline-none"
+ className="w-full rounded-lg border border-[#D1D5DB] bg-white px-3 py-2.5 text-sm transition-colors focus:border-accent focus:outline-none focus:ring-2 focus:ring-accent/20"
/>
{error && (
{error}
@@ -77,7 +79,7 @@ export default function LoginScreen({ onLogin }: { onLogin: (usuario: UsuarioSes
diff --git a/apps/cobranza/src/components/ModalAbono.tsx b/apps/cobranza/src/components/ModalAbono.tsx
index 58f6292..f96bddb 100644
--- a/apps/cobranza/src/components/ModalAbono.tsx
+++ b/apps/cobranza/src/components/ModalAbono.tsx
@@ -25,7 +25,7 @@ interface Props {
onGuardar: (datos: AbonoForm) => void
}
-const claseLabel = 'block text-xs font-bold uppercase tracking-widest text-neutral-500'
+const claseLabel = 'block text-xs font-medium text-[#4B5563]'
/** Modal para registrar un abono (total o parcial) a un pago del plan */
export default function ModalAbono({ pago, onCancelar, onGuardar }: Props) {
@@ -62,13 +62,13 @@ export default function ModalAbono({ pago, onCancelar, onGuardar }: Props) {
role="dialog"
aria-modal="true"
aria-labelledby="titulo-abono"
- className="w-full max-w-md border border-neutral-900 bg-white p-8"
+ className="w-full max-w-md rounded-2xl border border-[#E5E7EB] bg-white p-8 shadow-xl"
>
-
+
Registrar abono — Pago #{pago.numPago}
-
- Restante: {formatoMoneda(restante)}
+
+ Restante: {formatoMoneda(restante)}