export const NODE_IDS = { DATA: 'data', GATE: 'gate-hygiene', FOREIGN: 'score-foreign-buy', VOLUME: 'score-volume-surge', MOMENTUM: 'score-momentum', HIGH52W: 'score-high52w', RS: 'score-rs-rating', MA: 'score-ma-alignment', VCP: 'score-vcp-lite', AI_NEWS: 'score-ai-news', COMBINE: 'combine', RESULT: 'result', }; export const NODE_KIND_MAP = { [NODE_IDS.DATA]: 'data', [NODE_IDS.GATE]: 'gate', [NODE_IDS.FOREIGN]: 'score', [NODE_IDS.VOLUME]: 'score', [NODE_IDS.MOMENTUM]: 'score', [NODE_IDS.HIGH52W]: 'score', [NODE_IDS.RS]: 'score', [NODE_IDS.MA]: 'score', [NODE_IDS.VCP]: 'score', [NODE_IDS.AI_NEWS]: 'score', [NODE_IDS.COMBINE]: 'combine', [NODE_IDS.RESULT]: 'result', }; // 캔버스 노드 ID → 백엔드 score node name (registry 키) export const SCORE_NODE_NAME_MAP = { [NODE_IDS.FOREIGN]: 'foreign_buy', [NODE_IDS.VOLUME]: 'volume_surge', [NODE_IDS.MOMENTUM]: 'momentum', [NODE_IDS.HIGH52W]: 'high52w', [NODE_IDS.RS]: 'rs_rating', [NODE_IDS.MA]: 'ma_alignment', [NODE_IDS.VCP]: 'vcp_lite', [NODE_IDS.AI_NEWS]: 'ai_news', }; // 4단 layout: DATA → GATE → (점수 7개 세로) → COMBINE → RESULT export const INITIAL_NODE_POSITIONS = { [NODE_IDS.DATA]: { x: 40, y: 280 }, [NODE_IDS.GATE]: { x: 240, y: 280 }, [NODE_IDS.FOREIGN]: { x: 480, y: 0 }, [NODE_IDS.VOLUME]: { x: 480, y: 90 }, [NODE_IDS.MOMENTUM]: { x: 480, y: 180 }, [NODE_IDS.HIGH52W]: { x: 480, y: 270 }, [NODE_IDS.RS]: { x: 480, y: 360 }, [NODE_IDS.MA]: { x: 480, y: 450 }, [NODE_IDS.VCP]: { x: 480, y: 540 }, [NODE_IDS.AI_NEWS]: { x: 480, y: 630 }, [NODE_IDS.COMBINE]: { x: 800, y: 280 }, [NODE_IDS.RESULT]: { x: 1080, y: 280 }, }; const SCORE_KEYS = ['FOREIGN','VOLUME','MOMENTUM','HIGH52W','RS','MA','VCP','AI_NEWS']; export const EDGES = [ { id: 'e-data-gate', source: NODE_IDS.DATA, target: NODE_IDS.GATE }, ...SCORE_KEYS.map((k) => ({ id: `e-gate-${k.toLowerCase()}`, source: NODE_IDS.GATE, target: NODE_IDS[k], })), ...SCORE_KEYS.map((k) => ({ id: `e-${k.toLowerCase()}-combine`, source: NODE_IDS[k], target: NODE_IDS.COMBINE, })), { id: 'e-combine-result', source: NODE_IDS.COMBINE, target: NODE_IDS.RESULT }, ]; export const SCORE_NODE_LABEL = { [NODE_IDS.FOREIGN]: { icon: '🌏', title: '외국인 매수' }, [NODE_IDS.VOLUME]: { icon: '📊', title: '거래량 급증' }, [NODE_IDS.MOMENTUM]: { icon: '🚀', title: '모멘텀' }, [NODE_IDS.HIGH52W]: { icon: '🔝', title: '52주 고가' }, [NODE_IDS.RS]: { icon: '💪', title: 'RS Rating' }, [NODE_IDS.MA]: { icon: '📈', title: '이평선 정렬' }, [NODE_IDS.VCP]: { icon: '🌀', title: 'VCP-lite' }, [NODE_IDS.AI_NEWS]: { icon: '🤖', title: 'AI 뉴스' }, };