feat(ui_template): 항목 고르기 모달 — 시험 · 글자 대비 · 새로 가져올 때 넣은 값 유지 · 편집 화면 높이 (PLAN 25-2d)
- test_item_picker_detail: 복사본 창구(가짜 · 약속 길 · 403 까닭) · 입력 목록 · 카드 순수 함수 · 한 벌 지킴 · 원본 층에 안 씀 - 자동값 · 확인 표시 글자 대비 4.5 이상 · 고르기 값은 원래 모양(숫자)으로 저장 - 새로 가져오기 = 원본에서 온 문서만 덮고 입력값은 남김 - 모달 폭 두 클래스로(공용 모달 폭에 안 밀림) · CAD · 시트 편집 높이 채움 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EauA2ATmqNRbeV48s9CcBr
This commit is contained in:
@@ -20,7 +20,7 @@
|
||||
.m02-inputs__places,
|
||||
.m02-inputs__missing {
|
||||
margin: 0;
|
||||
color: var(--color-text-muted);
|
||||
color: var(--color-text-secondary);
|
||||
font-size: var(--text-caption);
|
||||
}
|
||||
|
||||
@@ -63,31 +63,35 @@
|
||||
.m02-inputs__control {
|
||||
flex: 1 1 6rem;
|
||||
min-width: 0;
|
||||
max-width: 24rem;
|
||||
}
|
||||
|
||||
/* 자동값 = 저장값이 아님 — 흐리게 */
|
||||
/* 자동값 = 저장값이 아님 — 기울임 + 보조 글자색(글자 대비 4.5 이상 유지) */
|
||||
.m02-inputs__value.is-auto,
|
||||
.m02-inputs__control.is-auto {
|
||||
color: var(--color-text-muted);
|
||||
.m02-inputs__control.is-auto,
|
||||
.m02-inputs__control::placeholder {
|
||||
color: var(--color-text-secondary);
|
||||
font-style: italic;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.m02-inputs__state {
|
||||
color: var(--color-text-muted);
|
||||
color: var(--color-text-secondary);
|
||||
font-size: var(--text-caption);
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.m02-inputs__state.is-confirmed {
|
||||
color: var(--color-success, var(--color-text));
|
||||
color: var(--color-text);
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.m02-inputs__error {
|
||||
flex: 1 0 100%;
|
||||
color: var(--color-danger, var(--color-text));
|
||||
color: var(--color-danger);
|
||||
font-size: var(--text-caption);
|
||||
}
|
||||
|
||||
.m02-inputs__control[aria-invalid="true"] {
|
||||
border-color: var(--color-danger, currentcolor);
|
||||
border-color: var(--color-danger);
|
||||
}
|
||||
|
||||
@@ -73,7 +73,7 @@ const TEXT = {
|
||||
missing: "없는 로직 {value}",
|
||||
auto: "자동값",
|
||||
unconfirmed: "확인 안 함",
|
||||
confirmed: "확인함",
|
||||
confirmed: "✓ 확인함",
|
||||
confirmBox: "확인",
|
||||
outOfRange: "범위 {value} 밖",
|
||||
summary: "선택 {value}",
|
||||
@@ -94,13 +94,16 @@ export function rangeOf(input: LogicInput): { min?: number; max?: number } | nul
|
||||
return null;
|
||||
}
|
||||
|
||||
/** 고르기 목록 → 값 · 이름 짝 */
|
||||
export function choicesOf(input: LogicInput): { 값: string; 이름: string }[] {
|
||||
return (input.고르기 ?? []).map((one) =>
|
||||
typeof one === "object"
|
||||
? { 값: String(one.값 ?? one.이름 ?? ""), 이름: String(one.이름 ?? one.값 ?? "") }
|
||||
: { 값: String(one), 이름: String(one) },
|
||||
);
|
||||
/** 고르기 목록 → 값 · 이름 짝 — `raw` 는 원래 모양(숫자 목록이면 숫자로 저장) */
|
||||
export function choicesOf(input: LogicInput): { 값: string; 이름: string; raw: string | number }[] {
|
||||
return (input.고르기 ?? []).map((one) => {
|
||||
const raw = typeof one === "object" ? (one.값 ?? one.이름 ?? "") : one;
|
||||
return {
|
||||
값: String(raw),
|
||||
이름: typeof one === "object" ? String(one.이름 ?? raw) : String(one),
|
||||
raw,
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
/** 자리가 「선택」 인 줄만 로직 차례로 묶음 — 이 카드가 보이는 입력 */
|
||||
@@ -277,7 +280,12 @@ export function createInputsCard(opts: InputsCardOptions): InputsCardHandle {
|
||||
? fill(TEXT.outOfRange, `${range?.min ?? ""}~${range?.max ?? ""}`)
|
||||
: "";
|
||||
control.classList.toggle("is-auto", raw === "");
|
||||
const value: string | number | null = raw === "" ? null : range ? Number(raw) : raw;
|
||||
const value: string | number | null =
|
||||
raw === ""
|
||||
? null
|
||||
: range
|
||||
? Number(raw)
|
||||
: (choices.find((one) => one.값 === raw)?.raw ?? raw);
|
||||
// 값을 넣으면 확인 · 비우면 확인 풀림(자동값은 저장값이 아님)
|
||||
store(logic.로직, input.이름, { 값: bad ? null : value, 확인: raw !== "" && !bad });
|
||||
box.checked = raw !== "" && !bad;
|
||||
|
||||
Reference in New Issue
Block a user