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>
313 lines
7.7 KiB
CSS
313 lines
7.7 KiB
CSS
/* =============================================================================
|
|
* 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;
|
|
}
|