// 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 ;
};
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 (
);
}
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=>| {c.label} | )}
{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.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 });