IMPROVEMENT Phase A~D + Phase 2 전체 반영

## IMPROVEMENT (Phase A~D)
- A-1: 4단계 Sonnet 디자인 조정 (_adjust_design) — CSS 변수 cascade
- A-2: 5단계 HTML 전문 프롬프트 전달
- A-3: shrink/expand 하드코딩 제거 → Sonnet target_ratio 기반
- A-4: rewrite action 구현
- A-5: overflow: visible (area 레벨 텍스트 잘림 방지)
- A-6: object-fit cover → contain (이미지 crop 방지)
- A-7: table-layout: fixed
- A-8: container query 폰트 스케일링
- B-1: details-block 템플릿 신규 (CSS 변수만 사용)
- B-2: 인쇄 시 details 자동 펼침 JS
- B-3: catalog에 details-block 등록
- B-4/B-5: images[]/tables[] 상세 판단 + fallback 3곳 동기화
- B-8: fallback card-grid → topic-header + char_guide 제거
- C-1: CLAUDE.md gradient 원칙 완화
- C-3: border-radius 9개 파일 var(--radius) 통일
- C-4: box-shadow 2레벨 → 1레벨
- D-0: 이미지 경로 입력 UI + API base_path
- D-1: Pillow 의존성 + image_utils.py
- D-2~D-4: 이미지 비율/축소방지 프롬프트 전달
- D-5: HTML에 이미지 base64 삽입

## Phase 2 (다른 Claude 작업)
- P2-A: FAISS 블록 검색 (bge-m3, 46개 블록)
- P2-B: SVG N개 자동 배치 (svg_calculator.py)
- P2-C: Opus 블록 추천 (Kei API 경유)
- P2-D: 5단계 재검토 루프 강화 (MAX_REVIEW_ROUNDS=2)
- P2-E: details-block fallback 연동

## 버그 수정 (BF-8~10)
- BF-8: 컨테이너 예산 기반 블록 배치
- BF-9: grid와 Sonnet 역할 분리
- BF-10: catalog mtime 캐시 자동 갱신

## 블록 라이브러리
- 46개 블록 (6 카테고리), catalog/BLOCK_SLOTS/INDEX 동기화
- 구 블록 제거 (quote-block, card-grid, comparison)
- 13개 _legacy 블록 보존

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-25 18:40:20 +09:00
parent 91d5779a16
commit 9bd9dad9ac
220 changed files with 19115 additions and 667 deletions

401
docs/test-bim-page-v2.html Normal file
View File

