From 0ca2140b9850ce8eed09f43f36662784dc4aec16 Mon Sep 17 00:00:00 2001 From: Haewon Kam Date: Thu, 20 Aug 2026 12:55:06 +0900 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20=EC=8D=B0=EB=B0=95=EC=8A=A4=20DS=20?= =?UTF-8?q?=ED=86=B5=EC=9D=BC=EA=B3=BC=20Poster=20to=20Video=20=ED=86=B5?= =?UTF-8?q?=ED=95=A9,=20=EC=A7=84=EC=9E=85=20=ED=99=94=EB=A9=B4=20?= =?UTF-8?q?=EB=84=A4=EB=B9=84=EA=B2=8C=EC=9D=B4=EC=85=98=20=EA=B0=9C?= =?UTF-8?q?=ED=8E=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 썰박스를 ADO2 디자인 시스템으로 맞추고, 포스터 파이프라인 두 종을 파이프라인 탭에 추가한다. 탭이 4개가 되면서 진입 화면 네비게이션도 함께 손봤다. ## 썰박스 DS 통일 시나리오별 팔레트(조선=파랑·삼국지=빨강·그리스=녹·오디세이=청)와 이모지, 앰버 강조색(--color-ssul-accent)을 걷어냈다. 선택 표시는 castad 표준 문법(민트 테두리 + 민트 틴트), 스피너는 퍼플, CTA는 퍼플 단색으로 통일했다. 색으로 구분하던 것을 없앤 대신 상태(선택)만 색으로 남긴다. ## Poster to Video 통합 (내부 시연 범위) - 무빙 포스터(F1): 업로드 → 분석 → **검수 게이트** → 생성 → 완성 5단계 위저드. 검수에서 나레이션·모션·메타태그를 포스터와 대조해 고치고 승인해야 렌더가 이어진다. - 포스터 스타일링(F2): 위저드가 아닌 한 화면 도구. 여러 스타일을 갈아 끼우며 비교하는 작업이라 단계를 나누면 왕복만 늘어난다. P2V 서버(:8010)를 castad 백엔드가 아니라 **직접 호출**한다. 검증된 scripts를 subprocess로 감싼 단일 워커라 castad 백엔드에 흡수하려면 실행 환경(Higgsfield CLI·ffmpeg·모델 키)을 통째로 이식해야 하기 때문이다. 호출은 utils/p2vApi.ts 한 파일에 격리했다 — 대외 공개 시 castad 백엔드에 /p2v/* 프록시를 세우고 카카오 인증· 크레딧 차감을 얹을 때 갈아끼울 지점이 여기 하나다. 인증은 단일 팀 키(P2V_ACCESS_KEY)다. 다른 오리진이라 쿠키가 실리지 않아 정적 산출물(영상·이미지·다운로드)은 p2vFile()이 ?key= 로 태운다. F2는 영화 포스터 레퍼런스가 저작권 자산이라 **결과물의 외부 공개·상업 사용을 금한다**(퍼블릭 도메인 명화 제외). 화면 상단 고지 + 템플릿별 배포 등급 배지 + 내부 전용을 고른 순간에만 뜨는 경고로 표시한다. ## 진입 화면 네비게이션 - 밑줄 탭 → 아이콘 타일 + 기능명. 탭이 4개가 되자 "무빙 포스터"와 "포스터 스타일링"이 글자로는 갈라지지 않아, 형태로 구분되게 했다. 아이콘은 ADO2 Design System 규칙 (24×24 · fill none · stroke currentColor 2 · round)을 따르고 색은 넣지 않는다. - 고른 기능의 한 줄 설명을 탭 아래에 붙였다. - 간격 체계를 8px 그리드로 다시 잡았다(묶음 안 8~12 / 묶음 사이 20 / 섹션 28~32). 이전에는 전부 10~24px이라 근접성으로 구조가 읽히지 않아 답답했다. 타일 간격은 터치 타겟 최소 8dp를 지킨다. ## 버그 수정 - 진입 화면 세로 넘침 잘림: justify-content:center + overflow:hidden 조합이라 콘텐츠가 길어지면 위로 넘친 부분에 스크롤로도 닿을 수 없었다(무빙 포스터에서 로고 밴드 47px 잘림). 자식의 margin:auto 0 중앙정렬로 바꿔 해소. - 사라진 P2V 잡: 404를 문구가 아니라 상태 코드로 판정한다(P2vNotFoundError). 서버에서 지워진 잡 ID가 남으면 빈 진행 화면에서 멈췄다. - 검수 화면 모바일: 좌우 여백 0(부모 위저드 컨테이너에 패딩이 없다) → 16px 부여. 대조할 포스터를 편집 위로 올리고, 승인 CTA를 하단 탭바 위에 sticky로 고정. - 한글 단어 중간 줄바꿈("애니메이/션") → word-break: keep-all. - 입력·안내·제출 박스 높이를 48px로 통일. ## 카피 가게→업체, 크롤링→수집으로 어휘 통일. Co-Authored-By: Claude Opus 5 --- README.md | 22 + index.html | 25 +- package-lock.json | 29 + src/components/LicenseBadge.tsx | 46 ++ src/components/P2vKeyGate.tsx | 49 ++ src/components/PipelineTabs.tsx | 57 +- src/components/PosterDropzone.tsx | 106 +++ src/components/pipelineIcons.tsx | 69 ++ src/hooks/useP2vJob.ts | 97 +++ src/locales/en.json | 84 +- src/locales/ko.json | 141 +++- src/pages/Dashboard/GenerationFlow.tsx | 165 +++- src/pages/Dashboard/UrlInputContent.tsx | 51 +- src/pages/Poster/PosterCreateForm.tsx | 79 ++ src/pages/Poster/PosterMakingContent.tsx | 105 +++ src/pages/Poster/PosterResultContent.tsx | 95 +++ src/pages/Poster/PosterReviewContent.tsx | 172 +++++ src/pages/Poster/StylingContent.tsx | 330 ++++++++ src/pages/Poster/posterData.ts | 28 + src/pages/Ssulbox/SsulCreateForm.tsx | 14 +- src/pages/Ssulbox/SsulMakingContent.tsx | 19 +- src/pages/Ssulbox/ssulData.ts | 41 +- src/styles/generation-flow.css | 161 +++- src/styles/index.css | 3 + src/styles/poster-p2v.css | 938 +++++++++++++++++++++++ src/styles/ssulbox-castad.css | 109 ++- src/styles/tokens.css | 3 - src/utils/p2vApi.ts | 263 +++++++ src/utils/storageKeys.ts | 17 +- 29 files changed, 3099 insertions(+), 219 deletions(-) create mode 100644 src/components/LicenseBadge.tsx create mode 100644 src/components/P2vKeyGate.tsx create mode 100644 src/components/PosterDropzone.tsx create mode 100644 src/components/pipelineIcons.tsx create mode 100644 src/hooks/useP2vJob.ts create mode 100644 src/pages/Poster/PosterCreateForm.tsx create mode 100644 src/pages/Poster/PosterMakingContent.tsx create mode 100644 src/pages/Poster/PosterResultContent.tsx create mode 100644 src/pages/Poster/PosterReviewContent.tsx create mode 100644 src/pages/Poster/StylingContent.tsx create mode 100644 src/pages/Poster/posterData.ts create mode 100644 src/styles/poster-p2v.css create mode 100644 src/utils/p2vApi.ts diff --git a/README.md b/README.md index 98b9374..835d03d 100755 --- a/README.md +++ b/README.md @@ -51,6 +51,28 @@ npm run build npm run preview ``` +## 환경 변수 + +| 변수 | 기본값 | 설명 | +|---|---|---| +| `VITE_API_URL` | `http://40.82.133.44` | castad 백엔드 (ADO2·썰박스) | +| `VITE_P2V_URL` | `http://localhost:8010` | Poster to Video 서버 (포스터 영상·스타일링) | + +### 포스터 파이프라인 (Poster to Video) + +'포스터 영상'(F1)·'포스터 스타일'(F2) 탭은 castad 백엔드가 아니라 **별도 P2V 서버**를 직접 +호출한다(`src/utils/p2vApi.ts`). 붙이려면 세 가지가 필요하다: + +1. P2V 서버 기동 — 저장소는 `o2o-ado2-poster-to-video`, 기본 포트 8010 +2. 서버의 `P2V_ALLOWED_ORIGINS` 에 이 프론트 오리진 추가 (예: `http://localhost:3000`) +3. 첫 진입 시 화면에 뜨는 입력창에 서버의 `P2V_ACCESS_KEY` 입력 (브라우저에 저장된다) + +인증이 단일 팀 키라 **내부 시연 범위**다. 대외 공개 시에는 castad 백엔드에 `/p2v/*` 프록시를 +세워 카카오 인증·크레딧 차감을 얹고, 프론트는 `p2vApi.ts` 한 파일만 그쪽으로 돌리면 된다. + +포스터 스타일링(F2)은 영화 포스터 레퍼런스가 저작권 자산이라 **결과물의 외부 공개·상업 사용을 +금한다**(퍼블릭 도메인 명화 제외). 화면 상단과 템플릿 배지로 등급을 표시한다. + ## Docker 실행 ```bash diff --git a/index.html b/index.html index 156c788..48321f9 100755 --- a/index.html +++ b/index.html @@ -36,14 +36,14 @@ extend: { colors: { brand: { - bg: '#011c1e', - card: '#083336', - cardHover: '#0b3f42', - accent: '#94FBE0', - purple: '#a855f7', - purpleHover: '#9333ea', - text: '#e2e8f0', - muted: '#94a3b8' + bg: '#001a1c', + card: '#003538', + cardHover: '#004548', + accent: '#a6ffea', + purple: '#a682ff', + purpleHover: '#9570f0', + text: '#d1d5db', + muted: '#9ca3af' } } } @@ -53,7 +53,8 @@ - + +