/* GestiFalla — Pantallas A: Login, Home, Ficha Fallero */ /* ============================================================ LOGIN ============================================================ */ function LoginScreen({ onLogin }) { const [show, setShow] = useState(false); const [user, setUser] = useState('04821'); const [pass, setPass] = useState('brustengos'); return (
{/* Decorative top stripe block */}
GF
GestiFalla
Acceso fallero
{DATA.falla.nombre}
setUser(e.target.value)} placeholder="N.º de censo" />
setPass(e.target.value)} placeholder="Contraseña" />
¿Olvidaste la contraseña?
Ejercicio {DATA.falla.ejercicio} · Sección {DATA.falla.seccion}
); } /* ============================================================ HOME ============================================================ */ function HomeScreen({ onNav, toast }) { const f = DATA.fallero; const feedColor = { ok: 'var(--gf-green)', info: 'var(--gf-primary)', alert: 'var(--gf-red)' }; const quick = [ { id: 'ficha', t: 'Mi ficha', s: 'Datos falleros', ico: I.id }, { id: 'eventos', t: 'Eventos', s: '5 próximos', ico: I.calendar }, { id: 'familia', t: 'Unidad familiar', s: `${f.miembros} miembros`, ico: I.users }, { id: 'cuotas', t: 'Cuotas', s: 'Al corriente', ico: I.euro }, ]; return (
toast('Sin notificaciones nuevas')} onChat={() => toast('Mensajería')} />
Bon dia,
{f.corto} 👋
{/* Monedero card */} {/* Quick grid 2x2 */}
Accesos rápidos
{quick.map(q => ( ))}
{/* Feed */}
Novedades Ver todo
{DATA.novedades.map((n, k) => (
{n.txt}
{n.time}
))}
); } /* ============================================================ FICHA FALLERO — acordeón 7 bloques ============================================================ */ function AccItem({ item, open, onToggle, onSave }) { const ref = useRef(null); const [h, setH] = useState(0); useEffect(() => { if (ref.current) setH(open ? ref.current.scrollHeight : 0); }, [open, item]); const Icon = item.icon; return (
{item.render(onSave)}
); } function FichaScreen({ onNav, onCarnet, toast }) { const f = DATA.fallero; const [open, setOpen] = useState('datos'); const [obs, setObs] = useState('Disponible para montaje del casal. Alérgico a frutos secos (cena germanor).'); const SaveBtn = () => ( ); const grid = (pairs) =>
{pairs.map((p, i) => )}
; const blocks = [ { id: 'datos', icon: I.user, title: 'Datos personales', preview: `${f.dni} · ${f.telefono}`, render: (save) => (<> {grid([['DNI / NIE', f.dni], ['Nacimiento', f.nacimiento], ['Teléfono', f.telefono], ['Email', f.email]])} ) }, { id: 'uf', icon: I.users, title: 'Unidad familiar', preview: `${f.uf} · ${f.miembros} miembros`, render: () => (<> {grid([['Nombre UF', f.uf], ['Miembros', String(f.miembros)], ['IBAN', f.iban], ['Titular', f.corto]])} ) }, { id: 'dom', icon: I.home2, title: 'Domicilio', preview: `${f.direccion} · ${f.poblacion}`, render: () => (<> {grid([['Dirección', f.direccion], ['Cód. postal', f.cp], ['Población', f.poblacion], ['Provincia', 'València']])} ) }, { id: 'eco', icon: I.euro, title: 'Datos económicos', ro: true, preview: `${f.formaPago} · ${f.cuotaTotal}`, render: () => (<> {grid([['Forma de pago', f.formaPago], ['Cuota total', f.cuotaTotal], ['Estado cuota', 'Al corriente'], ['Próximo cargo', '01/06']])} ) }, { id: 'fall', icon: I.star, title: 'Datos falleros', ro: true, preview: `${f.cargo} · ${f.anios} años`, render: () => (<> {grid([['Cargo', f.cargo], ['Recompensa', f.recompensa], ['Sección', f.seccion], ['Años fallero', String(f.anios)]])} ) }, { id: 'tienda', icon: I.cart, title: 'Tienda', ro: true, preview: `Cuenta: ${f.cuentaTienda}`, render: () => (<> {grid([['Estado cuenta', f.cuentaTienda], ['Pedidos activos', '0'], ['Saldo tienda', '0,00 €'], ['Última compra', '14/05']])} ) }, { id: 'obs', icon: I.note, title: 'Observaciones', preview: obs.slice(0, 38) + '…', render: () => (<>