refactor(M02): 띠 알림 · 빈 상태 · 보조 글 · 배지 · 탭 · 표 · 목록 줄 · 도구줄 · 체크를 부품으로 (PLAN 553-5)

- DataFlow: 표 넷 = 데이터표 · 함수 판 알림 · 선/알약 경고 · 끊긴 곳 = 띠 알림 · 알약 · 칸 종류 = 배지 · 고르는 줄 = 목록 줄 · 입력 넷 = 입력 · 도구줄 여섯 · 날 색 → 공통 값
- 구조물 옵션 · 구조물 · 도면 · 면적 · 품목 고르기: 판 띠 = 띠 알림 · 한눈/종류별/부품 = 탭 · 표 둘 = 데이터표 · 체크 둘 = 체크 · 카드 · 번호 = 카드 · 배지 · 도면 도구줄
- 일위대가 · 호표 · 실무자료 · 본 화면 · 서고: 알림 = 띠 알림 · 빈 상태 · 보조 글 · 도구줄 여섯 · 옛 보라 별칭 0
- M01 로직 입력칸 = 입력 부품(작은 칸) · 일위대가 상세 줄 수 고정 시험 693 · 지킴 시험 M02 몫 더함

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-26 23:44:19 +09:00
co-authored by Claude Opus 5.5
parent 022eff69f5
commit 09134bab84
86 changed files with 583 additions and 705 deletions
@@ -30,6 +30,10 @@ import {
variablePills,
type MatItem,
} from "./M02_DF_InputPanel_Build";
import "@ui/ui_template_text.css";
import "@ui/ui_template_badge.css";
import "@ui/ui_template_list_row.css";
import "@ui/ui_template_toolbar.css";
const TEXT = {
Chosen: ["넣은 재료 — 알약마다 이름 · 값 · 단위", "Chosen materials"],
@@ -159,7 +163,10 @@ function scopeBoxes(
() => undefined,
);
return {
root: el("div", { className: "m02-dfip__bar", children: [subBox.root, detailBox.root] }),
root: el("div", {
className: "ui-toolbar m02-dfip__bar",
children: [subBox.root, detailBox.root],
}),
get: () => ({ ...state }),
};
}
@@ -190,7 +197,7 @@ function itemList(
});
const load = async (): Promise<void> => {
const mine = ++seq;
list.replaceChildren(el("p", { className: "m02-dfip__muted", text: t("Loading") }));
list.replaceChildren(el("p", { className: "ui-text ui-text--muted", text: t("Loading") }));
try {
const r = await searchMaterials({ q: q.input.value.trim(), ...scope(), page, size: 12 });
if (mine !== seq) return;
@@ -208,7 +215,7 @@ function itemList(
...(r.items.length
? r.items.map((it) => {
const b = el("button", {
className: "m02-dfip__row",
className: "m02-dfip__row ui-list-row ui-sidebar-row",
attrs: { type: "button" },
children: [
el("span", {
@@ -227,11 +234,11 @@ function itemList(
b.addEventListener("click", () => onPick(it));
return b;
})
: [el("p", { className: "m02-dfip__muted", text: t("NoRow") })]),
: [el("p", { className: "ui-text ui-text--muted", text: t("NoRow") })]),
);
} catch {
if (mine === seq)
list.replaceChildren(el("p", { className: "m02-dfip__muted", text: t("Failed") }));
list.replaceChildren(el("p", { className: "ui-text ui-text--muted", text: t("Failed") }));
}
};
let timer = 0;
@@ -398,9 +405,13 @@ export function renderMaterial(
el("span", {
className: "m02-dfip__name",
children: [
el("span", { className: "m02-dfip__tag", text: kind }),
el("span", {
className: "ui-badge ui-badge--pill ui-badge--neutral",
attrs: { "data-size": "20" },
text: kind,
}),
el("strong", { text: ` ${e.name}` }),
el("div", { className: "m02-dfip__muted", text: summaryOf(e, lg) }),
el("div", { className: "ui-text ui-text--muted", text: summaryOf(e, lg) }),
note,
],
}),
@@ -435,7 +446,7 @@ export function renderMaterial(
);
return row;
})
: [el("p", { className: "m02-dfip__muted", text: t("None") })]),
: [el("p", { className: "ui-text ui-text--muted", text: t("None") })]),
);
};
@@ -455,7 +466,7 @@ export function renderMaterial(
const drawBody = (): void => {
if (mode === "fixed") {
body.replaceChildren(
el("p", { className: "m02-dfip__muted", text: t("FixedHelp") }),
el("p", { className: "ui-text ui-text--muted", text: t("FixedHelp") }),
itemList((it) =>
on.change(
addEl(lg, {
@@ -520,7 +531,7 @@ export function renderMaterial(
onChange: (v) => ((how = v as "plain" | "template"), drawBody()),
});
const tpl = templateBox(lg, () => void refresh());
const defNote = el("p", { className: "m02-dfip__muted" });
const defNote = el("p", { className: "ui-text ui-text--muted" });
const build = (): CfElementRef => {
const sc = scope.get();
if (mode === "rule" && howBox.select.value === "template") {
@@ -603,7 +614,7 @@ export function renderMaterial(
? [tpl.root]
: pills.length
? [fieldBox.root, opBox.root, pillBox.root]
: [el("p", { className: "m02-dfip__muted is-bad", text: t("NoPill") })]),
: [el("p", { className: "ui-text ui-text--error", text: t("NoPill") })]),
]
: [
el("h5", { text: t("Default") }),