// Skupna lupina za hotelske vloge (Hotel Admin, Receptionist, Front Desk, Hotel IT) // Sidebar + topbar + skupni primitivi (Card, Btn, Badge, PageHeader, Table, FilterBar, StatCard, Sparkline) const HIcon = ({name, size=18, color='currentColor'}) => { const p = { dashboard: <>, calendar: <>, bed: <>, users: <>, money: <>, chart: <>, sparkle: <>, cogs: <>, cleaning: <>, wrench: <>, plug: <>, activity: <>, shield: <>, bell: <>, search: <>, plus: <>, check: <>, x: <>, chevdown: <>, chevright: <>, chevleft: <>, sun: <>, moon: <>, arrowup: <>, arrowdown: <>, download: <>, filter: <>, key: <>, door: <>, headset: <>, chat: <>, home: <>, monitor: <>, printer: <>, wifi: <>, box: <>, flag: <>, star: <>, eye: <>, logout: <>, dot: , calendar2: <>, fire: <>, }; return {p[name]||null}; }; function HSidebar({ items, active, onNav, collapsed, dark, brand, role, user, hotelName }) { const w = collapsed ? 72 : 248; const bg = dark ? '#1A1A1A' : '#FFFFFF'; const border = dark ? '#2B2B2B' : '#E5E5E5'; const fg = dark ? '#C8C8C8' : '#333'; const muted = dark ? '#707070' : '#9A9A9A'; return ( ); } function HTopbar({ dark, onToggleDark, onToggleSidebar, search, badges, hotelName }) { const bg = dark ? '#1A1A1A' : '#fff'; const border = dark ? '#2B2B2B' : '#E5E5E5'; const fg = dark ? '#E5E5E5' : '#333'; const muted = dark ? '#9A9A9A' : '#707070'; return (
{badges?.system||'Vsi sistemi delujejo'}
Vloge
); } function HCard({ children, dark, padding=20, style={} }) { return
{children}
; } function HBtn({ children, variant='primary', size='md', onClick, icon, dark, style={} }) { const base = {fontFamily:'inherit', fontWeight:600, border:'none', cursor:'pointer', display:'inline-flex', alignItems:'center', gap:8, transition:'all 120ms', borderRadius:10, whiteSpace:'nowrap'}; const sz = {sm:{padding:'6px 12px', fontSize:13}, md:{padding:'9px 16px', fontSize:14}, lg:{padding:'12px 22px', fontSize:15}}; const v = { primary:{background:'#2196F3', color:'#fff'}, cyan:{background:'#00BCD4', color:'#fff'}, ghost:{background: dark?'#2B2B2B':'#fff', color: dark?'#E5E5E5':'#333', border:`1px solid ${dark?'#333':'#E5E5E5'}`}, danger:{background:'#fff', color:'#E53935', border:'1px solid #E53935'}, subtle:{background: dark?'rgba(33,150,243,.15)':'#E3F2FD', color:'#2196F3'}, success:{background:'#2DD164', color:'#fff'}, }; return ; } function HBadge({ children, tone='neutral' }) { const t = { cyan:{bg:'#E0F7FA', fg:'#006064', dot:'#00BCD4'}, blue:{bg:'#E3F2FD', fg:'#0D47A1', dot:'#2196F3'}, orange:{bg:'#FFF3E0', fg:'#E65100', dot:'#FF9800'}, success:{bg:'#E6F9EC', fg:'#117A34', dot:'#2DD164'}, danger:{bg:'#FDECEA', fg:'#B71C1C', dot:'#E53935'}, neutral:{bg:'#F5F5F5', fg:'#4D4D4D', dot:'#9A9A9A'}, purple:{bg:'#F3E5F5', fg:'#4A148C', dot:'#9C27B0'}, }[tone] || {bg:'#F5F5F5', fg:'#4D4D4D', dot:'#9A9A9A'}; return {children} ; } function HPageHeader({ title, subtitle, actions, dark, breadcrumbs }) { const muted = dark?'#9A9A9A':'#707070'; return
{breadcrumbs &&
{breadcrumbs.map((b,i)=>{b}{i})}
}

{title}

{subtitle &&
{subtitle}
}
{actions &&
{actions}
}
; } function HTable({ columns, rows, dark, onRowClick, compact }) { const muted = dark?'#9A9A9A':'#707070'; const border = dark?'#2B2B2B':'#F0F0F0'; return
{columns.map(c=>)} {rows.map((r,i)=> onRowClick && onRowClick(r)} style={{borderBottom:`1px solid ${border}`, cursor:onRowClick?'pointer':'default', transition:'background 80ms'}} onMouseEnter={e=>{ if(onRowClick) e.currentTarget.style.background=dark?'#222':'#FAFAFA';}} onMouseLeave={e=>e.currentTarget.style.background='transparent'}> {columns.map(c=>)} )}
{c.label}
{c.render?c.render(r):r[c.key]}
; } function HStat({ label, value, delta, tone='blue', dark }) { const c = {cyan:'#00BCD4', blue:'#2196F3', orange:'#FF9800', green:'#2DD164', purple:'#9C27B0', red:'#E53935'}[tone]; const muted = dark?'#9A9A9A':'#707070'; const up = delta && !delta.startsWith('-'); return
{label}
{value}
{delta &&
{up?'↑':'↓'} {delta.replace('-','')}
}
; } function HSpark({ data, color='#2196F3', height=40 }) { const max = Math.max(...data), min = Math.min(...data), r = max-min||1, w=100; const pts = data.map((v,i)=>`${(i/(data.length-1))*w},${height-((v-min)/r)*(height-4)-2}`).join(' '); return ; } Object.assign(window, { HIcon, HSidebar, HTopbar, HCard, HBtn, HBadge, HPageHeader, HTable, HStat, HSpark });