/* Clear Mint — Core components (depends on cm-charts.jsx for CMIcon) */
const Ic = window.CMIcon;

/* ===================== Sidebar ===================== */
const NAV = [
  { id:'dashboard', label:'Dashboard', icon:'Dashboard' },
  { id:'calendar', label:'Calendar', icon:'Calendar' },
  { id:'transactions', label:'Transactions', icon:'Transactions' },
  { id:'cashflow', label:'Cash Flow', icon:'Transfer' },
  { id:'outlook', label:'Financial Outlook', icon:'Spark' },
  { id:'money', label:'Banking', icon:'Accounts' },
  { id:'moneyflow', label:'Earnings & Bills', icon:'Dollar' },
  { id:'subscriptions', label:'Subscriptions', icon:'Subscriptions' },
  { id:'budget', label:'Budget & Planner', icon:'Calendar' },
  { id:'la', label:'Wealth', icon:'Liabilities' },
  { id:'insurance', label:'Insurance', icon:'Insurance' },
  { id:'health', label:'Financial Health', icon:'Heart' },
  { id:'roadmap', label:'Financial Roadmap', icon:'Goals' },
  { id:'opportunities', label:'Opportunities', icon:'Spark' },
  { id:'ai', label:'AI Insights', icon:'AI' },
  { id:'analytics', label:'Analytics', icon:'Bars' },
  { id:'reports', label:'Reports', icon:'Reports' },
  { id:'emails', label:'Email Center', icon:'Reports' },
  { id:'family', label:'Family Wealth Hub', icon:'House', children:[
      { id:'familyhub', label:'Hub Overview' },
      { id:'vault', label:'Family Vault' },
      { id:'familymembers', label:'Family Members' },
      { id:'estate', label:'Estate & Legacy Vault' },
  ]},
  { id:'activity', label:'Activity', icon:'Clock' },
  { id:'connect', label:'Bank Connect', icon:'Bank' },
  { id:'settings', label:'Settings', icon:'Settings' },
];

/* ----- Freemium: which nav targets are Premium-gated -----
   Matches pricing.html "Not included" for Essentials + CMAccess.PREMIUM_FEATURES.
   Note: `insurance` is NOT premium (Essentials includes up to 2 policies); `connect`
   (Bank Connect / open banking) IS premium. */
const CM_PREMIUM = { ai:1, connect:1, vault:1, familyhub:1, estate:1, investments:1, statements:1, bankstatements:1, outlook:1, analytics:1 };
function cmLocked(id){ try { return !!CM_PREMIUM[id] && window.CMAccess && !window.CMAccess.can(id); } catch(e){ return false; } }
const LockBadge = () => (
  <span className="cm-lock" title="Premium" style={{marginLeft:'auto',display:'inline-flex',alignItems:'center',color:'var(--gold)'}}>
    <svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth={2.2}><rect x="5" y="11" width="14" height="9" rx="2"/><path d="M8 11V8a4 4 0 018 0v3"/></svg>
  </span>
);

const NAV_ORDER_KEY = 'cm_nav_order_v2';
const SIDEBAR_THEME_KEY = 'cm_sidebar_theme_v1';
/* apply a persisted custom order to the default NAV (appends any new items) */
function orderedNav(items) {
  try {
    const raw = localStorage.getItem(NAV_ORDER_KEY);
    if (!raw) return items.slice();
    const ids = JSON.parse(raw);
    const byId = {}; items.forEach(it=>{ byId[it.id]=it; });
    const out = [];
    ids.forEach(id => { if (byId[id]) { out.push(byId[id]); delete byId[id]; } });
    items.forEach(it => { if (byId[it.id]) out.push(it); });
    return out;
  } catch(e){ return items.slice(); }
}

function Logo() {
  return (
    <img className="cm-brand-mark" src="assets/logo/cm-leaf-gold.png" alt="Clear Mint" draggable="false"/>
  );
}

