- 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>
186 lines
5.7 KiB
Django/Jinja
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>
|