/** * 다이어그램 기하 스냅샷 → 벡터 SVG 문자열 (순수 함수, DOM 무의존). * * `core/text.ts`(모델→Markdown)와 같은 "산출물 합성" 계열이되, 입력이 논리 모델이 아니라 * 화면에서 측정한 기하 스냅샷(`DiagramGeometry`)이다. CSS 레이아웃 규칙을 일절 재현하지 않고 * 측정된 좌표·텍스트·색을 SVG primitive(///)로 직렬화만 한다 * → CSS↔SVG 드리프트 0, DOM 무의존이라 단위 테스트 가능. 측정(DOM 의존)은 view 레이어 담당. * * 모든 좌표는 flow 좌표계(절대)다 — 측정 레이어가 그렇게 환산해 넘긴다. */ /** 텍스트 한 조각 — 측정된 위치에 같은 폰트로 그린다(위치가 실측이라 폰트 메트릭 재계산 불요). */ export interface SvgTextFrag { x: number; /** 수직 중앙 y. dominant-baseline=central로 그려 baseline 추정을 피한다. */ y: number; text: string; fill: string; fontSize: number; fontFamily?: string; fontWeight?: number | string; /** 'italic' 등. 미지정이면 normal. */ fontStyle?: string; /** 가로 정렬 기준점. 기본 start(좌측). */ anchor?: 'start' | 'middle' | 'end'; } /** 박스 내부 가로 구분선 (행/구획 경계). 좌표는 절대 flow 좌표. */ export interface SvgHLine { x1: number; x2: number; y: number; stroke: string; strokeWidth?: number; } /** 모서리별 둥글기 — 헤더(상단만)·그룹 라벨(비대칭) 같은 4코너 비대칭 radius 표현용. */ export interface Corners { tl: number; tr: number; br: number; bl: number; } /** 박스형 노드(엔티티·그룹·노트) 기하. */ export interface SvgBox { x: number; y: number; w: number; h: number; fill: string; stroke: string; strokeWidth?: number; /** 점선 그룹 등. SVG stroke-dasharray 값(예: '6 4'). */ strokeDasharray?: string; /** 단일 값(4코너 동일) 또는 코너별. 비대칭이면 rect가 아닌 rounded path로 그린다. */ radius?: number | Corners; /** 반투명 그룹 배경 등. */ opacity?: number; texts: SvgTextFrag[]; lines?: SvgHLine[]; /** * 라인 아이콘(키 마커·임베드 글리프 등) — 측정 레이어가 좌표·색·viewBox를 박은 완결 * 마크업 문자열. 신뢰된 내부 데이터(EmIcon)라 이스케이프 없이 그대로 삽입한다. */ icons?: string[]; } /** 엣지(연관선·노트연결선) 기하. d는 이미 렌더된 path를 그대로 차용. */ export interface SvgEdge { d: string; stroke: string; strokeWidth: number; /** 점선 노트연결선 등. */ strokeDasharray?: string; labels: SvgTextFrag[]; /** * 끝점 표기 마커(까마귀발·선택성 원·컴포지션 마름모·네비 화살표) — 측정 레이어가 좌표·색을 박은 * 완결 // 마크업 문자열. 신뢰된 내부 데이터(AssociationEdge)라 그대로 삽입. */ markers?: string[]; } /** 화면 측정으로 만든 다이어그램 전체 기하 스냅샷 (export 전용 뷰모델). */ export interface DiagramGeometry { viewBox: { x: number; y: number; w: number; h: number; }; /** 캔버스 배경색(테마 반영). 미지정이면 배경 rect를 그리지 않음(투명). */ background?: string; /** Z-order 하위부터: 그룹 → 엣지 → 엔티티/노트 순으로 합성한다. */ groups: SvgBox[]; edges: SvgEdge[]; entities: SvgBox[]; notes: SvgBox[]; } /** * 기하 스냅샷을 완결된 SVG 문서 문자열로 합성한다. * Z-order(캔버스와 동일): 배경 → 그룹 → 엣지 → 엔티티 → 노트. */ export declare function renderDiagramSvg(geo: DiagramGeometry): string;