import { MASS_HAUL_DEFAULT_VISIBLE, normalizeVisibleBasis } from "@util/common_util_mass_haul"; import { readStateRaw, stateKey } from "../A00_Common/b_page_state"; import { LONG_HEIGHT } from "./B06_Section_UI_Section_Common"; export const PANEL_CHROME_PX = 102; /* 유토곡선 그래프를 B06 에서 뺐다(2026-09-06 사용자 지시) — 패널 높이도 종단면도 몫만 잡는다. 곡선은 B05 유토곡선 패널에서 보고, 여기서는 좌측 상단 배지가 총괄값을 보인다. */ export const BASE_PANEL_HEIGHT = LONG_HEIGHT + PANEL_CHROME_PX; export const MIN_LONG_HEIGHT = 110; export const MIN_PANEL_HEIGHT = MIN_LONG_HEIGHT + PANEL_CHROME_PX; export const MAX_PANEL_HEIGHT_RATIO = 0.8; /* 패널 접힘·높이·유토곡선 범례는 화면 취향(①) — 키는 등록표(`b_page_state`)가 만든다. 범례 키는 B05 와 **같은 값**이어야 한다(두 화면이 같은 그림의 두 창). */ export const PANEL_HEIGHT_KEY = stateKey("section-panel-height") ?? ""; /** 처음 열 때는 **곡선만** — 토량 분배는 범례에서 켠다(2026-09-06 사용자 지시). * B05 `_UI_Profile_MassHaul` 과 같은 값이어야 한다(두 화면 공용 키). */ const DEFAULT_VISIBLE_KEYS = [...MASS_HAUL_DEFAULT_VISIBLE]; export function readVisibleSeries(): Set { try { const raw = readStateRaw("masshaul-visible"); if (!raw) return new Set(DEFAULT_VISIBLE_KEYS); const parsed: unknown = JSON.parse(raw); return Array.isArray(parsed) ? normalizeVisibleBasis(new Set(parsed.map(String))) : new Set(DEFAULT_VISIBLE_KEYS); } catch { return new Set(DEFAULT_VISIBLE_KEYS); } } /** 종단면도 높이 — 유토곡선을 빼면서 남는 자리를 **전부** 종단이 쓴다(2026-09-06). */ export function chartHeights(availableHeightPx: number): { long: number; mass: number } { if (!Number.isFinite(availableHeightPx) || availableHeightPx <= 0) { return { long: LONG_HEIGHT, mass: 0 }; } return { long: Math.max(MIN_LONG_HEIGHT, availableHeightPx), mass: 0 }; } export function unwrapChart(node: HTMLElement): Element { return node.classList.contains("b06-section__chart-wrap") && node.firstElementChild ? node.firstElementChild : node; }