/* 업무 화면(/app/)·현장 화면(/app/field/). 값은 tokens.css의 변수만 쓴다. 외부 글꼴·CDN 없음.
   현장 화면: 큰 글씨·큰 버튼(최소 --tap-size), 아래 고정 탭, 휴대폰(390px)~태블릿 가로(1024px). */

* { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; }
body.app { margin: 0; font-family: system-ui, -apple-system, "Noto Sans KR", "Malgun Gothic", sans-serif;
  font-size: var(--font-size-app); line-height: 1.5; color: var(--ink); background: var(--surface-alt); }
.app a { color: var(--accent); }
.app h1 { font-size: var(--font-size-app-title); margin: 0 0 var(--space-4); }
.app h2 { font-size: var(--font-size-app-big); margin: var(--space-6) 0 var(--space-3); }
.app :focus-visible { outline: 3px solid var(--focus-ring); outline-offset: 2px; }

/* 버튼·입력(손가락 크기) */
.btn { display: inline-flex; align-items: center; justify-content: center; min-height: var(--tap-size); min-width: var(--tap-size);
  padding: 0 var(--space-5); border: 1px solid var(--line-strong); border-radius: var(--radius-lg); background: var(--surface);
  color: var(--ink); font-size: var(--font-size-app); font-weight: 600; text-decoration: none; cursor: pointer; }
.btn-primary { background: var(--accent); border-color: var(--accent); color: var(--accent-fg); }
.app a.btn { color: var(--ink); }
.app a.btn-primary { color: var(--accent-fg); }
.btn-block { display: flex; width: 100%; }
.btn[disabled] { opacity: .5; cursor: default; }
.app input[type=text], .app input[type=password], .app input[type=number], .app input[type=tel], .app select, .app textarea {
  min-height: var(--tap-size); padding: var(--space-2) var(--space-3); font-size: var(--font-size-app); border: 1px solid var(--line-strong);
  border-radius: var(--radius-md); background: var(--surface); color: var(--ink); max-width: 100%; }
.form-stack p { margin: 0 0 var(--space-4); display: flex; flex-direction: column; gap: var(--space-1); }
.form-stack label { font-weight: 600; }
.form-stack .helptext { color: var(--ink-quiet); font-size: var(--font-size-app-small); }
.form-stack input[type=text], .form-stack input[type=password], .form-stack input[type=number], .form-stack select { width: 100%; }
.form-stack .vDateField { width: 12em; }
.errorlist { margin: 0 0 var(--space-3); padding: var(--space-3) var(--space-4); list-style: none; background: var(--tone-error-bg);
  color: var(--tone-error-fg); border-radius: var(--radius-md); }

/* 알림(메시지) */
.messages { list-style: none; margin: 0 0 var(--space-4); padding: 0; }
.messages li { padding: var(--space-3) var(--space-4); border-radius: var(--radius-md); margin-bottom: var(--space-2); }
.messages .success { background: var(--tone-ok-bg); color: var(--tone-ok-fg); }
.messages .error { background: var(--tone-error-bg); color: var(--tone-error-fg); }
.messages .warning, .messages .info { background: var(--tone-warn-bg); color: var(--tone-warn-fg); }

/* 상단 줄 */
.app-bar { display: flex; align-items: center; gap: var(--space-4); padding: 0 var(--space-4); min-height: var(--tap-size-lg);
  background: var(--app-bar-bg); color: var(--app-bar-fg); position: sticky; top: 0; z-index: 10; }
