refactor(M01): 표 · 모달 · 띠 알림 · 배지 · 알약 · 보조 글 · 빈 상태를 부품으로 (PLAN 553-5)

- 표 둘 = 표 부품(m01-master__grid = 일반표 · m01-logic__grid = 데이터표) · 페이지 CSS 는 폭 · 머리 고정 · 칸 상태만
- 손 모달 다섯(조달 찾기 · 요소 고르기 · 표 바꾸기 · 복사 시트 · 표 고르기) = 모달 부품 openModal
- 알림 띠 · 막힘 까닭 = 띠 알림 · 태그 = 배지 · 알약 · × · 삭제 · 로직 키 = 단추 부품 · muted 세 벌 = 보조 글 · 빈 줄 = 빈 상태
- M02 가 빌린 M01 클래스(표 · muted · 고르기 창)도 같은 부품으로 · 죽은 CSS 걷음 · 지킴 시험 test_553_5_m01_m02

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-26 22:57:33 +09:00
co-authored by Claude Opus 5.5
parent 6d8b38b518
commit 022eff69f5
34 changed files with 367 additions and 559 deletions
+13 -18
View File
@@ -128,10 +128,10 @@ async function showList(
(p) => void showList(host, pick, q, usage, p, open, onUsageChange),
),
el("div", {
className: "m01-master__grid-wrap m01-master__tables",
className: "ui-table-wrap m01-master__grid-wrap m01-master__tables",
children: [
el("table", {
className: "m01-master__grid",
className: "ui-table m01-master__grid",
children: [
el("thead", {
children: [el("tr", { children: LIST_COLS.map((c) => el("th", { text: c })) })],
@@ -184,11 +184,8 @@ function openTable(
now.forEach((item, i) => {
const tr = el("tr");
tr.classList.toggle("is-new", item.o === null);
const del = el("button", {
className: "m01-master__row-btn",
text: L("M01_RowRemove"),
attrs: { type: "button" },
});
const del = createButton({ label: L("M01_RowRemove"), variant: "ghost", size: "sm" });
del.classList.add("m01-master__row-btn");
del.addEventListener("click", () => commit(now.filter((_, j) => j !== i)));
tr.append(el("td", { children: [del] }));
for (const c of cols) {
@@ -217,32 +214,30 @@ function openTable(
back();
});
const notes = ((table.주 ?? []) as string[]).map((n) =>
el("p", { className: "m01-master__muted", text: n }),
el("p", { className: "ui-text ui-text--muted", text: n }),
);
const usage = table.용도 as TableUsage | undefined;
const logicLinks = (usage?.로직키 ?? []).map((k, i) => {
const btn = el("button", {
className: "m01-master__logic-key",
text: k,
attrs: { type: "button", title: L("M01_OpenLogic") },
});
const btn = createButton({ label: k, variant: "link" });
btn.classList.add("m01-master__logic-key");
btn.title = L("M01_OpenLogic");
btn.addEventListener("click", () => openLogic(k));
return i === 0 ? btn : el("span", { text: ", ", children: [btn] });
});
host.replaceChildren(
el("div", {
className: "m01-master__bar",
className: "ui-toolbar m01-master__bar",
children: [
backButton,
el("strong", { text: String(table.이름 ?? key) }),
el("span", {
className: "m01-master__muted",
className: "ui-text ui-text--muted",
text: `${key} · ${table.기준 || "—"} · ${table.출처 || ""}`,
}),
...(usage
? [
el("span", {
className: "m01-master__muted",
className: "ui-text ui-text--muted",
text: `${L("M01_TableUsage")}: ${usage.공종} · ${usage.대상.join(", ")} · `,
children: logicLinks,
}),
@@ -252,10 +247,10 @@ function openTable(
],
}),
el("div", {
className: "m01-master__grid-wrap",
className: "ui-table-wrap m01-master__grid-wrap",
children: [
el("table", {
className: "m01-master__grid",
className: "ui-table m01-master__grid",
children: [
el("thead", {
children: [