// Shared chat UI atoms (JSX) — window.ChatUI. Load after React/Babel, before admin-chat.jsx / student-chat.jsx. (function(){ const overlay={position:'fixed',inset:0,background:'rgba(6,10,22,.62)',backdropFilter:'blur(3px)',display:'grid',placeItems:'center',zIndex:900,padding:16}; const box={width:'100%',maxWidth:380,background:'var(--navy-900)',border:'1px solid var(--border-gold)',borderRadius:'var(--radius)',padding:'22px 22px 18px',boxShadow:'var(--shadow)'}; const btnBase={padding:'10px 18px',borderRadius:999,fontFamily:'var(--font-body)',fontWeight:700,fontSize:'.86rem',cursor:'pointer',border:'1px solid transparent'}; const btnGhost={...btnBase,background:'var(--surface)',border:'1px solid var(--border)',color:'var(--ink-dim)'}; const btnDanger={...btnBase,background:'rgba(248,113,113,.14)',border:'1px solid rgba(248,113,113,.45)',color:'#fca5a5'}; const btnGold={...btnBase,background:'linear-gradient(135deg,var(--gold-2),var(--gold))',color:'#1a1303'}; function ConfirmModal({title,body,confirmLabel='Delete',danger=true,onConfirm,onCancel}){ return
e.stopPropagation()}>
{title}
{body}
; } function CheckOne({color}){ return ; } function CheckTwo({color}){ return ; } function Ticks({seen}){ const color= seen ? 'var(--gold-2)' : 'var(--ink-faint)'; return ; } // 3-state presence dot for chat heads: active (green) / idle (crescent) / offline (gray). function PresenceDot({state,size=10}){ const base={position:'absolute',bottom:-1,right:-1,width:size,height:size,borderRadius:'50%',border:'2px solid var(--navy-900)',display:'grid',placeItems:'center'}; if(state==='active') return ; if(state==='idle') return ; return ; } const REACTS=['❤️','👍','🔥','😂']; function ReactionBar({mine,active,counts,onToggle}){ if(!counts && !active) return null; return
{REACTS.filter(e=>counts&&counts[e]).map(e=> )}
; } function ReactPicker({onPick}){ return
{REACTS.map(e=> )}
; } function TypingDots(){ return ; } window.ChatUI = { ConfirmModal, Ticks, ReactionBar, ReactPicker, TypingDots, PresenceDot, REACTS }; })();