.app-bar a, .app-bar button { color: var(--app-bar-fg); }
.app-bar .brand { font-weight: 700; text-decoration: none; }
.app-bar .spacer { flex: 1; }
.app-bar .bar-title { font-weight: 700; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
.app-bar form { margin: 0; }
.link-btn { background: none; border: 0; font: inherit; text-decoration: underline; cursor: pointer; min-height: var(--tap-size); padding: 0 var(--space-2); }
.bar-link { display: inline-flex; align-items: center; min-height: var(--tap-size); padding: 0 var(--space-2); white-space: nowrap; }

/* ── 업무 화면(공통 틀): 왼쪽 메뉴 + 본문. 좁으면 메뉴가 위로 ── */
.shell { display: flex; max-width: var(--app-max-width); margin: 0 auto; }
.shell-nav { width: var(--app-nav-width); flex: none; padding: var(--space-4); }
.shell-nav h2 { font-size: var(--font-size-app-small); color: var(--ink-quiet); margin: var(--space-4) 0 var(--space-1); }
.shell-nav ul { list-style: none; margin: 0; padding: 0; }
.shell-nav a { display: flex; align-items: center; min-height: var(--tap-size); padding: 0 var(--space-3); border-radius: var(--radius-md);
  text-decoration: none; color: var(--ink); }
.shell-nav a:hover { background: var(--surface-select); }
.shell-main { flex: 1; min-width: 0; padding: var(--space-5) var(--space-4); }
.menu-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: var(--space-3); }
.menu-card { display: flex; flex-direction: column; justify-content: center; min-height: 72px; padding: var(--space-4);
  background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-lg); text-decoration: none; color: var(--ink); font-weight: 600; }
.menu-card small { font-weight: 400; color: var(--ink-quiet); }
@media (max-width: 760px) {
  .shell { flex-direction: column; }
  .shell-nav { width: auto; padding-bottom: 0; }
}

/* ── 현장 화면 ── */
.field-main { max-width: var(--app-max-width); margin: 0 auto; padding: var(--space-4) var(--space-4) calc(var(--tabbar-height) + var(--space-6) + var(--tap-size-lg)); }
.field-sub { color: var(--ink-quiet); margin: 0 0 var(--space-4); }

/* 아래 고정 탭 */
.tabbar { position: fixed; left: 0; right: 0; bottom: 0; z-index: 20; display: flex; height: var(--tabbar-height);
  background: var(--surface); border-top: 1px solid var(--line-strong); box-shadow: 0 -2px 6px var(--app-shadow);
  padding-bottom: env(safe-area-inset-bottom); }
.tabbar a { flex: 1; display: flex; align-items: center; justify-content: center; min-height: var(--tap-size);
  font-size: var(--font-size-app); font-weight: 600; color: var(--ink-quiet); text-decoration: none; border-top: 4px solid transparent; }
.tabbar a[aria-current="page"] { color: var(--accent); border-top-color: var(--accent); }

/* 오늘 할 일 */
.todo { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--space-3); }
.todo a { display: flex; align-items: center; gap: var(--space-4); min-height: var(--tap-size-lg); padding: var(--space-4);
  background: var(--surface); border: 1px solid var(--line); border-left-width: 8px; border-radius: var(--radius-lg); text-decoration: none; color: var(--ink); }
.todo a.tone-ok { border-left-color: var(--tone-ok-text); }
.todo a.tone-warn { border-left-color: var(--tone-warn-text); }
.todo a.tone-error { border-left-color: var(--tone-error-text); }
.todo a.tone-muted { border-left-color: var(--line-strong); }
.todo .todo-label { font-weight: 700; font-size: var(--font-size-app-big); min-width: 7em; }
.todo .todo-detail { flex: 1; color: var(--ink-quiet); }
.todo .chev { font-size: var(--font-size-app-title); color: var(--ink-quiet); }
@media (min-width: 900px) { .todo { grid-template-columns: 1fr 1fr; } }

/* 현장 목록 */
.site-list { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--space-3); }
.site-list a { display: flex; align-items: center; min-height: var(--tap-size-lg); padding: var(--space-4); background: var(--surface);
  border: 1px solid var(--line); border-radius: var(--radius-lg); text-decoration: none; color: var(--ink); font-weight: 700; font-size: var(--font-size-app-big); }

/* 날짜 넘기기 */
.day-nav { display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap; margin-bottom: var(--space-4); }
.day-nav .day-label { font-size: var(--font-size-app-big); font-weight: 700; flex: 1; text-align: center; min-width: 9em; }
.day-nav form { display: flex; gap: var(--space-2); align-items: center; margin: 0; }

