- MultiChannelInput: URL 뭉치 붙여넣기 → classifyUrls로 7개 채널 자동 분류
(homepage·YouTube·Instagram·Facebook·네이버플레이스·블로그·강남언니)
· "Analyze" pill 버튼 복원 + variant별 색 분기 (hero=dark brand,
cta=#fff3eb→#e4cfff→#f5f9ff warm 3-stop)
· placeholder 중앙 정렬 + "한 줄씩" 규칙 제거 (유연 파싱 노출)
- Navbar: Free Report CTA 제거 → Login + 문의하기 (contact@o2o.kr) duo
- LoginPage: 계약 고객용 스캐폴딩 페이지 신규 추가
- PricingPage: 계약 기반 영업 반영, FAQ에서 해지·환불 항목 제거
(세부 정책 미확정 → 후속 추가)
- Landing 카피 Strategic Planner 포지셔닝 피봇:
· Hero sub: "10분 진단 → 12개월 전략 설계"
· Solution AGDP: Audit / Generation / Direction / Planning 재해석
· Modules: Intelligence + Planning Available, 나머지 Coming Soon 정직화
· TargetAudience: 전략 파트너 / 전략 자문 + Partner Program 신청 waitlist
· Problems: 콘텐츠 소진 / 경쟁사 분석 부재 / 데이터 부족 3축
· UseCases: 진단·전략·KPI(Medical) · 수주·자문·포트폴리오(Agency)
- discover-channels Edge Function: manualChannels 수용 — 사용자 붙여넣은
URL이 Firecrawl 스크래핑보다 우선, naverPlace/gangnamUnni 직접 주입
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
80 lines
4.0 KiB
TypeScript
80 lines
4.0 KiB
TypeScript
import { useNavigate } from 'react-router';
|
|
import { motion } from 'motion/react';
|
|
import { PrismFilled } from './icons/FilledIcons';
|
|
import MultiChannelInput, { type AnalyzePayload } from './MultiChannelInput';
|
|
|
|
export default function Hero() {
|
|
const navigate = useNavigate();
|
|
|
|
const handleAnalyze = (payload: AnalyzePayload) => {
|
|
navigate('/report/loading', {
|
|
state: {
|
|
url: payload.primaryUrl,
|
|
manualChannels: payload.manualChannels,
|
|
},
|
|
});
|
|
};
|
|
|
|
return (
|
|
<section className="relative pt-28 pb-12 md:pt-36 md:pb-16 overflow-hidden flex flex-col items-center justify-center text-center px-6">
|
|
{/* Background Gradient */}
|
|
<div className="absolute inset-0 -z-10 bg-[radial-gradient(ellipse_at_top,_var(--tw-gradient-stops))] from-indigo-100 via-purple-50 to-pink-50 opacity-70"></div>
|
|
|
|
<div className="max-w-4xl mx-auto relative isolate">
|
|
<motion.div
|
|
initial={{ opacity: 0, y: 20 }}
|
|
animate={{ opacity: 1, y: 0 }}
|
|
transition={{ duration: 0.6 }}
|
|
className="inline-flex items-center gap-2 px-4 py-2 rounded-full bg-white/60 backdrop-blur-sm border border-white/40 shadow-sm mb-8"
|
|
>
|
|
<PrismFilled size={16} className="text-accent" />
|
|
<span className="text-sm font-medium text-slate-700">AI Marketing Strategist · Built for Premium Clinics</span>
|
|
</motion.div>
|
|
|
|
<motion.h1
|
|
initial={{ opacity: 0, y: 20 }}
|
|
animate={{ opacity: 1, y: 0 }}
|
|
transition={{ duration: 0.6, delay: 0.1 }}
|
|
className="text-5xl md:text-7xl font-serif font-bold text-primary-900 leading-[1.1] tracking-[-0.02em] mb-6"
|
|
>
|
|
<span className="tracking-[0.05em]">In<span className="ml-[-0.04em]">f</span><span className="ml-[-0.04em]">inite</span></span> Growth <br className="hidden md:block" />
|
|
<span className="text-gradient">Marketing Engine.</span>
|
|
</motion.h1>
|
|
|
|
{/* 서브 카피 — PART II 피봇: Strategic Planner 포지셔닝
|
|
▸ 이전 "Marketing that learns... 쓸수록 더 정교해지는..." 은 풀스택 자동화 약속이
|
|
Generation/Distribution Mock 상태와 맞지 않았음.
|
|
▸ Phase 1-4 (Discover→Collect→Report→Plan) 실제 구현 범위에 정직하게 일치시킴. */}
|
|
<motion.p
|
|
initial={{ opacity: 0, y: 20 }}
|
|
animate={{ opacity: 1, y: 0 }}
|
|
transition={{ duration: 0.6, delay: 0.2 }}
|
|
className="text-lg md:text-xl text-slate-600 mb-10 max-w-3xl mx-auto leading-relaxed"
|
|
>
|
|
The Strategic Planner for Premium Medical Marketing. <br className="hidden md:block" />
|
|
<span className="whitespace-nowrap">유튜브·인스타·네이버·강남언니를</span>{' '}
|
|
<span className="whitespace-nowrap">10분 만에 진단하고,</span>{' '}
|
|
<span className="whitespace-nowrap">병원의 12개월 마케팅 전략을</span>{' '}
|
|
<span className="whitespace-nowrap">설계합니다.</span>
|
|
</motion.p>
|
|
|
|
<motion.div
|
|
initial={{ opacity: 0, y: 20 }}
|
|
animate={{ opacity: 1, y: 0 }}
|
|
transition={{ duration: 0.6, delay: 0.3 }}
|
|
className="w-full"
|
|
>
|
|
<MultiChannelInput variant="hero" onAnalyze={handleAnalyze} />
|
|
</motion.div>
|
|
</div>
|
|
|
|
{/* Decorative elements — isolate prevents mix-blend-multiply from bleeding into content */}
|
|
<div className="absolute inset-0 -z-[5] isolate pointer-events-none">
|
|
<div className="absolute top-1/4 left-10 w-64 h-64 bg-purple-300 rounded-full mix-blend-multiply filter blur-3xl opacity-30 animate-blob"></div>
|
|
<div className="absolute top-1/3 right-10 w-64 h-64 bg-pink-300 rounded-full mix-blend-multiply filter blur-3xl opacity-30 animate-blob animation-delay-2000"></div>
|
|
<div className="absolute -bottom-8 left-1/2 -translate-x-1/2 w-64 h-64 bg-indigo-300 rounded-full mix-blend-multiply filter blur-3xl opacity-30 animate-blob animation-delay-4000"></div>
|
|
</div>
|
|
</section>
|
|
);
|
|
}
|