function Sidebar({ active='dashboard', items=NAV }) {
  const computeOpen = () => {
    const o = {};
    items.forEach(it => { if (it.children && it.children.some(c=>c.id===active)) o[it.id] = true; });
    return o;
  };
  const [open, setOpen] = React.useState(computeOpen);
  const [order, setOrder] = React.useState(() => orderedNav(items));
  const [rearrange, setRearrange] = React.useState(false);
  const [light, setLight] = React.useState(() => { try { return localStorage.getItem(SIDEBAR_THEME_KEY)==='light'; } catch(e){ return false; } });
  const drag = React.useRef(null);
  React.useEffect(()=>{ setOpen(prev => ({ ...prev, ...computeOpen() })); }, [active]);
  React.useEffect(()=>{ try { localStorage.setItem(SIDEBAR_THEME_KEY, light?'light':'dark'); } catch(e){} }, [light]);
  const toggle = id => setOpen(prev => ({ ...prev, [id]: !prev[id] }));

  const persistOrder = arr => { try { localStorage.setItem(NAV_ORDER_KEY, JSON.stringify(arr.map(i=>i.id))); } catch(e){} };
  const onDrop = (toIdx) => {
    const from = drag.current; drag.current = null;
    if (from==null || from===toIdx) return;
    setOrder(prev => { const a=[...prev]; const [m]=a.splice(from,1); a.splice(toIdx,0,m); persistOrder(a); return a; });
  };

  /* live “bills due soon” for the AI card */
  let billNote = 'Your finances are on track.';
  try {
    const CM = window.CM;
    const up = (CM && CM.upcomingBills) ? CM.upcomingBills() : [];
    if (up && up.length) {
      const total = up.reduce((s,b)=>s+(+b.amount||0),0);
      const names = up.slice(0,2).map(b=>b.desc||b.name||'Bill').join(', ');
      billNote = `${up.length} bill${up.length>1?'s':''} due soon: ${names}${up.length>2?'…':''} ($${Math.round(total).toLocaleString('en-CA')})`;
    }
  } catch(e){}

  /* current user for the footer */
  let userName='', userRole='Member';
  try { const cu=window.CM&&window.CM.S&&window.CM.S.currentUser; if(cu){ userName=cu.name||userName; userRole=(cu.role==='admin'||cu.role==='Admin')?'Admin':(cu.role||'Member'); } } catch(e){}
  const inits = (userName||'?').split(' ').map(n=>n[0]).join('').slice(0,2).toUpperCase()||'U';
  const signOut = () => { window.location.href = 'Login.html'; };

  const [planV, setPlanV] = React.useState(0);
  React.useEffect(()=>{ const h=()=>setPlanV(v=>v+1); window.addEventListener('cm-plan-change',h); return ()=>window.removeEventListener('cm-plan-change',h); },[]);
  const NavRow = (it, idx) => {
    const Glyph = Ic[it.icon] || Ic.Dashboard;
    const dragProps = rearrange ? {
      draggable:true,
      onDragStart:()=>{ drag.current=idx; },
      onDragOver:(e)=>{ e.preventDefault(); },
      onDrop:()=>onDrop(idx),
    } : {};
    if (it.children) {
      const childActive = it.children.some(c=>c.id===active);
      const isOpen = !!open[it.id];
      return (
        <div key={it.id} className={rearrange?'cm-nav-drag':''} {...dragProps}>
          <div className={`cm-nav-item ${isOpen?'open':''} ${childActive?'active':''}`} onClick={()=>!rearrange&&toggle(it.id)}>
            {rearrange && <span className="cm-nav-grip"><Ic.Grip size={15}/></span>}
            <Glyph/><span>{it.label}</span>{!rearrange && <span className="chev"><Ic.Chevron size={16}/></span>}
          </div>
          {isOpen && !rearrange && <div className="cm-subnav">
            {it.children.map(c =>{ const cl=cmLocked(c.id); return (
              <a key={c.id} href={cl?undefined:`#/${c.id}`} onClick={cl?(e)=>{e.preventDefault();window.CMAccess.requirePremium(c.id,c.label);}:undefined} className={`cm-subnav-item ${c.id===active?'active':''} ${cl?'cm-nav-locked':''}`} style={{textDecoration:'none',display:'flex',alignItems:'center'}}>{c.label}{cl && <LockBadge/>}</a>); })}
          </div>}
        </div>
      );
    }
    const locked = !rearrange && cmLocked(it.id);
    return (
      <a key={it.id} href={rearrange?undefined:(locked?undefined:(it.id==='admin'?'Clear Mint Admin.html':`#/${it.id}`))} target={it.id==='admin'?'_blank':undefined}
         onClick={locked?(e)=>{e.preventDefault();window.CMAccess.requirePremium(it.id,it.label);}:undefined}
         className={`cm-nav-item ${it.id===active?'active':''} ${it.admin?'cm-nav-admin':''} ${rearrange?'cm-nav-drag':''} ${locked?'cm-nav-locked':''}`} style={{textDecoration:'none'}} {...dragProps}>
        {rearrange && <span className="cm-nav-grip"><Ic.Grip size={15}/></span>}
        <Glyph/><span>{it.label}</span>{locked && <LockBadge/>}
      </a>
    );
  };

  return (
    <aside className={`cm-sidebar ${light?'cm-sidebar--light':''}`}>
      <a href="#/dashboard" className="cm-brand" style={{textDecoration:'none'}}>
        <Logo/>
        <div>
          <div className="cm-brand-name">Clear Mint</div>
          <div className="cm-brand-sub">Financial Freedom. Family First.</div>
        </div>
      </a>

      <nav className={`cm-nav ${rearrange?'cm-nav--rearrange':''}`}>
        {order.map((it,idx)=>NavRow(it,idx))}

      </nav>

      <div className="cm-side-controls" style={{display:'flex',gap:8,padding:'2px 14px 10px'}}>
        <button onClick={()=>setRearrange(r=>!r)} title="Rearrange menu"
          style={{flex:1,display:'inline-flex',alignItems:'center',justifyContent:'center',gap:6,fontFamily:'inherit',fontSize:12,fontWeight:700,padding:'8px 10px',borderRadius:9,cursor:'pointer',
            border:'1px solid '+(rearrange?'var(--gold)':(light?'#E5EAE7':'rgba(255,255,255,.16)')),
            background:rearrange?(light?'#FBF3E0':'rgba(212,169,93,.16)'):(light?'#F8FAF9':'rgba(255,255,255,.05)'),
            color:rearrange?'var(--gold)':(light?'#5B6B62':'#CBD8CF')}}>
          <Ic.Grip size={14}/>{rearrange?'Done':'Rearrange'}
        </button>
        <button onClick={()=>setLight(l=>!l)} title="Toggle sidebar theme"
          style={{flex:1,display:'inline-flex',alignItems:'center',justifyContent:'center',gap:6,fontFamily:'inherit',fontSize:12,fontWeight:700,padding:'8px 10px',borderRadius:9,cursor:'pointer',
            border:'1px solid '+(light?'#E5EAE7':'rgba(255,255,255,.16)'),
            background:light?'#F8FAF9':'rgba(255,255,255,.05)',color:light?'#5B6B62':'#CBD8CF'}}>
          <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.9" strokeLinecap="round" strokeLinejoin="round">
            {light
              ? <React.Fragment><circle cx="12" cy="12" r="4"/><path d="M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4"/></React.Fragment>
              : <path d="M21 12.8A9 9 0 1 1 11.2 3 7 7 0 0 0 21 12.8z"/>}
          </svg>
          {light?'Dark':'Light'}
        </button>
      </div>

      <a href="#/ai" className="cm-ai-card" style={{textDecoration:'none'}}>
        <span className="cm-ai-live">LIVE</span>
        <div className="cm-ai-top">
          <span className="cm-ai-bot-wrap"><img className="cm-ai-bot-img" src="assets/robot-lotus.png" alt="AI assistant"/></span>
          <div style={{flex:1,minWidth:0}}>
            <div className="cm-ai-title">AI Assistant</div>
            <div className="cm-ai-tag">Smart Advisor</div>
          </div>
        </div>
        <div className="cm-ai-note">{billNote}</div>
        <div className="cm-ai-actions">
          <span className="cm-ai-btn">View Insights</span>
          <span className="cm-ai-chat" title="Ask AI"><Ic.Chat size={16}/></span>
        </div>
      </a>

      <div className="cm-side-foot">
        {/* Redundant user profile removed — identity lives in the top-right menu. */}
        <button className="cm-side-signout" onClick={signOut}>
          <Ic.Logout size={16}/><span>Sign Out</span>
        </button>
      </div>
    </aside>
  );
}
window.Sidebar = Sidebar;