/* 출역 체크 목록 */
.att-tools { display: flex; gap: var(--space-3); flex-wrap: wrap; margin-bottom: var(--space-3); align-items: center; }
.att-list { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--space-2); }
.att-row { background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-lg); padding: var(--space-3) var(--space-4); }
.att-row[data-checked="1"] { border-color: var(--accent); }
.att-row[data-locked="1"] { background: var(--surface-alt); }
.att-row[data-warn="1"] { border-color: var(--tone-warn-text); border-width: 2px; }
.att-head { display: flex; align-items: center; gap: var(--space-3); flex-wrap: wrap; }
.att-check { display: flex; align-items: center; gap: var(--space-3); flex: 1; min-width: 12em; min-height: var(--tap-size); cursor: pointer; }
.att-check input { width: 28px; height: 28px; flex: none; }
.att-name { font-weight: 700; font-size: var(--font-size-app-big); }
.att-meta { color: var(--ink-quiet); font-size: var(--font-size-app-small); }
.seg { display: inline-flex; border: 1px solid var(--line-strong); border-radius: var(--radius-lg); overflow: hidden; }
.seg label { display: flex; align-items: center; justify-content: center; min-width: var(--tap-size); min-height: var(--tap-size);
  padding: 0 var(--space-3); cursor: pointer; font-weight: 600; border-left: 1px solid var(--line); }
.seg label:first-child { border-left: 0; }
.seg input { position: absolute; opacity: 0; width: 1px; height: 1px; }
.seg input:checked + span { color: var(--accent-fg); }
.seg label:has(input:checked) { background: var(--accent); color: var(--accent-fg); }
.seg input:focus-visible + span { outline: 3px solid var(--focus-ring); }
.att-row[data-checked="0"] .seg { opacity: .45; }
.att-notes { margin-top: var(--space-2); display: flex; flex-wrap: wrap; gap: var(--space-2); }
.att-warn { margin-top: var(--space-2); padding: var(--space-2) var(--space-3); background: var(--tone-warn-bg); color: var(--tone-warn-fg);
  border-radius: var(--radius-md); }
.att-warn input { width: 100%; margin-top: var(--space-1); }

/* 아래 고정 저장 줄(탭 위) */
.action-bar { position: fixed; left: 0; right: 0; bottom: var(--tabbar-height); z-index: 15; background: var(--surface);
  border-top: 1px solid var(--line); padding: var(--space-2) var(--space-4); }
.action-bar .inner { max-width: var(--app-max-width); margin: 0 auto; display: flex; gap: var(--space-3); align-items: center; }
.action-bar .inner > .btn { flex: 1; }

.panel { background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-lg); padding: var(--space-4); margin-bottom: var(--space-4); }
.empty { padding: var(--space-6); text-align: center; color: var(--ink-quiet); background: var(--surface); border-radius: var(--radius-lg); }

/* 로그인 */
.login-box { max-width: 420px; margin: 10vh auto 0; padding: var(--space-6); background: var(--surface); border-radius: var(--radius-lg);
  border: 1px solid var(--line); }

/* 관리 화면 날짜 칸 달력(AdminDateWidget)이 /app/에서도 읽히게 */
.calendarbox, .clockbox { background: var(--surface); border: 1px solid var(--line-strong); border-radius: var(--radius-md); padding: var(--space-2); z-index: 30; }
.datetimeshortcuts a { display: inline-flex; align-items: center; min-height: var(--tap-size); padding: 0 var(--space-2); }

/* ── 2회차 B: TBM·일지 ── */
.u-hidden { display: none; }
.row-card { border: 1px solid var(--line); border-radius: var(--radius-md); padding: var(--space-3); margin-bottom: var(--space-3); background: var(--surface); }
.row-card p { margin: 0 0 var(--space-2); display: flex; flex-direction: column; gap: var(--space-1); }
.row-card label { font-weight: 600; font-size: var(--font-size-app-small); }
.row-card input[type=text], .row-card select, .row-card textarea { width: 100%; }
.row-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: 0 var(--space-3); }
.row-tools { display: flex; gap: var(--space-3); flex-wrap: wrap; margin-top: var(--space-3); }
.row-tools > .btn { flex: 1; }
.panel h2:first-child { margin-top: 0; }
.chip-list { list-style: none; margin: 0 0 var(--space-3); padding: 0; display: flex; flex-wrap: wrap; gap: var(--space-2); }
.chip { display: inline-flex; align-items: center; min-height: var(--tap-size); padding: 0 var(--space-4); border-radius: var(--radius-pill);
  border: 1px solid var(--line-strong); background: var(--surface); color: var(--ink); text-decoration: none; font-weight: 600; }
