From 6b3b950ad044d496c756503df2bcb0eb55fae1b2 Mon Sep 17 00:00:00 2001 From: Haewon Kam Date: Tue, 14 Apr 2026 16:06:21 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=ED=94=8C=EB=9E=9C=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20=EC=A0=84=EC=B2=B4=20=EC=84=B9=EC=85=98=20=ED=88=AC?= =?UTF-8?q?=EB=AA=85=20=ED=98=84=EC=83=81=20=EC=99=84=EC=A0=84=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0=20=E2=80=94=20initial=20opacity:0=20=EC=A0=84?= =?UTF-8?q?=EC=88=98=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - PlanHeader: motion.div/h1/p의 initial opacity:0 → plain HTML로 교체 (배경 blob 애니메이션은 opacity 무관하여 유지) - RepurposingProposal: 카드 motion.div → plain div, 확장 accordion도 plain div - ChannelStrategy, ContentStrategy, AssetCollection, PlanCTA, BrandingGuide, WorkflowTracker, StrategyAdjustmentSection: initial={{ opacity: 0, ... }} 라인 전수 제거 - 이 환경의 framer-motion이 animate prop 완료 실패 → opacity:0에서 멈춤 Co-Authored-By: Claude Sonnet 4.6 --- src/components/plan/AssetCollection.tsx | 2 - src/components/plan/BrandingGuide.tsx | 4 -- src/components/plan/ChannelStrategy.tsx | 1 - src/components/plan/ContentStrategy.tsx | 8 --- src/components/plan/PlanCTA.tsx | 1 - src/components/plan/PlanHeader.tsx | 58 +++++-------------- src/components/plan/RepurposingProposal.tsx | 27 +++------ .../plan/StrategyAdjustmentSection.tsx | 3 - src/components/plan/WorkflowTracker.tsx | 4 -- 9 files changed, 21 insertions(+), 87 deletions(-) diff --git a/src/components/plan/AssetCollection.tsx b/src/components/plan/AssetCollection.tsx index c0fbd18..dbc082e 100644 --- a/src/components/plan/AssetCollection.tsx +++ b/src/components/plan/AssetCollection.tsx @@ -91,7 +91,6 @@ export default function AssetCollection({ data }: AssetCollectionProps) { key={asset.id} className="rounded-2xl border border-slate-100 bg-white shadow-sm p-5 cursor-pointer hover:shadow-[3px_4px_12px_rgba(0,0,0,0.06)] hover:border-[#D5CDF5] transition-all" onClick={() => setSelectedAsset({ kind: 'asset', data: asset })} - initial={{ opacity: 0, y: 20 }} animate={{ opacity: 1, y: 0 }} transition={{ duration: 0.4, delay: i * 0.05 }} > @@ -153,7 +152,6 @@ export default function AssetCollection({ data }: AssetCollectionProps) { key={video.title} className="min-w-[280px] rounded-2xl border border-slate-100 bg-white shadow-sm p-5 shrink-0 cursor-pointer hover:shadow-[3px_4px_12px_rgba(0,0,0,0.06)] hover:border-[#D5CDF5] transition-all" onClick={() => setSelectedAsset({ kind: 'youtube', data: video })} - initial={{ opacity: 0, x: 20 }} animate={{ opacity: 1, x: 0 }} transition={{ duration: 0.4, delay: i * 0.1 }} > diff --git a/src/components/plan/BrandingGuide.tsx b/src/components/plan/BrandingGuide.tsx index db15609..406aad3 100644 --- a/src/components/plan/BrandingGuide.tsx +++ b/src/components/plan/BrandingGuide.tsx @@ -157,7 +157,6 @@ function VisualIdentityTab({ data }: { data: BrandGuide }) { return ( @@ -396,7 +393,6 @@ function BrandConsistencyTab({ inconsistencies }: { inconsistencies: BrandIncons return ( diff --git a/src/components/plan/ChannelStrategy.tsx b/src/components/plan/ChannelStrategy.tsx index a2e8bed..b8e8bae 100644 --- a/src/components/plan/ChannelStrategy.tsx +++ b/src/components/plan/ChannelStrategy.tsx @@ -53,7 +53,6 @@ export default function ChannelStrategy({ channels }: ChannelStrategyProps) { diff --git a/src/components/plan/ContentStrategy.tsx b/src/components/plan/ContentStrategy.tsx index e7fc14e..0ec04c5 100644 --- a/src/components/plan/ContentStrategy.tsx +++ b/src/components/plan/ContentStrategy.tsx @@ -69,7 +69,6 @@ export default function ContentStrategy({ data }: ContentStrategyProps) { {activeTab === 'pillars' && ( @@ -78,7 +77,6 @@ export default function ContentStrategy({ data }: ContentStrategyProps) { key={pillar.title} className="rounded-2xl border border-slate-100 bg-white shadow-sm p-6 border-l-4" style={{ borderLeftColor: pillar.color }} - initial={{ opacity: 0, y: 20 }} animate={{ opacity: 1, y: 0 }} transition={{ duration: 0.4, delay: i * 0.1 }} > @@ -109,7 +107,6 @@ export default function ContentStrategy({ data }: ContentStrategyProps) { {activeTab === 'types' && ( @@ -123,7 +120,6 @@ export default function ContentStrategy({ data }: ContentStrategyProps) { @@ -151,7 +147,6 @@ export default function ContentStrategy({ data }: ContentStrategyProps) { {activeTab === 'workflow' && ( @@ -159,7 +154,6 @@ export default function ContentStrategy({ data }: ContentStrategyProps) {
@@ -191,7 +185,6 @@ export default function ContentStrategy({ data }: ContentStrategyProps) { {/* Tab 4: Repurposing */} {activeTab === 'repurposing' && ( @@ -214,7 +207,6 @@ export default function ContentStrategy({ data }: ContentStrategyProps) { diff --git a/src/components/plan/PlanCTA.tsx b/src/components/plan/PlanCTA.tsx index 53ed93b..5dcfe18 100644 --- a/src/components/plan/PlanCTA.tsx +++ b/src/components/plan/PlanCTA.tsx @@ -11,7 +11,6 @@ export default function PlanCTA() { return ( diff --git a/src/components/plan/PlanHeader.tsx b/src/components/plan/PlanHeader.tsx index 17ce800..940fa2e 100644 --- a/src/components/plan/PlanHeader.tsx +++ b/src/components/plan/PlanHeader.tsx @@ -28,7 +28,7 @@ export default function PlanHeader({ }: PlanHeaderProps) { return (
- {/* Animated blobs */} + {/* Animated blobs — position only, no opacity */}
- {/* Left: Text content */} - - + {/* Left: Text content — plain div, no opacity animation */} +
+

Marketing Execution Plan - +

- +

{clinicName} - +

- +

{clinicNameEn} - +

- +
{formatDate(date)} @@ -95,23 +70,18 @@ export default function PlanHeader({ {targetUrl} - - +
+
{/* Right: 90 Days badge */} - +
90 Days
- +
diff --git a/src/components/plan/RepurposingProposal.tsx b/src/components/plan/RepurposingProposal.tsx index 20849b5..78a9a40 100644 --- a/src/components/plan/RepurposingProposal.tsx +++ b/src/components/plan/RepurposingProposal.tsx @@ -1,5 +1,4 @@ import { useState } from 'react'; -import { motion } from 'motion/react'; import { YoutubeFilled, InstagramFilled, @@ -63,12 +62,9 @@ export default function RepurposingProposal({ proposals }: RepurposingProposalPr const isExpanded = expandedIdx === idx; return ( - {/* Card Header — click to expand */}