/* ============================================================================= * A02_ProgDetail_UI_Page.ts * 로그인 전 02: 프로그램 상세 (6단계 워크플로우 + 핵심 기술 소개) * * 제약 준수: * - 모든 문구는 ui_template_locale.ts 참조 (하드코딩 금지). * - 색상/간격은 A02_ProgDetail_UI_Style.css + theme.css 변수만 사용. * - 공통 컴포넌트(createButton/createCard) 우선 사용. * - 이벤트 핸들러는 on[페이지]_[기능]_[액션] 명명. * ========================================================================== */ import { ui_locales, currentLanguageIndex } from "@ui/ui_template_locale"; import { createButton, createCard } from "@ui/ui_template_elements"; import { navigateTo } from "../A00_Common/router"; import { ROUTES } from "@config/config_frontend"; import "./A02_ProgDetail_UI_Style.css"; /** locale 헬퍼 */ function L(key: keyof typeof ui_locales): string { return ui_locales[key][currentLanguageIndex]; } /* ----------------------------------------------------------------------------- * 이벤트 핸들러 * -------------------------------------------------------------------------- */ function onA02_ProgDetail_Start_Click(): void { navigateTo(ROUTES.A07_REGISTER); } /* ----------------------------------------------------------------------------- * 섹션 빌더 * -------------------------------------------------------------------------- */ function buildHero(): HTMLElement { const hero = document.createElement("section"); hero.className = "a02-hero"; const inner = document.createElement("div"); inner.className = "a02-hero__inner"; const title = document.createElement("h1"); title.className = "a02-hero__title"; title.textContent = L("A02_ProgDetail_Title"); const subtitle = document.createElement("p"); subtitle.className = "a02-hero__subtitle"; subtitle.textContent = L("A02_ProgDetail_Hero_Subtitle"); const cta = createButton({ label: L("A02_ProgDetail_Hero_Cta"), variant: "filled", onClick: onA02_ProgDetail_Start_Click, }); inner.append(title, subtitle, cta); hero.append(inner); return hero; } function buildWorkflow(): HTMLElement { const section = document.createElement("section"); section.className = "a02-section"; const heading = document.createElement("h2"); heading.className = "a02-section__title"; heading.textContent = L("A02_ProgDetail_Workflow_SectionTitle"); const list = document.createElement("div"); list.className = "a02-workflow-list"; const steps: [keyof typeof ui_locales, keyof typeof ui_locales][] = [ ["A02_ProgDetail_Step1_Title", "A02_ProgDetail_Step1_Desc"], ["A02_ProgDetail_Step2_Title", "A02_ProgDetail_Step2_Desc"], ["A02_ProgDetail_Step3_Title", "A02_ProgDetail_Step3_Desc"], ["A02_ProgDetail_Step4_Title", "A02_ProgDetail_Step4_Desc"], ["A02_ProgDetail_Step5_Title", "A02_ProgDetail_Step5_Desc"], ["A02_ProgDetail_Step6_Title", "A02_ProgDetail_Step6_Desc"], ]; steps.forEach(([titleKey, descKey], index) => { const row = document.createElement("div"); row.className = "a02-workflow-row"; const badge = document.createElement("span"); badge.className = "a02-workflow-row__badge"; badge.textContent = String(index + 1); const text = document.createElement("div"); text.className = "a02-workflow-row__text"; const stepTitle = document.createElement("h3"); stepTitle.className = "a02-workflow-row__title"; stepTitle.textContent = L(titleKey); const stepDesc = document.createElement("p"); stepDesc.className = "a02-workflow-row__desc"; stepDesc.textContent = L(descKey); text.append(stepTitle, stepDesc); row.append(badge, text); list.append(row); }); section.append(heading, list); return section; } function buildTech(): HTMLElement { const section = document.createElement("section"); section.className = "a02-section"; const heading = document.createElement("h2"); heading.className = "a02-section__title"; heading.textContent = L("A02_ProgDetail_Tech_SectionTitle"); const grid = document.createElement("div"); grid.className = "a02-tech-grid"; const techs: [keyof typeof ui_locales, keyof typeof ui_locales][] = [ ["A02_ProgDetail_Tech1_Title", "A02_ProgDetail_Tech1_Desc"], ["A02_ProgDetail_Tech2_Title", "A02_ProgDetail_Tech2_Desc"], ["A02_ProgDetail_Tech3_Title", "A02_ProgDetail_Tech3_Desc"], ]; for (const [titleKey, descKey] of techs) { const desc = document.createElement("p"); desc.className = "a02-tech__desc"; desc.textContent = L(descKey); const card = createCard({ title: L(titleKey), body: [desc] }); card.classList.add("a02-tech-card"); grid.append(card); } section.append(heading, grid); return section; } /* ----------------------------------------------------------------------------- * 페이지 진입점 * -------------------------------------------------------------------------- */ export function renderA02ProgDetail(root: HTMLElement): void { const page = document.createElement("div"); page.className = "a02-prog-detail"; page.append(buildHero(), buildWorkflow(), buildTech()); root.append(page); }