.chip-ok { background: var(--tone-ok-bg); color: var(--tone-ok-fg); border-color: var(--tone-ok-text); }
.chip-current { outline: 3px solid var(--accent); }
.check-list { margin: 0 0 var(--space-3); padding-left: var(--space-5); }
.check-list li { display: flex; align-items: center; justify-content: space-between; gap: var(--space-3); flex-wrap: wrap;
  padding: var(--space-2) 0; border-bottom: 1px solid var(--line); }
.check-label { flex: 1; min-width: 12em; }
.mini-table { width: 100%; border-collapse: collapse; }
.mini-table th, .mini-table td { padding: var(--space-2); border-bottom: 1px solid var(--line); text-align: left; }
.mini-table .num { text-align: right; font-variant-numeric: tabular-nums; }
.photo-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: var(--space-3); margin-bottom: var(--space-4); }
.photo-grid figure { margin: 0; }
.photo-grid img { width: 100%; aspect-ratio: 4 / 3; object-fit: cover; border-radius: var(--radius-md); background: var(--surface-alt); }
.photo-grid figcaption { font-size: var(--font-size-app-small); color: var(--ink-quiet); }
.photo-pick { position: relative; }
.photo-pick input { position: absolute; inset: 0; opacity: 0; width: 100%; cursor: pointer; }
/* 서명 받기: 근로자에게 건네는 화면이라 아래 탭을 숨기고 서명 칸을 크게 */
.app:has([data-sign-mode]) .tabbar { display: none; }
.app:has([data-sign-mode]) .field-main { padding-bottom: var(--space-6); }
.sign-box-big { max-width: none; background: var(--surface); }
.sign-box-big .sign-canvas { width: min(100%, 165vh); height: auto; aspect-ratio: 3 / 1; margin: 0 auto; }
/* 휴대폰을 가로로 돌렸을 때(낮은 화면): 안내 문구를 숨기고 서명 칸 + 저장 버튼이 한 화면에 들어오게 */
@media (max-height: 500px) {
  .app:has([data-sign-mode]) .app-bar { position: static; }
  [data-sign-mode] > .field-sub { display: none; }
  .sign-box-big .sign-canvas { width: min(100%, 135vh); }
  .sign-box-big .sign-who { margin-bottom: var(--space-1); }
  .sign-box-big .row-tools { margin-top: var(--space-2); }
}
.sign-box-big button { min-height: var(--tap-size-lg); }
.sign-who { margin: 0 0 var(--space-3); display: flex; gap: var(--space-3); align-items: baseline; flex-wrap: wrap; }
.sign-who .att-name { font-size: var(--font-size-app-title); }
.app [hidden] { display: none !important; }

/* ── 개선·불편 신고(작은 떠 있는 버튼 + 아래에서 올라오는 창) ── */
.feedback-fab { position: fixed; right: var(--space-4); bottom: var(--space-4); z-index: 25; display: inline-flex; align-items: center;
  min-height: var(--tap-size); padding: 0 var(--space-4); border-radius: var(--radius-pill); background: var(--surface);
  color: var(--ink-quiet); border: 1px solid var(--line-strong); box-shadow: 0 2px 6px var(--app-shadow);
  font-size: var(--font-size-app-small); font-weight: 600; text-decoration: none; }
.app a.feedback-fab { color: var(--ink-quiet); }
/* 현장 화면: 아래 탭(과 저장 줄) 위로 */
.app[data-area="field"] .feedback-fab { bottom: calc(var(--tabbar-height) + var(--space-3)); }
.app[data-area="field"]:has(.action-bar) .feedback-fab { bottom: calc(var(--tabbar-height) + var(--action-bar-height) + var(--space-3)); }
.app[data-area="field"]:has(.action-bar) .field-main { padding-bottom: calc(var(--tabbar-height) + var(--action-bar-height) + var(--tap-size) + var(--space-6) * 2); }
.app[data-area="field"] .field-main { padding-bottom: calc(var(--tabbar-height) + var(--tap-size) + var(--space-6) * 2); }
.app:has([data-sign-mode]) .feedback-fab, body.fb-open .feedback-fab { display: none; }
.fb-backdrop { position: fixed; inset: 0; z-index: 60; background: var(--backdrop); display: flex; align-items: flex-end; justify-content: center; }
.fb-sheet { width: 100%; max-width: 640px; max-height: 92vh; overflow-y: auto; background: var(--surface); color: var(--ink);
  border-radius: var(--radius-lg) var(--radius-lg) 0 0; padding: var(--space-4) var(--space-4) calc(var(--space-4) + env(safe-area-inset-bottom));
  animation: fb-up .18s ease-out; }