/* ===================== Header ===================== */
function Header({ title, subtitle, action, user }) {
  // Resolve the signed-in user from the store (the prop is just an optional override).
  let cu = {}; try { cu = (window.CM && window.CM.S && window.CM.S.currentUser) || {}; } catch(e){}
  let isAdmin = false, gRole = ''; try { isAdmin = !!(window.CMAccess && window.CMAccess.isAdminUser && window.CMAccess.isAdminUser()); gRole = (window.CMAccess && window.CMAccess.getRole && window.CMAccess.getRole()) || ''; } catch(e){}
  const cap = s => s ? (s.charAt(0).toUpperCase()+s.slice(1)) : '';
  const uName = (user && user.name) || cu.name || (cu.email ? cu.email.split('@')[0].replace(/[._-]+/g,' ').replace(/\b\w/g,c=>c.toUpperCase()) : '') || 'Your account';
  const uEmail = cu.email || '';
  const uRole = (user && user.role) || (isAdmin ? 'Admin' : (cap(gRole) || cap(cu.plan) || 'Member'));
  const uInits = (uName||'?').split(' ').map(n=>n[0]).join('').slice(0,2).toUpperCase() || 'U';
  const [menu, setMenu] = React.useState(false);
  React.useEffect(() => {
    if (!menu) return;
    const close = () => setMenu(false);
    window.addEventListener('click', close);
    return () => window.removeEventListener('click', close);
  }, [menu]);
  const logout = () => { window.location.href = 'Login.html'; };
  return (
    <header className="cm-header">
      <div className="lede">
        <div className="t-h1" style={{fontSize:32}}>{title}</div>
        {subtitle && <p>{subtitle}</p>}
      </div>
      <div className="cm-header-right">
        <div className="cm-search">
          <Ic.Search size={18}/>
          <input placeholder="Search anything…"/>
        </div>
        <button className="cm-iconbtn"><Ic.Bell size={18}/><span className="dot cm-badge-count">1</span></button>
        <div style={{position:'relative'}} onClick={e=>e.stopPropagation()}>
          <div className="cm-user" style={{cursor:'pointer'}} onClick={()=>setMenu(m=>!m)}>
            <div className="cm-avatar" style={{display:'flex',alignItems:'center',justifyContent:'center',color:'var(--green-600)',fontWeight:800}}>
              {uInits}
            </div>
            <div>
              <div className="name">{uName}</div>
              <div className="role">{uRole}</div>
            </div>
            <Ic.Chevron size={16} style={{color:'var(--ink-400)', transition:'transform .2s', transform:menu?'rotate(180deg)':'none'}}/>
          </div>
          {menu && (
            <div className="cm-usermenu">
              <div className="cm-usermenu-head">
                <div className="name">{uName}</div>
                <div className="email">{uEmail||'—'}</div>
              </div>
              {isAdmin && <a href="/admin" className="cm-usermenu-item" onClick={(e)=>{ e.preventDefault(); setMenu(false); try{ sessionStorage.setItem('cm_admin_session_v1','1'); sessionStorage.setItem('cm_is_admin','1'); }catch(_){} window.location.href='/admin'; }}>
                <Ic.Shield size={16}/><span>Master Admin</span>
              </a>}
              <a href="#/settings" className="cm-usermenu-item" onClick={()=>setMenu(false)}>
                <Ic.Settings size={16}/><span>Settings</span>
              </a>
              <a href="/" className="cm-usermenu-item">
                <Ic.Home size={16}/><span>Marketing site</span>
              </a>
              <div className="cm-usermenu-sep"/>
              <button className="cm-usermenu-item danger" onClick={logout}>
                <Ic.Logout size={16}/><span>Log out</span>
              </button>
            </div>
          )}
        </div>
        {action && <button className="cm-btn cm-btn-primary" onClick={action.onClick}>{action.icon!==false && <Ic.Plus size={16}/>}{action.label}</button>}
      </div>
    </header>
  );
}
window.Header = Header;

