- 위험 채움 토큰 밝음 #e5484d → #d6363c(흰 글 3.91 → 4.72) · 어두움 5.6 · 위험 글 #c0392b 그대로 - 새 부품 계산 줄(ui_template_calc_row) — B08 수리집수면적표 b08-hydro__row · 식 칸 배치를 대신함 - 표 부품 칸 램프(ui-data-table__lamp · --only · ✓) — B08 집계표 · 거리이정표 · B09 설계내역 램프 CSS 세 벌을 걷음(표지 class 는 풍선 · 가이드용으로 남김) - 모달 넓은 중간 창(wide + width 1100px · 1100 × 680) — B09 운반 창 손 인라인 크기를 걷음 - 값 목록 규칙 꼴(rule) — ☰ 설정 규칙 줄 ul/li 를 걷음 - 접이 구역 머리(createCollapsibleHead = 패널 머리 + 접는 제목) — B08 구조물도 「조합 연결」 제목(옛 b08-sheets__title)을 대신함 - 일반 화면 틀 좁은 폭 · 입력 칸 2열 · 끝 단추 줄 — D01 · E01 이 B02 CSS 를 빌리던 것을 끊음(가이드 장면 선택자 맞춤) - 부품 모음 견본 · 지킴 시험 test_557_2 · 낡은 시험(198_1 · 247_1 · 251_1 · 257_1 · 276_1 · 551_1)은 부품 CSS · 새 class 로 맞춤 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
71 lines
3.9 KiB
TypeScript
71 lines
3.9 KiB
TypeScript
/* =============================================================================
|
|
* ui_template_collapsible.ts
|
|
* 부품 「접이 카드」(552-3 · 목록 16) — 제목 줄을 누르면 몸이 접히고 펴지는 카드.
|
|
* 꼴 = 패널 카드(`createPanelCard` · 왼쪽 패널 · 공용 양식 붙음 · ⚙ 곁값) · 구역(아무 상자에 클래스만 + `attachCollapsible`)
|
|
* · 구역 머리(`createCollapsibleHead` · 557-2) = 패널 머리(제목 14 · 부제 12 둘째 줄)를 접는 제목으로
|
|
* 크기 = 제목 줄 32(글 14 · 캐럿 ▾ ▸ 글자 1.7 배)
|
|
* 상태 = 기본 · 마우스(캐럿 진해짐) · 펼침 / 접힘(`.is-collapsed`)
|
|
* 쓰는 법 = `const card = createPanelCard("구조물 배치", false); card.append(form); attachCollapsible(panel)`
|
|
* 대신하는 옛 변종 = 날 `<details>` — B06 넷 · E01 `e-missing` · E03 `e03-prob-src` · M01 넷 · M02 일곱 · A07 약관 · B08 구조물도 「조합 연결」 `b08-sheets__title`
|
|
* 모양 = 제목 · 캐럿 `ui_template_theme.css` · 카드 `ui_template_overlay.css` · 마우스 `ui_template_collapsible.css`
|
|
*
|
|
* 페이지 공용 "접기 컨테이너" 동작. (B05 컨테이너 템플릿 기준으로 재사용)
|
|
*
|
|
* 규칙:
|
|
* - 컨테이너에 `ui-collapsible`, 그 제목 요소에 `ui-collapsible__title` 클래스를 준다.
|
|
* - 제목 **행 전체**를 클릭하면 컨테이너에 `is-collapsed`가 토글되어, 제목을 뺀 나머지 직속
|
|
* 자식이 숨겨진다(펼침 ▾ / 접힘 ▸ 캐럿은 공용 CSS가 그린다).
|
|
* - 컨테이너 내부의 별도 접힘 항목(`<details>` 등)은 건드리지 않는다.
|
|
*
|
|
* 스타일은 전역 `ui_template_theme.css`에 있어 어떤 페이지에서도 클래스만 붙이면 동작한다.
|
|
* ========================================================================== */
|
|
|
|
import "./ui_template_collapsible.css";
|
|
import { createPanelHead, type PanelHead, type PanelHeadOptions } from "./ui_template_panel_head";
|
|
|
|
/**
|
|
* 좌측 패널 컨테이너 공용 카드(269) — 접는 제목 + 공용 양식(`ui-panel-form`) · 내용은 카드에 바로 붙임 · 기본 닫힘(389-3).
|
|
* `onSettings` 를 넘기면 캐럿 바로 왼쪽 ⚙(280-5) — 누름은 접힘을 안 일으킴.
|
|
*/
|
|
export function createPanelCard(
|
|
title: string,
|
|
collapsed = true,
|
|
onSettings?: () => void,
|
|
): 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;
|
|
if (onSettings) {
|
|
const gear = document.createElement("button");
|
|
gear.type = "button";
|
|
gear.className = "ui-collapsible__settings";
|
|
gear.textContent = "⚙";
|
|
gear.title = gear.ariaLabel = "설정";
|
|
gear.addEventListener("click", (event) => {
|
|
event.stopPropagation(); // 제목 누름(접기 위임)으로 안 올라감
|
|
onSettings();
|
|
});
|
|
heading.append(gear);
|
|
}
|
|
section.append(heading);
|
|
return section;
|
|
}
|
|
|
|
/** 구역 머리(557-2) — 패널 머리(제목 · 부제)를 접는 제목으로 · 컨테이너에 `ui-collapsible` + `attachCollapsible` */
|
|
export function createCollapsibleHead(opts: PanelHeadOptions): PanelHead {
|
|
const head = createPanelHead(opts);
|
|
head.root.classList.add("ui-collapsible__title");
|
|
return head;
|
|
}
|
|
|
|
/** 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");
|
|
});
|
|
}
|