-
-
-
- Who is Infinite Marketing for
-
-
프리미엄 의료 서비스와 전문 마케팅 에이전시를 위한 최적의 솔루션
-
+ const { ref, inView } = useInView
();
-
- {SOLUTION_CARDS.map(({ title, description, items, gradient }, index) => (
-
-
- {title}
-
-
- {description}
-
-
- {items.map((item, i) => (
-
- {item}
-
- ))}
-
-
- ))}
-
-
+ return (
+
+
+
+
+
+ Who is Infinite Marketing for
+
+
+ 프리미엄 의료 서비스와 전문 마케팅 에이전시를 위한 최적의 솔루션
+
- )
-}
\ No newline at end of file
+
+
+ {SOLUTION_CARDS.map(({ title, description, items, cardClass, tagClass, animClass }) => (
+
+
{title}
+
{description}
+
+ {items.map((item) => (
+
+ {item}
+
+ ))}
+
+
+ ))}
+
+
+
+
+ );
+}
diff --git a/src/features/home/ui/SystemSection.tsx b/src/features/home/ui/SystemSection.tsx
index babc9bb..2f027cb 100644
--- a/src/features/home/ui/SystemSection.tsx
+++ b/src/features/home/ui/SystemSection.tsx
@@ -1,56 +1,62 @@
-import bg from "@/assets/home/bg_system.png";
-
-const CORE_MODULES = [
- { index: 1, title: "Marketing Intelligence", description: ["브랜딩, 마케팅 현황 분석", "타겟 고객 분석", "키워드 분석", "경쟁 및 포지셔닝 분석"], footer: "SEO 전략 & 채널별 콘텐츠 기획", angle: 0 },
- { index: 2, title: "Content Creation", description: ["블로그 콘텐츠 생성", "SEO 콘텐츠 생성", "SNS 콘텐츠 생성", "마케팅 카피 생성"], footer: "Human-in-the loop 프로세스", angle: 78 },
- { index: 3, title: "Video Automation", description: ["블로그 → 영상 변환", "숏폼 콘텐츠 생성", "유튜브 콘텐츠 제작", "SNS 영상 제작"], footer: "멀티모달 AI 엔진: 영상 + 음악 + 카피", angle: 144 },
- { index: 4, title: "Distribution Engine", description: ["블로그 게시", "SNS 자동 게시", "유튜브 업로드", "콘텐츠 일정 관리"], footer: "SEO, AEO 자동 최적화", angle: 216 },
- { index: 5, title: "Performance Intelligence", description: ["SEO 성과 분석", "콘텐츠 성과 분석", "채널 성과 분석", "AI 콘텐츠 개선 전략 추천"], footer: "데이터 기반 효과 검증", angle: 283 },
-]
+import { CORE_MODULES, MODULE_CARD_STAGGER } from "@/features/home/constants/modules_contents";
+import { useInView } from "@/hooks/useInView";
+import { CoreModuleCard } from "./system/CoreModuleCard";
+import { CoreModulesCenterHeading } from "./system/CoreModulesCenterHeading";
export function SystemSection() {
- return (
-
-
-
- Core Modules
-
-
- 성능 개선 반영 자율 순환 마케팅 시스템
-
-
+ const { ref, inView } = useInView
();
-
-
- Self-Improving Growth Engine
-
+ return (
+
+
+
+
- {CORE_MODULES.map(({ index, title, description, footer, angle }) => (
-
-
-
- {index}
-
-
- {title}
-
-
-
-
- {description.map((desc) => (
-
{desc}
- ))}
-
-
-
-
{footer}
-
- ))}
-
+
+
+
Core Modules
+
+ 성능 개선 반영 자율 순환 마케팅 시스템
+
- )
-}
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {CORE_MODULES.map((mod, idx) => (
+
+ ))}
+
+
+
+
+ );
+}
diff --git a/src/features/home/ui/UseCaseSection.tsx b/src/features/home/ui/UseCaseSection.tsx
index a3c7157..3dd69f6 100644
--- a/src/features/home/ui/UseCaseSection.tsx
+++ b/src/features/home/ui/UseCaseSection.tsx
@@ -1,56 +1,44 @@
-const CheckIcon = ({ fill }: { fill: string }) => (
-
-
-
-
-)
-
-const USE_CASES = [
- {
- title: "Premium Medical Business",
- descriptions: ["SEO 콘텐츠 자동 생산으로 검색 상위 노출 달성", "비용 부담 없이 고품질 영상 콘텐츠 대량 확대", "자연 검색 유입 증가로 인한 환자 전환율 상승"],
- color: "#2B7FFF",
- gradient: "from-[#EFF6FF]",
- },
- {
- title: "Marketing Agency",
- descriptions: ["AI 기반 콘텐츠 제작 자동화로 생산성 극대화", "블로그 텍스트 기반 영상 제작 자동화로 리소스 절감", "다수 클라이언트 계정의 통합 운영 및 효율화"],
- color: "#AD46FF",
- gradient: "from-[#FAF5FF]",
- },
-]
+import CheckCircleIcon from "@/assets/home/check-circle.svg?react";
+import { USE_CASE_CARDS } from "@/features/home/constants/use_cases_contents";
+import { useInView } from "@/hooks/useInView";
export function UseCaseSection() {
- return (
-
-
-
- Use Cases
-
-
- Infinite Marketing이 만드는 실질적인 변화를 확인해보세요!
-
-
+ const { ref, inView } = useInView
();
-
- {USE_CASES.map(({ title, descriptions, color, gradient }, index) => (
-
-
- {title}
-
-
- {descriptions.map((desc, i) => (
-
- {desc}
-
- ))}
-
-
- ))}
-
+ return (
+
+
+
+
Use Cases
+
+ Infinite Marketing이 만드는 실질적인 변화를 확인해보세요!
+
- )
-}
\ No newline at end of file
+
+
+ {USE_CASE_CARDS.map((c) => (
+
+
{c.title}
+
+ {c.items.map((item) => (
+
+
+
+ {item}
+
+
+ ))}
+
+
+ ))}
+
+
+
+ );
+}
diff --git a/src/features/home/ui/process/AgdpCycleSummaryCard.tsx b/src/features/home/ui/process/AgdpCycleSummaryCard.tsx
new file mode 100644
index 0000000..75f7171
--- /dev/null
+++ b/src/features/home/ui/process/AgdpCycleSummaryCard.tsx
@@ -0,0 +1,22 @@
+type Props = { visible: boolean };
+
+export function AgdpCycleSummaryCard({ visible }: Props) {
+ return (
+
+
+
+ AGDP Cycle: {" "}
+
+ 분석(Analysis) → 생성(Generation) → 배포(Distribution) → 성과(Performance)의 무한 루프를 통해 콘텐츠 품질(CTR)을{" "}
+
+ 자율 최적화
+ 합니다.
+
+
+
+ );
+}
diff --git a/src/features/home/ui/process/AgdpEngineDiagram.tsx b/src/features/home/ui/process/AgdpEngineDiagram.tsx
new file mode 100644
index 0000000..01abb4d
--- /dev/null
+++ b/src/features/home/ui/process/AgdpEngineDiagram.tsx
@@ -0,0 +1,55 @@
+import { AGDP_NODES } from "@/features/home/constants/process_contents";
+import { AgdpOrbitNode } from "./AgdpOrbitNode";
+import { AgdpRewardPathLabel } from "./AgdpRewardPathLabel";
+
+type Props = { visible: boolean };
+
+export function AgdpEngineDiagram({ visible }: Props) {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AGDP
+
+
+ Infinite
+
+ Marketing
+
+
+
+
+ {AGDP_NODES.map((node) => (
+
+ ))}
+
+
+
+ );
+}
diff --git a/src/features/home/ui/process/AgdpOrbitNode.tsx b/src/features/home/ui/process/AgdpOrbitNode.tsx
new file mode 100644
index 0000000..eb139d0
--- /dev/null
+++ b/src/features/home/ui/process/AgdpOrbitNode.tsx
@@ -0,0 +1,21 @@
+import type { AgdpNodeDef } from "@/features/home/constants/process_contents";
+import { AGDP_SLOT_WRAPPER_CLASS } from "@/features/home/constants/process_contents";
+
+type Props = { node: AgdpNodeDef };
+
+export function AgdpOrbitNode({ node }: Props) {
+ const wrapperClass = AGDP_SLOT_WRAPPER_CLASS[node.slot];
+
+ return (
+
+
+ {node.letter}
+
+
+
+ {node.label}
+
+
+
+ );
+}
diff --git a/src/features/home/ui/process/AgdpRewardPathLabel.tsx b/src/features/home/ui/process/AgdpRewardPathLabel.tsx
new file mode 100644
index 0000000..425d65d
--- /dev/null
+++ b/src/features/home/ui/process/AgdpRewardPathLabel.tsx
@@ -0,0 +1,17 @@
+/** P→A 호 SVG 경로 위 "Reward" 라벨 (DEMO Solution.tsx) */
+export function AgdpRewardPathLabel() {
+ const pathId = "agdp-reward-path";
+
+ return (
+
+
+
+
+
+
+ ← Reward SIGNAL
+
+
+
+ );
+}
diff --git a/src/features/home/ui/process/MarketingEngineIntro.tsx b/src/features/home/ui/process/MarketingEngineIntro.tsx
new file mode 100644
index 0000000..71af2b6
--- /dev/null
+++ b/src/features/home/ui/process/MarketingEngineIntro.tsx
@@ -0,0 +1,40 @@
+import twinklePink from "@/assets/home/twinkle_pink.svg";
+
+type Props = { visible: boolean };
+
+export function MarketingEngineIntro({ visible }: Props) {
+ return (
+ <>
+
+
+
AI Marketing Engine
+
+
+
+ Infinite Marketing Engine
+
+
+
+
+ Infinite Marketing for Premium Medical Business & Marketing Agency
+
+
+ Infinite Marketing은 Premium Medical Business와 Marketing Agency를 위한 AI Marketing Automation Platform입니다.
+ INFINITH는 마케팅 분석, 콘텐츠 생성, 영상 콘텐츠 제작, 채널 배포, 성과 분석과 피드백 적용을 하나의 Self-Improving Marketing
+ Engine으로 제공합니다.
+
+ >
+ );
+}
diff --git a/src/features/home/ui/system/CoreModuleCard.tsx b/src/features/home/ui/system/CoreModuleCard.tsx
new file mode 100644
index 0000000..c0dc52a
--- /dev/null
+++ b/src/features/home/ui/system/CoreModuleCard.tsx
@@ -0,0 +1,37 @@
+import type { CoreModule } from "@/features/home/constants/modules_contents";
+
+type Props = {
+ mod: CoreModule;
+ className?: string;
+ visible: boolean;
+ delayClass?: string;
+};
+
+export function CoreModuleCard({ mod, className = "", visible, delayClass = "" }: Props) {
+ return (
+
+
+
+ {mod.step}
+
+
{mod.title}
+
+
+
+ {mod.items.map((item) => (
+
+ {item}
+
+ ))}
+
+
+
+ {mod.highlight}
+
+
+ );
+}
diff --git a/src/features/home/ui/system/CoreModulesCenterHeading.tsx b/src/features/home/ui/system/CoreModulesCenterHeading.tsx
new file mode 100644
index 0000000..ac3d088
--- /dev/null
+++ b/src/features/home/ui/system/CoreModulesCenterHeading.tsx
@@ -0,0 +1,20 @@
+type Props = { visible: boolean };
+
+/** Core Modules 섹션 중앙 — Self-Improving Growth Engine 타이틀 */
+export function CoreModulesCenterHeading({ visible }: Props) {
+ return (
+
+
+
+ Self-Improving
+
+ Growth Engine
+
+
+
+ );
+}
diff --git a/src/hooks/useInView.ts b/src/hooks/useInView.ts
new file mode 100644
index 0000000..cf6a0a2
--- /dev/null
+++ b/src/hooks/useInView.ts
@@ -0,0 +1,32 @@
+import { useEffect, useRef, useState } from "react";
+
+/**
+ * 요소가 뷰포트에 진입하면 inView = true 로 바뀌는 훅.
+ * framer-motion의 whileInView({ once: true }) 와 동일한 동작.
+ */
+export function useInView(
+ options?: IntersectionObserverInit,
+) {
+ const ref = useRef(null);
+ const [inView, setInView] = useState(false);
+
+ useEffect(() => {
+ const el = ref.current;
+ if (!el) return;
+
+ const observer = new IntersectionObserver(
+ ([entry]) => {
+ if (entry.isIntersecting) {
+ setInView(true);
+ observer.disconnect(); // once: true
+ }
+ },
+ { threshold: 0.15, ...options },
+ );
+
+ observer.observe(el);
+ return () => observer.disconnect();
+ }, []);
+
+ return { ref, inView };
+}
diff --git a/src/hooks/useScrollToTop.ts b/src/hooks/useScrollToTop.ts
new file mode 100644
index 0000000..d795ed6
--- /dev/null
+++ b/src/hooks/useScrollToTop.ts
@@ -0,0 +1,15 @@
+import { useNavigate } from "react-router-dom";
+
+/**
+ * 지정한 경로로 이동하면서 페이지 상단으로 smooth 스크롤합니다.
+ * 로고 클릭 등 "홈으로 돌아가기 + 스크롤 초기화" 패턴에 사용합니다.
+ */
+export function useScrollToTop(path = "/") {
+ const navigate = useNavigate();
+
+ return (e: React.MouseEvent) => {
+ e.preventDefault();
+ navigate(path);
+ window.scrollTo({ top: 0, behavior: "smooth" });
+ };
+}
diff --git a/src/layouts/Footer.tsx b/src/layouts/Footer.tsx
index 73fe3ee..09eb9ed 100644
--- a/src/layouts/Footer.tsx
+++ b/src/layouts/Footer.tsx
@@ -1,22 +1,48 @@
+import { Link } from "react-router-dom";
+import { useScrollToTop } from "@/hooks/useScrollToTop";
+
+const LINKS = [
+ { label: "Privacy Policy", href: "/privacy" },
+ { label: "Terms of Service", href: "/terms" },
+];
+
export function Footer() {
- return (
-