/* Drag-to-reorder card stack. Wrap a vertical list of cards:
     <Reorderable pageKey="cc-statements" items={[{key:'a',node:<CardA/>}, ...]}/>
   Order persists to S.settings.layout[pageKey] (saved + cloud-synced), so it survives re-login.
   Only the grip handle (top-right) is draggable, so card contents stay fully interactive. */
function Reorderable({ pageKey, items }) {
  const CM = window.useStore ? window.useStore() : window.CM;
  const list = (items || []).filter(Boolean);
  const ids = list.map(it => it.key);
  let saved = []; try { saved = (CM.S.settings && CM.S.settings.layout && CM.S.settings.layout[pageKey]) || []; } catch (e) {}
  const order = saved.filter(k => ids.indexOf(k) >= 0).concat(ids.filter(k => saved.indexOf(k) < 0));
  const node = {}, label = {}; list.forEach(it => { node[it.key] = it.node; label[it.key] = it.label || 'Panel'; });
  const [drag, setDrag] = React.useState(null);
  const [over, setOver] = React.useState(null);
  const persist = (arr) => { try { CM.mutate(function(){ CM.S.settings = CM.S.settings || {}; CM.S.settings.layout = CM.S.settings.layout || {}; CM.S.settings.layout[pageKey] = arr; }); } catch (e) {} };
  const drop = (toIdx) => { if (drag == null || drag === toIdx) { setDrag(null); setOver(null); return; } const arr = order.slice(); const m = arr.splice(drag, 1)[0]; arr.splice(toIdx, 0, m); persist(arr); setDrag(null); setOver(null); };
  return (
    <React.Fragment>
      {order.map((k, idx) => {
        const dragging = drag === idx;
        const target = over === idx && drag != null && drag !== idx;
        return (
          <div key={k}
            onDragOver={(e) => { if (drag == null) return; e.preventDefault(); if (over !== idx) setOver(idx); }}
            onDrop={() => drop(idx)}
            style={{ marginBottom:20, borderRadius:16, padding:target?6:0, border:target?'2px dashed var(--green-600)':'2px solid transparent', background:target?'var(--mint-50)':'transparent', opacity:dragging?0.5:1, boxShadow:dragging?'0 18px 44px rgba(13,42,33,.24)':'none', transition:'opacity .15s, box-shadow .15s' }}>
            {/* Visible, full-width drag handle bar — grab anywhere on it to move the panel. */}
            <div draggable
              onDragStart={(e) => { setDrag(idx); try { e.dataTransfer.effectAllowed='move'; e.dataTransfer.setData('text/plain', k); } catch (_) {} }}
              onDragEnd={() => { setDrag(null); setOver(null); }}
              title="Drag to move this panel up or down"
              style={{ display:'flex', alignItems:'center', gap:9, padding:'8px 14px', marginBottom:10, background:'var(--mint-50)', border:'1px solid var(--mint-100)', borderRadius:12, cursor:'grab', userSelect:'none' }}>
              <span style={{ color:'var(--green-600)', fontSize:16, letterSpacing:'-3px', lineHeight:1 }}>⠿⠿</span>
              <span style={{ fontSize:11, fontWeight:800, letterSpacing:'.07em', textTransform:'uppercase', color:'var(--ink-600)' }}>{label[k]}</span>
              <span style={{ marginLeft:'auto', fontSize:10.5, color:'var(--green-600)', fontWeight:700 }}>↕ Drag to reorder</span>
            </div>
            {node[k]}
          </div>
        );
      })}
    </React.Fragment>
  );
}
window.Reorderable = Reorderable;

