// TeachingView — pedagogical qualifications + taught modules with // collapsible briefs. Matches the News/Talks visual vocabulary. const TV = window.WINTELAcademicDesignSystem_045d4f; function CredentialItem({ c }) { const [open, setOpen] = React.useState(false); const hasDesc = !!c.desc; return (
  • setOpen((v) => !v) : undefined} role={hasDesc ? 'button' : undefined} aria-expanded={hasDesc ? open : undefined} style={{ display: 'flex', gap: '0.85rem', alignItems: 'flex-start', cursor: hasDesc ? 'pointer' : 'default' }}>

    {c.title} {c.url ? ( e.stopPropagation()} style={{ marginLeft: '0.45rem', color: 'var(--accent)', textDecoration: 'none', whiteSpace: 'nowrap', fontSize: 'var(--text-xs)', fontFamily: 'var(--font-mono)' }}> verify ) : null}

    {c.orgLink ? c.org.split(c.orgLink.label).map((seg, j, arr) => ( {seg}{j < arr.length - 1 ? ( {c.orgLink.label} ) : null} )) : c.org}{c.note ? · {c.note} : null}

    {c.date ? ( {c.date} ) : null} {hasDesc ? ( ) : null}
    {hasDesc && open ? (

    {c.descLink ? c.desc.split(c.descLink.label).map((seg, j, arr) => ( {seg}{j < arr.length - 1 ? ( {c.descLink.label} ) : null} )) : c.desc}

    ) : null}
  • ); } function ModuleItem({ m }) { const [open, setOpen] = React.useState(false); return (
  • setOpen((v) => !v)} role="button" aria-expanded={open} style={{ display: 'flex', alignItems: 'flex-start', gap: '1rem', padding: '1rem 0', cursor: 'pointer' }}> {m.code}

    {m.title}

    {m.level ? ( {m.level === 'UG' ? 'Undergraduate' : m.level === 'MSc' ? 'Postgraduate · MSc' : m.level} ) : null}
    {open ? (

    {m.desc}

    {m.url ? ( Module page ) : null}
    ) : null}
  • ); } function TeachingView({ data }) { const t = data.teaching || { credentials: [], modules: [] }; return (

    Pedagogical Qualifications

      {t.credentials.map((c, i) => )}

    Modules Taught

    {t.modules.length}
      {t.modules.map((m, i) => )}
    {(t.moderated && t.moderated.length) ? (

    Modules Moderated

    {t.moderated.length}
    {t.moderationNote ? (

    {t.moderationNote}

    ) : null}
      {t.moderated.map((m, i) => )}
    ) : null}
    ); } Object.assign(window, { TeachingView });