/** * 회사 기본정보 화면 - 컴포넌트 렌더링 비율 정밀 분석 * * 사용법: 브라우저에서 회사 기본정보 화면을 연 상태에서 * F12 → Console 탭 → 이 스크립트 전체를 붙여넣고 Enter */ (function analyzeLayout() { const results = { part1: null, part2: null }; // ========== Part 1: DesktopCanvasRenderer 구조 확인 ========== const runtime = document.querySelector('[data-screen-runtime="true"]'); if (!runtime) { console.warn('⚠️ [data-screen-runtime="true"] 요소를 찾을 수 없습니다.'); console.log('대안: ScreenModal 기반 렌더링이거나 다른 구조일 수 있습니다.'); results.part1 = { error: 'Runtime not found' }; } else { const rect = runtime.getBoundingClientRect(); const inner = runtime.firstElementChild; results.part1 = { runtimeContainer: { width: rect.width, height: rect.height }, innerDiv: null, components: [], }; if (inner) { const style = inner.style; results.part1.innerDiv = { width: style.width, height: style.height, transform: style.transform, transformOrigin: style.transformOrigin, position: style.position, }; const comps = inner.querySelectorAll('[data-component-id]'); comps.forEach((comp) => { const s = comp.style; const r = comp.getBoundingClientRect(); results.part1.components.push({ type: comp.getAttribute('data-component-type'), id: comp.getAttribute('data-component-id'), stylePos: `(${s.left}, ${s.top})`, styleSize: `${s.width} x ${s.height}`, renderedSize: `${Math.round(r.width)} x ${Math.round(r.height)}`, }); }); } else { // ResponsiveGridRenderer (flex 기반) 구조일 수 있음 - 행 단위로 확인 const rows = runtime.querySelectorAll(':scope > div'); results.part1.rows = []; rows.forEach((row, i) => { const children = row.children; const rowData = { rowIndex: i, childCount: children.length, children: [] }; Array.from(children).forEach((child, j) => { const cs = window.getComputedStyle(child); const r = child.getBoundingClientRect(); rowData.children.push({ type: child.getAttribute('data-component-type') || 'unknown', width: Math.round(r.width), height: Math.round(r.height), flexGrow: cs.flexGrow, flexBasis: cs.flexBasis, }); }); results.part1.rows.push(rowData); }); } } // ========== Part 2: wrapper vs child 크기 확인 ========== const comps = document.querySelectorAll('[data-component-id]'); results.part2 = []; comps.forEach((comp) => { const type = comp.getAttribute('data-component-type'); const child = comp.firstElementChild; if (child) { const childRect = child.getBoundingClientRect(); const compRect = comp.getBoundingClientRect(); results.part2.push({ type, wrapper: `${Math.round(compRect.width)}x${Math.round(compRect.height)}`, child: `${Math.round(childRect.width)}x${Math.round(childRect.height)}`, overflow: childRect.width > compRect.width ? 'YES' : 'no', }); } }); // ========== 결과 출력 ========== console.log('========== Part 1: Runtime 구조 =========='); console.log(JSON.stringify(results.part1, null, 2)); console.log('\n========== Part 2: Wrapper vs Child =========='); results.part2.forEach((r) => { console.log(`${r.type}: wrapper=${r.wrapper}, child=${r.child}, overflow=${r.overflow}`); }); // scale 값 추출 (transform에서) if (results.part1?.innerDiv?.transform) { const m = results.part1.innerDiv.transform.match(/scale\(([^)]+)\)/); if (m) console.log('\n📐 Scale 값:', m[1]); } return results; })();