@keyframes fb-up { from { transform: translateY(40%); opacity: .5; } to { transform: none; opacity: 1; } }
.fb-head { display: flex; align-items: center; justify-content: space-between; gap: var(--space-3); }
.fb-head h2 { margin: 0; }
.fb-kinds { border: 0; margin: var(--space-3) 0; padding: 0; display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-2); }
.fb-kinds legend { font-weight: 600; margin-bottom: var(--space-2); }
.fb-kind { display: flex; align-items: center; justify-content: center; text-align: center; min-height: var(--tap-size-lg);
  padding: var(--space-2); border: 1px solid var(--line-strong); border-radius: var(--radius-lg); font-weight: 700; cursor: pointer; }
.fb-kind input { position: absolute; opacity: 0; width: 1px; height: 1px; }
.fb-kind:has(input:checked) { background: var(--accent); border-color: var(--accent); color: var(--accent-fg); }
.fb-kind:has(input:focus-visible) { outline: 3px solid var(--focus-ring); }
.fb-form p { margin: 0 0 var(--space-3); }
.fb-form input[type=text] { width: 100%; }
.fb-photo { position: relative; }
.fb-photo input { position: absolute; inset: 0; opacity: 0; width: 100%; cursor: pointer; }
.fb-error { color: var(--tone-error-text); font-weight: 700; min-height: 1em; }
.fb-thanks { padding: var(--space-6) 0; text-align: center; font-size: var(--font-size-app-big); font-weight: 700; color: var(--tone-ok-text); }
.fb-foot { text-align: center; margin: var(--space-2) 0 0; }
.fb-foot a { display: inline-flex; align-items: center; min-height: var(--tap-size); }
.fb-notice { padding: var(--space-3) var(--space-4); border-radius: var(--radius-md); background: var(--tone-ok-bg); color: var(--tone-ok-fg); }
.fb-item p { margin: 0 0 var(--space-1); }
.fb-notice p { margin: 0; }
.fb-notice .fb-reply { margin-top: var(--space-2); }
.fb-reply { padding: var(--space-2) var(--space-3); border-left: 4px solid var(--tone-ok-text); background: var(--surface-alt); border-radius: var(--radius-sm); }

/* 신고 입구: 내 신고 머리의 '새 신고', 현장 홈 맨 아래 한 줄 링크 */
.fb-mine-head { display: flex; align-items: center; justify-content: space-between; gap: var(--space-3); flex-wrap: wrap; }
.fb-mine-head .btn { min-height: var(--tap-size); display: inline-flex; align-items: center; }
.field-foot-link { margin: var(--space-6) 0 0; text-align: center; }
.field-foot-link a { display: inline-flex; align-items: center; min-height: var(--tap-size); color: var(--ink-quiet); }

/* 이름 표기: CMS(굵게) + 건설관리시스템, 넓은 화면에서만 영문 */
.brand-name { font-weight: 700; }
.brand-sub { font-weight: 400; margin-left: var(--space-1); }
.brand-en { display: none; font-weight: 400; font-size: var(--font-size-small); opacity: .8; margin-left: var(--space-2); }
@media (min-width: 900px) { .brand-en { display: inline; } }
.login-brand { text-align: center; margin: 0 0 var(--space-4); }
.login-brand .brand-line { font-size: var(--font-size-app-big); margin: 0; }
.login-brand .brand-en { display: block; margin: var(--space-1) 0 0; }
.login-brand h1 { font-size: 1.1em; margin: var(--space-3) 0 0; }
.app-bar .brand, .app-bar .link-btn { white-space: nowrap; }
.app-bar .bar-user { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
@media (max-width: 479px) { .app-bar .bar-user { display: none; } }
