fix(부품): 묶음 단추 켠 수 원형 숫자 걷음(요구 551)

- createPickMenu 여럿 = 아이콘 + ▾ · 켠 표시는 단추 눌림(하나라도 켜면) 그대로
- 배지 count accent 덧 · 메뉴 css 배지 줄 걷음 · 견본 · 겹 줄 머리 글 맞춤
- 시험 634_1 고침 — 배지 대신 「배지 없음 · 눌림 = 켠 줄 있음」을 잡음

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-01 11:49:26 +09:00
co-authored by Claude Opus 5.5
parent 61733d064d
commit cd0f68946b
6 changed files with 13 additions and 30 deletions
+4 -10
View File
@@ -12,7 +12,6 @@
* ========================================================================== */
import { createIconButton } from "./ui_template_button";
import { createBadge } from "./ui_template_badge";
import { icon, type IconName } from "./ui_template_icons";
import "./ui_template_context_menu.css";
import { showConfirmDialog } from "./ui_template_modal";
@@ -302,7 +301,7 @@ export function createRowMenu(items: RowMenuItem[]): HTMLElement {
/* =============================================================================
* 부품 「고르기 메뉴」(PLAN 626-1 · 634-1 · 요구 530 · 546 · 지도 도구줄 단추 하나 + 아래 판)
* 꼴 = 하나(기본) — 아이콘 단추(32) → 아래 판 = 항목 하나만 고름(✓) · 누르면 닫힘 · `offLabel` 이면 맨 끝 「끔」 줄 + 고르면 눌림
* 여럿(`multi`) — 아이콘 + 켠 수 배지(0 = 없음) + ▾ · 판 = 켬끔 줄(✓) · 눌러도 안 닫힘 · 하나라도 켜면 눌림
* 여럿(`multi`) — 아이콘 + ▾ · 판 = 켬끔 줄(✓) · 눌러도 안 닫힘 · 하나라도 켜면 눌림(켠 수 숫자 없음 · 요구 551)
* 줄 = `icon` · `title`(마우스 글) · `disabled`(흐림) — 바꿈은 `setItem(value, { checked, disabled, title })`
* 자리 = 판은 화면 맨 위(body · fixed) — 도구줄 가로 밀기 칸에 잘리지 않게 · 단추 바로 아래 · 밀기 · 창 크기 바뀌면 닫힘
* 상태 = 고름 `aria-checked` · 단추 `aria-pressed` · 막힘(단추 · 줄 disabled)
@@ -351,13 +350,11 @@ export function createPickMenu(opts: {
});
root.setAttribute("aria-haspopup", "menu");
root.setAttribute("aria-expanded", "false");
const badge = createBadge("0", "accent", { kind: "count", size: 18 });
if (multi) {
root.classList.add("ui-pick-menu--multi");
badge.hidden = true;
const caret = Object.assign(document.createElement("span"), { textContent: "▾" });
caret.className = "ui-pick-menu__caret";
root.append(badge, caret);
root.append(caret);
}
const pop = document.createElement("div");
pop.className = "ui-row-menu__pop ui-pick-menu__pop";
@@ -396,16 +393,13 @@ export function createPickMenu(opts: {
.filter((row) => row.getAttribute("aria-checked") === "true")
.map((row) => row.dataset.value!);
let current: string | null = null;
/** 단추 눌림 · 배지 — 줄 켬에 맞춤. */
/** 단추 눌림 — 줄 켬에 맞춤(여럿 = 하나라도 켜면 눌림). */
function paint(): void {
if (!multi) {
if (opts.offLabel) root.setAttribute("aria-pressed", String(current !== null));
return;
}
const count = values().length;
root.setAttribute("aria-pressed", String(count > 0));
badge.textContent = String(count);
badge.hidden = count === 0;
root.setAttribute("aria-pressed", String(values().length > 0));
}
function mark(row: HTMLButtonElement, checked: boolean): void {
row.setAttribute("aria-checked", String(checked));