블록 템플릿 업데이트: 수정 3개 + 신규 17개 + catalog.yaml 재정비

수정:
- compare-2col-badge, compare-detail-gradient, hero-icon-cards 개선

신규 블록:
- cards: category-strip-table, system-2col-center, hero-icon-cards_1
- emphasis: checklist-dark
- visuals: cycle-orbit
- new/: cards-3col-persona, compare-vs-rows, cycle-3way-intersect 등 8개
- redesign/: card_hero-icon-cards_1
- svg/: arc_left, arrow_conclusion, arrow_down, line_divider
- BEPs: process-product-2col SVG + 테스트

catalog.yaml 전면 재정비 (슬롯 스키마, height_cost, 카테고리 정리)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-13 10:58:09 +09:00
parent c42e01f060
commit 360cd8e44c
59 changed files with 2906 additions and 1391 deletions

View File

@@ -0,0 +1,172 @@
<!-- 분할 패널: 좌측 카테고리 + 우측 번호 설명 -->
<!--
📋 split-panel-numbered
─────────────────
용도: 좌측 카테고리별 항목 + 우측 번호 설명 2단 배치
슬롯:
title_icon — 아이콘 이미지
title (HTML — <span class="model">, <span class="sub">)
left_bg_color — 좌측 셰브론 배경 CSS gradient (기본값 제공)
categories[] (name, color, items[])
mid_arrow_img — 중간 화살표 이미지
right_items[] (number, text, badge_img)
arrow_img — 우측 화살표 이미지
Figma 원본: Frame 1171281202 (node 45:27, 1863×834)
수학적 계산:
scale = 1280 / 1863 = 0.68706
title: Model=70px gradient(#cc5200→#883700), sub=50px gradient(#296b55→#000) (MCP 확인)
cat bar: 단색 #417d38, #008e52, #008970 (픽셀 분석, MCP=이미지)
right bar: #e8ede3 단색 (픽셀 분석)
left-bg: 셰브론 형태 + alpha gradient (픽셀 분석)
CSS 요소: title gradient text, cat bars, right bars, left-bg, mid-deco
이미지 요소: title icon, 3D badge(일러스트), arrow(아이콘), mid arrow
-->
<div class="block-spn">
{% if title_icon or title %}
<div class="spn-header">
{% if title_icon %}<div class="spn-title-icon"><img src="{{ title_icon | default('svg/icon_title.png') }}" alt=""></div>{% endif %}
{% if title %}<div class="spn-title">{{ title|safe }}</div>{% endif %}
</div>
{% endif %}
<div class="spn-body">
<!-- 좌측 패널 -->
<div class="spn-left">
<div class="spn-left-bg"></div>
<div class="spn-categories">
{% for cat in categories %}
<div class="spn-cat">
<div class="spn-cat-bar" style="background: {{ cat.color|default('#417d38') }};"></div>
<div class="spn-cat-title">{{ cat.name }}</div>
<div class="spn-cat-items">
{% for item in cat.items %}
<div class="spn-cat-item">· {{ item }}</div>
{% endfor %}
</div>
</div>
{% endfor %}
</div>
</div>
<!-- 중간 장식 -->
<div class="spn-mid">
<div class="spn-mid-deco"></div>
{% if mid_arrow_img %}<img src="{{ mid_arrow_img | default('svg/arrow_mid.png') }}" class="spn-mid-arrow" alt="">{% endif %}
</div>
<!-- 우측 패널 -->
<div class="spn-right">
{% for item in right_items %}
<div class="spn-row">
{% if item.badge_img %}<div class="spn-badge"><img src="{{ item.badge_img }}" alt=""></div>
{% elif loop.index <= 5 %}<div class="spn-badge"><img src="svg/badge_num_0{{ loop.index }}.png" alt=""></div>{% endif %}
<div class="spn-row-bar">
<div class="spn-row-text">{{ item.text }}</div>
{% if arrow_img %}<img src="{{ arrow_img | default('svg/arrow_right.png') }}" class="spn-row-arrow" alt="">{% endif %}
</div>
</div>
{% endfor %}
</div>
</div>
</div>
<style>
.block-spn {
display: flex; flex-direction: column;
width: 100%; height: 100%;
word-break: keep-all;
}
.spn-header { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
.spn-title-icon { flex: none; width: 26px; height: 27px; }
.spn-title-icon img { width: 100%; height: 100%; object-fit: contain; }
/* title: MCP 확인 gradient text */
.spn-title { font-weight: 900; line-height: 1.1; white-space: nowrap; }
.spn-title .model {
font-size: 34px;
background-image: linear-gradient(180deg, #cc5200 0%, #883700 100%);
-webkit-background-clip: text; background-clip: text; color: transparent;
}
.spn-title .sub {
font-size: 24px;
background-image: linear-gradient(180deg, #296b55 0%, #000 100%);
-webkit-background-clip: text; background-clip: text; color: transparent;
}
.spn-body { display: flex; flex: 1; }
/* 좌측: 셰브론 배경 (CSS clip-path + gradient) */
.spn-left { position: relative; flex: 52; overflow: hidden; }
.spn-left-bg {
position: absolute; inset: 0;
background: linear-gradient(90deg,
rgba(192,213,208,0.19) 0%, rgba(195,214,209,0.66) 50%, rgba(211,227,226,1) 95%);
clip-path: polygon(0 0, 82% 0, 100% 50%, 82% 100%, 0 100%);
border-radius: 20px 0 0 20px;
}
.spn-categories {
position: relative; z-index: 1;
display: flex; flex-direction: column;
justify-content: space-between; flex: 1;
padding: 8px 16px;
}
.spn-cat { display: flex; flex-direction: column; }
/* cat bar: CSS 단색 (픽셀 분석, Figma=이미지) */
.spn-cat-bar {
height: 34px; border-radius: 5px;
background: linear-gradient(90deg, currentColor 0%, currentColor 85%, transparent 100%);
margin-bottom: 4px;
}
.spn-cat-title {
position: relative; z-index: 1; margin-top: -30px;
font-size: 20px; font-weight: 700; color: #fff;
text-shadow: 0 0 4px rgba(0,0,0,0.5);
padding-left: 12px; line-height: 34px;
}
.spn-cat-items { padding: 4px 12px; }
.spn-cat-item {
font-size: 16px; font-weight: 500; color: #000;
line-height: 1.6; text-shadow: 0 0 4px rgba(0,0,0,0.5);
}
/* 중간 장식: CSS radial-gradient */
.spn-mid {
position: relative; flex: none; width: 8%;
display: flex; align-items: center; justify-content: center;
}
.spn-mid-deco {
position: absolute; inset: 10% 0;
background: radial-gradient(ellipse 60% 50% at 100% 50%,
rgba(217,217,217,0.8) 0%, rgba(217,217,217,0.13) 60%, transparent 100%);
}
.spn-mid-arrow { position: relative; z-index: 1; width: 50px; height: 108px; object-fit: contain; }
/* 우측: 번호 + 설명 */
.spn-right {
flex: 40; display: flex; flex-direction: column;
justify-content: space-between; padding: 4px 0;
}
.spn-row { display: flex; align-items: center; gap: 4px; }
/* badge: 3D 큐브 일러스트 → 이미지 유지 */
.spn-badge { flex: none; width: 42px; height: 44px; z-index: 2; }
.spn-badge img { width: 100%; height: 100%; object-fit: contain; }
/* right bar: CSS #e8ede3 (픽셀 분석) */
.spn-row-bar {
flex: 1; display: flex; align-items: center;
min-height: 48px; padding: 8px 16px;
background: #e8ede3; border-radius: 10px;
}
.spn-row-text {
flex: 1; font-size: 18px; font-weight: 500;
color: #11231d; line-height: 1.4;
}
.spn-row-arrow {
flex: none; width: 22px; height: 21px;
transform: rotate(180deg); object-fit: contain;
}
</style>