From e448d8189de6629eb9490978b1752aeaaa853ed3 Mon Sep 17 00:00:00 2001 From: hbyang Date: Fri, 13 Feb 2026 17:02:01 +0900 Subject: [PATCH] =?UTF-8?q?=EB=B8=8C=EB=9E=9C=EB=93=9C=20=EB=B6=84?= =?UTF-8?q?=EC=84=9D,=20=EC=BD=98=ED=85=90=EC=B8=A0=20=EC=99=84=EB=A3=8C?= =?UTF-8?q?=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=88=98=EC=A0=95=20.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.css | 999 ++++++++++++++++++- index.html | 2 + public/example_analysis.json | 1 + public/example_analysis_en.json | 1 + public/favicon_32.svg | 11 + public/favicon_48.svg | 11 + src/locales/en.json | 5 +- src/locales/ko.json | 5 +- src/pages/Analysis/AnalysisResultSection.tsx | 459 ++++----- src/pages/Dashboard/CompletionContent.tsx | 603 +++++------ src/pages/Dashboard/GenerationFlow.tsx | 13 +- src/pages/Dashboard/SoundStudioContent.tsx | 35 +- 12 files changed, 1456 insertions(+), 689 deletions(-) create mode 100644 public/favicon_32.svg create mode 100644 public/favicon_48.svg diff --git a/index.css b/index.css index 095525d..67688b3 100644 --- a/index.css +++ b/index.css @@ -2011,6 +2011,555 @@ cursor: not-allowed; } +/* ===================================================== + Completion v2 (피그마 디자인 기반) + ===================================================== */ + +.comp2-page { + height: 100%; + background: #002224; + display: flex; + flex-direction: column; + overflow: hidden; +} + +.comp2-header { + padding: 8px 32px; + height: 64px; + display: flex; + align-items: center; + flex-shrink: 0; +} + +.comp2-back-btn { + display: flex; + align-items: center; + gap: 4px; + padding: 8px 20px 8px 8px; + background: #462E64; + border: 1px solid #694596; + border-radius: 999px; + color: #CFABFB; + font-size: 14px; + font-weight: 600; + cursor: pointer; + transition: opacity 0.2s; +} + +.comp2-back-btn:hover { + opacity: 0.85; +} + +.comp2-container { + width: calc(100% - 64px); + max-width: 1440px; + margin: 0 auto; + background: #01393B; + border-radius: 24px; + padding: 24px; + display: flex; + flex-direction: column; + flex: 1; + min-height: 0; + overflow: hidden; +} + +.comp2-title-row { + padding: 0 0 16px; + text-align: center; + flex-shrink: 0; +} + +.comp2-page-title { + font-size: 30px; + font-weight: 700; + color: #FFFFFF; + letter-spacing: -0.006em; + line-height: 1.3; + margin-bottom: 8px; +} + +.comp2-page-subtitle { + font-size: 14px; + font-weight: 400; + color: #9BCACC; + line-height: 1.29; +} + + +.comp2-grid { + display: flex; + gap: 24px; + flex: 1; + min-height: 0; + overflow: hidden; +} + +/* 영상 섹션 */ +.comp2-video-section { + flex: 0 0 60%; + display: flex; + align-items: stretch; + min-width: 0; + overflow: hidden; +} + +.comp2-video-wrapper { + background: #01191A; + border-radius: 16px; + position: relative; + overflow: hidden; + width: 100%; +} + +.comp2-video-player { + width: 100%; + height: 100%; + object-fit: contain; + cursor: pointer; + background: #01191A; +} + +.comp2-video-placeholder { + width: 100%; + height: 100%; + background: #01191A; +} + +.comp2-video-loading, +.comp2-video-error { + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 20px; +} + +.comp2-loading-text { + color: #9BCACC; + margin-top: 16px; +} + +.comp2-error-icon { + width: 64px; + height: 64px; + color: #E15252; + margin-bottom: 16px; +} + +.comp2-error-text { + color: #9BCACC; + margin-bottom: 16px; + text-align: center; +} + +.comp2-retry-btn { + padding: 10px 20px; + background: rgba(174, 114, 249, 0.36); + border-radius: 8px; + color: #CFABFB; + font-size: 14px; + font-weight: 600; + cursor: pointer; + transition: opacity 0.2s; +} + +.comp2-retry-btn:hover { + opacity: 0.85; +} + +/* 영상 컨트롤 */ +.comp2-video-controls { + position: absolute; + bottom: 0; + left: 0; + right: 0; + background: linear-gradient(180deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.7) 100%); + padding: 24px 24px 16px; + display: flex; + flex-direction: column; + gap: 16px; + transition: opacity 0.3s ease; +} + +.comp2-video-controls.visible { + opacity: 1; + pointer-events: auto; +} + +.comp2-video-controls.hidden { + opacity: 0; + pointer-events: none; +} + +.comp2-progress-bar { + width: 100%; + height: 8px; + background: #034A4D; + border-radius: 999px; + overflow: hidden; +} + +.comp2-progress-fill { + height: 100%; + background: #E5F1F2; + border-radius: 999px; + transition: width 0.1s linear; +} + +.comp2-controls-row { + display: flex; + align-items: center; + gap: 32px; +} + +.comp2-play-btn { + width: 32px; + height: 32px; + color: #FFFFFF; + cursor: pointer; + flex-shrink: 0; +} + +.comp2-volume-control { + display: flex; + align-items: center; + gap: 8px; + flex: 1; +} + +.comp2-volume-control svg { + width: 32px; + height: 32px; + color: #FFFFFF; + flex-shrink: 0; +} + +.comp2-volume-bar { + flex: 1; + height: 4px; + background: #034A4D; + border-radius: 999px; + overflow: hidden; +} + +.comp2-volume-fill { + width: 40%; + height: 100%; + background: #E5F1F2; + border-radius: 999px; +} + +.comp2-time-display { + display: flex; + align-items: center; + gap: 4px; + font-size: 16px; + font-weight: 400; + line-height: 1.375; + letter-spacing: -0.006em; +} + +.comp2-time-current { + color: #E5F1F2; +} + +.comp2-time-divider { + color: #9BCACC; +} + +.comp2-time-total { + color: #9BCACC; +} + +/* 정보 섹션 */ +.comp2-info-section { + flex: 1; + display: flex; + flex-direction: column; + gap: 8px; + position: relative; + min-height: 0; + border-left: 3px solid #067C80; + padding-left: 16px; +} + +.comp2-info-header { + display: flex; + align-items: center; + flex-shrink: 0; +} + +.comp2-info-label { + font-size: 12px; + font-weight: 400; + color: #9BCACC; + line-height: 1.29; +} + +.comp2-info-content { + flex: 1; + display: flex; + flex-direction: column; + gap: 8px; + overflow-y: auto; + min-height: 0; + padding-right: 4px; +} + +/* 스크롤바 스타일링 */ +.comp2-info-content::-webkit-scrollbar { + width: 4px; +} + +.comp2-info-content::-webkit-scrollbar-track { + background: transparent; +} + +.comp2-info-content::-webkit-scrollbar-thumb { + background: #067C80; + border-radius: 999px; +} + +.comp2-info-content::-webkit-scrollbar-thumb:hover { + background: #088a8e; +} + +.comp2-file-info { + display: flex; + flex-direction: column; + gap: 2px; +} + +.comp2-filename { + font-size: 16px; + font-weight: 700; + color: #FFFFFF; + letter-spacing: -0.006em; + line-height: 1.3; +} + +.comp2-filesize { + font-size: 12px; + font-weight: 400; + color: #9BCACC; + line-height: 1.29; +} + +.comp2-divider { + width: 100%; + height: 1px; + background: #046266; +} + +.comp2-meta-grid { + display: flex; + flex-direction: column; + gap: 8px; + flex: 1; +} + +.comp2-meta-item { + display: flex; +} + +.comp2-meta-label { + font-size: 12px; + font-weight: 400; + color: #E5F1F2; + line-height: 1.29; +} + +.comp2-meta-divider { + width: 100%; + height: 1px; + background: #046266; +} + +.comp2-lyrics-section { + display: flex; + flex-direction: column; + gap: 4px; + flex: 1; +} + +.comp2-lyrics-text { + font-size: 12px; + font-weight: 400; + color: #E5F1F2; + line-height: 1.625; + letter-spacing: -0.006em; + white-space: pre-line; + flex: 1; +} + +/* 소셜 연결 섹션 */ +.comp2-social-connect-section { + display: flex; + flex-direction: column; + gap: 8px; + flex: 1; +} + +.comp2-social-header { + display: flex; + gap: 4px; +} + +.comp2-social-label { + font-size: 14px; + font-weight: 400; + color: #E5F1F2; + line-height: 1.29; +} + +.comp2-required-mark { + font-size: 14px; + font-weight: 400; + color: #E15252; + line-height: 1.29; +} + +.comp2-social-buttons { + display: flex; + flex-direction: column; + gap: 12px; +} + +.comp2-social-connect-btn { + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + padding: 10px 20px; + background: rgba(148, 251, 224, 0.11); + border-radius: 16px; + cursor: pointer; + transition: opacity 0.2s; +} + +.comp2-social-connect-btn:hover { + opacity: 0.85; +} + +.comp2-social-connect-btn svg { + flex-shrink: 0; +} + +.comp2-social-connect-btn span { + font-size: 14px; + font-weight: 600; + color: #76C9B3; + letter-spacing: -0.006em; + line-height: 1.19; + text-align: center; +} + +.comp2-error-message { + font-size: 14px; + color: #E15252; + margin-top: 8px; +} + +/* 하단 버튼 */ +.comp2-buttons { + display: flex; + gap: 8px; + flex-shrink: 0; + margin-top: auto; +} + +.comp2-btn { + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + padding: 8px 12px; + flex: 1; + height: 40px; + border-radius: 8px; + font-size: 12px; + font-weight: 600; + letter-spacing: -0.006em; + line-height: 1.19; + text-align: center; + cursor: pointer; + transition: opacity 0.2s; + white-space: nowrap; +} + +.comp2-btn-secondary { + background: rgba(174, 114, 249, 0.36); + color: #CFABFB; +} + +.comp2-btn-secondary:hover:not(:disabled) { + opacity: 0.85; +} + +.comp2-btn-secondary:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +.comp2-btn-primary { + background: #AE72F9; + color: #FFFFFF; +} + +.comp2-btn-primary:hover:not(:disabled) { + opacity: 0.85; +} + +.comp2-btn-primary:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +/* 반응형 */ +@media (max-width: 1024px) { + .comp2-page { + height: auto; + min-height: 100%; + overflow: auto; + } + + .comp2-container { + width: calc(100% - 32px); + margin: 0 16px; + padding: 16px; + flex: none; + } + + .comp2-grid { + flex-direction: column; + gap: 16px; + overflow: visible; + } + + .comp2-video-section { + align-items: center; + } + + .comp2-video-wrapper { + max-height: 300px; + } + + .comp2-info-section { + flex: none; + border-left: none; + padding-left: 0; + border-top: 3px solid #067C80; + padding-top: 16px; + } + + .comp2-buttons { + flex-direction: row; + } +} + /* ===================================================== Analysis Result Page Components ===================================================== */ @@ -2688,6 +3237,448 @@ } } +/* ===================================================== + Brand Intelligence v2 (피그마 디자인 기반) + ===================================================== */ + +.bi2-page { + min-height: 100vh; + background-color: #002224; + color: #E5F1F2; + padding-bottom: 160px; + font-family: 'Pretendard', sans-serif; +} + +/* 헤더 */ +.bi2-header { + display: flex; + align-items: center; + padding: 8px 32px; + height: 64px; +} + +.bi2-back-btn { + display: flex; + align-items: center; + gap: 4px; + padding: 8px 20px 8px 8px; + background: #462E64; + border: 1px solid #694596; + border-radius: 999px; + color: #CFABFB; + font-size: 14px; + font-weight: 600; + cursor: pointer; + transition: opacity 0.2s; + letter-spacing: -0.006em; +} + +.bi2-back-btn:hover { + opacity: 0.85; +} + +/* 타이틀 영역 */ +.bi2-page-title-section { + display: flex; + flex-direction: column; + align-items: center; + gap: 24px; + padding: 8px 0 40px; + max-width: 1440px; + margin: 0 auto; +} + +.bi2-title-icon { + width: 40px; + height: 40px; +} + +.bi2-star-icon { + width: 40px; + height: 40px; + animation: twinkle 2.5s ease-in-out infinite; +} + +.bi2-title-text { + display: flex; + flex-direction: column; + align-items: center; + gap: 8px; +} + +.bi2-main-title { + font-size: 40px; + font-weight: 600; + color: #FFFFFF; + letter-spacing: -0.006em; + line-height: 1.19; + text-align: center; +} + +.bi2-subtitle { + font-size: 14px; + font-weight: 400; + color: #E5F1F2; + letter-spacing: -0.006em; + line-height: 1.19; + text-align: center; +} + +/* 메인 컨테이너 */ +.bi2-main-container { + max-width: 1440px; + margin: 0 auto; + background: #013032; + border: 1px solid #034A4D; + border-radius: 40px; + padding: 32px 32px 112px; + display: flex; + flex-direction: column; + gap: 88px; +} + +/* 매장 헤더 */ +.bi2-store-header { + display: flex; + flex-direction: column; + gap: 4px; +} + +.bi2-store-name { + font-size: 30px; + font-weight: 700; + color: #FFFFFF; + letter-spacing: -0.006em; + line-height: 1.3; +} + +.bi2-store-address { + font-size: 14px; + font-weight: 400; + color: #9BCACC; + line-height: 1.29; +} + +/* 섹션 공통 */ +.bi2-section { + display: flex; + flex-direction: column; + gap: 16px; +} + +.bi2-section-title { + font-size: 20px; + font-weight: 700; + color: #E5F1F2; + letter-spacing: -0.006em; + line-height: 1.3; +} + +/* 브랜드 정체성 카드 */ +.bi2-identity-card { + background: #034245; + border-radius: 20px; + padding: 22px 24px; + display: flex; + flex-direction: column; + gap: 22px; +} + +.bi2-identity-top { + display: flex; + flex-direction: column; + gap: 16px; +} + +.bi2-identity-core { + display: flex; + flex-direction: column; + gap: 4px; +} + +.bi2-label-sm { + font-size: 14px; + font-weight: 400; + color: #E5F1F2; + line-height: 1.29; +} + +.bi2-core-value { + font-size: 24px; + font-weight: 700; + color: #FFFFFF; + letter-spacing: -0.006em; + line-height: 1.3; +} + +.bi2-category-text { + font-size: 14px; + font-weight: 400; + color: #E5F1F2; + line-height: 1.29; +} + +.bi2-identity-divider { + width: 100%; + height: 1px; + background: #067C80; +} + +.bi2-identity-bottom { + display: flex; + gap: 40px; +} + +.bi2-identity-col { + flex: 1; + display: flex; + flex-direction: column; + gap: 8px; +} + +.bi2-body-text { + font-size: 16px; + font-weight: 400; + color: #CEE5E6; + line-height: 1.625; + letter-spacing: -0.006em; +} + +/* 셀링 포인트 카드 */ +.bi2-selling-card { + display: flex; + align-items: center; + justify-content: center; + gap: 160px; + background: #034245; + border: 1px solid #034A4D; + border-radius: 20px; + padding: 16px 32px; +} + +.bi2-selling-chart { + flex-shrink: 0; +} + +.bi2-radar-container { + display: flex; + justify-content: center; + align-items: center; +} + +.bi2-selling-list { + display: flex; + flex-direction: column; + gap: 24px; +} + +.bi2-selling-item { + display: flex; + align-items: center; + gap: 16px; +} + +.bi2-rank-badge { + width: 20px; + height: 20px; + min-width: 20px; + border-radius: 4px; + display: flex; + align-items: center; + justify-content: center; + font-size: 12px; + font-weight: 600; + letter-spacing: -0.006em; + background: #206764; + color: #94FBE0; +} + +.bi2-rank-badge.top { + background: #94FBE0; + color: #002224; +} + +.bi2-selling-item-text { + display: flex; + align-items: center; + gap: 8px; +} + +.bi2-selling-name { + font-size: 16px; + font-weight: 400; + color: #E5F1F2; + letter-spacing: -0.006em; + line-height: 1.375; +} + +.bi2-selling-desc { + font-size: 12px; + font-weight: 500; + color: #9BCACC; + letter-spacing: -0.006em; + line-height: 1; +} + +/* 고객 유형 카드 */ +.bi2-persona-grid { + display: flex; + align-items: stretch; + gap: 16px; +} + +.bi2-persona-card { + flex: 1; + background: #034245; + border: 1px solid #034A4D; + border-radius: 20px; + padding: 20px; + display: flex; + flex-direction: column; + gap: 16px; +} + +.bi2-persona-header { + display: flex; + flex-direction: column; + gap: 8px; + padding-bottom: 8px; +} + +.bi2-persona-info { + display: flex; + align-items: baseline; + gap: 6px; +} + +.bi2-persona-name { + font-size: 18px; + font-weight: 700; + color: #E5F1F2; + letter-spacing: -0.006em; + line-height: 1.3; +} + +.bi2-persona-age { + font-size: 14px; + font-weight: 400; + color: #9BCACC; + line-height: 1.29; +} + +.bi2-persona-desc { + font-size: 14px; + font-weight: 400; + color: #CEE5E6; + line-height: 1.29; + word-break: keep-all; + overflow-wrap: break-word; +} + +.bi2-persona-divider { + width: 100%; + height: 1px; + background: #067C80; +} + +.bi2-persona-detail { + display: flex; + gap: 16px; + padding: 0 4px; +} + +.bi2-persona-detail.grow { + flex: 1; +} + +.bi2-label-xs { + font-size: 14px; + font-weight: 400; + color: #CEE5E6; + line-height: 1.29; + white-space: nowrap; + flex-shrink: 0; +} + +.bi2-persona-detail-text { + font-size: 16px; + font-weight: 400; + color: #E5F1F2; + line-height: 1.625; + letter-spacing: -0.006em; + white-space: pre-line; + text-align: right; + word-break: keep-all; + overflow-wrap: break-word; + flex: 1; +} + +/* 추천 타겟 키워드 */ +.bi2-keyword-header { + display: flex; + flex-direction: column; + gap: 8px; +} + +.bi2-keyword-subtitle { + font-size: 14px; + font-weight: 400; + color: #9BCACC; + line-height: 1.29; +} + +.bi2-keyword-tags { + display: flex; + flex-wrap: wrap; + gap: 8px; +} + +.bi2-keyword-pill { + display: flex; + align-items: center; + justify-content: center; + padding: 8px 16px; + background: #034245; + border-radius: 999px; + font-size: 16px; + font-weight: 400; + color: #E5F1F2; + letter-spacing: -0.006em; + line-height: 1.375; +} + +/* 반응형 */ +@media (max-width: 1024px) { + .bi2-main-container { + margin: 0 16px; + padding: 24px 20px 80px; + gap: 48px; + border-radius: 24px; + } + + .bi2-selling-card { + flex-direction: column; + gap: 32px; + } + + .bi2-persona-grid { + flex-direction: column; + } + + .bi2-identity-bottom { + flex-direction: column; + gap: 24px; + } + + .bi2-main-title { + font-size: 28px; + } + + .bi2-store-name { + font-size: 24px; + } +} + /* ===================================================== URL Input Content (GenerationFlow 내 URL 입력 단계) ===================================================== */ @@ -6506,14 +7497,6 @@ cursor: not-allowed; } -.sound-type-btn.permanently-disabled { - opacity: 0.35; - cursor: not-allowed; - background-color: rgba(255, 255, 255, 0.03); - border-color: rgba(255, 255, 255, 0.1); - color: rgba(255, 255, 255, 0.4); -} - /* Genre Grid */ .genre-grid { display: flex; diff --git a/index.html b/index.html index 2be9c52..f52d80c 100755 --- a/index.html +++ b/index.html @@ -5,6 +5,8 @@ CASTAD + +