Files
Aislo/ui_template/ui_template_toggle.ts
T
eomsangdonandClaude Opus 5.5 2c51bb53a6 feat(ui-kit): 기본 부품 입력 · 고르기 · 슬라이더 · 체크 · 켜기 · 분할 · 탭 · 배지 · 툴팁 · 보조 글 (PLAN 552-2)
- ui_template_input.ts · .css 새로 — createInputField · createSelectField 를 옮김(ui_template_elements 가 다시 내보냄 · 부르는 길 그대로) · size(data-size 단 높이) · unit(칸 안 단위) · multiline · createSlider(이름 | 막대 | 값 글 3열)
- 옛 compact 는 단을 안 붙임 — 옛 작은 칸 30 그대로(32 로 맞추면 페이지 칸이 바뀜 · 553 에서 단으로 옮김)
- 입력 · 고르기 상태 = 마우스 선 짙게 · 막힘 흐림 · 오류 빨강(aria-invalid 같이) · 고르기 화살표 = 보라 → 보조 글 색(밝음 · 어두움 따로)
- 체크 = 라디오 · 칩 꼴 더함(createCheckbox 부름 그대로) · 켜기(스위치 · 색 점 칩) · 분할 고르기(대시보드 .b01-sys-seg 꼴) · 탭(밑줄 · 보조 알약 = 옛 .ui-subtabs · 수 배지)
- 배지(알약 · 수 · 램프 ✓ ✗ · 점 · 옛 .ui-tag 같이) · 툴팁 제자리 상자(tooltipBox) · 보조 글(흐린 · 안내 · 오류 ✗ · 경고 ! · 성공 ✓)
- 부품 모음 기본 묶음 13 줄 모두 새 부품 견본 · 상태 다섯 칸 · 여덟 단 한 줄
- 시험 test_552_2_parts 새로(머리 · 옛 이름 · 크기 단 · 상태 · 날 색 없음 · 부품 모음 13)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 21:39:26 +09:00

71 lines
2.8 KiB
TypeScript

/* =============================================================================
* ui_template_toggle.ts
* 부품 「켜기」(552-2 · 부품 모음 `#/b01-account?view=ui-kit`)
*
* 꼴 = 스위치(switch · [글 ○━] 한 줄) · 켜기 칩(chip · 색 점 붙음 · 지도 층 · 보기 켜고 끄기)
* 크기 = data-size 20 · 24 · 28 · 32(기본 24)
* 상태 = 마우스 `:hover` · 눌림 `:active` · 막힘 `disabled` · 켬 = aria-checked / aria-pressed — CSS 는 `[data-state]` 로도 받음
* 쓰기 = `createToggle({ label: "등고선", checked: true, onChange })`
* `createToggle({ kind: "chip", label: "유역", dot: "var(--map-basin-1)" })`
* 대신 = B03 `b03-file__lasfree` · B04 `b04-map__layer-button` · `.toggle-button` · B05 `b05-drainage__layer-button` ·
* `toggleButton()` · B06 `b06-structure-panel__toggle` · `.ui-prov-toggle` · 시트 `.is-on` 단추 · CAD 상태막대 켜기
* ========================================================================== */
import { setUiSize, type UiSize } from "./ui_template_button";
import "./ui_template_toggle.css";
export interface ToggleOptions {
label: string;
/** switch(기본) · chip */
kind?: "switch" | "chip";
checked?: boolean;
/** 칩 앞 색 점 — CSS 색 값(그림 색은 `var(--map-*)` · `var(--draw-*)`) */
dot?: string;
/** 20 · 24 · 28 · 32 권함 */
size?: UiSize;
disabled?: boolean;
onChange?: (on: boolean) => void;
}
export interface ToggleHandle {
root: HTMLButtonElement;
/** 지금 값 */
get: () => boolean;
/** 값을 바꿈(onChange 는 안 부름) */
set: (on: boolean) => void;
}
export function createToggle(opts: ToggleOptions): ToggleHandle {
const chip = opts.kind === "chip";
const root = document.createElement("button");
root.type = "button";
root.className = chip ? "ui-toggle ui-toggle--chip" : "ui-toggle";
setUiSize(root, opts.size ?? 24);
if (!chip) root.setAttribute("role", "switch");
const attr = chip ? "aria-pressed" : "aria-checked";
if (chip && opts.dot) {
const dot = document.createElement("span");
dot.className = "ui-toggle__dot";
dot.style.background = opts.dot;
root.append(dot);
}
const text = document.createElement("span");
text.className = "ui-toggle__text";
text.textContent = opts.label;
root.append(text);
if (!chip) {
const track = document.createElement("span");
track.className = "ui-toggle__track";
root.append(track);
}
const set = (on: boolean): void => root.setAttribute(attr, String(on));
const get = (): boolean => root.getAttribute(attr) === "true";
set(opts.checked ?? false);
root.disabled = opts.disabled ?? false;
root.addEventListener("click", () => {
set(!get());
opts.onChange?.(get());
});
return { root, get, set };
}