// Portal del Colaborador — mobile-first device showcase
// Renders the same 5 screens inside a phone (375px) and desktop (1280px) frame
const { useState: _po_useState } = React;

// ─── Master data — Andrés Mejía (new hire) ───────────────

const ME = {
  initials: 'AM',
  name: 'Andrés Felipe Mejía',
  firstName: 'Andrés',
  role: 'Operario de Clasificación',
  area: 'Operaciones',
  site: 'Cali',
  hire: '02/05/2026',
  email: 'andres.mejia@atica.co',
  phone: '+57 311 456 7821',
  doc: 'CC 1.087.456.231',
  leader: 'Luis Miguel Marín',
  onboardingPct: 62,
  daysIn: 4,
  vacBalance: { causados: 0, tomados: 0, disponibles: 0 },
};

// ─── Carnet digital ────────────────────────────────────────
// Tarjeta de identificación corporativa con QR de verificación pública.
// El código se valida en el verificador público (cert-verify) compartiendo
// el mismo formato de hash que los certificados laborales.
const CARNET = {
  employeeId:   'AT-2026-0247',
  contractType: 'Término indefinido',
  shift:        'Turno A · 06:00–14:00',
  bloodType:    'O+',
  validFrom:    '02/05/2026',
  validUntil:   '02/05/2027',
  emergency: {
    name:     'María Mejía Restrepo',
    relation: 'Madre',
    phone:    '+57 314 887 5421',
  },
  affiliations: {
    eps: 'Sura',
    arl: 'Sura · Clase III',
    afp: 'Protección',
  },
  verifyCode: 'CARN-2026-AT-0247',
  verifyHash: 'b7e2a91c5d83f614',
  issuedAt:   '02/05/2026 08:14',
};

// Catálogo de campos compartibles · controla qué muestra el enlace público.
// Cada uno mapea a un grupo de datos del CARNET / ME.
const CARNET_FIELDS = [
  { id: 'name',       label: 'Nombre completo',         desc: 'Cómo apareces en el carnet',                  group: 'identidad', defaultOn: true,  locked: true  },
  { id: 'photo',      label: 'Foto / iniciales',        desc: 'Avatar visible en la tarjeta',                group: 'identidad', defaultOn: true,  locked: false },
  { id: 'role',       label: 'Cargo',                   desc: 'Operario de Clasificación',                         group: 'laboral',   defaultOn: true,  locked: false },
  { id: 'area',       label: 'Área',                    desc: 'Operaciones',                                  group: 'laboral',   defaultOn: true,  locked: false },
  { id: 'site',       label: 'Sede',                    desc: 'Cali',                                     group: 'laboral',   defaultOn: true,  locked: false },
  { id: 'hire',       label: 'Fecha de ingreso',        desc: 'Antigüedad en la empresa',                    group: 'laboral',   defaultOn: false, locked: false },
  { id: 'validity',   label: 'Vigencia del carnet',     desc: 'Periodo en que el carnet está activo',        group: 'laboral',   defaultOn: true,  locked: false },
  { id: 'doc',        label: 'Documento de identidad',  desc: 'Cédula completa · dato sensible',             group: 'sensible',  defaultOn: false, locked: false },
  { id: 'employeeId', label: 'Código interno',          desc: CARNET.employeeId,                             group: 'laboral',   defaultOn: false, locked: false },
  { id: 'bloodType',  label: 'Tipo de sangre · RH',     desc: 'Útil en emergencias médicas',                 group: 'salud',     defaultOn: false, locked: false },
  { id: 'affil',      label: 'EPS · ARL · AFP',         desc: 'Afiliaciones de seguridad social',            group: 'salud',     defaultOn: false, locked: false },
  { id: 'emergName',  label: 'Contacto de emergencia',  desc: 'Nombre y parentesco',                         group: 'sensible',  defaultOn: false, locked: false },
  { id: 'emergPhone', label: 'Teléfono de emergencia',  desc: 'Número del contacto',                         group: 'sensible',  defaultOn: false, locked: false },
];

const CARNET_PRESETS = {
  minimo:   { label: 'Mínimo',   desc: 'Solo identidad y vigencia · ideal para verificación rápida',          ids: ['name', 'photo', 'role', 'validity'] },
  estandar: { label: 'Estándar', desc: 'Datos laborales públicos · sin documento ni datos sensibles',          ids: ['name', 'photo', 'role', 'area', 'site', 'hire', 'validity', 'employeeId'] },
  medico:   { label: 'Médico',   desc: 'Datos para emergencias médicas · tipo de sangre y EPS',                ids: ['name', 'photo', 'role', 'site', 'validity', 'bloodType', 'affil', 'emergName', 'emergPhone'] },
  completo: { label: 'Completo', desc: 'Toda la información del carnet · usar con cuidado',                    ids: CARNET_FIELDS.map(f => f.id) },
};

const CARNET_TTL = [
  { id: '1h',   label: '1 hora',    minutes: 60 },
  { id: '24h',  label: '24 horas',  minutes: 60 * 24 },
  { id: '7d',   label: '7 días',    minutes: 60 * 24 * 7 },
  { id: 'perm', label: 'Permanente · mientras siga vigente', minutes: null },
];

// Disponible para el viewer público (HCM Atica Carnet Publico.html)
window.CARNET_DATA = CARNET;
window.CARNET_FIELDS = CARNET_FIELDS;
window.CARNET_OWNER = ME;

// Helper · formato moneda COP
const _po_fmt = (n) => '$' + Math.round(n).toLocaleString('es-CO');

// ─── Mi nómina ─────────────────────────────────────────────

const ME_PAYROLL = {
  lastPayslip: {
    period: 'Abril 2026', daysWorked: 30,
    devengado: 1539584, deducciones: 108333, net: 1431251,
    salaryBase: 1450000, auxTransporte: 200000, horasExtra: 0, bonificaciones: 0,
    aportesSalud: 58000, aportesPension: 58000, retencionFuente: 0, otrasDeduc: 0,
    paymentDate: '30/04/2026', paymentAccount: 'Davivienda · Ahorros · ··· 4587',
    id: 'CMP-P-2026-04-E0247',
    hash: 'a7f3e2c1d9b4',
  },
  ytd: {
    devengado: 6158336,        // ene-abr 2026
    deducciones: 433332,
    neto: 5725004,
    aportesEmployer: 1250000,
    months: 4,
  },
  history: [
    { period: 'Abril 2026',     net: 1431251, devengado: 1539584, deducciones: 108333, daysWorked: 30, paid: '30/04/2026', id: 'CMP-2026-04', state: 'pagado' },
    { period: 'Marzo 2026',     net: 1431251, devengado: 1539584, deducciones: 108333, daysWorked: 30, paid: '31/03/2026', id: 'CMP-2026-03', state: 'pagado' },
    { period: 'Febrero 2026',   net: 1431251, devengado: 1539584, deducciones: 108333, daysWorked: 28, paid: '27/02/2026', id: 'CMP-2026-02', state: 'pagado' },
    { period: 'Enero 2026',     net: 1431251, devengado: 1539584, deducciones: 108333, daysWorked: 30, paid: '30/01/2026', id: 'CMP-2026-01', state: 'pagado' },
    { period: 'Diciembre 2025', net: 2431251, devengado: 2604584, deducciones: 173333, daysWorked: 30, paid: '18/12/2025', id: 'CMP-2025-12', state: 'pagado', note: 'Incluye prima de servicios · 2do semestre' },
    { period: 'Noviembre 2025', net: 1398400, devengado: 1503100, deducciones: 104700, daysWorked: 30, paid: '28/11/2025', id: 'CMP-2025-11', state: 'pagado' },
  ],
  prestaciones: {
    cesantias:        128299,                       // proporcional a 28 días
    intCes:            1283,
    prima:           128299,
    vacacionesDays:   1.17, vacacionesValue: 60000,
    consignacionAt:  '14/02/2027',
  },
  loans: [],
  embargos: [],
  certifications: [
    { id: 'cert-lab',  name: 'Certificación laboral',                  desc: 'Acredita cargo, antigüedad y salario actual',                       updated: '02/05/2026' },
    { id: 'cert-cir',  name: 'Certificación de ingresos y retenciones', desc: 'Año fiscal 2025 · disponible cuando cierre el primer año',          updated: 'Disponible 15/02/2027' , disabled: true },
    { id: 'cert-afi',  name: 'Constancia de afiliaciones',              desc: 'EPS Sura · AFP Protección · Caja Comfamiliar · ARL Sura',          updated: '02/05/2026' },
    { id: 'cert-dis',  name: 'Carta de descuentos voluntarios',         desc: 'Para tu sindicato, fondo de empleados o club deportivo',            updated: 'Solicitable' },
  ],
  affiliations: {
    eps:  { name: 'EPS Sura',         id: '901001234' },
    afp:  { name: 'AFP Protección',    id: 'PRTC-2026-A' },
    arl:  { name: 'ARL Sura',         clase: 'III · 2.436%' },
    caja: { name: 'Comfamiliar Valle del Cauca' },
    cesantiasFund: { name: 'Porvenir' },
  },
};

// ─── Reconocimientos recibidos ─────────────────────────────

const ME_RECOG_RECEIVED = [
  { from: 'Luis Miguel Marín',   initials: 'LM', value: 'Compromiso',         valueTone: 'rose',  message: 'Tu apoyo cubriendo el turno de la noche cuando se presentó la incidencia con la trituradora 2 fue clave para no parar la línea. Eso es Atica.', when: 'hace 3 días', applauds: 12 },
  { from: 'Carlos A. Vélez',      initials: 'CV', value: 'Trabajo en equipo', valueTone: 'blue',  message: 'Andrés es el tipo de compañero que uno quiere tener al lado en cada turno · pregunta, escucha, propone.', when: 'hace 1 semana', applauds: 8 },
];

// ─── Mis solicitudes ───────────────────────────────────────

const ME_REQUESTS_RECENT = [
  { id: 'TO-2026-0142', type: 'Vacaciones',  from: '12/05/2026', to: '23/05/2026', days: 10, state: 'pendiente_jefe', stateLabel: 'Pendiente jefe', tone: 'amber' },
];

// ─── Mi SST ────────────────────────────────────────────────

const ME_SST_DATA = {
  nextExam: { type: 'Examen médico de ingreso', dueDate: '07/05/2026', daysLeft: 2, urgent: true, ips: 'IPS Megacentro · Cali' },
  exams: [
    { type: 'Examen ingreso',    state: 'pendiente', date: 'Por programar',   note: 'Plazo 5 días desde ingreso' },
    { type: 'Audiometría',        state: 'pendiente', date: 'Por programar',   note: 'Riesgo ruido · trimestre 1' },
  ],
  restrictions: [],
  riskFactors: [
    { factor: 'Físico · ruido + calor',    level: 'alto',    mitigations: ['Protector auditivo 25 dB obligatorio', 'Pausas en zona ventilada'] },
    { factor: 'Físico · quemadura térmica', level: 'alto',    mitigations: ['Guantes Kevlar 350°C', 'Procedimiento LOTO antes de intervenir'] },
  ],
  brigadista: false,
  copasstMember: false,
};

const ME_BENEFITS = [
  { name: 'Convenio EPS Sura',        desc: '25% descuento odontología', tone: 'green' },
  { name: 'Comfamiliar Valle del Cauca',    desc: 'Subsidio educativo · cuota monetaria', tone: 'navy' },
  { name: 'Plan de retiro voluntario', desc: 'AFP Protección · APV con beneficio fiscal', tone: 'blue' },
  { name: 'Fondo de empleados',       desc: 'Crédito de libre inversión preferencial', tone: 'amber' },
];

// ─── Cumpleaños y aniversarios del equipo ──────────────────
// Hoy de referencia · jueves 7 de mayo de 2026.
// Ordenados de hoy hacia adelante; los pasados quedan atrás.

const TEAM_BIRTHDAYS = [
  { id: 'b1', name: 'Carolina Restrepo',       initials: 'CR', area: 'Clasificación',         role: 'Operaria de clasificación',  date: '07/05', dateLabel: 'Hoy',         days: 0,  age: 32, tone: 'rose'  },
  { id: 'b2', name: 'Jhon Fredy Ramírez',      initials: 'JR', area: 'Aprovechamiento',         role: 'Auxiliar de aprovechamiento',  date: '09/05', dateLabel: 'En 2 días',   days: 2,  age: 28, tone: 'amber' },
  { id: 'b3', name: 'Sandra Milena Ocampo',    initials: 'SO', area: 'Calidad',         role: 'Catadora QA',          date: '14/05', dateLabel: 'En 7 días',   days: 7,  age: 41, tone: 'blue'  },
  { id: 'b4', name: 'Diego Alejandro Loaiza',  initials: 'DL', area: 'Comercial',       role: 'Ejecutivo Cali',    date: '22/05', dateLabel: 'En 15 días',  days: 15, age: 35, tone: 'navy'  },
  { id: 'b5', name: 'Liliana Patricia Salazar',initials: 'LS', area: 'Talento Humano',  role: 'Generalista RRHH',     date: '28/05', dateLabel: 'En 21 días',  days: 21, age: 47, tone: 'green' },
];

const TEAM_ANNIVERSARIES = [
  { id: 'a1', name: 'Luis Miguel Marín',     initials: 'LM', area: 'Operaciones',     role: 'Líder de planta',         date: '03/05', dateLabel: 'hace 4 días',  days: -4,  years: 10, milestone: true,  tone: 'navy'  },
  { id: 'a2', name: 'Beatriz Elena Cano',    initials: 'BC', area: 'Aprovechamiento',        role: 'Coordinadora aprovechamiento',    date: '11/05', dateLabel: 'En 4 días',    days: 4,   years: 5,  milestone: true,  tone: 'rose'  },
  { id: 'a3', name: 'Mauricio Trejos',       initials: 'MT', area: 'Clasificación',        role: 'Operario senior',         date: '20/05', dateLabel: 'En 13 días',   days: 13,  years: 3,  milestone: false, tone: 'amber' },
  { id: 'a4', name: 'Paula Andrea Henao',    initials: 'PH', area: 'Mantenimiento',  role: 'Técnica electromecánica', date: '24/05', dateLabel: 'En 17 días',   days: 17,  years: 1,  milestone: false, tone: 'blue'  },
];

const URGENT = [
  { id: 'u1', kind: 'docs',     label: 'Tienes 2 documentos pendientes de firma',          due: 'Vence hoy',     action: 'Firmar',      tone: 'rose' },
  { id: 'u2', kind: 'sst',      label: 'Tu examen médico de ingreso vence en 15 días',      due: 'En 15 días',    action: 'Programar',   tone: 'amber' },
  { id: 'u3', kind: 'training', label: 'Capacitación obligatoria BPM sin completar',        due: 'Vence en 9d',   action: 'Iniciar',     tone: 'amber' },
];

const MY_DOCS = [
  { id: 'd-127', type: 'contrato',     name: 'Contrato laboral término indefinido', state: 'pendiente', date: '01/05/2026' },
  { id: 'd-126', type: 'reglamento',   name: 'Reglamento interno de trabajo',       state: 'pendiente', date: '01/05/2026' },
  { id: 'd-128', type: 'autorizacion', name: 'Autorización tratamiento de datos',   state: 'firmado',   date: '02/05/2026' },
  { id: 'd-129', type: 'acuerdo',      name: 'Acuerdo de confidencialidad',         state: 'firmado',   date: '02/05/2026' },
  { id: 'd-130', type: 'cert',         name: 'Certificación laboral · al ingreso',  state: 'descargable', date: '02/05/2026' },
];

const DOC_LABEL = {
  contrato:     'Contrato laboral',
  reglamento:   'Reglamento interno',
  autorizacion: 'Autorización',
  acuerdo:      'Acuerdo confidencialidad',
  cert:         'Certificación',
};

