+ {/* 상단 헤더 */}
-
-
+ {/* 우측 앵커 네비 */}
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
);
}
\ No newline at end of file
diff --git a/apps/dm/app/(with-layout)/intro/_components/LawIntroSection.tsx b/apps/dm/app/(with-layout)/intro/_components/LawIntroSection.tsx
new file mode 100644
index 000000000..de39aa798
--- /dev/null
+++ b/apps/dm/app/(with-layout)/intro/_components/LawIntroSection.tsx
@@ -0,0 +1,123 @@
+"use client";
+
+import React from "react";
+import Image, { type StaticImageData } from "next/image";
+
+import lawPlan from "@/public/images/landing/intro/law_timeline.png";
+import planPerformance from "@/public/images/landing/intro/performance_left.png";
+import domesticChange from "@/public/images/landing/intro/domestic_textbox.png";
+import policyHistory from "@/public/images/landing/intro/policy_timeline.png";
+import lawRelation from "@/public/images/landing/intro/rel_note.png";
+import domesticLinkage from "@/public/images/landing/intro/linkage.png";
+
+function SectionTitle({ children }: { children: React.ReactNode }) {
+ return (
+
+
+
{children}
+
+ );
+}
+
+function Hr({ className = "" }: { className?: string }) {
+ return
;
+}
+
+function ImgCard({ src, alt }: { src: StaticImageData; alt: string }) {
+ return (
+
+
+
+ );
+}
+
+function SectionShell({
+ id,
+ title,
+ children,
+ className = "",
+}: {
+ id: string;
+ title: string;
+ children: React.ReactNode;
+ className?: string;
+}) {
+ return (
+
+ );
+}
+
+export default function LawIntroSection() {
+ const title = "물 재이용 법";
+
+ return (
+
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/apps/dm/app/(with-layout)/intro/_components/RainIntroSection.tsx b/apps/dm/app/(with-layout)/intro/_components/RainIntroSection.tsx
new file mode 100644
index 000000000..4de564a54
--- /dev/null
+++ b/apps/dm/app/(with-layout)/intro/_components/RainIntroSection.tsx
@@ -0,0 +1,99 @@
+"use client";
+
+import React from "react";
+import Image, { type StaticImageData } from "next/image";
+
+import rainSummary from "@/public/images/landing/intro/rainreuse_intro.png";
+import rainDuty from "@/public/images/landing/intro/rainreuse_mandatory.png";
+import rainDesign from "@/public/images/landing/intro/rainwater_design.png";
+import rainStandard from "@/public/images/landing/intro/rainwater_standards.png";
+
+function SectionTitle({ children }: { children: React.ReactNode }) {
+ return (
+
+
+
{children}
+
+ );
+}
+
+function Hr({ className = "" }: { className?: string }) {
+ return
;
+}
+
+function ImgCard({ src, alt }: { src: StaticImageData; alt: string }) {
+ return (
+
+
+
+ );
+}
+
+function SectionShell({
+ id,
+ title,
+ children,
+ className = "",
+}: {
+ id: string;
+ title: string;
+ children: React.ReactNode;
+ className?: string;
+}) {
+ return (
+
+ );
+}
+
+export default function RainIntroSection() {
+ const title = "빗물 이용시설";
+
+ return (
+
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/apps/dm/app/(with-layout)/intro/_components/ReuseWaterIntroSection.tsx b/apps/dm/app/(with-layout)/intro/_components/ReuseWaterIntroSection.tsx
new file mode 100644
index 000000000..03b01e398
--- /dev/null
+++ b/apps/dm/app/(with-layout)/intro/_components/ReuseWaterIntroSection.tsx
@@ -0,0 +1,96 @@
+"use client";
+
+import React from "react";
+import Image, { type StaticImageData } from "next/image";
+
+import greywaterIntro from "@/public/images/landing/intro/greywater_intro.png";
+import greywaterMandatory from "@/public/images/landing/intro/greywater_mandatory.png";
+import greywaterStandard from "@/public/images/landing/intro/greywater_standard.png";
+
+function SectionTitle({ children }: { children: React.ReactNode }) {
+ return (
+
+
+
{children}
+
+ );
+}
+
+function Hr({ className = "" }: { className?: string }) {
+ return
;
+}
+
+function ImgCard({ src, alt }: { src: StaticImageData; alt: string }) {
+ return (
+
+
+
+ );
+}
+
+function SectionShell({
+ id,
+ title,
+ children,
+ className = "",
+}: {
+ id: string;
+ title: string;
+ children: React.ReactNode;
+ className?: string;
+}) {
+ return (
+
+ );
+}
+
+export default function ReuseWaterIntroSection() {
+ const title = "중수도";
+
+ return (
+
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/apps/dm/app/(with-layout)/intro/_components/TreatedIntroSection.tsx b/apps/dm/app/(with-layout)/intro/_components/TreatedIntroSection.tsx
new file mode 100644
index 000000000..ff3ece0fc
--- /dev/null
+++ b/apps/dm/app/(with-layout)/intro/_components/TreatedIntroSection.tsx
@@ -0,0 +1,89 @@
+"use client";
+
+import React from "react";
+import Image, { type StaticImageData } from "next/image";
+
+import treatedwaterIntro from "@/public/images/landing/intro/treatedwater_intro.png";
+import treatedwaterMandatory from "@/public/images/landing/intro/treatedwater_mandatory.png";
+
+function SectionTitle({ children }: { children: React.ReactNode }) {
+ return (
+
+
+
{children}
+
+ );
+}
+
+function Hr({ className = "" }: { className?: string }) {
+ return
;
+}
+
+function ImgCard({ src, alt }: { src: StaticImageData; alt: string }) {
+ return (
+
+
+
+ );
+}
+
+function SectionShell({
+ id,
+ title,
+ children,
+ className = "",
+}: {
+ id: string;
+ title: string;
+ children: React.ReactNode;
+ className?: string;
+}) {
+ return (
+
+ );
+}
+
+export default function TreatedIntroSection() {
+ const title = "하수처리수";
+
+ return (
+
+
+
+ {title}
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/apps/dm/app/(with-layout)/intro/law/page.tsx b/apps/dm/app/(with-layout)/intro/law/page.tsx
index 0c6687eb0..63f504af4 100644
--- a/apps/dm/app/(with-layout)/intro/law/page.tsx
+++ b/apps/dm/app/(with-layout)/intro/law/page.tsx
@@ -1,8 +1,9 @@
+// DM 물 재이용 소개(물 재이용 법) 페이지
"use client";
import Image, { type StaticImageData } from "next/image";
import SubPageHeader from "@/components/SubPageHeader";
-import BusinessSubNav from "@/components/BusinessSubNav";
+// import BusinessSubNav from "@/components/BusinessSubNav";
import lawTimeline from "@/public/images/landing/intro/law_timeline.png";
import performanceLeft from "@/public/images/landing/intro/performance_left.png";
@@ -72,7 +73,7 @@ function SectionShell({ id, title, children, className = "" }: SectionShellProps
export default function WaterReuseLawPage() {
return (
-
+ {/*
*/}
-
+
{children}
{/* 우측 메뉴 영역 */}
-
+ {/* */}
);
diff --git a/apps/dm/app/(with-layout)/intro/page.tsx b/apps/dm/app/(with-layout)/intro/page.tsx
index f75e418e3..5ee955604 100644
--- a/apps/dm/app/(with-layout)/intro/page.tsx
+++ b/apps/dm/app/(with-layout)/intro/page.tsx
@@ -1,64 +1,86 @@
-"use client";
-
+// DM 물 재이용 소개 페이지
+import BusinessSubNav, { type BusinessSubNavMenu } from "@/components/BusinessSubNav";
import SubPageHeader from "@/components/SubPageHeader";
-import BusinessSubNav from "@/components/BusinessSubNav";
-// import LawSection from "./_components/LawSection";
-// import RainIntroSection from "./_components/RainIntroSection";
-// import GreywaterIntroSection from "./_components/GreywaterIntroSection";
-// import SewageIntroSection from "./_components/SewageIntroSection";
+import LawIntroSection from "./_components/LawIntroSection";
+import RainIntroSection from "./_components/RainIntroSection";
+import ReuseWaterIntroSection from "./_components/ReuseWaterIntroSection";
+import TreatedIntroSection from "./_components/TreatedIntroSection";
-function Hr({ className = "" }: { className?: string }) {
- return
;
-}
+const menus: BusinessSubNavMenu[] = [
+ {
+ key: "intro-law",
+ label: "물 재이용 법",
+ sections: [
+ { id: "law-plan", label: "법률 제·개정 및 기본계획 수립" },
+ { id: "plan-performance", label: "제2차 계획 대비 실적 현황" },
+ { id: "domestic-change", label: "우리나라의 수자원 현황 및 물이용 여건" },
+ { id: "policy-history", label: "물 재이용 정책 변화 추이" },
+ { id: "law-relation", label: "타법령과의 관계 검토" },
+ { id: "domestic-linkage", label: "주요 국가계획의 정책방향과 연계한 물 재이용 정책 필요" },
+ ],
+ },
+ {
+ key: "intro-rain",
+ label: "빗물 이용시설",
+ defaultOpen: false,
+ sections: [
+ { id: "rain-intro", label: "빗물 재이용 소개" },
+ {
+ id: "rain-mandatory",
+ label: "빗물이용시설 설치 관리 법적 의무 대상",
+ },
+ { id: "rain-design", label: "빗물이용시설 설계 방안" },
+ {
+ id: "rain-standards",
+ label: "빗물이용시설 시설기준 및 관리기준",
+ },
+ ],
+ },
+ {
+ key: "intro-greywater",
+ label: "중수도",
+ defaultOpen: false,
+ sections: [
+ { id: "greywater-intro", label: "중수 재이용 소개" },
+ { id: "greywater-mandatory", label: "중수도 설치 의무 대상" },
+ { id: "greywater-standard", label: "중수도 시설기준 및 관리기준" },
+ ],
+ },
+ {
+ key: "intro-treated",
+ label: "하수처리수",
+ defaultOpen: false,
+ sections: [
+ { id: "treatedwater-intro", label: "하수처리수 소개" },
+ {
+ id: "treatedwater-mandatory",
+ label: "하수처리수 재이용시설 의무 대상",
+ },
+ ],
+ },
+];
export default function IntroPage() {
- const sections = [
- { id: "law", label: "물 재이용 법" },
- { id: "rain", label: "빗물 이용시설" },
- { id: "greywater", label: "중수도" },
- { id: "sewage", label: "하수처리수" },
- ];
-
return (
-
+
+ {/* 상단 헤더 */}
+ {/* 우측 앵커 네비 */}
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ {/* 본문 */}
+
+
+
+
+
-
-
);
}
\ No newline at end of file
diff --git a/apps/dm/app/(with-layout)/intro/rain/page.tsx b/apps/dm/app/(with-layout)/intro/rain/page.tsx
index acfb6cacd..bbcf708e1 100644
--- a/apps/dm/app/(with-layout)/intro/rain/page.tsx
+++ b/apps/dm/app/(with-layout)/intro/rain/page.tsx
@@ -1,3 +1,4 @@
+// DM 물 재이용 소개(빗물 이용시설) 페이지
"use client";
import Image, { type StaticImageData } from "next/image";
diff --git a/apps/dm/app/(with-layout)/intro/reuseWater/page.tsx b/apps/dm/app/(with-layout)/intro/reuseWater/page.tsx
index ab19fe2ed..b7e0c6731 100644
--- a/apps/dm/app/(with-layout)/intro/reuseWater/page.tsx
+++ b/apps/dm/app/(with-layout)/intro/reuseWater/page.tsx
@@ -1,5 +1,5 @@
+// DM 물 재이용 소개(중수도) 페이지
"use client";
-
import Image, { type StaticImageData } from "next/image";
import SubPageHeader from "@/components/SubPageHeader";
import BusinessSubNav from "@/components/BusinessSubNav";
diff --git a/apps/dm/app/(with-layout)/intro/treated/page.tsx b/apps/dm/app/(with-layout)/intro/treated/page.tsx
index 37221fbd1..7f4280ff1 100644
--- a/apps/dm/app/(with-layout)/intro/treated/page.tsx
+++ b/apps/dm/app/(with-layout)/intro/treated/page.tsx
@@ -1,5 +1,5 @@
+// DM 물 재이용 소개(하수처리수) 페이지
"use client";
-
import Image, { type StaticImageData } from "next/image";
import SubPageHeader from "@/components/SubPageHeader";
import BusinessSubNav from "@/components/BusinessSubNav";
diff --git a/apps/dm/app/(with-layout)/status/layout.tsx b/apps/dm/app/(with-layout)/status/layout.tsx
index 63ea923fa..6ce4ebbe3 100644
--- a/apps/dm/app/(with-layout)/status/layout.tsx
+++ b/apps/dm/app/(with-layout)/status/layout.tsx
@@ -2,7 +2,6 @@
import type { ReactNode } from "react";
import Lnb from "@/components/Lnb";
-import BusinessSubNav from "@/components/BusinessSubNav";
export default function ExampleLayout({ children }: { children: ReactNode }) {
return (
diff --git a/apps/dm/app/(with-layout)/status/page.tsx b/apps/dm/app/(with-layout)/status/page.tsx
index ff10dbaea..1043827dd 100644
--- a/apps/dm/app/(with-layout)/status/page.tsx
+++ b/apps/dm/app/(with-layout)/status/page.tsx
@@ -1,4 +1,6 @@
+// DM 물 재이용 현황 페이지
import BusinessSubNav, { type BusinessSubNavMenu } from "@/components/BusinessSubNav";
+import SubPageHeader from "@/components/SubPageHeader";
import RainStatusSection from "./_components/RainStatusSection";
import GreywaterStatusSection from "./_components/GreywaterStatusSection";
import SewageStatusSection from "./_components/SewageStatusSection";
@@ -7,8 +9,6 @@ const menus: BusinessSubNavMenu[] = [
{
key: "status-rain",
label: "빗물이용시설(현황)",
- current: true,
- defaultOpen: true,
sections: [
{
id: "status-rain-building",
@@ -75,9 +75,18 @@ const menus: BusinessSubNavMenu[] = [
export default function StatusPage() {
return (
+ {/* 상단 헤더 */}
+
+ {/* 우측 앵커 네비 */}
-
+
diff --git a/apps/dm/components/BusinessSubNav.tsx b/apps/dm/components/BusinessSubNav.tsx
index ecfe805b3..6b4246412 100644
--- a/apps/dm/components/BusinessSubNav.tsx
+++ b/apps/dm/components/BusinessSubNav.tsx
@@ -83,19 +83,24 @@ export default function BusinessSubNav({
return () => observer.disconnect();
}, [allSections, offsetTop]);
- useEffect(() => {
- if (!activeId) return;
+ useEffect(() => {
+ if (!activeId) return;
const parentMenu = menus.find((menu) =>
- (menu.sections ?? []).some((section) => section.id === activeId)
+ (menu.sections ?? []).some((section) => section.id === activeId)
);
if (!parentMenu) return;
- setOpenMenus((prev) => ({
- ...prev,
- [parentMenu.key]: true,
- }));
+ setOpenMenus(() => {
+ const nextOpenState: Record
= {};
+
+ menus.forEach((menu) => {
+ nextOpenState[menu.key] = menu.key === parentMenu.key;
+ });
+
+ return nextOpenState;
+ });
}, [activeId, menus]);
const handleMove = (id: string) => {
@@ -136,17 +141,16 @@ export default function BusinessSubNav({
return (
-
+
{menu.href ? (
{menu.label}
@@ -158,10 +162,10 @@ export default function BusinessSubNav({
if (hasChildren) toggleMenu(menu.key);
}}
className={[
- "text-left text-[16px] font-extrabold tracking-[-0.02em]",
+ "text-left text-[16px] font-medium tracking-[-0.02em]",
isCurrentGroup || menu.current
? "text-sky-500"
- : "text-[#6B7280]",
+ : "text-[#767676]",
].join(" ")}
>
{menu.label}
@@ -176,7 +180,7 @@ export default function BusinessSubNav({
"ml-2 shrink-0",
isCurrentGroup || menu.current
? "text-sky-500"
- : "text-[#6B7280]",
+ : "text-[#767676]",
].join(" ")}
aria-label={`${menu.label} 드롭다운 토글`}
>
@@ -214,7 +218,7 @@ export default function BusinessSubNav({
/>
{/* 하단 라인 + 안내문 */}
- {!hideGuideText && (
+ {/* {!hideGuideText && (
*
{note.replace("*", "")}
- )}
+ )} */}
);
diff --git a/apps/dm/public/images/landing/business/rain/rain_03.png b/apps/dm/public/images/landing/business/rain/jeju_01.png
similarity index 100%
rename from apps/dm/public/images/landing/business/rain/rain_03.png
rename to apps/dm/public/images/landing/business/rain/jeju_01.png
diff --git a/apps/dm/public/images/landing/business/rain/rain_04.png b/apps/dm/public/images/landing/business/rain/jeju_02.png
similarity index 100%
rename from apps/dm/public/images/landing/business/rain/rain_04.png
rename to apps/dm/public/images/landing/business/rain/jeju_02.png