Files
Pier_v1/src/style.css
T
ypshimandClaude Haiku 5.5 a2e4648f7b feat(view): side view (정면) to the right of the footing plan on one scale; 본수 card, plan and side in one row
Plan and side use the same scale (22 px per m) and share their horizontal extent, so the footing lines up. The side view breaks
the column (3 m above the footing) and the piles (4 m below it) so its height stays near the plan's. The row is three columns
from 1100 px, the side view drops to its own row between 800 and 1100 px, and it stacks below 800 px.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
2026-10-23 16:10:14 +09:00

813 lines
24 KiB
CSS

/* Tokens from 시안 (RAG/Pierzainer UI 시안 (1).html): background, primary action, dimension colour. */
:root {
--bg: #faf9f5;
--panel: #ffffff;
--text: #1d2733;
--muted: #5b6878;
--line: #d9d6cc;
--primary: #1f5fa8;
--dim: #4a5868;
--warn: #8a5300;
--error: #9b2c2c;
--focus: 2px solid #1f5fa8;
color-scheme: light;
}
* {
box-sizing: border-box;
}
body {
margin: 0;
background: var(--bg);
color: var(--text);
font: 14px/1.5 system-ui, 'Noto Sans KR', sans-serif;
}
h2 {
font-size: 16px;
margin: 0 0 10px;
}
h3 {
font-size: 14px;
margin: 0 0 6px;
}
h4 {
font-size: 13px;
margin: 12px 0 6px;
color: var(--muted);
}
.muted {
color: var(--muted);
}
.small {
font-size: 12px;
}
button,
select,
input {
font: inherit;
min-height: 44px;
}
button:focus-visible,
select:focus-visible,
input:focus-visible,
summary:focus-visible {
outline: var(--focus);
outline-offset: 2px;
}
.btn {
border: 1px solid var(--line);
border-radius: 6px;
background: var(--panel);
color: var(--text);
padding: 0 14px;
cursor: pointer;
}
.btn.small {
min-height: 44px;
padding: 0 10px;
}
.btn.primary {
background: var(--primary);
border-color: var(--primary);
color: #fff;
}
.btn:disabled {
opacity: 0.45;
cursor: not-allowed;
}
.btn[aria-pressed='true'] {
border-color: var(--primary);
color: var(--primary);
font-weight: 600;
}
/* --- header ------------------------------------------------------------- */
.app {
min-height: 100vh;
display: flex;
flex-direction: column;
}
.top {
display: flex;
flex-wrap: wrap;
gap: 12px;
align-items: center;
justify-content: space-between;
padding: 10px 16px;
background: var(--panel);
border-bottom: 1px solid var(--line);
}
.brand {
display: flex;
gap: 10px;
align-items: baseline;
}
.brand strong {
font-size: 16px;
}
.steps {
display: flex;
gap: 8px;
flex-wrap: wrap;
}
.step {
padding: 8px 12px;
border: 1px solid var(--line);
border-radius: 6px;
color: var(--muted);
}
.step.current {
border-color: var(--primary);
color: var(--text);
font-weight: 600;
}
.step em {
font-style: normal;
font-weight: 400;
color: var(--muted);
margin-left: 4px;
}
.actions {
display: flex;
gap: 8px;
flex-wrap: wrap;
}
.status-line {
margin: 0;
padding: 8px 16px;
color: var(--muted);
font-size: 13px;
}
/* --- layout ------------------------------------------------------------- */
.grid {
display: grid;
grid-template-columns: 260px minmax(0, 1fr) 320px;
gap: 12px;
padding: 0 16px 12px;
flex: 1;
}
.panel {
background: var(--panel);
border: 1px solid var(--line);
border-radius: 8px;
padding: 12px;
min-width: 0;
}
.inputs {
margin: 0 16px 16px;
}
/* --- pier list ---------------------------------------------------------- */
.pier-tools {
display: flex;
gap: 8px;
align-items: center;
margin-bottom: 8px;
flex-wrap: wrap;
}
.pier-tools label {
display: flex;
gap: 6px;
align-items: center;
}
select {
padding: 4px 8px;
border: 1px solid var(--line);
border-radius: 6px;
background: var(--panel);
color: var(--text);
}
.pier-items {
list-style: none;
padding: 0;
margin: 0;
max-height: 70vh;
overflow: auto;
}
.pier-items li {
display: grid;
grid-template-columns: 28px 1fr auto;
align-items: center;
gap: 6px;
border-bottom: 1px solid var(--line);
padding: 2px 0;
}
.pier-items input[type='checkbox'] {
width: 28px;
height: 28px;
margin: 8px;
}
.pier-name {
border: 0;
background: none;
text-align: left;
color: var(--text);
cursor: pointer;
padding: 0 4px;
}
.pier-name[aria-pressed='true'] {
color: var(--primary);
font-weight: 700;
}
.badge {
font-size: 12px;
color: var(--muted);
}
.badge.error {
color: var(--error);
font-weight: 600;
}
/* --- viewer ------------------------------------------------------------- */
.viewer-head {
display: flex;
flex-wrap: wrap;
gap: 10px;
align-items: center;
margin-bottom: 8px;
}
.viewer-head h2 {
margin: 0;
}
.views {
display: flex;
gap: 6px;
flex-wrap: wrap;
}
.views .btn {
min-width: 64px;
}
#origin {
margin-left: auto;
font-size: 12px;
}
.canvas {
width: 100%;
height: 62vh;
min-height: 420px;
border-radius: 6px;
overflow: hidden;
background: #e9eef4;
}
.rebar-table tbody tr { cursor: pointer; }
.rebar-table tr.hl td { background: #fff3cc; }
.rebar-table .bar-no { font-weight: 700; }
.parts {
border: 1px solid var(--line);
border-radius: 6px;
margin: 10px 0 0;
padding: 6px 10px;
}
.parts legend {
color: var(--muted);
font-size: 12px;
padding: 0 4px;
}
.parts-row {
display: flex;
gap: 4px;
flex-wrap: wrap;
}
.parts-row label {
display: flex;
align-items: center;
gap: 6px;
min-height: 44px;
padding: 0 8px;
}
.parts-row input {
width: 22px;
height: 22px;
}
/* --- results ------------------------------------------------------------ */
.results section {
border-bottom: 1px solid var(--line);
padding-bottom: 8px;
margin-bottom: 8px;
}
.kv {
display: grid;
grid-template-columns: 1fr;
gap: 2px 8px;
margin: 0;
}
.kv.wide {
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
}
.kv div {
display: flex;
justify-content: space-between;
gap: 8px;
border-bottom: 1px dotted var(--line);
padding: 2px 0;
}
.kv dt {
color: var(--muted);
}
.kv dd {
margin: 0;
text-align: right;
}
.issues {
padding-left: 18px;
margin: 0;
}
.issues li {
margin-bottom: 6px;
}
.issues .code {
font-weight: 700;
color: var(--warn);
}
.issues .code.E {
color: var(--error);
}
details {
margin-top: 8px;
}
summary {
cursor: pointer;
min-height: 44px;
display: flex;
align-items: center;
}
/* --- import dialog (④) --------------------------------------------------- */
#import-dialog {
width: min(1140px, 96vw);
max-height: 92vh;
padding: 0;
border: 1px solid var(--line);
border-radius: 10px;
background: var(--panel);
color: var(--text);
}
#import-dialog::backdrop {
background: rgba(20, 28, 38, 0.35);
}
.dlg-head {
display: flex;
flex-wrap: wrap;
gap: 12px;
align-items: center;
padding: 12px 16px;
border-bottom: 1px solid var(--line);
}
.dlg-head h2 {
margin: 0;
}
.dlg-steps {
display: flex;
gap: 8px;
list-style: none;
padding: 0;
margin: 0;
flex: 1;
color: var(--muted);
font-size: 13px;
}
.dlg-steps li {
padding: 4px 10px;
border-radius: 999px;
background: #f0eee6;
}
.dlg-body {
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
gap: 16px;
padding: 16px;
overflow: auto;
max-height: 70vh;
}
.dlg-col section {
margin-bottom: 16px;
}
.field {
display: grid;
gap: 4px;
margin-bottom: 8px;
font-size: 13px;
}
.field input {
border: 1px solid var(--line);
border-radius: 6px;
padding: 4px 8px;
background: var(--panel);
color: var(--text);
}
.drop {
border: 2px dashed var(--line);
border-radius: 8px;
padding: 16px;
text-align: center;
}
.drop.over {
border-color: var(--primary);
}
.drop p {
margin: 0 0 8px;
}
.drop-actions {
display: flex;
gap: 8px;
justify-content: center;
flex-wrap: wrap;
}
.sheet-list {
list-style: none;
padding: 0;
margin: 0;
}
.sheet-list > li {
border: 1px solid var(--line);
border-radius: 6px;
padding: 8px;
margin-bottom: 8px;
}
.sheet-list .ok {
color: var(--primary);
font-weight: 600;
}
.sheet-list .bad {
color: var(--error);
font-weight: 600;
}
.sheet-pier {
display: flex;
align-items: center;
gap: 8px;
min-height: 44px;
}
.sheet-pier input {
width: 24px;
height: 24px;
}
.rules {
margin: 0;
padding-left: 18px;
font-size: 13px;
}
table {
border-collapse: collapse;
width: 100%;
font-size: 13px;
}
.terms th {
text-align: left;
width: 40%;
color: var(--muted);
font-weight: 400;
padding: 4px 6px;
border-bottom: 1px solid var(--line);
}
.terms td {
padding: 4px 6px;
border-bottom: 1px solid var(--line);
}
.grid-table th,
.grid-table td {
border-bottom: 1px solid var(--line);
padding: 4px 6px;
text-align: right;
white-space: nowrap;
}
.grid-table th {
color: var(--muted);
font-weight: 400;
}
.dlg-foot {
display: flex;
gap: 8px;
align-items: center;
justify-content: flex-end;
padding: 12px 16px;
border-top: 1px solid var(--line);
flex-wrap: wrap;
}
#dlg-selected {
margin-right: auto;
}
@media (max-width: 1100px) {
.grid {
grid-template-columns: 1fr;
}
.dlg-body {
grid-template-columns: 1fr;
}
.canvas {
height: 60vh;
}
}
/* Input cards (2단계 C2): changed values are outlined in orange, with the imported default beside them. */
.edit-card { margin-top: 12px; border-top: 1px solid #d5dde6; padding-top: 10px; }
.edit-row { display: flex; align-items: center; gap: 8px; margin: 6px 0; flex-wrap: wrap; }
.edit-row label { min-width: 150px; }
.edit-row input { width: 110px; padding: 4px 6px; border: 1px solid #b9c4d0; border-radius: 4px; }
.edit-row.changed input { border: 2px solid #e8833a; background: #fff6ee; }
.edit-row.changed label { color: #a4530e; }
/* ---- 시안 ① 디자인 반영 (RAG/Pierzainer UI 시안 (1).html) ---- */
body { background: #eef1f4; font-family: 'Noto Sans KR', system-ui, sans-serif; }
.top { background: #18212b; color: #ffffff; padding: 10px 24px; }
.top .brand strong { font-size: 18px; letter-spacing: 0.01em; }
.top .brand > span:not(.proj) { font-size: 12px; color: #b8c2ce; }
.proj { padding-left: 14px; border-left: 1px solid #33404f; color: #ffffff; font-size: 13px; font-weight: 700; }
.steps .step { color: #dce3ea; min-height: 44px; padding: 4px 14px; border-radius: 6px; background: transparent; border: 0; }
.steps .step.current { background: #ffffff; color: #18212b; }
.steps .step em { font-style: normal; color: #b8c2ce; font-size: 12px; }
.steps .step.current em { color: #55606e; }
.steps .step[aria-disabled='true'] em { color: #b8c2ce; }
.savest { color: #f2c48d; font-size: 12px; }
.actions { color: #ffffff; }
.btn-s, .btn-p, .btn-o { display: inline-flex; align-items: center; font-family: inherit; font-size: 13px; min-height: 44px; border-radius: 6px; cursor: pointer; box-sizing: border-box; text-decoration: none; }
.btn-s { padding: 0 14px; border: 1px solid #8c99a8; background: transparent; color: #ffffff; }
.btn-s:hover { border-color: #c3cbd4; }
.btn-s:disabled { opacity: 0.45; cursor: default; }
.btn-p { padding: 0 16px; border: 0; background: #1f5fa8; color: #ffffff; font-weight: 700; font-size: 14px; }
.btn-p:hover:not(:disabled) { background: #174c88; }
.btn-p:disabled { opacity: 0.45; cursor: default; }
.btn-o { padding: 0 12px; min-height: 40px; border: 1px solid #1f5fa8; background: #ffffff; color: #1f5fa8; }
.btn-o:hover:not(:disabled) { background: #f2f7fc; color: #123e70; }
.btn-o:disabled { opacity: 0.45; cursor: default; }
.lnk { font-size: 12px; color: #1f5fa8; background: none; border: 0; min-height: 36px; padding: 0 4px; cursor: pointer; text-decoration: underline; text-underline-offset: 3px; }
.lbl { font-size: 12px; font-weight: 700; letter-spacing: 0.02em; color: #55606e; margin: 0 0 8px; }
.panel { background: #ffffff; border: 1px solid #d5dbe2; border-radius: 8px; padding: 16px; }
.piers { display: flex; flex-direction: column; gap: 6px; }
.pier-tools { display: flex; align-items: center; gap: 8px; padding: 0 4px 8px; }
.pier-tools select { border: 1px solid #c3cbd4; border-radius: 6px; background: #ffffff; min-height: 36px; }
.phead { display: grid; grid-template-columns: 36px 1fr auto; gap: 8px; padding: 0 10px 6px; font-size: 12px; color: #55606e; border-bottom: 1px solid #d5dbe2; }
.pier-items li { display: grid; grid-template-columns: 36px 1fr auto; align-items: center; gap: 8px; border-radius: 6px; padding-right: 6px; }
.pier-items li:has(.pier-name[aria-pressed='true']) { background: #e3edf8; }
.pier-name { border: 0; background: transparent; color: #18212b; text-align: left; font-size: 13px; min-height: 44px; padding: 0 6px; }
.pier-name[aria-pressed='true'] { color: #123e70; font-weight: 700; }
.badge { font-size: 12px; border-radius: 10px; padding: 2px 8px; background: #e2f2e7; color: #1d6b3a; white-space: nowrap; }
.badge.error { background: #fde2e2; color: #9b2c2c; }
.pnote { font-size: 12px; color: #55606e; margin: 8px 4px 0; line-height: 1.6; }
.bulk { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-top: 10px; padding: 8px 10px; border-radius: 6px; background: #f2f7fc; font-size: 13px; color: #123e70; }
.bulk .grow { flex: 1 1 auto; }
.pier-input { margin-top: 14px; border-top: 1px solid #d5dbe2; padding-top: 12px; }
.kv div { display: flex; justify-content: space-between; gap: 12px; padding: 7px 0; border-bottom: 1px solid #e6eaef; font-size: 13px; }
.kv dt { color: #55606e; }
.kv dd { margin: 0; font-family: 'JetBrains Mono', ui-monospace, monospace; font-size: 12px; text-align: right; }
.views { display: flex; gap: 2px; background: #eef1f4; border-radius: 6px; padding: 2px; }
.views .btn { min-height: 40px; padding: 0 14px; border: 0; border-radius: 4px; background: transparent; color: #18212b; }
.views .btn[aria-pressed='true'] { background: #1f5fa8; color: #ffffff; font-weight: 700; }
.viewer-head { gap: 8px; }
.edit-card h3 { font-size: 12px; color: #55606e; }
/* 속성 복사 (시안 ⑥) */
.cp-items li { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 14px; padding: 6px 0; border-bottom: 1px solid #e6eaef; }
.cp-group { min-width: 110px; font-size: 12px; font-weight: 700; color: #55606e; }
.cp-targets { list-style: none; padding: 0; margin: 6px 0; max-height: 240px; overflow-y: auto; }
.cp-targets li { display: flex; align-items: center; gap: 8px; min-height: 36px; }
.chk.disabled { opacity: 0.5; }
#cp-preview td, #cp-preview th { font-size: 12px; }
/* 형상계획 ② (plan.md C1) */
[hidden] { display: none !important; }
.members { list-style: none; padding: 0; margin: 0; }
.members li { margin: 2px 0; }
.members-title { margin-top: 14px; }
.member { display: flex; align-items: center; justify-content: space-between; gap: 8px; width: 100%; min-height: 44px; padding: 0 10px; border: 0; border-radius: 6px; background: transparent; color: #18212b; font-size: 13px; text-align: left; cursor: pointer; }
.member[aria-pressed='true'] { background: #e3edf8; color: #123e70; font-weight: 700; }
#member-fields { margin-top: 10px; }
#member-summary { color: #55606e; margin: 4px 0 8px; }
.plan .results { flex: 1 1 300px; max-width: 360px; }
/* 형상 선택칩 (C5) and the scrolling pier list (C6) */
.shape-options { display: grid; gap: 6px; margin: 6px 0 10px; }
.shape-row { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
.shape-row .lbl { min-width: 84px; margin: 0; }
.chip-opt { min-height: 36px; padding: 0 10px; border: 1px solid #c3cbd4; border-radius: 16px; background: #ffffff; color: #18212b; font-size: 13px; cursor: pointer; }
.chip-opt[aria-pressed='true'] { background: #1f5fa8; border-color: #1f5fa8; color: #ffffff; font-weight: 700; }
.chip-opt:disabled { color: #8a95a3; background: #f2f4f7; border-style: dashed; cursor: default; }
.pier-items { max-height: 300px; overflow-y: auto; }
/* 열별 본수 (C4) */
.pile-rows { margin-top: 10px; display: grid; gap: 6px; }
.pile-row { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
.pile-row .btn.small { min-width: 40px; }
.pile-row.warn { color: #8a4b00; }
.warn-text { color: #8a4b00; font-size: 12px; }
/* 철근표 (③): text columns read left to right, numbers right; the table scrolls sideways inside its panel. */
#rebar-table { overflow-x: auto; }
.rebar-table td,
.rebar-table th { text-align: left; }
.rebar-table td:nth-child(9),
.rebar-table td:nth-child(10),
.rebar-table th:nth-child(9),
.rebar-table th:nth-child(10) { text-align: right; }
.rebar-table td:nth-child(12) { white-space: normal; min-width: 240px; }
/* 3D viewer shared by ①, ②, ③: the slot takes the full width above the other columns */
.viewer-slot { flex: none; width: 100%; min-width: 0; }
.viewer-slot > .viewer { width: 100%; }
/* ② and ③ use the ① layout: list | model above the table | results */
.center-col { flex: 999 1 560px; min-width: 0; display: flex; flex-direction: column; gap: 16px; }
.center-col > .viewer { flex: none; }
/* ③ 3D 색 기준 (spec §6.7): 조작 요소 44px */
.rebar-color { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; margin: 6px 0; }
.rebar-color button { min-height: 44px; min-width: 56px; padding: 0 12px; border: 1px solid #b9c4d0; border-radius: 6px; background: #fff; cursor: pointer; }
.rebar-color button[aria-pressed='true'] { background: #1f5fa8; border-color: #1f5fa8; color: #fff; }
.rebar-legend { display: flex; flex-wrap: wrap; gap: 10px; list-style: none; margin: 0; padding: 0; font-size: 13px; }
.rebar-legend-item { display: flex; align-items: center; gap: 6px; }
.rebar-legend .swatch { display: inline-block; width: 14px; height: 14px; border-radius: 3px; }
.rebar-color[hidden] { display: none; }
.viewer-head .rebar-color { margin: 0 auto; }
.rebar-select { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin: 6px 0; }
.rebar-select .btn { min-height: 44px; }
/* ④ 재료표 (승인 2026-10-23) */
.grid.quantity { grid-template-columns: 260px minmax(0, 1fr); }
.quantity .subtotal td { font-weight: 700; background: #f3f6fa; }
.quantity h3 { margin: 14px 0 4px; font-size: 15px; }
@media print {
@page { size: A4 landscape; margin: 10mm; }
body * { visibility: hidden; }
#view-quantity, #view-quantity * { visibility: visible; }
#view-quantity { position: absolute; left: 0; top: 0; width: 100%; padding: 0; }
#view-quantity .piers, #quantity-export, #quantity-print { display: none !important; }
.quantity .rebar-table { font-size: 10px; }
}
/* 상단: 상태 줄과 백업 배너를 한 줄에 (승인 2026-10-23) */
.status-row { display: flex; align-items: center; flex-wrap: wrap; gap: 4px 12px; padding: 4px 16px; }
.status-row .status-line { padding: 0; margin: 0; }
.backup-inline { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; font-size: 13px; color: var(--muted); }
.backup-inline .btn.small { min-height: 44px; }
/* 알림 토스트: 일반 메시지는 4초 뒤 사라지고, 오류는 닫을 때까지 남음 */
.toast-host { position: fixed; right: 16px; bottom: 16px; display: flex; flex-direction: column; gap: 8px; z-index: 50; max-width: min(360px, calc(100vw - 32px)); }
.toast { display: flex; align-items: center; gap: 10px; background: #1b2733; color: #ffffff; padding: 10px 14px; border-radius: 6px; font-size: 13px; box-shadow: 0 4px 14px rgba(0, 0, 0, 0.2); }
.toast.error { background: #8a1c1c; }
.toast .btn { min-height: 44px; }
/* --- 고정 프레임 (승인 2026-10-23): 좌측 창 · 중앙 상단(모델) · 중앙 하단 · 우측 창, 각각 독립 스크롤 --- */
@media (min-width: 1101px) {
.app { height: 100vh; overflow: hidden; }
.top, .status-row { flex: none; }
.grid { flex: 1 1 auto; min-height: 0; height: auto; grid-template-rows: minmax(0, 1fr); padding-bottom: 12px; }
.grid > .panel, .grid > .center-col { min-height: 0; overflow: auto; }
.grid > #viewer-block { display: flex; flex-direction: column; }
.grid > #viewer-block .canvas { flex: 1 1 auto; height: auto; min-height: 240px; }
/* ②–④: the model keeps a fixed band at the top; the table scrolls below it. */
.center-col { display: grid; grid-template-rows: clamp(280px, 48vh, 560px) minmax(0, 1fr); gap: 12px; }
.viewer-slot { min-height: 0; height: 100%; display: flex; flex-direction: column; }
.viewer-slot > .viewer { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; }
.viewer-slot .canvas { flex: 1 1 auto; height: auto; min-height: 180px; }
.center-col > .viewer { min-height: 0; overflow: auto; }
.rebar-table thead th, .quantity .rebar-table thead th { position: sticky; top: 0; background: #ffffff; z-index: 1; }
}
@media (max-width: 1100px) {
.app { min-height: 100vh; }
.grid { height: auto; }
.grid > .panel, .grid > .center-col { max-height: 60vh; overflow: auto; }
.center-col { display: flex; flex-direction: column; gap: 16px; }
.viewer-slot .canvas { height: 60vh; min-height: 420px; flex: none; }
.rebar-table thead th { position: sticky; top: 0; background: #ffffff; z-index: 1; }
}
/* 3D 영역 (승인 2026-10-23): 제목은 교각 목록으로. 좌측 스택(부재 표시 · 시점), 우측 스택(색 기준 · 원점)을 캔버스 위에 둠. */
#viewer-block { position: relative; }
#viewer-block .viewer-head { display: none; }
.viewer-stack { display: flex; flex-direction: column; gap: 8px; width: 168px; z-index: 5; pointer-events: none; }
.viewer-stack > * { pointer-events: auto; }
#viewer-block .viewer-stack-right { position: absolute; top: 8px; right: 8px; width: 180px; align-items: stretch; }
#viewer-block .info-panel { background: rgba(255, 255, 255, 0.92); border: 1px solid #d5dde6; border-radius: 6px; box-shadow: 0 4px 14px rgba(0, 0, 0, 0.12); padding: 0 8px 8px; font-size: 13px; }
#viewer-block .info-panel > summary { min-height: 44px; display: flex; align-items: center; cursor: pointer; font-weight: 700; color: #18212b; list-style-position: outside; }
#viewer-block .parts-info #parts label { display: flex; align-items: center; gap: 8px; min-height: 44px; }
#viewer-block .parts-info .parts-row { display: flex; flex-direction: column; align-items: stretch; gap: 0; }
#viewer-block .color-info .rebar-color { display: flex; flex-direction: column; align-items: stretch; gap: 0; margin: 0; }
#viewer-block .color-info .rebar-color button { width: 100%; }
#viewer-block .color-info .rebar-legend { flex-direction: column; gap: 4px; padding: 6px 0 0; }
#viewer-block .views-menu { position: relative; }
#viewer-block .views-toggle { width: 100%; min-height: 44px; font-weight: 700; background: #eef3f8; border: 1px solid #c3cbd4; border-radius: 6px; }
#viewer-block #views.views-list { position: absolute; top: 100%; left: 0; right: 0; z-index: 10; display: flex; flex-direction: column; gap: 0; padding: 4px; margin-top: 4px; background: #ffffff; border: 1px solid #c3cbd4; border-radius: 6px; box-shadow: 0 4px 14px rgba(0, 0, 0, 0.15); }
#viewer-block #views.views-list .btn { min-height: 44px; justify-content: flex-start; text-align: left; border: 0; background: transparent; }
#viewer-block #views.views-list .btn[aria-pressed='true'] { background: #1f5fa8; color: #ffffff; }
#viewer-block .origin-wrap { position: relative; align-self: flex-end; }
#viewer-block .info-btn { min-width: 44px; min-height: 44px; border: 1px solid #c3cbd4; border-radius: 6px; background: #ffffff; font-size: 16px; cursor: pointer; }
#viewer-block .origin-pop { position: absolute; top: 100%; right: 0; z-index: 10; margin-top: 4px; padding: 6px 10px; background: #ffffff; border: 1px solid #c3cbd4; border-radius: 6px; font-size: 12px; white-space: nowrap; box-shadow: 0 4px 14px rgba(0, 0, 0, 0.12); }
#viewer-block .panel-state { font-weight: 400; color: #55606e; margin-left: 6px; font-size: 12px; }
@media (max-width: 600px) {
#viewer-block .viewer-head { display: flex; height: auto; margin: 0 0 8px; }
#viewer-block .viewer-stack { position: static; width: auto; margin-top: 8px; pointer-events: auto; }
#viewer-block .origin-wrap { align-self: flex-start; }
#viewer-block .viewer-stack-right { position: static; width: auto; }
}
/* ② 교량받침 reference tables (읽기 전용) */
.bearing-ref .table-scroll { overflow-x: auto; margin-bottom: 8px; }
.bearing-ref table { font-size: 12px; }
.bearing-ref input.changed-input { border: 2px solid #e8833a; background: #fff6ee; }
/* ② 확대기초·말뚝 그림 (2단계) */
.footing-drawings { display: grid; gap: 10px; margin-top: 12px; }
.footing-fig { margin: 0; }
.footing-fig svg { width: 100%; height: auto; max-height: 260px; background: #ffffff; border: 1px solid #d5dde6; border-radius: 6px; }
/* ② 말뚝 배치: 열별 본수 카드 · 평면도 · 정면을 한 줄에 (같은 축척). 1100px 이하는 정면을 아래 줄로, 800px 이하는 한 열로. */
.footing-grid { display: grid; grid-template-columns: minmax(220px, 280px) auto auto; gap: 12px; align-items: start; margin-top: 12px; }
.footing-grid .footing-fig svg { display: block; max-width: none; }
@media (max-width: 1100px) {
.footing-grid { grid-template-columns: minmax(220px, 280px) auto; }
.footing-grid .footing-fig:last-of-type { grid-column: 1 / -1; }
}
@media (max-width: 800px) {
.footing-grid { grid-template-columns: 1fr; }
}