Files
Aislo/B06_Section/B06_Section_UI_Style_Cross_Controls.css
T
eomsangdon 5d0d2f0918 feat(B05,B06): 구조물 배치를 실시간 반영으로 바꾸고 이식 행·강조를 정리한다
2026-08-29 사용자 지시 3건:
1. 유입구·유출구로 옮겨 온 단 수·옵션 행을 폼 양식(라벨+한 덩어리 컨트롤)으로
   맞추고 2열 격자로 세운다.
2. 이미 고른 항목은 값이 바뀔 때마다 곧바로 반영한다([수정] 버튼 불필요).
   버튼은 visibility만 꺼 자리를 남겨 삭제·리셋의 위치·크기가 흔들리지 않게 했다.
   정본 주입이 되먹임으로 돌아와도 편집 중인 폼은 닫지 않는다.
3. 도면에서 구조물을 고르면 그쪽 그룹(유입구/유출구)을 붉은 계열로 강조한다.
   카드만 고른 경우는 강조하지 않는다 — 대표 벽은 조용히 딸려 오고, 그 벽을
   다시 눌러 선택을 풀면 강조만 꺼지고 행은 남는다.

검증: 슬롯 grid 2열, 카드 선택 시 강조 없음·행 2개, 다른 벽 클릭 시 유입구 그룹
붉은 테두리(rgb(192,57,43)), 재클릭 시 강조 해제·행 복귀. 길이 + 즉시 캐시
반영(11) 후 - 원복(10), 폼 유지. typecheck 통과.
2026-08-29 16:00:04 +09:00

