Files
Figma-to-HTML/templates_staging/issues-paired-rows.html.j2
kyeongmin beb5fd0c61 Figma-to-HTML 에이전트 초기 커밋
- 10단계 변환 프로세스 (PROCESS.md)
- 수학 공식 레퍼런스 (MATH.md, gradient_math.py)
- CSS 보정 규칙 R1~R16 (RULES.md)
- 작업 규율 7개 규칙 (PROCESS-CONTROL.md)
- 8개 Figma 프레임 1:1 HTML 변환물 (block-tests/)
- 8개 Jinja2 템플릿 staging (templates_staging/)
- 변환 완료 도서관 + 디자인 인사이트 (blocks_index.md)
- 사용법 가이드 (README.md)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 11:16:33 +09:00

186 lines
5.7 KiB
Django/Jinja

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>{{ title|default("issues-paired-rows") }}</title>
<!--
Pattern: issues-paired-rows
Origin: 45:19 / Frame 1171281194
구조: flex column (텍스트 양에 따라 박스 유동 조절)
pill: 고정 크기 (25.5% of row width), 박스 border에 걸침 (negative margin)
pill 이미지: R16 (overflow:hidden으로 한쪽 곡선만 보임)
bottom pill: rotate(180) + 이미지 배치 반전
텍스트: pill과 분리된 flex item → 절대 가려지지 않음
-->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@500;700&display=swap" rel="stylesheet">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
:root {
--block-w: {{ block_w|default(1280) }}px;
--border-color: {{ border_color|default("#60a451") }};
--box-bg: {{ box_bg|default("rgba(250,237,203,0.15)") }};
--text-color: {{ text_color|default("#0c271e") }};
--pill-text-color: {{ pill_text_color|default("#ffffff") }};
--pill-width: {{ pill_width|default("25.5%") }};
--pill-height: {{ pill_height|default("4.1rem") }};
--pill-overlap: {{ pill_overlap|default("0.8rem") }};
--row-gap: {{ row_gap|default("0.4rem") }};
--font-body: {{ font_body|default("1.05rem") }};
--font-pill: {{ font_pill|default("1.2rem") }};
--divider-color: {{ divider_color|default("rgba(96,164,81,0.4)") }};
}
body {
font-family: 'Noto Sans KR', sans-serif;
background: #e8ecf0;
display: flex; justify-content: center; align-items: center;
min-height: 100vh; padding: 20px;
word-break: keep-all;
}
.block {
width: var(--block-w);
background: #fff;
box-shadow: 0 4px 20px rgba(0,0,0,.15);
padding: 1.2rem 1.8rem;
}
.header { display: flex; align-items: center; gap: 0.6rem; margin-bottom: 0.8rem; }
.header-icon { width: 1.8rem; height: 1.8rem; flex: none; }
.header-icon img { width: 100%; height: 100%; object-fit: contain; }
.header-title {
font-weight: 700; font-size: 1.6rem;
background-image: linear-gradient(180deg, #cc5200 0%, #883700 100%);
-webkit-background-clip: text; background-clip: text; color: transparent;
text-shadow: 0 0 4px rgba(50,44,30,0.4);
}
.rows { display: flex; flex-direction: column; gap: var(--row-gap); }
/* issue-row: 하나의 행 (border 박스) */
.issue-row {
border: 2px solid var(--border-color);
border-radius: 1rem;
background: var(--box-bg);
display: flex;
flex-direction: column;
}
/* pill-row: 좌/우 pill 2개 배치 */
.pill-row {
display: flex;
justify-content: space-between;
}
/* pill이 박스 border 위/아래로 걸침 */
.pill-row.top { margin-top: calc(-1 * var(--pill-overlap)); }
.pill-row.bottom { margin-bottom: calc(-1 * var(--pill-overlap)); }
/* 개별 pill */
.pill-cell {
position: relative;
width: var(--pill-width);
height: var(--pill-height);
overflow: hidden;
flex: none;
}
/* R16: 이미지 프레임 배치 — 한쪽 곡선만 보임 */
.pill-cell.left img {
position: absolute;
top: 0; height: 100%;
left: -45.3%;
width: 145.3%;
}
.pill-cell.right img {
position: absolute;
top: 0; height: 100%;
left: 0;
width: 151.25%;
}
/* bottom pill: rotate(180) + 이미지 배치 반전 */
.pill-row.bottom .pill-cell { transform: rotate(180deg); }
.pill-row.bottom .pill-cell.left img {
left: 0;
width: 151.25%;
}
.pill-row.bottom .pill-cell.right img {
left: -45.3%;
width: 145.3%;
}
.pill-cell .label {
position: absolute; inset: 0;
display: flex; align-items: center; justify-content: center;
font-weight: 700; font-size: var(--font-pill); color: var(--pill-text-color);
white-space: nowrap; z-index: 2;
}
.pill-row.bottom .pill-cell .label { transform: rotate(180deg); }
/* 텍스트 영역: 좌/우 나란히 + 가운데 점선 */
.text-row {
display: grid;
grid-template-columns: 1fr 1px 1fr;
padding: 0.5rem 0.8rem;
}
.text-row .divider {
border-left: 1px dashed var(--divider-color);
margin: 0.2rem 0;
}
.text-row .text-cell {
font-weight: 500;
font-size: var(--font-body);
line-height: 1.8;
color: var(--text-color);
padding: 0.3rem 0.6rem;
}
.text-row .text-cell.right { text-align: right; }
</style>
</head>
<body>
<div class="block">
{% if header %}
<div class="header">
{% if header.icon %}<div class="header-icon"><img src="{{ header.icon }}" alt=""></div>{% endif %}
<div class="header-title">{{ header.title }}</div>
</div>
{% endif %}
<div class="rows">
{% for row in rows %}
<div class="issue-row">
{% if not row.pills_bottom %}
<!-- pills top -->
<div class="pill-row top">
<div class="pill-cell left">
{% if pill_bg %}<img src="{{ pill_bg }}" alt="">{% endif %}
<span class="label">{{ row.left.label }}</span>
</div>
<div class="pill-cell right">
{% if pill_bg %}<img src="{{ pill_bg }}" alt="">{% endif %}
<span class="label">{{ row.right.label }}</span>
</div>
</div>
{% endif %}
<div class="text-row">
<div class="text-cell">{{ row.left.text|safe }}</div>
<div class="divider"></div>
<div class="text-cell right">{{ row.right.text|safe }}</div>
</div>
{% if row.pills_bottom %}
<!-- pills bottom -->
<div class="pill-row bottom">
<div class="pill-cell left">
{% if pill_bg %}<img src="{{ pill_bg }}" alt="">{% endif %}
<span class="label">{{ row.left.label }}</span>
</div>
<div class="pill-cell right">
{% if pill_bg %}<img src="{{ pill_bg }}" alt="">{% endif %}
<span class="label">{{ row.right.label }}</span>
</div>
</div>
{% endif %}
</div>
{% endfor %}
</div>
</div>
</body>
</html>