From d50dc52c39cab1ad6d460b9d30fe5e54d01cf6c4 Mon Sep 17 00:00:00 2001
From: Haewon Kam
Date: Wed, 9 Sep 2026 15:24:58 +0900
Subject: [PATCH] =?UTF-8?q?fix(web):=20=EA=B2=8C=EC=9D=B4=ED=8A=B8=20?=
=?UTF-8?q?=E2=91=A0=20=EA=B5=AC=ED=9A=8D=20=EC=84=A0=ED=83=9D=EC=97=90=20?=
=?UTF-8?q?=EC=8D=B8=EB=84=A4=EC=9D=BC=EC=9D=84=20=EA=B7=B8=EB=A6=B0?=
=?UTF-8?q?=EB=8B=A4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
thumb_url을 백엔드가 내려보내는데 화면은 라벨 칩만 그렸다.
실물은 19조각에 라벨이 겹쳐서("유의사항" 일곱 개) 무엇을 고르는지
알 수 없는 상태였다.
- SectionPicker: 썸네일 그리드(auto-fill 84px, 390px에서 4열).
번호 배지 · 선택 표시 · 잠금(캐스팅 스케줄) · 높이 툴팁
- 문구를 새 동작에 맞춘다 — 조각을 잘라 붙이는 것이 아니라
고른 지점부터 상세페이지를 이어서 훑는다
- 목 데이터를 실측 19조각으로 교체. 6개짜리 깔끔한 목을 두었던 탓에
라벨이 겹치는 실물 모양을 개발 중에 못 봤다
Co-Authored-By: Claude Opus 5 (1M context)
---
frontend/components/gate-card.tsx | 61 ++++++++++++++++++++++++-------
frontend/lib/playreel.ts | 26 +++++++++----
2 files changed, 65 insertions(+), 22 deletions(-)
diff --git a/frontend/components/gate-card.tsx b/frontend/components/gate-card.tsx
index 6afe96f..4fe7902 100644
--- a/frontend/components/gate-card.tsx
+++ b/frontend/components/gate-card.tsx
@@ -8,8 +8,8 @@
import { useState } from "react";
import {
- GATE_META, type AnalysisReview, type ClipReview, type FetchReview, type FinalReview,
- type GateKey, type GateReview, type NarrationReview,
+ GATE_META, type AnalysisReview, type ClipReview, type DetailSection, type FetchReview,
+ type FinalReview, type GateKey, type GateReview, type NarrationReview,
} from "@/lib/playreel";
// ── 공통 셸 ──────────────────────────────────────────────────────────
@@ -85,6 +85,46 @@ function Warn({ children }: { children: React.ReactNode }) {
const two = { display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(280px, 1fr))", gap: "var(--spacing-page-md)", alignItems: "start" } as const;
+// 상세페이지 조각은 라벨이 겹친다 — "유의사항"만 일곱 개인 페이지가 흔하다.
+// 칩으로 그리면 같은 글자가 줄줄이 서서 무엇을 고르는지 알 수 없어 썸네일을 그린다.
+function SectionPicker({ sections, onToggle }: {
+ sections: DetailSection[]; onToggle: (id: string) => void;
+}) {
+ const chosen = sections.filter((s) => s.selected).length;
+ return (
+ <>
+
상세페이지에서 훑기 시작할 지점
+
+ 고른 지점부터 상세페이지를 이어서 훑습니다. 조각을 잘라 붙이는 것이 아닙니다.
+
+
+ {sections.map((s, i) => (
+
+ ))}
+
+
+ {sections.length}개 중 {chosen}개 선택 · 캐스팅 스케줄은 항상 포함됩니다.
+