// Shell.jsx — IBK 리스크 인사이트 chrome: brand header + tab bar.
function IBKBrand() {
return (
{/* 배경 딤 */}
{/* 패널 */}
{/* 검색 입력 */}
setQ(e.target.value)}
placeholder="종목명·티커·ISIN 검색..."
style={{ flex:1, border:0, outline:'none', fontFamily:T.font, fontWeight:500,
fontSize:14.5, color:T.c900, background:'transparent' }} />
{q && }
ESC
{/* 결과 */}
{!q && (
종목명, 티커, ISIN으로 검색하세요
)}
{q && total === 0 && (
"{q}" 검색 결과가 없어요
)}
{results.stocks.length > 0 && <>
주식 ({results.stocks.length})
{results.stocks.map(s =>
selectStock(s)} />)}
>}
{results.bonds.length > 0 && <>
채권 ({results.bonds.length})
{results.bonds.map(b => selectBond(b)} />)}
>}
);
}
function Header({ onSearch }) {
const [open, setOpen] = React.useState(false);
// ⌘K / Ctrl+K 단축키
React.useEffect(() => {
const h = (e) => { if ((e.metaKey || e.ctrlKey) && e.key === 'k') { e.preventDefault(); setOpen(true); } };
window.addEventListener('keydown', h);
return () => window.removeEventListener('keydown', h);
}, []);
return (
<>
{open && setOpen(false)} />}
setOpen(true)} style={{ display: 'flex', alignItems: 'center', gap: 8, background: T.c100, border: '1px solid ' + T.line, borderRadius: 9, padding: '7px 12px', width: 248, cursor: 'pointer' }}>
종목명·티커·ISIN 검색
⌘K
실시간
>);
}
function TabBar({ tabs, active, onSelect, onClose }) {
return (
{tabs.map((t) => {const on = t.id === active;const closeable = t.kind === 'detail';
return (
);
})}
);
}
function Shell({ tabs, active, onSelect, onClose, onSearch, children }) {
return (
{children}
);
}
Object.assign(window, { Shell });