Files
Aislo/A02_ProgDetail/A02_ProgDetail_UI_Page.ts

146 lines
5.1 KiB
TypeScript

/* =============================================================================
* 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);
}