Files
Aislo/B06_Section/B06_Section_UI_Section_View_Panel.ts
T
eomsangdonandClaude Opus 5 818042e45c feat(B05,B06): 최종 누가토량 배지 + B06 유토곡선 그래프 제거
사용자 지시(2026-09-06): 유토곡선은 자리를 많이 먹는데 정작 늘 봐야 하는 값은 마지막
지점 누가토량 하나임. 기준은 횡단으로 고정(종단 기준 곡선은 뒤에 삭제 예정).

- 총괄값 계열을 범례 선택과 무관하게 **횡단 기준**으로 뽑음
- 공용 배지 `common_util_mass_haul_badge.ts` — 종단 그래프 좌측 상단 오버레이,
  세부 내역은 툴팁
- B05: 상단줄의 「누가토량」 항목을 배지로 옮김(유토곡선 패널은 그대로 유지)
- B06: 유토곡선 그래프·범례·요약줄 삭제, 그 높이를 종단면도가 전부 사용

검증: B06 배지 −5,595.5㎥·범례 없음·종단 228px, B05 배지 −6,842.6㎥·상단줄에서 제거.
테스트 390 통과.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-06 19:44:59 +09:00

46 lines
2.2 KiB
TypeScript

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<string> {
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;
}