// 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 };
})();