refactor(B04): 전처리 스타일시트 700줄 분리 (동작 불변)

B04_PreProcess_UI_Style.css 870줄 -> 565줄. 하단 2D 지도·도구줄·시트 툴바 규칙을
B04_PreProcess_UI_Style_Map.css(312줄)로 값·순서 그대로 옮김. 진입 TS 에서 본체 다음에
불러 캐스케이드 순서 유지.

검증: 두 파일을 다시 이으면 원본과 **경계 빈 줄 1개 외 완전 동일**(텍스트 대조).
tsc --noEmit 통과. 공용 브라우저(5174) B04 화면 실측 — 좌측 폼 flex/gap 16px,
.b04-map flex column gap 12px(896x828), 헤더·컨트롤 정상, 3D 서피스·2D 지도 렌더 정상.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-04 10:09:10 +09:00
co-authored by Claude Opus 5
parent 370ff30738
commit 2975ea09c7
3 changed files with 314 additions and 305 deletions
@@ -0,0 +1,312 @@
/* =============================================================================
* B04_PreProcess_UI_Style_Map.css
* 1차 워크플로우 하단 **2D 지도**와 그 도구줄·시트 툴바.
*
* `B04_PreProcess_UI_Style.css` 가 700줄을 넘겨 잘라낸 조각이다(2026-09-04).
* 규칙·순서·값 그대로 옮겼고, 진입 TS 가 본체 다음에 불러 캐스케이드 순서도 같다.
* ========================================================================== */
/* --- 하단 2D 지도 --- */
.b04-map {
--b04-map-vector: var(--color-accent);
display: flex;
flex-direction: column;
gap: var(--spacing-12);
margin: var(--spacing-24);
padding: var(--spacing-16);
border: 1px solid var(--color-border);
border-radius: var(--radius-cards);
background: var(--color-surface-raised);
}
.b04-map__header,
.b04-map__controls,
.b04-map__control-group,
.b04-map__layer-buttons {
display: flex;
align-items: center;
}
.b04-map__header {
justify-content: space-between;
gap: var(--spacing-16);
}
.b04-map__header h3 {
font-size: var(--text-body);
color: var(--color-text);
}
.b04-map__controls {
gap: var(--spacing-12);
flex-wrap: wrap;
}
.b04-map__control-group {
gap: var(--spacing-8);
color: var(--color-text-secondary);
font-size: var(--text-caption);
}
.b04-map__layer-buttons {
gap: var(--spacing-4);
flex-wrap: wrap;
}
.b04-map__controls button {
min-height: 34px;
padding: 0 var(--spacing-12);
border: 1px solid var(--color-border);
border-radius: var(--radius-inputs);
background: var(--color-canvas);
color: var(--color-text-body);
}
.b04-map__controls button {
cursor: pointer;
}
.b04-map__controls .b04-map__layer-button {
padding: var(--spacing-8);
opacity: 0.55;
}
.b04-map__layer-button.is-active {
opacity: 1;
box-shadow: inset 0 0 0 1px currentColor;
}
.b04-map__layer-button--gis {
border-color: var(--color-border);
color: var(--color-text-secondary);
}
.b04-map__layer-button--gis.is-active {
border-color: var(--b04-layer-color);
color: var(--b04-layer-color);
box-shadow: inset 0 0 0 1px var(--b04-layer-color);
}
/* 관 매설 우클릭 메뉴 — 지도 뷰포트 기준 절대 위치. */
.b04-map__context-menu {
position: absolute;
z-index: 6;
display: flex;
flex-direction: column;
min-width: 140px;
padding: var(--spacing-4);
border: 1px solid var(--color-border);
border-radius: var(--radius-cards);
background: var(--color-surface-raised);
box-shadow: 0 4px 16px rgb(0 0 0 / 25%);
}
.b04-map__context-menu[hidden] {
display: none;
}
.b04-map__context-menu-item {
padding: var(--spacing-8) var(--spacing-12);
border: 0;
border-radius: var(--radius-cards);
background: transparent;
color: var(--color-text-body);
font-size: 13px;
text-align: left;
cursor: pointer;
}
.b04-map__context-menu-item:hover {
background: var(--color-surface-sunken);
}
.b04-map__viewport {
position: relative;
width: 100%;
height: 560px;
overflow: hidden;
touch-action: none;
/* 좌버튼은 선택 전용이라 손바닥(grab) 커서를 쓰지 않는다. 팬 중(가운데 버튼)에만
JS가 grabbing으로 바꾼다(2026-08-01 사용자 지시). */
cursor: default;
user-select: none;
border: 1px solid var(--color-border);
border-radius: var(--radius-cards);
background: var(--color-canvas);
}
.b04-map__image,
.b04-map__canvas {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
}
.b04-map__image {
object-fit: contain;
transform-origin: center;
user-select: none;
pointer-events: none;
}
.b04-map__canvas {
pointer-events: none;
}
.b04-map__empty {
position: absolute;
z-index: 2;
inset: 50% auto auto 50%;
transform: translate(-50%, -50%);
color: var(--color-text-secondary);
font-size: var(--text-caption);
}
/* 지도 위 좌상단 문구 묶음 — 배수유역 정보 자리(2026-08-01 사용자 지시).
지도 조작을 가리지 않도록 포인터 이벤트는 통과시킨다. */
.b04-map__status-stack {
position: absolute;
z-index: 2;
top: var(--spacing-12);
left: var(--spacing-12);
display: flex;
max-width: min(62%, 900px);
flex-direction: column;
align-items: flex-start;
gap: var(--spacing-4);
pointer-events: none;
}
/* 배수유역 "분석 중…" 진행 문구 자리 — 우측 최상단(2026-08-01 사용자 지시).
결과 문구는 좌상단에 그대로 남는다. */
.b04-map__status-topright {
position: absolute;
z-index: 2;
top: var(--spacing-12);
right: var(--spacing-12);
display: flex;
max-width: min(40%, 360px);
flex-direction: column;
align-items: flex-end;
gap: var(--spacing-4);
pointer-events: none;
}
/* 객체 표시(지형지물 개수) 라벨 자리 — 우측 최하단(2026-08-01 사용자 지시).
축척은 좌하단이라 서로 겹치지 않는다. */
.b04-map__status-corner {
position: absolute;
z-index: 2;
right: var(--spacing-12);
bottom: var(--spacing-12);
display: flex;
max-width: min(50%, 480px);
flex-direction: column;
align-items: flex-end;
gap: var(--spacing-4);
pointer-events: none;
}
/* 배수유역 전용 상태 줄 — 지도 자체 상태(.b04-map__status)와 칸을 나눠 쓰면
나중에 끝난 쪽이 상대 문구를 지운다. 그래서 줄을 따로 둔다.
배경지도(위성·지적·등고선)가 복잡해 글자가 묻히므로 배경 칩을 깐다. */
.b04-map__status,
.b04-map__watershed-status {
display: block;
padding: var(--spacing-4) var(--spacing-8);
border: 1px solid var(--color-border);
border-radius: var(--radius-inputs);
background: color-mix(in srgb, var(--color-surface-raised) 92%, transparent);
color: var(--color-text-body);
font-size: var(--text-caption);
line-height: 1.5;
word-break: keep-all;
backdrop-filter: blur(6px);
-webkit-backdrop-filter: blur(6px);
}
.b04-map__watershed-status[hidden] {
display: none;
}
@media (max-width: 760px) {
.b04-map__header {
align-items: flex-start;
flex-direction: column;
}
}
@media (max-width: 1180px) {
.b04-surface__viewers {
grid-template-columns: 1fr;
}
}
/* 도엽등고 3D 서피스 컨테이너 — 2026-08-30 */
.b04-surface__sheet-section {
margin: 0 var(--spacing-24) var(--spacing-16);
padding: var(--spacing-16);
box-sizing: border-box;
}
.b04-surface__sheet-section > .terrain-model-group {
margin-top: var(--spacing-12);
}
/* 도엽 서피스 보간 방식 전환 줄 — 2026-08-30 */
.b04-surface__sheet-toolbar {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: var(--spacing-8);
margin: var(--spacing-12) 0;
}
.b04-surface__sheet-method {
padding: 4px 10px;
font-size: var(--text-caption);
color: var(--color-text-body);
background: var(--color-surface);
border: 1px solid var(--color-border);
border-radius: var(--radius-cards);
cursor: pointer;
}
.b04-surface__sheet-method:hover {
border-color: var(--color-primary);
}
.b04-surface__sheet-method.is-active {
color: var(--color-on-primary, #fff);
background: var(--color-primary);
border-color: var(--color-primary);
}
/* 아직 만들지 않은 방식 — 누르면 계산이 시작된다는 것을 눌러 보기 전에 알린다. */
.b04-surface__sheet-method.is-unbuilt:not(.is-active) {
color: var(--color-text-muted, var(--color-text-body));
border-style: dashed;
}
.b04-surface__sheet-lidar {
margin-left: auto;
}
/* 도엽 서피스 스무딩 드롭다운 — 방식 버튼 줄 오른쪽 끝 */
.b04-surface__sheet-smoothing {
margin-left: auto;
display: flex;
align-items: center;
gap: var(--spacing-8);
font-size: var(--text-caption);
}
.b04-surface__sheet-smoothing .b04-surface__select {
width: auto;
min-width: 96px;
}
.b04-surface__sheet-toolbar .b04-surface__sheet-lidar {
margin-left: 0;
}