const DOC_STATE_META = {
  pendiente:    { label: 'Pendiente firma',     pill: 'amber-soft', dot: '#854D0E' },
  firmado:      { label: 'Firmado',             pill: 'green',      dot: 'var(--green-600)' },
  descargable:  { label: 'Disponible',          pill: 'navy',       dot: 'var(--navy-800)' },
};

const MY_COURSES_INITIAL = [
  { id: 'c-01', name: 'Manejo seguro de maquinaria de clasificación', cat: 'sst',       progress: 0,    duration: '8 h',  due: '14/05/2026', state: 'pendiente' },
  { id: 'c-02', name: 'Buenas Prácticas de Manufactura (BPM)',  cat: 'normativo', progress: 65,   duration: '4 h',  due: '14/05/2026', state: 'curso' },
  { id: 'c-05', name: 'Reglamento Interno · Reforma 2025',      cat: 'normativo', progress: 100,  duration: '2 h',  due: '—',          state: 'completo', score: 88 },
  { id: 'c-07', name: 'Manipulación de alimentos',              cat: 'sst',       progress: 0,    duration: '3 h',  due: '20/05/2026', state: 'pendiente' },
  { id: 'c-08', name: 'Inducción Atica',                  cat: 'normativo', progress: 100,  duration: '4 h',  due: '—',          state: 'completo', score: 95 },
  // Demo · curso e-learning de tercero (sin evaluación interna · autocertificable)
  { id: 'c-ext-01', name: 'Manejo defensivo y seguridad vial',  cat: 'sst',       progress: 30,   duration: '6 h',  due: '28/05/2026', state: 'curso',     externo: true, plataformaLabel: 'SENA · SOFIA Plus', urlAcceso: 'https://oferta.senasofiaplus.edu.co' },
];

const MY_GEAR = [
  { code: 'UNI-001', name: 'Uniforme operario clasificación',         qty: 2, size: 'L',    received: '02/05/2026' },
  { code: 'UNI-004', name: 'Pantalón industrial drill',         qty: 2, size: '32',   received: '02/05/2026' },
  { code: 'EPP-001', name: 'Guantes térmicos Kevlar 350°C',     qty: 1, size: 'L',    received: '03/05/2026', pending: true },
  { code: 'EPP-002', name: 'Botas dieléctricas con puntera',    qty: 1, size: '41',   received: '03/05/2026' },
  { code: 'EPP-003', name: 'Casco industrial clase E',          qty: 1, size: 'Única',received: '03/05/2026' },
  { code: 'EPP-004', name: 'Protector auditivo copa 25 dB',     qty: 1, size: 'Única',received: '03/05/2026' },
];

const MY_HISTORY = [
  { id: 'TO-2026-X1', type: 'Permiso',    from: 'Por solicitar', to: '—',           state: 'borrador' },
];

// ─── Root ────────────────────────────────────────────────

const Portal = () => {
  const [screen, setScreen]       = _po_useState('home');
  const [signFlow, setSignFlow]   = _po_useState(null); // {step, doc}
  const [vacFlow, setVacFlow]     = _po_useState(null); // {step, type, from, to, days}
  const [carnetOpen, setCarnetOpen] = _po_useState(false);
  const [device, setDevice]       = _po_useState('both'); // both | mobile | desktop

  const goScreen = (s) => { setScreen(s); setSignFlow(null); setVacFlow(null); setCarnetOpen(false); };

  return (
    <div className="main" data-screen-label="Portal">
      <div className="page-head">
        <div>
          <h1 className="page-title">Portal del Colaborador</h1>
          <div className="page-subtitle">
            <b>Vista del empleado</b> — la misma experiencia desde móvil (375px) y escritorio (1280px). Cambia de pantalla con la barra inferior.
          </div>
        </div>
        <div className="po-controls">
          <div className="po-screen-tabs">
            {[
              ['home',     'Inicio'],
              ['payroll',  'Mi nómina'],
              ['docs',     'Documentos'],
              ['courses',  'Capacitaciones'],
              ['desempeno','Mi desempeño'],
              ['profile',  'Mi perfil'],
            ].map(([id, l]) => (
              <button key={id} className={screen === id ? 'active' : ''} onClick={() => goScreen(id)}>{l}</button>
            ))}
          </div>
          <div className="po-device-toggle">
            <button className={device === 'both' ? 'active' : ''}    onClick={() => setDevice('both')}>Ambos</button>
            <button className={device === 'mobile' ? 'active' : ''}  onClick={() => setDevice('mobile')}>Móvil</button>
            <button className={device === 'desktop' ? 'active' : ''} onClick={() => setDevice('desktop')}>Escritorio</button>
          </div>
        </div>
      </div>

      <div className={`po-stage device-${device}`}>
        {device !== 'desktop' && (
          <div className="po-mobile-wrap">
            <div className="po-device-label">iPhone 15 · 375 × 812</div>
            <PhoneFrame
              screen={screen} setScreen={goScreen}
              signFlow={signFlow} setSignFlow={setSignFlow}
              vacFlow={vacFlow} setVacFlow={setVacFlow}
              carnetOpen={carnetOpen} setCarnetOpen={setCarnetOpen}
            />
          </div>
        )}
        {device !== 'mobile' && (
          <div className="po-desktop-wrap">
            <div className="po-device-label">portal.atica.co · 1280 × 800</div>
            <DesktopFrame
              screen={screen} setScreen={goScreen}
              signFlow={signFlow} setSignFlow={setSignFlow}
              vacFlow={vacFlow} setVacFlow={setVacFlow}
              carnetOpen={carnetOpen} setCarnetOpen={setCarnetOpen}
            />
          </div>
        )}
      </div>
    </div>
  );
};

// ─── Phone frame ─────────────────────────────────────────

const PhoneFrame = ({ screen, setScreen, signFlow, setSignFlow, vacFlow, setVacFlow, carnetOpen, setCarnetOpen }) => {
  return (
    <div className="po-phone">
      <div className="po-phone-side po-phone-side-l" />
      <div className="po-phone-side po-phone-side-r" />
      <div className="po-phone-screen">
        <div className="po-status">
          <span className="po-status-time">9:41</span>
          <div className="po-notch" />
          <div className="po-status-icons">
            <svg width="14" height="10" viewBox="0 0 14 10" fill="currentColor"><rect x="0" y="6" width="2" height="4" rx="0.5" /><rect x="3" y="4" width="2" height="6" rx="0.5" /><rect x="6" y="2" width="2" height="8" rx="0.5" /><rect x="9" y="0" width="2" height="10" rx="0.5" /></svg>
            <svg width="14" height="10" viewBox="0 0 18 12" fill="currentColor"><path d="M9 0a8.5 8.5 0 0 0-6 2.5l1.4 1.4A6.5 6.5 0 0 1 9 2c1.7 0 3.4.6 4.6 1.9L15 2.5A8.5 8.5 0 0 0 9 0zm0 4a4.5 4.5 0 0 0-3.2 1.3l1.4 1.4A2.5 2.5 0 0 1 9 6c.7 0 1.3.3 1.8.7l1.4-1.4A4.5 4.5 0 0 0 9 4zm0 4a1.5 1.5 0 0 0-1.1.4L9 9.5l1.1-1.1A1.5 1.5 0 0 0 9 8z" /></svg>
            <div className="po-battery"><div className="po-battery-fill" /></div>
          </div>
        </div>
        <div className="po-phone-body">
          {carnetOpen ? <CarnetView variant="mobile" onClose={() => setCarnetOpen(false)} />
           : signFlow ? <SignFlow flow={signFlow} setFlow={setSignFlow} variant="mobile" />
           : vacFlow ? <VacationFlow flow={vacFlow} setFlow={setVacFlow} variant="mobile" />
           : (
            <>
              {screen === 'home'     && <HomeScreen variant="mobile" goScreen={setScreen} setSignFlow={setSignFlow} setVacFlow={setVacFlow} setCarnetOpen={setCarnetOpen} />}
              {screen === 'payroll'  && <PayrollScreen variant="mobile" />}
              {screen === 'docs'     && <DocsScreen variant="mobile" setSignFlow={setSignFlow} />}
              {screen === 'vacation' && <VacationStart variant="mobile" setVacFlow={setVacFlow} />}
              {screen === 'courses'  && <CoursesScreen variant="mobile" />}
              {screen === 'desempeno'&& window.PerformanceScreen && <PerformanceScreen variant="mobile" />}
              {screen === 'profile'  && <ProfileScreen variant="mobile" goScreen={setScreen} setVacFlow={setVacFlow} setCarnetOpen={setCarnetOpen} />}
            </>
          )}
        </div>
        <div className="po-bottom-nav">
          {[
            ['home',     'Inicio',    'IconHome'],
            ['payroll',  'Nómina',    'IconBarChart'],
            ['docs',     'Docs',      'IconDoc'],
            ['desempeno','Desemp.',   'IconStar'],
            ['profile',  'Perfil',    'IconUsers'],
          ].map(([id, l, icon]) => {
            const I = window[icon];
            return (
              <button key={id} className={screen === id ? 'active' : ''} onClick={() => setScreen(id)}>
                <I size={18} />
                <span>{l}</span>
              </button>
            );
          })}
        </div>
        <div className="po-home-bar" />
      </div>
    </div>
  );
};

// ─── Desktop frame ───────────────────────────────────────

const DesktopFrame = ({ screen, setScreen, signFlow, setSignFlow, vacFlow, setVacFlow, carnetOpen, setCarnetOpen }) => {
  return (
    <div className="po-desktop">
      <div className="po-browser">
        <div className="po-browser-dots">
          <span /><span /><span />
        </div>
        <div className="po-url-bar">
          <svg width="11" height="11" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5"><rect x="4" y="11" width="16" height="10" rx="2" /><path d="M8 11V7a4 4 0 0 1 8 0v4" /></svg>
          <span>portal.atica.co/colaborador</span>
        </div>
        <div className="po-browser-actions">
          <span /><span /><span />
        </div>
      </div>
      <div className="po-desktop-body">
        <aside className="po-desk-sidebar">
          <div className="po-desk-brand">
            <div className="brand-mark" style={{ background: 'transparent', padding: 0 }}><AticaTile size={32} /></div>
            <div>
              <div style={{ fontWeight: 700, fontSize: 13.5, color: 'white' }}>Atica <small style={{ fontSize: 10, color: 'rgba(255,255,255,0.5)' }}>SOMOS</small></div>
              <div style={{ fontSize: 10, color: 'rgba(255,255,255,0.5)' }}>Portal colaborador</div>
            </div>
          </div>
          <nav className="po-desk-nav">
            {[
              ['home',     'Inicio',                       'IconHome'],
              ['payroll',  'Mi nómina',                    'IconBarChart'],
              ['docs',     'Mis documentos',               'IconDoc'],
              ['vacation', 'Solicitudes y vacaciones',     'IconCalendar'],
              ['courses',  'Capacitaciones',               'IconBook'],
              ['desempeno','Mi desempeño',                  'IconStar'],
              ['profile',  'Mi perfil',                    'IconUsers'],
            ].map(([id, l, icon]) => {
              const I = window[icon];
              return (
                <button key={id} className={screen === id ? 'active' : ''} onClick={() => setScreen(id)}>
                  <I size={16} /> {l}
                </button>
              );
            })}
          </nav>
          <div className="po-desk-user">
            <div className="po-avatar">{ME.initials}</div>
            <div style={{ flex: 1, minWidth: 0 }}>
              <div style={{ fontSize: 12, fontWeight: 600, color: 'white' }}>{ME.name}</div>
              <div style={{ fontSize: 10.5, color: 'rgba(255,255,255,0.55)' }}>{ME.role}</div>
            </div>
          </div>
        </aside>
        <main className="po-desk-main">
          {carnetOpen ? <CarnetView variant="desktop" onClose={() => setCarnetOpen(false)} />
           : signFlow ? <SignFlow flow={signFlow} setFlow={setSignFlow} variant="desktop" />
           : vacFlow ? <VacationFlow flow={vacFlow} setFlow={setVacFlow} variant="desktop" />
           : (
            <>
              {screen === 'home'     && <HomeScreen variant="desktop" goScreen={setScreen} setSignFlow={setSignFlow} setVacFlow={setVacFlow} setCarnetOpen={setCarnetOpen} />}
              {screen === 'payroll'  && <PayrollScreen variant="desktop" />}
              {screen === 'docs'     && <DocsScreen variant="desktop" setSignFlow={setSignFlow} />}
              {screen === 'vacation' && <VacationStart variant="desktop" setVacFlow={setVacFlow} />}
              {screen === 'courses'  && <CoursesScreen variant="desktop" />}
              {screen === 'desempeno'&& window.PerformanceScreen && <PerformanceScreen variant="desktop" />}
              {screen === 'profile'  && <ProfileScreen variant="desktop" goScreen={setScreen} setVacFlow={setVacFlow} setCarnetOpen={setCarnetOpen} />}
            </>
          )}
        </main>
      </div>
    </div>
  );
};

// ─── Screen: Home ────────────────────────────────────────