/* ===================== MetricCard ===================== */
function MetricCard({ label, labelColor='var(--ink-700)', value, delta, sub='from last month', art, icon, gauge }) {
  return (
    <div className={`cm-card cm-card-pad cm-metric ${art?'has-art':''}`}>
      {icon && <div className="m-icon">{icon}</div>}
      <div className="m-label" style={{color:labelColor}}>{label}</div>
      {gauge ? (
        <div className="cm-gauge-wrap">{gauge}</div>
      ) : (
        <>
          <div className="m-value num">{value}</div>
          <div className="m-foot">
            {delta && <span className={`cm-delta ${delta.dir}`}>
              {delta.dir==='pos'?<Ic.ArrowUp size={14}/>:<Ic.ArrowDown size={14}/>}
              <span className="num">{delta.text}</span>
            </span>}
            <span>{sub}</span>
          </div>
        </>
      )}
      {art && <div className="m-art">{art}</div>}
    </div>
  );
}
window.MetricCard = MetricCard;

/* ===================== ChartCard ===================== */
function ChartCard({ title, action, children, className='', pad=true, style }) {
  return (
    <div className={`cm-card ${pad?'cm-card-pad':''} ${className}`} style={style}>
      {(title || action) &&
        <div className="cm-card-head">
          <div className="title">{title}</div>
          {action}
        </div>}
      {children}
    </div>
  );
}
window.ChartCard = ChartCard;

