- ui_template: .ui-panel-form(칸 26px · 라벨 틈 2px · 캡션 글자 · 단추 크기) · .ui-panel-btn · createPanelCard - 칸 높이 · 라벨 틈 토큰 = theme 한 곳 · 「구조물 배치」도 같은 토큰 - B07 평면도 · 횡단도 묶음 = 공용 카드 · 도면 단추 = .ui-panel-btn · 페이지 덧칠 걷음 - 시험 test_269_panel_form · 212-3 기대값 · 130 · 153 헬퍼 공용 카드 연결 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QND7Co43B24zK2P937rdxt
33 lines
1.8 KiB
TypeScript
33 lines
1.8 KiB
TypeScript
/* =============================================================================
|
|
* ui_template_collapsible.ts
|
|
* 페이지 공용 "접기 컨테이너" 동작. (B05 컨테이너 템플릿 기준으로 재사용)
|
|
*
|
|
* 규칙:
|
|
* - 컨테이너에 `ui-collapsible`, 그 제목 요소에 `ui-collapsible__title` 클래스를 준다.
|
|
* - 제목 **행 전체**를 클릭하면 컨테이너에 `is-collapsed`가 토글되어, 제목을 뺀 나머지 직속
|
|
* 자식이 숨겨진다(펼침 ▾ / 접힘 ▸ 캐럿은 공용 CSS가 그린다).
|
|
* - 컨테이너 내부의 별도 접힘 항목(`<details>` 등)은 건드리지 않는다.
|
|
*
|
|
* 스타일은 전역 `ui_template_theme.css`에 있어 어떤 페이지에서도 클래스만 붙이면 동작한다.
|
|
* ========================================================================== */
|
|
|
|
/** 좌측 패널 컨테이너 공용 카드(269) — 접는 제목 + 공용 양식(`ui-panel-form`) · 내용은 카드에 바로 붙임. */
|
|
export function createPanelCard(title: string, collapsed = false): HTMLElement {
|
|
const section = document.createElement("section");
|
|
section.className = `ui-collapsible ui-sidebar-section ui-sidebar-card ui-panel-form${collapsed ? " is-collapsed" : ""}`;
|
|
const heading = document.createElement("h3");
|
|
heading.className = "ui-collapsible__title";
|
|
heading.textContent = title;
|
|
section.append(heading);
|
|
return section;
|
|
}
|
|
|
|
/** root 아래 `.ui-collapsible__title` 클릭을 위임 처리해 해당 컨테이너를 접거나 편다. */
|
|
export function attachCollapsible(root: HTMLElement): void {
|
|
root.addEventListener("click", (event) => {
|
|
const title = (event.target as HTMLElement).closest<HTMLElement>(".ui-collapsible__title");
|
|
const container = title?.closest<HTMLElement>(".ui-collapsible");
|
|
if (title && container) container.classList.toggle("is-collapsed");
|
|
});
|
|
}
|