const HomeScreen = ({ variant, goScreen, setSignFlow, setVacFlow, setCarnetOpen }) => {
  const m = variant === 'mobile';
  const [greeted, setGreeted] = _po_useState({}); // { [personId]: true }
  const [openComm, setOpenComm] = _po_useState(null);
  const greet = (id) => setGreeted({ ...greeted, [id]: true });

  // El cumpleañero del día queda destacado aparte de la lista.
  const todayBirthday = TEAM_BIRTHDAYS.find(b => b.days === 0);
  const upcomingBirthdays = TEAM_BIRTHDAYS.filter(b => b.days > 0);
  const upcomingAnnivs    = TEAM_ANNIVERSARIES.filter(a => a.days >= 0).sort((a, b) => a.days - b.days);

  // Comunicaciones publicadas · llegan desde el módulo de comms del admin.
  const allComms = (typeof window !== 'undefined' && window.COMUNICADOS) || [];
  const publishedComms = allComms.filter(c => c.state === 'publicado');

  return (
    <div className={`po-screen po-home ${m ? 'mobile' : 'desktop'}`}>
      <div className="po-greeting">
        <div>
          <div className="muted" style={{ fontSize: m ? 11 : 12 }}>Martes 5 de mayo · 9:41 am</div>
          <h1 className="po-greet-name">Buenos días, {ME.firstName}</h1>
          <div className="muted" style={{ fontSize: m ? 12 : 13, marginTop: 2 }}>{ME.role} · {ME.site}</div>
        </div>
        {!m && <div className="po-bell"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2"><path d="M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9" /><path d="M10.3 21a1.94 1.94 0 0 0 3.4 0" /></svg><span className="po-bell-dot">3</span></div>}
        {m && <div className="po-bell mobile"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2"><path d="M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9" /><path d="M10.3 21a1.94 1.94 0 0 0 3.4 0" /></svg><span className="po-bell-dot">3</span></div>}
      </div>

      {/* Quick actions 2x2 */}
      <div className="po-quick">
        <button className="po-quick-card rose" onClick={() => goScreen('docs')}>
          <span className="po-quick-icon"><IconDoc size={m ? 22 : 24} /></span>
          <span className="po-quick-label">Firmar documento</span>
          <span className="po-quick-badge">2 pendientes</span>
        </button>
        <button className="po-quick-card green" onClick={() => goScreen('payroll')}>
          <span className="po-quick-icon"><IconBarChart size={m ? 22 : 24} /></span>
          <span className="po-quick-label">Mi nómina</span>
          <span className="po-quick-sub">Último: {_po_fmt(ME_PAYROLL.lastPayslip.net)}</span>
        </button>
        <button className="po-quick-card blue" onClick={() => goScreen('vacation')}>
          <span className="po-quick-icon"><IconCalendar size={m ? 22 : 24} /></span>
          <span className="po-quick-label">Solicitar vacaciones</span>
          <span className="po-quick-sub">0 días disponibles</span>
        </button>
        <button className="po-quick-card amber" onClick={() => goScreen('courses')}>
          <span className="po-quick-icon"><IconBook size={m ? 22 : 24} /></span>
          <span className="po-quick-label">Competencias</span>
          <span className="po-quick-sub">2 / 5 completadas</span>
        </button>
      </div>

      {/* Carnet digital · acceso rápido tipo wallet */}
      <button className="po-carnet-strip" onClick={() => setCarnetOpen && setCarnetOpen(true)}>
        <div className="po-carnet-strip-thumb">
          <div className="po-carnet-strip-avatar">{ME.initials}</div>
          <div className="po-carnet-strip-shine" />
        </div>
        <div style={{ flex: 1, minWidth: 0, textAlign: 'left' }}>
          <div className="po-carnet-strip-eyebrow">Carnet digital</div>
          <div className="po-carnet-strip-name">{ME.name}</div>
          <div className="po-carnet-strip-meta mono">{CARNET.employeeId} · vence {CARNET.validUntil}</div>
        </div>
        <div className="po-carnet-strip-cta">
          <IconExternal size={14} />
        </div>
      </button>

      {/* Onboarding progress card */}
      <div className="po-onboard">
        <div className="po-onboard-head">
          <div>
            <div className="muted-xs" style={{ color: 'rgba(255,255,255,0.7)' }}>Tu onboarding</div>
            <div className="po-onboard-title">Día {ME.daysIn} de tu inducción</div>
          </div>
          <div className="po-onboard-pct">{ME.onboardingPct}%</div>
        </div>
        <div className="po-onboard-bar">
          <div className="po-onboard-fill" style={{ width: `${ME.onboardingPct}%` }} />
        </div>
        <div className="po-onboard-next">
          <span style={{ flex: 1 }}>Siguiente paso: <b>Examen médico de ingreso</b></span>
          <button className="po-onboard-cta">Ver plan</button>
        </div>
      </div>

      {/* Urgentes */}
      <div className="po-section">
        <div className="po-section-head">
          <h3>Pendientes urgentes</h3>
          <span className="muted" style={{ fontSize: 11 }}>{URGENT.length} ítems</span>
        </div>
        <div className="po-urgent-list">
          {URGENT.map(u => (
            <div key={u.id} className={`po-urgent po-urgent-${u.tone}`}>
              <span className={`po-urgent-icon po-urgent-icon-${u.tone}`}>
                {u.kind === 'docs' ? <IconDoc size={15} /> : u.kind === 'sst' ? <IconShield size={15} /> : <IconBook size={15} />}
              </span>
              <div style={{ flex: 1, minWidth: 0 }}>
                <div className="po-urgent-text">{u.label}</div>
                <div className={`po-urgent-due po-urgent-due-${u.tone}`}>{u.due}</div>
              </div>
              <button
                className="po-urgent-btn"
                onClick={() => {
                  if (u.kind === 'docs') { goScreen('docs'); }
                  if (u.kind === 'training') { goScreen('courses'); }
                }}
              >
                {u.action}
              </button>
            </div>
          ))}
        </div>
      </div>

      {/* Comunicaciones · feed publicado por RRHH */}
      {publishedComms.length > 0 && (
        <div className="po-section">
          <div className="po-section-head">
            <h3>Comunicaciones</h3>
            <span className="muted" style={{ fontSize: 11 }}>{publishedComms.length} publicadas</span>
          </div>
          <div className="po-comm-list">
            {publishedComms.slice(0, m ? 2 : 3).map(c => (
              <button key={c.id} className="po-comm-card" onClick={() => setOpenComm(c)}>
                <div className="po-comm-avatar">{c.initials}</div>
                <div style={{ flex: 1, minWidth: 0, textAlign: 'left' }}>
                  <div className="po-comm-meta">
                    <span className="po-comm-author">{c.author}</span>
                    <span className="po-comm-dot">·</span>
                    <span className="po-comm-when">{c.publishedAt}</span>
                  </div>
                  <div className="po-comm-title">{c.title}</div>
                  <div className="po-comm-summary">{c.summary}</div>
                  <div className="po-comm-foot">
                    <span className={`po-comm-aud ${c.audienceTone || 'navy'}`}>{c.audience}</span>
                    <span className="po-comm-read"><IconExternal size={11} /> Leer</span>
                  </div>
                </div>
              </button>
            ))}
          </div>
        </div>
      )}

      {/* Celebraciones · cumpleaños y aniversarios del equipo */}
      <div className="po-section">
        <div className="po-section-head">
          <h3>Celebraciones del equipo</h3>
          <span className="muted" style={{ fontSize: 11 }}>Mayo 2026</span>
        </div>

        {todayBirthday && (
          <div className="po-celeb-hero">
            <div className="po-celeb-hero-pattern" />
            <div className="po-celeb-hero-icon">
              <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
                <path d="M20 17H4v-5a4 4 0 0 1 4-4h8a4 4 0 0 1 4 4v5z"/>
                <path d="M2 21h20"/>
                <path d="M9 8V4M12 8V3M15 8V4"/>
                <path d="M4 12c2 1.5 4 1.5 6 0s4-1.5 6 0 4 1.5 4 0"/>
              </svg>
            </div>
            <div style={{ flex: 1, minWidth: 0 }}>
              <div className="po-celeb-hero-eyebrow">Hoy cumple años</div>
              <div className="po-celeb-hero-name">{todayBirthday.name}</div>
              <div className="po-celeb-hero-meta">{todayBirthday.role} · {todayBirthday.area} · cumple {todayBirthday.age}</div>
            </div>
            <button
              className={`po-celeb-greet ${greeted[todayBirthday.id] ? 'done' : ''}`}
              onClick={() => greet(todayBirthday.id)}
              disabled={greeted[todayBirthday.id]}
            >
              {greeted[todayBirthday.id]
                ? <><IconCheck size={12} /> Felicitado</>
                : <>Felicitar</>
              }
            </button>
          </div>
        )}

        <div className={`po-celeb-grid ${m ? 'mobile' : 'desktop'}`}>
          <div className="po-celeb-col">
            <div className="po-celeb-col-head">
              <div className="po-celeb-col-title">Cumpleaños</div>
              <span className="muted" style={{ fontSize: 10.5 }}>{upcomingBirthdays.length} próximos</span>
            </div>
            {upcomingBirthdays.slice(0, m ? 3 : 4).map(b => (
              <div key={b.id} className="po-celeb-row">
                <div className={`po-celeb-avatar po-celeb-avatar-${b.tone}`}>{b.initials}</div>
                <div style={{ flex: 1, minWidth: 0 }}>
                  <div className="po-celeb-name">{b.name}</div>
                  <div className="po-celeb-meta">{b.area} · cumple {b.age}</div>
                </div>
                <div className="po-celeb-when">
                  <div className="po-celeb-date mono">{b.date}</div>
                  <div className="po-celeb-when-pill">{b.dateLabel}</div>
                </div>
                <button
                  className={`po-celeb-greet sm ${greeted[b.id] ? 'done' : ''}`}
                  onClick={() => greet(b.id)}
                  disabled={greeted[b.id]}
                  title={greeted[b.id] ? 'Felicitación enviada' : 'Felicitar'}
                >
                  {greeted[b.id] ? <IconCheck size={12} /> : <IconStar size={12} />}
                </button>
              </div>
            ))}
          </div>

          <div className="po-celeb-col">
            <div className="po-celeb-col-head">
              <div className="po-celeb-col-title">Aniversarios laborales</div>
              <span className="muted" style={{ fontSize: 10.5 }}>{upcomingAnnivs.length} este mes</span>
            </div>
            {upcomingAnnivs.slice(0, m ? 3 : 4).map(a => (
              <div key={a.id} className={`po-celeb-row ${a.milestone ? 'milestone' : ''}`}>
                <div className={`po-celeb-avatar po-celeb-avatar-${a.tone}`}>
                  {a.initials}
                  {a.milestone && <span className="po-celeb-milestone-dot" />}
                </div>
                <div style={{ flex: 1, minWidth: 0 }}>
                  <div className="po-celeb-name">{a.name}</div>
                  <div className="po-celeb-meta">{a.role}</div>
                </div>
                <div className="po-celeb-when">
                  <div className={`po-celeb-years ${a.milestone ? 'milestone' : ''}`}>{a.years}<span>{a.years === 1 ? 'año' : 'años'}</span></div>
                  <div className="po-celeb-when-pill">{a.dateLabel}</div>
                </div>
                <button
                  className={`po-celeb-greet sm ${greeted[a.id] ? 'done' : ''}`}
                  onClick={() => greet(a.id)}
                  disabled={greeted[a.id]}
                  title={greeted[a.id] ? 'Mensaje enviado' : 'Felicitar'}
                >
                  {greeted[a.id] ? <IconCheck size={12} /> : <IconStar size={12} />}
                </button>
              </div>
            ))}
          </div>
        </div>
      </div>

      {/* Reconocimientos recibidos */}
      <div className="po-section">
        <div className="po-section-head">
          <h3>Reconocimientos para ti</h3>
          <span className="muted" style={{ fontSize: 11 }}>{ME_RECOG_RECEIVED.length} esta semana</span>
        </div>
        <div className="po-recog-list">
          {ME_RECOG_RECEIVED.slice(0, m ? 1 : 2).map((r, i) => (
            <div key={i} className="po-recog">
              <div className="po-recog-from">
                <div className="po-recog-from-avatar">{r.initials}</div>
                <span className={`po-recog-value-pill ${r.valueTone}`}>{r.value}</span>
              </div>
              <div className="po-recog-msg">"{r.message}"</div>
              <div className="po-recog-foot">
                <span className="muted" style={{ fontSize: 11 }}>de <b style={{ color: 'var(--text)' }}>{r.from}</b> · {r.when}</span>
                <span className="po-recog-applauds">👏 {r.applauds}</span>
              </div>
            </div>
          ))}
        </div>
      </div>

      {/* Tu mes en Atica · desktop only */}
      {!m && (
        <div className="po-section">
          <div className="po-section-head">
            <h3>Tu mes en Atica</h3>
            <span className="muted" style={{ fontSize: 11 }}>Mayo 2026</span>
          </div>
          <div className="po-month-grid">
            <div className="po-month-card green">
              <div className="po-month-icon"><IconBarChart size={16} /></div>
              <div className="po-month-num">{_po_fmt(ME_PAYROLL.lastPayslip.net)}</div>
              <div className="po-month-lbl">Tu último pago</div>
              <div className="muted" style={{ fontSize: 10.5 }}>pagado el {ME_PAYROLL.lastPayslip.paymentDate}</div>
            </div>
            <div className="po-month-card amber">
              <div className="po-month-icon"><IconBook size={16} /></div>
              <div className="po-month-num">62%</div>
              <div className="po-month-lbl">Plan formativo</div>
              <div className="muted" style={{ fontSize: 10.5 }}>2 cursos · uno en curso</div>
            </div>
            <div className="po-month-card rose">
              <div className="po-month-icon"><IconStar size={16} /></div>
              <div className="po-month-num">2</div>
              <div className="po-month-lbl">Reconocimientos recibidos</div>
              <div className="muted" style={{ fontSize: 10.5 }}>20 aplausos en total</div>
            </div>
            <div className="po-month-card blue">
              <div className="po-month-icon"><IconShield size={16} /></div>
              <div className="po-month-num">0</div>
              <div className="po-month-lbl">Incidencias SST</div>
              <div className="muted" style={{ fontSize: 10.5 }}>todas las semanas seguras</div>
            </div>
          </div>
        </div>
      )}

      {/* Tu día (desktop only) */}
      {!m && (
        <div className="po-section">
          <div className="po-section-head">
            <h3>Hoy en tu jornada</h3>
            <span className="muted" style={{ fontSize: 11 }}>martes 5 de mayo</span>
          </div>
          <div className="po-day-stats">
            <div className="po-day-stat">
              <div className="po-day-stat-num">06:00</div>
              <div className="muted" style={{ fontSize: 11.5 }}>Tu turno comienza</div>
            </div>
            <div className="po-day-stat">
              <div className="po-day-stat-num">2 / 5</div>
              <div className="muted" style={{ fontSize: 11.5 }}>Cursos completados</div>
            </div>
            <div className="po-day-stat">
              <div className="po-day-stat-num">5</div>
              <div className="muted" style={{ fontSize: 11.5 }}>Documentos en tu ficha</div>
            </div>
            <div className="po-day-stat">
              <div className="po-day-stat-num">100%</div>
              <div className="muted" style={{ fontSize: 11.5 }}>Dotación recibida</div>
            </div>
          </div>
        </div>
      )}

      {openComm && <ComunicadoReader comm={openComm} onClose={() => setOpenComm(null)} />}
    </div>
  );
};

// ─── Modal: Lector de comunicado ─────────────────────────

const ComunicadoReader = ({ comm, onClose }) => {
  React.useEffect(() => {
    document.body.style.overflow = 'hidden';
    const onEsc = (e) => { if (e.key === 'Escape') onClose(); };
    window.addEventListener('keydown', onEsc);
    return () => { document.body.style.overflow = ''; window.removeEventListener('keydown', onEsc); };
  }, []);

  return (
    <div className="modal-overlay" onMouseDown={e => { if (e.target === e.currentTarget) onClose(); }}>
      <div className="modal" style={{ maxWidth: 620 }}>
        <div className="modal-head">
          <div style={{ flex: 1, minWidth: 0 }}>
            <div className="muted mono" style={{ fontSize: 11 }}>{comm.id} · publicado {comm.publishedAt}</div>
            <div className="modal-title">{comm.title}</div>
            <div className="modal-sub">
              De <b style={{ color: 'var(--text)' }}>{comm.author}</b> · {comm.authorRole}
            </div>
          </div>
          <button className="icon-btn" onClick={onClose}><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round"><path d="M18 6 6 18M6 6l12 12" /></svg></button>
        </div>

        <div className="modal-body">
          <div style={{ display: 'flex', gap: 8, alignItems: 'center', marginBottom: 12 }}>
            <span className={`po-comm-aud ${comm.audienceTone || 'navy'}`}>{comm.audience}</span>
            <span className="muted" style={{ fontSize: 11 }}>·</span>
            <span className="muted" style={{ fontSize: 11 }}>{comm.seen}/{comm.total} confirmaron lectura</span>
          </div>
          <div style={{ fontSize: 13, lineHeight: 1.65, color: 'var(--text)' }}>
            {comm.body || comm.summary}
          </div>
        </div>

        <div className="modal-foot">
          <span className="muted" style={{ fontSize: 11.5, alignSelf: 'center' }}>
            <IconCheck size={12} /> Lectura registrada en bitácora
          </span>
          <div style={{ flex: 1 }} />
          <button className="btn primary" onClick={onClose}>Entendido</button>
        </div>
      </div>
    </div>
  );
};

// ─── Screen: Docs ────────────────────────────────────────

const DocsScreen = ({ variant, setSignFlow }) => {
  const m = variant === 'mobile';
  const pendingCount = MY_DOCS.filter(d => d.state === 'pendiente').length;
  return (
    <div className={`po-screen ${m ? 'mobile' : 'desktop'}`}>
      <div className="po-screen-head">
        <h2>Mis documentos</h2>
        <span className="muted" style={{ fontSize: 11.5 }}>{MY_DOCS.length} documentos en tu ficha</span>
      </div>

      {/* Mini stats */}
      <div className="po-doc-stats">
        <div className="po-doc-stat rose">
          <div className="po-doc-stat-num">{pendingCount}</div>
          <div className="po-doc-stat-lbl">Pendientes de firma</div>
        </div>
        <div className="po-doc-stat green">
          <div className="po-doc-stat-num">{MY_DOCS.filter(d => d.state === 'firmado').length}</div>
          <div className="po-doc-stat-lbl">Firmados</div>
        </div>
        <div className="po-doc-stat navy">
          <div className="po-doc-stat-num">{MY_DOCS.filter(d => d.state === 'descargable').length}</div>
          <div className="po-doc-stat-lbl">Disponibles</div>
        </div>
      </div>

      <div className="po-doc-list">
        {MY_DOCS.map(d => {
          const s = DOC_STATE_META[d.state];
          return (
            <button
              key={d.id}
              className={`po-doc-row ${d.state === 'pendiente' ? 'pendiente' : ''}`}
              onClick={() => d.state === 'pendiente' && setSignFlow({ step: 1, doc: d })}
            >
              <span className="po-doc-icon"><IconDoc size={m ? 16 : 18} /></span>
              <div style={{ flex: 1, minWidth: 0, textAlign: 'left' }}>
                <div className="po-doc-name">{d.name}</div>
                <div className="muted mono" style={{ fontSize: 10.5, marginTop: 2 }}>{d.id} · {DOC_LABEL[d.type]}</div>
              </div>
              <div style={{ textAlign: 'right' }}>
                <span className={`pill ${s.pill}`} style={{ fontSize: 10 }}>
                  <span className="status-dot" style={{ background: s.dot }} /> {s.label}
                </span>
                <div className="muted mono" style={{ fontSize: 10, marginTop: 4 }}>{d.date}</div>
              </div>
            </button>
          );
        })}
      </div>
    </div>
  );
};

// ─── Sub-flow: Sign ──────────────────────────────────────

const SignFlow = ({ flow, setFlow, variant }) => {
  const m = variant === 'mobile';
  const { step, doc } = flow;
  const [scrollPct, setScrollPct] = _po_useState(0);
  const [accepted, setAccepted] = _po_useState(false);

  const back = () => setFlow(null);

  const onScroll = (e) => {
    const el = e.currentTarget;
    const max = el.scrollHeight - el.clientHeight;
    const p = max <= 0 ? 100 : Math.min(100, Math.round((el.scrollTop / max) * 100));
    setScrollPct(p);
  };

  return (
    <div className={`po-screen po-sign ${m ? 'mobile' : 'desktop'}`}>
      <button className="po-sign-back" onClick={back}>
        <IconChevronLeft size={14} /> Volver a documentos
      </button>

      <div className="po-sign-progress-bar">
        {[1, 2, 3, 4].map(i => (
          <div key={i} className={`po-sign-step ${i <= step ? 'on' : ''} ${i === step ? 'current' : ''}`}>
            {i}
          </div>
        ))}
      </div>

      {step === 1 && (
        <>
          <div className="po-sign-doc-head">
            <span className="po-doc-icon" style={{ background: 'var(--navy-50)', color: 'var(--navy-800)' }}><IconDoc size={18} /></span>
            <div style={{ flex: 1, minWidth: 0 }}>
              <div style={{ fontSize: m ? 13.5 : 15, fontWeight: 700 }}>{doc.name}</div>
              <div className="muted mono" style={{ fontSize: 11, marginTop: 2 }}>{doc.id} · {doc.date}</div>
            </div>
          </div>
          <div className="po-sign-scroll-meta">
            <span className="muted" style={{ fontSize: 11 }}>Lectura {scrollPct}%</span>
            <div className="po-sign-scroll-bar"><div className="po-sign-scroll-fill" style={{ width: `${scrollPct}%` }} /></div>
          </div>
          <div className="po-sign-pdf" onScroll={onScroll}>
            <div className="po-sign-pdf-page">
              <h3 style={{ textAlign: 'center', fontSize: 12, textTransform: 'uppercase', letterSpacing: 0.4, marginBottom: 14 }}>Contrato individual de trabajo</h3>
              <p style={{ fontSize: 11, lineHeight: 1.6, marginBottom: 8 }}>Entre los suscritos, <b>ATICA S.A.S.</b>, sociedad legalmente constituida con NIT 900.123.456-7, en adelante <i>EL EMPLEADOR</i>, y <b>{ME.name}</b>, identificado(a) con cédula de ciudadanía No. {ME.doc.replace('CC ', '')}, en adelante <i>EL TRABAJADOR</i>, hemos convenido celebrar el presente contrato individual de trabajo a término indefinido…</p>
              <h4 style={{ fontSize: 11, fontWeight: 700, marginTop: 12, color: 'var(--navy-800)' }}>PRIMERA. — Objeto</h4>
              <p style={{ fontSize: 11, lineHeight: 1.6 }}>EL TRABAJADOR se obliga a prestar sus servicios personales en el cargo de <b>{ME.role}</b>, en la sede de <b>{ME.site}</b>, así como a desempeñar todas las funciones inherentes al mismo y a cumplir el reglamento interno de trabajo.</p>
              <h4 style={{ fontSize: 11, fontWeight: 700, marginTop: 12, color: 'var(--navy-800)' }}>SEGUNDA. — Salario</h4>
              <p style={{ fontSize: 11, lineHeight: 1.6 }}>El salario mensual será de UN MILLÓN CUATROCIENTOS CINCUENTA MIL PESOS M/CTE ($1.450.000), pagadero quincenalmente.</p>
              <h4 style={{ fontSize: 11, fontWeight: 700, marginTop: 12, color: 'var(--navy-800)' }}>TERCERA. — Duración</h4>
              <p style={{ fontSize: 11, lineHeight: 1.6 }}>El presente contrato tiene una duración indefinida y comenzará a regir desde el {ME.hire}.</p>
              <h4 style={{ fontSize: 11, fontWeight: 700, marginTop: 12, color: 'var(--navy-800)' }}>CUARTA. — Período de prueba</h4>
              <p style={{ fontSize: 11, lineHeight: 1.6 }}>Las partes pactan un período de prueba de dos (2) meses contados a partir de la fecha de iniciación del contrato.</p>
              <h4 style={{ fontSize: 11, fontWeight: 700, marginTop: 12, color: 'var(--navy-800)' }}>QUINTA. — Jornada laboral</h4>
              <p style={{ fontSize: 11, lineHeight: 1.6 }}>La jornada ordinaria será de cuarenta y ocho (48) horas semanales, distribuidas según necesidades de la operación de clasificación.</p>
              <h4 style={{ fontSize: 11, fontWeight: 700, marginTop: 12, color: 'var(--navy-800)' }}>SEXTA. — Confidencialidad</h4>
              <p style={{ fontSize: 11, lineHeight: 1.6 }}>EL TRABAJADOR se obliga a guardar absoluta reserva sobre la información a la que tenga acceso por razón de su cargo, incluidas las recetas de clasificación, listas de proveedores y datos de clientes.</p>
              <p style={{ fontSize: 11, lineHeight: 1.6, marginTop: 16 }}>En constancia de lo anterior, las partes firman electrónicamente el presente documento.</p>
            </div>
          </div>
          <button
            className="po-sign-cta"
            disabled={scrollPct < 100}
            onClick={() => setFlow({ ...flow, step: 2 })}
          >
            {scrollPct < 100 ? `Sigue desplazándote · ${scrollPct}%` : 'Continuar a la firma'}
          </button>
        </>
      )}

      {step === 2 && (
        <div className="po-sign-confirm">
          <div className="po-sign-confirm-icon"><IconShield size={28} /></div>
          <h3 className="po-sign-confirm-title">Confirma tu lectura</h3>
          <p className="po-sign-confirm-sub">Al aceptar, tu firma electrónica quedará vinculada al documento conforme a la <b>Ley 527 de 1999</b>.</p>
          <label className="po-sign-accept">
            <input type="checkbox" checked={accepted} onChange={(e) => setAccepted(e.target.checked)} />
            <span>He leído y acepto el contenido del <b>{doc.name}</b>. Mi firma electrónica tiene la misma validez legal que mi firma manuscrita.</span>
          </label>
          <button className="po-sign-cta" disabled={!accepted} onClick={() => setFlow({ ...flow, step: 3 })}>
            Continuar
          </button>
        </div>
      )}

      {step === 3 && (
        <div className="po-sign-bio">
          <div className="po-bio-glow">
            <div className="po-bio-icon">
              <svg width="56" height="56" viewBox="0 0 56 56" fill="none" stroke="currentColor" strokeWidth="2">
                <path d="M28 8c-9 0-16 7-16 16v8" />
                <path d="M44 32v-8c0-3-1-5-3-7" />
                <path d="M18 34v-10a10 10 0 0 1 17-7" />
                <path d="M24 40v-16a4 4 0 0 1 8 0v18" />
                <path d="M30 30v14" />
                <path d="M14 38v6" />
                <path d="M42 38v6" />
              </svg>
            </div>
          </div>
          <h3 className="po-sign-confirm-title">Confirma con tu huella</h3>
          <p className="po-sign-confirm-sub">Apoya tu dedo en el sensor para firmar el documento de manera segura.</p>
          <button className="po-sign-cta" onClick={() => setFlow({ ...flow, step: 4 })}>
            Simular firma biométrica
          </button>
          <button className="po-sign-alt">Usar PIN del dispositivo</button>
        </div>
      )}

      {step === 4 && (
        <div className="po-sign-success">
          <div className="po-sign-success-circle"><IconCheck size={28} /></div>
          <h3 className="po-sign-confirm-title" style={{ marginTop: 14 }}>¡Documento firmado!</h3>
          <p className="po-sign-confirm-sub">El <b>{doc.name}</b> quedó firmado y archivado en tu ficha. Recibirás una copia con la evidencia de firma en tu correo personal.</p>
          <div className="po-sign-evidence">
            <div className="po-sign-ev-row"><span className="muted-xs">Firmado el</span><span className="mono">05/05/2026 09:42:18</span></div>
            <div className="po-sign-ev-row"><span className="muted-xs">Documento</span><span className="mono">{doc.id}</span></div>
            <div className="po-sign-ev-row"><span className="muted-xs">Hash</span><span className="mono">a4f2c1…d4b6a9f1</span></div>
          </div>
          <button className="po-sign-cta" onClick={back}>Volver a mis documentos</button>
        </div>
      )}
    </div>
  );
};

// ─── Screen: Vacation start (entry list) ─────────────────

const VacationStart = ({ variant, setVacFlow }) => {
  const m = variant === 'mobile';
  return (
    <div className={`po-screen ${m ? 'mobile' : 'desktop'}`}>
      <div className="po-screen-head">
        <h2>Solicitudes</h2>
        <span className="muted" style={{ fontSize: 11.5 }}>Saldo: <b style={{ color: 'var(--text)' }}>0 días</b> · aún no causas vacaciones</span>
      </div>

      <button className="po-big-cta" onClick={() => setVacFlow({ step: 1 })}>
        <IconPlus size={16} />
        <div>
          <div style={{ fontSize: 14, fontWeight: 700 }}>Nueva solicitud</div>
          <div style={{ fontSize: 11.5, fontWeight: 500, opacity: 0.85, marginTop: 2 }}>Vacaciones, permisos, licencias o incapacidad</div>
        </div>
      </button>

      <div className="po-section" style={{ marginTop: 16 }}>
        <div className="po-section-head">
          <h3>Tu historial</h3>
        </div>
        <div className="po-history-empty">
          <IconCalendar size={28} />
          <div style={{ fontSize: 12.5, fontWeight: 600, marginTop: 8 }}>Aún no has hecho ninguna solicitud</div>
          <div className="muted" style={{ fontSize: 11, marginTop: 4 }}>Cuando solicites un día libre o un permiso aparecerá aquí.</div>
        </div>
      </div>
    </div>
  );
};

// ─── Sub-flow: Vacation request ──────────────────────────

const VacationFlow = ({ flow, setFlow, variant }) => {
  const m = variant === 'mobile';
  const { step } = flow;
  const [type, setType]   = _po_useState(flow.type || 'permiso');
  const [from, setFrom]   = _po_useState(flow.from || null);
  const [to, setTo]       = _po_useState(flow.to || null);
  const [motive, setMotive] = _po_useState('');

  const back = () => setFlow(null);
  const stepBack = () => setFlow({ ...flow, step: Math.max(1, step - 1) });
  const stepNext = () => setFlow({ ...flow, step: step + 1, type, from, to });

  const days = (from && to) ? computeBizDays(from, to) : 0;

  return (
    <div className={`po-screen po-vac ${m ? 'mobile' : 'desktop'}`}>
      <button className="po-sign-back" onClick={back}>
        <IconChevronLeft size={14} /> Cancelar solicitud
      </button>

      <div className="po-sign-progress-bar">
        {[1, 2, 3, 4].map(i => (
          <div key={i} className={`po-sign-step ${i <= step ? 'on' : ''} ${i === step ? 'current' : ''}`}>
            {i}
          </div>
        ))}
      </div>

      {step === 1 && (
        <>
          <h3 className="po-sign-confirm-title">¿Qué quieres solicitar?</h3>
          <div className="po-vac-types">
            {[
              ['vacaciones',  'Vacaciones',  'Días causados que ya tengas disponibles', 'IconStar'],
              ['permiso',     'Permiso',     'Diligencia, cita médica, motivo personal',     'IconClock'],
              ['licencia',    'Licencia',    'No remunerada · estudios · luto · maternidad', 'IconRocket'],
              ['incapacidad', 'Incapacidad', 'Reportada por IPS o médico tratante',           'IconAlert'],
            ].map(([k, l, h, ic]) => {
              const I = window[ic];
              return (
                <button key={k} className={`po-vac-type ${type === k ? `active ${k}` : ''}`} onClick={() => setType(k)}>
                  <span className="po-vac-type-icon"><I size={16} /></span>
                  <div style={{ textAlign: 'left' }}>
                    <div className="po-vac-type-name">{l}</div>
                    <div className="po-vac-type-hint">{h}</div>
                  </div>
                </button>
              );
            })}
          </div>
          <button className="po-sign-cta" onClick={stepNext}>Continuar</button>
        </>
      )}

      {step === 2 && (
        <>
          <h3 className="po-sign-confirm-title">Selecciona las fechas</h3>
          <p className="po-sign-confirm-sub">Toca el día de inicio y luego el día final. Los festivos y fines de semana no se descuentan.</p>
          <PortalCalendar
            from={from} to={to}
            onPick={(d) => {
              if (!from || (from && to)) { setFrom(d); setTo(null); }
              else if (d < from) { setFrom(d); }
              else { setTo(d); }
            }}
          />
          <div className="po-vac-day-pill">
            {from && to
              ? <><span className="po-vac-day-num">{computeBizDays(from, to)}</span> días hábiles · {from}/05 → {to}/05</>
              : from
                ? <span className="muted">Selecciona el día final</span>
                : <span className="muted">Selecciona el primer día</span>
            }
          </div>
          <button className="po-sign-cta" disabled={!from || !to} onClick={stepNext}>Continuar</button>
          <button className="po-sign-alt" onClick={stepBack}>Volver</button>
        </>
      )}

      {step === 3 && (
        <>
          <h3 className="po-sign-confirm-title">Resumen de tu solicitud</h3>
          <div className="po-vac-summary">
            <div className="po-vac-sum-row">
              <span className="muted-xs">Tipo</span>
              <span style={{ fontSize: 13, fontWeight: 700, textTransform: 'capitalize' }}>{type}</span>
            </div>
            <div className="po-vac-sum-row">
              <span className="muted-xs">Período</span>
              <span className="mono" style={{ fontSize: 12.5 }}>{from}/05/2026 → {to}/05/2026</span>
            </div>
            <div className="po-vac-sum-row big">
              <span className="muted-xs">Días hábiles a descontar</span>
              <span className="po-vac-sum-num">{days}</span>
            </div>
            <div className="po-vac-sum-row">
              <span className="muted-xs">Saldo actual</span>
              <span className="mono">{ME.vacBalance.disponibles} días</span>
            </div>
            <div className="po-vac-sum-row">
              <span className="muted-xs">Saldo después</span>
              <span className="mono" style={{ color: type === 'vacaciones' ? 'var(--rose-600)' : 'var(--text)' }}>
                {type === 'vacaciones' ? `${ME.vacBalance.disponibles - days} días` : 'sin cambio'}
              </span>
            </div>
            <div className="po-vac-sum-row">
              <span className="muted-xs">Aprueba</span>
              <span style={{ fontSize: 13 }}>{ME.leader} · jefe directo</span>
            </div>
          </div>
          <textarea
            className="po-vac-motive"
            rows={2}
            value={motive}
            onChange={(e) => setMotive(e.target.value)}
            placeholder="Cuéntanos brevemente el motivo (opcional para permisos cortos)"
          />
          <button className="po-sign-cta" onClick={stepNext}>Enviar solicitud</button>
          <button className="po-sign-alt" onClick={stepBack}>Volver a las fechas</button>
        </>
      )}

      {step === 4 && (
        <div className="po-sign-success">
          <div className="po-sign-success-circle"><IconCheck size={28} /></div>
          <h3 className="po-sign-confirm-title" style={{ marginTop: 14 }}>¡Solicitud enviada!</h3>
          <p className="po-sign-confirm-sub">Tu solicitud quedó registrada. Recibirás una notificación cuando tu jefe directo la apruebe.</p>

          <div className="po-vac-tracking">
            <div className="po-track-step done"><IconCheck size={11} /></div>
            <div className="po-track-line done" />
            <div className="po-track-step active"><IconClock size={11} /></div>
            <div className="po-track-line" />
            <div className="po-track-step"><span>3</span></div>
            <div className="po-track-line" />
            <div className="po-track-step"><span>4</span></div>
          </div>
          <div className="po-vac-tracking-labels">
            <span>Enviada</span>
            <span style={{ color: 'var(--amber-600)', fontWeight: 700 }}>Pendiente jefe</span>
            <span>RRHH</span>
            <span>Aprobada</span>
          </div>

          <div className="po-sign-evidence">
            <div className="po-sign-ev-row"><span className="muted-xs">Solicitud</span><span className="mono">TO-2026-0143</span></div>
            <div className="po-sign-ev-row"><span className="muted-xs">Tipo</span><span style={{ textTransform: 'capitalize' }}>{type}</span></div>
            <div className="po-sign-ev-row"><span className="muted-xs">Días</span><span className="mono">{days}</span></div>
            <div className="po-sign-ev-row"><span className="muted-xs">Aprueba</span><span>{ME.leader}</span></div>
          </div>

          <button className="po-sign-cta" onClick={back}>Volver al inicio</button>
        </div>
      )}
    </div>
  );
};

// ─── Mini calendar picker (May 2026) ─────────────────────

const PortalCalendar = ({ from, to, onPick }) => {
  const daysInMonth = 31;
  const firstWeekday = 4; // Mon=0, Fri=4
  const cells = [];
  for (let i = 0; i < firstWeekday; i++) cells.push(null);
  for (let d = 1; d <= daysInMonth; d++) cells.push(d);
  while (cells.length % 7 !== 0) cells.push(null);
  const HOLIDAYS = [1, 18];

  return (
    <div className="po-cal">
      <div className="po-cal-head">
        <button className="po-cal-nav"><IconChevronLeft size={13} /></button>
        <span style={{ fontWeight: 700, fontSize: 13 }}>Mayo 2026</span>
        <button className="po-cal-nav"><IconChevronRight size={13} /></button>
      </div>
      <div className="po-cal-weekdays">
        {['L','M','M','J','V','S','D'].map((d, i) => <span key={i}>{d}</span>)}
      </div>
      <div className="po-cal-grid">
        {cells.map((d, i) => {
          if (d === null) return <div key={i} className="po-cal-day empty" />;
          const isWeekend = (i % 7) >= 5;
          const isHoliday = HOLIDAYS.includes(d);
          const disabled  = isWeekend || isHoliday;
          const isFrom = from === d;
          const isTo   = to === d;
          const inRange = from && to && d > from && d < to;
          return (
            <button
              key={i}
              className={`po-cal-day ${isWeekend ? 'weekend' : ''} ${isHoliday ? 'holiday' : ''} ${isFrom ? 'pick-from' : ''} ${isTo ? 'pick-to' : ''} ${inRange ? 'in-range' : ''}`}
              onClick={() => !disabled && onPick(d)}
              disabled={disabled}
            >
              {d}
            </button>
          );
        })}
      </div>
    </div>
  );
};

const computeBizDays = (from, to) => {
  if (!from || !to || to < from) return 0;
  const HOLIDAYS = [1, 18];
  let n = 0;
  for (let d = from; d <= to; d++) {
    const dow = (3 + d) % 7; // May 1 2026 = Friday → idx 4 (Mon=0)... let me use 0=Mon, May 1 = Fri = 4
    // Day d → weekday: (firstWeekday + d - 1) % 7 = (4 + d - 1) % 7 = (3 + d) % 7
    if (dow >= 5) continue;
    if (HOLIDAYS.includes(d)) continue;
    n++;
  }
  return n;
};

// ─── Screen: Payroll · Mi nómina ─────────────────────────

const PayrollScreen = ({ variant }) => {
  const m = variant === 'mobile';
  const p = ME_PAYROLL;
  const [yearFilter, setYearFilter] = _po_useState('all');
  const [payslipDetail, setPayslipDetail] = _po_useState(null);
  const filteredHistory = yearFilter === 'all'
    ? p.history
    : p.history.filter(h => h.period.endsWith(yearFilter));
  return (
    <div className={`po-screen po-pay ${m ? 'mobile' : 'desktop'}`}>
      <div className="po-screen-head">
        <h2>Mi nómina</h2>
        <span className="muted" style={{ fontSize: 11.5 }}>Último período liquidado · {p.lastPayslip.period}</span>
      </div>

      {/* Hero · último pago */}
      <div className="po-pay-hero">
        <div className="po-pay-hero-eyebrow">Tu último pago</div>
        <div className="po-pay-hero-amount">{_po_fmt(p.lastPayslip.net)}</div>
        <div className="po-pay-hero-meta">
          <span><IconCalendar size={11} /> Pagado el <b>{p.lastPayslip.paymentDate}</b></span>
        </div>
        <div className="po-pay-hero-account">
          <IconCheck size={11} /> {p.lastPayslip.paymentAccount}
        </div>
        <div className="po-pay-hero-grid">
          <div>
            <div className="muted-xs" style={{ color: 'rgba(255,255,255,0.7)' }}>Total devengado</div>
            <div className="mono" style={{ fontWeight: 800, fontSize: 14 }}>{_po_fmt(p.lastPayslip.devengado)}</div>
          </div>
          <div>
            <div className="muted-xs" style={{ color: 'rgba(255,255,255,0.7)' }}>Deducciones</div>
            <div className="mono" style={{ fontWeight: 800, fontSize: 14 }}>−{_po_fmt(p.lastPayslip.deducciones)}</div>
          </div>
          <div>
            <div className="muted-xs" style={{ color: 'rgba(255,255,255,0.7)' }}>Días trabajados</div>
            <div className="mono" style={{ fontWeight: 800, fontSize: 14 }}>{p.lastPayslip.daysWorked}</div>
          </div>
        </div>
        <button className="po-pay-hero-cta">
          <IconDoc size={14} /> Descargar comprobante PDF
        </button>
      </div>

      {/* Acumulado del año */}
      <div className="po-pay-section">
        <div className="po-section-head"><h3>Acumulado del año 2026</h3></div>
        <div className="po-pay-ytd">
          <div className="po-pay-ytd-cell">
            <div className="muted-xs">Total devengado</div>
            <div className="po-pay-ytd-num">{_po_fmt(p.ytd.devengado)}</div>
          </div>
          <div className="po-pay-ytd-cell">
            <div className="muted-xs">Total deducciones</div>
            <div className="po-pay-ytd-num neg">−{_po_fmt(p.ytd.deducciones)}</div>
          </div>
          <div className="po-pay-ytd-cell hi">
            <div className="muted-xs">Total neto recibido</div>
            <div className="po-pay-ytd-num pos">{_po_fmt(p.ytd.neto)}</div>
          </div>
          <div className="po-pay-ytd-cell">
            <div className="muted-xs">Aportes empleador</div>
            <div className="po-pay-ytd-num">{_po_fmt(p.ytd.aportesEmployer)}</div>
            <div className="muted" style={{ fontSize: 10 }}>informativo · no afecta tu neto</div>
          </div>
        </div>
        <div className="po-pay-info">
          <IconShield size={12} /> El acumulado YTD se actualiza con cada nómina liquidada. Tu certificación de ingresos y retenciones (CIR) se genera al cierre fiscal.
        </div>
      </div>

      {/* Histórico */}
      <div className="po-pay-section">
        <div className="po-section-head">
          <h3>Histórico de pagos</h3>
          <span className="muted" style={{ fontSize: 11 }}>{p.history.length} períodos · todos liquidados</span>
        </div>

        <div className="po-pay-hist-tabs">
          <button className={`po-pay-hist-tab ${yearFilter === 'all' ? 'active' : ''}`} onClick={() => setYearFilter('all')}>Todos</button>
          <button className={`po-pay-hist-tab ${yearFilter === '2026' ? 'active' : ''}`} onClick={() => setYearFilter('2026')}>2026</button>
          <button className={`po-pay-hist-tab ${yearFilter === '2025' ? 'active' : ''}`} onClick={() => setYearFilter('2025')}>2025</button>
          <div style={{ flex: 1 }} />
          <button className="po-pay-hist-bulk" title="Descargar todos los comprobantes">
            <IconDoc size={11} /> Descargar todos
          </button>
        </div>

        <div className="po-pay-hist">
          {filteredHistory.map(h => (
            <button key={h.id} className="po-pay-hist-row clickable" onClick={() => setPayslipDetail(h)}>
              <div className="po-pay-hist-mark"><IconCheck size={12} /></div>
              <div style={{ flex: 1, minWidth: 0, textAlign: 'left' }}>
                <div style={{ fontSize: 13, fontWeight: 700 }}>{h.period}</div>
                <div className="muted mono" style={{ fontSize: 10.5, marginTop: 2 }}>Pagado {h.paid} · {h.id}</div>
                {h.note && <div className="po-pay-hist-note">{h.note}</div>}
              </div>
              <div style={{ textAlign: 'right' }}>
                <div className="po-pay-hist-net mono">{_po_fmt(h.net)}</div>
                <div className="muted" style={{ fontSize: 10, marginTop: 2 }}>{h.daysWorked || 30} días</div>
              </div>
              <span className="po-pay-hist-chev"><IconChevronRight size={14} /></span>
            </button>
          ))}
          {filteredHistory.length === 0 && (
            <div className="muted" style={{ textAlign: 'center', padding: 24, fontSize: 12 }}>Sin pagos en el período seleccionado.</div>
          )}
        </div>
        {!m && (
          <div className="muted" style={{ fontSize: 11.5, marginTop: 10, textAlign: 'center' }}>
            Toca cualquier período para ver el desprendible completo con conceptos, deducciones y el hash de auditoría.
          </div>
        )}
      </div>

      {/* Prestaciones causadas */}
      <div className="po-pay-section">
        <div className="po-section-head">
          <h3>Mis prestaciones acumuladas</h3>
          <span className="muted" style={{ fontSize: 11 }}>al corte {p.lastPayslip.period}</span>
        </div>
        <div className="po-pay-prest">
          <div className="po-pay-prest-card">
            <span className={`po-pay-prest-icon green`}><IconStar size={14} /></span>
            <div style={{ flex: 1 }}>
              <div style={{ fontSize: 12.5, fontWeight: 700 }}>Cesantías</div>
              <div className="muted" style={{ fontSize: 10.5 }}>Se consignan a Porvenir el 14/02/2027</div>
            </div>
            <div className="po-pay-prest-val mono">{_po_fmt(p.prestaciones.cesantias)}</div>
          </div>
          <div className="po-pay-prest-card">
            <span className={`po-pay-prest-icon green`}><IconStar size={14} /></span>
            <div style={{ flex: 1 }}>
              <div style={{ fontSize: 12.5, fontWeight: 700 }}>Intereses cesantías</div>
              <div className="muted" style={{ fontSize: 10.5 }}>12% anual sobre cesantías</div>
            </div>
            <div className="po-pay-prest-val mono">{_po_fmt(p.prestaciones.intCes)}</div>
          </div>
          <div className="po-pay-prest-card">
            <span className={`po-pay-prest-icon amber`}><IconStar size={14} /></span>
            <div style={{ flex: 1 }}>
              <div style={{ fontSize: 12.5, fontWeight: 700 }}>Prima causada</div>
              <div className="muted" style={{ fontSize: 10.5 }}>Primera quincena · 30/06/2026</div>
            </div>
            <div className="po-pay-prest-val mono">{_po_fmt(p.prestaciones.prima)}</div>
          </div>
          <div className="po-pay-prest-card">
            <span className={`po-pay-prest-icon blue`}><IconCalendar size={14} /></span>
            <div style={{ flex: 1 }}>
              <div style={{ fontSize: 12.5, fontWeight: 700 }}>Vacaciones</div>
              <div className="muted" style={{ fontSize: 10.5 }}>{p.prestaciones.vacacionesDays} días causados · disponibles desde 02/05/2027</div>
            </div>
            <div className="po-pay-prest-val mono">{_po_fmt(p.prestaciones.vacacionesValue)}</div>
          </div>
        </div>
      </div>

      {/* Afiliaciones */}
      <div className="po-pay-section">
        <div className="po-section-head"><h3>Mis afiliaciones a seguridad social</h3></div>
        <div className="po-pay-afi">
          <div className="po-pay-afi-row"><span className="muted-xs">EPS</span><span style={{ fontSize: 12.5, fontWeight: 600 }}>{p.affiliations.eps.name}</span><span className="muted mono" style={{ fontSize: 10.5 }}>{p.affiliations.eps.id}</span></div>
          <div className="po-pay-afi-row"><span className="muted-xs">AFP</span><span style={{ fontSize: 12.5, fontWeight: 600 }}>{p.affiliations.afp.name}</span><span className="muted mono" style={{ fontSize: 10.5 }}>{p.affiliations.afp.id}</span></div>
          <div className="po-pay-afi-row"><span className="muted-xs">ARL</span><span style={{ fontSize: 12.5, fontWeight: 600 }}>{p.affiliations.arl.name}</span><span className="muted mono" style={{ fontSize: 10.5 }}>Clase {p.affiliations.arl.clase}</span></div>
          <div className="po-pay-afi-row"><span className="muted-xs">Caja</span><span style={{ fontSize: 12.5, fontWeight: 600 }}>{p.affiliations.caja.name}</span><span /></div>
          <div className="po-pay-afi-row"><span className="muted-xs">Cesantías</span><span style={{ fontSize: 12.5, fontWeight: 600 }}>{p.affiliations.cesantiasFund.name}</span><span /></div>
        </div>
      </div>

      {/* Certificaciones */}
      <div className="po-pay-section">
        <div className="po-section-head">
          <h3>Mis certificaciones disponibles</h3>
          <span className="muted" style={{ fontSize: 11 }}>se generan al instante</span>
        </div>
        <div className="po-pay-certs">
          {p.certifications.map(c => (
            <div key={c.id} className={`po-pay-cert ${c.disabled ? 'disabled' : ''}`}>
              <div className="po-pay-cert-icon"><IconDoc size={15} /></div>
              <div style={{ flex: 1, minWidth: 0 }}>
                <div className="po-pay-cert-name">{c.name}</div>
                <div className="muted" style={{ fontSize: 11, marginTop: 2 }}>{c.desc}</div>
                <div className="muted mono" style={{ fontSize: 10, marginTop: 4 }}>{c.disabled ? c.updated : 'Vigente · al ' + c.updated}</div>
              </div>
              <button className={`po-pay-cert-btn ${c.disabled ? 'disabled' : ''}`} disabled={c.disabled}>
                {c.disabled ? <><IconClock size={12} /> Disponible pronto</> : <><IconExternal size={12} /> Generar</>}
              </button>
            </div>
          ))}
        </div>
      </div>

      {!m && (
        <div className="po-pay-help">
          <IconShield size={14} />
          <div>
            <div style={{ fontWeight: 700, fontSize: 13 }}>¿Algo no cuadra con tu pago?</div>
            <div className="muted" style={{ fontSize: 11.5, marginTop: 3, lineHeight: 1.5 }}>
              Contacta a <b style={{ color: 'var(--text)' }}>Patricia Gómez</b> (Coord. Bienestar) o registra una novedad de nómina desde <b style={{ color: 'var(--text)' }}>Solicitudes</b>. Cualquier ajuste queda registrado en bitácora con tu historial completo.
            </div>
          </div>
          <button className="btn"><IconExternal size={13} /> Reportar novedad</button>
        </div>
      )}

      {payslipDetail && (
        <PayslipDetailModal payslip={payslipDetail} onClose={() => setPayslipDetail(null)} />
      )}
    </div>
  );
};

// ─── Modal: Desprendible de pago ─────────────────────────

const PayslipDetailModal = ({ payslip, onClose }) => {
  const h = payslip;
  // Reconstruimos un breakdown verosímil para el período (los entries antiguos solo traen totales).
  const salaryBase = 1450000;
  const auxTransporte = h.devengado >= 1500000 ? 200000 : 162000;
  const incluyePrima = (h.note || '').toLowerCase().includes('prima');
  const prima = incluyePrima ? Math.max(0, h.devengado - salaryBase - auxTransporte) : 0;

  const aportesSalud = Math.round(salaryBase * 0.04);
  const aportesPension = Math.round(salaryBase * 0.04);
  const otrasDeduc = Math.max(0, h.deducciones - aportesSalud - aportesPension);

  React.useEffect(() => {
    document.body.style.overflow = 'hidden';
    const onEsc = (e) => { if (e.key === 'Escape') onClose(); };
    window.addEventListener('keydown', onEsc);
    return () => { document.body.style.overflow = ''; window.removeEventListener('keydown', onEsc); };
  }, []);

  return (
    <div className="modal-overlay" onMouseDown={e => { if (e.target === e.currentTarget) onClose(); }}>
      <div className="modal po-pay-modal" style={{ maxWidth: 540 }}>
        <div className="modal-head">
          <div>
            <div className="muted mono" style={{ fontSize: 11 }}>Desprendible · {h.id}</div>
            <div className="modal-title">{h.period}</div>
            <div className="modal-sub">Pagado el {h.paid} · {h.daysWorked || 30} días trabajados</div>
          </div>
          <button className="icon-btn" onClick={onClose}><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round"><path d="M18 6 6 18M6 6l12 12" /></svg></button>
        </div>

        <div className="modal-body" style={{ display: 'flex', flexDirection: 'column', gap: 14 }}>
          <div className="po-pay-mod-card">
            <div className="po-pay-mod-eye">Devengado</div>
            <div className="po-pay-mod-row"><span>Salario base</span><span className="mono">{_po_fmt(salaryBase)}</span></div>
            <div className="po-pay-mod-row"><span>Auxilio de transporte</span><span className="mono">{_po_fmt(auxTransporte)}</span></div>
            {prima > 0 && <div className="po-pay-mod-row"><span>Prima de servicios</span><span className="mono">{_po_fmt(prima)}</span></div>}
            <div className="po-pay-mod-row total"><span>Total devengado</span><span className="mono">{_po_fmt(h.devengado)}</span></div>
          </div>

          <div className="po-pay-mod-card">
            <div className="po-pay-mod-eye">Deducciones</div>
            <div className="po-pay-mod-row"><span>Aporte salud · 4%</span><span className="mono neg">−{_po_fmt(aportesSalud)}</span></div>
            <div className="po-pay-mod-row"><span>Aporte pensión · 4%</span><span className="mono neg">−{_po_fmt(aportesPension)}</span></div>
            {otrasDeduc > 0 && <div className="po-pay-mod-row"><span>Otras deducciones</span><span className="mono neg">−{_po_fmt(otrasDeduc)}</span></div>}
            <div className="po-pay-mod-row total"><span>Total deducciones</span><span className="mono neg">−{_po_fmt(h.deducciones)}</span></div>
          </div>

          <div className="po-pay-mod-net">
            <div>
              <div className="po-pay-mod-eye light">Neto pagado</div>
              <div className="po-pay-mod-net-amount mono">{_po_fmt(h.net)}</div>
            </div>
            <div className="po-pay-mod-net-account">
              <IconCheck size={11} /> Davivienda · Ahorros · ··· 4587
            </div>
          </div>

          <div className="po-pay-mod-meta">
            <div><span className="muted-xs">Comprobante</span><span className="mono">{h.id}</span></div>
            <div><span className="muted-xs">Hash auditoría</span><span className="mono">a7f3e2c1…d9b4</span></div>
            <div><span className="muted-xs">Estado</span><span style={{ color: 'var(--green-600)', fontWeight: 700, fontSize: 12 }}>Liquidado</span></div>
          </div>
        </div>

        <div className="modal-foot">
          <span className="muted" style={{ fontSize: 11.5, alignSelf: 'center' }}>
            <IconShield size={12} /> Documento con valor probatorio · Ley 527/1999
          </span>
          <div style={{ flex: 1 }} />
          <button className="btn" onClick={onClose}>Cerrar</button>
          <button className="btn primary"><IconDoc size={13} /> Descargar PDF</button>
        </div>
      </div>
    </div>
  );
};

// ─── Screen: Courses ─────────────────────────────────────

const CoursesScreen = ({ variant }) => {
  const m = variant === 'mobile';
  const [courses, setCourses] = _po_useState(() => [...MY_COURSES_INITIAL]);
  const [autocertFor, setAutocertFor] = _po_useState(null);
  const completos = courses.filter(c => c.state === 'completo').length;

  const onAutocertCompleted = (curso, certData) => {
    // Marcar curso como completo
    setCourses(courses.map(c => c.id === curso.id
      ? { ...c, state: 'completo', score: certData.score, progress: 100, certCode: certData.code, autocertificado: true }
      : c));

    // Empujar certificado interno al store global · Atica certifica el completado externo
    const cert = {
      code: certData.code,
      status: 'vigente',
      origen: 'externo-autocertificado',
      emp: { initials: ME.initials, name: ME.name, doc: ME.doc, cargo: ME.role, area: ME.area, site: ME.site },
      empresa: { name: 'Atica S.A.S.', nit: '900.123.456-7', logo: 'a' },
      plataforma: { name: 'Atica SOMOS', logo: 'a' },
      course: { name: curso.name, code: curso.id, duration: curso.duration, mode: 'E-learning externo' },
      competencia: { id: '—', name: curso.name, norma: 'Auto-certificación · Atica SOMOS' },
      session: { id: `SES-AUTO-${Date.now().toString().slice(-6)}`, date: certData.fechaFinalizacion, site: curso.plataformaLabel || 'Plataforma externa', instructor: 'Plataforma del proveedor', instructorOrg: curso.plataformaLabel || 'Proveedor externo', contentVersion: 'externo' },
      result: { score: certData.score, minScore: 70, passed: true, issuedAt: new Date().toLocaleString('es-CO') },
      vigencia: { from: certData.fechaFinalizacion, to: certData.vigenciaTo, daysLeft: 365 },
      evidence: {
        attendanceSigned: true,
        attendanceMethod: 'Auto-certificación firmada por el colaborador (Ley 527/1999)',
        evaluationApplied: true,
        evaluationQuestions: null,
        evidencesCount: certData.archivoEvidencia ? 1 : 0,
        evidencesList: certData.archivoEvidencia ? [certData.archivoEvidencia] : [],
        contentVersionLocked: 'externo',
      },
      hash: `auto-${Date.now().toString(16)}${Math.random().toString(16).slice(2, 10)}`,
      bitacoraEvents: [
        { when: new Date().toLocaleString('es-CO'), text: 'Certificado emitido por Atica con base en autocertificación', tone: 'green' },
        { when: new Date().toLocaleString('es-CO'), text: `Colaborador declara completado en ${curso.plataformaLabel || 'plataforma externa'} · score ${certData.score}/100`, tone: 'green' },
        ...(certData.archivoEvidencia ? [{ when: new Date().toLocaleString('es-CO'), text: `Evidencia adjunta: ${certData.archivoEvidencia}`, tone: 'navy' }] : []),
      ],
    };
    window.CERTIFICATES = [...(window.CERTIFICATES || []), cert];
    setAutocertFor(null);
  };

  return (
    <div className={`po-screen ${m ? 'mobile' : 'desktop'}`}>
      <div className="po-screen-head">
        <h2>Mis capacitaciones</h2>
        <span className="muted" style={{ fontSize: 11.5 }}>Plan formativo Atica · ICONTEC ready</span>
      </div>

      {/* Banner ICONTEC + cumplimiento */}
      <div className="po-comp-banner">
        <div className="po-comp-banner-icon"><IconShield size={16} /></div>
        <div style={{ flex: 1, minWidth: 0 }}>
          <div className="po-comp-banner-title">Tu cumplimiento auditable</div>
          <div className="muted" style={{ fontSize: 11, marginTop: 2, lineHeight: 1.4 }}>Certificados con hash + asistencia firmada · listo para ICONTEC</div>
        </div>
        <div className="po-comp-banner-pct">
          <div className="mono" style={{ fontSize: 22, fontWeight: 800 }}>{Math.round((completos / courses.length) * 100)}%</div>
          <div className="muted" style={{ fontSize: 10 }}>{completos}/{courses.length}</div>
        </div>
      </div>

      <div className="po-course-summary">
        <div className="tr-prog-track" style={{ height: 8 }}>
          <div className="tr-prog-fill green" style={{ width: `${(completos / courses.length) * 100}%` }} />
        </div>
        <div style={{ marginTop: 6, display: 'flex', justifyContent: 'space-between', fontSize: 11.5 }}>
          <span className="muted">{completos}/{courses.length} cursos · siguiente vence en 9 días</span>
          <b className="mono" style={{ color: 'var(--green-600)' }}>{Math.round((completos / courses.length) * 100)}%</b>
        </div>
      </div>

      <div className="po-course-list">
        {courses.map(c => {
          const tone = c.state === 'completo' ? 'green' : c.state === 'curso' ? 'amber' : 'rose';
          // Cruce con window.COURSES para detectar curso e-learning externo (Fase E.3)
          const cursoCatalogo = (window.COURSES || []).find(x => x.id === c.id);
          const esExterno = c.externo || cursoCatalogo?.mode === 'elearning-externo';
          const plataformaLabel = c.plataformaLabel || (esExterno && cursoCatalogo?.plataforma
            ? (typeof PLATAFORMAS_ELEARNING !== 'undefined' && PLATAFORMAS_ELEARNING.find(p => p.id === cursoCatalogo.plataforma)?.label) || cursoCatalogo.plataforma
            : null);
          const urlAcceso = c.urlAcceso || cursoCatalogo?.urlAcceso;
          return (
            <div key={c.id} className={`po-course-card po-course-${tone}`}>
              <div className="po-course-head">
                <span className={`po-course-cat ${c.cat === 'sst' ? 'rose' : 'navy'}`}>{c.cat === 'sst' ? 'SST' : 'Normativo'}</span>
                <span className="muted mono" style={{ fontSize: 10.5 }}>{c.duration}</span>
              </div>
              <div className="po-course-name">{c.name}</div>
              {esExterno && (
                <div className="muted" style={{ fontSize: 10.5, marginTop: 4 }}>
                  <IconExternal size={9} /> Plataforma externa · {plataformaLabel || 'proveedor'}
                </div>
              )}
              {c.autocertificado && c.state === 'completo' && (
                <div style={{ fontSize: 10.5, marginTop: 4, color: 'var(--green-600)', fontWeight: 600 }}>
                  ✓ Auto-certificado por ti · Atica emitió el certificado
                </div>
              )}
              {c.state !== 'completo' && (
                <div className="tr-prog-track" style={{ marginTop: 8 }}>
                  <div className={`tr-prog-fill ${tone}`} style={{ width: `${c.progress}%` }} />
                </div>
              )}
              <div className="po-course-foot">
                {c.state === 'completo'  && <><IconCheck size={11} style={{ color: 'var(--green-600)' }} /> <span style={{ color: 'var(--green-600)', fontWeight: 700 }}>Aprobado · {c.score}/100</span></>}
                {c.state === 'curso'     && <><span className="muted">En curso · {c.progress}%</span></>}
                {c.state === 'pendiente' && <><span className="muted">Vence {c.due}</span></>}
                <div style={{ flex: 1 }} />
                {esExterno && c.state !== 'completo' && (
                  <>
                    <button
                      className="po-course-cta light"
                      onClick={() => urlAcceso ? window.open(urlAcceso, '_blank') : alert('Plataforma no configurada · solicita al área de RRHH la URL de acceso.')}
                      style={{ marginRight: 6 }}
                    >
                      <IconExternal size={11} /> Ir a la plataforma
                    </button>
                    <button
                      className="po-course-cta"
                      onClick={() => setAutocertFor(c)}
                    >
                      <IconCheck size={11} /> Marcar como completado
                    </button>
                  </>
                )}
                {!esExterno && c.state === 'pendiente' && <button className="po-course-cta">Iniciar</button>}
                {!esExterno && c.state === 'curso'     && <button className="po-course-cta">Continuar</button>}
                {c.state === 'completo'  && <button className="po-course-cta light">Certificado</button>}
              </div>
            </div>
          );
        })}
      </div>

      {autocertFor && (
        <AutoCertificacionModal
          curso={autocertFor}
          onClose={() => setAutocertFor(null)}
          onConfirm={(data) => onAutocertCompleted(autocertFor, data)}
        />
      )}
    </div>
  );
};

// ─── Modal: Autocertificación de curso externo ─────────────
// El colaborador completó el curso en la plataforma del tercero (SOFIA, ARL Sura, etc.)
// y declara aquí el completado. Atica certifica con base en esa declaración + evidencia opcional.

const AutoCertificacionModal = ({ curso, onClose, onConfirm }) => {
  const hoy = new Date();
  const hoyCO = `${String(hoy.getDate()).padStart(2,'0')}/${String(hoy.getMonth()+1).padStart(2,'0')}/${hoy.getFullYear()}`;
  const enUnAno = new Date(hoy.getFullYear() + 1, hoy.getMonth(), hoy.getDate());
  const enUnAnoCO = `${String(enUnAno.getDate()).padStart(2,'0')}/${String(enUnAno.getMonth()+1).padStart(2,'0')}/${enUnAno.getFullYear()}`;

  const [fechaFinalizacion, setFechaFin] = _po_useState(hoyCO);
  const [vigenciaTo, setVigenciaTo] = _po_useState(enUnAnoCO);
  const [score, setScore] = _po_useState(85);
  const [archivoEvidencia, setArchivo] = _po_useState('');
  const [declaracion, setDeclaracion] = _po_useState(false);

  React.useEffect(() => {
    document.body.style.overflow = 'hidden';
    const onEsc = (e) => { if (e.key === 'Escape') onClose(); };
    window.addEventListener('keydown', onEsc);
    return () => { document.body.style.overflow = ''; window.removeEventListener('keydown', onEsc); };
  }, []);

  const canConfirm = !!(declaracion && fechaFinalizacion && vigenciaTo);

  const confirmar = () => {
    if (!canConfirm) return;
    const code = `CERT-AUTO-${curso.id.toUpperCase()}-${Date.now().toString().slice(-6)}`;
    onConfirm({ code, fechaFinalizacion, vigenciaTo, score, archivoEvidencia });
  };

  return (
    <div className="modal-overlay" onMouseDown={e => { if (e.target === e.currentTarget) onClose(); }}>
      <div className="modal" style={{ maxWidth: 560 }}>
        <div className="modal-head">
          <div>
            <div className="muted mono" style={{ fontSize: 11 }}>Autocertificación · curso externo</div>
            <div className="modal-title">Marcar como completado</div>
            <div className="modal-sub">
              Declaras que completaste <b>{curso.name}</b> en <b>{curso.plataformaLabel || 'la plataforma del proveedor'}</b>. Atica SOMOS emitirá un certificado interno con tu declaración como evidencia (Ley 527/1999 · firma electrónica).
            </div>
          </div>
          <button className="icon-btn" onClick={onClose}><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round"><path d="M18 6 6 18M6 6l12 12" /></svg></button>
        </div>

        <div className="modal-body" style={{ display: 'flex', flexDirection: 'column', gap: 14 }}>
          <div className="ic-cap-setup-grid">
            <div className="ic-cap-field">
              <div className="muted-xs">Fecha de finalización *</div>
              {window.DatePickerCO
                ? <window.DatePickerCO value={fechaFinalizacion} onChange={setFechaFin} />
                : <input className="ic-cap-version" type="text" value={fechaFinalizacion} onChange={e => setFechaFin(e.target.value)} />}
            </div>
            <div className="ic-cap-field">
              <div className="muted-xs">Vigencia hasta *</div>
              {window.DatePickerCO
                ? <window.DatePickerCO value={vigenciaTo} onChange={setVigenciaTo} min={fechaFinalizacion} presets={[
                    { label: 'En 1 año',  compute: (t) => { const d = new Date(t); d.setFullYear(d.getFullYear() + 1); return d; } },
                    { label: 'En 2 años', compute: (t) => { const d = new Date(t); d.setFullYear(d.getFullYear() + 2); return d; } },
                    { label: 'En 3 años', compute: (t) => { const d = new Date(t); d.setFullYear(d.getFullYear() + 3); return d; } },
                  ]} />
                : <input className="ic-cap-version" type="text" value={vigenciaTo} onChange={e => setVigenciaTo(e.target.value)} />}
            </div>
            <div className="ic-cap-field">
              <div className="muted-xs">Calificación obtenida (si aplica)</div>
              <input className="ic-cap-version" type="number" min={0} max={100} value={score} onChange={e => setScore(Math.max(0, Math.min(100, parseInt(e.target.value) || 0)))} />
              <div className="muted" style={{ fontSize: 11, marginTop: 3 }}>Si la plataforma del proveedor mostró una nota, ingrésala. Si no, deja 100.</div>
            </div>
            <div className="ic-cap-field">
              <div className="muted-xs">Evidencia (opcional)</div>
              {archivoEvidencia ? (
                <div style={{ display: 'flex', gap: 6, alignItems: 'center', padding: '8px 10px', background: 'var(--surface)', borderRadius: 8, marginTop: 4 }}>
                  <IconDoc size={13} />
                  <span className="mono" style={{ fontSize: 11.5, flex: 1 }}>{archivoEvidencia}</span>
                  <button className="icon-btn" onClick={() => setArchivo('')}>
                    <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round"><path d="M18 6 6 18M6 6l12 12" /></svg>
                  </button>
                </div>
              ) : (
                <button
                  className="btn"
                  style={{ width: '100%', marginTop: 4 }}
                  onClick={() => setArchivo(`certificado-${curso.id}-${Date.now().toString().slice(-4)}.pdf`)}
                >
                  <IconPlus size={11} /> Cargar PDF de la plataforma
                </button>
              )}
            </div>
          </div>

          {/* Declaración de honor */}
          <label style={{ display: 'flex', gap: 10, padding: 12, background: 'linear-gradient(135deg, #fef9c3, #fff7ed)', border: '1px solid #B57609', borderRadius: 10, cursor: 'pointer' }}>
            <input type="checkbox" checked={declaracion} onChange={e => setDeclaracion(e.target.checked)} style={{ marginTop: 3 }} />
            <span style={{ fontSize: 12.5, lineHeight: 1.5 }}>
              Declaro bajo mi responsabilidad que <b>completé satisfactoriamente</b> este curso en la plataforma del proveedor. Esta declaración constituye <b>firma electrónica</b> conforme a la Ley 527 de 1999 y queda registrada en bitácora con mi nombre, fecha e IP.
            </span>
          </label>
        </div>

        <div className="modal-foot">
          <span className="muted" style={{ fontSize: 11.5, alignSelf: 'center' }}>
            {ME.name} · {ME.doc}
          </span>
          <div style={{ flex: 1 }} />
          <button className="btn" onClick={onClose}>Cancelar</button>
          <button className="btn primary" disabled={!canConfirm} onClick={confirmar}>
            <IconShield size={13} /> Certificar y emitir
          </button>
        </div>
      </div>
    </div>
  );
};

// ─── Screen: Profile ─────────────────────────────────────

const ProfileScreen = ({ variant, goScreen, setVacFlow, setCarnetOpen }) => {
  const m = variant === 'mobile';
  return (
    <div className={`po-screen ${m ? 'mobile' : 'desktop'}`}>
      <div className="po-profile-hero">
        <div className="po-avatar lg">{ME.initials}</div>
        <div style={{ flex: 1, minWidth: 0 }}>
          <div style={{ fontSize: m ? 16 : 18, fontWeight: 800, letterSpacing: '-0.01em' }}>{ME.name}</div>
          <div style={{ fontSize: m ? 12 : 13, marginTop: 2, opacity: 0.85 }}>{ME.role} · {ME.area}</div>
          <div style={{ fontSize: m ? 11 : 12, marginTop: 2, opacity: 0.7 }}>{ME.site} · ingresaste el {ME.hire}</div>
        </div>
        <button className="po-profile-carnet-btn" onClick={() => setCarnetOpen && setCarnetOpen(true)}>
          <span className="po-profile-carnet-icon">
            <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2"><rect x="3" y="5" width="18" height="14" rx="2" /><circle cx="9" cy="12" r="2.5" /><path d="M14 10h4M14 13h4M14 16h2" /></svg>
          </span>
          <span>Mi carnet</span>
        </button>
      </div>

      <div className="po-profile-section">
        <div className="po-section-head"><h3>Datos personales</h3></div>
        <div className="po-profile-fields">
          <div><div className="muted-xs">Documento</div><div className="po-profile-val mono">{ME.doc}</div></div>
          <div><div className="muted-xs">Email corporativo</div><div className="po-profile-val mono">{ME.email}</div></div>
          <div><div className="muted-xs">Teléfono</div><div className="po-profile-val mono">{ME.phone}</div></div>
          <div><div className="muted-xs">Jefe directo</div><div className="po-profile-val">{ME.leader}</div></div>
        </div>
        <button className="po-profile-update">
          <IconExternal size={13} /> Solicitar actualización de datos
        </button>
      </div>

      {/* Mis solicitudes (acceso al flujo de vacaciones) */}
      <div className="po-profile-section">
        <div className="po-section-head">
          <h3>Mis solicitudes</h3>
          <button className="po-pay-cert-btn" onClick={() => goScreen && goScreen('vacation')}>
            <IconPlus size={11} /> Nueva
          </button>
        </div>
        {ME_REQUESTS_RECENT.length === 0 ? (
          <div className="po-history-empty" style={{ marginTop: 0 }}>
            <IconCalendar size={28} />
            <div style={{ fontSize: 12.5, fontWeight: 600, marginTop: 8 }}>Aún no has hecho ninguna solicitud</div>
            <div className="muted" style={{ fontSize: 11, marginTop: 4 }}>Los permisos, vacaciones e incapacidades quedan registrados aquí.</div>
          </div>
        ) : (
          <div className="po-req-list">
            {ME_REQUESTS_RECENT.map(r => (
              <div key={r.id} className="po-req-row">
                <div style={{ flex: 1, minWidth: 0 }}>
                  <div className="po-req-type">{r.type}</div>
                  <div className="muted mono" style={{ fontSize: 10.5, marginTop: 2 }}>{r.from} → {r.to} · {r.days} días · {r.id}</div>
                </div>
                <span className={`pill ${r.tone === 'amber' ? 'amber-soft' : r.tone === 'green' ? 'green' : 'rose'}`} style={{ fontSize: 10.5 }}>{r.stateLabel}</span>
              </div>
            ))}
          </div>
        )}
      </div>

      {/* Mi SST */}
      <div className="po-profile-section">
        <div className="po-section-head">
          <h3>Mi seguridad y salud</h3>
          <span className="muted mono" style={{ fontSize: 11 }}>SG-SST</span>
        </div>

        {ME_SST_DATA.nextExam.urgent && (
          <div className="po-sst-urgent">
            <span className="po-sst-urgent-icon"><IconAlert size={13} /></span>
            <div style={{ flex: 1 }}>
              <div className="po-sst-urgent-title">{ME_SST_DATA.nextExam.type} · vence en {ME_SST_DATA.nextExam.daysLeft} días</div>
              <div className="muted" style={{ fontSize: 10.5 }}>{ME_SST_DATA.nextExam.ips} · agendamiento automático</div>
            </div>
            <button className="po-pay-cert-btn">Programar</button>
          </div>
        )}

        <div className="po-sst-grid">
          <div className="po-sst-card">
            <div className="muted-xs">Restricciones médicas</div>
            <div className="po-sst-val">{ME_SST_DATA.restrictions.length === 0 ? 'Ninguna registrada' : ME_SST_DATA.restrictions.join(' · ')}</div>
            <div className="muted" style={{ fontSize: 10.5 }}>Tu cargo no presenta restricciones activas</div>
          </div>
          <div className="po-sst-card">
            <div className="muted-xs">Brigadista de emergencias</div>
            <div className="po-sst-val">{ME_SST_DATA.brigadista ? 'Activo' : 'No · puedes postularte'}</div>
            <div className="muted" style={{ fontSize: 10.5 }}>Curso de 16h · ARL Sura</div>
          </div>
        </div>

        <div className="muted-xs" style={{ marginTop: 12, marginBottom: 6 }}>Factores de riesgo de tu cargo</div>
        <div className="po-sst-risks">
          {ME_SST_DATA.riskFactors.map((rf, i) => (
            <div key={i} className="po-sst-risk">
              <div className="po-sst-risk-head">
                <span className="po-sst-risk-name">{rf.factor}</span>
                <span className={`pill ${rf.level === 'alto' ? 'rose' : rf.level === 'medio' ? 'amber-soft' : 'green'}`} style={{ fontSize: 10.5 }}>
                  Nivel {rf.level}
                </span>
              </div>
              <div className="po-sst-mitigations">
                {rf.mitigations.map((mt, j) => (
                  <span key={j} className="po-sst-mit"><IconCheck size={10} /> {mt}</span>
                ))}
              </div>
            </div>
          ))}
        </div>
      </div>

      {/* Reconocimientos */}
      <div className="po-profile-section">
        <div className="po-section-head">
          <h3>Reconocimientos</h3>
          <span className="muted mono" style={{ fontSize: 11 }}>{ME_RECOG_RECEIVED.length} recibidos</span>
        </div>
        <div className="po-recog-list">
          {ME_RECOG_RECEIVED.map((r, i) => (
            <div key={i} className="po-recog">
              <div className="po-recog-from">
                <div className="po-recog-from-avatar">{r.initials}</div>
                <span className={`po-recog-value-pill ${r.valueTone}`}>{r.value}</span>
              </div>
              <div className="po-recog-msg">"{r.message}"</div>
              <div className="po-recog-foot">
                <span className="muted" style={{ fontSize: 10.5 }}>de <b style={{ color: 'var(--text)' }}>{r.from}</b> · {r.when}</span>
                <span className="po-recog-applauds">👏 {r.applauds}</span>
              </div>
            </div>
          ))}
        </div>
      </div>

      {/* Beneficios y convenios */}
      <div className="po-profile-section">
        <div className="po-section-head">
          <h3>Beneficios y convenios</h3>
          <span className="muted mono" style={{ fontSize: 11 }}>{ME_BENEFITS.length} disponibles</span>
        </div>
        <div className="po-benef-grid">
          {ME_BENEFITS.map((b, i) => (
            <div key={i} className={`po-benef po-benef-${b.tone}`}>
              <span className="po-benef-tag">Disponible</span>
              <div className="po-benef-name">{b.name}</div>
              <div className="muted" style={{ fontSize: 11, marginTop: 4 }}>{b.desc}</div>
            </div>
          ))}
        </div>
      </div>

      <div className="po-profile-section">
        <div className="po-section-head">
          <h3>Mi dotación entregada</h3>
          <span className="muted mono" style={{ fontSize: 11 }}>{MY_GEAR.length} ítems</span>
        </div>
        <div className="po-gear-list">
          {MY_GEAR.map(g => (
            <div key={g.code} className="po-gear-row">
              <span className="po-gear-icon"><IconShirt size={14} /></span>
              <div style={{ flex: 1, minWidth: 0 }}>
                <div className="po-gear-name">{g.name}</div>
                <div className="muted mono" style={{ fontSize: 10.5 }}>{g.code} · talla {g.size} · cantidad {g.qty}</div>
              </div>
              <div style={{ textAlign: 'right' }}>
                <div className="muted mono" style={{ fontSize: 10.5 }}>{g.received}</div>
                {g.pending && <div style={{ fontSize: 10, fontWeight: 700, color: 'var(--amber-600)' }}>Pendiente</div>}
              </div>
            </div>
          ))}
        </div>
      </div>

      <div className="po-profile-section">
        <div className="po-section-head">
          <h3>Mis capacitaciones</h3>
          <span className="muted mono" style={{ fontSize: 11 }}>2 / {MY_COURSES_INITIAL.length}</span>
        </div>
        <div className="po-mini-courses">
          {MY_COURSES_INITIAL.map(c => (
            <div key={c.id} className="po-mini-course">
              <span className={`po-mini-dot ${c.state === 'completo' ? 'green' : c.state === 'curso' ? 'amber' : 'rose'}`} />
              <span style={{ flex: 1, fontSize: 12, minWidth: 0, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{c.name}</span>
              {c.state === 'completo' && <span className="mono" style={{ fontSize: 11, color: 'var(--green-600)', fontWeight: 700 }}>{c.score}</span>}
            </div>
          ))}
        </div>
      </div>
    </div>
  );
};

// ─── Carnet digital · vista pantalla completa ────────────

// Mock QR (21x21) determinista — los tres "finder patterns" ocupan las
// esquinas estándar; el resto del grid se rellena con un patrón pseudo
// aleatorio derivado del código del carnet.
const CarnetQR = ({ size = 110, seed = '' }) => {
  const N = 21;
  const seedN = Array.from(seed).reduce((a, c) => a + c.charCodeAt(0), 0) || 7;
  const cells = [];
  for (let i = 0; i < N * N; i++) {
    const r = Math.floor(i / N), c = i % N;
    const inFinder = (x, y) => r >= y && r < y + 7 && c >= x && c < x + 7;
    const ring = (x, y) => inFinder(x, y) && (r === y || r === y + 6 || c === x || c === x + 6 || (r >= y + 2 && r <= y + 4 && c >= x + 2 && c <= x + 4));
    let on = 0;
    if (inFinder(0, 0))       on = ring(0, 0)  ? 1 : 0;
    else if (inFinder(14, 0)) on = ring(14, 0) ? 1 : 0;
    else if (inFinder(0, 14)) on = ring(0, 14) ? 1 : 0;
    else                      on = ((r * 31 + c * 17 + r * c + seedN) % 5) < 2 ? 1 : 0;
    cells.push(on);
  }
  return (
    <div className="po-carnet-qr" style={{ width: size, height: size }}>
      {cells.map((v, i) => <span key={i} className={v ? 'on' : ''} />)}
    </div>
  );
};

const CarnetView = ({ variant, onClose }) => {
  const m = variant === 'mobile';
  const [face, setFace] = _po_useState('front');
  const [mode, setMode] = _po_useState('view'); // 'view' | 'share'

  const flip = () => setFace(face === 'front' ? 'back' : 'front');

  if (mode === 'share') {
    return <CarnetShare variant={variant} onBack={() => setMode('view')} onClose={onClose} />;
  }

  return (
    <div className={`po-screen po-carnet-stage ${m ? 'mobile' : 'desktop'}`}>
      <button className="po-sign-back" onClick={onClose}>
        <IconChevronLeft size={14} /> Volver
      </button>

      <div className="po-carnet-head">
        <div>
          <h2 style={{ margin: 0, fontSize: m ? 18 : 22, fontWeight: 800, letterSpacing: '-0.01em' }}>Tu carnet digital</h2>
          <div className="muted" style={{ fontSize: m ? 11.5 : 12.5, marginTop: 2 }}>
            Toca la tarjeta para girarla · vigente hasta el {CARNET.validUntil}
          </div>
        </div>
        <span className="pill green" style={{ fontSize: 10.5, alignSelf: 'flex-start' }}>
          <span className="status-dot" style={{ background: 'var(--green-600)' }} /> Vigente
        </span>
      </div>

      <div className={`po-carnet ${face === 'back' ? 'flipped' : ''}`} onClick={flip}>
        <div className="po-carnet-inner">

          {/* Cara frontal */}
          <div className="po-carnet-face po-carnet-front">
            <div className="po-carnet-bg-pattern" />
            <div className="po-carnet-top">
              <div className="po-carnet-brand">
                <div className="po-carnet-logo">i</div>
                <div>
                  <div className="po-carnet-co">Atica</div>
                  <div className="po-carnet-platform">Atica SOMOS · Carnet del Colaborador</div>
                </div>
              </div>
              <div className="po-carnet-id mono">{CARNET.employeeId}</div>
            </div>

            <div className="po-carnet-body">
              <div className="po-carnet-photo">
                <div className="po-carnet-photo-initials">{ME.initials}</div>
                <div className="po-carnet-photo-tag mono">FOTO</div>
              </div>
              <div className="po-carnet-info">
                <div className="po-carnet-name">{ME.name}</div>
                <div className="po-carnet-role">{ME.role}</div>
                <div className="po-carnet-grid">
                  <div>
                    <div className="po-carnet-lbl">Documento</div>
                    <div className="po-carnet-val mono">{ME.doc}</div>
                  </div>
                  <div>
                    <div className="po-carnet-lbl">Sede</div>
                    <div className="po-carnet-val">{ME.site}</div>
                  </div>
                  <div>
                    <div className="po-carnet-lbl">Área</div>
                    <div className="po-carnet-val">{ME.area}</div>
                  </div>
                  <div>
                    <div className="po-carnet-lbl">Ingreso</div>
                    <div className="po-carnet-val mono">{ME.hire}</div>
                  </div>
                </div>
              </div>
            </div>

            <div className="po-carnet-footer">
              <div>
                <div className="po-carnet-lbl">Vigencia</div>
                <div className="po-carnet-val mono">{CARNET.validFrom} — {CARNET.validUntil}</div>
              </div>
              <div className="po-carnet-flip-hint">
                <svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2"><path d="M21 12a9 9 0 1 1-3-6.7" /><path d="M21 4v5h-5" /></svg>
                Tocar para girar
              </div>
            </div>
          </div>

          {/* Cara reversa */}
          <div className="po-carnet-face po-carnet-back-face">
            <div className="po-carnet-bg-pattern back" />
            <div className="po-carnet-back-head">
              <div>
                <div className="po-carnet-platform">Verificación pública</div>
                <div className="po-carnet-co" style={{ fontSize: 12 }}>verifica.atica.co/carnet</div>
              </div>
              <div className="po-carnet-id mono">{CARNET.employeeId}</div>
            </div>

            <div className="po-carnet-back-body">
              <div className="po-carnet-back-info">
                <div className="po-carnet-back-row">
                  <span className="po-carnet-lbl">RH · Tipo de sangre</span>
                  <span className="po-carnet-val mono">{CARNET.bloodType}</span>
                </div>
                <div className="po-carnet-back-row">
                  <span className="po-carnet-lbl">Tipo de contrato</span>
                  <span className="po-carnet-val">{CARNET.contractType}</span>
                </div>
                <div className="po-carnet-back-row">
                  <span className="po-carnet-lbl">Turno habitual</span>
                  <span className="po-carnet-val">{CARNET.shift}</span>
                </div>
                <div className="po-carnet-back-row">
                  <span className="po-carnet-lbl">EPS · ARL · AFP</span>
                  <span className="po-carnet-val">{CARNET.affiliations.eps} · {CARNET.affiliations.arl}</span>
                </div>
                <div className="po-carnet-back-row">
                  <span className="po-carnet-lbl">Contacto de emergencia</span>
                  <span className="po-carnet-val">{CARNET.emergency.name} · {CARNET.emergency.relation}</span>
                </div>
                <div className="po-carnet-back-row">
                  <span className="po-carnet-lbl">Teléfono</span>
                  <span className="po-carnet-val mono">{CARNET.emergency.phone}</span>
                </div>
              </div>

              <div className="po-carnet-qr-box" onClick={(e) => e.stopPropagation()}>
                <CarnetQR size={m ? 96 : 118} seed={CARNET.verifyCode} />
                <div className="po-carnet-qr-code mono">{CARNET.verifyCode}</div>
                <div className="po-carnet-qr-hint">Escanea para verificar</div>
              </div>
            </div>

            <div className="po-carnet-back-foot">
              <div className="po-carnet-hash mono">hash · {CARNET.verifyHash}</div>
              <div className="po-carnet-emitted mono">emitido {CARNET.issuedAt}</div>
            </div>
          </div>

        </div>
      </div>

      <div className="po-carnet-actions">
        <button className="po-carnet-action primary" onClick={() => setMode('share')}>
          <IconExternal size={13} /> Compartir
        </button>
        <button className="po-carnet-action">
          <IconDoc size={13} /> Descargar PDF
        </button>
        <button className="po-carnet-action" onClick={flip}>
          <svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2"><path d="M21 12a9 9 0 1 1-3-6.7" /><path d="M21 4v5h-5" /></svg>
          Girar
        </button>
      </div>

      <div className="po-carnet-note">
        <span className="po-carnet-note-icon"><IconShield size={13} /></span>
        <div>
          <b>Carnet emitido digitalmente.</b> Cuando lo compartas decides qué información incluir; el QR y el código <span className="mono">{CARNET.verifyCode}</span> permiten que un tercero verifique tu vigencia laboral sin acceder a datos sensibles.
        </div>
      </div>
    </div>
  );
};

// ─── Carnet · flujo de compartir con privacidad ──────────

const CarnetShare = ({ variant, onBack, onClose }) => {
  const m = variant === 'mobile';

  // Defaults: solo los campos marcados como defaultOn = true
  const defaultIds = CARNET_FIELDS.filter(f => f.defaultOn).map(f => f.id);
  const [selected, setSelected] = _po_useState(defaultIds);
  const [ttl, setTtl] = _po_useState('24h');
  const [copied, setCopied] = _po_useState(false);
  const [copyTarget, setCopyTarget] = _po_useState(null);

  const isOn = (id) => selected.includes(id);
  const toggle = (id) => {
    const f = CARNET_FIELDS.find(x => x.id === id);
    if (f && f.locked) return;
    setSelected(isOn(id) ? selected.filter(x => x !== id) : [...selected, id]);
  };
  const applyPreset = (key) => {
    const ids = CARNET_PRESETS[key].ids;
    // Garantiza que los locked siempre queden incluidos
    const lockedIds = CARNET_FIELDS.filter(f => f.locked).map(f => f.id);
    const merged = Array.from(new Set([...lockedIds, ...ids]));
    setSelected(merged);
  };

  // Construye la URL pública con los campos seleccionados.
  // Demo: ruta relativa al entry público de la misma demo.
  const ttlDef = CARNET_TTL.find(t => t.id === ttl);
  const expIso = ttlDef && ttlDef.minutes != null
    ? new Date(Date.now() + ttlDef.minutes * 60 * 1000).toISOString().slice(0, 16)
    : null;
  const params = new URLSearchParams();
  params.set('codigo', CARNET.verifyCode);
  params.set('campos', selected.join(','));
  if (expIso) params.set('exp', expIso);
  const relUrl   = `HCM%20Atica%20Carnet%20Publico.html?${params.toString()}`;
  const shortUrl = `verifica.atica.co/c/${CARNET.verifyCode}?campos=${selected.length}`;

  const copy = (txt, key) => {
    if (navigator.clipboard) navigator.clipboard.writeText(txt);
    setCopyTarget(key);
    setCopied(true);
    setTimeout(() => setCopied(false), 1800);
  };

  const openPreview = () => {
    try { window.open(relUrl, '_blank', 'noopener'); } catch (_) {}
  };

  // Agrupa los campos por categoría para presentarlos en bloques
  const groups = [
    { id: 'identidad', label: 'Identidad básica',           hint: 'Lo mínimo para que reconozcan tu carnet'             },
    { id: 'laboral',   label: 'Datos laborales',            hint: 'Información del puesto · de uso público en la empresa'},
    { id: 'salud',     label: 'Datos médicos y seguridad',  hint: 'Útiles en emergencias · habilítalos solo si los necesitan' },
    { id: 'sensible',  label: 'Datos sensibles',            hint: 'Documento de identidad y contacto familiar · evita compartirlos por canales abiertos' },
  ];

  // Cuenta sensibles activos para el indicador de exposición
  const sensibles = CARNET_FIELDS.filter(f => f.group === 'sensible' || f.id === 'bloodType');
  const sensActive = sensibles.filter(f => isOn(f.id)).length;
  const exposureLevel = sensActive === 0 ? 'baja' : sensActive <= 2 ? 'media' : 'alta';
  const exposureTone  = sensActive === 0 ? 'green' : sensActive <= 2 ? 'amber' : 'rose';

  return (
    <div className={`po-screen po-carnet-share ${m ? 'mobile' : 'desktop'}`}>
      <button className="po-sign-back" onClick={onBack}>
        <IconChevronLeft size={14} /> Volver al carnet
      </button>

      <div className="po-carnet-head">
        <div>
          <h2 style={{ margin: 0, fontSize: m ? 18 : 22, fontWeight: 800, letterSpacing: '-0.01em' }}>Compartir mi carnet</h2>
          <div className="muted" style={{ fontSize: m ? 11.5 : 12.5, marginTop: 2 }}>
            Tú decides qué información mostrar a quien reciba el enlace · cumple con la <b>Ley 1581 de 2012</b> de protección de datos.
          </div>
        </div>
        <span className={`pill ${exposureTone}`} style={{ fontSize: 10.5, alignSelf: 'flex-start' }}>
          <span className="status-dot" style={{ background: exposureTone === 'green' ? 'var(--green-600)' : exposureTone === 'amber' ? 'var(--amber-600)' : 'var(--aguila-600)' }} />
          Exposición {exposureLevel}
        </span>
      </div>

      {/* Presets rápidos */}
      <div className="po-share-section">
        <div className="po-share-section-title">Plantillas</div>
        <div className="po-share-presets">
          {Object.entries(CARNET_PRESETS).map(([key, p]) => (
            <button key={key} className="po-share-preset" onClick={() => applyPreset(key)}>
              <span className="po-share-preset-name">{p.label}</span>
              <span className="po-share-preset-desc">{p.desc}</span>
            </button>
          ))}
        </div>
      </div>

      {/* Toggles agrupados */}
      <div className="po-share-section">
        <div className="po-share-section-title">Información que se mostrará ({selected.length} de {CARNET_FIELDS.length})</div>
        {groups.map(g => {
          const fields = CARNET_FIELDS.filter(f => f.group === g.id);
          return (
            <div key={g.id} className="po-share-group">
              <div className="po-share-group-head">
                <div className="po-share-group-label">{g.label}</div>
                <div className="po-share-group-hint">{g.hint}</div>
              </div>
              <div className="po-share-toggles">
                {fields.map(f => (
                  <label key={f.id} className={`po-share-toggle ${isOn(f.id) ? 'on' : ''} ${f.locked ? 'locked' : ''}`}>
                    <input
                      type="checkbox"
                      checked={isOn(f.id)}
                      disabled={f.locked}
                      onChange={() => toggle(f.id)}
                    />
                    <span className="po-share-toggle-body">
                      <span className="po-share-toggle-name">
                        {f.label}
                        {f.locked && <span className="po-share-locked"><IconShield size={10} /> obligatorio</span>}
                      </span>
                      <span className="po-share-toggle-desc">{f.desc}</span>
                    </span>
                    <span className="po-share-switch" aria-hidden="true"><span /></span>
                  </label>
                ))}
              </div>
            </div>
          );
        })}
      </div>

      {/* Vigencia del enlace */}
      <div className="po-share-section">
        <div className="po-share-section-title">Vigencia del enlace</div>
        <div className="po-share-ttl">
          {CARNET_TTL.map(t => (
            <button
              key={t.id}
              className={`po-share-ttl-pill ${ttl === t.id ? 'on' : ''}`}
              onClick={() => setTtl(t.id)}
            >
              {t.label}
            </button>
          ))}
        </div>
        {expIso && (
          <div className="muted" style={{ fontSize: 11, marginTop: 6 }}>
            Caducará el <b className="mono" style={{ color: 'var(--text)' }}>{expIso.replace('T', ' · ')}</b>. Después el enlace dejará de mostrar tus datos.
          </div>
        )}
      </div>

      {/* Resultado · enlace + preview */}
      <div className="po-share-section">
        <div className="po-share-section-title">Tu enlace</div>

        <div className="po-share-link-row">
          <input className="po-share-link-input mono" readOnly value={relUrl} onFocus={(e) => e.target.select()} />
          <button className="po-carnet-action primary" onClick={() => copy(relUrl, 'long')}>
            <IconExternal size={13} /> {copied && copyTarget === 'long' ? 'Copiado' : 'Copiar'}
          </button>
        </div>

        <div className="po-share-link-row" style={{ marginTop: 8 }}>
          <div className="po-share-short">
            <div className="muted-xs">Versión corta para compartir por chat</div>
            <div className="po-share-short-url mono">{shortUrl}</div>
          </div>
          <button className="po-carnet-action" onClick={() => copy(shortUrl, 'short')}>
            {copied && copyTarget === 'short' ? 'Copiado' : 'Copiar'}
          </button>
        </div>

        <button className="po-share-preview-btn" onClick={openPreview}>
          <IconExternal size={13} />
          Abrir vista previa pública en otra pestaña
        </button>
      </div>

      {/* Aviso legal */}
      <div className="po-carnet-note">
        <span className="po-carnet-note-icon"><IconShield size={13} /></span>
        <div>
          Al compartir el enlace autorizas a Atica S.A.S. a publicar los campos seleccionados en el portal público <span className="mono">verifica.atica.co</span>. Puedes revocar el enlace en cualquier momento desde tu perfil.
        </div>
      </div>
    </div>
  );
};

window.Portal = Portal;
