/* 폭·제목·여백은 공용 템플릿(ui_template_general_layout)이 잡는다 (2026-09-06 사용자 지시). 여기서는 역할 배지를 제목 줄 오른쪽에 세우는 것만 한다. */ .b01-dashboard .ui-general-layout__header { display: grid; grid-template-columns: 1fr auto; align-items: end; } .b01-dashboard .ui-general-layout__title, .b01-dashboard .ui-general-layout__subtitle { grid-column: 1; } .b01-dashboard__role { grid-column: 2; grid-row: 1 / span 2; flex-shrink: 0; } .b01-dashboard__grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--spacing-24); } .b01-dashboard__section { min-width: 0; } .b01-dashboard__section--wide { grid-column: 1 / -1; } /* 리소스 현황 | 시스템 설정 — 설정 칸은 단추만 들어 좁게. */ .b01-dashboard__top-row { grid-column: 1 / -1; display: grid; grid-template-columns: minmax(0, 3fr) minmax(0, 1fr); gap: var(--spacing-24); } .b01-dashboard__actions { display: flex; flex-wrap: wrap; gap: var(--spacing-8); } /* 표 안의 관리 버튼은 **한 줄로** 세운다 (2026-09-06 사용자 지시) — 두 줄로 접히면 행 높이가 두 배가 된다. 버튼을 작게 만들고 줄바꿈을 막되, 폭이 모자라면 표가 가로로 스크롤한다(`.b01-dashboard__table-wrap` 이 이미 그렇게 돼 있다). */ .b01-dashboard__table .b01-dashboard__actions { flex-wrap: nowrap; gap: var(--spacing-4); } .b01-dashboard__table .b01-dashboard__actions .ui-btn { padding: var(--spacing-4) var(--spacing-8); font-size: var(--text-caption); white-space: nowrap; } /* 한 칸에 두 줄(날짜/시각) — 아랫줄이 작아 행 높이는 한 줄일 때와 같다. */ .b01-dashboard__stacked { display: flex; flex-direction: column; line-height: 1.2; } .b01-dashboard__stacked-sub { color: var(--color-text-muted); font-size: var(--text-caption); } .b01-dashboard__table-wrap { overflow-x: auto; border: 1px solid var(--color-border); border-radius: var(--radius-cards); } .b01-dashboard__table { width: 100%; border-collapse: collapse; font-size: var(--text-body-sm); } .b01-dashboard__table th, .b01-dashboard__table td { padding: var(--spacing-16); border-bottom: 1px solid var(--color-border); text-align: left; white-space: nowrap; } .b01-dashboard__table th { color: var(--color-text-secondary); font-weight: var(--font-weight-medium); background: var(--color-surface); } .b01-dashboard__table tr:last-child td { border-bottom: 0; } .b01-dashboard__empty { color: var(--color-text-muted); font-size: var(--text-body-sm); } .b01-dashboard__metric-grid { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: var(--spacing-8); } .b01-dashboard__metric { display: flex; align-items: baseline; justify-content: space-between; gap: var(--spacing-8); padding: var(--spacing-8) var(--spacing-16); border: 1px solid var(--color-border); border-radius: var(--radius-cards); background: var(--color-surface); } .b01-dashboard__metric-label { color: var(--color-text-secondary); font-size: var(--text-caption); white-space: nowrap; } .b01-dashboard__metric-value { color: var(--color-text); font-size: var(--text-body); font-family: var(--font-display); line-height: 1; white-space: nowrap; } @media (max-width: 900px) { .b01-dashboard__metric-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } } .b01-dashboard__resource-panel { display: flex; flex-direction: column; gap: var(--spacing-24); } .b01-dashboard__chart { display: flex; flex-direction: column; gap: var(--spacing-8); } .b01-dashboard__chart .ui-chart__plot { height: 140px; } .b01-dashboard__chart .ui-chart__svg { height: 100%; } .b01-dashboard__chart-caption { margin: 0; color: var(--color-text-secondary); font-size: var(--text-caption); } .b01-dashboard__form-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--spacing-16); } .b01-dashboard__form-grid .ui-field:first-child { grid-column: 1 / -1; } .b01-dashboard__modal { position: fixed; inset: 0; z-index: var(--z-modal); display: flex; align-items: center; justify-content: center; padding: var(--spacing-24); background: rgba(38, 17, 74, 0.24); } .b01-dashboard__modal-panel { width: min(560px, 100%); max-height: calc(100vh - 2 * var(--spacing-24)); overflow-y: auto; /* 패널 끝까지 굴려도 뒤 대시보드로 넘어가지 않게 가둔다 (2026-09-13 사용자 지시). */ overscroll-behavior: contain; background: var(--color-surface-raised); border-radius: var(--radius-cards); box-shadow: var(--shadow-lg); padding: var(--spacing-24); } .b01-dashboard__modal-panel .b01-dashboard__actions { margin-top: var(--spacing-24); } .b01-dashboard__modal-title { margin-bottom: var(--spacing-16); } .b01-dashboard__modal-subtitle { margin: var(--spacing-24) 0 var(--spacing-8); } /* 로고·서명 칸 — 프로젝트 수정 모달 안 미리보기 줄과 고르기 모달의 격자 */ .b01-dashboard__asset-row { display: flex; align-items: center; gap: var(--spacing-8); min-height: 40px; } .b01-dashboard__asset-preview { max-height: 36px; max-width: 96px; object-fit: contain; } .b01-dashboard__asset-name { flex: 1; font-size: var(--text-body-sm); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .b01-dashboard__asset-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: var(--spacing-8); } .b01-dashboard__asset { display: flex; flex-direction: column; align-items: center; gap: var(--spacing-4); padding: var(--spacing-8); border: 2px solid var(--color-border); border-radius: var(--radius-cards); background: var(--color-surface); cursor: pointer; font-size: var(--text-body-sm); text-align: center; } .b01-dashboard__asset.is-selected, .b01-dashboard__asset:focus-visible { border-color: var(--color-royal-amethyst); outline: none; } .b01-dashboard__asset img { max-height: 64px; max-width: 100%; object-fit: contain; } /* 서명 그리기 판 — touch-action 을 끊어야 끌기가 스크롤로 새지 않는다 */ .b01-dashboard__sign-pad { width: 100%; height: auto; aspect-ratio: 3 / 1; border: 1px dashed var(--color-border); border-radius: var(--radius-cards); background: var(--color-surface); cursor: crosshair; touch-action: none; } .b01-dashboard__check { display: block; margin: var(--spacing-8) 0 var(--spacing-16); font-size: var(--text-body-sm); } @media (max-width: 860px) { .b01-dashboard__header, .b01-dashboard__grid, .b01-dashboard__top-row { display: block; } .b01-dashboard__section { margin-top: var(--spacing-24); } .b01-dashboard__form-grid { grid-template-columns: 1fr; } } /* 회사 주소 입력 — 검색해서 고르는 칸 (2026-09-13). 라벨·입력·버튼을 한 줄에 세운다. ui-field 가 기본이 세로(라벨 위·입력 아래·오류 슬롯)라 그대로 두면 버튼이 오류 슬롯 높이만큼 밀려 수평이 어긋난다 — 이 칸에서만 가로로 눕힌다. */ .b01-dashboard__address { display: flex; flex-direction: column; gap: var(--spacing-8, 8px); } .b01-dashboard__address-row { display: flex; align-items: center; gap: var(--spacing-8, 8px); } .b01-dashboard__address-row > .ui-field { display: flex; flex: 1 1 auto; flex-direction: row; align-items: center; gap: var(--spacing-8, 8px); min-width: 0; margin: 0; } .b01-dashboard__address .ui-field__label { flex: 0 0 64px; margin: 0; white-space: nowrap; } .b01-dashboard__address .ui-input { flex: 1 1 auto; min-width: 0; } .b01-dashboard__address .ui-field__error { display: none; } .b01-dashboard__address-row > .ui-btn { flex: 0 0 auto; } .b01-dashboard__address-zip { flex: 0 0 auto; color: var(--color-text-muted, #666); font-size: 0.85rem; white-space: nowrap; } .b01-dashboard__address-list { display: flex; flex-direction: column; max-height: 220px; overflow-y: auto; overscroll-behavior: contain; border: 1px solid var(--color-border); border-radius: var(--radius-8, 8px); } .b01-dashboard__address-item { display: flex; flex-direction: column; gap: 2px; padding: var(--spacing-8, 8px); border: 0; border-bottom: 1px solid var(--color-border); background: transparent; color: inherit; text-align: left; cursor: pointer; } .b01-dashboard__address-item:last-child { border-bottom: 0; } .b01-dashboard__address-item:hover, .b01-dashboard__address-item:focus-visible { background: var(--color-surface-hover, rgba(0, 0, 0, 0.04)); } .b01-dashboard__address-item small { color: var(--color-text-muted, #666); } .b01-dashboard__map-zoom { display: flex; gap: var(--spacing-8, 8px); margin-bottom: var(--spacing-8, 8px); } /* 회사 주소 지도 미리보기 — 타일 3×3 을 붙이고 가운데 표식을 찍는다 (2026-09-06). */ .b01-dashboard__map-frame { position: relative; width: 100%; max-width: 384px; aspect-ratio: 1; overflow: hidden; border: 1px solid var(--color-border); border-radius: var(--radius-8, 8px); } .b01-dashboard__map-grid { display: grid; grid-template-columns: repeat(3, 256px); transform: scale(0.5); transform-origin: top left; } .b01-dashboard__map-marker { position: absolute; width: 12px; height: 12px; margin: -6px 0 0 -6px; border: 2px solid var(--color-surface, #fff); border-radius: 50%; background: var(--color-danger, #d33); } /* 프로젝트 참여자 고르기 (2026-09-06). */ .b01-dashboard__members { display: flex; flex-direction: column; gap: var(--spacing-4, 4px); max-height: 160px; overflow-y: auto; } .b01-dashboard__member-row { display: flex; align-items: center; gap: var(--spacing-8); }