// vita-track.jsx — Seguimiento (Vita manages pending items), living-ASIS add+changelog, PIC plan const PIC_ICON = { heart: 'heart', sueno: 'moon', actividad: 'pulse', alimentacion: 'food', animo: 'animo' }; const picIcon = (k) => Icon[PIC_ICON[k] || k] || Icon.heart; const SEG_ICON = { cita: 'calendar', examen: 'scan', laboratorio: 'lab', medicamento: 'pill' }; window.SEG_ICON = SEG_ICON; const SEG_META = { cita: { label: 'Cita', icon: 'calendar', done: 'agendado', doneLabel: 'Agendada', action: 'Agéndame esta cita' }, examen: { label: 'Examen', icon: 'scan', done: 'agendado', doneLabel: 'Programado', action: 'Prográmame el examen' }, laboratorio: { label: 'Laboratorio', icon: 'lab', done: 'agendado', doneLabel: 'Programado', action: 'Prográmame el laboratorio' }, medicamento: { label: 'Medicamento', icon: 'pill', done: 'activo', doneLabel: 'Recordatorio activo', action: 'Recuérdame tomarlo' }, }; const estadoMeta = (t, e) => ({ pendiente: { label: 'Pendiente', color: '#E6A93C' }, gestionando: { label: 'Vita gestionando…', color: t.accent }, agendado: { label: 'Agendado', color: t.green }, activo: { label: 'Recordatorio activo', color: t.green }, completado: { label: 'Hecho', color: t.green }, }[e] || { label: e, color: t.muted }); // ── Seguimiento section on home ───────────────────────────────── function SeguimientoSection({ t, persona, items, onOpen }) { if (!items || !items.length) return null; const pend = items.filter(i => i.estado === 'pendiente').length; return (
Vita está pendiente de {pend > 0 && {pend} por gestionar}
{items.map(it => { const meta = SEG_META[it.tipo] || SEG_META.cita; const em = estadoMeta(t, it.estado); return ( ); })}
); } // ── Item action sheet — Vita takes charge ─────────────────────── function SegActionSheet({ t, persona, item, onClose, onAdvance }) { const meta = SEG_META[item.tipo] || SEG_META.cita; const em = estadoMeta(t, item.estado); const isDone = ['agendado', 'activo', 'completado'].includes(item.estado); const gestionando = item.estado === 'gestionando'; return (
{Icon[meta.icon]({ s: 24, c: em.color })}
{meta.label}
{item.titulo}
{item.detalle &&

{item.detalle}

} {/* status timeline */}
{em.label} {isDone && {Icon.check({ s: 18, c: t.green, w: 3 })}}
{isDone ? (
{item.tipo === 'medicamento' ? 'Listo, te recuerdo tomarlo a tiempo y aviso cuando se acabe.' : 'Yo me encargo de coordinarlo con tu EPS y te aviso apenas tenga la fecha. Tú tranquilo.'}
) : ( )}
); } // ── Add information (living ASIS) ─────────────────────────────── const ADD_OPTIONS = [ { key: 'Resultado de laboratorio', icon: 'lab' }, { key: 'Examen o imagen médica', icon: 'scan' }, { key: 'Resumen de visita al médico', icon: 'doc' }, { key: 'Nuevo medicamento', icon: 'pill' }, { key: 'Cómo me he sentido', icon: 'animo' }, ]; function AddInfoSheet({ t, persona, onClose, onAdd }) { const [pick, setPick] = React.useState(null); const accent = persona.accent; return (
Alimenta tu historia

Súbeme algo nuevo y actualizo tu análisis al instante. Entre más me das, mejor te cuido.

{ADD_OPTIONS.map(o => ( ))}
); } // reanalysis overlay function ReanalyzeOverlay({ t, persona, waveStyle, nuevo }) { return (
Actualizando tu ASIS

Estoy leyendo {nuevo} y conectándolo con tu historia…

); } // changelog banner shown on home after an update function ChangelogBanner({ t, persona, cambios, version, onClose }) { if (!cambios || !cambios.length) return null; return (
{Icon.refresh({ s: 17, c: t.onAccent })}
Vita actualizó tu análisis
Versión {version} · ahora mismo
{cambios.map((c, i) => (
{Icon.check({ s: 16, c: persona.accent, w: 3 })} {c}
))}
); } // ── PIC — Programa de Intervención / Plan de cuidado ──────────── function PicActivateCard({ t, persona, ready, onActivate, generating }) { return (
{Icon.shield({ s: 18, c: persona.accent })} Plan de cuidado · PIC
Ya tengo lo mínimo para armar tu plan

Tu ASIS ya me dice por dónde empezar. Déjame construir tu Programa de Intervención para cuidarte y sumar años de vida.

); } function PicSection({ t, persona, pic, onOpen }) { if (!pic) return null; return (
Tu plan de cuidado · PIC

{pic.enfoque}

{(pic.areas || []).map((a, i) => ( ))}
); } function PicSheet({ t, persona, pic, onClose }) { if (!pic) return null; return (
{Icon.shield({ s: 18, c: persona.accent })} Plan de cuidado · PIC
{pic.titulo}

{pic.enfoque}

Áreas de intervención
{(pic.areas || []).map((a, i) => (
{picIcon(a.icono)({ s: 20, c: persona.accent })}
{a.nombre}
{a.meta}
{(a.acciones || []).map((ac, j) => (
{ac}
))}
))}
Metas que vamos a lograr
{(pic.metas || []).map((m, i) => (
{picIcon(m.icono)({ s: 20, c: t.green })} {m.titulo} {m.plazo}
))}
); } // shared bottom sheet shell function Sheet({ t, onClose, children, tall }) { return (
e.stopPropagation()} style={{ width: '100%', maxHeight: tall ? '88%' : '78%', overflow: 'auto', borderRadius: '26px 26px 0 0', background: t.dark ? t.bg1 : '#FFFFFF', border: `1px solid ${t.stroke}`, borderBottom: 'none', padding: '14px 22px 38px', animation: 'vitaSheet .32s cubic-bezier(.2,.8,.2,1) both', }}>
{children}
); } Object.assign(window, { SeguimientoSection, SegActionSheet, AddInfoSheet, ReanalyzeOverlay, ChangelogBanner, PicActivateCard, PicSection, PicSheet, Sheet });