/* ===================== InsightCard ===================== */
function InsightCard({ title, action, rows, total }) {
  return (
    <div className="cm-card cm-card-pad">
      {(title || action) &&
        <div className="cm-card-head"><div className="title">{title}</div>{action}</div>}
      <div>
        {rows.map((r,i)=>(
          <div className="cm-insight-row" key={i}>
            <div className="cm-ic-icon" style={{background:r.tint||'var(--mint-100)', color:r.iconColor||'var(--green-600)'}}>
              {r.icon}
            </div>
            <div className="cm-ic-body">
              <div className="cm-ic-title">{r.title}</div>
              {r.sub && <div className="cm-ic-sub">{r.sub}</div>}
            </div>
            {r.value && <div className="cm-ic-val num" style={{color:r.valueColor||'var(--ink-900)'}}>{r.value}</div>}
          </div>
        ))}
      </div>
      {total &&
        <div className="cm-insight-total">
          <span className="lbl">{total.label}</span>
          <span className="num" style={{fontWeight:800, color:total.color||'var(--green-400)'}}>{total.value}</span>
        </div>}
    </div>
  );
}
window.InsightCard = InsightCard;

/* ===================== DataTable ===================== */
function DataTable({ columns, rows, addRow, minWidth=820, rowStyle }) {
  return (
    <div>
      <div style={{overflowX:'auto'}}>
      <table className="cm-table" style={{minWidth}}>
        <thead><tr>
          {columns.map((c,i)=><th key={i} className={c.align==='right'?'right':''} style={{width:c.width}}>{c.header}</th>)}
        </tr></thead>
        <tbody>
          {rows.map((row,ri)=>(
            <tr key={ri} style={rowStyle ? rowStyle(row) : undefined}>
              {columns.map((c,ci)=>(
                <td key={ci} style={{textAlign:c.align==='right'?'right':'left'}}>{c.cell(row)}</td>
              ))}
            </tr>
          ))}
        </tbody>
      </table>
      </div>
      {addRow && <button className={`cm-add-row ${addRow.green?'green':''}`} style={{marginTop:14}}>
        <Ic.Plus size={16}/>{addRow.label}</button>}
    </div>
  );
}
/* helpers for common cells */
DataTable.Lead = ({ thumb, primary, sub }) => (
  <div className="cm-cell-lead">
    <div className="cm-cell-thumb">{thumb}</div>
    <div><div className="cm-cell-primary">{primary}</div>{sub && <div className="cm-cell-sub">{sub}</div>}</div>
  </div>
);
DataTable.Stack = ({ strong, meta, color }) => (
  <div><div className="cm-cell-strong" style={color?{color}:null}>{strong}</div>{meta && <div className="cm-cell-meta">{meta}</div>}</div>
);
window.DataTable = DataTable;

/* ===================== FinancialHealthCard ===================== */
function FinancialHealthCard({ title='Assets vs Liabilities Ratio', ratio, status='Good',
                              statusColor='var(--green-400)', position=0.75, ticks=['0','1','2','3','4+'], note }) {
  return (
    <div className="cm-card cm-card-pad cm-health">
      {title && <div className="t-h3" style={{marginBottom:12}}>{title}</div>}
      <div className="h-top">
        <span className="h-ratio num">{ratio}</span>
        <span style={{color:statusColor, fontWeight:700, fontSize:15}}>{status}</span>
      </div>
      <div className="h-scale">
        <div className="h-marker" style={{left:`${position*100}%`}}/>
      </div>
      <div className="h-ticks num">{ticks.map((t,i)=><span key={i}>{t}</span>)}</div>
      {note && <div className="h-note">{note}</div>}
    </div>
  );
}
window.FinancialHealthCard = FinancialHealthCard;

/* convenience: Legend used beside DonutChart */
function Legend({ items }) {
  return (
    <div className="cm-legend">
      {items.map((it,i)=>(
        <div className="cm-legend-row" key={i}>
          <span className="cm-legend-dot" style={{background:it.color}}/>
          <span className="lg-label">{it.label}</span>
          {it.pct!=null && <span className="lg-pct num">{it.pct}</span>}
          {it.value!=null && <span className="lg-val num">{it.value}</span>}
        </div>
      ))}
    </div>
  );
}
window.Legend = Legend;

Object.assign(window, { Sidebar, Header, MetricCard, ChartCard, InsightCard, DataTable, FinancialHealthCard, Legend });
