// App.jsx — tab routing, tweaks, detail-tab management. const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "mainLayout": "히어로형", "trendDefault": "부문별" }/*EDITMODE-END*/; const BASE_TABS = [ { id:'main', kind:'base', label:'종합', icon:'gauge' }, { id:'stock', kind:'base', label:'주식', icon:'trendUp', badge:STOCKS.length }, { id:'bond', kind:'base', label:'채권', icon:'bond', badge:BONDS.length }, { id:'report', kind:'base', label:'보고서', icon:'fileText' }, ]; function App() { const [t, setTweak] = useTweaks(TWEAK_DEFAULTS); const [details, setDetails] = React.useState([]); // [{id,item}] const [active, setActive] = React.useState('main'); const openDetail = React.useCallback((item)=>{ const id = 'd:'+item.isin; setDetails(ds => ds.some(d=>d.id===id) ? ds : [...ds, { id, item }]); setActive(id); },[]); const closeTab = React.useCallback((id)=>{ setDetails(ds=>{ const idx=ds.findIndex(d=>d.id===id); const next=ds.filter(d=>d.id!==id); setActive(cur=>{ if(cur!==id) return cur; const fallback = next[idx]||next[idx-1]; return fallback?fallback.id:'bond'; }); return next; }); },[]); const tabs = [...BASE_TABS, ...details.map(d=>({ id:d.id, kind:'detail', label:d.item.name, icon:d.item.asset==='주식'?'trendUp':'bond' }))]; const activeDetail = details.find(d=>d.id===active); let content; if(active==='main') content =
; else if(active==='stock') content = ; else if(active==='bond') content = ; else if(active==='report') content = ; else if(activeDetail) content = ; else content =
; return ( {content} setTweak('mainLayout',v)}/> setTweak('trendDefault',v)}/> ); } ReactDOM.createRoot(document.getElementById('root')).render();