@@ -0,0 +1,401 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>2-1_02 건설정보모델링(BIM) — 레이어 분리 v2</title>
<style>
@import url('https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/variable/pretendardvariable-dynamic-subset.min.css');
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: 'Pretendard Variable', 'Noto Sans KR', sans-serif;
background: #e8ecf0;
display: flex;
justify-content: center;
padding: 20px;
color: #000;
}
.frame { width: 920px; background: #fff; }
/* ═══ 1. 배경 헤더 + 타이틀 오버레이 ═══ */
.header {
position: relative;
width: 100%;
height: 500px;
overflow: hidden;
}
.header img { width: 100%; height: 100%; object-fit: cover; }
.header-text {
position: absolute;
bottom: 40px;
left: 89px;
z-index: 5;
}
.header-text .en { font-size: 15px; font-weight: 400; color: #fff; opacity: 0.85; }
.header-text .ko { font-size: 35px; font-weight: 700; color: #fff; margin-top: 4px; }
.breadcrumb {
position: absolute;
top: 18px; left: 89px;
font-size: 13px; color: rgba(255,255,255,0.7);
z-index: 5;
}
.breadcrumb span { margin: 0 6px; color: rgba(255,255,255,0.5); }
.close-x {
position: absolute;
top: 18px; right: 20px;
font-size: 22px; color: #fff;
cursor: pointer; z-index: 5;
}
/* ═══ 2. 꼭지 제목+설명 ═══ */
.topic { padding: 28px 89px 12px; }
.topic-row { display: flex; gap: 20px; margin-bottom: 18px; }
.topic-title {
width: 240px; flex-shrink: 0;
font-size: 24px; font-weight: 700; color: #004cbe;
line-height: 1.4; word-break: keep-all;
}
.topic-desc {
flex: 1;
font-size: 16px; color: #000; line-height: 1.7; word-break: keep-all;
}
/* ═══ 3. 이미지 그리드 2열 ═══ */
.img-grid { display: flex; gap: 0; padding: 0; }
.img-grid img { flex: 1; height: 354px; object-fit: cover; }
/* ═══ 4. 산맥 시각화 ═══ */
.mountain img { width: 100%; }
/* ═══ 5. 비교 박스 (이미지 배경 + HTML 텍스트) ═══ */
.compare-boxes {
padding: 25px 89px;
display: flex;
gap: 12px;
align-items: center;
justify-content: center;
}
.cbox {
position: relative;
width: 327px; height: 116px;
border-radius: 10px;
overflow: hidden;
}
.cbox img { width: 100%; height: 100%; object-fit: cover; }
.cbox-text {
position: absolute; inset: 0;
display: flex; flex-direction: column;
align-items: center; justify-content: center;
color: #fff; text-align: center;
z-index: 2;
}
.cbox-text .label { font-size: 20px; font-weight: 700; }
.cbox-text .sub { font-size: 12px; opacity: 0.85; margin-top: 4px; }
.vs-badge {
background: #fff;
border-radius: 8px;
padding: 8px 18px;
font-size: 20px; font-weight: 700; color: #006eff;
flex-shrink: 0;
}
/* ═══ 6. 비교 테이블 (HTML) ═══ */
.compare-table { padding: 10px 89px 20px; }
.compare-table table {
width: 100%;
border-collapse: collapse;
font-size: 13px;
line-height: 1.6;
}
.compare-table thead th {
padding: 10px 12px;
font-weight: 700;
font-size: 15px;
}
.compare-table thead th:first-child { color: #6bcdff; }
.compare-table thead th:nth-child(2) {
background: linear-gradient(135deg, #006eff, #00aaff);
color: #fff; border-radius: 20px;
text-align: center; width: 100px;
}
.compare-table thead th:last-child { color: #006eff; text-align: right; }
.compare-table tbody td {
padding: 8px 12px;
border-bottom: 1px solid #f0f0f0;
vertical-align: top;
}
.compare-table tbody td:first-child { color: #333; }
.compare-table tbody td:nth-child(2) {
text-align: center;
font-weight: 700;
color: #333;
background: #f8f9fb;
}
.compare-table tbody td:last-child { text-align: right; color: #333; }
.compare-table tbody tr:nth-child(even) td { background: #fafbfc; }
.compare-table tbody tr:nth-child(even) td:nth-child(2) { background: #f0f2f5; }
/* ═══ 7. 원형 라벨 (CSS + HTML) ═══ */
.circle-label-section {
display: flex; justify-content: center;
padding: 25px 0 15px;
}
.circle-outer {
width: 190px; height: 190px;
border-radius: 50%;
background: linear-gradient(180deg, #3db8ff 0%, #006aff 100%);
box-shadow: 0 0 30px rgba(0, 106, 255, 0.25), 0 0 60px rgba(0, 106, 255, 0.1);
display: flex;
align-items: center; justify-content: center;
position: relative;
}
.circle-inner {
width: 170px; height: 170px;
border-radius: 50%;
background: linear-gradient(180deg, #4dc4ff 0%, #0080ff 100%);
display: flex;
flex-direction: column;
align-items: center; justify-content: center;
color: #fff;
text-align: center;
}
.circle-inner .main { font-size: 20px; font-weight: 700; line-height: 1.4; }
/* ═══ 8. 카드 3열 (HTML + 개별 이미지) ═══ */
.cards-section { padding: 10px 89px 40px; }
.cards-row {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 16px;
}
.card {
background: #fff;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0,0,0,0.06);
overflow: hidden;
display: flex;
flex-direction: column;
}
.card-img {
width: 100%;
height: 160px;
object-fit: contain;
background: #f8f9fb;
padding: 10px;
}
.card-body { padding: 16px; }
.card-stage {
font-size: 14px; font-weight: 700;
text-decoration: underline;
text-underline-offset: 3px;
margin-bottom: 2px;
}
.card-stage-en {
font-size: 12px; font-weight: 400; color: #666;
margin-bottom: 10px;
}
.card-divider {
width: 100%; height: 1px;
background: #000; margin-bottom: 10px;
}
.card-body ul {
list-style: disc;
padding-left: 18px;
font-size: 13px;
line-height: 1.7;
color: #000;
}
.card-body li { margin-bottom: 3px; }
.card-design .card-stage { color: #00aaff; }
.card-construction .card-stage { color: #006aff; }
.card-maintenance .card-stage { color: #004cbe; }
</style>
</head>
<body>
<div class="frame">
<!-- 1. 배경 헤더 + 타이틀 -->
<div class="header">
<img src="figma-assets/bg_header.png" alt="">
<div class="breadcrumb">건설산업에서의 디지털전환 <span></span> Building Information Modeling</div>
<div class="close-x"></div>
<div class="header-text">
<div class="en">Building Information Modeling</div>
<div class="ko">건설정보모델링(BIM)</div>
</div>
</div>
<!-- 2. 꼭지 -->
<div class="topic">
<div class="topic-row">
<div class="topic-title">단순 BIM의 적용이<br>D/X가 아닙니다</div>
<div class="topic-desc">BIM은 건설산업의 디지털전환을 수행하는 과정에서 가장 기초가 되는 일부분임을 인지하는 것이 매우 중요합니다.</div>
</div>
<div class="topic-row">
<div class="topic-title">건설산업에서의 BIM</div>
<div class="topic-desc">BIM은 설계, 시공, 유지관리 단계에서의 정보를 통합하고 협업을 촉진하여 인프라 건설 전 생애주기 과정의 효율성을 향상시킵니다.</div>
</div>
</div>
<!-- 3. 이미지 그리드 -->
<div class="img-grid">
<img src="figma-assets/image_grid_left.png" alt="">
<img src="figma-assets/image_grid_right.png" alt="">
</div>
<!-- 4. 산맥 -->
<div class="mountain">
<img src="figma-assets/mountain_viz.png" alt="">
</div>
<!-- 5. 비교 박스 -->
<div class="compare-boxes">
<div class="cbox">
<img src="figma-assets/compare_box_left.png" alt="">
<div class="cbox-text">
<div class="label">D/X</div>
<div class="sub">디지털 기술을 활용한<br>협업 프로세스</div>
</div>
</div>
<div class="vs-badge">VS</div>
<div class="cbox">
<img src="figma-assets/compare_box_right.png" alt="">
<div class="cbox-text">
<div class="label">BIM</div>
<div class="sub">시설물의 전 생애주기 동안<br>정보의 생성 및 관리</div>
</div>
</div>
</div>
<!-- 6. 비교 테이블 (HTML) -->
<div class="compare-table">
<table>
<thead>
<tr>
<th>BIM</th>
<th>VS</th>
<th>D/X</th>
</tr>
</thead>
<tbody>
<tr>
<td>• Only 3D</td>
<td>BIM · D/X</td>
<td>• BIM ≪ D/X (ENG. + Management 포함)</td>
</tr>
<tr>
<td>• 모델 제작용 상용 S/W<br>(Civil 3D, Revit, Navisworks, Autocad)</td>
<td>S/W</td>
<td>• 제작 및 운영(상용 + 전용 40~80개)<br>[Rhino, Sketchup, Blender...] + [EG-BIM 등]</td>
</tr>
<tr>
<td>• 기존 2D 설계방식 유지</td>
<td>프로세스</td>
<td>• 근본적 문제의식을 통한 개선</td>
</tr>
<tr>
<td>• 3D 모델 중심<br>• 기존 성과품 유지</td>
<td>성과물</td>
<td>• 공학 정보 및 콘텐츠 연계에 집중<br>• 도면, 수량, 시공계획 등 일식</td>
</tr>
<tr>
<td>• 3D 모델에 의한 일반적 이해 향상</td>
<td>활용</td>
<td>• 설계/시공의 혁신(개념의 재정립)</td>
</tr>
<tr>
<td>• (설계/시공/운영) 분야별 단절</td>
<td>확장성</td>
<td>• 전 생애주기 활용 시스템</td>
</tr>
<tr>
<td>• 단순화(오류) - 수동적/집단적 동질화</td>
<td>수행개념</td>
<td>• 구체화(복잡) - 적극/구체적 실현 방안</td>
</tr>
<tr>
<td>• 소극적, 상용 기술에 의존</td>
<td>CIVIL + IT</td>
<td>• 적극적, 주체적인 기술 접목/융합</td>
</tr>
<tr>
<td>• S/W 제작사 판매 정책에 의존</td>
<td>주체</td>
<td>• 자체 수행능력 - 지속가능성 확보</td>
</tr>
<tr>
<td>• 평준화, 국내 중심</td>
<td>발주처</td>
<td>• 차별화 및 경쟁력 확보, 해외 진출</td>
</tr>
<tr>
<td>• 소규모 BIM팀 운영 + 단순교육에 집중</td>
<td>설계사</td>
<td>• IT + CIVIL ENG 220명 운영 + 기술 개발</td>
</tr>
<tr>
<td>• 국내 토목 소극적/ 해외 토목증가</td>
<td>시공사</td>
<td>• 분야 확장 모델 및 시스템</td>
</tr>
</tbody>
</table>
</div>
<!-- 7. 원형 라벨 (CSS) -->
<div class="circle-label-section">
<div class="circle-outer">
<div class="circle-inner">
<div class="main">단계별<br>BIM의 활용</div>
</div>
</div>
</div>
<!-- 8. 카드 3열 (HTML + 개별 이미지) -->
<div class="cards-section">
<div class="cards-row">
<div class="card card-design">
<img class="card-img" src="figma-assets/card_img_design.png" alt="설계">
<div class="card-body">
<div class="card-stage">설계단계</div>
<div class="card-stage-en">Design Stage</div>
<div class="card-divider"></div>
<ul>
<li>고도화된 BIM 구현</li>
<li>최첨단 디지털트윈</li>
<li>시뮬레이션 분석 & 성능평가</li>
<li>지속가능한 인프라개발</li>
</ul>
</div>
</div>
<div class="card card-construction">
<img class="card-img" src="figma-assets/card_img_construction.png" alt="시공">
<div class="card-body">
<div class="card-stage">시공 단계</div>
<div class="card-stage-en">Construction Stage</div>
<div class="card-divider"></div>
<ul>
<li>향상된 건설 계획과 공정 순서 관리</li>
<li>Big Room 등 환경을 통한 협업 및 조정</li>
<li>정확한 수량산출서와 비용 산정</li>
</ul>
</div>
</div>
<div class="card card-maintenance">
<img class="card-img" src="figma-assets/card_img_maintenance.png" alt="유지관리">
<div class="card-body">
<div class="card-stage">유지관리 단계</div>
<div class="card-stage-en">Maintenance Stage</div>
<div class="card-divider"></div>
<ul>
<li>자산 정보 및 데이터 관리</li>
<li>예측 기반 유지보수 및 생애주기 분석</li>
<li>효율적인 시설 운영 및 지속가능한 관리</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</body>
</html>