fix(M01): 로직 상세 오른쪽 두 패널 공용 접기 카드로 — 제목 행 누름 · 캐럿 · 하나만 열림

- 흐름도 · 원문 = ui-collapsible 카드(M02 면적산출 오른쪽 패널 꼴) · attachCollapsible 토글 위에 하나만 열림 규칙
- 따로 만든 원문 토글 단추 · 얇은 띠 제거 · 흐름도 패널 자체 접기 단추는 M01 에서 숨김
- 둘 다 접힘 = 제목 행 둘(칸 140px) · 취향 기억(m01-logic-panel) 그대로
- 44-4 화면 시험 카드 꼴로 고침

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NPJGtfXo6GMbcpiboQC4uK
This commit is contained in:
2026-10-05 12:25:12 +09:00
co-authored by Claude Opus 5.5
parent 8990729a6d
commit 1ca99ed3ae
3 changed files with 74 additions and 54 deletions
@@ -4,10 +4,11 @@
* 로직 GC000277(건설품셈 토목 1-1-2 유도선 설치 및 해체)을 엶 · 고치지 않음 · 끝에 패널 취향을 처음 값으로 되돌림.
* 기대 수치:
* order = ["기본정보","시험 계산","단가산출 상세","텍스트 수식"](흐름 로직이면 셋째 · 넷째는 흐름 보기 안)
* flow = {flow:true, source:false, pref:"flow"} · 오른쪽 칸 너비 > 300
* source = {flow:false, source:true, pref:"source"} · srcHead 에 「1-1-2 유도선」 · srcTable 에 「특별인부」
* none = {flow:false, source:false, pref:"none"} · 오른쪽 칸 너비 = 80(띠 둘)
* back = {flow:true, source:false, pref:"flow"}(흐름도 띠 단추로 다시 폄)
* 두 패널 = 공용 접기 카드(ui-collapsible · 제목 행 누름) · 흐름도 패널 자체 접기 단추는 안 보임(dfpToggle 0)
* flow = {flow:true, source:false, pref:"flow", caret:["▾","▸"]} · 오른쪽 칸 너비 > 300
* source = {flow:false, source:true, pref:"source", caret:["▸","▾"]} · srcHead 에 「1-1-2 유도선」 · srcTable 에 「특별인부」
* none = {flow:false, source:false, pref:"none", caret:["▸","▸"]} · 오른쪽 칸 너비 = 140(제목 행 둘)
* back = {flow:true, source:false, pref:"flow"}(흐름도 제목 행으로 다시 폄)
* noLink = 「원문 연결 없음」 + 「출처 · …」(서버가 빈 목록을 줄 때 · fetch 를 잠시 바꿔 봄)
* restored = 처음 취향 값
*/
@@ -43,17 +44,23 @@
out.order = $$(".m01lab-flow__left .m01lab__box > .m01-logic__section-head h3").map((h) =>
h.innerText.trim(),
);
const slots = () => $$(".m01lab-side__slot");
const cards = () => $$(".m01lab-side__card");
const heads = () => cards().map((c) => $(".ui-collapsible__title", c));
const shown = (n) => !!n && n.getBoundingClientRect().height > 0;
const state = () => ({
flow:
slots()[0].classList.contains("is-open") &&
!$(".m02-dfp", slots()[0]).classList.contains("is-folded"),
source: slots()[1].classList.contains("is-open") && !$(".m02-dfp__open", slots()[1]).hidden,
!cards()[0].classList.contains("is-collapsed") &&
shown($(".m02-dfp__open", cards()[0])) &&
!$(".m02-dfp", cards()[0]).classList.contains("is-folded"),
source: !cards()[1].classList.contains("is-collapsed") && shown($(".m01lab-src", cards()[1])),
pref: localStorage.getItem(PREF),
caret: heads().map((h) => getComputedStyle(h, "::after").content.replace(/"/g, "")),
width: Math.round($(".m01lab-flow__right").getBoundingClientRect().width),
});
const flowToggle = () => $(".m02-dfp__toggle", slots()[0]);
const srcToggle = () => $(".m02-dfp__toggle", slots()[1]);
const flowToggle = () => heads()[0];
const srcToggle = () => heads()[1];
out.titles = heads().map((h) => h.innerText.trim());
out.dfpToggle = $$(".m01lab-side .m02-dfp__toggle").filter(shown).length;
// 처음 = 흐름도 열림으로 맞춤
if (!state().flow) {
if (state().source) srcToggle().click();