/* ============================================================
UI KIT — icons (lucide paths, inline) + shared components
============================================================ */
const ICONS = {
home:'',
plus:'',
list:'',
inbox:'',
hospital:'',
users:'',
chart:'',
shield:'',
cog:'',
bell:'',
search:'',
logout:'',
x:'',
check:'',
chevR:'',
chevD:'',
chevL:'',
alert:'',
info:'',
file:'',
download:'',
upload:'',
lock:'',
eyeOff:'',
clock:'',
userCheck:'',
arrowR:'',
menu:'',
send:'',
paperclip:'',
edit:'',
key:'',
ban:'',
filter:'',
more:'',
message:'',
circleCheck:'',
dot:'',
mail:'',
sun:'',
moon:'',
refresh:'',
activity:'',
user:'',
building:'',
};
function Icon({name, size=18, stroke=2, cls='', style={}}){
return ;
}
function Btn({variant, size, icon, iconR, children, className='', ...p}){
const cls=['btn', variant&&'btn-'+variant, size&&'btn-'+size, className].filter(Boolean).join(' ');
return ;
}
function StatusBadge({s, sm}){
const m=window.GOV.STATUS[s]; if(!m) return null;
return {m.label};
}
function PriorityBadge({p}){
const map={urgent:'Urgent',normal:'Normal',low:'Low'};
return {map[p]||p};
}
function RoleBadge({role}){
const m=window.GOV.ROLES[role]; if(!m) return null;
return {m.label};
}
function initials(name=''){ return name.replace(/^(Dr\.|Ms\.|Mr\.|Nurse)\s+/,'').split(' ').map(w=>w[0]).slice(0,2).join('').toUpperCase(); }
function Avatar({name, size=32, style={}}){
return {initials(name)};
}
/* form atoms */
function Field({label, req, opt, error, hint, children, style}){
return
{label &&
}
{children}
{error &&
{error}
}
{hint && !error &&
{hint}
}
;
}
const Input = (p)=> ;
const Textarea=(p)=> ;
function Select({error, children, ...p}){ return ; }
/* modal */
function Modal({open, onClose, title, icon, iconColor, lg, children, footer}){
if(!open) return null;
return { if(e.target===e.currentTarget) onClose&&onClose(); }}>
{title &&
{icon && }
{title}
}
{children}
{footer &&
{footer}
}
;
}
function Banner({variant='info', icon, title, children, style}){
const ic=icon||{needs:'alert',info:'info',amber:'info',success:'circleCheck',danger:'alert'}[variant]||'info';
return
{title&&
{title}
}{children&&
{children}
}
;
}
function EmptyState({icon='inbox', title, desc, action}){
return
{title}
{desc&&
{desc}
}{action}
;
}
function Skeleton({rows=4}){
return
{Array.from({length:rows}).map((_,i)=>
;
}
/* permission gate wrapper */
function PermDenied({what='view this'}){
return
Access denied
You don't have permission to {what}. This action is restricted by your role.
;
}
/* toaster */
function Toaster(){
const {toasts}=window.useStore();
return
{toasts.map(t=>
{t.title}
{t.desc&&
{t.desc}
}
)}
;
}
Object.assign(window,{ Icon, Btn, StatusBadge, PriorityBadge, RoleBadge, Avatar, initials,
Field, Input, Textarea, Select, Modal, Banner, EmptyState, Skeleton, PermDenied, Toaster });