390 lines
10 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* 구조물 위치 조정 오버레이 창. */
/* 구조물 조정 오버레이 — **위쪽 기준**으로 붙인다(2026-08-24 사용자). 아래를 기준으로
* 두면 높이가 낮은 횡단도에서 창이 카드 위로 넘쳐 **제목·값 줄이 잘린다**. 카드 안에
* 넘칠 만큼 길어지면 창 안에서 스크롤한다. z-index는 카드 안 오버레이 중 최상단. */
.b06-structure-panel {
position: absolute;
top: var(--spacing-8);
left: var(--spacing-8);
z-index: 20;
display: flex;
max-height: calc(100% - 2 * var(--spacing-8));
flex-direction: column;
gap: 2px;
padding: var(--spacing-8);
border: 1px solid var(--color-danger);
border-radius: var(--radius-inputs);
background: color-mix(in srgb, var(--color-surface-raised) 94%, transparent);
overflow-y: auto;
overscroll-behavior: contain;
}
/* 연동·경사 — 한 행에 버튼 두 개(2026-08-24 사용자). 켜짐은 채운 색으로 구분한다. */
.b06-structure-panel__controls.b06-structure-panel__toggles {
display: flex;
gap: 2px;
}
.b06-structure-panel__toggle {
width: auto;
padding: 0 var(--spacing-8);
}
.b06-structure-panel__toggle.is-on {
border-color: var(--color-danger);
background: var(--color-danger);
color: var(--color-text-inverse, #fff);
}
.b06-structure-panel.is-hidden,
.b06-structure-panel__value span.is-hidden,
.b06-structure-panel__btn.is-hidden,
.b06-structure-panel__buttons.is-hidden,
.b06-structure-panel__struct.is-hidden {
display: none;
}
.b06-structure-panel__head {
display: flex;
align-items: center;
gap: var(--spacing-8);
justify-content: space-between;
}
.b06-structure-panel__title {
color: var(--color-danger);
font-size: var(--text-caption);
font-weight: var(--font-weight-medium);
}
.b06-structure-panel__value {
display: flex;
flex-direction: column;
gap: 1px;
color: var(--color-text-secondary);
font-size: var(--text-caption);
}
.b06-structure-panel__controls.b06-structure-panel__buttons {
display: grid;
grid-template-areas: ". up ." "left reset right" ". down equal";
justify-content: center;
gap: 2px;
}
.b06-structure-panel__btn--up {
grid-area: up;
}
.b06-structure-panel__btn--down {
grid-area: down;
}
.b06-structure-panel__btn--left {
grid-area: left;
}
.b06-structure-panel__btn--right {
grid-area: right;
}
.b06-structure-panel__btn--reset {
grid-area: reset;
}
.b06-structure-panel__btn--equal {
grid-area: equal;
}
.b06-structure-panel__controls .b06-structure-panel__btn {
box-sizing: border-box;
width: 26px;
height: 22px;
padding: 0;
text-align: center;
line-height: 1;
}
.b06-structure-panel__hval {
box-sizing: border-box;
width: 3.5em;
text-align: center;
color: var(--color-text-body);
font-size: var(--text-caption);
align-self: center;
}
.b06-structure-panel__struct {
display: flex;
flex-direction: column;
align-items: stretch;
gap: 2px;
color: var(--color-text-secondary);
font-size: var(--text-caption);
}
.b06-structure-panel__label {
color: var(--color-text-muted);
font-size: var(--text-caption);
line-height: 1.2;
}
.b06-structure-panel__controls {
display: flex;
align-items: center;
gap: 2px;
}
/* 집수정 조작 = 9키(3×3, 2026-08-22 사용자) — 십자 축 이동 · 모서리 크기 · 중앙 초기화.
기슭막이 십자와 같은 폭·버튼 크기로 맞춰 행열이 어긋나지 않게 한다. */
.b06-structure-panel__controls.b06-structure-panel__basin-buttons {
display: grid;
grid-template-areas:
"nw up ne"
"left reset right"
"sw down se";
justify-content: center;
gap: 2px;
}
.b06-structure-panel__btn--nw {
grid-area: nw;
}
.b06-structure-panel__btn--ne {
grid-area: ne;
}
.b06-structure-panel__btn--sw {
grid-area: sw;
}
.b06-structure-panel__btn--se {
grid-area: se;
}
.b06-structure-panel__basin-reset {
margin-left: auto;
}
.b06-structure-panel__select {
flex: 1;
padding: 1px var(--spacing-4);
border: 1px solid var(--color-border);
border-radius: var(--radius-inputs);
background: var(--color-surface);
color: var(--color-text);
font-size: var(--text-caption);
}
.b06-structure-panel__btn {
padding: 0 var(--spacing-8);
border: 1px solid var(--color-border);
border-radius: var(--radius-inputs);
background: var(--color-surface);
color: var(--color-text-secondary);
cursor: pointer;
font-size: var(--text-caption);
line-height: 1.6;
}
.b06-structure-panel__btn:hover {
border-color: var(--color-danger);
color: var(--color-danger);
}
.b06-structure-panel__close {
padding: 0 4px;
border-color: transparent;
background: transparent;
}
.b06-cross-card__zoom {
position: absolute;
top: var(--spacing-4);
right: var(--spacing-4);
z-index: 2;
display: flex;
overflow: hidden;
border: 1px solid var(--color-border);
border-radius: var(--radius-inputs);
background: color-mix(in srgb, var(--color-surface-raised) 88%, transparent);
}
.b06-cross-card__zoom-btn {
width: 22px;
height: 22px;
padding: 0;
border: none;
border-left: 1px solid var(--color-border);
background: none;
color: var(--color-text-secondary);
font-size: 0.8rem;
line-height: 1;
cursor: pointer;
}
.b06-cross-card__zoom-btn:first-child {
border-left: none;
}
.b06-cross-card__zoom-btn:hover {
color: var(--color-text);
background: var(--color-surface);
}
/* ── 좌측 [횡단 조정] 사본(2026-08-29 B05/B06 일원화) ─────────────────────
* 오버레이 창과 같은 DOM을 좌측 사이드바에 흐름 배치로 세운다. */
.b06-structure-panel--dock {
position: static;
z-index: auto;
max-height: none;
margin-top: var(--spacing-8);
border-color: var(--color-border);
overflow: visible;
}
/* 9키·십자 위치제어(이동 D-pad·집수정 9키)는 횡단도 오버레이 전용
* (2026-08-29 사용자 지시 7) — 사본에서는 그 행을 통째로 숨긴다. */
.b06-structure-panel--dock
.b06-structure-panel__struct:has(> .b06-structure-panel__controls.b06-structure-panel__buttons),
.b06-structure-panel--dock
.b06-structure-panel__struct:has(
> .b06-structure-panel__controls.b06-structure-panel__basin-buttons
) {
display: none;
}
/* [횡단 조정] 하위 컨테이너 — 구조물 배치 폼과 경계 구분(접이식). */
.b06-adjust-dock {
margin-top: var(--spacing-8);
padding-top: var(--spacing-8);
border-top: 1px solid var(--color-border);
}
.b06-adjust-dock > summary {
color: var(--color-text-body);
font-size: var(--text-caption);
font-weight: var(--font-weight-medium);
cursor: pointer;
}
.b06-adjust-dock__empty {
margin: var(--spacing-8) 0 0;
color: var(--color-text-muted);
font-size: var(--text-caption);
}
/* 횡단도 오버레이 창은 **위치제어 전용**으로 줄인다(2026-08-29 사용자 지시: 좌측
* [횡단 조정]과 내용이 같음을 확인한 뒤 중복 삭제). 십자(이동)·9키(집수정) 버튼
* 세트만 남기고, 값·형식·구간값 등 항목 행은 좌측 하나로 모은다. DOM·배선은 그대로라
* 두 창의 값은 계속 같이 움직인다. */
.b06-structure-panel:not(.b06-structure-panel--dock)
.b06-structure-panel__struct:not(
:has(> .b06-structure-panel__controls.b06-structure-panel__buttons)
):not(:has(> .b06-structure-panel__controls.b06-structure-panel__basin-buttons)) {
display: none;
}
/* 집수정 기본값(↺)은 9키와 한 세트라 오버레이에만 둔다. */
.b06-structure-panel--dock .b06-structure-panel__basin-reset {
display: none;
}
/* 좌측 폼과 중복된 행은 사본에서 숨긴다(2026-08-29 사용자 지시 3·5):
* 형태 = 유입구·유출구 그룹의 "형태", 구조물 형식 = 유입구 "구조"로 합쳤다. */
.b06-structure-panel--dock .b06-structure-panel__struct--form,
.b06-structure-panel--dock .b06-structure-panel__struct--inlet-kind {
display: none;
}
/* 유입구·유출구 그룹으로 옮겨 붙은 행(단 수·옵션) — 그룹 안에서는 폼 여백을 따른다. */
.b05-structure__adjust-slot:empty {
display: none;
}
.b05-structure__adjust-slot {
display: flex;
flex-direction: column;
gap: 6px;
}
/* 유입구·유출구 그룹으로 옮겨 온 행(단 수·옵션) — 폼의 다른 항목과 같은 표기로
* 맞추고 2열로 세운다(2026-08-29 사용자 지시 1). 조정창 안에서 쓰던 어두운 행
* 양식은 여기서 벗는다. */
.b05-structure__adjust-slot {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 6px;
}
.b05-structure__adjust-slot .b06-structure-panel__struct {
display: flex;
min-width: 0;
flex-direction: column;
gap: 2px;
}
.b05-structure__adjust-slot .b06-structure-panel__label {
color: var(--color-text-body);
font-size: var(--text-caption);
opacity: 1;
}
/* 단 수 [-][값][+]도 폼의 숫자 조정칸과 같은 한 덩어리로 보이게 한다. */
.b05-structure__adjust-slot .b06-structure-panel__controls {
display: flex;
overflow: hidden;
min-width: 0;
align-items: stretch;
border: 1px solid var(--color-border);
border-radius: var(--radius-inputs);
background: var(--color-surface);
gap: 0;
}
.b05-structure__adjust-slot .b06-structure-panel__controls .b06-structure-panel__btn {
width: 28px;
height: auto;
min-height: 24px;
border: 0;
border-radius: 0;
background: transparent;
color: var(--color-text-body);
}
.b05-structure__adjust-slot .b06-structure-panel__hval {
display: flex;
min-width: 0;
flex: 1 1 auto;
align-items: center;
justify-content: center;
border-right: 1px solid var(--color-border);
border-left: 1px solid var(--color-border);
color: var(--color-text);
font-size: var(--text-caption);
}
/* 옵션 토글 둘은 한 덩어리 안에서 반씩 나눠 쓴다. */
.b05-structure__adjust-slot
.b06-structure-panel__controls.b06-structure-panel__toggles
.b06-structure-panel__toggle {
width: auto;
flex: 1 1 0;
padding: 0;
}
.b05-structure__adjust-slot
.b06-structure-panel__controls.b06-structure-panel__toggles
.b06-structure-panel__toggle
+ .b06-structure-panel__toggle {
border-left: 1px solid var(--color-border);
}
/* 도면에서 고른 구조물 쪽 그룹 강조(2026-08-29 사용자 지시) — 조정창 테두리와 같은
붉은 계열로 맞춰 "지금 만지는 구조물"이 한 색으로 읽히게 한다. */
.b05-structure__group.is-active {
border-color: var(--color-danger);
background: color-mix(in srgb, var(--color-danger) 8%, transparent);
}
.b05-structure__group.is-active > legend {
color: var(--color-danger);
opacity: 1;
}