/* Visual polish layer (2026-09-17 UI audit). v9.css stays byte-identical; live.css keeps behavior rules.
   Numbers in comments (G1, G3 …) refer to docs/design-review/2026-09-17-UI-AUDIT.md. */

/* G12 — Pretendard is served by this server so staff PCs and tablets match the office PC.
   PCs that already have Pretendard installed use the local copy and never download the file. */
@font-face {
  font-family: "Pretendard Web";
  font-weight: 45 920;
  font-style: normal;
  font-display: swap;
  src: url("/v2/public/PretendardVariable.woff2") format("woff2-variations"), url("/v2/public/PretendardVariable.woff2") format("woff2");
}
:root {
  --sans: "Pretendard","Pretendard Web","Pretendard Variable","IBM Plex Sans KR","Malgun Gothic","Apple SD Gothic Neo",sans-serif;
  /* IBM Plex Mono has no Korean glyphs; Korean inside code cells falls back to the body font, not a system monospace. */
  --mono: "IBM Plex Mono","Consolas","Pretendard","Pretendard Web","Malgun Gothic",monospace;
  --control-h: 36px;
  --control-h-dense: 30px;
  --stack-gap: 12px;
}
/* Touch screens (shop-floor tablets) keep the 44px targets everywhere instead of only in some forms. */
@media (pointer: coarse) { :root { --control-h: 44px; --control-h-dense: 38px; } }

/* G1 — numbers use the body font with aligned digits; headings and hints never switch font. */
td.num, th.num, .num { font-family: var(--sans); font-variant-numeric: tabular-nums; }
.calc, .calcbox .out { font-family: var(--sans); font-variant-numeric: tabular-nums; font-size: 13px; line-height: 1.6; }
td.code { font-size: 12.5px; }

/* G3 / P1 — one control height for ordinary forms, one for dense paper-style sheets. */
/* :where() keeps this at element-level specificity so the dense rules below can override it. */
input:where(:not([type="checkbox"]):not([type="radio"]):not([type="file"]):not([type="range"])), select {
  height: var(--control-h); min-height: 0; padding: 0 10px; border-radius: 5px; line-height: normal;
}
textarea { padding: 8px 10px; border-radius: 5px; border-color: var(--control-border); line-height: 1.5; }
.sheet .c input:not([type="checkbox"]), .sheet .c select, .sheet td input:not([type="checkbox"]), .sheet td select,
.colors input, .mini input:not([type="checkbox"]), .mini select, .outgrid input,
.wrow input:not([type="checkbox"]), .wrow select, .wrow .outgrid input, .wrow .tt input {
  height: var(--control-h-dense); min-height: 0; padding: 0 8px;
}
.colors input { padding: 0 2px; }
.route-step select, .route-step button, .route-save { height: var(--control-h); min-height: 0; }
.route-step button { min-width: var(--control-h); }
.field-mode button, .field-mode select, .field-mode input:not([type="checkbox"]) { min-height: var(--control-h); }

/* "지금" sits beside a time field and takes that field's height. */
.tm { align-items: stretch; }
.now { display: inline-flex; align-items: center; padding: 0 10px; font-size: 12px; font-weight: 500; border-radius: 5px; }
.wrow .now { height: auto; }

/* G7 — three button sizes only: compact (tables, inline), regular, and regular-primary. */
.btn { display: inline-flex; align-items: center; justify-content: center; gap: 6px; min-height: var(--control-h); padding: 0 14px; line-height: 1.2; white-space: nowrap; }
.btn.small { min-height: var(--control-h-dense); padding: 0 11px; font-size: 12.5px; }
.btn:hover:not(:disabled) { border-color: var(--accent); }
.btn.primary:hover:not(:disabled) { filter: brightness(.95); }
.query .btn, .query .btn.small { min-height: var(--control-h); font-size: 13px; }
/* Buttons placed straight into a vertical group used to stretch across the whole card. */
.group > .btn, .panel > .btn, form > .btn, .card > .btn { align-self: flex-start; }
.card > .btn { margin: 0 16px 14px; }
/* Removal is quiet until hovered so it cannot be mistaken for "add". */
.btn[data-action*="remove"], .btn[data-route-remove] { color: var(--bad); border-color: transparent; background: transparent; }
.btn[data-action*="remove"]:hover:not(:disabled), .btn[data-route-remove]:hover:not(:disabled) { background: var(--bad-soft); border-color: transparent; }
.group > .btn[data-action*="remove"] { align-self: flex-end; }
td > .btn + .btn, td > .btn + details, .actions > .btn { margin: 0; }
td > .btn + .btn { margin-left: 6px; }

/* G5 — cards inside a screen keep the same rhythm as the screen itself. */
section[data-panel] { display: flex; flex-direction: column; gap: var(--stack-gap); min-width: 0; }
section[data-panel] > * { min-width: 0; }

/* G6 — content placed directly in a card gets the card's inner margin. */
.card > p.hint, .card > .hint { margin: 0; padding: 12px 16px 0; }
.card > p.hint + .tbl, .card > .hint + .tbl { margin-top: 10px; }
.card > form > .grid, .card > form > .actions, .card > .grid, .card > .actions { padding: 14px 16px; }
.card > form > .grid + .actions, .card > .grid + .actions { padding-top: 0; }
.panel > .actions, .panel > form > .actions, .grid + .actions { margin-top: 2px; }
.app-tabs-panel > .calc + .grid, .app-tabs-panel > .tbl + .calc { margin-top: 4px; }
.group > p.hint, .panel > p.hint { margin: 0; }
.f { gap: 4px; }
.f .l { font-size: 12px; letter-spacing: 0; }
.grid { gap: 12px 16px; }

/* Repeating line blocks (order items, purchase materials) read as separate cards. */
.panel[data-order-line], .panel[data-purchase-line] {
  border: 1px solid var(--line); border-radius: 8px; background: var(--surface-2); padding: 14px;
}
[data-lines] { display: flex; flex-direction: column; gap: 10px; }
.panel[data-purchase-line] + .panel[data-purchase-line] { margin-top: 10px; }

/* G8 — numeric and action columns hug their content; text columns take the remaining width. */
th, td { vertical-align: middle; padding: 8px 12px; }
th { font-size: 12px; letter-spacing: 0; }
th.num, td.num { width: 1%; white-space: nowrap; padding-left: 20px; }
td:has(> .btn), td:has(> .actions) { width: 1%; white-space: nowrap; text-align: right; }
td.code { width: 1%; }
tbody tr:last-child > td { border-bottom: 0; }
.card > .tbl > table th:first-child, .card > .tbl > table td:first-child,
.card > div > .tbl > table th:first-child, .card > div > .tbl > table td:first-child,
.card > section > .tbl > table th:first-child, .card > section > .tbl > table td:first-child { padding-left: 16px; }

/* G4 — a missing value is quiet, not bold. */
.f .v.empty { color: var(--muted); font-weight: 400; opacity: .7; }

/* G14 — empty tables stay compact. */
td > .hint[style] { padding: 10px 4px !important; }

/* Search overlay lists sit clearly above the form below them (P7). */
.srch-list { border-radius: 0 0 6px 6px; box-shadow: 0 10px 28px rgba(20,30,25,.16); z-index: 20; max-height: 320px; overflow: auto; }
.srch-list button:last-child:not(:first-child) { border-top: 1px solid var(--line); color: var(--accent-soft-ink); font-weight: 600; }

/* Dialog bodies follow the same spacing; the page behind does not scroll (G13). */
html:has(dialog[open]) { overflow: hidden; }
.modal .mb { gap: 12px; }
.modal .x { min-height: 0; width: 32px; height: 32px; padding: 0; }

/* Paper-style sheets: a time field and its "지금" button share one narrow cell. */
.sheet .tm { display: flex; gap: 4px; min-width: 0; }
.sheet .tm input { flex: 1 1 0; min-width: 0; width: auto; padding: 0 4px; }
/* 2026-09-21 사용자: 근무 시작·종료의 시각("오전 08:00")이 잘려 보임 → 시간 칸은 값이 다 보이는 너비를 갖고, 일지 머리 칸을 그만큼 넓힌다. */
.sheet .tm input[type="time"] { min-width: 112px; }
[data-print-editor] form > .sheet > .row2, [data-conv-editor] form > .sheet > .row2 { grid-template-columns: repeat(auto-fit, minmax(184px, 1fr)); }
.sheet .now { padding: 0 7px; flex: none; }

/* ── Production log (bundle 5). The paper-form structure stays; only alignment and narrow screens change. ── */
/* S20 — free-text notes take the full row instead of wrapping as a lone narrow cell. */
[data-print-editor] form > .sheet > .ttl:first-child + .row2 > .c:last-child { grid-column: 1 / -1; }
[data-print-editor] [data-product-block] .row2 { grid-template-columns: repeat(auto-fit, minmax(130px, 1fr)); }
.sheet .row2 .c { padding: 8px 10px; display: flex; flex-direction: column; gap: 3px; }
.sheet .c .l { font-size: 12px; }
.sheet .c .v { min-height: var(--control-h-dense); display: flex; align-items: center; }
/* The unit follows the quantity: "[ 1,200 ] m". */
[data-print-editor] .outgrid label { flex-direction: row-reverse; gap: 4px; font-size: 12px; }
.stages5 { grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); }

@media (max-width: 700px) {
  /* M2 — ten colour stations fold into two rows of five so each box stays typeable. */
  .colors { grid-template-columns: 58px repeat(5, minmax(0, 1fr)); }
  .colors > div:nth-child(11n+1) { grid-column: 1; }
  .colors > div:nth-child(11n+2), .colors > div:nth-child(11n+7) { grid-column: 2; }
  .colors > div:nth-child(11n+3), .colors > div:nth-child(11n+8) { grid-column: 3; }
  .colors > div:nth-child(11n+4), .colors > div:nth-child(11n+9) { grid-column: 4; }
  .colors > div:nth-child(11n+5), .colors > div:nth-child(11n+10) { grid-column: 5; }
  .colors > div:nth-child(11n+6), .colors > div:nth-child(11n) { grid-column: 6; }
  .colors > div:nth-child(-n+11) { grid-row: 1; }
  .colors > div:nth-child(n+12):nth-child(-n+22) { grid-row: 2; }
  .colors > div:nth-child(n+23) { grid-row: 3; }
  .colors > div:nth-child(-n+11):is(:nth-child(11n+7), :nth-child(11n+8), :nth-child(11n+9), :nth-child(11n+10), :nth-child(11n)) { grid-row: 4; }
  .colors > div:nth-child(n+12):nth-child(-n+22):is(:nth-child(11n+7), :nth-child(11n+8), :nth-child(11n+9), :nth-child(11n+10), :nth-child(11n)) { grid-row: 5; }
  .colors > div:nth-child(n+23):is(:nth-child(11n+7), :nth-child(11n+8), :nth-child(11n+9), :nth-child(11n+10), :nth-child(11n)) { grid-row: 6; }
  .colors > div:nth-child(11n+1) { grid-row-end: span 1; }
  /* M3 — wide lists scroll sideways instead of breaking words letter by letter. */
  .tbl > table:not(.mini) { min-width: 640px; }
  .tbl > table:not(.mini) td, .tbl > table:not(.mini) th { white-space: nowrap; }
}

/* S21 — the conversion log's worker fields sit in the same padded cells as the rest of the header. */
.sheet .row2 .conversion-workers > .f { padding: 8px 10px; border-right: 1px solid var(--line); gap: 3px; min-width: 0; }
.sheet .row2 .conversion-workers > .f .l { font-size: 12px; color: var(--muted); }
[data-conv-editor] .wrow .l1, [data-conv-editor] .wrow .l2 { align-items: start; }
[data-conv-editor] .wrow .l1 > .f:first-child .v { min-height: var(--control-h-dense); font-weight: 700; }
[data-conv-editor] .outgrid label { flex-direction: row-reverse; justify-content: flex-end; gap: 4px; font-size: 12px; }
[data-conv-editor] .outgrid label:has(select) { flex-direction: row; }
/* S22 — weekly confirmation is its own block under the approval list. */
form[data-weekly] { display: flex; flex-direction: column; gap: 10px; padding: 14px; border: 1px solid var(--line); border-radius: 8px; background: var(--surface-2); }
form[data-weekly] > .btn { align-self: flex-start; }

/* ── Input screens (bundle 4) ── */
/* S5/S15 — repeated blocks are numbered so two items never blur into one. */
[data-lines] { counter-reset: order-line; }
.panel[data-order-line]::before { counter-increment: order-line; content: "품목 " counter(order-line); font-weight: 600; font-size: 13px; color: var(--accent-soft-ink); }
[data-purchase-lines] { counter-reset: purchase-line; display: flex; flex-direction: column; gap: 10px; }
.panel[data-purchase-line] + .panel[data-purchase-line] { margin-top: 0; }
.panel[data-purchase-line]::before { counter-increment: purchase-line; content: "원단 " counter(purchase-line); font-weight: 600; font-size: 13px; color: var(--accent-soft-ink); }
/* S6 — a process step is a normal-width choice, not a full-width bar. */
.route-step > .f { flex: 0 1 360px; }
.order-route { margin: 4px 0; padding: 14px; border-color: var(--line); border-radius: 8px; background: var(--surface); }
/* S7 — winding request fields appear only when the item ships as rolls. */
.grid:not(:has(select[name^="dispatch"] option[value="roll"]:checked)) > .f:has([name^="winding_"]) { display: none; }
.panel[data-order-line]:not(:has(select[name="dispatch_form"] option[value="roll"]:checked)) > [data-winding-preview] { display: none; }
/* S15 — pick a source and load it on one line. */
.pick-row { display: flex; gap: 8px; align-items: flex-end; }
.pick-row > .f { flex: 1 1 auto; min-width: 0; }
.pick-row > .btn { min-height: var(--control-h); flex: none; }
/* S16 — a checkbox field lines up with the text fields beside it. */
.check-line { display: flex; align-items: center; gap: 8px; min-height: var(--control-h); font-size: 14px; }
.check-line input { margin: 0; width: 18px; height: 18px; }
form[data-receipt] { margin-bottom: 8px; }
.list-sec { margin-top: 8px; }
/* S18 — nothing to fill in until a job is chosen. */
[data-panel="wo"] .split:not(:has([data-work-list] li.on)) [data-assignment],
[data-panel="wo"] .split:not(:has([data-work-list] li.on)) [data-assignment] ~ details { display: none; }
[data-panel="wo"] .split:not(:has([data-work-list] li.on)) .card > .panel.group::before { content: "왼쪽 목록에서 작업을 고르면 설비·예정일·작업자를 지정할 수 있습니다."; color: var(--muted); font-size: 13px; }
.split > .card > .hint:empty { display: none; }
.split > .card > p.hint { padding-bottom: 0; }
[data-work-list] li { align-items: center; }
/* S19 / G10 — file pickers look like the rest of the app. */
input[type="file"] { height: auto; min-height: var(--control-h); padding: 4px; border: 1px dashed var(--control-border); border-radius: 5px; background: var(--surface-2); font-size: 13px; color: var(--muted); width: 100%; }
input[type="file"]::file-selector-button { font: inherit; font-size: 12.5px; font-weight: 500; height: 28px; margin-right: 10px; padding: 0 12px; border: 1px solid var(--line-strong); border-radius: 5px; background: var(--surface); color: var(--ink); cursor: pointer; }
input[type="file"]::file-selector-button:hover { border-color: var(--accent); }
form > textarea + .f, form > .f + .f, .group > .f + .f, form > .f + .actions, form > textarea + .actions { margin-top: 10px; }
form[data-assignment] { display: flex; flex-direction: column; gap: 12px; }
form[data-assignment] > * { margin-top: 0 !important; }
/* S24 — shipment: one flow from plan → LOT → ship. */
[data-panel="shipout"] .card > form > .actions { padding-top: 4px; }
[data-panel="shipout"] .card > form + .tbl, [data-panel="shipout"] .card > .tbl { border-top: 1px solid var(--line); }
/* S25 — a save button never touches the fields above it. */
.panel > form > .grid + .btn, .panel > form > .grid + button, form > .grid + button[type="submit"] { margin-top: 12px; }

/* ── Menu, top bar and login (bundle 3) ── */
/* G9 — each menu group has a plain line icon; the colour follows the text. */
.nav .i { width: 20px; height: 20px; border-radius: 0; background: var(--muted); -webkit-mask: var(--icon) center / 20px 20px no-repeat; mask: var(--icon) center / 20px 20px no-repeat; }
.nav > button:hover .i { background: var(--ink); }
.nav > button.open .i { background: var(--accent); }
.nav > button[data-menu="home"] .i { --icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 11l9-7 9 7v9a1 1 0 0 1-1 1h-5v-6H9v6H4a1 1 0 0 1-1-1z'/%3E%3C/svg%3E"); }
.nav > button[data-menu="order"] .i { --icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 3h9l4 4v14H6z M14 3v5h5 M9 12h7 M9 16h7'/%3E%3C/svg%3E"); }
.nav > button[data-menu="master"] .i { --icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3l9 5-9 5-9-5z M3 12l9 5 9-5 M3 16l9 5 9-5'/%3E%3C/svg%3E"); }
.nav > button[data-menu="mat"] .i { --icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 5a7 7 0 1 0 0 14 7 7 0 0 0 0-14z M9 10a2 2 0 1 0 0 4 2 2 0 0 0 0-4z M9 19h12 M21 19v-5'/%3E%3C/svg%3E"); }
.nav > button[data-menu="prod"] .i { --icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 21V10l6 4v-4l6 4V4h6v17z M8 17h2 M13 17h2'/%3E%3C/svg%3E"); }
.nav > button[data-menu="fin"] .i { --icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 8l9-5 9 5v8l-9 5-9-5z M3 8l9 5 9-5 M12 13v8'/%3E%3C/svg%3E"); }
.nav > button[data-menu="ship"] .i { --icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M2 6h11v10H2z M13 9h5l3 4v3h-8z M6.5 16a2 2 0 1 0 0 4 2 2 0 0 0 0-4z M17 16a2 2 0 1 0 0 4 2 2 0 0 0 0-4z'/%3E%3C/svg%3E"); }
.nav > button[data-menu="admin"] .i { --icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 6h10 M18 6h2 M4 12h4 M12 12h8 M4 18h12 M16 4v4 M10 10v4 M18 16v4'/%3E%3C/svg%3E"); }
.nav > button { gap: 10px; padding: 9px 10px; font-weight: 500; }
.sub { margin-left: 19px; }
/* The supplied logo keeps its mark but takes half the height. */
.brand { padding: 0 0 12px; }
.brand-lockup { gap: 6px; }
/* contain + the logo's own green (#1b5924) so the mark and wordmark are never cropped at any drawer width. */
.brand-logo { height: 76px; object-fit: contain; background: #1b5924; border-radius: 8px; }
.brand-name { font-size: 14px; }
/* 2026-09-29: 넓은 화면은 메뉴 맨 위 [« 메뉴 접기](.menu-close)가 메뉴를 아이콘 줄로 접는다. 위쪽 [메뉴] 버튼은 좁은 화면 서랍용. */
@media (min-width: 1101px) { .menu-toggle { display: none; } }
.menu-toggle { min-height: var(--control-h); min-width: 0; }
.role { margin-top: 14px; border-style: solid; border-color: var(--line); background: var(--surface-2); }
/* The screen name is the page title: small group name above, large screen name below. */
.top { align-items: center; gap: 14px; flex-wrap: nowrap; }
.crumb { margin-right: auto; font-size: 0; line-height: 1.25; min-width: 0; }
.crumb #crumb-top { display: block; font-size: 12px; color: var(--muted); }
.crumb #crumb-top::after { content: " ›"; }
.crumb b { display: block; font-size: 20px; font-weight: 700; color: var(--ink); letter-spacing: -.01em; }
.acct { display: flex; align-items: center; gap: 8px; white-space: nowrap; }
@media (max-width: 700px) { .crumb b { font-size: 17px; } .top .acct { font-size: 11px; } }
/* Login card */
.login-card .login-logo { display: block; width: 100%; height: 96px; object-fit: contain; background: #1b5924; border-radius: 8px; margin-bottom: 18px; }
.login-card > p.hint { padding: 0; margin: 0 0 6px; }
.login-card h1 { margin: 0 0 6px; }
.login-card { padding-bottom: 20px !important; }

/* ── Read-only screens (bundle 6) ── */
/* S1 — a tile with something to do stands out; an empty one steps back. */
.kpi { padding: 14px 16px; gap: 4px; border-radius: 10px; }
.kpi .l { font-size: 13px; }
.kpi .n { font-size: 28px; font-weight: 700; }
.kpi.zero .n { color: var(--muted); opacity: .55; font-weight: 600; }
.kpi.has { border-color: var(--accent); background: var(--accent-soft); }
.kpi.has .l { color: var(--accent-soft-ink); font-weight: 600; }
.kpi.has .n { color: var(--accent-soft-ink); }
.kpis { grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); }
@media (max-width: 1000px) { .kpis { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
@media (max-width: 520px) { .kpis { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
/* S2 — "do now" comes first; idle machines are quiet so busy ones can be seen. */
[data-panel="today"] > .group > .group { display: flex; flex-direction: column; gap: var(--stack-gap); }
[data-panel="today"] > .group > .group > .card:last-child { order: -1; }
td .zero { color: var(--muted); opacity: .5; }
tr:has(> td .zero):not(:has(> td.num:not(:has(.zero)))) > td:first-child { color: var(--muted); }
[data-home-work-kind] > h3 { border-bottom: 0; padding: 12px 16px 6px; text-transform: none; font-size: 13px; color: var(--ink); }
[data-home-work-kind] table { max-width: 760px; }
/* S4 — the ten-step track is readable, and an opened row is a compact summary. */
.track { gap: 3px; min-width: 420px; }
.track i { height: 24px; line-height: 24px; font-size: 12px; font-weight: 500; border-radius: 4px; }
.track i.full { font-weight: 600; }
/* Local spreadsheet review reuses the progress page; it never acts as a live order. */
.preview-notice { border: 1px solid #b8c9df; border-left: 4px solid #49698e; background: #f1f5fa; border-radius: 6px; padding: 12px 16px; margin: 0 0 14px; color: #253a53; }
.preview-notice p { margin: 5px 0 0; font-size: 13px; }
.preview-kpis { margin-bottom: 14px; }
.preview-kpis .kpi { cursor: default; }
.preview-query input { min-width: 240px; }
.preview-scroll { max-height: 62vh; overflow: auto; }
.preview-scroll table { min-width: 1160px; width: 100%; }
.preview-scroll thead th { position: sticky; top: 0; z-index: 1; background: #f2f5f8; }
.preview-scroll td { vertical-align: middle; }
.preview-scroll td:nth-child(2) { min-width: 230px; max-width: 330px; white-space: normal; }
.preview-scroll td:nth-child(4) { min-width: 130px; }
.preview-product { display: block; padding: 0; border: 0; background: none; color: #294f79; font: inherit; font-weight: 600; text-align: left; cursor: pointer; line-height: 1.5; }
.preview-product:hover { text-decoration: underline; }
.preview-product:focus-visible { outline: 2px solid #294f79; outline-offset: 3px; }
.preview-status { white-space: nowrap; font-weight: 600; }
.preview-track { min-width: 300px; grid-template-columns: repeat(6,1fr); }
.preview-track i { font-style: normal; white-space: nowrap; }
.preview-issues { min-width: 170px; max-width: 230px; white-space: normal; font-size: 12px; }
.preview-detail-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }
.preview-detail-grid td { white-space: normal; overflow-wrap: anywhere; }
@media(max-width: 780px) { .preview-detail-grid { grid-template-columns: 1fr; } .preview-query input { min-width: 160px; } }
.query > .hint, .query > p.hint { align-self: center; margin: 0; padding-top: 16px; }
tr.expand .app-tabs-panel > .tbl > table { width: auto; min-width: 420px; }
tr.expand .app-tabs-panel > .tbl > table th, tr.expand .app-tabs-panel > .tbl > table td { padding-right: 32px; }
/* S9 — master lists keep their own height and scroll inside. */
.split { align-items: start; }
.split > .card:first-child { position: sticky; top: 12px; max-height: calc(100vh - 140px); display: flex; flex-direction: column; }
.split > .card:first-child > .list { overflow: auto; flex: 1; }
.list li { padding: 10px 12px; border-radius: 6px; }
.list li.on { box-shadow: inset 3px 0 0 var(--accent); }
/* S10 — detail values line up in four steady columns; section titles are legible. */
[data-detail] .grid { grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 14px 20px; }
@media (max-width: 1000px) { [data-detail] .grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
.sec { font-size: 14px; margin: 6px 0 10px; }
.f .v { font-size: 14.5px; font-weight: 600; }
.dhead h2 { font-size: 20px; }
/* S26 — today is marked in the weekly dispatch board. */
.weektbl th.today { color: var(--accent-soft-ink); box-shadow: inset 0 -3px 0 var(--accent); }
.weektbl td.today { background: var(--accent-soft); }
.weektbl td { color: var(--muted); }
.weektbl .chip { color: var(--ink); background: var(--surface); border: 1px solid var(--line); border-left: 3px solid var(--accent); border-radius: 6px; padding: 6px 8px; margin-bottom: 6px; font-size: 12.5px; }
/* S27 — change history: the before/after payload is secondary. */
details > pre { max-height: 320px; overflow: auto; font-size: 12px; background: var(--code-bg); padding: 10px; border-radius: 6px; }
details > summary { cursor: pointer; }
td.code summary, td.code .btn { font-family: var(--sans); }

/* ── Input method (bundle 7) ── */
/* S11 — contacts and delivery addresses are typed into boxes, one row per entry. */
.grid > .f:has(> textarea[hidden]) { grid-column: 1 / -1; margin-bottom: -6px; }
.grid > .row-editor { grid-column: 1 / -1; }
.row-editor { display: flex; flex-direction: column; gap: 6px; }
.row-editor > [data-rows] { display: flex; flex-direction: column; gap: 6px; }
.row-editor-head, .row-editor-row { display: grid; grid-template-columns: repeat(var(--cols, 4), minmax(0, 1fr)) 52px; gap: 8px; align-items: center; }
.row-editor-head { font-size: 12px; color: var(--muted); padding: 0 2px; }
.row-editor:has(.row-editor-row > input:nth-of-type(2):last-of-type) { --cols: 2; }
.row-editor:has(.row-editor-row > input:nth-of-type(3):last-of-type) { --cols: 3; }
.row-editor:has(.row-editor-row > input:nth-of-type(3):last-of-type) .row-editor-head,
.row-editor:has(.row-editor-row > input:nth-of-type(3):last-of-type) .row-editor-row { grid-template-columns: minmax(0, .8fr) minmax(0, 2fr) minmax(0, .7fr) 52px; }
.row-editor-row > input { width: 100%; min-width: 0; }
.row-editor-row > input::placeholder { color: transparent; }
.row-editor-row > [data-remove] { color: var(--bad); border-color: transparent; background: transparent; padding: 0; }
.row-editor-row > [data-remove]:hover { background: var(--bad-soft); }
.row-editor > [data-add] { align-self: flex-start; }
@media (max-width: 700px) {
  .row-editor-head { display: none; }
  .row-editor-row, .row-editor:has(.row-editor-row > input:nth-of-type(3):last-of-type) .row-editor-row { grid-template-columns: 1fr 1fr; padding: 8px; border: 1px solid var(--line); border-radius: 6px; }
  .row-editor-row > input::placeholder { color: var(--control-placeholder); }
}
/* P5 — required fields are marked before saving, and a missed one turns red with a reason. */
.f:has(:required) > .l::after, label:has(> :required) > .l::after { content: " *"; color: var(--bad); font-weight: 700; }
input:user-invalid, select:user-invalid, textarea:user-invalid { border-color: var(--bad) !important; background: var(--bad-soft); }
.f:has(:user-invalid) > .l { color: var(--bad); }
.f:has(:user-invalid) > .l::after { content: " * 입력이 필요합니다"; font-weight: 600; }

/* ── Staff feedback 2026-09-17: squeezed table columns and header/field alignment ── */
/* A table column is never narrower than its longest word. (body uses overflow-wrap:anywhere, which let
   columns collapse to one character and stack "인/쇄" vertically when a neighbour was wide.) */
th, td { overflow-wrap: break-word; }
.nowrap { white-space: nowrap; }
/* A list of LOT codes wraps between codes, never inside one, and gives the other columns their room. */
td.code:has(> .nowrap + .nowrap) { white-space: normal; width: auto; line-height: 1.7; }
td:has(> details) { width: auto; white-space: normal; }
td > details[open] { min-width: 420px; }
td > details .tbl { overflow: visible; }
td > details table { margin-top: 6px; }
/* Roll table: every heading starts exactly where its field starts, and fields fill their column. */
/* Buttons sharing a row share a height. */
.actions:has(> .btn:not(.small)) > .btn.small { min-height: var(--control-h); font-size: 13px; }
.weektbl td { min-width: 104px; }
.sheet .row2 .f input:not([type="checkbox"]), .sheet .row2 .f select { height: var(--control-h-dense); padding: 0 8px; }
/* Finished stock: opening a LOT list must not crush the product and status columns. */
[data-panel="finstock"] td:first-child { min-width: 220px; }
[data-panel="finstock"] td:nth-child(8) { min-width: 120px; }
td > details table td, td > details table th { font-family: var(--sans); font-size: 12.5px; }

/* ── Remaining small items (2026-09-17) ── */
/* P2 — an empty hint line leaves no gap in a dialog. */
p.hint:empty, .hint:empty { display: none; }
/* P3 — in long dialogs each section starts with a clear band, so it is obvious which block a field belongs to. */
.modal .mb > .sec { margin: 6px 0 0; padding: 8px 12px; border-radius: 6px; background: var(--surface-2); border: 1px solid var(--line); font-size: 13.5px; }
.modal .mb > .sec::after { display: none; }
/* Identifier values in detail panels stay on one line and scroll inside their box rather than breaking at hyphens. */
.f .v:not(.empty) { overflow-wrap: break-word; }
/* Plate/design readiness in the case hub reads as a status, not a warning, when no work is needed. */

/* Links styled as buttons (PDF, 발주서 PDF) look like the buttons beside them, not like blue hyperlinks. */
a.btn, a.btn:visited { color: var(--ink); text-decoration: none; }
a.btn.primary, a.btn.primary:visited { color: var(--accent-ink); }

/* ── Supplies (box / misc) and outsourcing prototype ── */
.kind-switch { display: inline-flex; gap: 0; align-self: flex-start; border: 1px solid var(--line-strong); border-radius: 8px; overflow: hidden; background: var(--surface); }
.kind-switch .btn { border: 0; border-radius: 0; min-width: 104px; font-weight: 600; color: var(--muted); }
.kind-switch .btn + .btn { border-left: 1px solid var(--line-strong); }
.kind-switch .btn.primary { color: var(--accent-ink); }
[data-kind-body] { display: flex; flex-direction: column; gap: var(--stack-gap); min-width: 0; }
.panel[data-supply-line] { border: 1px solid var(--line); border-radius: 8px; background: var(--surface-2); padding: 14px; }
[data-supply-lines] { counter-reset: supply-line; display: flex; flex-direction: column; gap: 10px; }
.panel[data-supply-line]::before { counter-increment: supply-line; content: "품목 " counter(supply-line); font-weight: 600; font-size: 13px; color: var(--accent-soft-ink); }
.modal .mb > .grid[data-receive-line] { padding: 10px 12px; border: 1px solid var(--line); border-radius: 8px; background: var(--surface-2); }
.pform .pf-items td.num { text-align: right; }
.document-actions { display: flex; gap: 8px; align-items: center; }

/* 외주 의뢰: LOT 고르기 표는 입력 폭에 맞춰 좁게, 체크 열은 가운데. */
.lot-pick { max-width: 720px; }
.lot-pick th:first-child, .lot-pick td:first-child { width: 64px; text-align: center; }
.lot-pick td input[type="number"] { width: 100%; max-width: 200px; }

/* 입고 팝업: 방금 저장한 결과를 알리는 한 줄. */
.ok-note { margin: 0 0 12px; padding: 10px 12px; border-radius: 8px; background: var(--accent-soft, #e6f4ea); color: var(--accent-soft-ink, #1b5924); font-weight: 600; font-size: 13px; }

/* 표 안의 이름을 눌러 상세 팝업을 여는 버튼: 링크처럼 보이되 줄 높이를 바꾸지 않는다. */
.link-btn { background: none; border: 0; padding: 0; font: inherit; color: var(--accent-soft-ink, #166b44); text-decoration: underline; text-underline-offset: 3px; cursor: pointer; text-align: left; }
.link-btn:hover { color: var(--accent, #1e8e5a); }

/* 팝업 본문은 세로 flex라서, overflow:auto인 표 상자(.tbl)가 최대 높이에 맞춰 찌그러져 머리글만 남던 문제. 본문 자식은 줄어들지 않고 본문 전체가 스크롤된다. */
.modal .mb > * { flex-shrink: 0; }

/* 변경 이력: 항목별 이전 → 이후. 원본 JSON은 관리자용 접힘 안에만. */
.audit-diff { width: auto; margin: 0; font-size: 12.5px; }
.audit-diff th { text-align: left; padding: 2px 10px 2px 0; font-weight: 600; color: var(--muted); white-space: nowrap; background: none; border: 0; }
.audit-diff td { padding: 2px 0; border: 0; }
.audit-diff .before { color: var(--muted); text-decoration: line-through; }
.raw-audit { margin-top: 6px; }
.raw-audit summary { font-size: 12px; color: var(--muted); }

/* 납품 스케줄: 월간 캘린더. 오늘은 초록 테두리, 다른 달은 흐리게, 계획 칩은 출하 상태에 따라. */
.month-nav { display: inline-flex; align-items: center; gap: 8px; }
.month-nav b { min-width: 110px; text-align: center; font-size: 16px; }
.calendar { table-layout: fixed; min-width: 900px; }
.calendar th { text-align: center; }
.calendar th:nth-child(6) { color: #1d5fb0; } .calendar th:nth-child(7) { color: #c0392b; }
.calendar td { vertical-align: top; height: 150px; padding: 6px; }
.calendar td.other { background: var(--surface-2); color: var(--muted); }
.calendar td.today { box-shadow: inset 0 0 0 2px var(--accent); }
.calendar .dnum { font-weight: 700; margin-bottom: 4px; }
.calendar .dnum .cnt { font-weight: 600; font-size: 11px; color: var(--accent-soft-ink); background: var(--accent-soft); border-radius: 10px; padding: 0 6px; }
.calendar .chip { display: block; color: var(--ink); background: var(--surface); border: 1px solid var(--line); border-left: 3px solid var(--accent); border-radius: 6px; padding: 4px 6px; margin: 3px 0; font-size: 12.5px; line-height: 1.35; }
.calendar .chip .line { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.calendar .chip.part { border-left-color: #d9a400; }
.calendar .chip.done { opacity: .55; border-left-color: var(--line-strong); text-decoration: line-through; }
/* 인쇄 양식 */
.schedule-document h1 { font-size: 20px; margin: 0 0 10px; }
.schedule-document .schedule-lane { margin: 10px 0 16px; break-inside: avoid; }
.schedule-document .schedule-lane > h2 { font-size: 18px; border-bottom: 2px solid currentColor; margin: 0 0 6px; }
.schedule-document .week-grid { display: grid; grid-template-columns: repeat(6, minmax(0, 1fr)); gap: 6px; }
.schedule-document .day { border: 1px solid #9aa39d; padding: 5px; min-height: 90px; }
.schedule-document .day h3 { font-size: 13px; margin: 0 0 4px; }
.schedule-document .card { border: 1px solid #c5ccc7; border-radius: 4px; padding: 4px 5px; margin: 3px 0; font-size: 11.5px; line-height: 1.3; }
.schedule-document .card.done { opacity: .5; }
.schedule-document .muted { color: #666; }
.schedule-document .month-grid { width: 100%; border-collapse: collapse; table-layout: fixed; }
.schedule-document .month-grid th, .schedule-document .month-grid td { border: 1px solid #9aa39d; vertical-align: top; padding: 3px; font-size: 11px; }
.schedule-document .month-grid td { height: 70px; }
.schedule-document .month-grid td.other { background: #f2f2f2; }
.schedule-document .month-grid .dnum { font-weight: 700; }

/* 스크립트 오류 알림 띠: 화면이 조용히 멈추는 대신 무엇이 잘못됐는지 보여 준다. */
.app-error { position: sticky; top: 0; z-index: 50; display: flex; align-items: center; gap: 10px; padding: 10px 16px; background: #fde8e8; color: #7a1f1f; border-bottom: 1px solid #f0b8b8; font-size: 13px; }
.app-error code { background: #fff; padding: 2px 6px; border-radius: 4px; max-width: 70vw; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* 납품 스케줄 인쇄: A4 가로 한 장. 주간은 6칸, 월간은 달력 한 장. */
@page schedule { size: A4 landscape; margin: 10mm; }
.schedule-document { page: schedule; }
@media print {
  .schedule-document h1 { font-size: 16px; margin: 0 0 6px; }
  .schedule-document .week-grid { gap: 4px; }
  .schedule-document .day { min-height: 150mm; padding: 4px; }
  .schedule-document .day h3 { font-size: 12px; }
  .schedule-document .card { font-size: 10.5px; padding: 3px 4px; margin: 2px 0; break-inside: avoid; }
  .schedule-document .month-grid td { height: 26mm; font-size: 10px; }
  .schedule-document .month-grid .card { font-size: 9.5px; }
}

/* 작업 스케줄표 (팀별) 인쇄 */
.team-schedule h1 { font-size: 18px; margin: 0 0 4px; }
.team-schedule .muted { color: #666; margin: 0 0 8px; font-size: 12px; }
.team-schedule table { width: 100%; border-collapse: collapse; }
.team-schedule th, .team-schedule td { border: 1px solid #9aa39d; padding: 4px 6px; font-size: 12px; text-align: left; }
[data-team] h3 { display: flex; align-items: center; gap: 10px; }
[data-team] h3 span { font-weight: 400; color: var(--muted); font-size: 13px; }

/* 2026-09-18 — 업무진행현황 case popup: the ten tabs need more room than the default 720px dialog. */
dialog.modal.wide { width: min(1120px, 96vw); }

/* 2026-09-21 — 발주 기록: the purchase that was just received is marked when the list opens. */
tr.highlight > td { background: var(--accent-soft, #eef6f0); }

/* 2026-09-21 — 자동 기입 칸: light grey until the user edits it (JS drops .auto-filled on input/change). Stays editable. */
input.auto-filled:not([type="checkbox"]), select.auto-filled, textarea.auto-filled, .sheet .c input.auto-filled:not([type="checkbox"]), .sheet .c select.auto-filled, .wrow input.auto-filled, .wrow select.auto-filled, .colors input.auto-filled { background: var(--auto-fill-bg, #eef0f2); }
@media (prefers-color-scheme: dark) { :root { --auto-fill-bg: rgba(255,255,255,0.08); } }

/* ── 2026-09-22 생산일지 UI: 상단 박스(일지 머리 + 작업자) / 하단 제품·작업 박스, 글씨 키움, 태블릿·폰 ── */
[data-print-editor] form > .sheet, [data-conv-editor] form > .sheet, [data-print-editor] [data-product-block], [data-conv-editor] [data-work-block] { border: 1px solid var(--line-strong); border-radius: 12px; box-shadow: 0 1px 3px rgba(0,0,0,.05); margin: 0 0 16px; }
[data-print-editor] [data-product-block], [data-conv-editor] [data-work-block] { border-color: var(--accent); }
[data-print-editor] .sheet > .ttl, [data-conv-editor] .sheet > .ttl { font-size: 14px; font-weight: 700; color: var(--ink); padding: 10px 14px; letter-spacing: 0; }
[data-print-editor] [data-product-block] > .ttl:first-child, [data-conv-editor] [data-work-block] > .ttl:first-child { background: var(--accent-soft); color: var(--accent-soft-ink); font-size: 15px; }
[data-print-editor] .sheet .c .l, [data-conv-editor] .sheet .c .l, [data-conv-editor] .wrow .f .l, .sheet .row2 .conversion-workers > .f .l { font-size: 13px; }
[data-print-editor] .sheet .c input:not([type="checkbox"]), [data-print-editor] .sheet .c select, [data-conv-editor] .sheet .c input:not([type="checkbox"]), [data-conv-editor] .sheet .c select, [data-conv-editor] .wrow input:not([type="checkbox"]), [data-conv-editor] .wrow select { font-size: 15px; }
[data-print-editor] .sheet .c .v, [data-conv-editor] .sheet .c .v { font-size: 15px; }
.worker-picker legend { font-size: 14px; font-weight: 700; }
.worker-choice { font-size: 15px; min-height: 44px; padding: 0 14px; }
.colors { font-size: 13px; }
.colors input { font-size: 14px; }
[data-print-editor] .actions .btn, [data-conv-editor] .actions .btn { font-size: 14px; }
[data-print-editor] form > .actions:last-child .btn.primary, [data-conv-editor] form > .actions:last-child .btn.primary { font-size: 15px; min-height: 46px; padding: 0 18px; }
/* Tablet */
@media (max-width: 1100px) {
  [data-print-editor] form > .sheet > .row2, [data-conv-editor] form > .sheet > .row2 { grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); }
  [data-print-editor] [data-product-block] .row2 { grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); }
  .colors { overflow-x: auto; grid-template-columns: 56px repeat(10, minmax(56px, 1fr)); }
}
/* Phone */
@media (max-width: 700px) {
  [data-print-editor] form > .sheet > .row2, [data-conv-editor] form > .sheet > .row2, [data-print-editor] [data-product-block] .row2, [data-conv-editor] [data-work-block] .row2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  [data-print-editor] form > .sheet > .row2 > .c:first-child, [data-conv-editor] [data-work-block] .row2 > .c:nth-child(2) { grid-column: 1 / -1; }
  .sheet .row2 .c:has(.tm) { grid-column: 1 / -1; }  /* time + 지금 need the full width on a phone */
  .sheet .row2 .c:nth-child(2n) { border-right: 0; }
  [data-conv-editor] .wrow { grid-template-columns: repeat(6, minmax(0, 1fr)); gap: 8px; }
  [data-conv-editor] .wrow .f, [data-conv-editor] .wrow .f.wide2 { grid-column: span 3; }
  [data-conv-editor] .wrow .f:first-child { grid-column: span 1; }
  [data-conv-editor] .wrow .conversion-row-note { grid-column: 1 / -1; }
  .worker-choices { gap: 8px; }
  .worker-choice { flex: 1 1 calc(50% - 8px); justify-content: flex-start; }
  .colors { grid-template-columns: 48px repeat(10, minmax(52px, 1fr)); }
  [data-print-editor] form > .actions:last-child, [data-conv-editor] form > .actions:last-child { flex-wrap: wrap; }
  [data-print-editor] form > .actions:last-child .btn, [data-conv-editor] form > .actions:last-child .btn { flex: 1 1 100%; }
}

/* 2026-09-22 — 생산일지 상단 한 줄: 호기 · 저장한 일지 · 새 일지 … 초안 저장 · 제출(오른쪽). 명단 외 작업자는 체크박스 줄 끝에. 투입 원단과 LOT는 한 줄. */
.log-top { display: flex; flex-wrap: wrap; align-items: flex-end; gap: 10px; margin-bottom: 16px; }
.log-top > .f { margin: 0; }
.log-top-spacer { flex: 1 1 auto; }
.log-top .btn.primary { font-size: 15px; min-height: var(--control-h); padding: 0 18px; }
.worker-choices { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; }
.worker-choices .worker-extra { display: inline-flex; align-items: center; gap: 8px; flex: 1 1 260px; min-width: 240px; margin: 0; }
.worker-choices .worker-extra .l { white-space: nowrap; font-size: 13px; color: var(--muted); }
.worker-choices .worker-extra input { flex: 1 1 auto; min-width: 0; }
.source-lot-detail:empty { display: none; }
@media (max-width: 700px) { .log-top .btn[type="submit"] { flex: 1 1 100%; } .log-top-spacer { display: none; } }

/* ── 2026-09-22 가공 일지: 팀별 진행 한 줄씩(‹ ›), 롤 행 한 줄, 통일된 여백·모서리 ── */
[data-print-editor] .sheet, [data-conv-editor] .sheet, [data-conv-editor] .progress-strip { --log-r: 12px; border-radius: var(--log-r); }
[data-conv-editor] .progress-strip { border: 1px solid var(--line-strong); background: var(--surface); padding: 12px 14px; gap: 10px; margin-bottom: 16px; box-shadow: 0 1px 3px rgba(0,0,0,.05); }
.ps-row { display: grid; grid-template-columns: 96px 30px minmax(0, 1fr) 30px; align-items: center; gap: 8px; }
.ps-row .ps-title { font-size: 15px; font-weight: 700; color: var(--ink); }
.ps-row .ps-title small { color: var(--muted); font-weight: 500; }
.ps-nav { height: 30px; width: 30px; border: 1px solid var(--line); border-radius: 6px; background: var(--surface-2); color: var(--ink); font-size: 16px; line-height: 1; padding: 0; cursor: pointer; }
.ps-row .ps-items { display: flex; flex-wrap: nowrap; overflow-x: auto; scroll-behavior: smooth; gap: 8px; scrollbar-width: none; padding: 2px 0; }
.ps-row .ps-items::-webkit-scrollbar { display: none; }
.ps-row .ps-item { flex: 0 0 240px; padding: 8px 12px; border-radius: 8px; }
.ps-row .ps-item b { font-size: 13.5px; }
.ps-row .ps-item span { font-size: 12.5px; }
[data-conv-editor] form > .sheet > .row2 { grid-template-columns: repeat(auto-fit, minmax(184px, 1fr)); }
[data-conv-editor] form > .sheet > .row2 > .c:has(.tm) { min-width: 200px; }
[data-conv-editor] form > .sheet > .row2 > .c:last-child { grid-column: 1 / -1; }
[data-conv-editor] .worker-new { padding: 8px 12px; }
[data-conv-editor] .wrow { display: grid; grid-template-columns: 28px minmax(170px, 1fr) 96px 64px 120px 210px 150px 150px 118px; align-items: end; gap: 8px 12px; border-radius: 8px; padding: 10px 12px; }
[data-conv-editor] .wrow:has(.cutcell[hidden]) { grid-template-columns: 28px minmax(170px, 1fr) 96px 120px 210px 150px 150px 118px; }
[data-conv-editor] .wrow .f, [data-conv-editor] .wrow .f.wide2 { min-width: 0; width: auto; max-width: none; }
[data-conv-editor] .wrow .f > .l { white-space: nowrap; }
[data-conv-editor] .wrow .rowtail .v { min-height: var(--control-h-dense); }
[data-conv-editor] .wrow .tt input:disabled { background: var(--auto-fill-bg, #eef0f2); color: var(--muted); }
[data-conv-editor] .wrow .tt .outgrid input { width: 72px; }
@media (max-width: 1100px) { [data-conv-editor] .wrow, [data-conv-editor] .wrow:has(.cutcell[hidden]) { display: flex; flex-direction: row; flex-wrap: wrap; align-items: flex-end; } }
[data-conv-editor] .wrow .l1 { display: contents; }
[data-conv-editor] .wrow .f { grid-column: auto; flex: 0 0 auto; }
[data-conv-editor] .wrow .f:first-child { flex-basis: 28px; }
[data-conv-editor] .wrow .f.wide2 { flex: 1 1 220px; max-width: 320px; }
[data-conv-editor] .wrow .f:has(> [name="input_m"]) { flex-basis: 96px; }
[data-conv-editor] .wrow .cutcell { flex-basis: 64px; }
[data-conv-editor] .wrow .outcell { flex-basis: 110px; }
[data-conv-editor] .wrow .ttcell { flex-basis: 168px; }
[data-conv-editor] .wrow .f:has(> .tm) { flex-basis: 140px; }
[data-conv-editor] .wrow .rowtail .v { display: inline-flex; align-items: center; gap: 8px; }
[data-conv-editor] .wrow .outgrid input, [data-conv-editor] .wrow .tt input { width: 64px; font-size: 15px; }
[data-conv-editor] .wrow .tt .outgrid label, [data-conv-editor] .wrow .outgrid label { font-size: 13px; }
[data-print-editor] input:not([type="checkbox"]):not([type="file"]), [data-print-editor] select, [data-print-editor] textarea, [data-conv-editor] input:not([type="checkbox"]):not([type="file"]), [data-conv-editor] select, [data-conv-editor] textarea { border-radius: 6px; }
[data-print-editor] .sheet > .ttl, [data-conv-editor] .sheet > .ttl { padding: 10px 14px; }
[data-print-editor] .sheet .row2 .c, [data-conv-editor] .sheet .row2 .c, .sheet .row2 .conversion-workers > .f { padding: 8px 14px; }
[data-conv-editor] .wrows { padding: 10px 14px; }
@media (max-width: 700px) { .ps-row { grid-template-columns: 1fr 30px 30px; } .ps-row .ps-items { grid-column: 1 / -1; } [data-conv-editor] .wrow .f.wide2 { flex-basis: 100%; } }
[data-conv-editor] .wrow .tt .outgrid, [data-conv-editor] .wrow .outcell .outgrid { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 8px; }
[data-conv-editor] .wrow .ttcell { flex-basis: 200px; }

/* 2026-09-22 사용자: 롤 행의 상태·삭제는 [지금] 버튼과 같은 높이·모양(인쇄·가공 공통), 투입 m와 완료량 입력칸은 같은 크기·같은 여백,
   투입 롤 목록은 LOT만. 제품 정보 › 사양서 파일 올리기 줄. */
[data-conv-editor] .wrow .rowtail .v { white-space: nowrap; }
[data-conv-editor] .wrow .rowtail .v { display: inline-flex; align-items: stretch; gap: 6px; min-height: var(--control-h-dense); }
[data-conv-editor] .wrow .rowtail .pill, [data-conv-editor] .wrow .rowtail .btn {
  display: inline-flex; align-items: center; justify-content: center; box-sizing: border-box; height: var(--control-h-dense); min-height: 0; padding: 0 10px;
  border-radius: 5px; font-size: 12px; font-weight: 500; line-height: 1; vertical-align: middle; }
[data-conv-editor] .wrow .rowtail .btn { border: 1px solid var(--control-border, #cfd4da); background: #fff; }
[data-conv-editor] .wrow input[name="input_m"], [data-conv-editor] .wrow .outcell .outgrid input { width: 76px; text-align: right; }
[data-conv-editor] .wrow .tt .outgrid input { width: 64px; }
[data-conv-editor] .wrow { grid-template-columns: 28px minmax(170px, 1fr) 76px 64px 104px 210px 150px 150px 118px; }
[data-conv-editor] .wrow:has(.cutcell[hidden]) { grid-template-columns: 28px minmax(170px, 1fr) 76px 104px 210px 150px 150px 118px; }
[data-conv-editor] .wrow .f:has(> [name="input_m"]) { flex-basis: 76px; }
[data-conv-editor] .wrow .outcell { flex-basis: 104px; }
[data-conv-editor] .wrow .outcell .outgrid, [data-conv-editor] .wrow .tt .outgrid { gap: 6px; }
[data-conv-editor] .wrow .outcell .outgrid label, [data-conv-editor] .wrow .tt .outgrid label { display: inline-flex; align-items: center; gap: 6px; white-space: nowrap; }
form.spec-upload { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 12px; margin-top: 10px; }
form.spec-upload input[type="file"] { max-width: 320px; }
[data-conv-editor] .wrow .rowtail .v { padding: 0; height: var(--control-h-dense); }

/* 2026-09-22 사용자: 진행 카드는 지금 쓸 수 있는 작업이 먼저, 투입 롤이 없는 작업은 회색. 투입 m·완료량 칸을 넓히고 투입 롤·온도·타수와 간격을 같게. */
.ps-row .ps-item.waiting { background: var(--auto-fill-bg, #eef0f2); border-color: transparent; color: var(--muted); }
.ps-row .ps-item.waiting b { color: var(--muted); font-weight: 600; }
[data-conv-editor] .wrow input[name="input_m"], [data-conv-editor] .wrow .outcell .outgrid input { width: 96px; }
[data-conv-editor] .wrow { grid-template-columns: 28px minmax(200px, 1fr) 96px 64px max-content 210px 150px 150px 118px; }
[data-conv-editor] .wrow:has(.cutcell[hidden]) { grid-template-columns: 28px minmax(200px, 1fr) 96px max-content 210px 150px 150px 118px; }
[data-conv-editor] .wrow .f.wide2 { max-width: none; }
[data-conv-editor] .wrow .f.wide2 select { width: 100%; max-width: none; }
[data-conv-editor] .wrow .f:has(> [name="input_m"]) { flex-basis: 96px; }
[data-conv-editor] .wrow .outcell { flex-basis: auto; }
@media (max-width: 1100px) { [data-conv-editor] .wrow .f.wide2 { max-width: 360px; } }
[data-conv-editor] .wrow { grid-template-columns: 28px minmax(170px, 1fr) 92px 64px max-content 190px 150px 150px 110px; gap: 8px 10px; }
[data-conv-editor] .wrow:has(.cutcell[hidden]) { grid-template-columns: 28px minmax(170px, 1fr) 92px max-content 190px 150px 150px 110px; }
[data-conv-editor] .wrow input[name="input_m"], [data-conv-editor] .wrow .outcell .outgrid input { width: 92px; }
[data-conv-editor] .wrow .tt .outgrid input { width: 60px; }
[data-conv-editor] .wrow .ttcell { flex-basis: 190px; }
[data-conv-editor] .wrow .outcell .outgrid label, [data-conv-editor] .wrow .tt .outgrid label { gap: 6px; }

/* 2026-09-22 사용자: 작업스케줄표 출력은 납기일·거래처·제품명·공정(경로 한 칸, 이 팀 단계 굵게). */
.team-schedule td.due { white-space: nowrap; width: 90px; }
.team-schedule td.route { white-space: nowrap; }
.team-schedule td.route b { font-weight: 700; text-decoration: underline; text-underline-offset: 2px; }
.team-schedule-screen td b { font-weight: 700; text-decoration: underline; text-underline-offset: 2px; }

/* 2026-09-22 사용자: 작업스케줄표 칸 너비 — 납기일은 YYYY-MM-DD에 맞추고, 거래처는 절반, 줄인 만큼 제품명을 넓힌다(탭 화면·출력물 공통). */
.team-schedule table, .team-schedule-screen table { table-layout: auto; width: 100%; }
.team-schedule th:nth-child(1), .team-schedule td:nth-child(1), .team-schedule-screen th:nth-child(1), .team-schedule-screen td:nth-child(1) { width: 1%; white-space: nowrap; padding-right: 14px; }
.team-schedule th:nth-child(2), .team-schedule td:nth-child(2), .team-schedule-screen th:nth-child(2), .team-schedule-screen td:nth-child(2) { width: 11%; }
.team-schedule th:nth-child(4), .team-schedule td:nth-child(4), .team-schedule-screen th:nth-child(4), .team-schedule-screen td:nth-child(4) { width: 33%; }
.team-schedule td.due { width: 1%; }
/* The print dialog lays tables out as fixed; give 납기일 a real width that fits YYYY-MM-DD in either layout. */
article.team-schedule > table, .team-schedule-screen table { table-layout: fixed; }
.team-schedule th:nth-child(1), .team-schedule td:nth-child(1), .team-schedule td.due, .team-schedule-screen th:nth-child(1), .team-schedule-screen td:nth-child(1) { width: 8em; }

/* 2026-09-23 업무진행현황 이관: 시트 기준으로 끝난 단계는 점선 테두리, 이관 건은 '이관' 표시. */
.track i.full.mig { background: var(--accent-soft); color: var(--accent-soft-ink); border: 1px dashed var(--accent); }
tr.migrated td:first-child .pill { margin-left: 4px; vertical-align: 1px; }
.migration-flags { border: 1px solid var(--warn, #b7791f); background: var(--warn-soft, #fff7e6); border-radius: 8px; padding: 8px 12px; margin: 8px 0; }
.migration-flags ul { margin: 4px 0 0; padding-left: 18px; }
.migration-notes { margin: 2px 0 10px; padding-left: 18px; }

/* 2026-09-23 고객 지급(원단·동판) 안내 */
.hint.warn { color: var(--warn, #b7791f); }
[data-customer-supplied] { margin-left: 4px; vertical-align: 1px; }
[data-customer-supplies] .check-line label { white-space: nowrap; }

/* 2026-09-23 점검: 휴대폰에서 색도 10칸이 40px 아래로 찌그러짐 → 칸 너비를 지키고 가로로 넘겨 본다. */
@media (max-width: 700px) { [data-print-editor] .colors { grid-template-columns: 64px repeat(10, 48px); overflow-x: auto; } }

/* 2026-09-23 인쇄 스케줄 · 가공 스케줄 · 완료 처리 */
.sched-query, .completion-query { flex-wrap: wrap; align-items: flex-end; gap: 10px 14px; }
.kpi.warn .n { color: var(--bad, #b42318); }
.sched-columns { display: grid; grid-template-columns: repeat(var(--cols, 2), minmax(280px, 1fr)); gap: 14px; margin-top: 12px; }
.sched-col { background: var(--surface, #fff); border: 1px solid var(--line); border-radius: 12px; padding: 10px 12px; min-width: 0; }
.sched-col > h3 { margin: 2px 0 8px; font-size: 16px; }
.sched-group { margin: 10px 0 4px; }
.sched-group > h4 { margin: 0 0 6px; font-size: 13px; color: var(--muted); font-weight: 600; }
.sched-group.overdue > h4 { color: var(--bad, #b42318); }
.sched-card { border: 1px solid var(--line); border-radius: 10px; padding: 8px 10px; margin: 0 0 8px; background: var(--surface, #fff); }
.sched-card.overdue { border-color: var(--bad, #b42318); }
.sched-card .sc-head { font-size: 14px; }
.sched-card .sc-meta, .sched-card .sc-done { font-size: 12.5px; color: var(--muted); margin-top: 3px; }
.sched-card .sc-note { font-size: 12.5px; margin-top: 4px; white-space: pre-wrap; }
.sched-card .sc-actions { display: flex; gap: 8px; align-items: center; margin-top: 8px; }
.sched-card .sc-actions select { height: var(--control-h-dense); width: auto; }
.sched-table tr.sched-group-row th { background: var(--surface-2); text-align: left; font-size: 13px; }
.sched-table tr.sched-group-row.overdue th { color: var(--bad, #b42318); }
.sched-table td.route, [data-completion-table] td.route { white-space: nowrap; }
.sched-table td.route s, [data-completion-table] td.route s { color: var(--muted); }
.schedule-paper h1 { font-size: 18px; margin: 0 0 4px; } .schedule-paper h2 { font-size: 15px; margin: 12px 0 4px; }
.schedule-paper th, .schedule-paper td { border: 1px solid #9aa39d; padding: 3px 5px; font-size: 11px; text-align: left; }
/* 스케줄 인쇄만 A4 가로 — 이름 붙은 페이지라 발주서 등 다른 문서의 방향은 그대로다. */
.schedule-paper { page: schedule-landscape; }
@page schedule-landscape { size: A4 landscape; margin: 10mm; }
@media print { .schedule-paper { font-size: 11px; } }
@media (max-width: 900px) { .sched-columns { grid-template-columns: 1fr; } }

/* 2026-09-28 수주 없이 올린 스케줄 작업: 점선 테두리로 구분 */
.sched-card.task { border-style: dashed; }
.sched-table td.row-actions { white-space: nowrap; }
.sched-table td.row-actions .btn + .btn, .sched-card .sc-actions .btn + .btn, .sched-card .sc-done .btn { margin-left: 4px; }
[data-task-form] .proof-line { align-items: end; }

/* 2026-09-28 사용자: 스케줄·완료 처리 툴바의 높이·줄 맞춤 — 입력칸, 구분 버튼 묶음, [＋ 작업 추가], [인쇄 / PDF]를 같은 높이(36px)로, 아랫줄에 맞춘다.
   구분 버튼 묶음 위에는 입력칸과 같은 이름표(보기·공정)를 둔다. 버튼 폭을 줄여 1440px에서 한 줄에 들어간다. */
.query .query-field { font-size: 12px; color: var(--muted); display: flex; flex-direction: column; gap: 3px; }
.sched-query, .completion-query { align-items: flex-end; }
.sched-query .kind-switch, .completion-query .kind-switch { align-self: auto; height: var(--control-h); box-sizing: border-box; }
.sched-query .kind-switch .btn, .completion-query .kind-switch .btn { height: 100%; min-height: 0; min-width: 0; padding: 0 16px; }
.sched-query > .btn, .completion-query > .btn { height: var(--control-h); min-height: 0; align-self: flex-end; }

/* 2026-09-28: 교정 칸은 신규·개정일 때만(작업 추가 대화상자), 진행 중 수주의 [제품 공정 반영] 안내 줄. */
.proof-fields { display: contents; }
.proof-fields[hidden] { display: none; }
.route-extend { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; padding: 10px 12px; margin: 0 0 12px; border: 1px solid var(--line); border-radius: 8px; background: var(--accent-soft); color: var(--accent-soft-ink); font-size: 13px; }
.route-extend .btn { height: var(--control-h); min-height: 0; }

/* 2026-09-28: 작업 추가 대화상자의 신규·개정·교정 칸을 한 줄로. 가공 스케줄 비고는 두 줄까지(전체는 마우스를 올리면), 인쇄물에는 전부. */
[data-task-form] .grid.proof-line { display: flex; flex-wrap: wrap; gap: 10px 24px; align-items: flex-end; }
[data-task-form] .proof-line .check-line { min-height: var(--control-h); display: inline-flex; align-items: center; margin: 0; }
[data-task-form] .proof-line label:not(.check-line) { width: 11em; }
.sched-note span { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; max-width: 18em; }

/* 2026-09-28 휴대폰(390px): 가공 스케줄 "보기" 버튼 6개가 화면 밖으로 24px 넘침 → 좁은 화면에서는 묶음 안에서 가로로 밀어 본다. */
@media (max-width: 600px) {
  .sched-query .query-field, .completion-query .query-field { min-width: 0; max-width: 100%; }
  .sched-query .kind-switch, .completion-query .kind-switch { max-width: 100%; overflow-x: auto; }
  .sched-query .kind-switch .btn, .completion-query .kind-switch .btn { flex: 0 0 auto; padding: 0 12px; }
}

/* 2026-09-28 수주 등록: 공정 줄 옆에 인쇄 호기 / 가공 팀 선택 */
.route-step.with-sched > .f.route-sched { flex: 0 1 180px; }
.route-step.with-sched .route-sched select { width: 100%; }
@media (max-width: 600px) { .route-step.with-sched { flex-wrap: wrap; } .route-step.with-sched > .f { flex: 1 1 100%; } }
.sched-table select[data-sched-team-of] { height: var(--control-h-dense, 30px); min-height: 0; }

/* 2026-09-28 작업스케줄표 팀 제목: 팀 이름 · 건수 · (오른쪽) 이 팀 출력 */
[data-team] h3 { justify-content: flex-start; }
[data-team] h3 .btn { margin-left: auto; }

/* 2026-09-28 작업스케줄표 두 줄: 위 제품명·공정, 아래 규격(작은 글씨). 납기일·거래처는 두 줄을 합친다. */
/* 2026-09-28 사용자: 표 아래 선이 비던 것 — 두 줄을 합친 납기일·거래처 칸(rowspan)의 아래 선까지 지웠었다. 제품명·공정 칸만 지운다. */
.ts-table tr.ts-main.has-spec > td:not([rowspan]) { border-bottom: 0; padding-bottom: 2px; }
.ts-table tr.ts-spec > td { padding-top: 0; font-size: 12px; color: var(--muted); }
.ts-table td[rowspan] { vertical-align: top; }
.ts-table .ts-item { font-weight: 600; }
@media print { .team-schedule .ts-table tr.ts-spec > td { color: #333; font-size: 10.5px; } .team-schedule .ts-table tr { break-inside: avoid; } }
/* 2026-09-28 홈: 팀별 작업대기 카드(한눈에). 인쇄 줄, 가공 줄. */
.team-cards .team-card-grid { display: grid; gap: 10px; padding: 14px 16px 16px; }
.team-card-kind { display: grid; grid-template-columns: 3.2em repeat(auto-fill, minmax(190px, 1fr)); gap: 10px; align-items: stretch; }
.team-card-kind .tc-kind { align-self: center; font-size: 12px; color: var(--muted); font-weight: 600; }
.team-card { display: flex; flex-direction: column; gap: 2px; padding: 10px 12px; border: 1px solid var(--line); border-radius: 8px; background: var(--surface); cursor: pointer; }
.team-card.has { border-color: var(--accent); background: var(--accent-soft); color: var(--accent-soft-ink); }
.team-card .tc-name { font-weight: 600; }
.team-card .tc-n b { font-size: 20px; }
.team-card .tc-due { font-size: 12px; color: var(--muted); }
.team-card:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
@media (max-width: 600px) { .team-card-kind { grid-template-columns: repeat(2, minmax(0, 1fr)); } .team-card-kind .tc-kind { grid-column: 1 / -1; } }
.task-link select { width: 100%; }
.linked-tasks { margin-top: 14px; }
.linked-tasks .sec .btn { margin-left: 8px; }

/* 2026-09-28 사용자: 팀별 작업대기 카드를 '바로 처리' 위로(예전 규칙은 바로 처리를 맨 위로 올렸다). 인쇄·가공 카드를 한 줄에 같은 너비로. */
[data-panel="today"] > .group > .group > .card:last-child { order: 0; }
[data-panel="today"] > .group > .group > .team-cards { order: -1; }
.team-cards .team-card-grid { grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); }
.team-card-kind { display: contents; }
.team-card .tc-kind { font-size: 11px; color: var(--muted); font-weight: 600; }
.team-card .tc-kind { align-self: flex-start; }

/* 2026-09-28 사용자: 스케줄 인쇄물 — 머리글(문서·팀 / 출력일), 팀(호기)마다 새 페이지. */
.sched-page-head { display: flex; justify-content: space-between; align-items: baseline; gap: 12px; border-bottom: 2px solid #222; padding-bottom: 4px; margin-bottom: 4px; }
.sched-page-head h1 { margin: 0; font-size: 18px; }
.sched-page-head .print-date { font-size: 13px; font-weight: 600; white-space: nowrap; }
.sched-page-meta { margin: 2px 0 8px; font-size: 12px; color: #555; }
.schedule-paper .sched-page + .sched-page, .team-schedule-set > .team-schedule + .team-schedule { break-before: page; }
@media screen { .schedule-paper .sched-page + .sched-page, .team-schedule-set > .team-schedule + .team-schedule { margin-top: 28px; padding-top: 16px; border-top: 1px dashed var(--line); } }

/* 2026-09-28 사용자: "작업스케줄표에 인쇄 1팀 안 나옴" — 여러 쪽 인쇄에서 첫 쪽 윗부분이 잘렸다.
   모달 dialog는 top layer라 position:static이 먹지 않고 화면 가운데 정렬(inset 0 + margin auto) 그대로 인쇄돼, 한 쪽보다 길면 위가 종이 밖으로 밀렸다.
   인쇄 때는 종이 왼쪽 위에 붙이고 높이를 내용만큼. */
@media print {
  html:has(dialog[open]), body:has(dialog[open]) { overflow: visible !important; height: auto !important; }
  dialog.modal[open] { position: absolute !important; inset: 0 auto auto 0 !important; margin: 0 !important; transform: none !important; width: 100% !important; height: auto !important; max-height: none !important; padding: 0 !important; border: 0 !important; box-shadow: none !important; }
  dialog.modal[open]::backdrop { background: none; }
}
/* 2026-09-28 사용자: 스케줄표 표 내용 글씨 키우기(화면·인쇄). */
.ts-table td { font-size: 14px; }
.ts-table tr.ts-spec > td { font-size: 12.5px; }
.ts-table th { font-size: 13px; }
@media print {
  .schedule-paper { font-size: 13px; }
  .schedule-paper table td { font-size: 13px; }
  .team-schedule .ts-table td, .schedule-paper .ts-table td { font-size: 14px; }
  .team-schedule .ts-table tr.ts-spec > td, .schedule-paper .ts-table tr.ts-spec > td { font-size: 12px; }
  .sched-page-head h1 { font-size: 20px; }
}

/* 2026-09-28: 인쇄·가공 스케줄 표 — 두께×폭×피치 한 칸, 숫자·호기·버튼은 줄바꿈 없이, 제품명은 넉넉히. */
.sched-table td.dims, .sched-table td.row-actions, .sched-table td.code { white-space: nowrap; }
.sched-table td:nth-child(4) { min-width: 11em; }
.sched-table th { white-space: nowrap; }
.sched-table td, .sched-table th { padding-left: 8px; padding-right: 8px; }
.sched-note-line { margin-top: 3px; font-size: 12px; color: var(--muted); display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; max-width: 22em; }
.sched-table td:nth-child(3) { min-width: 11em; }
.sched-table td:nth-child(4) { min-width: 0; }
.sched-table .row-actions .btn { height: 30px; min-height: 0; padding: 0 10px; font-size: 12.5px; }
/* 2026-09-28: 1280px 화면에서 인쇄·가공 스케줄 표가 가로로 밀리지 않게 — 수량 두 줄, 버튼 세로로, 긴 거래처 줄바꿈, 선택 칸 폭 줄임. */
.sched-table td.qty { white-space: normal; max-width: 8.5em; }
.sched-table td.row-actions { white-space: normal; width: 1%; }
.sched-table td.row-actions .btn { display: block; width: 100%; margin: 2px 0; }
.sched-table td.row-actions .btn + .btn { margin-left: 0; }
.sched-table td:first-child { max-width: 8em; overflow-wrap: anywhere; }
.sched-table select[data-sched-press], .sched-table select[data-sched-team-of] { width: 7.5em; }
.sched-table td.code { font-size: 12.5px; }
.sched-table td.qty { white-space: nowrap; max-width: none; }
.sched-table td:first-child { min-width: 5em; word-break: keep-all; overflow-wrap: anywhere; }
.sched-table td, .sched-table th { padding-left: 6px; padding-right: 6px; }

/* 2026-09-28 사용자: "표 밑에까지 선으로" — 빈 줄(같은 칸 선). 줄 수는 teams.mjs fillPaperLines가 A4 가로 폭으로 재서 정한다.
   그 계산이 인쇄와 같도록, 스케줄 인쇄물의 글씨 크기는 화면 미리보기에도 인쇄와 똑같이 둔다(예전에는 @media print에만 있었음). */
.schedule-paper, .schedule-paper table td { font-size: 13px; }
.team-schedule .ts-table td, .schedule-paper .ts-table td { font-size: 14px; }
.team-schedule .ts-table tr.ts-spec > td, .schedule-paper .ts-table tr.ts-spec > td { font-size: 12px; }
.sched-page-head h1 { font-size: 20px; }
.team-schedule .ts-table tbody.ts-product, .schedule-paper tbody.ts-product { break-inside: avoid; }
@media print { .schedule-paper { font-size: 13px; } }

/* 2026-09-28 사용자: "표 아래쪽 선이 없었잖아, 그거 채우라는 뜻" — 화면 표용 `tbody tr:last-child > td { border-bottom: 0 }`가
   종이 표(작업스케줄표·인쇄/가공 스케줄 인쇄물)의 맨 아래 선까지 지웠다. 종이 표는 마지막 줄에도 선을 둔다. */
.team-schedule tbody tr:last-child > td, .team-schedule-screen tbody tr:last-child > td { border-bottom: 1px solid #9aa39d; }
.schedule-paper tbody tr:last-child > td { border-bottom: 1px solid #9aa39d; }

/* 2026-09-28 사용자: 홈 — 단계 카드(교정대기·원단대기·인쇄대기·가공대기·납품대기), 누르면 그 단계 목록. 바로 처리 자리 = 월간 캘린더(수주일·납기일). */
.stage-cards { grid-template-columns: repeat(6, minmax(0, 1fr)); } /* 2026-09-30 사용자: 박스 6개(교정·원단·인쇄·가공·외주·납품) 한 줄 */
@media (max-width: 900px) { .stage-cards { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
@media (max-width: 520px) { .stage-cards { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
.stage-card.on { outline: 2px solid var(--accent); outline-offset: -2px; }
.home-calendar .cal-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 12px 16px 0; flex-wrap: wrap; }
.home-calendar .cal-head h3 { margin: 0; border: 0; padding: 0; }
.home-calendar .cal-head .actions { display: flex; gap: 6px; }
.month-cal { width: 100%; border-collapse: collapse; table-layout: fixed; margin: 10px 0 0; }
.month-cal th { font-size: 12px; color: var(--muted); padding: 6px; text-align: left; border-bottom: 1px solid var(--line); }
.month-cal td { vertical-align: top; height: 104px; padding: 4px 5px; border: 1px solid var(--line); }
.month-cal td.other { background: var(--surface-2); }
.month-cal td.other .dnum { color: var(--muted); }
.month-cal td.today { box-shadow: inset 0 0 0 2px var(--accent); }
.month-cal .dnum { font-size: 12px; font-weight: 700; margin-bottom: 2px; }
.cal-ev { font-size: 11.5px; line-height: 1.35; padding: 1px 4px; border-radius: 4px; margin-top: 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.cal-ev b { font-weight: 700; margin-right: 2px; }
.cal-ev.order { background: #e8f0fb; color: #1f4f8a; }
.cal-ev.due { background: #fdf1e2; color: #8a4d0f; }
.cal-ev.due.late { background: #fde8e8; color: #9b1c1c; }
.cal-ev.closed { opacity: .5; }
.cal-more { font-size: 11px; color: var(--muted); margin-top: 2px; }
.home-calendar .hint { padding: 8px 16px 12px; margin: 0; }
.home-calendar .hint .cal-ev { display: inline-block; }
@media (max-width: 700px) { .month-cal td { height: 64px; } .cal-ev { font-size: 10px; } }
.cal-ev .cal-n { font-weight: 700; }

/* 2026-09-28 사용자: 날짜를 누르면 오른쪽에 전날 · 고른 날 · 다음 날의 수주·납기(거래처별). 좁은 화면에서는 캘린더 아래. */
.home-calendar .cal-body { display: grid; grid-template-columns: minmax(0, 1fr) 300px; gap: 12px; align-items: start; }
@media (max-width: 1100px) { .home-calendar .cal-body { grid-template-columns: 1fr; } }
.month-cal td[data-day] { cursor: pointer; }
.month-cal td[data-day]:hover { background: var(--accent-soft); }
.month-cal td.picked { box-shadow: inset 0 0 0 2px #1f4f8a; }
.cal-day-panel { display: flex; flex-direction: column; gap: 8px; margin-top: 10px; padding-right: 12px; }
.cal-day { border: 1px solid var(--line); border-radius: 8px; padding: 8px 10px; background: var(--surface); }
.cal-day.current { border-color: #1f4f8a; box-shadow: 0 0 0 1px #1f4f8a; }
.cal-day.prev, .cal-day.next { opacity: .85; }
.cal-day h4 { margin: 0 0 6px; font-size: 13px; }
.cal-day h4 small { color: var(--muted); font-weight: 400; margin-left: 4px; }
.cal-day .hint { margin: 0; font-size: 12px; }
.cd-kind + .cd-kind { margin-top: 6px; }
.cd-kind-h { font-size: 12px; color: var(--muted); margin-bottom: 2px; }
.cd-kind-h .cal-ev { display: inline-block; }
.cd-party { font-size: 12.5px; font-weight: 600; margin-top: 4px; }
.cd-party span { font-weight: 400; color: var(--muted); }
.cal-day ul { margin: 2px 0 0; padding-left: 14px; }
.cal-day li { font-size: 12px; line-height: 1.45; }
.cal-day .cd-meta { display: block; color: var(--muted); font-size: 11.5px; }

/* 2026-09-28 사용자: 날짜 정보는 옆이 아니라 팝업으로 — 캘린더는 다시 전체 폭, 팝업 안에 위 전날 · 가운데 고른 날 · 아래 다음 날. */
.home-calendar .cal-body { display: block; }
.cal-day-popup { display: flex; flex-direction: column; gap: 8px; min-width: min(560px, 86vw); }
.cal-day-popup .cal-day li { font-size: 13px; }
.cal-day-popup .cal-day .cd-meta { font-size: 12px; }

/* 2026-09-28: 홈 팝업의 제품명 = 업무진행현황 상세 열기, 상세 요약 탭의 공정 진행 메모. */
.cal-day .link-btn { background: none; border: 0; padding: 0; color: var(--accent-soft-ink); text-decoration: underline; text-underline-offset: 2px; cursor: pointer; font: inherit; text-align: left; }
.case-summary { margin: 8px 0 0; }
.case-summary b { margin-right: 6px; }

/* 2026-09-28 Q86 A: 납품대기 카드 아래 배차 나눔(업체 배차 N · 택배 N). */
.stage-card .stage-sub { display: block; font-size: 12px; color: var(--muted); margin-top: 2px; }

/* 2026-09-28 묶음 배송: 납품 스케줄 [묶음 배송] 탭, 달력·인쇄의 묶음 상자. */
.trip-panel .trip-query { margin-bottom: 4px; }
.trip-panel .trip-query .hint { flex: 1 1 320px; }
.trip-suggest { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 10px; }
.trip-card { border: 1px solid var(--line); border-radius: 8px; padding: 10px 12px; background: var(--surface); }
.trip-card h4 { margin: 0 0 6px; font-size: 14px; }
.trip-card h4 small { color: var(--muted); font-weight: 400; margin-left: 4px; }
.trip-card ol, .trip-stops { margin: 2px 0 8px; padding-left: 18px; font-size: 13px; line-height: 1.5; }
.trip-stops { margin: 0; }
.trip-card li .hint, .trip-stops li .hint { font-size: 12px; }
.trip-free-head { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.trip-free .trip-area-row th { background: var(--surface-2); text-align: left; font-size: 13px; }
.trip-free .trip-area-row th small { color: var(--muted); font-weight: 400; margin-left: 4px; }
.trip-stops-edit .stop-no { width: 64px; }
.calendar .trip-box { border: 1px dashed #1f4f8a; border-radius: 8px; padding: 3px 4px; margin: 3px 0; background: rgba(31, 79, 138, .05); }
.calendar .trip-box .trip-h { font-size: 11.5px; font-weight: 700; color: #1f4f8a; margin: 0 2px 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.calendar .trip-box .chip { margin: 2px 0; }
.schedule-document .card.trip { border: 1.5px dashed #1f4f8a; }
.schedule-document .card.trip ol { margin: 2px 0 0; padding-left: 16px; }
.schedule-document .card.trip li.done { text-decoration: line-through; opacity: .6; }

/* 2026-09-28 Q91: 받아서 납품만 — 업무진행현황 상세 요약 탭의 입고 안내. */
.resale-box { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-top: 10px; padding: 8px 10px; border: 1px dashed var(--line-strong); border-radius: 8px; background: var(--surface-2); font-size: 13px; }

/* 2026-09-28: 수주 등록 · 업무진행현황 상세의 고객 발주서 첨부. */
.po-attach input[type="file"] { padding: 6px 0; }
.po-attach-row { margin-bottom: 8px; align-items: center; gap: 10px; }
.po-attach-row label.btn { cursor: pointer; }

/* 2026-09-28 Q97 A: 미리보기 창 [드라이브에 저장] 결과 줄. */
.document-actions .drive-status { margin-left: 8px; font-size: 12.5px; }
.document-actions .drive-status a { font-weight: 600; }

/* 2026-09-29 사용자 "크기 맞추기, 줄맞추기": 검색줄의 구분 버튼 묶음·버튼을 입력칸과 같은 높이·같은 아랫줄로(거래처정보 등). */
.query > .kind-switch { align-self: flex-end; height: var(--control-h); box-sizing: border-box; }
.query > .kind-switch .btn { height: 100%; min-height: 0; }
.query > .btn { align-self: flex-end; height: var(--control-h); }
/* 수주 등록 · 고객 발주서 첨부 칸도 다른 입력칸과 같은 높이. */
.po-attach input[type="file"] { height: var(--control-h); padding: 4px 8px 4px 4px; box-sizing: border-box; font-size: 13px; }
.po-attach input[type="file"]::file-selector-button { height: calc(var(--control-h) - 10px); margin: 0 10px 0 0; padding: 0 12px; border: 1px solid var(--line-strong); border-radius: 5px; background: var(--surface-2); color: var(--ink); font: inherit; cursor: pointer; }

/* 2026-09-29 사용자 "메뉴 접기": 넓은 화면에서 접으면 메뉴가 아이콘 줄(64px)이 되고, 아이콘에 마우스를 올리면 하위 메뉴가 옆에 뜬다(navigation.mjs). */
@media (min-width: 1101px) {
  .shell { transition: grid-template-columns .15s ease; }
  .menu-close { min-height: 32px; height: 32px; margin-bottom: 10px; padding: 0 10px; justify-content: flex-start; font-size: 12.5px; font-weight: 500; color: var(--muted); background: transparent; border-color: var(--line); }
  .menu-close:hover { color: var(--ink); background: var(--surface-2); }
  .shell.nav-rail { grid-template-columns: 64px minmax(0, 1fr); }
  .nav-rail .side { position: relative; z-index: 30; padding-inline: 8px; }
  .nav-rail .menu-close { justify-content: center; padding: 0; font-size: 15px; }
  .nav-rail .brand { padding-bottom: 10px; }
  .nav-rail .brand-logo { height: 32px; border-radius: 6px; }
  .nav-rail .brand-name, .nav-rail .role { display: none; }
  .nav-rail .nav > button { justify-content: center; gap: 0; padding: 10px 0; font-size: 0; }
  .nav-rail .sub { display: none !important; }
  .nav-rail .sub.flyout { display: flex !important; position: absolute; left: calc(100% - 6px); min-width: 180px; margin: 0; padding: 6px; border: 1px solid var(--line); border-radius: 8px; background: var(--surface); box-shadow: var(--shadow); }
  .nav-rail .sub.flyout::before { content: attr(data-title); padding: 4px 10px 6px; font-size: 12px; font-weight: 600; color: var(--muted); }
  .nav-rail .sub.flyout button { white-space: nowrap; }
}
@media print { .nav-rail .sub.flyout { display: none !important; } }

/* 2026-09-29 회원가입: 직원 편집 창의 아이디 줄, 관리자 초기화 때 한 번 보이는 임시 비밀번호. */
.staff-login { margin: 0 0 10px; }
.temp-password { margin: 10px 0; padding: 12px 14px; border: 1px dashed var(--line-strong); border-radius: 8px; background: var(--surface-2); font-family: "IBM Plex Mono", ui-monospace, monospace; font-size: 20px; letter-spacing: .08em; user-select: all; }

/* 2026-09-29 납품 스케줄: 수주 납기 줄. 납품일이 납기와 다르면 납기 취소선 + [변경](늦으면 빨강). */
.calendar .chip .due-line, .schedule-document .due-line { font-size: 11.5px; color: var(--muted); }
.due-line s { color: var(--muted); }
.due-line .due-change { display: inline-block; padding: 0 5px; border-radius: 4px; font-size: 10.5px; font-weight: 700; color: var(--warn); background: var(--warn-soft); }
.due-line.moved { color: var(--ink); }
.due-line.late .due-change { color: var(--bad); background: var(--bad-soft); }
.schedule-document .due-line .due-change { border: 1px solid currentColor; background: none; }
/* 계획 전 수주 = 납기일 칸에 점선 칩, 다른 날로 계획된 수주 = 원래 납기일 칸에 흐린 취소선 칩(변경 → 새 날짜). */
.calendar .chip.due-only { border-style: dashed; border-left: 3px dashed var(--line-strong); background: transparent; }
.calendar .chip.due-only.moved { opacity: .75; }
.calendar .chip.due-only.moved s { color: var(--muted); }
.schedule-document .card.due-only { border-style: dashed; }
.schedule-document .card.due-only.moved { color: #666; }
/* 달력 칩·출력 카드 안의 줄(.line)은 v9.css 수주 입력 줄(.line: 테두리·안쪽 여백)과 이름만 같다 — 테두리 없이. */
.calendar .chip .line, .schedule-document .card .line { border: 0; border-radius: 0; padding: 0; gap: 0; }
.schedule-document .card .line { display: block; }

/* 2026-09-29 사용자 "오늘 할 일 달력처럼": 납품 스케줄 달력 = 홈 달력(.month-cal) 모양 + 줄 종류 색. */
.ship-cal { margin: 4px 0 0; }
.ship-cal th:nth-child(6) { color: #1d5fb0; } .ship-cal th:nth-child(7) { color: #c0392b; }
.ship-cal td { height: 118px; }
.ship-cal .dnum .cnt { font-weight: 600; font-size: 11px; color: var(--accent-soft-ink); background: var(--accent-soft); border-radius: 10px; padding: 0 6px; }
.cal-ev.ship { background: var(--accent-soft); color: var(--accent-soft-ink); }
.cal-ev.trip { background: #e8f0fb; color: #1f4f8a; box-shadow: inset 0 0 0 1px rgba(31, 79, 138, .35); }
.cal-ev.moved { background: transparent; color: var(--muted); box-shadow: inset 0 0 0 1px var(--line-strong); }
.cal-ev.moved s { color: var(--muted); }
.cal-ev .chg { display: inline-block; margin-right: 2px; padding: 0 4px; border-radius: 3px; font-size: 10.5px; font-weight: 700; color: var(--warn); background: var(--warn-soft); text-decoration: none; }
.cal-ev.done { opacity: .5; text-decoration: line-through; }
.cal-ev.part { box-shadow: inset 3px 0 0 #d9a400; }
.cal-legend { padding: 8px 2px 0; margin: 0; }
.cal-legend .cal-ev { display: inline-block; }
.cal-day-popup .due-line { font-size: inherit; }

/* 2026-09-29 추천 5번: 관리자 홈 "가입 대기 N명". */
.signup-notice { display: flex; align-items: center; gap: 10px; width: 100%; padding: 10px 14px; border: 1px solid #e0b84a; border-radius: 8px; background: var(--warn-soft); color: var(--ink); font-size: 14px; text-align: left; cursor: pointer; }
.signup-notice b { color: var(--warn); }
.signup-notice .who { color: var(--muted); font-size: 13px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.signup-notice .go { margin-left: auto; font-weight: 600; color: var(--warn); white-space: nowrap; }
.signup-notice:hover { filter: brightness(.98); }
/* 2026-09-29 추천 7번: 지난 미출고(납품 스케줄). */
.cal-ev.ship.late, .cal-ev.trip.late { background: #fde8e8; color: #9b1c1c; box-shadow: none; }
.cal-ev .chg.late { color: var(--bad); background: var(--bad-soft); }
.cal-day-popup .late-mark { color: #9b1c1c; }

/* 2026-09-29 외주(Q106 C~Q111 A): 외주 기록 창 · 업무진행현황 상세 외주 칸 · 외주 목록. */
.outsource-dialog .outsource-totals { margin: 6px 0 10px; }
.outsource-forms { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; margin-top: 12px; }
.outsource-forms form { border: 1px solid var(--line); border-radius: 8px; padding: 10px 12px; background: var(--surface-2); }
.outsource-forms h3 { margin: 0 0 8px; font-size: 14px; }
.outsource-forms .check-line { display: flex; align-items: center; gap: 6px; margin: 8px 0; font-size: 13px; }
@media (max-width: 800px) { .outsource-forms { grid-template-columns: 1fr; } }
.outsource-case { margin-top: 14px; }
.outsource-case h4 { margin: 0 0 6px; font-size: 14px; }
.outsource-case .actions { flex-wrap: wrap; gap: 6px; margin-top: 8px; }
.late-text { color: #9b1c1c; font-weight: 600; }

/* 2026-09-29 Q112 A·B: 사양서 작은 그림 · 큰 창. */
.spec-gallery { display: flex; flex-wrap: wrap; gap: 10px; margin: 6px 0 12px; }
.spec-thumb { display: flex; flex-direction: column; align-items: stretch; width: 132px; padding: 4px; border: 1px solid var(--line); border-radius: 8px; background: var(--surface); cursor: zoom-in; text-align: left; }
.spec-thumb:hover { border-color: var(--accent); box-shadow: 0 0 0 1px var(--accent); }
.spec-thumb img { width: 100%; height: 96px; object-fit: cover; border-radius: 5px; background: var(--surface-2); }
.spec-thumb.file .spec-file-kind { display: grid; place-items: center; height: 96px; border-radius: 5px; background: var(--surface-2); color: #b3392f; font-weight: 700; font-size: 18px; }
.spec-thumb-name { margin-top: 4px; font-size: 11.5px; color: var(--muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.spec-viewer.wide { width: min(1200px, calc(100vw - 32px)); max-width: none; }
.spec-viewer h2 small { font-weight: 400; color: var(--muted); margin-left: 6px; font-size: 13px; }
.spec-viewer .viewer-tools { display: flex; flex-wrap: wrap; gap: 6px; padding: 8px 16px; border-bottom: 1px solid var(--line); }
.spec-viewer .viewer-body { display: grid; place-items: center; min-height: 300px; max-height: calc(100vh - 170px); overflow: auto; padding: 8px; background: var(--surface-2); }
.spec-viewer .viewer-body img { max-width: 100%; max-height: calc(100vh - 190px); object-fit: contain; }
.spec-viewer .viewer-body.zoomed { display: block; }
.spec-viewer .viewer-body iframe { width: 100%; height: calc(100vh - 190px); border: 0; background: #fff; }
.case-spec { margin: 8px 0 0; }
/* 사양서는 항상 접어 둔다(사용자 2026-09-29). */
.spec-fold { margin: 4px 0 12px; border: 1px solid var(--line); border-radius: 8px; background: var(--surface); }
.spec-fold > summary { cursor: pointer; padding: 8px 12px; font-weight: 600; font-size: 13.5px; }
.spec-fold > summary .hint { font-weight: 400; margin-left: 6px; }
.spec-fold[open] > summary .hint { display: none; }
.spec-fold > .spec-gallery { margin: 0; padding: 0 12px 12px; }

/* 2026-09-30 수주 목록·업무진행현황 출력 */
.list-print-bar { margin: 0 0 10px; align-items: center; gap: 10px; }
.list-paper td { vertical-align: top; }
.list-paper .nw { white-space: nowrap; }
.paper-document.list-paper table { table-layout: auto; width: 100%; } /* print.css .paper-document table(fixed)보다 우선 */

/* 2026-09-30 업무진행현황 10단계 칸 = 그 단계 화면으로 가는 버튼 */
.track i[data-go-stage] { cursor: pointer; }
.track i[data-go-stage]:hover { outline: 2px solid var(--accent); outline-offset: 1px; }

/* 2026-09-30 재고 생산 */
.stock-hint { color: var(--accent-soft-ink); font-weight: 600; }
.stock-take-bar { margin: 0 0 10px; align-items: center; gap: 10px; }
[data-stock-take] input[type="number"] { width: 110px; }
/* 2026-09-30 사용자: 업무진행현황 10단계 — 완료 초록 · 대기 노랑 · 진행 중 진한 노랑 · 뒤 단계가 끝나 넘어간 단계는 점선. */
.track i.full { background: #2e7d4f; color: #fff; }
.track i.wait { background: #fdf3c4; color: #7a5a00; }
.track i.part { background: #f5c842; color: #4d3800; font-weight: 600; }
.track i.skip { background: #eef7f1; color: #2e7d4f; border: 1.5px dashed #2e7d4f; line-height: 21px; }
.track i.full.mig { background: var(--accent-soft); color: var(--accent-soft-ink); border: 1px dashed var(--accent); }

/* 2026-09-30 수주 메모 */
.order-memo-field { grid-column: 1 / -1; }
.order-memo-field textarea { min-height: 52px; }
.order-memo { color: #7a5a00; white-space: normal; }
.order-memo-box { margin: 8px 0; padding: 8px 10px; border-left: 3px solid #e0b84a; background: var(--warn-soft); border-radius: 4px; white-space: pre-wrap; }

/* 2026-09-30 동판 관리 — 배치도(간략)·제품 연결 후보 */
.plate-map-wrap { overflow-x: auto; margin: 6px 0 10px; }
.plate-map { display: grid; grid-template-columns: repeat(9, minmax(52px, 1fr)); gap: 4px; min-width: 560px; }
.plate-area { display: flex; align-items: center; justify-content: center; border: 1px dashed var(--line-strong, #9aa39d); border-radius: 6px; color: var(--muted, #667); background: var(--surface-2, #f6f7f6); font-size: 12px; writing-mode: horizontal-tb; }
.plate-spot { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 1px; padding: 3px 2px; border: 1px solid var(--line-strong, #9aa39d); border-radius: 6px; background: #fff; cursor: pointer; font: inherit; font-size: 12px; line-height: 1.2; }
.plate-spot b { font-size: 13px; }
.plate-spot span { color: var(--accent-soft-ink, #1e8e5a); font-weight: 600; }
.plate-spot em { font-style: normal; color: #b3261e; font-weight: 600; }
.plate-spot .tier { font-size: 10px; color: #7a5a00; background: #fff4cc; border-radius: 3px; padding: 0 3px; }
.plate-spot.empty span { color: var(--muted, #889); font-weight: 400; }
.plate-spot:hover { border-color: var(--accent, #1e8e5a); }
.plate-spot.selected { outline: 2px solid var(--accent, #1e8e5a); background: var(--accent-soft, #e2f3e9); }
.linkish { background: none; border: 0; padding: 0; color: var(--accent, #1e8e5a); text-decoration: underline; cursor: pointer; font: inherit; }
.plate-candidates { display: grid; gap: 4px; margin: 4px 0 8px; }
.plate-candidates .candidate { display: flex; justify-content: space-between; align-items: center; gap: 8px; padding: 4px 8px; border: 1px solid var(--line, #d9e0db); border-radius: 6px; }

/* 2026-09-30 동판 발주 창: 노란 칸 = 발주마다 넣는 칸(회사 양식의 노란 음영). 회색(.auto-filled)은 자동으로 채운 값 */
.plate-yellow .f.pf-y input:not(.auto-filled), .plate-yellow .f.pf-y select { background: #fff8c4; }
.plate-colors table { table-layout: fixed; min-width: 560px; }
.plate-colors th, .plate-colors td { padding: 2px; text-align: center; }
.plate-colors input { width: 100%; min-width: 0; text-align: center; background: #fff8c4; }
.plate-colors input.auto-filled { background: var(--auto-fill-bg, #eef0f2); }
.plate-drawing-choices { display: flex; flex-wrap: wrap; gap: 8px; margin: 4px 0 8px; }
.drawing-choice { display: flex; flex-direction: column; align-items: center; gap: 3px; width: 120px; padding: 6px; border: 1px solid var(--line, #d9e0db); border-radius: 6px; font-size: 12px; cursor: pointer; }
.drawing-choice img { width: 100%; height: 80px; object-fit: contain; background: #fafafa; }
.drawing-choice span { max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.drawing-choice.none { justify-content: center; }
.plate-fixed { margin-top: 10px; border: 1px solid var(--line, #d9e0db); border-radius: 8px; padding: 6px 10px; }
.plate-fixed > summary { cursor: pointer; font-weight: 600; }

/* 2026-09-30 동판 제작 발주서 — 회사 양식(동판발주서 샘플) 모양, A4 세로 한 장 */
.paper-document.plate-po { background: #fff; color: #000; font-size: 12px; max-width: 200mm; margin: 0 auto; padding: 4mm 2mm; }
.plate-po .ppo-title { border: 2px solid #000; text-align: center; font-size: 24px; font-weight: 800; letter-spacing: .06em; padding: 6px 0; margin: 0 0 10px; }
.paper-document.plate-po table { width: 100%; border-collapse: collapse; table-layout: fixed; margin: 0 0 8px; border: 2px solid #000; }
.paper-document.plate-po th, .paper-document.plate-po td { border: 1px solid #000; padding: 2px 3px; height: 26px; text-align: center; vertical-align: middle; font-weight: 400; background: #fff; color: #000; white-space: normal; word-break: keep-all; overflow-wrap: anywhere; font-size: 12px; }
.paper-document.plate-po th { font-weight: 600; }
.plate-po .ppo-big { font-size: 14px; font-weight: 700; height: 34px; }
.plate-po .ppo-no { font-size: 13px; }
.plate-po .ppo-strong { font-weight: 700; font-size: 13px; }
.plate-po .ppo-small { font-size: 11px; }
.plate-po .ppo-ship { color: #0b5cad; font-weight: 700; }
.plate-po .ppo-color { height: 40px; font-weight: 700; font-size: 13px; }
.plate-po .ppo-gap th, .plate-po .ppo-gap td { border-top: 2px solid #000; }
.plate-po .ppo-notes td { text-align: left; border-left: 0; border-right: 0; height: 22px; }
.plate-po .ppo-notes td.ppo-n { text-align: left; }
.plate-po .ppo-drawing { position: relative; border: 2px solid #000; min-height: 52mm; padding: 30px 10px 8px; margin: 0 0 8px; break-inside: avoid; }
.plate-po .ppo-drawing-label { position: absolute; left: 0; top: 0; border-right: 2px solid #000; border-bottom: 2px solid #000; padding: 1px 12px; }
.plate-po .ppo-drawing p { margin: 0 0 4px 12%; font-weight: 700; font-size: 13px; }
.plate-po .ppo-drawing img { display: block; max-width: 100%; max-height: 72mm; margin: 4px auto 0; object-fit: contain; }
.plate-po .ppo-bottom { display: flex; justify-content: space-between; align-items: flex-start; gap: 14mm; }
.paper-document.plate-po .ppo-bottom table { width: 40%; }
.paper-document.plate-po .ppo-bottom table.ppo-sign { width: 42%; }
.plate-po .ppo-sign tr:last-child td { height: 52px; }
.plate-po .ppo-total th, .plate-po .ppo-total td { font-weight: 700; height: 34px; }
.plate-po .ppo-foot { font-weight: 600; margin: 8px 0 4px; font-size: 12px; }
.plate-po .ppo-company { text-align: center; font-weight: 700; margin: 0; }
@media print { .paper-document.plate-po { max-width: none; padding: 0; } }
/* 2026-10-07 사용자 "전개도면은 다음 장 — 동판 제작 발주서 정보(제목·위 표) 밑에 전개도면": 둘째 장은 새 쪽에서 시작, 전개도면 칸을 크게.
   화면에서는 점선과 '2쪽' 표시로 나눔. 드라이브 PDF(html2pdf css 모드)도 break-before를 따른다. */
.plate-po .ppo-page2 { break-before: page; page-break-before: always; }
.plate-po .ppo-page2 .ppo-drawing { min-height: 150mm; } /* 위 표(약 80mm) + 전개도면이 A4 한 장(여백 12mm)에 들어가게 */
.plate-po .ppo-page2 .ppo-drawing img { max-height: 150mm; }
/* 점선 '2쪽'은 미리보기 창 안에서만 — 드라이브 PDF(html2pdf는 창 밖에 복사해 그림)·인쇄에는 안 찍힘 */
@media screen { .readonly-document .plate-po .ppo-page2 { position: relative; margin-top: 12mm; padding-top: 8mm; border-top: 2px dashed #9aa39d; } .readonly-document .plate-po .ppo-page2::before { content: '2쪽 · 전개도면'; position: absolute; top: -10px; left: 50%; transform: translateX(-50%); background: #fff; padding: 0 10px; font-size: 11px; color: #667; } }
@media screen { .paper-document.plate-po { min-width: 680px; } .readonly-document:has(.plate-po) { overflow-x: auto; } }

/* 2026-09-30 납품 스케줄 날짜 메모 */
.ship-cal .cal-memo { margin: 2px 0; padding: 1px 4px; border-radius: 4px; background: #fff4cc; color: #6b4e00; font-size: 11px; line-height: 1.35; overflow: hidden; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; white-space: normal; word-break: keep-all; }
.ship-cal .cal-memo b, .cal-day .cd-memo b, .schedule-document .day-memo b { font-weight: 700; margin-right: 3px; }
.cal-day .cd-memo { margin: 4px 0; padding: 4px 8px; border-left: 3px solid #e0b84a; background: #fffaf0; font-size: 13px; white-space: pre-wrap; }
.cal-day .cd-memo-edit { margin-top: 8px; padding-top: 8px; border-top: 1px dashed var(--line, #d9e0db); }
.cal-day .cd-memo-edit textarea { min-height: 60px; }
.schedule-document .day-memo { margin: 0 0 4px; padding: 2px 5px; border: 1px solid #e0b84a; border-radius: 3px; background: #fffaf0; font-size: 10px; white-space: pre-wrap; }

/* 2026-10-01 납품 스케줄 [전체]: 배차별 색 — 자차 초록 · 용차 파랑 · 택배 보라 · 업체 배차 청록. 묶음(자차)은 초록 테두리. 지난 미출고는 그대로 빨강 */
.cal-ev.ship.m-own { background: var(--accent-soft); color: var(--accent-soft-ink); }
.cal-ev.ship.m-hired { background: #e3ecfb; color: #234f9e; }
.cal-ev.ship.m-courier { background: #efe6fb; color: #6235a3; }
.cal-ev.ship.m-pickup { background: #eeeff1; color: #3f4349; }
.cal-ev.trip { background: #d8efe1; color: #13603c; box-shadow: inset 0 0 0 1px rgba(19, 96, 60, .45); }
.cal-ev.ship.late[class*="m-"], .cal-ev.trip.late { background: #fde8e8; color: #9b1c1c; box-shadow: none; }
.cal-note { font-weight: 700; }
.meth-tag { display: inline-block; padding: 0 6px; border-radius: 999px; font-size: 11px; font-weight: 600; }
.meth-tag.m-own { background: var(--accent-soft); color: var(--accent-soft-ink); } .meth-tag.m-hired { background: #e3ecfb; color: #234f9e; } .meth-tag.m-courier { background: #efe6fb; color: #6235a3; } .meth-tag.m-pickup { background: #eeeff1; color: #3f4349; }
/* 2026-10-06 사용자 "용차·업체배차·자차·택배 라벨 색 다르게": 줄 앞 라벨을 배차별 진한 배지(흰 글자)로 — 날짜 지남(빨강)·출고 완료(흐림)여도 배차가 보인다.
   자차 초록 · 용차 파랑 · 택배 보라 · 업체 배차 진회색(청록은 자차 초록과 헷갈려 바꿈). 배차 탭 이름 앞에도 같은 색 점. */
.cal-ev.ship[class*="m-"] > b:first-child, .meth-tag[class*="m-"] { padding: 0 5px; border-radius: 3px; color: #fff; }
.cal-ev.ship.m-own > b:first-child, .meth-tag.m-own { background: #187a4c; }
.cal-ev.ship.m-hired > b:first-child, .meth-tag.m-hired { background: #2f62c4; }
.cal-ev.ship.m-courier > b:first-child, .meth-tag.m-courier { background: #7a45c4; }
.cal-ev.ship.m-pickup > b:first-child, .meth-tag.m-pickup { background: #5a5f66; }
#dstabs [data-tab="ds1"]::before, #dstabs [data-tab="ds2"]::before, #dstabs [data-tab="ds3"]::before, #dstabs [data-tab="ds4"]::before { content: ""; display: inline-block; width: 9px; height: 9px; margin-right: 5px; border-radius: 2px; vertical-align: 0; }
#dstabs [data-tab="ds1"]::before { background: #187a4c; } #dstabs [data-tab="ds2"]::before { background: #2f62c4; } #dstabs [data-tab="ds3"]::before { background: #7a45c4; } #dstabs [data-tab="ds4"]::before { background: #5a5f66; }
.cal-day .cd-note { margin: 2px 0 4px; font-size: 12.5px; }
.cal-day .cd-note-text { color: #6b4e00; background: #fffaf0; border-left: 3px solid #e0b84a; padding: 1px 6px; border-radius: 3px; white-space: pre-wrap; }
.cal-day .cd-note-form { display: flex; gap: 6px; margin-top: 4px; }
.cal-day .cd-note-form input { flex: 1; min-width: 0; }

/* 2026-10-02 관리 › 인사관리(관리자만): 만료 알림 상자, 취소한 휴가 줄, 외국인 칸 체크, 홈 인사 알림 */
.hr-alerts { margin: 0 0 12px; padding: 10px 14px; border: 1px solid #e0b84a; border-radius: 8px; background: var(--warn-soft); }
.hr-alerts > b { color: var(--warn); }
.hr-alerts ul { margin: 6px 0 0; padding-left: 18px; display: grid; gap: 4px; }
.hr-alerts .linkish { font-weight: 600; }
.struck { text-decoration: line-through; color: var(--muted); }
.modal .mb > .sec .hr-foreign { display: inline-flex; align-items: center; gap: 6px; font-weight: 600; cursor: pointer; }
.hr-upload { flex-wrap: wrap; align-items: center; }
.hr-leave-sum { margin: 0; padding: 8px 12px; border-radius: 6px; background: var(--info-soft); color: var(--info-ink); font-size: 13.5px; }
.hr-leave-sum:empty { display: none; }
.hr-leave-list summary { cursor: pointer; padding: 4px 0; font-weight: 600; }
.hr-notice { margin-top: 0; }
.signup-notice + .hr-notice { margin-top: 8px; }

/* 2026-10-02 인사관리 첫 화면 달력(공휴일·휴가) · 홈 달력 공휴일 표시 · 수주/납기 체크 */
.month-cal td.sun .dnum, .month-cal td.hol .dnum { color: var(--bad); }
.month-cal td.sat .dnum { color: #2f5fb3; }
.month-cal td.hol:not(.other) { background: var(--bad-soft); }
.hol-name { font-size: 10.5px; font-weight: 600; color: var(--bad); margin-left: 2px; white-space: nowrap; }
.hr-ev { cursor: pointer; }
.hr-ev.k-annual { background: var(--accent-soft); color: var(--accent-soft-ink); }
.hr-ev.k-family { background: #efe7fb; color: #5b3a8f; }
.hr-ev.k-sick { background: #fde8e8; color: #9b1c1c; }
.hr-ev.k-other { background: var(--surface-2); color: var(--ink); box-shadow: inset 0 0 0 1px var(--line); }
.hr-ev.k-exp { background: var(--warn-soft); color: var(--warn); }
.hr-ev.k-in { background: var(--info-soft); color: var(--info-ink); }
.hr-cal .hint { padding: 8px 4px 4px; }
.hr-cal .hint .cal-ev { display: inline-block; }
.hr-cal .cal-head { padding: 4px 4px 0; }
.hr-today { margin: 8px 4px 0; font-size: 13.5px; }
.cal-show { display: flex; gap: 6px; align-items: center; }
.cal-show label.cal-ev { display: inline-flex; align-items: center; gap: 5px; margin: 0; padding: 4px 10px; font-size: 13px; font-weight: 600; cursor: pointer; }
.cal-show input { margin: 0; }
.cal-show label:has(input:not(:checked)) { opacity: .5; }

/* 2026-10-02 사용자: 납기까지 근무일 3일 이하인데 인쇄 시작 전 → 인쇄 칸 빨간 테두리가 반짝(움직임 줄이기 설정이면 테두리만) */
.track i.alert { box-shadow: 0 0 0 2px var(--bad); animation: track-alert 1s ease-in-out infinite; position: relative; z-index: 1; }
@keyframes track-alert { 50% { box-shadow: 0 0 0 2px transparent; } }
@media (prefers-reduced-motion: reduce) { .track i.alert { animation: none; } }

/* 2026-10-02 사용자: 원단 → 원단발주, 공정·지시 → 원단입고 — 진행 단계 9칸(v9.css의 10칸 대신) */
.track { grid-template-columns: repeat(9, minmax(44px, 1fr)); min-width: 470px; }
.track i { letter-spacing: -.3px; }

/* 2026-10-02 사용자 Q146 B: 작업스케줄표 = 한 작업 두 줄 카드(화면·A4 가로 출력 같이). 흑백 출력에서도 지남(검정 채움)·급함(빨강 굵은 테두리)·여유(회색 테두리)가 구분된다. */
.ts-cards { display: flex; flex-direction: column; gap: 8px; }
.ts-job { display: grid; grid-template-columns: 48px minmax(0, 1fr) 236px 128px; grid-template-rows: auto auto; border: 2.5px solid #111; border-radius: 10px; overflow: hidden; background: #fff; color: #111; break-inside: avoid; }
.ts-job.u-over { border-color: #d0021b; border-width: 4px; }
.ts-no { grid-column: 1; grid-row: 1 / 3; background: #111; color: #fff; font-size: 26px; font-weight: 900; display: flex; align-items: center; justify-content: center; }
.ts-job.u-over .ts-no { background: #d0021b; }
.ts-main { grid-column: 2; grid-row: 1; padding: 7px 12px 2px; min-width: 0; }
.ts-party { font-size: 13px; font-weight: 700; color: #333; }
.ts-item { font-size: 21px; font-weight: 900; line-height: 1.2; letter-spacing: -.3px; }
.ts-specs { grid-column: 2; grid-row: 2; display: flex; flex-wrap: wrap; gap: 4px 16px; align-items: baseline; padding: 2px 12px 8px; font-size: 13px; font-weight: 700; color: #333; }
.ts-specs b { font-size: 18px; font-weight: 900; color: #111; }
.ts-route { margin-left: auto; font-size: 13px; white-space: nowrap; }
.ts-route b { background: #111; color: #fff; padding: 1px 7px; border-radius: 5px; font-size: 13px; }
.ts-route i { font-style: normal; color: #777; margin: 0 4px; }
.ts-box { grid-column: 3; grid-row: 1 / 3; border-left: 2.5px solid #111; background: #fff8d6; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px; padding: 6px; text-align: center; }
.ts-box.none { background: #f3f3f3; }
.ts-box.qty { background: #eef4f0; }
.ts-big { font-size: 28px; font-weight: 900; letter-spacing: -.5px; line-height: 1.05; white-space: nowrap; }
.ts-big small { font-size: 15px; font-weight: 800; }
.ts-big.ts-muted { font-size: 20px; color: #555; }
.ts-big.ts-qty { font-size: 22px; }
.ts-sum { font-size: 13px; font-weight: 700; }
.ts-info { display: flex; flex-wrap: wrap; gap: 3px; justify-content: center; }
.ts-due { grid-column: 4; grid-row: 1 / 3; border-left: 2.5px solid #111; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 5px; padding: 4px; text-align: center; }
.ts-due b { font-size: 17px; font-weight: 900; }
.ts-tag, .ts-src { display: inline-block; font-style: normal; font-weight: 800; border-radius: 6px; white-space: nowrap; }
.ts-tag { font-size: 13px; padding: 1px 7px; }
.ts-tag.over { background: #111; color: #fff; }
.ts-tag.hot { border: 2.5px solid #d0021b; color: #d0021b; padding: 0 6px; }
.ts-tag.later, .ts-tag.none { border: 2px solid #999; color: #555; }
.ts-src { font-size: 11.5px; padding: 1px 6px; }
.ts-src.in { background: #111; color: #fff; }
.ts-src.po { border: 2px dashed #111; }
.ts-src.order, .ts-src.task { border: 2px solid #111; }
.ts-src.none { border: 2px dotted #999; color: #666; }
.ts-legend { display: flex; flex-wrap: wrap; gap: 6px 14px; align-items: center; font-size: 12.5px; margin: 8px 0 0; color: #333; }
.ts-legend > span { display: inline-flex; gap: 5px; align-items: center; }
.ts-none { color: var(--muted); padding: 12px 0; }
@media (max-width: 760px) { .ts-job { grid-template-columns: 38px minmax(0, 1fr) 118px; } .ts-box { grid-column: 2 / 4; grid-row: 3; border-left: 0; border-top: 2px solid #111; flex-direction: row; flex-wrap: wrap; gap: 8px; } .ts-due { grid-column: 3; grid-row: 1 / 3; } .ts-no { grid-row: 1 / 4; } .ts-route { margin-left: 0; } }
@media print { .team-schedule .ts-job { border-width: 2px; } .team-schedule .ts-job.u-over { border-width: 3.5px; } }
.team-schedule > .sched-page-head h1 { font-size: 26px; font-weight: 900; letter-spacing: -.3px; }
.team-schedule > .sched-page-meta { font-size: 13px; font-weight: 700; }

/* 2026-10-02 사용자 "글자 안 나가게 — 제품명 쪽을 살짝 줄이고 롤 쪽을 늘리고": 롤 상자 넓게, 제품명 조금 작게, 상자 안 글자는 줄 바꿈 없이 줄여서 */
.ts-job { grid-template-columns: 46px minmax(0, 1fr) 300px 122px; }
.ts-item { font-size: 19px; }
.ts-box { min-width: 0; overflow: hidden; }
.ts-big { font-size: 26px; max-width: 100%; }
.ts-big.ts-qty { font-size: 22px; white-space: normal; }
.ts-sum { white-space: nowrap; }
.ts-src { max-width: 100%; overflow: hidden; text-overflow: ellipsis; }
@media (max-width: 760px) { .ts-job { grid-template-columns: 38px minmax(0, 1fr) 112px; } }
/* 인쇄 스케줄 원단 롤 칸 */
.sched-table td.roll-cell b { font-size: 15px; white-space: nowrap; }
.sched-table td.roll-cell .roll-none { color: var(--muted); font-weight: 700; }
.roll-total { margin: 0; font-size: 15px; font-weight: 800; }

/* 2026-10-02 외주 표시(업무진행현황 칸·줄, 작업스케줄표 상자) · 발주 저장 중 */
.track i.out { background: #efe7fb; color: #4b2a8a; font-weight: 700; }
.pill.out { background: #efe7fb; color: #4b2a8a; }
.ts-box.out { background: #f3eefc; }
.ts-big.ts-out { font-size: 20px; white-space: normal; }
.outsource-eta { align-items: flex-end; flex-wrap: wrap; gap: 8px; }
.save-status { margin-left: 8px; font-weight: 700; }

/* 2026-10-02 전자결재: 결재자 체크 칸 · 결재함 줄 · 오늘 할 일 '내 할 일'·'내 메모장' · 마이페이지 서명 · 오른쪽 위 [결재 N] */
.appr-pick { border: 1px solid var(--line); border-radius: 8px; padding: 8px 12px 10px; margin: 10px 0; display: flex; flex-wrap: wrap; gap: 6px 16px; align-items: center; }
.appr-pick legend { font-weight: 700; font-size: 13.5px; padding: 0 4px; }
.appr-pick legend .hint { font-weight: 400; margin-left: 6px; }
.appr-pick small { color: var(--muted); }
.appr-list { display: flex; flex-direction: column; gap: 8px; }
.appr-row { display: grid; grid-template-columns: minmax(0, 1.3fr) minmax(0, 1.5fr) auto; gap: 8px 14px; align-items: center; border: 1px solid var(--line); border-radius: 8px; padding: 8px 12px; background: var(--surface); }
.appr-row.s-pending { border-left: 4px solid var(--warn); }
.appr-row.s-approved { border-left: 4px solid var(--accent); }
.appr-row.s-rejected { border-left: 4px solid var(--bad); }
.appr-type { font-size: 12.5px; color: var(--muted); font-weight: 700; }
.appr-label { font-weight: 700; }
.appr-chips { display: flex; flex-wrap: wrap; gap: 6px; }
.appr-chip { display: inline-flex; align-items: center; gap: 5px; border: 1px solid var(--line); border-radius: 999px; padding: 2px 10px; font-size: 12.5px; background: var(--surface-2); }
.appr-chip.warn { border-color: var(--warn); }
.appr-chip.bad { border-color: var(--bad); color: var(--bad); }
.appr-chip.mute { opacity: .6; }
.appr-sign { width: 44px; height: 22px; object-fit: contain; }
.appr-actions { display: flex; gap: 6px; flex-wrap: wrap; justify-content: flex-end; }
.my-today { display: grid; grid-template-columns: minmax(0, 1.6fr) minmax(0, 1fr); gap: 12px; margin-bottom: 12px; }
.my-today .card h3 { display: flex; align-items: center; gap: 8px; }
.my-today .card h3 .btn { margin-left: auto; }
.my-count { background: var(--warn-soft); color: var(--warn); border-radius: 999px; padding: 0 9px; font-size: 13px; }
.my-tasks .appr-row { grid-template-columns: minmax(0, 1fr) auto; }
.my-tasks .appr-chips { grid-column: 1 / -1; }
.my-sec { margin: 8px 0 4px; font-size: 12.5px; color: var(--muted); }
.my-memo textarea { width: 100%; min-height: 150px; resize: vertical; font: inherit; line-height: 1.5; }
@media (max-width: 900px) { .my-today { grid-template-columns: 1fr; } .appr-row { grid-template-columns: 1fr; } .appr-actions { justify-content: flex-start; } }
.sign-pad canvas { width: 100%; max-width: 480px; aspect-ratio: 2 / 1; border: 1px dashed var(--line); border-radius: 8px; background: #fff; touch-action: none; display: block; }
.sign-img { max-height: 80px; max-width: 300px; background: #fff; border: 1px solid var(--line); border-radius: 6px; padding: 4px; }
.sign-pad .actions { margin-top: 6px; align-items: center; }
.appr-badge.has { background: var(--warn); border-color: var(--warn); color: #fff; font-weight: 800; }
/* 2026-10-02 결재 칸 미리보기(실제 결재 칸 1.5배 — 서명 자리 2:1) */
table.appr-stamp-preview { border-collapse: collapse; background: #fff; color: #000; margin-top: 4px; width: auto; table-layout: fixed; }
.appr-stamp-preview th, .appr-stamp-preview td { border: 1px solid #000; text-align: center; }
.appr-stamp-preview th { width: 22px; font-size: 13px; line-height: 1.35; padding: 3px; font-weight: 700; }
.appr-stamp-preview td { width: 126px; }
.appr-stamp-preview .nm { font-size: 13px; padding: 3px 4px; }
.appr-stamp-preview .sg { height: 63px; padding: 1px 3px; }
.appr-stamp-preview .sg img { width: 120px; height: 60px; object-fit: contain; display: block; margin: 0 auto; }
.appr-stamp-preview .sg b { color: #1f3864; }
.appr-stamp-preview .dt { font-size: 12px; padding: 2px; }
.sign-pad > .hint { margin: 10px 0 4px; }
/* 2026-10-02 단위 매 · m × 롤: 합계 줄은 칸 한 줄 전체 */
.grid > .qty-total { grid-column: 1 / -1; margin: -2px 0 4px; font-weight: 600; color: var(--ink); }
/* 2026-10-02 동판 둘레 × 폭: 원단 두께 × 폭 밑에 괄호로(인쇄 스케줄 · 작업스케줄표 인쇄 카드 · 출력) */
.plate-size { display: inline-block; color: var(--muted); font-size: .85em; white-space: nowrap; }
.ts-film .ts-plate { display: block; font-size: .85em; color: #333; margin-top: 1px; }
/* 2026-10-02 자재 현황 › 원단 재고(간단): 규격 한 줄 · 길이마다 "몇 m × 몇 롤" · [실사] */
.film-stock-head { display: flex; flex-wrap: wrap; gap: 8px 12px; align-items: center; margin-bottom: 10px; }
.film-stock-head input[type="search"] { min-width: 220px; }
.film-stock-head .btn { margin-left: auto; }
table.film-stock td { vertical-align: top; }
table.film-stock .film-qty div + div { margin-top: 2px; }
table.film-stock .film-qty b { font-variant-numeric: tabular-nums; }
table.film-stock .film-act { text-align: right; width: 1%; white-space: nowrap; }
table.film-count { width: auto; margin: 6px 0 12px; }
table.film-count th, table.film-count td { padding: 6px 10px; }
table.film-count input[type="number"] { width: 90px; }
table.film-count input[name="new_length"] { width: 120px; }
/* 2026-10-02 고객 지급 원단·동판 입고 (업무진행현황 상세) */
.supply-box { display: flex; flex-wrap: wrap; gap: 6px 8px; align-items: center; margin: 8px 0; padding: 8px 10px; border: 1px solid var(--line); border-radius: 8px; }
/* 2026-10-02 원단 규격 중복 합치기 */
.dup-notice { display: flex; flex-wrap: wrap; gap: 6px 10px; align-items: center; margin: 0 0 10px; padding: 8px 12px; border: 1px solid var(--warn); border-radius: 8px; background: var(--warn-soft); }
.dup-notice .btn { margin-left: auto; }
.dup-group { border: 1px solid var(--line); border-radius: 8px; padding: 8px 10px; margin: 0 0 10px; }
table.dup-table td, table.dup-table th { vertical-align: middle; }
.warn-box { margin: 4px 0 8px; padding: 6px 10px; border-radius: 6px; background: var(--warn-soft); color: var(--warn); font-weight: 600; }
/* 2026-10-02 작업스케줄표 메모 하이라이트(화면·출력) · 출력용 재고/입고 글자 */
mark.ts-note { background: #ffe86b; color: #111; font-weight: 700; padding: 0 5px; border-radius: 3px; -webkit-print-color-adjust: exact; print-color-adjust: exact; box-decoration-break: clone; -webkit-box-decoration-break: clone; }
.ts-src.ts-avail { font-weight: 700; }
/* 2026-10-06 납품 동선 확인(자차 반대 방향) */
.ship-cal td.route-bad { box-shadow: inset 0 0 0 2px var(--bad); }
.route-warn { display: inline-block; margin: 1px 0 3px; padding: 0 6px; border-radius: 999px; background: var(--bad); color: #fff; font-size: 11.5px; font-weight: 800; }
.route-box { margin: 0 0 10px; padding: 8px 12px; border: 1px solid var(--bad); border-radius: 8px; background: #fff1f1; color: #7a1010; line-height: 1.5; }
.route-box > b:first-child { margin-right: 6px; }

/* 2026-10-06 사용자 "목록 머리글(수주번호·거래처·제품·납기·상태) 눌러서 정렬": table-sort.mjs. 누를 때마다 ▲ 오름 → ▼ 내림 → 원래 순서. 입력 칸 있는 표는 정렬 안 함 */
.tbl th[data-sort] { cursor: pointer; user-select: none; }
.tbl th[data-sort]:hover { color: var(--accent-soft-ink); }
.tbl th[data-sort]::after { content: "↕"; margin-left: 3px; font-size: 10px; opacity: .3; }
.tbl th[aria-sort="ascending"]::after { content: "▲"; opacity: .85; }
.tbl th[aria-sort="descending"]::after { content: "▼"; opacity: .85; }
.tbl table:has(tbody :is(input, select, textarea)) th[data-sort], .tbl table[data-nosort] th[data-sort] { cursor: default; }
.tbl table:has(tbody :is(input, select, textarea)) th[data-sort]::after, .tbl table[data-nosort] th[data-sort]::after { content: none; }
@media print { .tbl th[data-sort]::after { content: none; } .tbl th[aria-sort]::after { content: none; } }

/* 2026-10-06 납품 스케줄: [보기] 체크(자차·용차·택배·업체 배차·납기·납기 변경, 기본 납기 변경 끔) · 직접 추가한 납품(점선) · [＋ 납품 추가] 창 */
.ship-show { flex-wrap: wrap; margin: 0 0 8px; }
.ship-show > .hint { font-weight: 600; margin-right: 2px; }
.ship-show label.cal-ev.ship[class*="m-"] > b { padding: 0 5px; border-radius: 3px; color: #fff; }
.ship-show label.cal-ev.m-own > b { background: #187a4c; } .ship-show label.cal-ev.m-hired > b { background: #2f62c4; } .ship-show label.cal-ev.m-courier > b { background: #7a45c4; } .ship-show label.cal-ev.m-pickup > b { background: #5a5f66; }
.cal-ev.manual { outline: 1px dashed currentColor; outline-offset: -1px; }
.ship-add .seg { display: flex; flex-wrap: wrap; gap: 6px 16px; margin-bottom: 10px; font-weight: 600; }
.ship-add .seg label { display: inline-flex; align-items: center; gap: 6px; cursor: pointer; }
@media print { .ship-show { display: none; } }

/* 2026-10-06 Q175 A · Q176 A: 홈 교정대기·원단대기 [교정 완료]·[원단 있음], 상세 '인쇄 전 준비', [원단 있음] 창 두 갈래 */
.stage-list td:last-child { white-space: nowrap; text-align: right; }
.prep-box { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin: 8px 0; padding: 8px 10px; border: 1px dashed var(--line-strong, #c9d2cc); border-radius: 6px; }
.prep-box .prep-film-note { margin: 0; flex-basis: 100%; }
.prep-choice { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 12px; }
.prep-choice section { border: 1px solid var(--line, #d9e0db); border-radius: 8px; padding: 10px 12px; }
.prep-choice h4 { margin: 0 0 4px; }

/* 2026-10-06 [＋ 납품 추가] 여러 제품·품목 줄 */
.ship-add-row { align-items: end; }
.ship-add-row + .ship-add-row { margin-top: 4px; }
.ship-add-x { align-self: end; justify-self: start; margin-bottom: 6px; }

/* 2026-10-07 원단 발주 목록(입고 대기): 규격·롤은 한 줄, 연결 제품은 아랫줄, 발주번호 한 줄 */
.po-spec { white-space: nowrap; }
.po-spec + .po-spec-for, .po-spec-for + .po-spec { margin-top: 2px; }
.po-spec-for { margin: 0 0 4px; }
.po-no { white-space: nowrap; }

/* 2026-10-07 인쇄·가공 스케줄 출력 = 엑셀 일정표와 카드를 섞은 표(schedules.mjs hyPrintColumns·hyConvColumns): 굵은 큰 글씨 + 작은 보조, 줄바꿈(안 잘림), 메모 형광, 빈 줄 */
.schedule-hybrid .hy-table { width: 100%; table-layout: fixed; border-collapse: collapse; }
.schedule-hybrid .hy-table th { background: #eef2ef; font-size: 12px; font-weight: 700; text-align: center; padding: 5px 4px; }
.schedule-hybrid .hy-table td { vertical-align: middle; padding: 6px 7px; word-break: keep-all; overflow-wrap: anywhere; white-space: normal; font-size: 12px; }
.schedule-hybrid .hy-table tbody tr { break-inside: avoid; }
.schedule-hybrid .hy-big { display: block; font-size: 15px; font-weight: 700; line-height: 1.3; color: #111; }
.schedule-hybrid .hy-small { display: block; font-size: 11px; line-height: 1.4; color: #555; margin-top: 2px; }
.schedule-hybrid .hy-no { display: block; text-align: center; font-size: 16px; font-weight: 700; }
.schedule-hybrid .hy-spec { display: block; font-size: 14px; font-weight: 700; line-height: 1.45; color: #111; } /* 원단 규격 2줄(색상-형태 (n도) / 두께um × 폭mm (피치)) */
.schedule-hybrid .hy-kind { display: inline-block; padding: 0 4px; border: 1px solid #b26b00; border-radius: 3px; color: #8a5200; font-size: 10.5px; font-weight: 700; }
.schedule-hybrid .hy-tag { display: inline-block; margin-top: 2px; padding: 0 5px; border-radius: 4px; font-size: 11px; font-weight: 700; border: 1.5px solid #9aa39d; color: #555; }
.schedule-hybrid .hy-tag.hot { border-color: #c62828; color: #c62828; } .schedule-hybrid .hy-tag.over { background: #111; border-color: #111; color: #fff; }
.schedule-hybrid .hy-memo { display: block; background: #fff0a8; border-left: 3px solid #e0b000; padding: 2px 6px; font-size: 13.5px; font-weight: 700; line-height: 1.35; color: #3d3000; -webkit-print-color-adjust: exact; print-color-adjust: exact; }
.schedule-hybrid .hy-memo + .hy-small { margin-top: 4px; }
.schedule-hybrid .hy-auto { color: #1f4f8a; font-weight: 600; }
.schedule-hybrid .hy-route b { text-decoration: underline; text-underline-offset: 2px; }
.schedule-hybrid .hy-route s { color: #888; font-weight: 400; }
@media print { .schedule-hybrid .hy-table th { -webkit-print-color-adjust: exact; print-color-adjust: exact; } }

/* 2026-10-07 B안: 메모 = 제품 바로 아래 표 폭 전체 형광 띠, 원단 규격·원단 롤 3줄, 납품 칸은 내용 폭 */
.schedule-hybrid tr.hy-memo-row td { background: #fff0a8; border-top: 0; padding: 4px 10px; font-size: 13.5px; font-weight: 700; line-height: 1.35; color: #3d3000; -webkit-print-color-adjust: exact; print-color-adjust: exact; }
.schedule-hybrid .hy-memo-label { display: inline-block; margin-right: 6px; padding: 0 5px; border: 1px solid #b38900; border-radius: 3px; font-size: 11px; color: #6b5100; }
.schedule-hybrid tr.hy-row.has-memo > td:not([rowspan]) { border-bottom-style: dashed; } /* 번호 칸(메모 띠까지 세로로 합친 칸) 아래 선은 실선 */
.schedule-hybrid tr.hy-row > td:last-child { text-align: center; }
.schedule-hybrid .hy-tag { margin-top: 1px; }

/* 2026-10-07 오늘 입·출고(Q177~Q181): 오늘 할 일 내 할 일 · 내 메모장 사이 3등분 카드 + A4 세로 확인표 */
.my-today.has-io { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.my-io h3 { flex-wrap: wrap; }
.my-io .io-day { font-size: 13px; font-weight: 600; color: var(--muted, #667); }
.my-io .io-nav { display: inline-flex; gap: 2px; margin-left: auto; }
.my-io h3 .io-nav .btn, .my-io h3 [data-io-print] { margin-left: 0; padding: 2px 8px; }
.my-io .io-list { max-height: 360px; overflow: auto; padding: 2px 14px 10px; }
.my-io .io-sec { margin: 6px 0 4px; font-size: 13px; font-weight: 700; display: flex; align-items: center; gap: 6px; }
.my-io .io-sec:first-child { margin-top: 0; }
.io-row { display: flex; align-items: center; gap: 6px; padding: 4px 0; border-bottom: 1px solid var(--line, #e5e7eb); min-width: 0; }
.io-row .io-text { flex: 1; min-width: 0; display: flex; flex-direction: column; }
.io-row .io-main, .io-row small { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.io-row .io-main { font-size: 13px; } .io-row small { font-size: 11.5px; color: var(--muted, #667); }
.io-row .link-btn { font-size: 13px; }
.io-row.done { opacity: .6; } .io-row.done .io-main b::before { content: '✓ '; color: var(--accent, #1a7f4b); }
.io-row.late small { color: var(--bad, #c62828); }
.io-kind { flex: none; font-size: 11px; font-weight: 700; padding: 1px 6px; border-radius: 4px; background: #eef2ef; color: #3f4349; white-space: nowrap; }
.io-kind.k-film, .io-kind.k-cfilm { background: #e3ecfb; color: #234f9e; } .io-kind.k-plate, .io-kind.k-cplate { background: #fdf0dc; color: #8a5200; }
.io-kind.k-out { background: #efe6fb; color: #6235a3; } .io-kind.k-due { background: #fde8e8; color: #a12020; }
.io-row .meth-tag { flex: none; }
.io-late { margin: 2px 0 4px; } .io-late summary { cursor: pointer; font-size: 12px; font-weight: 700; color: var(--bad, #c62828); }
.io-paper .io-h { font-size: 15px; margin: 12px 0 4px; } .io-paper .io-h.late { font-size: 13px; color: #a12020; }
.io-paper .io-table { width: 100%; table-layout: fixed; border-collapse: collapse; }
.io-paper .io-table th, .io-paper .io-table td { border: 1px solid #9aa39d; padding: 5px 6px; font-size: 12px; vertical-align: middle; word-break: keep-all; overflow-wrap: anywhere; }
.io-paper .io-table th { background: #eef2ef; font-weight: 700; text-align: center; }
.io-paper .io-table td.io-check { text-align: center; font-size: 16px; } .io-paper .io-table td.io-qty { text-align: right; }
.io-paper .io-table tr.done td { color: #666; } .io-paper .io-table td.io-none { text-align: center; color: #888; }
.io-paper .io-table tr { break-inside: avoid; }
@media (max-width: 1200px) { .my-today.has-io { grid-template-columns: repeat(2, minmax(0, 1fr)); } .my-today.has-io .my-memo { grid-column: 1 / -1; } }
@media (max-width: 900px) { .my-today.has-io { grid-template-columns: 1fr; } }

/* 2026-10-07 납품 덩어리 · 자차 오전/오후 회차(Q188~Q197, ship-bundles.mjs) — 납품 스케줄 날짜 창 */
.runs { border: 1px solid var(--line, #dfe4e1); border-radius: 10px; padding: 8px; margin: 6px 0 8px; background: #fbfcfb; }
.runs-h { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 4px; }
.runs-h [data-bundle-suggest] { margin-left: auto; }
.run { border-radius: 8px; padding: 6px 8px; margin-top: 6px; border: 1px solid #e3e7e4; }
.run.am { background: #f5f8fe; border-color: #b9cdf0; } .run.pm { background: #fff9f3; border-color: #f2cfa8; } .run.none { background: #fff; }
.run-h { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; font-size: 13px; margin-bottom: 4px; }
.run-chip { font-size: 12px; font-weight: 700; padding: 1px 8px; border-radius: 5px; color: #fff; background: #6b7570; }
.run-chip.am { background: #2f5fbf; } .run-chip.pm { background: #d9771f; }
.run-warn { font-size: 12px; font-weight: 700; color: #8a5a00; background: #fff6dc; border: 1px solid #f0d58a; border-radius: 5px; padding: 0 6px; }
.run-bad { font-size: 12px; font-weight: 700; color: #a12020; background: #fde8e8; border-radius: 5px; padding: 0 6px; }
.bdl { background: #fff; border: 1px solid #d9dfdb; border-radius: 8px; margin: 6px 0; padding: 6px 8px; }
.bdl.done { opacity: .75; }
.bdl-h { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; font-size: 13px; }
.bdl-no { font-size: 16px; font-weight: 700; }
.bdl-act { margin-left: auto; display: inline-flex; align-items: center; gap: 4px; flex-wrap: wrap; }
.bdl-addr { margin: 2px 0 0 2px; }
.bdl ul { margin: 4px 0 0; padding-left: 18px; } .bdl li { margin: 2px 0; } .bdl-li-act { display: flex; gap: 12px; align-items: center; flex-wrap: wrap; } .bdl-li-act .cd-note { margin: 0; }
.slot-seg { display: inline-flex; border: 1px solid #c9d0cc; border-radius: 6px; overflow: hidden; }
.slot-seg button { border: 0; background: #fff; font-size: 12px; padding: 2px 9px; cursor: pointer; }
.slot-seg button.on.am { background: #2f5fbf; color: #fff; } .slot-seg button.on.pm { background: #d9771f; color: #fff; }
.slot-pick label { margin-right: 10px; white-space: nowrap; }
.bdl-rows { display: grid; gap: 6px; } .bdl-row { display: grid; grid-template-columns: minmax(0, 1fr) 180px; gap: 8px; align-items: center; }
.bdl-ship { width: 100%; border-collapse: collapse; margin-top: 8px; font-size: 13px; } .bdl-ship th, .bdl-ship td { border-bottom: 1px solid var(--line, #e5e8e6); padding: 5px 6px; text-align: left; }
.bdl-ship .num { text-align: right; white-space: nowrap; } .bdl-ship input { width: 110px; text-align: right; }

/* 2026-10-07 자차 지도(Q184 B OpenStreetMap · Leaflet, ship-map.mjs) */
.runs-btns { margin-left: auto; display: inline-flex; gap: 4px; flex-wrap: wrap; } .runs-h [data-bundle-suggest] { margin-left: 0; }
.ship-map { height: 360px; border: 1px solid var(--line, #d5dbd7); border-radius: 8px; margin: 6px 0; background: #eef2ef; overflow: hidden; }
.ship-map > .hint { padding: 12px; } .ship-map.empty { height: auto; background: #fff8e8; border-color: #f0d58a; }
.ship-map-box { margin: 0 0 8px; border: 1px solid var(--line, #dfe4e1); border-radius: 8px; padding: 6px 10px; background: #fbfcfb; }
.ship-map-box summary { cursor: pointer; font-size: 13px; } .ship-map-box .ship-map { height: 380px; }
.map-pin { color: #fff; border: 2px solid #fff; border-radius: 50% 50% 50% 0; transform: rotate(-45deg); width: 26px; height: 26px; display: flex; align-items: center; justify-content: center; box-shadow: 0 1px 4px rgba(0,0,0,.4); }
.map-pin b { transform: rotate(45deg); font-size: 13px; }
.map-home { background: #111; color: #fff; font-weight: 700; font-size: 11px; border-radius: 3px; width: 18px; height: 18px; display: flex; align-items: center; justify-content: center; }
.leaflet-tooltip.map-lbl { background: #fff; border: 1px solid #4b5550; color: #111; font-weight: 700; font-size: 12px; padding: 1px 6px; border-radius: 4px; box-shadow: none; }
.ship-map-paper .ship-map.print { height: 330px; } .ship-map-paper .map-run h2 { font-size: 14px; margin: 10px 0 4px; display: flex; align-items: center; gap: 8px; }
.ship-map-paper table { width: 100%; border-collapse: collapse; font-size: 12px; table-layout: fixed; } .ship-map-paper td { word-break: keep-all; overflow-wrap: anywhere; } .ship-map-paper th, .ship-map-paper td { border: 1px solid #9aa39d; padding: 4px 6px; vertical-align: middle; }
.ship-map-paper th { background: #eef2ef; } .ship-map-paper td.ck { text-align: center; font-size: 16px; width: 28px; } .ship-map-paper td.no { text-align: center; font-weight: 700; width: 30px; } .ship-map-paper .num { text-align: right; white-space: nowrap; }
@media print { .ship-map-paper .leaflet-control-zoom { display: none; } .ship-map-paper .map-run { break-inside: avoid; } }

/* 2026-10-07 팀별 작업스케줄표 출력 = 섞은 표(teams.mjs renderTeamSchedule) — 세로 A4라 글씨 조금 작게 */
.team-schedule.schedule-hybrid .hy-big { font-size: 14px; } .team-schedule.schedule-hybrid .hy-spec { font-size: 12.5px; }
.team-schedule.schedule-hybrid .hy-table td { padding: 5px 6px; } .team-schedule.schedule-hybrid .hy-no { font-size: 15px; }
.team-schedule.schedule-hybrid .hy-small b { color: #111; }
/* 옛 팀별 표(카드 전 표)의 칸 너비 규칙(th/td:nth-child · td.due)이 섞은 표의 colgroup 너비를 덮지 않게 */
.team-schedule.schedule-hybrid .hy-table th, .team-schedule.schedule-hybrid .hy-table td { width: auto; white-space: normal; padding-right: 6px; }

/* 2026-10-07 오늘 할 일 위 세 칸(내 할 일 · 입·출고 · 메모장) 높이 맞춤 + 결재는 한 줄씩(사용자) — 넘치면 칸 안에서 스크롤 */
.my-today .io-sec { margin: 6px 0 4px; font-size: 13px; font-weight: 700; display: flex; align-items: center; gap: 6px; }
.my-today .my-list > .io-sec:first-child { margin-top: 0; }
.my-tasks .my-list { padding: 2px 14px 10px; }
.appr-mini .io-kind.k-appr { background: #e8eef9; color: #234f9e; }
.appr-mini.s-rejected .io-main, .appr-mini.s-rejected small { color: var(--bad, #c62828); }
.appr-mini .btn { flex: none; }
@media (min-width: 1201px) {
  .my-today.has-io { grid-auto-rows: 380px; align-items: stretch; }
  .my-today.has-io > .card { display: flex; flex-direction: column; min-height: 0; overflow: hidden; margin: 0; }
  .my-today.has-io > .card > h3 { flex: none; }
  .my-today.has-io .my-list, .my-today.has-io .my-io .io-list { flex: 1; min-height: 0; max-height: none; overflow: auto; }
  .my-today.has-io .my-memo textarea { flex: 1; min-height: 0; resize: none; }
}

/* 2026-10-07 진행 단계 = 시안 C(컬러 타일) — 오늘 할 일 셋째 칸 위, 메모장은 그 아래 작게. 아이콘·'건'은 CSS로(글자 내용은 예전 단계 상자와 같음) */
.my-memo.has-stages { display: flex; flex-direction: column; }
.my-memo.has-stages > h3 { flex: none; }
.my-stages { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; padding: 2px 14px 6px; }
.stage-tile.kpi { margin: 0; min-height: 0; padding: 7px 10px; border-radius: 10px; cursor: pointer; box-shadow: none; border: 1.5px solid #e6eae8; background: #f6f7f6; }
.stage-tile .l { display: block; font-size: 12.5px; font-weight: 700; color: #9aa39d; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.stage-tile .l::before { margin-right: 4px; font-size: 13px; }
.stage-tile.s-proof .l::before { content: '✎'; } .stage-tile.s-film .l::before { content: '◎'; } .stage-tile.s-print .l::before { content: '▤'; }
.stage-tile.s-conversion .l::before { content: '✂'; } .stage-tile.s-outsource .l::before { content: '⇄'; } .stage-tile.s-delivery .l::before { content: '➜'; }
.stage-tile .n { display: block; font-size: 25px; font-weight: 800; line-height: 1.15; color: #c5ccc8; }
.stage-tile .n::after { content: '건'; font-size: 12px; font-weight: 600; color: #667; margin-left: 3px; }
.stage-tile .stage-sub { font-size: 10.5px; margin-top: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.stage-tile.s-proof { --c: #7c3aed; --bg1: #f3eefe; --bg2: #e7dcfc; } .stage-tile.s-film { --c: #0e7490; --bg1: #e9f5f7; --bg2: #d3ebef; } .stage-tile.s-print { --c: #1d4ed8; --bg1: #edf1fd; --bg2: #d9e2fb; }
.stage-tile.s-conversion { --c: #b45309; --bg1: #fdf3e7; --bg2: #f9e3c8; } .stage-tile.s-outsource { --c: #6b21a8; --bg1: #f5eefa; --bg2: #e9daf3; } .stage-tile.s-delivery { --c: #15803d; --bg1: #eaf6ee; --bg2: #d2ecdb; }
.stage-tile.has { background: linear-gradient(135deg, var(--bg1), var(--bg2)); border-color: var(--c); border-color: color-mix(in srgb, var(--c) 45%, #fff); }
.stage-tile.has .l { color: var(--c); } .stage-tile.has .n { color: #111; }
.stage-tile.on { outline: 2.5px solid var(--c); outline-offset: 1px; }
.stage-tile:hover { filter: brightness(.98); } .stage-tile:focus-visible { outline: 2.5px solid var(--c); outline-offset: 1px; }
.my-memo.has-stages .memo-h { display: flex; align-items: baseline; gap: 6px; padding: 6px 14px 4px; font-size: 13px; }
.my-memo.has-stages textarea { margin: 0 14px 12px; width: auto; min-height: 70px; }
@media (min-width: 1201px) { .my-today.has-io .my-memo.has-stages textarea { flex: 1; min-height: 0; } }

/* 2026-10-07 Q204 A · Q205 A: 진행 중인 수주 N건 + 세 묶음(원단 준비 · 생산 중 · 출고 준비) + 단계 칩 — 오늘 할 일 셋째 칸 */
.my-memo.has-stages > h3 .stage-title { display: inline-flex; align-items: baseline; gap: 3px; } /* 제목·숫자·건을 한 덩어리로(h3가 양끝 정렬이라 벌어지던 것) */ .my-memo.has-stages > h3 .stage-total { font-size: 21px; color: #111; margin-left: 2px; } .my-memo.has-stages > h3 .stage-unit { font-size: 12px; color: #667; }
.stage-bar { display: flex; height: 9px; border-radius: 5px; overflow: hidden; margin: 0 14px 8px; background: #eef1ef; }
.stage-bar i { display: block; height: 100%; } .stage-bar i.g-prep { background: #0e7490; } .stage-bar i.g-make { background: #1d4ed8; } .stage-bar i.g-ship { background: #15803d; }
.stage-groups { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.stage-group { --c: #6b7570; --b1: #f6f7f6; --b2: #eef1ef; display: flex; flex-direction: column; gap: 2px; min-width: 0; border-radius: 10px; padding: 7px 9px; cursor: pointer; border: 1.5px solid #e6eae8; background: #f6f7f6; }
.stage-group.g-prep { --c: #0e7490; --b1: #e9f5f7; --b2: #d3ebef; } .stage-group.g-make { --c: #1d4ed8; --b1: #edf1fd; --b2: #d9e2fb; } .stage-group.g-ship { --c: #15803d; --b1: #eaf6ee; --b2: #d2ecdb; }
.stage-group.has { background: linear-gradient(135deg, var(--b1), var(--b2)); border-color: color-mix(in srgb, var(--c) 45%, #fff); }
.stage-group .gl { font-size: 12.5px; font-weight: 700; color: #9aa39d; white-space: nowrap; } .stage-group.has .gl { color: var(--c); }
.stage-group.g-prep .gl::before { content: '◎ '; } .stage-group.g-make .gl::before { content: '▤ '; } .stage-group.g-ship .gl::before { content: '➜ '; }
.stage-group .gn { font-size: 25px; font-weight: 800; line-height: 1.1; color: #c5ccc8; } .stage-group.has .gn { color: #111; }
.stage-group .gn::after { content: '건'; font-size: 12px; font-weight: 600; color: #667; margin-left: 3px; }
.stage-group .chips { display: flex; flex-wrap: wrap; gap: 4px; }
.stage-chip { font: inherit; font-size: 11px; line-height: 1.5; border-radius: 9px; padding: 0 7px; background: #fff; border: 1px solid #e1e6e3; color: #aab2ad; cursor: pointer; }
.stage-chip.has { color: #111; border-color: color-mix(in srgb, var(--c) 40%, #fff); } .stage-chip .n { font-weight: 800; }
.stage-chip .stage-sub { display: inline; font-size: 10.5px; color: #556; }
.stage-chip.on { background: var(--c); color: #fff; border-color: var(--c); } .stage-chip.on .stage-sub { color: #fff; }
.stage-group.on { outline: 2.5px solid var(--c); outline-offset: 1px; } .stage-group:focus-visible { outline: 2.5px solid var(--c); outline-offset: 1px; }
.stage-group .gh { font-size: 10.5px; color: #667; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

/* 2026-10-07 Q198 A: 인쇄 [완료] 창 '사용한 원단'(film-use.mjs) — 한 줄 = 원단 고르기 · 쓴 롤 · 남은 m · [×] */
.film-use { margin-top: 10px; padding-top: 8px; border-top: 1px dashed #dfe4e1; }
.film-use-row { grid-template-columns: minmax(0, 1fr) 92px 150px auto; align-items: end; }
.film-use-row + .film-use-row { margin-top: 4px; }
.film-use-row > .f[hidden] { display: none; }
.film-use-row:has(> .f[hidden]) { grid-template-columns: minmax(0, 1fr) 150px auto; }
.film-use-more { display: flex; align-items: center; gap: 10px; margin: 6px 0 2px; }
.film-use-total { font-size: 13px; color: var(--ink); }
@media (max-width: 640px) { .film-use-row, .film-use-row:has(> .f[hidden]) { grid-template-columns: 1fr 1fr auto; } .film-use-row > .f:first-child { grid-column: 1 / -1; } }

/* 2026-10-07 동판 발주 목록 줄 단추(plate-order-records.mjs) — 원단 발주처럼 [발주서] [입고] [수정] [취소] [변경 이력] */
.po-acts { display: inline-flex; flex-wrap: wrap; gap: 4px; }
[data-plate-history] td:first-child { white-space: nowrap; font-weight: 600; }

/* 2026-10-07 Q208 A: 원단 발주서 작성 — 원단만 담은 줄 아래 '이 원단을 쓰는 진행 중 수주(원단 발주 전)' + [이 수주에 연결] */
.po-link-hint { display: flex; flex-direction: column; gap: 4px; margin: 2px 0 8px; padding: 8px 10px; border-radius: 8px; background: #fff7e8; border: 1px solid #f2d9a8; color: #6b4a12; }
.po-link-hint .po-link-cand { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; color: #2d2a24; }
.po-link-hint .po-link-cand .btn { margin-left: auto; }

/* 2026-10-07 오늘 할 일 — 월 달력 자리에 이번 주 납품(시안 2 · 요일별 목록, home-week.mjs) */
.card.home-week { padding: 0; overflow: hidden; }
.home-week .hw-head { display: flex; align-items: center; gap: 8px 14px; flex-wrap: wrap; padding: 10px 16px; border-bottom: 1px solid var(--line, #e5e7eb); }
.home-week .hw-head h3 { display: block; margin: 0; padding: 0; border: 0; font-size: 15px; font-weight: 700; color: var(--ink, #1d2420); text-transform: none; letter-spacing: 0; }
.home-week .hw-range { margin-left: 4px; font-size: 13px; font-weight: 500; color: var(--muted, #667); }
.home-week .hw-legend { display: flex; gap: 5px; flex-wrap: wrap; align-items: center; }
.home-week .hw-head .actions { margin-left: auto; display: flex; gap: 6px; flex-wrap: wrap; }
.home-week .hw-list { padding: 2px 16px 8px; }
.hw-day { border-bottom: 1px solid var(--line, #eef1ef); padding: 7px 0; }
.hw-day:last-child { border-bottom: 0; }
.hw-dh { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; font-size: 13.5px; min-height: 22px; }
.hw-date { font-weight: 700; } .hw-date.sat { color: #2f62c4; } .hw-date.sun, .hw-date.hol { color: var(--bad, #c62828); }
.hw-hol { font-size: 11.5px; font-weight: 700; color: var(--bad, #c62828); }
.hw-n { color: var(--muted, #667); font-weight: 600; font-size: 12.5px; }
.hw-now { background: var(--accent, #187a4c); color: #fff; font-size: 11px; font-weight: 700; border-radius: 8px; padding: 0 7px; }
.hw-sum { font-size: 12px; font-weight: 700; } .hw-sum.ok { color: var(--accent, #187a4c); } .hw-sum.late { color: var(--bad, #c62828); }
.hw-mc { display: inline-block; font-size: 11px; font-weight: 700; border-radius: 10px; padding: 1px 7px; white-space: nowrap; background: #eeeff1; color: #3f4349; }
.hw-mc.m-own { background: var(--accent-soft, #e6f4ec); color: var(--accent-soft-ink, #166b44); } .hw-mc.m-hired { background: #e3ecfb; color: #234f9e; }
.hw-mc.m-courier { background: #efe6fb; color: #6235a3; } .hw-mc.m-pickup { background: #eeeff1; color: #3f4349; } .hw-mc.due { background: #fff3e0; color: #b25e09; }
.hw-fold { margin-left: auto; font-size: 12px; font-weight: 700; text-decoration: none; }
.hw-day.past:not(.open) .hw-dh, .hw-day.empty .hw-dh { opacity: .75; }
.hw-day.today { background: #f4faf6; margin: 0 -16px; padding: 7px 16px 7px 12px; border-left: 4px solid var(--accent, #187a4c); }
.hw-table { width: 100%; border-collapse: collapse; margin-top: 5px; font-size: 12.5px; }
.hw-table td { padding: 4px 6px; border-top: 1px solid #f0f2f1; vertical-align: top; }
.hw-table tr.g-first td { border-top-color: var(--line, #e2e6e4); }
.hw-table td.m { width: 92px; white-space: nowrap; } .hw-table td.p { width: 140px; } .hw-table td.q { width: 110px; text-align: right; white-space: nowrap; }
.hw-table td.a { width: 28%; color: var(--muted, #667); font-size: 11.5px; } .hw-table td.s { width: 128px; text-align: right; white-space: nowrap; }
.hw-table td.i .link-btn { text-decoration: none; color: inherit; } .hw-table td.i .link-btn:hover { text-decoration: underline; color: var(--accent, #187a4c); }
.hw-table tr.done td { color: var(--muted, #8a948f); } .hw-table tr.done td.i .link-btn { color: var(--muted, #8a948f); }
.hw-table tr.due td { background: #fffaf2; }
.hw-st { font-size: 11.5px; font-weight: 700; } .hw-st.ok { color: var(--accent, #187a4c); } .hw-st.part, .hw-st.wait, .hw-st.due { color: #b25e09; }
.hw-st.late { color: var(--bad, #c62828); } .hw-st.mute { color: var(--muted, #667); }
.hw-slot { margin-left: 4px; font-size: 11px; font-weight: 700; color: var(--accent-soft-ink, #166b44); }
.hw-note { color: #8a5200; cursor: help; }
.meth-tag.m-none { padding: 0 5px; border-radius: 3px; background: #fff; color: #8a5200; border: 1px dashed #c98a2e; }
@media (max-width: 760px) { .hw-table td.a { display: none; } .home-week .hw-head .actions { margin-left: 0; } .hw-table td.p { width: auto; } }
/* 2026-10-07 전달 메모(Q209~Q213 A, 사용자 "내 할 일을 절반으로 나누고 거기다"): 오늘 할 일 첫 칸 = 위 전달 메모 · 아래 내 할 일 */
.my-tasks.has-msg { display: flex; flex-direction: column; }
.my-tasks.has-msg > .memo-msg { flex: 1 1 0; min-height: 0; display: flex; flex-direction: column; border-bottom: 1px solid var(--line, #e5e7eb); }
.my-tasks.has-msg > h3 { flex: none; }
.my-tasks.has-msg > .my-list { flex: 0 1 auto; max-height: 50%; min-height: 0; overflow: auto; } /* 내 할 일은 내용만큼(많으면 절반까지), 남는 자리는 전달 메모 */
.memo-msg .mm-h { flex: none; flex-wrap: wrap; }
.memo-msg .mm-h .btn { margin-left: auto; }
.mm-count { background: var(--warn-soft); color: var(--warn); border-radius: 999px; padding: 0 9px; font-size: 13px; } /* 내 할 일 .my-count와 같은 모양(이름만 따로) */
.mm-count.alert { background: var(--bad, #c62828); color: #fff; font-weight: 800; }
.memo-msg .mm-seg { display: inline-flex; border: 1px solid var(--line-strong, #cfd6d2); border-radius: 6px; overflow: hidden; }
.memo-msg .mm-seg button { font: inherit; font-size: 11.5px; border: 0; background: var(--surface, #fff); padding: 1px 8px; color: var(--muted, #556); cursor: pointer; }
.memo-msg .mm-seg button.on { background: var(--accent, #187a4c); color: #fff; font-weight: 700; }
.memo-msg .mm-list { flex: 1; min-height: 0; overflow: auto; padding: 8px 14px; }
.mm-row { display: flex; gap: 7px; align-items: flex-start; padding: 5px 7px; border-radius: 7px; margin-bottom: 4px; background: #fff8e1; border: 1px solid #f3dd9b; cursor: pointer; }
.mm-row input { margin-top: 2px; width: 16px; height: 16px; accent-color: var(--accent, #187a4c); flex: none; cursor: pointer; }
.mm-row .mm-t { display: flex; flex-direction: column; min-width: 0; flex: 1; }
.mm-row .mm-body { font-size: 13px; color: var(--ink, #1d2420); line-height: 1.4; white-space: pre-wrap; overflow-wrap: anywhere; }
.mm-row small { font-size: 11px; color: #7a6a3a; }
.mm-row.done { background: var(--surface-2, #f6f7f6); border-color: var(--line, #e6e9e7); }
.mm-row.done .mm-body { color: var(--muted, #8a948f); text-decoration: line-through; } .mm-row.done small { color: var(--muted, #8a948f); }
.mm-row.out { background: var(--surface, #fff); border-color: var(--line, #e3e7e5); cursor: default; }
.mm-row.out small .ok { color: var(--accent, #187a4c); font-weight: 700; } .mm-row.out small .wait { color: #b25e09; font-weight: 700; }
.mm-row .mm-cancel { flex: none; font-size: 12px; }
.mm-done summary { cursor: pointer; font-size: 12px; font-weight: 700; color: var(--accent-soft-ink, #166b44); margin: 2px 0 4px; }
.mm-empty { margin: 2px 0; }
.memo-badge.has { background: var(--bad, #c62828); border-color: var(--bad, #c62828); color: #fff; font-weight: 800; }
.mm-people { border: 0; padding: 0; margin: 0 0 12px; display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 6px 14px; }
.mm-people legend { font-size: 12.5px; color: var(--muted, #667); margin-bottom: 6px; padding: 0; }
.mm-people label { display: inline-flex; align-items: center; gap: 6px; font-size: 13.5px; white-space: nowrap; }
.mm-people label input { width: 16px; height: 16px; accent-color: var(--accent, #187a4c); }
.mm-people label small { color: var(--muted, #667); }
[data-msg-form] textarea { width: 100%; min-height: 110px; resize: vertical; font: inherit; line-height: 1.5; }
@media (max-width: 1200px) { .my-tasks.has-msg > .memo-msg { flex: none; max-height: 320px; } .my-tasks.has-msg > .my-list { flex: none; } }
/* 2026-10-08 작업 태그(Q214~Q217, Q217 C): 제품명 앞 검정 바탕 흰 글씨(급발주 빨강 · 재작업 보라) + 태그 있는 줄 왼쪽 굵은 세로띠, 급발주 줄은 옅은 빗금 — 흑백 출력에도 보이게 */
.job-tag { display: inline-block; margin-right: 5px; padding: 1px 7px; border-radius: 3px; background: #111; color: #fff; font-size: 12px; font-weight: 800; line-height: 1.45; vertical-align: 1px; white-space: nowrap; -webkit-print-color-adjust: exact; print-color-adjust: exact; }
.job-tag.t-urgent { background: #c62828; } .job-tag.t-rework { background: #5a2ca0; }
.schedule-hybrid .hy-big .job-tag { font-size: 12.5px; vertical-align: 2px; }
tr.tagged > td:first-child { border-left: 6px solid #111; -webkit-print-color-adjust: exact; print-color-adjust: exact; }
tr.urgent > td { background-image: repeating-linear-gradient(135deg, transparent 0 8px, rgba(0, 0, 0, .07) 8px 16px); -webkit-print-color-adjust: exact; print-color-adjust: exact; }
tr.urgent > td:first-child { border-left-color: #c62828; }
.tag-picks { display: flex; flex-wrap: wrap; gap: 10px 18px; margin-bottom: 10px; }
.tag-pick { display: inline-flex; align-items: center; gap: 5px; font-size: 13.5px; white-space: nowrap; }
.tag-pick input { width: 16px; height: 16px; accent-color: var(--accent, #187a4c); }
.order-tags .v { display: flex; flex-wrap: wrap; gap: 6px 14px; align-items: center; min-height: var(--control-h, 34px); }

/* 2026-10-13 목록 표 [내보내기] → 엑셀(.xlsx) · CSV (Q233 A · Q234 A · Q235 A, public/table-export.mjs) */
.tbl-tools { display: flex; justify-content: flex-end; margin: 2px 0 3px; position: relative; }
.card > p.hint + .tbl-tools, .card > .hint + .tbl-tools { margin-top: 8px; }
.tbl-tools + .tbl { margin-top: 0; }
.tbl-export summary { cursor: pointer; list-style: none; font-size: 12px; line-height: 1; padding: 5px 9px; border: 1px solid var(--line, #d6ddd8); border-radius: 6px; background: var(--surface, #fff); color: var(--muted, #5b6660); white-space: nowrap; }
.tbl-export summary::-webkit-details-marker { display: none; }
.tbl-export summary::before { content: "⤓ "; }
.tbl-export summary:hover, .tbl-export[open] summary { color: var(--accent-soft-ink, #145c3a); border-color: var(--accent, #187a4c); }
.tbl-export-menu { position: absolute; right: 0; top: calc(100% + 2px); z-index: 30; display: flex; gap: 6px; padding: 6px; background: var(--surface, #fff); border: 1px solid var(--line, #d6ddd8); border-radius: 8px; box-shadow: 0 6px 16px rgba(0,0,0,.12); }
@media print { .tbl-tools { display: none !important; } }

/* 2026-10-13 제품정보 한 장에 펼치기 · 진행/단종(Q238 A · Q239 A, public/product-detail.mjs) */
.psw { display: flex; margin: 0 12px 8px; border: 1px solid var(--line-strong); border-radius: 8px; overflow: hidden; flex: none; }
.psw button { flex: 1; border: 0; background: var(--surface); padding: 7px 0; font: inherit; font-size: 13px; font-weight: 600; color: var(--muted); cursor: pointer; }
.psw button + button { border-left: 1px solid var(--line-strong); }
.psw button.on { background: var(--accent); color: #fff; }
.psw b { font-weight: 700; margin-left: 2px; }
[data-detail] .meta .pill { vertical-align: 1px; }
.psec-jump { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; padding: 8px 16px; border-bottom: 1px solid var(--line); position: sticky; top: 0; z-index: 5; background: var(--surface); }
.psec-jump .hint { margin-right: 2px; }
.psec-jump [role="tab"] { padding: 3px 11px; border: 1px solid var(--line); border-radius: 999px; background: var(--surface); font: inherit; font-size: 12.5px; color: inherit; cursor: pointer; }
.psec-jump [role="tab"][aria-selected="true"] { border-color: var(--accent); color: var(--accent-soft-ink); background: var(--accent-soft); }
.psec { padding: 14px 16px 16px; border-bottom: 1px solid var(--line); scroll-margin-top: 48px; }
.psec:last-child { border-bottom: 0; }
.psec-h { display: flex; align-items: baseline; gap: 10px; margin-bottom: 8px; }
.psec-h h3 { margin: 0; padding: 0; border: 0; display: block; font-size: 15px; font-weight: 700; color: var(--ink, inherit); letter-spacing: 0; text-transform: none; } /* .card h3(목록 머리) 모양을 지움 */
.psec-h .hint { margin-left: auto; }
.psec-none { margin: 2px 0 8px; color: var(--muted); font-size: 13px; }
.psec > .actions { margin-top: 8px; }

/* 2026-10-13 제품정보 정리 · 메모 · 합치기(Q240~Q245, public/product-detail.mjs · product-merge-ui.mjs) */
.pmemo { border: 1px solid #ecd78a; background: #fffbea; border-radius: 8px; padding: 9px 12px; margin: 0 0 12px; }
.pmemo .l { display: block; font-size: 12px; font-weight: 700; color: #8a6d0b; margin-bottom: 2px; }
.pmemo-t { white-space: pre-wrap; font-size: 13.5px; line-height: 1.55; }
.psec.hide-blank [data-blank] { display: none; }
.psec:not(.hide-blank) [data-blank-line] { display: none; }
.psec-blank { margin: 2px 0 6px; color: var(--muted); font-size: 13px; }
.psec-more { margin-left: auto; border: 0; background: none; padding: 0; font: inherit; font-size: 12.5px; color: var(--accent-soft-ink); text-decoration: underline; cursor: pointer; }
.psec-h .hint + .psec-more { margin-left: 10px; }
.pmerged { margin: 8px 0 0; }
.item-memo-hint { border-left: 3px solid #ecd78a; background: #fffbea; padding: 6px 10px; border-radius: 4px; white-space: pre-wrap; }
.pm-from { border: 1px solid var(--line); border-radius: 8px; padding: 10px 12px; margin-bottom: 12px; background: var(--surface-2, #f6f7f6); }
.pm-from .l { display: block; font-size: 12px; color: var(--muted); margin-bottom: 2px; }
.pm-list { display: grid; gap: 6px; margin: 8px 0 12px; max-height: 320px; overflow: auto; }
.pm-item { display: flex; gap: 10px; align-items: flex-start; padding: 8px 10px; border: 1px solid var(--line); border-radius: 8px; cursor: pointer; }
.pm-item.on { border-color: var(--accent); background: var(--accent-soft); }
.pm-item input { margin-top: 3px; }
.pm-preview { border: 1px solid var(--line-strong); border-radius: 8px; padding: 10px 12px; margin-bottom: 12px; font-size: 13.5px; }
.pm-preview p { margin: 0 0 6px; } .pm-preview ul { margin: 0; padding-left: 18px; } .pm-preview li + li { margin-top: 4px; }
.pm-warn { color: var(--warn, #b45309); font-weight: 600; }

/* 2026-10-13 실제 재고만 · 재고 등록 · 완료 때 남는 양 → 재고로(Q246~Q248, public/stock-entry.mjs) */
.extra-stock { display: flex; gap: 8px; align-items: flex-start; margin: 10px 0 0; padding: 8px 10px; border: 1px solid #ecd78a; background: #fffbea; border-radius: 8px; font-size: 13px; line-height: 1.5; }
.extra-stock input { margin-top: 3px; flex: none; }
.stock-bar { align-items: center; flex-wrap: wrap; gap: 10px; }

/* 2026-10-13 조회 조건 · 입고 묶음(Q255 · Q256, public/receipt-query.mjs) */
.qbar { display: flex; flex-wrap: wrap; gap: 10px 14px; align-items: flex-end; padding: 12px 14px; border: 1px solid var(--line); border-radius: 10px; background: var(--surface); margin: 0 0 10px; }
.qbar label { display: flex; flex-direction: column; gap: 4px; font-size: 12px; color: var(--muted); }
.qbar input, .qbar select { height: 34px; border: 1px solid var(--line-strong); border-radius: 7px; padding: 0 9px; font: inherit; font-size: 13.5px; background: #fff; min-width: 0; }
.qbar input[name="material"] { width: 140px; } .qbar input[name="text"] { width: 170px; }
.qbar-dates { display: flex; gap: 6px; align-items: center; color: var(--muted); }
.qbar-quick { display: flex; gap: 4px; flex-wrap: wrap; }
.qbar-quick button { height: 34px; border: 1px solid var(--line-strong); background: #fff; border-radius: 7px; padding: 0 10px; font: inherit; font-size: 12.5px; cursor: pointer; }
.qbar-quick button.on { background: var(--accent-soft); border-color: var(--accent); color: var(--accent-soft-ink); font-weight: 700; }
.qbar > .btn { height: 34px; }
.qbar > [data-action="receive-direct"] { margin-left: auto; }
.rq-sum { display: flex; flex-wrap: wrap; gap: 6px 18px; align-items: baseline; margin: 2px 2px 8px; font-size: 13.5px; }
.rq-sum b { font-size: 17px; } .rq-sum .hint { margin-left: auto; }
.rq-table tr.rq-open td { background: var(--accent-soft); }
.rq-table tr.rq-lot td { background: #fbfcfb; font-size: 12.5px; color: var(--muted); }
.rq-table tr.rq-total td { font-weight: 700; background: var(--surface-2, #f6f7f6); }
.rq-tabs { display: flex; gap: 4px; margin: 0 0 12px; }
.rq-tabs button { padding: 6px 14px; border-radius: 999px; border: 1px solid var(--line); background: var(--surface); font: inherit; font-size: 13px; cursor: pointer; }
.rq-tabs button.on { background: var(--accent); color: #fff; border-color: var(--accent); }

/* 2026-10-13 [? 설명] — 사용법 설명 글자는 평소 숨김, 켜면 그 자리에 노란 번호 말풍선(public/help-mode.mjs) */
body:not(.help-on) [data-help] { display: none !important; }
section[data-panel] { counter-reset: help; }
body.help-on [data-help] { counter-increment: help; position: relative; display: block; margin: 6px 0; padding: 6px 10px 6px 32px; background: #fff7d6; border: 1.5px solid #e0b93a; border-radius: 8px; color: #3d3305 !important; font-size: 12.5px; font-weight: 500; line-height: 1.5; text-align: left; box-shadow: 0 2px 8px rgba(0,0,0,.08); }
body.help-on [data-help] { white-space: normal; overflow: visible; text-overflow: clip; max-width: none; height: auto; } /* 카드 안 한 줄 줄임(…)을 풀어 다 보이게 */
body.help-on [data-help]::before { content: counter(help); position: absolute; left: 8px; top: 6px; width: 18px; height: 18px; border-radius: 50%; background: #d9534f; color: #fff; font-size: 11px; font-weight: 700; display: grid; place-items: center; }
.help-toggle { border-color: var(--accent); color: var(--accent-soft-ink); font-weight: 700; }
.help-toggle[aria-pressed="true"] { background: var(--accent); color: #fff; }
/* 결재 알림 켜기 · 보이는 메뉴(직원 · 역할 창) */
.notify-on { border-color: #e0b93a; background: #fff7d6; }
.menu-access { margin: 12px 0 4px; border: 1px solid var(--line); border-radius: 8px; padding: 8px 12px; }
.menu-access summary { cursor: pointer; font-weight: 700; }
.menu-access fieldset { border: 0; padding: 6px 0 2px; margin: 0; display: flex; flex-wrap: wrap; gap: 4px 14px; }
.menu-access legend { font-size: 12.5px; font-weight: 700; color: var(--muted); padding: 0; margin-bottom: 2px; width: 100%; }
.menu-access .check-line { font-size: 13px; }
.menu-access .admin-only { color: var(--muted); }

/* 2026-10-14 조회 칸 두 줄 — 사용자 "조회, 초기화 버튼 같이 버튼의 위치 맞춰줘": 윗줄 기간 · 빠른 기간(오른쪽 끝 다른 단추),
   아랫줄 조건 칸 · 오른쪽 끝 [조회] [초기화]. 칸과 단추 높이 34px, 단추는 칸 아래 선에 맞춤. */
.qbar { flex-direction: column; align-items: stretch; gap: 10px; }
.qbar-row { display: flex; flex-wrap: wrap; gap: 10px 14px; align-items: flex-end; }
.qbar-extra, .qbar-actions { margin-left: auto; display: flex; gap: 6px; align-items: flex-end; }
.qbar-actions .btn, .qbar-extra .btn { height: 34px; min-height: 34px; min-width: 76px; justify-content: center; }
.qbar select { min-width: 110px; }
.query > [data-action="query"] { margin-left: auto; min-width: 76px; }
[data-past-query] { padding: 14px 16px 6px; } /* 과거작업일지는 탭 없이 카드 하나 — 다른 조회 화면과 같은 안쪽 여백 */
/* 2026-10-15 자재 메뉴 원단 / 동판 / 기타(DD): 화면 맨 위 칸 단추 */
.mat-sec{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin:0 0 14px;padding:0 0 12px;border-bottom:1px solid var(--line,#d9e0db)}
.mat-sec-title{font-size:15px;margin-right:8px}
.mat-sec button{border:1px solid var(--line,#d9e0db);background:var(--surface,#fff);border-radius:999px;padding:6px 14px;font:inherit;cursor:pointer;color:inherit}
.mat-sec button.on{background:var(--brand,#1e7a46);border-color:var(--brand,#1e7a46);color:#fff;font-weight:600}
.mat-sec button:not(.on):hover{border-color:var(--brand,#1e7a46)}
/* 2026-10-15 거래처 · 제품 · 동판 내보내기(DI): 화면 맨 위 단추 · 창(왼쪽 칸 체크 · 오른쪽 항목 체크) */
.master-export-bar{display:flex;justify-content:flex-end;margin:0 0 8px}
.mx-grid{display:grid;grid-template-columns:minmax(200px,1fr) 2fr;gap:14px;align-items:start}
.mx-grid fieldset{border:1px solid var(--line,#d9e0db);border-radius:8px;padding:8px 12px;margin:0;min-width:0}
.mx-grid legend{font-weight:600;padding:0 4px;display:flex;gap:6px;align-items:center;flex-wrap:wrap}
.mx-cols{display:grid;grid-template-columns:1fr 1fr;gap:2px 10px;max-height:60vh;overflow:auto}
.mx-cols legend{grid-column:1/-1}
.mx-tools{display:flex;gap:6px;flex-wrap:wrap;margin:4px 0 8px}
.mx-tools input[type=search]{flex:1;min-width:160px;height:32px}
.mx-list{max-height:52vh;overflow:auto;display:flex;flex-direction:column;gap:2px}
.mx-list label[hidden]{display:none}
@media (max-width:760px){.mx-grid{grid-template-columns:1fr}}

/* 2026-10-15 수주 등록 재고 사용 — 품목 줄 아래 연두 띠: 재고 있음 · [✓ 재고 사용] 수량 · 결과(다 채움 / 생산 n) */
.stock-hint.stock-use { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 14px; margin: 8px 0 4px; padding: 9px 12px; border: 1px solid var(--accent); border-radius: 8px; background: var(--accent-soft); color: var(--ink, #1d2620); font-size: 13px; }
.stock-hint.stock-use b { font-size: 14px; }
.stock-hint.stock-use .muted { color: var(--muted); font-size: 12px; }
.stock-hint.stock-use .check-line { font-weight: 700; margin: 0; }
.stock-use-qty { display: inline-flex; align-items: center; gap: 5px; }
.stock-use-qty input { width: 120px; height: 32px; border: 1px solid var(--line-strong); border-radius: 6px; padding: 0 8px; font: inherit; text-align: right; background: #fff; }
.stock-use-qty input:disabled { background: transparent; color: var(--muted); }
.stock-use-result { flex-basis: 100%; color: var(--accent-soft-ink, var(--accent)); font-weight: 600; }
.stock-use-result:empty { display: none; }
.stock-use-note { margin: 6px 0; padding: 6px 10px; border-left: 3px solid var(--accent); background: var(--accent-soft); color: var(--ink, #1d2620); }

/* 2026-10-16 제품 거래처 여러 곳 — 상세 '거래처' 줄(기본 + 함께 주문하는 거래처) · [거래처] 창 목록 */
.pparty-row { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 10px; margin: 0 0 10px; }
.pparty-row > .l { font-size: 12px; color: var(--muted); min-width: 44px; }
.pparty-names { display: inline-flex; flex-wrap: wrap; gap: 4px; }
.pparty { display: inline-flex; align-items: baseline; gap: 3px; padding: 2px 9px; border: 1px solid var(--line-strong); border-radius: 999px; background: var(--surface); font-size: 13px; font-weight: 600; }
.pparty small { font-size: 10.5px; color: var(--muted); font-weight: 400; }
.pparty.extra { border-color: var(--accent); background: var(--accent-soft); }
.pparty-row > .btn { margin-left: auto; }
.pparty-more { font-size: 12px; color: var(--muted); }
.pparty-list { list-style: none; margin: 4px 0 12px; padding: 0; display: grid; gap: 4px; }
.pparty-list li { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 6px 10px; border: 1px solid var(--line); border-radius: 7px; background: var(--surface); }
.pparty-list li.muted { color: var(--muted); justify-content: flex-start; }

/* 2026-10-16 수주 목록 상태 단추 · 조회 칸 · 줄 단추(진행 보기 + ⋯) */
.ol-wrap { padding: 14px 16px; }
.ol-top { display: flex; align-items: center; gap: 10px; margin: 0 0 10px; flex-wrap: wrap; }
.ol-top-act { margin-left: auto; display: flex; gap: 6px; }
.ol-status { display: inline-flex; border: 1px solid var(--line-strong); border-radius: 8px; overflow: hidden; }
.ol-status button { border: 0; border-right: 1px solid var(--line); background: var(--surface); height: 34px; padding: 0 13px; font: inherit; font-size: 13px; cursor: pointer; }
.ol-status button:last-child { border-right: 0; }
.ol-status button b { font-size: 12px; margin-left: 3px; opacity: .85; }
.ol-status button.on { background: var(--accent); color: #fff; font-weight: 700; }
.ol-stage { display: inline-block; background: #eef3ff; color: #2c4a8a; border-radius: 6px; padding: 2px 8px; font-size: 12px; font-weight: 700; white-space: nowrap; }
.ol-stage.mute { background: var(--surface-2, #f2f3f2); color: var(--muted); }
.ol-act { white-space: nowrap; text-align: right; }
.ol-more { display: inline-block; position: relative; margin-left: 4px; }
.ol-more > summary { list-style: none; display: inline-flex; align-items: center; justify-content: center; min-width: 30px; height: 30px; border: 1px solid var(--line-strong); border-radius: 7px; background: var(--surface); cursor: pointer; font-weight: 700; }
.ol-more > summary::-webkit-details-marker { display: none; }
.ol-more[open] > summary { background: var(--accent-soft); border-color: var(--accent); }
.ol-menu { position: fixed; z-index: 60; display: flex; flex-direction: column; gap: 4px; padding: 6px; background: var(--surface); border: 1px solid var(--line-strong); border-radius: 8px; box-shadow: 0 6px 18px rgba(0,0,0,.14); min-width: 112px; } /* 표 위에 떠서(스크롤 칸에 안 잘림) — 자리는 order-list-query.mjs bindMore */
.ol-menu .btn { width: 100%; justify-content: center; }
table[data-order-list] td:nth-child(4) { min-width: 160px; }
.ol-menu .btn.danger { color: var(--bad, #c0392b); }
/* 2026-10-16 납기 알림 요약 칸 · 급한 순 묶음 · 배지 */
[data-panel="due"] [data-results] { padding: 12px 14px 4px; }
.due-tiles { display: flex; gap: 8px; flex-wrap: wrap; margin: 4px 0 12px; }
.due-tile { flex: 1 1 120px; display: flex; flex-direction: column; align-items: flex-start; gap: 2px; padding: 10px 12px; border-radius: 10px; border: 1px solid transparent; font: inherit; cursor: pointer; text-align: left; }
.due-tile span { font-size: 12.5px; font-weight: 700; }
.due-tile b { font-size: 24px; line-height: 1.1; }
.due-tile small { font-size: 11px; color: var(--muted); }
.due-tile.zero { opacity: .55; }
.due-tile.on { box-shadow: 0 0 0 2px currentColor inset; }
.due-over { --due: #c0392b; --due-bg: #fdecea; } .due-soon { --due: #d35400; --due-bg: #fff1e6; } .due-week { --due: #9a7d0a; --due-bg: #fdf8e4; }
.due-next { --due: #1f7a4d; --due-bg: #e8f5ee; } .due-later { --due: #4a5550; --due-bg: #f2f3f2; } .due-none { --due: #6b756e; --due-bg: #f2f3f2; }
.due-tile { color: var(--due); background: var(--due-bg); border-color: color-mix(in srgb, var(--due) 25%, transparent); }
.due-group { margin: 0 0 12px; }
.due-group h4 { display: flex; align-items: center; gap: 8px; margin: 6px 2px 6px; font-size: 14px; color: var(--due); }
.due-group h4 i { width: 10px; height: 10px; border-radius: 50%; background: var(--due); display: inline-block; }
.due-badge { display: inline-block; border-radius: 999px; padding: 1px 8px; font-size: 11.5px; font-weight: 800; color: var(--due); background: var(--due-bg); white-space: nowrap; }

/* 2026-10-16 납품 한 화면 — 납품 일정(목록 · 달력) · 배차 색 · 늦음 · 계획 전 띠 · 업체 배차 자동 · 묶음 · 창 */
[data-ship-hub] { padding: 12px 14px; }
.sh-bar { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin: 0 0 12px; }
.sh-chips { display: flex; gap: 6px; flex-wrap: wrap; }
.sh-chip { height: 32px; padding: 0 12px; border-radius: 999px; border: 1px solid var(--line-strong); background: var(--surface); font: inherit; font-size: 13px; font-weight: 600; cursor: pointer; }
.sh-chip b { font-size: 11.5px; opacity: .7; margin-left: 2px; }
.sh-chip.on { background: var(--ink, #1d2620); color: #fff; border-color: var(--ink, #1d2620); }
.sh-right { margin-left: auto; display: flex; gap: 8px; align-items: center; }
.sh-seg { display: inline-flex; border: 1px solid var(--line-strong); border-radius: 8px; overflow: hidden; }
.sh-seg button { border: 0; background: var(--surface); height: 34px; padding: 0 13px; font: inherit; font-size: 13px; cursor: pointer; }
.sh-seg button.on { background: var(--accent-soft); color: var(--accent); font-weight: 700; }
.sh-pill { display: inline-block; border-radius: 6px; padding: 3px 8px; font-size: 12px; font-weight: 800; white-space: nowrap; text-align: center; }
.m-own { --m: #1f7a4d; --mb: #e8f5ee; } .m-hired { --m: #2c5fb3; --mb: #e9f0fc; } .m-courier { --m: #7b3fb3; --mb: #f2eafb; } .m-pickup { --m: #8a5a00; --mb: #fdf3dd; } .m-done { --m: #6b756e; --mb: #f0f2f0; }
.sh-pill, .sh-cnt span { color: var(--m, #1f7a4d); background: var(--mb, #e8f5ee); }
.sh-dh { display: flex; align-items: baseline; gap: 8px; font-weight: 800; font-size: 15px; margin: 6px 2px 6px; }
.sh-dh span { font-size: 12px; color: var(--muted); font-weight: 600; }
.sh-dh.today { color: var(--accent); } .sh-dh.late { color: #b03a2e; }
.sh-day { margin: 0 0 12px; }
.sh-row { display: grid; grid-template-columns: 22px 84px minmax(0,1fr) 130px 140px auto; gap: 10px; align-items: center; background: var(--surface); border: 1px solid var(--line); border-radius: 9px; padding: 8px 12px; margin: 0 0 6px; }
.sh-row.compact { grid-template-columns: 72px minmax(0,1fr) auto auto; padding: 7px 9px; }
.sh-row.late { border-color: #e7b0a8; background: #fff8f7; }
.sh-row.auto { border-style: dashed; border-color: #e3c98a; background: #fffdf6; }
.sh-row.done { opacity: .55; }
.sh-main { min-width: 0; }
.sh-memo { color: #9a6b00; }
.sh-qty { text-align: right; font-weight: 700; white-space: nowrap; }
.sh-acts { display: flex; gap: 6px; justify-content: flex-end; align-items: center; white-space: nowrap; }
.sh-done { color: var(--muted); font-size: 12.5px; }
.btn.pickup { background: #8a5a00; border-color: #8a5a00; color: #fff; }
.sh-more > summary { list-style: none; display: inline-flex; align-items: center; justify-content: center; min-width: 30px; height: 30px; border: 1px solid var(--line-strong); border-radius: 7px; background: var(--surface); cursor: pointer; font-weight: 700; }
.sh-more > summary::-webkit-details-marker { display: none; }
.sh-more .ol-menu { position: fixed; z-index: 60; display: flex; flex-direction: column; gap: 4px; padding: 6px; background: var(--surface); border: 1px solid var(--line-strong); border-radius: 8px; box-shadow: 0 6px 18px rgba(0,0,0,.14); min-width: 160px; }
.sh-more .ol-menu .btn { width: 100%; justify-content: flex-start; }
.linkish { border: 0; background: none; color: var(--accent); font: inherit; font-size: 12.5px; cursor: pointer; padding: 2px 4px; }
.sh-np { border: 1px dashed #d9a441; background: #fffaf0; border-radius: 10px; padding: 10px 12px; margin: 0 0 14px; }
.sh-np-t { font-weight: 800; color: #9a6b00; margin: 0 0 6px; }
.sh-npr { display: grid; grid-template-columns: 110px 84px minmax(0,1fr) 120px auto auto; gap: 10px; align-items: center; padding: 6px 0; border-top: 1px dashed #ecd9a8; }
.sh-npr:first-of-type { border-top: 0; }
.sh-trip { border: 2px solid var(--accent); border-radius: 11px; padding: 8px 10px 2px; margin: 0 0 8px; background: #f6fbf8; }
.sh-th { display: flex; align-items: center; gap: 8px; font-weight: 800; color: var(--accent); margin: 0 2px 6px; }
.sh-th .btn { margin-left: auto; }
.sh-later { margin: 4px 2px; }
.sh-calwrap { display: grid; grid-template-columns: minmax(0,1fr) 340px; gap: 14px; align-items: start; }
.sh-mnav { display: flex; align-items: center; gap: 8px; margin: 0 0 8px; }
.sh-mnav b { font-size: 16px; }
.sh-grid { display: grid; grid-template-columns: repeat(7,1fr); border: 1px solid var(--line); border-radius: 10px; overflow: hidden; background: var(--surface); }
.sh-wd { font-size: 12px; color: var(--muted); padding: 6px 8px; background: var(--surface-2, #f7f9f7); border-bottom: 1px solid var(--line); }
.sh-cell { min-height: 86px; border: 0; border-right: 1px solid var(--line); border-bottom: 1px solid var(--line); background: var(--surface); padding: 6px 7px; text-align: left; display: flex; flex-direction: column; gap: 4px; font: inherit; cursor: pointer; }
.sh-cell.out { background: #fafbfa; color: #aab2ac; }
.sh-cell.today .sh-cd { color: var(--accent); }
.sh-cell.on { outline: 2px solid var(--accent); outline-offset: -2px; }
.sh-cd { font-weight: 800; font-size: 13px; display: flex; align-items: center; gap: 4px; }
.sh-dot { width: 7px; height: 7px; border-radius: 50%; background: #c0392b; display: inline-block; }
.sh-cnt { display: flex; flex-wrap: wrap; gap: 3px; }
.sh-cnt span { border-radius: 5px; padding: 1px 6px; font-weight: 800; font-size: 11.5px; }
.sh-side { background: var(--surface); border: 1px solid var(--line); border-radius: 10px; padding: 10px 12px; }
.sh-side > .btn { width: 100%; margin-top: 8px; justify-content: center; }
.sh-sum { display: grid; grid-template-columns: repeat(3,1fr); gap: 6px; margin: 0 0 10px; }
.sh-sum div { background: var(--surface-2, #f7f9f7); border-radius: 8px; padding: 7px 9px; }
.sh-sum b { display: block; font-size: 14px; }
.ship-more { border: 1px dashed var(--line-strong); border-radius: 8px; padding: 6px 10px; margin: 8px 0 0; }
.ship-more > summary { cursor: pointer; color: var(--muted); font-size: 12.5px; }
.sh-search { height: 34px; width: 220px; max-width: 40vw; padding: 0 10px; border: 1px solid var(--line-strong); border-radius: 8px; font: inherit; font-size: 13px; background: var(--surface); }
.sh-right .tbl-tools { margin: 0; }
.sh-export-src { display: none; }
.sh-right .tbl-export summary { height: 34px; display: inline-flex; align-items: center; padding: 0 11px; font-size: 13px; }
@media (max-width: 900px) { .sh-search { width: 150px; } .sh-calwrap { grid-template-columns: 1fr; } .sh-row { grid-template-columns: 22px 64px minmax(0,1fr) auto auto; } .sh-row > .code { display: none; } .sh-row.compact { grid-template-columns: 64px minmax(0,1fr) auto auto; } .sh-npr { display: flex; flex-wrap: wrap; gap: 6px 10px; } .sh-npr > .sh-npd { flex-basis: 100%; } .sh-npr > .sh-main { flex: 1 1 200px; } }
/* 2026-10-19 제품 목록 정렬(가나다순 · 최근 이용순) */
.isort { display: flex; align-items: center; gap: 4px; margin: 6px 0 8px; }
.isort .hint { margin-right: 4px; }
.isort button { border: 1px solid var(--line-strong); background: var(--surface); border-radius: 999px; height: 28px; padding: 0 11px; font: inherit; font-size: 12.5px; cursor: pointer; }
.isort button.on { background: var(--accent-soft); color: var(--accent); border-color: var(--accent); font-weight: 700; }
/* 2026-10-19 제품 목록 [업체별] 머리줄 */
.list > li.isort-group { display: flex; align-items: baseline; gap: 6px; padding: 12px 4px 4px; background: none; cursor: default; font-size: 13px; border-bottom: 1px solid var(--line-strong); }
.list > li.isort-group:hover { background: none; }
/* 2026-10-19 원단 규격 검색 칸: 글만 적고 목록에서 안 고름 */
.srch.srch-miss > input[data-search] { border-color: var(--bad, #c0392b); background: #fff6f5; }
/* 2026-10-19 납품 일정 늦음 줄: 원래 날짜 · 며칠 지남 · 수주 납기 */
.sh-lated { color: #b03a2e; font-weight: 700; font-size: 12.5px; margin: 0 0 2px; }
/* 2026-10-19 출고 창: 계획보다 적게 나갈 때 부족 알림 · [이번 출고로 이 납품 끝내기], 납품 일정 줄 "n% 부족" */
.ship-short { display: flex; flex-direction: column; gap: 4px; margin: 8px 0 0; padding: 8px 10px; border: 1px solid #e7b0a8; border-radius: 8px; background: #fff5f3; color: #8a2a1f; }
.ship-short .hint { color: #8a5a50; }
.sh-short { color: #b03a2e; }
/* 2026-10-19 [⋯] 메뉴를 열면 예전 규칙(td > details[open] {min-width: 420px})에 걸려 칸이 넓어지고 줄이 밀리던 것 */
td > details.ol-more[open], td > details.sh-more[open] { min-width: 0; }
/* 2026-10-19 Q296 A: 출고는 끝났는데 마감 안 한 수주 띠(납기 알림 · 수주 목록) */
.done-open { border: 1px solid #b9dcc8; background: #f3faf6; border-radius: 10px; padding: 9px 12px; margin: 0 0 12px; }
.done-open-h { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.done-open-h .btn { margin-left: auto; }
.done-open-list { margin: 6px 0 0; }
.done-open-list summary { cursor: pointer; color: var(--muted); font-size: 12.5px; }
.done-open-list ul { margin: 6px 0 0; padding-left: 18px; columns: 2; column-gap: 24px; }
.done-open-list li { margin: 0 0 4px; break-inside: avoid; }
/* 2026-10-19 납품 달력 옆 칸(좁음): 거래처 · 제품은 윗줄 전체, 배차 · 수량 · 단추는 아랫줄 */
.sh-row.compact { grid-template-columns: auto minmax(0,1fr) auto; row-gap: 6px; }
.sh-row.compact > .sh-main { grid-column: 1 / -1; order: -1; }

/* 2026-10-19 재고현황 제품별 — 요약 칸 · 조회 줄 · 목록 + 오른쪽 상세(재고 묶음 · 수불부) */
.sb-tiles { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 10px; margin: 0 0 12px; }
.sb-tiles > div { border: 1px solid var(--line); border-radius: 10px; padding: 9px 12px; background: var(--surface); }
.sb-tiles span { display: block; color: var(--muted); font-size: 12px; }
.sb-tiles b { display: block; font-size: 21px; margin-top: 2px; }
.sb-wait { color: #2c5fb3; font-weight: 700; }
.sb-bar { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin: 0 0 8px; }
.sb-bar input[type="search"] { height: 34px; min-width: 220px; padding: 0 10px; border: 1px solid var(--line-strong); border-radius: 8px; font: inherit; font-size: 13px; }
.sb-bar select { height: 34px; border: 1px solid var(--line-strong); border-radius: 8px; padding: 0 8px; font: inherit; font-size: 13px; background: var(--surface); }
.sb-seg { display: inline-flex; border: 1px solid var(--line-strong); border-radius: 8px; overflow: hidden; }
.sb-seg button { border: 0; background: var(--surface); height: 34px; padding: 0 12px; font: inherit; font-size: 13px; cursor: pointer; }
.sb-seg button.on { background: var(--accent-soft); color: var(--accent); font-weight: 700; }
.sb-act { margin-left: auto; display: flex; gap: 8px; }
.sb-hint { margin: 0 0 10px; }
.sb-split { display: grid; grid-template-columns: minmax(0, 1.5fr) minmax(400px, 1fr); gap: 14px; align-items: start; }
.sb-list table tbody tr { cursor: pointer; }
.sb-list table tbody tr.on td { background: var(--accent-soft); }
.sb-list table tbody tr.zero td { color: var(--muted); }
.sb-list td.sb-code, .sb-list td.nowrap, .sb-detail td.nowrap { white-space: nowrap; }
.sb-code { color: var(--muted); font-size: 12px; font-variant-numeric: tabular-nums; }
[data-panel="finstock"] .sb-list td:first-child, [data-panel="finstock"] .sb-detail td:first-child { min-width: 0; } /* 예전 재고 표 규칙(td:first-child 220px) 끔 */
.sb-detail table { width: 100%; }
.sb-detail td .hint { font-size: 11.5px; margin-top: 2px; }
.sb-list table td { padding-top: 8px; padding-bottom: 8px; }
.sb-detail { border: 1px solid var(--line); border-radius: 10px; padding: 12px 14px; background: var(--surface); position: sticky; top: 8px; }
.sb-name { margin: 2px 0 8px; font-size: 16px; font-weight: 800; }
.sb-lots { list-style: none; margin: 0; padding: 0; }
.sb-lots li { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 8px 2px; border-bottom: 1px solid var(--line); }
.sb-lots li:last-child { border-bottom: 0; }
.sb-big { font-size: 26px; font-weight: 800; margin: 0 0 4px; }
.sb-dact { display: flex; gap: 6px; margin: 10px 0 0; }
.sb-detail .sec { margin-top: 14px; }
@media (max-width: 1100px) { .sb-split { grid-template-columns: 1fr; } .sb-detail { position: static; } .sb-tiles { grid-template-columns: repeat(2, minmax(0, 1fr)); } }

/* 2026-10-19 납품 스케줄 출력 한 표 — 배차를 카드 배경색으로(자차 초록 · 용차 파랑 · 택배 보라 · 업체 배차 노랑) + 작은 [배차] 글 */
.schedule-document.sch-combined, .schedule-document.sch-combined * { -webkit-print-color-adjust: exact; print-color-adjust: exact; }
.schedule-document .sch-legend { display: flex; flex-wrap: wrap; gap: 6px; margin: 0 0 6px; font-size: 12px; }
.schedule-document .sch-key { border: 1px solid; border-radius: 4px; padding: 2px 8px; }
.schedule-document .sch-key b { margin-left: 2px; }
.schedule-document.sch-combined .card.m-own, .schedule-document .sch-key.m-own { background: #e3f4ea; border-color: #8fc9a8; }
.schedule-document.sch-combined .card.m-hired, .schedule-document .sch-key.m-hired { background: #e4ecfb; border-color: #9db8e8; }
.schedule-document.sch-combined .card.m-courier, .schedule-document .sch-key.m-courier { background: #f0e6fa; border-color: #c2a5e3; }
.schedule-document.sch-combined .card.m-pickup, .schedule-document .sch-key.m-pickup { background: #fdf1d6; border-color: #e0c27d; }
.schedule-document .sch-tag { display: inline-block; font-style: normal; font-size: 9.5px; font-weight: 800; border: 1px solid currentColor; border-radius: 3px; padding: 0 3px; margin: 0 4px 1px 0; line-height: 1.35; vertical-align: 1px; }
.schedule-document .m-own .sch-tag { color: #1f7a4d; } .schedule-document .m-hired .sch-tag { color: #2c5fb3; } .schedule-document .m-courier .sch-tag { color: #7b3fb3; } .schedule-document .m-pickup .sch-tag { color: #8a5a00; }
.schedule-document.sch-combined .schedule-lane { margin-top: 4px; }
.sch-split { margin-left: 4px; font-size: 12.5px; }
@media print { .schedule-document .sch-legend { font-size: 10.5px; margin-bottom: 4px; } .schedule-document.sch-combined .card { font-size: 10px; } }
/* 2026-10-19 제품 이름 → 제품 한눈에 보기 창 */
.item-peek { border: 0; background: none; padding: 0; font: inherit; color: inherit; text-align: left; cursor: pointer; text-decoration: underline dotted var(--line-strong); text-underline-offset: 3px; }
.item-peek:hover { color: var(--accent); text-decoration-color: var(--accent); }
.item-peek-body .sec { margin-top: 12px; }
.item-peek-body > .hint:first-child { margin-top: 0; }
.item-peek-body p.hint + .grid { margin-top: 2px; }
.item-peek-files { margin: 4px 0 0; padding-left: 18px; }
/* 2026-10-19 가공 일지 = 수기 양식(Q303 ~ Q306): 줄 칸(m/롤 · 롤 수 · 불량)이 늘어 가공 줄은 넘치면 접힘 */
[data-conv-editor] .wrow, [data-conv-editor] .wrow:has(.cutcell[hidden]) { display: flex; flex-direction: row; flex-wrap: wrap; align-items: flex-end; }
[data-conv-editor] .wrow .perroll { flex-basis: 96px; }
[data-conv-editor] .wrow .defcell { flex-basis: 88px; }
[data-conv-editor] .wrow .perroll input, [data-conv-editor] .wrow .defcell input { width: 100%; }
/* 종이 양식 출력(A4 가로 · 작업 구역 2개) */
.conv-paper { color: #111; font-size: 11px; line-height: 1.25; }
.conv-paper .cp-page { width: 277mm; margin: 0 auto 8mm; display: flex; flex-direction: column; gap: 2.5mm; }
.conv-paper .cp-page + .cp-page { break-before: page; }
.conv-paper table { width: 100%; border-collapse: collapse; table-layout: fixed; }
.conv-paper.paper-document th, .conv-paper.paper-document td { border: 1px solid #222; padding: 0 1.5mm; height: 6mm; font-weight: 400; vertical-align: middle; overflow: hidden; white-space: nowrap; overflow-wrap: normal; word-break: keep-all; text-overflow: ellipsis; } /* print.css .paper-document overflow-wrap:anywhere 이김 */
.conv-paper .cp-top { border: 1.5px solid #111; }
.conv-paper .cp-top col.cp-sign { width: 19mm; }
.conv-paper .cp-top .cp-title { height: 11mm; font-size: 22px; font-weight: 800; text-align: center; letter-spacing: 2px; background: #f2f2f2; }
.conv-paper .cp-top th:not(.cp-title) { background: #e7e7e7; font-weight: 700; text-align: center; font-size: 12px; }
.conv-paper .cp-top td { font-size: 12px; }
.conv-paper .cp-blocks { display: grid; grid-template-columns: 1fr 1fr; gap: 3mm; align-items: start; }
.conv-paper .cp-block { border: 1.5px solid #111; }
.conv-paper .cp-block col.cp-no { width: 8mm; }
.conv-paper .cp-block col.cp-lot { width: 28mm; }
.conv-paper.paper-document .cp-th th:first-child, .conv-paper.paper-document .cp-row td.cp-n { padding: 0; }
.conv-paper .cp-row td.cp-l { font-size: 10px; }
.conv-paper .cp-meta td { border-top: 0; border-bottom: 0; height: 5.6mm; }
.conv-paper .cp-meta-last td { border-bottom: 1.5px solid #111; }
.conv-paper .cp-line { display: flex; align-items: center; gap: 3mm; }
.conv-paper .cp-item { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.conv-paper .cp-speed { flex: 0 0 30mm; }
.conv-paper .cp-temp { flex: 0 0 24mm; margin-left: auto; }
.conv-paper .cp-machines { flex: 1 1 auto; display: flex; gap: 2.4mm; font-size: 10.5px; }
.conv-paper .cp-chk.on { font-weight: 800; }
.conv-paper .cp-th th { height: 5.6mm; font-weight: 700; text-align: center; }
.conv-paper .cp-row td { height: 7.8mm; text-align: center; }
.conv-paper .cp-row td.cp-n { font-weight: 700; }
.conv-paper .cp-row td.cp-l { text-align: left; }
.conv-paper .cp-note td { height: 15mm; vertical-align: top; padding-top: 1mm; white-space: normal; background: #f2f2f2; }
@media print { .conv-paper .cp-page { margin: 0 auto; } }
/* 2026-10-20 가공 일지 양식 화면(엑셀 한 장처럼) */
[data-conv-editor] form.conv-sheet { background: #fff; border: 1px solid var(--line-strong, #9aa39d); border-radius: 8px; padding: 14px; margin-top: 8px; }
[data-conv-editor] form.conv-sheet > .sheet.cs-head { border: 0; border-radius: 0; padding: 0; margin: 0 0 12px; background: none; box-shadow: none; }
[data-conv-editor] form.conv-sheet table { width: 100%; border-collapse: collapse; table-layout: fixed; }
[data-conv-editor] form.conv-sheet .cs-top { border: 2px solid #222; }
[data-conv-editor] form.conv-sheet .cs-top th, [data-conv-editor] form.conv-sheet .cs-top td { border: 1px solid #444; padding: 2px 10px; height: 38px; }
[data-conv-editor] form.conv-sheet .cs-top col.cs-sign { width: 78px; }
[data-conv-editor] form.conv-sheet .cs-top .cs-title { height: 50px; font-size: 26px; font-weight: 800; letter-spacing: 3px; text-align: center; color: #111; background: #f2f2f2; }
[data-conv-editor] form.conv-sheet .cs-top th:not(.cs-title) { background: #e7e7e7; font-size: 14px; font-weight: 700; text-align: center; }
[data-conv-editor] form.conv-sheet .cs-kv { display: flex; align-items: center; gap: 8px; font-weight: 700; white-space: nowrap; }
[data-conv-editor] form.conv-sheet .cs-kv .f, [data-conv-editor] form.conv-sheet .cs-kv .conversion-workers { margin: 0; padding: 0; display: block; min-width: 0; }
[data-conv-editor] form.conv-sheet .cs-kv .f > .l { display: none; }
[data-conv-editor] form.conv-sheet .cs-kv input:not([type="checkbox"]), [data-conv-editor] form.conv-sheet .cs-kv select { height: 30px; border: 0; border-bottom: 1px solid #bbb; border-radius: 0; background: transparent; padding: 0 4px; font-weight: 500; min-width: 0; }
[data-conv-editor] form.conv-sheet .cs-kv input[name="overtime"] { flex: 1 1 auto; }
[data-conv-editor] form.conv-sheet .cs-blocks { display: grid; grid-template-columns: 1fr; gap: 14px; align-items: start; } /* 2026-10-20 사용자 "두 쪽 → 한 쪽": 작업 구역 하나가 가로 전체, 다른 작업은 아래로 */
[data-conv-editor] form.conv-sheet .cs-block { border: 2px solid #222; background: #fff; }
[data-conv-editor] form.conv-sheet .cs-meta { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 10px; min-height: 36px; padding: 2px 8px; }
[data-conv-editor] form.conv-sheet .cs-meta-last { border-bottom: 2px solid #222; flex-wrap: wrap; }
[data-conv-editor] form.conv-sheet .cs-meta label { display: flex; align-items: center; gap: 4px; margin: 0; font-weight: 700; white-space: nowrap; }
[data-conv-editor] form.conv-sheet .cs-item { flex: 1 1 auto; min-width: 0; }
[data-conv-editor] form.conv-sheet .cs-meta input:not([type="radio"]), [data-conv-editor] form.conv-sheet .cs-meta select { height: 30px; border: 0; border-bottom: 1px solid #bbb; border-radius: 0; background: transparent; padding: 0 4px; font-weight: 500; }
[data-conv-editor] form.conv-sheet .cs-item select { flex: 1 1 auto; min-width: 0; width: 100%; }
[data-conv-editor] form.conv-sheet .cs-speed input, [data-conv-editor] form.conv-sheet .cs-temp input { width: 64px; text-align: right; }
[data-conv-editor] form.conv-sheet .cs-temp { margin-left: auto; }
[data-conv-editor] form.conv-sheet .cs-tools { display: inline-flex; gap: 2px; }
[data-conv-editor] form.conv-sheet .cs-link { border: 0; background: none; color: var(--accent); text-decoration: underline; text-underline-offset: 3px; font-size: 13px; padding: 0 4px; height: auto; min-height: 0; white-space: nowrap; cursor: pointer; }
[data-conv-editor] form.conv-sheet .cs-machines { display: flex; flex-wrap: wrap; gap: 2px 4px; }
[data-conv-editor] form.conv-sheet .cs-chk { border: 0; background: none; padding: 2px 6px; height: auto; min-height: 0; font: inherit; font-size: 14px; border-radius: 4px; cursor: pointer; color: inherit; }
[data-conv-editor] form.conv-sheet .cs-chk:hover:not(:disabled) { background: var(--surface-2, #f3f5f3); }
[data-conv-editor] form.conv-sheet .cs-chk[aria-pressed="true"] { font-weight: 800; color: var(--accent); background: var(--accent-soft, #e2f3e9); }
[data-conv-editor] form.conv-sheet .cs-unit { display: inline-flex; gap: 10px; font-size: 13px; }
[data-conv-editor] form.conv-sheet .cs-unit label { font-weight: 500; }
[data-conv-editor] form.conv-sheet .cs-wind { margin-left: auto; font-size: 12px; color: var(--muted); white-space: normal; }
[data-conv-editor] form.conv-sheet .cs-table col.cs-c-n { width: 34px; }
[data-conv-editor] form.conv-sheet .cs-table col.cs-c-lot { width: 23%; }
[data-conv-editor] form.conv-sheet .cs-table col.cs-c-def { width: 7%; } /* 2026-10-20 사용자 "불량 칸 너비 절반 · 작업시간 늘려" — 수량 칸(약 14%)의 절반 */
[data-conv-editor] form.conv-sheet .cs-table col.cs-c-t { width: 12%; }
[data-conv-editor] form.conv-sheet .cs-table td.cs-tcell .cs-tw { position: relative; }
[data-conv-editor] form.conv-sheet .cs-table td.cs-tcell .cs-tw:has(.cs-now) input { padding-right: 30px; }
[data-conv-editor] form.conv-sheet .cs-table .cs-now { position: absolute; right: 3px; top: 50%; transform: translateY(-50%); display: inline-flex; align-items: center; justify-content: center; width: 26px; height: 26px; min-height: 0; padding: 0; border: 0; border-radius: 50%; background: none; color: var(--accent); cursor: pointer; }
[data-conv-editor] form.conv-sheet .cs-table .cs-now:hover { background: var(--accent-soft, #e2f3e9); }
[data-conv-editor] form.conv-sheet .cs-table tr[data-locked="true"] .cs-now { display: none; }
[data-conv-editor] form.conv-sheet .cs-table th, [data-conv-editor] form.conv-sheet .cs-table td { border: 1px solid #555; height: 32px; padding: 0; text-align: center; vertical-align: middle; }
[data-conv-editor] form.conv-sheet .cs-table thead th { height: 28px; background: #f5f5f5; font-size: 13px; font-weight: 700; white-space: nowrap; }
[data-conv-editor] form.conv-sheet .cs-table thead small { font-weight: 500; color: var(--muted); }
[data-conv-editor] form.conv-sheet .cs-table td.cs-n { font-size: 13px; font-weight: 700; }
[data-conv-editor] form.conv-sheet .cs-table td input, [data-conv-editor] form.conv-sheet .cs-table td select { display: block; width: 100%; height: 31px; min-width: 0; margin: 0; border: 0; border-radius: 0; background: transparent; padding: 0 3px; text-align: center; font-size: 14px; box-shadow: none; }
[data-conv-editor] form.conv-sheet .cs-table td.cs-lot select { text-align: left; font-size: 12.5px; padding-left: 4px; }
[data-conv-editor] form.conv-sheet .cs-table td input:focus, [data-conv-editor] form.conv-sheet .cs-table td select:focus { outline: 2px solid var(--accent); outline-offset: -2px; background: #fffbe6; }
[data-conv-editor] form.conv-sheet .cs-table td input:disabled, [data-conv-editor] form.conv-sheet .cs-table td select:disabled { background: #eef0f2; color: var(--muted); cursor: not-allowed; }
[data-conv-editor] form.conv-sheet .cs-table td input.auto-filled { background: var(--auto-fill-bg, #eef0f2); }
[data-conv-editor] form.conv-sheet .cs-table tr[data-locked="true"] td { background: #f1f3f2; }
[data-conv-editor] form.conv-sheet .cs-table td input:invalid { color: var(--bad); }
[data-conv-editor] form.conv-sheet .cs-foot { display: flex; align-items: center; justify-content: space-between; gap: 8px; min-height: 30px; padding: 2px 8px; }
[data-conv-editor] form.conv-sheet .cs-note { display: flex; align-items: flex-start; gap: 6px; margin: 0; padding: 6px 8px; border-top: 1px solid #555; background: #f2f2f2; font-weight: 700; }
[data-conv-editor] form.conv-sheet .cs-note > span { flex: 0 0 auto; white-space: nowrap; }
[data-conv-editor] form.conv-sheet .cs-note textarea { flex: 1 1 auto; min-height: 48px; border: 0; background: transparent; resize: vertical; font-weight: 500; }

/* 2026-10-20 원단 발주 계산 — 재고 배정 결과 띠(EC) */
.calc .po-verdict { margin: 8px 0; padding: 10px 14px; border-radius: 8px; border-left: 5px solid var(--accent); background: var(--accent-soft); font-family: var(--sans); }
.calc .po-verdict.warn { border-left-color: var(--warn); background: var(--warn-soft); }
.calc .po-verdict.bad { border-left-color: var(--bad); background: var(--bad-soft); }
.calc .po-verdict.mute { border-left-color: var(--muted); background: var(--code-bg); }
.calc .po-verdict-title { font-size: 17px; font-weight: 700; color: var(--accent-soft-ink); }
.calc .po-verdict.warn .po-verdict-title { color: var(--warn); }
.calc .po-verdict.bad .po-verdict-title { color: var(--bad); }
.calc .po-verdict .pill { margin-left: 8px; vertical-align: 2px; font-size: 12px; background: var(--accent); color: var(--surface); }
.calc .po-verdict.warn .pill { background: var(--warn); }
.calc .po-verdict.bad .pill { background: var(--bad); }
.calc .po-verdict.mute .pill { background: var(--muted); }
.calc .po-verdict-detail { margin-top: 4px; font-size: 13px; color: var(--ink); }
.calc .po-verdict + .btn { margin-top: 2px; }
td [data-film-verdict] + div { margin-top: 3px; }
/* 2026-10-20 납품 일정 — 수주 수량 대비(적으면 빨강 · 많으면 파랑) · 납품 메모 */
.sh-gap { font-size: 12px; font-weight: 600; margin-top: 2px; }
.sh-gap.less { color: #b03a2e; }
.sh-gap.more { color: #2f4f8a; }
.sh-note { color: #2f6b4f; }
.sh-note-field textarea { width: 100%; }
/* 2026-10-20 팀별 작업스케줄표 줄 순서(화면만) */
.ts-move { display: inline-flex; gap: 3px; white-space: nowrap; }
.ts-move .btn.small { min-width: 26px; padding: 2px 6px; line-height: 1.2; }
.ts-move .btn.small:disabled { opacity: .35; }
[data-team-custom] { margin-left: 4px; }
@media print { .ts-move { display: none !important; } }
/* 2026-10-21 납품 일정 — 롤 수주 수량 "1,000m × 9롤" 아래 총 m */
.sh-qty-sub { font-size: 12px; font-weight: 500; color: var(--muted); margin-top: 1px; }
/* 2026-10-22 인쇄 재고(인쇄만 · 가공 전) */
.print-stock-box { margin-top: 10px; padding-top: 8px; border-top: 1px dashed var(--line); }
.sb-print { color: #8a5a00; font-weight: 700; }
.sb-tiles small.sb-print { display: block; font-size: 12px; font-weight: 600; }
.stock-use-print { display: flex; flex-wrap: wrap; gap: 6px 10px; align-items: center; width: 100%; padding-top: 4px; border-top: 1px dashed var(--line); margin-top: 4px; }
/* 2026-10-22 총괄 작업스케줄표(제품별, overview-ui.mjs) — 위 요약 칸 · 칩 · 경로 화살표 칸 · 공정 칸 표 */
.ov-asof { font-size: 13px; color: var(--muted); margin: 0 0 10px; }
.ov-asof b { color: var(--ink); }
.ov-live { display: inline-block; width: 8px; height: 8px; border-radius: 50%; background: #22a05a; box-shadow: 0 0 0 3px rgba(34,160,90,.2); margin-right: 6px; vertical-align: 1px; }
.ov-kpis { display: grid; grid-template-columns: repeat(5, minmax(0,1fr)); gap: 10px; margin: 0 0 12px; }
.ov-kpi { background: var(--surface); border: 1px solid var(--line); border-radius: 10px; padding: 10px 14px; min-width: 0; }
.ov-kpi .k { font-size: 12.5px; color: var(--muted); font-weight: 700; }
.ov-kpi .v { font-size: 26px; font-weight: 800; line-height: 1.15; margin-top: 2px; }
.ov-kpi .v small { font-size: 14px; color: var(--muted); font-weight: 700; }
.ov-kpi .d { font-size: 12px; color: var(--muted); margin-top: 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.ov-kpi.red { background: var(--bad-soft); border-color: transparent; } .ov-kpi.red .v { color: var(--bad); }
.ov-kpi.orange { background: var(--warn-soft); border-color: transparent; } .ov-kpi.orange .v { color: var(--warn); }
.ov-bar { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin: 0 0 8px; }
.ov-chip { border: 1px solid var(--line); background: var(--surface); color: var(--muted); border-radius: 999px; padding: 5px 12px; font: inherit; font-size: 13px; font-weight: 700; cursor: pointer; }
.ov-chip.on { background: var(--ink); border-color: var(--ink); color: var(--surface); }
.ov-sp { flex: 1; }
.ov-search { width: 220px; height: var(--control-h-dense); border: 1px solid var(--line); border-radius: 8px; padding: 0 10px; font: inherit; font-size: 13px; background: var(--surface); color: var(--ink); }
.ov-toggle { display: inline-flex; border: 1px solid var(--line); border-radius: 8px; overflow: hidden; }
.ov-toggle button { border: 0; background: var(--surface); color: var(--muted); padding: 6px 12px; font: inherit; font-size: 13px; font-weight: 700; cursor: pointer; }
.ov-toggle button.on { background: var(--ink); color: var(--surface); }
.ov-legend { display: flex; flex-wrap: wrap; gap: 6px 14px; font-size: 12px; color: var(--muted); margin: 0 0 10px; }
.ov-legend i { display: inline-block; width: 20px; height: 13px; border-radius: 3px; margin-right: 5px; vertical-align: -2px; box-shadow: inset 0 0 0 1px rgba(0,0,0,.12); }
.ov-legend i.st-done, .ov-seg.st-done, .ov-cell.st-done { background: var(--accent-soft); color: var(--accent-soft-ink); }
.ov-legend i.st-now, .ov-seg.st-now, .ov-cell.st-now { background: var(--accent); color: #fff; }
.ov-legend i.st-ready, .ov-seg.st-ready, .ov-cell.st-ready { background: var(--info-soft); color: var(--info-ink); }
.ov-legend i.st-wait, .ov-seg.st-wait { background: var(--surface-2); color: var(--muted); }
.ov-legend i.st-block, .ov-seg.st-block, .ov-cell.st-block { background: var(--bad-soft); color: var(--bad); }
.ov-legend i.st-out, .ov-seg.st-out, .ov-cell.st-out { background: #f3ecfb; color: #6b21a8; }
.ov-legend i.st-go, .ov-seg.st-go, .ov-cell.st-go { background: var(--warn-soft); color: var(--warn); }
.ov-list { background: var(--surface); border: 1px solid var(--line); border-radius: 12px; overflow: hidden; }
.ov-head, .ov-row { display: grid; grid-template-columns: 104px minmax(220px,1.1fr) 120px 96px minmax(0,3fr); align-items: center; }
.ov-head { background: var(--surface-2); border-bottom: 1px solid var(--line); font-size: 12px; font-weight: 700; color: var(--muted); }
.ov-head > div { padding: 8px 10px; } .ov-head .r { text-align: right; }
.ov-group { background: var(--surface-2); border-top: 1px solid var(--line); border-bottom: 1px solid var(--line); padding: 6px 12px; font-size: 12.5px; font-weight: 800; color: var(--muted); }
.ov-group:first-of-type { border-top: 0; }
.ov-group.late { background: var(--bad-soft); color: var(--bad); }
.ov-group span { font-weight: 600; margin-left: 6px; }
.ov-row { border-bottom: 1px solid var(--line); min-height: 64px; cursor: pointer; }
.ov-row:last-child { border-bottom: 0; }
.ov-row:hover { background: var(--surface-2); }
.ov-row > div { padding: 8px 10px; min-width: 0; }
.ov-due { display: inline-block; font-size: 11.5px; font-weight: 800; border-radius: 4px; padding: 1px 6px; white-space: nowrap; }
.ov-due.late { background: var(--bad); color: #fff; } .ov-due.soon { background: var(--warn-soft); color: var(--warn); } .ov-due.ok { background: var(--surface-2); color: var(--muted); }
.ov-dday { font-size: 12px; color: var(--muted); margin-top: 4px; }
.ov-party { font-size: 12.5px; color: var(--muted); font-weight: 700; }
.ov-no { font-weight: 500; font-size: 11.5px; margin-left: 5px; }
.ov-item { font-weight: 800; font-size: 14px; line-height: 1.3; word-break: keep-all; }
.ov-qty { text-align: right; font-weight: 800; white-space: nowrap; font-variant-numeric: tabular-nums; }
.ov-qty small { display: block; font-size: 11.5px; color: var(--muted); font-weight: 600; }
.ov-prep { display: flex; flex-direction: column; gap: 3px; font-size: 12px; font-weight: 700; white-space: nowrap; }
.ov-prep .ok { color: var(--accent); } .ov-prep .no { color: var(--bad); }
.ov-route { display: flex; gap: 3px; }
.ov-seg { flex: 1 1 0; min-width: 0; height: 48px; padding: 5px 12px 5px 20px; display: flex; flex-direction: column; justify-content: center; clip-path: polygon(0 0, calc(100% - 11px) 0, 100% 50%, calc(100% - 11px) 100%, 0 100%, 11px 50%); }
.ov-seg:first-child { padding-left: 11px; clip-path: polygon(0 0, calc(100% - 11px) 0, 100% 50%, calc(100% - 11px) 100%, 0 100%); }
.ov-seg b { font-size: 13px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.ov-seg small { font-size: 11.5px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.ov-seg.st-wait b { color: var(--ink); opacity: .75; }
.ov-seg.ship { flex: 0 0 136px; padding-right: 10px; background: var(--surface-2); color: var(--muted); border-radius: 0 6px 6px 0; clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%, 11px 50%); }
.ov-seg.ship b { color: var(--ink); opacity: .75; }
.ov-seg.ship.st-go { background: var(--warn-soft); color: var(--warn); } .ov-seg.ship.st-go b { color: var(--warn); opacity: 1; }
.ov-empty { padding: 16px; color: var(--muted); }
.ov-mx-wrap { overflow-x: auto; background: var(--surface); border: 1px solid var(--line); border-radius: 12px; }
.ov-mx { width: 100%; border-collapse: collapse; font-size: 12.5px; min-width: 1000px; }
.ov-mx th { background: var(--surface-2); font-size: 12px; color: var(--muted); font-weight: 700; padding: 7px 5px; border-bottom: 1px solid var(--line); text-align: center; white-space: nowrap; }
.ov-mx th small { display: block; font-weight: 600; font-size: 11px; margin-top: 1px; } .ov-mx th small b { color: var(--accent); }
.ov-mx th.l, .ov-mx td.l { text-align: left; padding-left: 10px; } .ov-mx th.r, .ov-mx td.r { text-align: right; padding-right: 10px; }
.ov-mx td { border-bottom: 1px solid var(--line); padding: 5px 4px; text-align: center; vertical-align: middle; }
.ov-mx td.r { font-weight: 800; white-space: nowrap; font-variant-numeric: tabular-nums; }
.ov-mx tr[data-ov-row] { cursor: pointer; } .ov-mx tr[data-ov-row]:hover td { background: var(--surface-2); }
.ov-mx td.ov-mx-group { background: var(--surface-2); text-align: left; font-weight: 800; color: var(--muted); padding: 6px 12px; }
.ov-mx td.ov-mx-group.late { background: var(--bad-soft); color: var(--bad); }
.ov-mx .ov-prep { align-items: center; }
.ov-cell { display: block; border-radius: 5px; padding: 4px 3px; font-weight: 700; font-size: 11.5px; line-height: 1.3; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 120px; margin: 0 auto 2px; }
.ov-cell.st-wait { border: 1px dashed var(--line-strong); color: var(--muted); padding: 3px 2px; }
.ov-cell.st-plain { color: var(--muted); font-weight: 600; }
.ov-hint { margin-top: 10px; }
:root[data-theme="dark"] .ov-legend i.st-out, :root[data-theme="dark"] .ov-seg.st-out, :root[data-theme="dark"] .ov-cell.st-out { background: #352650; color: #d8c2f5; }
@media screen and (max-width: 1100px) { .ov-kpis { grid-template-columns: repeat(3, minmax(0,1fr)); } }
@media screen and (max-width: 760px) { /* 2026-10-22 인쇄엔 안 씀(세로 A4 폭이 760px보다 좁아 휴대폰 배치가 출력에 섞였음) */
  .ov-kpis { grid-template-columns: repeat(2, minmax(0,1fr)); }
  .ov-search { width: 100%; }
  .ov-head { display: none; }
  .ov-row { grid-template-columns: auto minmax(0,1fr); grid-template-areas: 'due prod' 'due qty' 'route route'; }
  .ov-row > div { padding: 6px 10px; }
  .ov-row > div:nth-child(1) { grid-area: due; align-self: start; } .ov-row > div:nth-child(2) { grid-area: prod; }
  .ov-row > div:nth-child(3) { grid-area: qty; padding-top: 0; } .ov-row > div:nth-child(4) { display: none; }
  .ov-row > div:nth-child(5) { grid-area: route; overflow-x: auto; padding-top: 0; }
  .ov-route { min-width: 560px; }
}
@media print { .ov-bar, .ov-legend, .ov-hint { display: none; } }
.ov-paper td { font-size: 11px; }
/* 2026-10-22 총괄 작업스케줄표 출력 = 화면 [경로로 보기]와 같은 화살표 칸(A4 가로, --ov-k 글자 단계) */
.ov-paper { --ov-k: 1; --surface: #fff; --surface-2: #f2f4f3; --line: #cfd6d2; --line-strong: #9aa39d; --ink: #111; --muted: #555; --accent: #187a4c; --accent-soft: #d9eee1; --accent-soft-ink: #1e6b43; --info-soft: #e4ecfb; --info-ink: #1d4ed8; --bad: #c62828; --bad-soft: #fdecec; --warn: #9a5800; --warn-soft: #fdf1df; background: #fff; color: #111; font-size: calc(11px * var(--ov-k)); -webkit-print-color-adjust: exact; print-color-adjust: exact; }
.ov-paper * { -webkit-print-color-adjust: exact; print-color-adjust: exact; }
.ov-paper .ovp-head h1 { font-size: calc(16px * var(--ov-k)); margin: 0 0 2px; }
.ov-paper .ovp-head h1 small, .ov-paper .ovp-fit { font-size: calc(11px * var(--ov-k)); font-weight: 500; color: #555; margin-left: 6px; }
.ov-paper .ovp-kpi { margin: 0 0 4px; font-size: calc(11px * var(--ov-k)); color: #333; }
.ov-paper .ov-legend { font-size: calc(10px * var(--ov-k)); margin: 0 0 5px; gap: 2px 10px; }
.ov-paper .ov-legend i { width: calc(16px * var(--ov-k)); height: calc(10px * var(--ov-k)); }
.ov-paper .ov-list { border-radius: 6px; overflow: visible; }
.ov-paper .ov-head, .ov-paper .ov-row { grid-template-columns: calc(100px * var(--ov-k)) minmax(150px, 1fr) calc(96px * var(--ov-k)) calc(62px * var(--ov-k)) minmax(0, 3.3fr); }
.ov-paper .ov-head { font-size: calc(10px * var(--ov-k)); }
.ov-paper .ov-head > div, .ov-paper .ov-row > div { padding: calc(3px * var(--ov-k)) calc(6px * var(--ov-k)); }
.ov-paper .ov-group { font-size: calc(10.5px * var(--ov-k)); padding: calc(2px * var(--ov-k)) 8px; break-after: avoid; }
.ov-paper .ov-row { min-height: 0; cursor: default; break-inside: avoid; }
.ov-paper .ov-row:hover { background: none; }
.ov-paper .ov-due { font-size: calc(10px * var(--ov-k)); }
.ov-paper .ov-dday, .ov-paper .ov-party, .ov-paper .ov-no { font-size: calc(10px * var(--ov-k)); }
.ov-paper .ov-dday { margin-top: 1px; }
.ov-paper .ov-item { font-size: calc(11.5px * var(--ov-k)); }
.ov-paper .ov-qty { font-size: calc(11px * var(--ov-k)); } .ov-paper .ov-qty small { font-size: calc(9.5px * var(--ov-k)); }
.ov-paper .ov-prep { font-size: calc(10px * var(--ov-k)); gap: 1px; }
.ov-paper .ov-route { gap: 2px; }
.ov-paper .ov-seg { height: calc(34px * var(--ov-k)); padding: 2px calc(10px * var(--ov-k)) 2px calc(16px * var(--ov-k)); }
.ov-paper .ov-seg:first-child { padding-left: calc(8px * var(--ov-k)); }
.ov-paper .ov-seg b { font-size: calc(11px * var(--ov-k)); } .ov-paper .ov-seg small { font-size: calc(9.5px * var(--ov-k)); }
.ov-paper .ov-seg.ship { flex-basis: calc(118px * var(--ov-k)); }
.ov-paper .job-tag { font-size: calc(9.5px * var(--ov-k)); }
@media print { .ov-paper .ovp-fit { display: none; } }
/* 2026-10-22 납품 스케줄 출력 한 장 맞춤 — 미리보기 = 인쇄(--sch-k 글자 단계 · .sch-dense 촘촘 · 문서 zoom은 fitSchedulePage) */
.schedule-document { --sch-k: 1; font-size: calc(11px * var(--sch-k)); }
.schedule-document h1 { font-size: calc(16px * var(--sch-k)); margin: 0 0 4px; }
.schedule-document .sch-fit-note { font-size: 11px; font-weight: 500; color: #6b6b6b; }
.schedule-document .sch-legend { font-size: calc(10.5px * var(--sch-k)); margin: 0 0 4px; gap: 4px; }
.schedule-document .sch-key { padding: 1px 6px; }
.schedule-document.sch-combined .schedule-lane { margin: 2px 0 0; }
.schedule-document .schedule-lane { margin: 4px 0 8px; }
.schedule-document .schedule-lane > h2 { font-size: calc(14px * var(--sch-k)); margin: 0 0 4px; }
.schedule-document .week-grid { gap: 4px; }
.schedule-document[data-mode="week"] .day { min-height: 140mm; padding: calc(4px * var(--sch-k)); }
.schedule-document .day h3 { font-size: calc(12px * var(--sch-k)); margin: 0 0 3px; }
.schedule-document .card { font-size: calc(10.5px * var(--sch-k)); line-height: 1.28; padding: calc(3px * var(--sch-k)) calc(4px * var(--sch-k)); margin: 0 0 calc(3px * var(--sch-k)); break-inside: avoid; }
.schedule-document .card .st-h { display: flex; flex-wrap: wrap; align-items: baseline; gap: 0 3px; }
.schedule-document .st-n { font-size: .9em; font-weight: 700; color: #555; }
.schedule-document .st-addr { font-size: .92em; }
.schedule-document .st-items { list-style: none; margin: 2px 0 0; padding: 0; }
.schedule-document .st-items li { border-top: 1px dotted rgba(0,0,0,.2); padding: 1px 0 0; }
.schedule-document .st-items li:first-child { border-top: 0; }
.schedule-document .st-items li.done { opacity: .5; text-decoration: line-through; }
.schedule-document .st-row { display: flex; align-items: baseline; gap: 4px; }
.schedule-document .st-item { flex: 1 1 auto; min-width: 0; }
.schedule-document .st-qty { flex: none; font-weight: 700; font-variant-numeric: tabular-nums; white-space: nowrap; }
.schedule-document .card .due-line, .schedule-document .mrow .due-line { font-size: .9em; }
.schedule-document .card.trip ol { margin: 2px 0 0; padding-left: 14px; }
.schedule-document .month-grid th { font-size: calc(11px * var(--sch-k)); padding: 2px; }
.schedule-document .month-grid td { height: 22mm; padding: calc(2px * var(--sch-k)) calc(3px * var(--sch-k)); font-size: calc(10px * var(--sch-k)); }
.schedule-document .month-grid td.other { background: #f2f2f2; }
.schedule-document .month-grid td.m-first { border-left: 2px solid #555; }
.schedule-document .month-grid .dnum { font-size: calc(10.5px * var(--sch-k)); margin: 0 0 1px; }
.schedule-document .month-grid .cnt { font-weight: 600; color: #666; margin-left: 3px; }
.schedule-document .mrow { font-size: calc(9.5px * var(--sch-k)); line-height: 1.25; padding: 1px 3px; margin: 0 0 1px; border: 1px solid #c5ccc7; border-radius: 3px; overflow: hidden; break-inside: avoid; }
.schedule-document .mrow .m-item { color: #333; }
.schedule-document .mrow .m-items { font-size: .88em; color: #555; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.schedule-document .mrow.due-only { border-style: dashed; }
.schedule-document .mrow.done { opacity: .5; }
.schedule-document .sch-tag { font-size: calc(9px * var(--sch-k)); padding: 0 2px; margin: 0 3px 0 0; line-height: 1.2; vertical-align: 1px; }
.schedule-document .chg { display: inline-block; font-size: .85em; font-weight: 800; border: 1px solid currentColor; border-radius: 3px; padding: 0 2px; line-height: 1.2; }
.schedule-document.sch-combined .mrow.m-own { background: #e3f4ea; border-color: #8fc9a8; }
.schedule-document.sch-combined .mrow.m-hired { background: #e4ecfb; border-color: #9db8e8; }
.schedule-document.sch-combined .mrow.m-courier { background: #f0e6fa; border-color: #c2a5e3; }
.schedule-document.sch-combined .mrow.m-pickup { background: #fdf1d6; border-color: #e0c27d; }
/* 촘촘: 제품 · 주소 · 메모를 한 줄로(넘치면 …), 월간은 여러 건 제품 이름 숨김 */
.schedule-document.sch-dense .st-item, .schedule-document.sch-dense .st-addr, .schedule-document.sch-dense .st-note, .schedule-document.sch-dense .mrow { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.schedule-document.sch-dense .st-addr, .schedule-document.sch-dense .st-note { display: block; }
.schedule-document.sch-dense .m-items { display: none; }
@media print { .schedule-document .sch-fit-note { display: none; } }
/* 같은 창 '고객 지급' 체크 셋이 한 줄로 넘쳐 창에 가로 스크롤이 생기던 것(EE '원단 항상 있음') */
.f[data-customer-supplies] > .check-line { flex-wrap: wrap; row-gap: 4px; }
/* 2026-11-03 납품 고정일(ship-fixed.mjs, 공항 등) — 거래처 고정 납품일(2026-10-22) 스타일은 없앰. 남색 = 고정일(배차 색 · 납기 주황 · 늦음 빨강과 겹치지 않게) */
:root { --fx: #26415a; --fx-soft: #e8eef4; --fx-line: #9fb3c6; }
.fx-band { display: flex; align-items: center; gap: 4px; margin: 0 0 3px; padding: 2px 6px; border-radius: 4px; background: var(--fx); color: #fff; font-size: 12px; font-weight: 700; line-height: 1.35; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.fx-band i { font-style: normal; font-size: 11px; font-weight: 600; opacity: .85; }
.ship-cal td.fxday { background: var(--fx-soft); }
.cal-legend .fx-band { display: inline-flex; margin: 0; vertical-align: middle; }
.fx-tag { display: inline-flex; align-items: center; padding: 1px 8px; border-radius: 999px; background: var(--fx); color: #fff; font-size: 12px; font-weight: 700; line-height: 1.5; white-space: nowrap; vertical-align: middle; }
.fx-tag.off { background: var(--surface-2, #eef1ef); color: var(--muted); text-decoration: line-through; }
.fx-note { color: var(--muted); font-size: 12px; font-weight: 500; }
.fixed-warn { display: flex; gap: 6px; align-items: flex-start; margin-top: 4px; padding: 6px 9px; border: 1px solid #e0b84a; border-radius: 6px; background: var(--warn-soft); color: var(--warn); font-size: 12.5px; font-weight: 600; white-space: normal; }
.cd-fixed { display: flex; flex-direction: column; gap: 4px; margin: 4px 0 8px; padding: 6px 8px; border-left: 3px solid var(--fx); background: var(--fx-soft); border-radius: 4px; }
.cd-fx { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 8px; }
.cd-fx .cd-fx-off { color: var(--muted); font-size: 12.5px; }
.sh-day.fxday > .sh-dh { box-shadow: inset 3px 0 0 var(--fx); }
.sh-dh .fx-tag { margin-left: 4px; }
.fx-dialog { display: flex; flex-direction: column; gap: 12px; }
.fx-dialog > p.hint { margin: 0; }
.fx-list { width: 100%; border-collapse: collapse; font-size: 13.5px; }
.fx-list th, .fx-list td { padding: 7px 9px; border-bottom: 1px solid var(--line); text-align: left; vertical-align: middle; }
.fx-list th { background: var(--surface-2, #f7f8f7); color: var(--muted); font-size: 12.5px; font-weight: 600; }
.fx-list .fx-name { color: var(--fx); font-size: 14.5px; }
.fx-list .fx-acts { white-space: nowrap; text-align: right; }
.fx-form { display: flex; flex-direction: column; gap: 10px; padding: 12px; border: 1px solid var(--line); border-radius: 8px; background: var(--surface-2, #f9fbfa); }
.fx-form h3 { margin: 0; font-size: 14px; }
.fx-form .fx-part { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 12px; min-height: 36px; }
.fx-form .fx-part[hidden] { display: none; }
.fx-form .fx-part input[type="number"] { width: 72px; }
.fx-form .fx-next { margin: 0; padding: 7px 10px; border-radius: 6px; background: var(--fx-soft); color: var(--fx); font-size: 13px; font-weight: 600; }
.fx-form .actions { display: flex; gap: 8px; }
/* 출력: 흑백에서도 보이게 검정 바탕 흰 글자 */
.schedule-document .fx-tag { background: #000; color: #fff; font-size: calc(10.5px * var(--sch-k, 1)); padding: 0 6px; margin: 0 4px; -webkit-print-color-adjust: exact; print-color-adjust: exact; }
.schedule-document .month-grid .fx-tag { display: flex; width: fit-content; margin: 0 0 2px; }
.schedule-document .fx-note { font-size: calc(10px * var(--sch-k, 1)); color: #333; }
.schedule-document .sl-day .fx-tag { align-self: center; font-size: 11px; }
.schedule-document .sl-day.today .fx-tag { background: #fff; color: #111; }
.schedule-document .sl-day.today .fx-note { color: #d6dedb; }
/* 2026-10-22 [출고 취소] 창(ship-cancel.mjs) */
.ship-cancel .sc-list { display: flex; flex-direction: column; gap: 6px; margin: 8px 0 10px; }
.ship-cancel .sc-row { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 6px; padding: 7px 10px; border: 1px solid var(--line); border-radius: 8px; cursor: pointer; }
.ship-cancel .sc-row:has(input:checked) { border-color: var(--bad); background: var(--bad-soft); }
.ship-cancel .sc-row.blocked { opacity: .75; cursor: not-allowed; }
/* 2026-10-22 인사관리 달력: 이어진 휴가 = 한 막대(hr-ui.mjs), 칸마다 줄(레인) 자리 */
.hr-cal .month-cal td { position: relative; overflow: visible; }
.hr-cal .hr-slot { position: relative; height: 19px; }
.hr-cal .hr-slot > .cal-ev { margin-top: 2px; }
.hr-cal .hr-slot > .hr-bar { position: absolute; left: 0; top: 0; z-index: 1; width: calc(var(--n) * 100% + (var(--n) - 1) * 11px); box-shadow: 0 1px 0 rgba(0,0,0,.06); }
.hr-cal .hr-span { font-weight: 500; opacity: .75; margin-left: 4px; }
@media (max-width: 700px) { .hr-cal .hr-slot { height: 16px; } }
/* 2026-10-22 출력 고침: 사용자 "출력이 이상해"(세로 용지 · 칸이 세로로 쌓이고 화살표에 가로 스크롤바) — 가로는 납품 스케줄과 같은 이름 붙은 페이지, 출력 문서는 늘 넓은 배치 */
.ov-paper { page: schedule-landscape; }
.ov-paper .ov-head { display: grid; }
.ov-paper .ov-row { grid-template-areas: none; }
.ov-paper .ov-row > div { grid-area: auto; padding-top: calc(3px * var(--ov-k)); }
.ov-paper .ov-row > div:nth-child(4) { display: block; }
.ov-paper .ov-row > div:nth-child(5), .ov-paper .ov-route-wrap { overflow: visible; }
.ov-paper .ov-route { min-width: 0; }
/* 2026-10-22 원단 입고 창: 발주와 롤 수 · 롤 길이가 다르면 알림(막지 않음) */
.receipt-diff { color: var(--warn); font-weight: 600; margin: 4px 0 0; }

/* 2026-10-26 주간 납품 스케줄 출력 = 날짜별 목록표(Q380 B) · 큰 글씨(줄이지 않고 다음 장) — public/delivery-schedule.mjs renderWeekList */
.schedule-document.sch-list { --sch-k: 1; font-size: 13.5px; color: #111; zoom: normal; }
.schedule-document.sch-list, .schedule-document.sch-list * { -webkit-print-color-adjust: exact; print-color-adjust: exact; box-sizing: border-box; }
.schedule-document.sch-list .schedule-lane { margin: 0; break-inside: auto; }
.schedule-document.sch-list .sl-page { width: 1047px; height: 714px; display: flex; flex-direction: column; overflow: hidden; background: #fff; break-after: page; page-break-after: always; }
.schedule-document.sch-list .schedule-lane:last-child .sl-page:last-child { break-after: auto; page-break-after: auto; }
@media screen { .schedule-document.sch-list .sl-page { outline: 1px solid #c3cbc8; outline-offset: 8px; margin: 10px 10px 28px; } .readonly-document:has(.sch-list) { overflow-x: auto; } }
@media print { .schedule-document.sch-list .sl-page { margin: 0; outline: 0; } .readonly-document:has(.sch-list) { padding: 0; margin: 0; } }
.schedule-document .sl-head { display: flex; align-items: baseline; flex-wrap: wrap; gap: 4px 12px; padding: 0 0 7px; }
.schedule-document.sch-list .sl-head h1 { font-size: 20px; font-weight: 800; margin: 0; }
.schedule-document .sl-pno { font-size: 14px; font-weight: 700; color: #3f4a46; }
.schedule-document.sch-list .sl-head .sch-legend { display: flex; gap: 5px; margin: 0 0 0 auto; font-size: 13.5px; align-self: center; }
.schedule-document.sch-list .sch-key { padding: 0 8px; font-weight: 700; border-width: 1.5px; }
.schedule-document .sl-cols { flex: 1; min-height: 0; display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 18px; }
.schedule-document .sl-col { min-width: 0; overflow: hidden; }
.schedule-document .sl-dh { padding-top: 9px; }
.schedule-document .sl-col > .sl-dh:first-child { padding-top: 0; }
.schedule-document .sl-day { display: flex; align-items: baseline; gap: 9px; padding: 2px 9px; background: #eef1f0; border-top: 2px solid #111; border-bottom: 1px solid #111; line-height: 1.25; }
.schedule-document .sl-day b { font-size: 18px; font-weight: 800; }
.schedule-document .sl-day small { font-size: 13px; font-weight: 600; }
.schedule-document .sl-cnt { font-size: 13px; font-weight: 600; color: #3f4a46; }
.schedule-document .sl-day.today { background: #111; color: #fff; }
.schedule-document .sl-day.today .sl-cnt { color: #d6dedb; }
.schedule-document .sl-grp { display: grid; grid-template-columns: 128px minmax(0, 1fr); border-bottom: 1px solid #b9c2be; break-inside: avoid; --sl-bg: #f3f5f4; --sl-bd: #9aa39d; --sl-tx: #333; }
.schedule-document .sl-grp.m-own { --sl-bg: #e3f4ea; --sl-bd: #7fbf98; --sl-tx: #17663f; }
.schedule-document .sl-grp.m-hired { --sl-bg: #e4ecfb; --sl-bd: #8eaee6; --sl-tx: #234f9c; }
.schedule-document .sl-grp.m-courier { --sl-bg: #f0e6fa; --sl-bd: #b896e0; --sl-tx: #68309e; }
.schedule-document .sl-grp.m-pickup { --sl-bg: #fdf1d6; --sl-bd: #d9b56a; --sl-tx: #744b00; }
.schedule-document .sl-pty { border-left: 6px solid var(--sl-bd); background: var(--sl-bg); padding: 2px 7px 3px; line-height: 1.2; min-width: 0; }
.schedule-document .sl-pty b { display: block; font-size: 15.5px; font-weight: 800; }
.schedule-document .sl-pty span { font-size: 12.5px; font-weight: 600; color: #3f4a46; }
.schedule-document .sl-pty i { font-style: normal; font-weight: 800; color: var(--sl-tx); }
.schedule-document .sl-rows { padding: 1px 8px; min-width: 0; }
.schedule-document .sl-r { display: flex; justify-content: space-between; align-items: baseline; gap: 10px; padding: 1px 0; line-height: 1.22; border-bottom: 1px dotted #c6cdca; }
.schedule-document .sl-r:last-child { border-bottom: 0; }
.schedule-document .sl-it { font-size: 13.5px; font-weight: 500; min-width: 0; }
.schedule-document .sl-it > b { font-weight: 800; }
.schedule-document .sl-q { font-size: 14.5px; font-weight: 800; white-space: nowrap; font-variant-numeric: tabular-nums; }
.schedule-document .sl-r.done { color: #6b7470; }
.schedule-document .sl-r.done .sl-it { text-decoration: line-through; }
.schedule-document .sl-ok { font-style: normal; color: #17663f; margin-right: 3px; }
.schedule-document .sl-it .due-line, .schedule-document .sl-at, .schedule-document .sl-part, .schedule-document .sl-cl, .schedule-document .sl-note { font-size: 12px; font-weight: 700; margin-left: 6px; white-space: nowrap; }
.schedule-document .sl-it .due-line { display: inline; border: 0; padding: 0; background: none; color: #333; }
.schedule-document .sl-it .due-line.late { color: #b3261e; }
.schedule-document .sl-at { margin-left: 2px; color: #3f4a46; }
.schedule-document .sl-part { color: #744b00; }
.schedule-document .sl-cl { color: #555; }
.schedule-document .sl-note { color: #68309e; white-space: normal; }
.schedule-document .sl-grp.done .sl-pty b { text-decoration: line-through; color: #6b7470; }
.schedule-document .sl-grp.due-only { border: 1.5px dashed #8d9894; border-top-width: 0; }
.schedule-document .sl-grp.due-only .sl-pty { background: #fff; }
.schedule-document .sl-r.moved { color: #555; }
.schedule-document .sl-addr { padding-top: 10px; font-size: 12px; line-height: 1.4; color: #222; }
.schedule-document .sl-addr span { margin-right: 12px; }
.schedule-document .sl-addr b { font-weight: 800; }
.schedule-document .sl-addr-h { margin-right: 6px; }

/* 2026-10-26 Q383 A 수주 대조 창 — 위 자동 점검 · 왼쪽 고객 발주서 원본 · 오른쪽 ERP에 넣은 값 (public/approval-compare.mjs) */
dialog.modal.ac-dialog { width: min(1480px, 97vw); }
.ac-dialog .ac-body { max-height: 78vh; gap: 10px; }
.ac-top { border: 1px solid var(--line); border-radius: 8px; padding: 8px 12px; background: var(--surface); }
.ac-top > b { font-size: 14px; }
.ac-checks { list-style: none; margin: 6px 0 0; padding: 0; display: grid; gap: 3px; }
.ac-checks li, .ac-line-checks li { font-size: 13.5px; padding: 3px 8px 3px 26px; border-radius: 5px; position: relative; line-height: 1.4; }
.ac-checks li::before, .ac-line-checks li::before { position: absolute; left: 8px; top: 3px; font-weight: 800; }
.ac-checks li.bad, .ac-line-checks li.bad { background: var(--bad-soft); color: var(--bad); font-weight: 700; }
.ac-checks li.bad::before, .ac-line-checks li.bad::before { content: '!'; }
.ac-checks li.warn, .ac-line-checks li.warn { background: var(--warn-soft); color: #7a4b00; }
.ac-checks li.warn::before, .ac-line-checks li.warn::before { content: '△'; font-size: 11px; top: 5px; }
.ac-checks li.info { color: var(--muted); }
.ac-checks li.info::before { content: '·'; }
.ac-ok { margin: 6px 0 0; color: var(--accent); font-weight: 700; }
.ac-split { display: grid; grid-template-columns: minmax(0, 1.15fr) minmax(0, 1fr); gap: 14px; align-items: start; }
.ac-h { font-size: 13px; font-weight: 800; color: var(--muted); margin: 0 0 6px; }
.ac-po { position: sticky; top: 0; }
.ac-po-view { border: 1px solid var(--line); border-radius: 8px; background: #f4f6f5; min-height: 420px; padding: 6px; }
.ac-pdf { width: 100%; height: 62vh; border: 0; background: #fff; display: block; }
.ac-img { display: block; max-width: 100%; max-height: 62vh; margin: 0 auto; background: #fff; }
.ac-none { margin: 40px 16px; text-align: center; color: var(--muted); line-height: 1.7; }
.ac-tabs { display: flex; flex-wrap: wrap; gap: 4px; margin: 0 0 6px; }
.ac-tabs button { border: 1px solid var(--line); background: var(--surface); border-radius: 6px; padding: 3px 9px; font: inherit; font-size: 12.5px; cursor: pointer; }
.ac-tabs button.on { border-color: var(--accent); color: var(--accent); font-weight: 700; }
.ac-kv { display: grid; grid-template-columns: 96px minmax(0, 1fr); gap: 3px 10px; margin: 0; font-size: 14px; }
.ac-kv dt { color: var(--muted); font-size: 12.5px; padding-top: 2px; }
.ac-kv dd { margin: 0; word-break: keep-all; }
.ac-big { font-size: 15.5px; }
.ac-erp > .ac-kv { padding: 8px 10px; border: 1px solid var(--line); border-radius: 8px; margin-bottom: 10px; }
.ac-line { border: 1px solid var(--line); border-left: 4px solid var(--line-strong); border-radius: 8px; padding: 8px 10px; margin: 0 0 8px; }
.ac-line.has-check { border-left-color: var(--warn); }
.ac-line-h { display: flex; align-items: baseline; flex-wrap: wrap; gap: 6px; font-size: 15px; font-weight: 700; margin: 0 0 6px; }
.ac-no { display: inline-grid; place-items: center; min-width: 22px; height: 22px; border-radius: 11px; background: var(--ink); color: #fff; font-size: 12px; }
.ac-line-checks { list-style: none; margin: 6px 0 0; padding: 0; display: grid; gap: 3px; }
.ac-dialog .mf .ac-state { margin-right: auto; }
@media (max-width: 1000px) { .ac-split { grid-template-columns: 1fr; } .ac-po { position: static; } }
/* 2026-10-26 Q385 A 수주 목록 결재 칸 · 결재함 '확인 n' */
.ol-appr { border: 0; cursor: pointer; font: inherit; font-size: 12px; white-space: nowrap; }
.ol-appr.mine { outline: 2px solid var(--warn); font-weight: 800; }
.ol-appr.mute { color: var(--muted); }
[data-appr-checks] { margin-left: 4px; font-size: 11.5px; }

/* 2026-10-26 Q386 A ~ Q389 A 보류(public/line-hold.mjs) — 보류 표시 · 보류 창 빠른 이유 · 인쇄 · 가공 스케줄 [보류] 목록 · 홈 알림 */
.hold-pill { margin-left: 4px; font-size: 11.5px; vertical-align: 1px; cursor: default; }
.hold-quick { display: flex; flex-wrap: wrap; gap: 4px; margin: -4px 0 6px; }
.sched-hold-list .hold-why { font-weight: 700; color: #7a4b00; }
.sched-hold-list .hold-why.late { color: var(--bad); }
.sched-hold-list td .btn + .btn { margin-left: 4px; }
.kpi.hold-kpi .n { color: #7a4b00; }
.hold-notice { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 10px; border: 1px solid var(--warn); background: var(--warn-soft); border-radius: 8px; padding: 7px 12px; margin: 0 0 10px; }
.hold-notice b { color: #7a4b00; }
.due-anytime { color: var(--muted); font-weight: 700; }

/* 2026-10-26 원단 발주 ↔ 수주 연결(src/purchase-link.mjs · public/purchase-link.mjs · schedules.mjs [롤] 창) */
.roll-po { border: 1px solid var(--line); border-radius: 8px; padding: 8px 10px; margin-top: 10px; background: var(--surface-2); }
.roll-po.want { border-color: var(--accent); background: var(--accent-soft); }
.roll-po-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 4px 0; border-top: 1px dotted var(--line); }
.roll-po-row:first-of-type { border-top: 0; }
[data-purchase-line] [data-source] .btn, [data-edit-purchase-line] [data-source] .btn { margin-left: 4px; }
[data-link-label] { font-weight: 700; color: var(--ink); }

/* 2026-10-27 Q393 A · Q394 A 재고 사용 · 완료 전 실물 확인(같은 제품 진행 수주 · 재고 출처) */
.stock-caution { display: flex; flex-direction: column; gap: 2px; margin: 6px 0 2px; padding: 6px 10px; border-left: 3px solid #e0b84a; border-radius: 4px; background: var(--warn-soft, #fff7e6); color: var(--ink, #222); font-size: 12.5px; line-height: 1.45; }
.stock-caution b { color: var(--warn, #b7791f); font-weight: 700; }
.stock-use .stock-caution { flex-basis: 100%; }

/* 2026-10-23 인쇄 일지 양식 화면(엑셀 한 장처럼) — 인쇄_작업일지_A4 · 스캔본 모양 */
[data-print-editor] form.print-sheet { background: #fff; border: 1px solid var(--line-strong, #9aa39d); border-radius: 8px; padding: 14px; margin-top: 8px; }
[data-print-editor] form.print-sheet > .sheet.cs-head { border: 0; border-radius: 0; padding: 0; margin: 0 0 12px; background: none; box-shadow: none; }
[data-print-editor] form.print-sheet table { width: 100%; border-collapse: collapse; table-layout: fixed; }
[data-print-editor] form.print-sheet .cs-top { border: 2px solid #222; }
[data-print-editor] form.print-sheet .cs-top th, [data-print-editor] form.print-sheet .cs-top td { border: 1px solid #444; padding: 2px 10px; height: 38px; }
[data-print-editor] form.print-sheet .cs-top col.cs-sign { width: 78px; }
[data-print-editor] form.print-sheet .cs-top col.ps-gyeol { width: 34px; }
[data-print-editor] form.print-sheet .cs-top col.ps-c-day { width: 19%; }
[data-print-editor] form.print-sheet .cs-top col.ps-c-shift { width: 31%; }
[data-print-editor] form.print-sheet .cs-top td.cs-stamp { height: 58px; } /* 2026-10-28 결재 도장 칸 = 한 줄 높이(종이처럼) */
[data-print-editor] form.print-sheet .cs-top .ps-gyeol-l { padding: 0; background: #e7e7e7; font-size: 14px; font-weight: 700; line-height: 1.7; text-align: center; }
[data-print-editor] form.print-sheet .cs-top .cs-title { height: 52px; font-size: 26px; font-weight: 800; letter-spacing: 2px; text-align: center; color: #111; background: #f2f2f2; }
[data-print-editor] form.print-sheet .cs-top th:not(.cs-title):not(.ps-gyeol-l) { background: #e7e7e7; font-size: 14px; font-weight: 700; text-align: center; }
[data-print-editor] form.print-sheet .cs-top .ps-machine { height: 40px; min-width: 64px; margin: 0 4px; padding: 0 6px; border: 0; border-bottom: 2px solid #333; border-radius: 0; background: transparent; font-size: 24px; font-weight: 800; text-align: center; }
[data-print-editor] form.print-sheet .cs-kv { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 6px; font-weight: 700; white-space: nowrap; }
[data-print-editor] form.print-sheet .cs-kv input:not([type="checkbox"]), [data-print-editor] form.print-sheet .cs-kv select { height: 30px; min-width: 0; border: 0; border-bottom: 1px solid #bbb; border-radius: 0; background: transparent; padding: 0 4px; font-weight: 500; }
[data-print-editor] form.print-sheet .cs-kv input[name="lunch"], [data-print-editor] form.print-sheet .cs-kv input[name="dinner"] { width: 56px; text-align: right; }
[data-print-editor] form.print-sheet .cs-kv input[name="overtime"], [data-print-editor] form.print-sheet .cs-kv input[name="note"] { flex: 1 1 auto; }
[data-print-editor] form.print-sheet .ps-workers .worker-picker { margin: 0; padding: 0; border: 0; min-width: 0; }
[data-print-editor] form.print-sheet .ps-workers .worker-picker legend { display: none; }
[data-print-editor] form.print-sheet .ps-workers .worker-choices { display: flex; flex-wrap: wrap; align-items: center; gap: 2px 14px; font-weight: 500; }
[data-print-editor] form.print-sheet .ps-workers .worker-extra { display: inline-flex; align-items: center; gap: 6px; }
[data-print-editor] form.print-sheet .ps-workers .worker-extra .l { font-size: 12px; color: var(--muted); }
[data-print-editor] form.print-sheet .ps-workers .worker-choice { min-height: 0; height: auto; padding: 3px 10px; font-size: 14px; }
[data-print-editor] form.print-sheet .ps-blocks { display: grid; grid-template-columns: 1fr; gap: 14px; }
[data-print-editor] form.print-sheet .ps-block { display: grid; grid-template-columns: minmax(0, 1.08fr) minmax(0, 1fr); border: 2px solid #222; background: #fff; }
@media (max-width: 1100px) { [data-print-editor] form.print-sheet .ps-block { grid-template-columns: 1fr; } [data-print-editor] form.print-sheet .ps-left { border-right: 0; border-bottom: 2px solid #222; } }
[data-print-editor] form.print-sheet .ps-left { display: flex; flex-direction: column; border-right: 2px solid #222; }
[data-print-editor] form.print-sheet .ps-right { display: flex; flex-direction: column; }
[data-print-editor] form.print-sheet .ps-meta { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 10px; min-height: 36px; padding: 2px 8px; border-bottom: 1px solid #555; }
[data-print-editor] form.print-sheet .ps-meta label, [data-print-editor] form.print-sheet .ps-meta > span { display: inline-flex; align-items: center; gap: 4px; margin: 0; font-weight: 700; white-space: nowrap; }
[data-print-editor] form.print-sheet .ps-meta input:not([type="checkbox"]):not([type="hidden"]), [data-print-editor] form.print-sheet .ps-meta select { height: 30px; min-width: 0; border: 0; border-bottom: 1px solid #bbb; border-radius: 0; background: transparent; padding: 0 4px; font-weight: 500; }
[data-print-editor] form.print-sheet .ps-meta .cs-item { flex: 1 1 auto; min-width: 0; }
[data-print-editor] form.print-sheet .ps-meta .cs-item select { flex: 1 1 auto; width: 100%; min-width: 0; }
[data-print-editor] form.print-sheet .ps-meta .ps-speed input { width: 72px; text-align: right; }
[data-print-editor] form.print-sheet .ps-meta .ps-mat { flex: 0 1 auto; }
[data-print-editor] form.print-sheet .ps-meta .ps-mat b { font-weight: 600; }
[data-print-editor] form.print-sheet .ps-meta .ps-note { flex: 1 1 260px; }
[data-print-editor] form.print-sheet .ps-meta .ps-note input { flex: 1 1 auto; width: 100%; }
[data-print-editor] form.print-sheet .ps-meta input.ps-num { width: 70px; text-align: right; }
[data-print-editor] form.print-sheet .ps-meta input.ps-short { width: 84px; }
[data-print-editor] form.print-sheet .ps-meta input.auto-filled, [data-print-editor] form.print-sheet .ps-colors input.auto-filled, [data-print-editor] form.print-sheet .ps-rolls td input.auto-filled { background: var(--auto-fill-bg, #eef0f2); }
[data-print-editor] form.print-sheet .ps-rolls { border-bottom: 1px solid #555; }
[data-print-editor] form.print-sheet .ps-rolls col.ps-c-no { width: 40px; }
[data-print-editor] form.print-sheet .ps-rolls col.ps-c-lotno { width: 17%; }
[data-print-editor] form.print-sheet .ps-rolls col.ps-c-def { width: 11%; }
[data-print-editor] form.print-sheet .ps-rolls col.ps-c-film { width: 25%; }
[data-print-editor] form.print-sheet .ps-rolls th, [data-print-editor] form.print-sheet .ps-rolls td { border: 1px solid #555; height: 32px; padding: 0; text-align: center; vertical-align: middle; }
[data-print-editor] form.print-sheet .ps-rolls tr > :first-child { border-left: 0; }
[data-print-editor] form.print-sheet .ps-rolls tr > :last-child { border-right: 0; }
[data-print-editor] form.print-sheet .ps-rolls thead th { height: 28px; background: #f5f5f5; font-size: 13px; font-weight: 700; }
[data-print-editor] form.print-sheet .ps-rolls tfoot th, [data-print-editor] form.print-sheet .ps-rolls tfoot td { background: #f5f5f5; font-size: 13px; font-weight: 700; }
[data-print-editor] form.print-sheet .ps-rolls td.cs-n { font-size: 13px; font-weight: 700; }
[data-print-editor] form.print-sheet .ps-rolls td.ps-lotno { padding: 0 4px; font-size: 12px; color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
[data-print-editor] form.print-sheet .ps-rolls td input, [data-print-editor] form.print-sheet .ps-rolls td select { display: block; width: 100%; height: 31px; min-width: 0; margin: 0; padding: 0 3px; border: 0; border-radius: 0; background: transparent; text-align: center; font-size: 14px; box-shadow: none; }
[data-print-editor] form.print-sheet .ps-rolls td.cs-lot select { padding-left: 4px; text-align: left; font-size: 12.5px; }
[data-print-editor] form.print-sheet .ps-mcell { display: flex; align-items: center; height: 100%; }
[data-print-editor] form.print-sheet .ps-mcell input, [data-print-editor] form.print-sheet .ps-mcell b { flex: 1 1 auto; min-width: 0; text-align: right !important; }
[data-print-editor] form.print-sheet .ps-mcell i { padding: 0 6px 0 3px; font-size: 12px; font-style: normal; color: #555; }
[data-print-editor] form.print-sheet .ps-rolls td input:focus, [data-print-editor] form.print-sheet .ps-rolls td select:focus, [data-print-editor] form.print-sheet .ps-colors input:focus { outline: 2px solid var(--accent); outline-offset: -2px; background: #fffbe6; }
[data-print-editor] form.print-sheet .ps-rolls td input:disabled, [data-print-editor] form.print-sheet .ps-rolls td select:disabled { background: #eef0f2; color: var(--muted); cursor: not-allowed; }
[data-print-editor] form.print-sheet .ps-rolls tr[data-locked="true"] td { background: #f1f3f2; }
[data-print-editor] form.print-sheet .cs-foot { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 10px; min-height: 30px; padding: 2px 8px; }
[data-print-editor] form.print-sheet .cs-link { height: auto; min-height: 0; padding: 0 4px; border: 0; background: none; color: var(--accent); font-size: 13px; text-decoration: underline; text-underline-offset: 3px; white-space: nowrap; cursor: pointer; }
[data-print-editor] form.print-sheet .cs-tools { display: inline-flex; gap: 2px; }
[data-print-editor] form.print-sheet .cs-wind { margin-left: auto; font-size: 12px; color: var(--muted); white-space: normal; }
[data-print-editor] form.print-sheet .ps-colors { border-bottom: 1px solid #555; }
[data-print-editor] form.print-sheet .ps-colors th, [data-print-editor] form.print-sheet .ps-colors td { border: 1px solid #555; height: 30px; padding: 0; text-align: center; font-size: 13px; }
[data-print-editor] form.print-sheet .ps-colors tr > :first-child { width: 92px; border-left: 0; background: #f5f5f5; font-weight: 700; }
[data-print-editor] form.print-sheet .ps-colors tr > :last-child { border-right: 0; }
[data-print-editor] form.print-sheet .ps-colors tr:first-child th { background: #f5f5f5; }
[data-print-editor] form.print-sheet .ps-colors input { width: 100%; height: 29px; min-width: 0; padding: 0 2px; border: 0; border-radius: 0; background: transparent; text-align: center; font-size: 13px; }
[data-print-editor] form.print-sheet .ps-picks { gap: 2px 4px; }
[data-print-editor] form.print-sheet .ps-pick { height: auto; min-height: 0; padding: 1px 9px; border: 2px solid transparent; border-radius: 999px; background: none; color: inherit; font: inherit; font-weight: 500; cursor: pointer; }
[data-print-editor] form.print-sheet .ps-pick:hover:not(:disabled) { background: var(--surface-2, #f3f5f3); }
[data-print-editor] form.print-sheet .ps-pick[aria-pressed="true"] { border-color: var(--accent); color: var(--accent); font-weight: 800; }
[data-print-editor] form.print-sheet .ps-proof label { font-weight: 500; }
[data-print-editor] form.print-sheet .ps-stages { display: grid; grid-template-columns: minmax(0, 1fr) 190px; gap: 10px; align-items: center; padding: 6px 8px; }
[data-print-editor] form.print-sheet .ps-chart-box .ps-chart { display: block; width: 100%; height: auto; }
[data-print-editor] form.print-sheet .ps-legend { display: grid; gap: 4px; }
[data-print-editor] form.print-sheet .ps-stage { display: flex; align-items: center; justify-content: space-between; gap: 6px; margin: 0; font-size: 13px; font-weight: 700; }
[data-print-editor] form.print-sheet .ps-stage .cs-tw { position: relative; width: 96px; }
[data-print-editor] form.print-sheet .ps-stage input { width: 100%; height: 30px; padding: 0 28px 0 4px; border: 0; border-bottom: 1px solid #bbb; border-radius: 0; background: transparent; text-align: center; font-size: 14px; }
[data-print-editor] form.print-sheet .ps-stage .cs-now { position: absolute; right: 2px; top: 50%; transform: translateY(-50%); display: inline-flex; align-items: center; justify-content: center; width: 26px; height: 26px; min-height: 0; padding: 0; border: 0; border-radius: 50%; background: none; color: var(--accent); cursor: pointer; }
[data-print-editor] form.print-sheet .ps-stage .cs-now:hover { background: var(--accent-soft, #e2f3e9); }
[data-print-editor] form.print-sheet .ps-season { margin: 10px 2px 0; font-size: 14px; font-weight: 700; text-align: center; }
/* 진행 시간표(화면 · 종이 같이) */
.ps-chart .ps-ch-h { font-size: 9px; font-weight: 700; fill: #222; }
.ps-chart .ps-ch-n { font-size: 7px; fill: #666; }
.ps-chart .ps-ch-axis, .ps-chart .ps-ch-tick { stroke: #333; stroke-width: 1; }
.ps-chart .ps-ch-mark line { stroke: var(--accent, #1e8e5a); stroke-width: 2; }
.ps-chart .ps-ch-mark circle { fill: #fff; stroke: var(--accent, #1e8e5a); stroke-width: 1.5; }
.ps-chart .ps-ch-mark text { font-size: 8px; font-weight: 800; fill: var(--accent, #1e8e5a); }
.print-paper .ps-chart .ps-ch-mark line, .print-paper .ps-chart .ps-ch-mark circle { stroke: #111; }
.print-paper .ps-chart .ps-ch-mark text { fill: #111; }
/* 인쇄 일지 종이 양식 출력(A4 가로 · 제품 구역 2개) */
.print-paper { color: #111; font-size: 11.5px; line-height: 1.3; } /* 2026-10-23 한 장 = 제품 하나 — 줄 · 글자 크게 */
.print-paper .pp-page { width: 281mm; margin: 0 auto 8mm; display: flex; flex-direction: column; gap: 2mm; }
.print-paper .pp-page + .pp-page { break-before: page; }
.print-paper.paper-document table { width: 100%; border-collapse: collapse; table-layout: fixed; }
.print-paper.paper-document th, .print-paper.paper-document td { border: 1px solid #222; padding: 0 1.2mm; height: 5mm; font-weight: 400; vertical-align: middle; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; overflow-wrap: normal; word-break: keep-all; } /* print.css .paper-document overflow-wrap:anywhere 이김 */
.print-paper .pp-top { border: 1.5px solid #111; }
.print-paper .pp-top col.pp-sign { width: 17mm; }
.print-paper .pp-top col.pp-gyeol { width: 7mm; }
.print-paper.paper-document .pp-top .pp-title { height: 10mm; padding-left: 4mm; font-size: 20px; font-weight: 800; text-align: left; }
.print-paper.paper-document .pp-top th:not(.pp-title) { background: #eee; font-size: 11px; font-weight: 700; text-align: center; }
.print-paper.paper-document .pp-top .pp-gyeol-l { padding: 0; line-height: 1.5; }
.print-paper.paper-document .pp-info { padding: 1mm 3mm; white-space: normal; line-height: 1.9; font-size: 11px; }
.print-paper .pp-info span { margin-right: 7mm; }
.print-paper.paper-document .pp-stamp { height: 10mm; }
.print-paper .pp-block { display: grid; grid-template-columns: 52% 48%; border: 1.5px solid #111; }
.print-paper .pp-rolls col.pp-c-no { width: 8mm; }
.print-paper .pp-rolls col.pp-c-lot { width: 24mm; }
.print-paper .pp-rolls col.pp-c-def { width: 15mm; }
.print-paper.paper-document .pp-th th:first-child, .print-paper.paper-document .pp-row td.pp-n, .print-paper.paper-document .pp-sum th { padding: 0; }
.print-paper .pp-rolls col.pp-c-film { width: 27mm; }
.print-paper .pp-rolls tr > :first-child { border-left: 0; }
.print-paper .pp-rolls tr:first-child > * { border-top: 0; }
.print-paper .pp-rolls tr:last-child > * { border-bottom: 0; }
.print-paper.paper-document .pp-meta td { height: 7mm; }
.print-paper.paper-document .pp-th th { height: 6mm; background: #f2f2f2; font-weight: 700; text-align: center; }
.print-paper.paper-document .pp-row td { height: 6.2mm; text-align: center; }
.print-paper.paper-document .pp-row td.pp-n { font-weight: 700; }
.print-paper.paper-document .pp-row td.pp-l { text-align: left; font-size: 9.5px; }
.print-paper.paper-document td.pp-m { text-align: right; }
.print-paper .pp-m i { margin-left: 1mm; font-size: 8.5px; font-style: normal; color: #444; }
.print-paper.paper-document .pp-sum th, .print-paper.paper-document .pp-sum td { background: #f2f2f2; font-weight: 700; text-align: center; }
.print-paper .pp-right { display: flex; flex-direction: column; gap: 2mm; padding: 2mm 3mm; border-left: 1.5px solid #111; }
.print-paper .pp-line { display: flex; flex-wrap: wrap; gap: 1mm 4mm; white-space: nowrap; }
.print-paper.paper-document .pp-colors th, .print-paper.paper-document .pp-colors td { height: 6.5mm; padding: 0 0.6mm; text-align: center; font-size: 10.5px; }
.print-paper.paper-document .pp-colors tr > :first-child { width: 17mm; background: #f2f2f2; }
.print-paper .pp-pick { padding: 0 1.2mm; border: 1px solid transparent; border-radius: 999px; }
.print-paper .pp-pick.on { border: 1.5px solid #111; font-weight: 700; }
.print-paper .pp-chart .ps-chart { display: block; width: 100%; height: auto; max-height: 62mm; }
.print-paper .pp-legend { display: flex; border: 1px solid #222; }
.print-paper .pp-legend span { flex: 1 1 0; padding: 1mm 0; border-right: 1px solid #222; font-size: 10.5px; text-align: center; }
.print-paper .pp-legend span:last-child { border-right: 0; }
.print-paper .pp-season { margin-top: 1mm; font-size: 11.5px; font-weight: 700; text-align: center; white-space: pre; }
@media print { .print-paper .pp-page { margin: 0 auto; } }

/* 2026-10-28 [태그] 창 제품 구분 · 총괄 작업스케줄표 공정 칸 → [완료] */
.tag-kind { display: grid; grid-template-columns: 72px 1fr; align-items: center; gap: 8px; margin-bottom: 6px; }
.tag-kind > .l { font-size: 12.5px; font-weight: 700; color: var(--muted, #666); }
.tag-kind .tag-picks { margin-bottom: 0; }
.tag-plain { display: inline-block; padding: 0 7px; border: 1px solid var(--line, #ccc); border-radius: 3px; font-size: 12px; font-weight: 700; line-height: 1.45; color: var(--ink, #222); }
.ov-seg.ov-done-able, .ov-cell.ov-done-able { cursor: pointer; }
.ov-seg.ov-done-able:hover, .ov-cell.ov-done-able:hover { filter: brightness(.9) saturate(1.15); }
.ov-seg.ov-done-able:hover b { text-decoration: underline; }

/* 2026-10-28 누락 점검(missing-ui.mjs) — 홈 알림 줄 · 규칙 칩 · 규칙별 줄 · 확인한 것 */
.missing-notice { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 10px; width: 100%; border: 1px solid var(--bad, #c62828); background: var(--bad-soft, #fdecec); border-radius: 8px; padding: 7px 12px; margin: 0 0 10px; font: inherit; font-size: 13.5px; text-align: left; cursor: pointer; color: var(--ink); }
.missing-notice b { color: var(--bad, #c62828); }
.ms-asof { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 14px; font-size: 13px; color: var(--muted); margin: 0 0 6px; }
.ms-asof b { color: var(--ink); }
.ms-digest { margin-left: auto; display: inline-flex; align-items: center; gap: 6px; }
.ms-chips { display: flex; flex-wrap: wrap; gap: 6px; margin: 8px 0 12px; }
.ms-chip { border: 1px solid var(--line); background: var(--surface); color: var(--ink); border-radius: 999px; padding: 4px 11px; font: inherit; font-size: 12.5px; cursor: pointer; }
.ms-chip small { color: var(--muted); font-size: 11px; margin-right: 2px; }
.ms-chip b { margin-left: 3px; }
.ms-chip.hit { border-color: var(--bad, #c62828); } .ms-chip.hit b { color: var(--bad, #c62828); }
.ms-chip.zero { opacity: .55; }
.ms-chip.on { background: var(--ink); border-color: var(--ink); color: var(--surface); opacity: 1; } .ms-chip.on b, .ms-chip.on small { color: inherit; }
.ms-rule { background: var(--surface); border: 1px solid var(--line); border-radius: 10px; padding: 8px 12px; margin: 0 0 10px; }
.ms-rule h3 { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 8px; font-size: 14px; margin: 2px 0 6px; }
.ms-rule h3 b { color: var(--bad, #c62828); }
.ms-rule h3 small { flex-basis: 100%; font-weight: 400; color: var(--muted); font-size: 12px; }
.ms-g { display: inline-block; padding: 0 6px; border-radius: 3px; background: var(--surface-2, #f1f1f1); color: var(--muted); font-size: 11px; font-weight: 700; }
.ms-row { display: grid; grid-template-columns: minmax(180px, 2fr) minmax(160px, 3fr) auto; gap: 4px 12px; align-items: center; padding: 6px 0; border-top: 1px solid var(--line); font-size: 13px; }
.ms-row .ms-who { font-weight: 700; }
.ms-row .ms-act { display: inline-flex; gap: 4px; justify-content: flex-end; }
.ms-row.acked { opacity: .8; }
.ms-empty { padding: 18px; text-align: center; color: var(--muted); background: var(--surface); border: 1px dashed var(--line); border-radius: 10px; }
.ms-foot { margin: 6px 0; }
.ms-acked { background: var(--surface); border: 1px dashed var(--line); border-radius: 10px; padding: 6px 12px; }
@media screen and (max-width: 760px) { .ms-row { grid-template-columns: 1fr; } .ms-row .ms-act { justify-content: flex-start; } .ms-digest { margin-left: 0; } }
/* 2026-10-29 Q406 log-surplus */
.log-surplus { display: grid; gap: 6px; margin: 0 0 10px; padding: 10px 12px; border: 1px solid #e7c98a; border-radius: 8px; background: #fff9ec; color: #6b4a12; }
.log-surplus legend { padding: 0 6px; font-weight: 600; }
.log-surplus .hint { color: #7a6340; }
.log-surplus input[name="surplus_qty"] { width: 110px; margin: 0 4px; }
[data-audit-note] { margin: 4px 0 8px; }
/* 2026-10-29 Q407 core-pair */
.plate-yellow .core-pair .core-in { display: flex; gap: 10px; align-items: center; }
.plate-yellow .core-pair .core-in label { display: flex; gap: 4px; align-items: center; white-space: nowrap; }
.plate-yellow .core-pair .core-in input { width: 72px; }
.plate-yellow .core-pair [data-core-hint]:empty { display: none; }
/* 2026-10-29 sched roll-cell fit */
.sched-table td.roll-cell { white-space: normal; text-align: left; min-width: 9.5em; max-width: 15em; padding-left: 8px; }
.sched-table td.roll-cell .hint { white-space: normal; overflow-wrap: anywhere; }
.sched-table td.roll-cell .roll-film { font-size: 12.5px; color: var(--ink, #1d2320); white-space: nowrap; }
/* 줄 끝 단추(완료 · 롤 · 메모 · 태그 · 보류 · 지시서)가 한 줄에 하나씩 쌓여 줄이 200px 넘게 높았음 → 세 개씩 두 줄 */
.sched-table td.row-actions { width: auto; min-width: 12em; max-width: 13.5em; white-space: normal; }
.sched-table td.row-actions .btn { display: inline-block; width: auto; margin: 2px 3px 2px 0; padding: 0 8px; }
/* 2026-10-29 Q410 A print-left */
.print-left-box { margin: 8px 0 0; padding: 8px 10px; border: 1px solid #b9d4c4; border-radius: 8px; background: #f2f8f4; }
.print-left-box input[name="pl_m"] { width: 110px; margin: 0 4px; }
.print-left-box .hint { margin: 4px 0 0; }
/* 2026-10-29 Q414 A · Q415 A · Q416 A print-input */
.print-input { display: flex; flex-direction: column; gap: 8px; margin: 8px 0 0; }
.print-input .pin-row, .print-input .film-use-row { grid-template-columns: repeat(4, minmax(0, 1fr)) auto auto; align-items: end; }
.film-in { align-self: center; font-size: 12.5px; color: #4a5550; white-space: nowrap; }
.pin-total { font-weight: 700; margin-left: 8px; }
.pin-yield { display: block; min-height: 32px; padding: 6px 8px; border-radius: 6px; background: #eef1ef; color: #4a5550; }
.reason-chips { display: flex; flex-wrap: wrap; gap: 6px; }
.reason-chip { display: inline-flex; align-items: center; cursor: pointer; }
.reason-chip input { position: absolute; opacity: 0; width: 1px; height: 1px; }
.reason-chip span { border: 1px solid #c3cbc7; border-radius: 999px; padding: 4px 12px; background: #fff; font-size: 13px; }
.reason-chip input:checked + span { background: #fbe3e0; border-color: #d98b81; color: #8e2a1f; font-weight: 700; }
.reason-chip input:focus-visible + span { outline: 2px solid #0b5cad; outline-offset: 2px; }
.defect-box { margin: 8px 0 0; padding: 8px 10px; border: 1px solid #efc9c4; border-radius: 8px; background: #fdf7f6; }
.back-rolls { margin: 8px 0 0; padding: 8px 10px; border: 1px solid #b9d4c4; border-radius: 8px; background: #f2f8f4; }
.back-list { display: flex; flex-direction: column; gap: 4px; }
.back-row { display: grid; grid-template-columns: minmax(0, 1.4fr) 90px 150px 120px minmax(0, 1.2fr); gap: 8px; align-items: center; }
.back-row .num { text-align: right; }
.back-out { font-size: 12.5px; color: #4a5550; }
.back-out.ok { color: #1f7a4d; }
.back-out.warn { color: #c0392b; }
/* 2026-10-29 Q417 A margin-compare */
.margin-compare { margin-top: 8px; }
form[data-purchase] .margin-compare table { border-collapse: collapse; width: auto; min-width: 420px; max-width: 720px; font-size: 13px; background: #fff; }
.margin-compare th, .margin-compare td { border: 1px solid #dfe5e2; padding: 4px 10px; }
.margin-compare th { background: #f2f4f3; font-weight: 600; text-align: left; }
.margin-compare .num { text-align: right; white-space: nowrap; }
.margin-compare tr.on td { background: #eef7f1; font-weight: 700; }
/* 2026-10-29 ship-held */
.sh-held { margin: 12px 0 0; padding: 8px 12px; border: 1px solid #f0d9a8; border-radius: 8px; background: #fffaf0; }
.sh-held > summary { cursor: pointer; padding: 2px 0; }
.sh-held .sh-held-row { margin-top: 6px; }
/* 2026-10-30 job-parts */
.part-box { border: 1px solid #d5dbd8; border-radius: 8px; padding: 8px 10px; margin: 0 0 10px; background: #f8faf9; }
.part-box > .sec { margin: 0 0 6px; }
.part-opts { display: flex; flex-direction: column; gap: 6px; }
.part-opt { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.part-opt.on { font-weight: 600; }
.part-rolls { width: 72px; }
.part-reason { margin-top: 6px; }
.part-n { font-style: normal; font-size: 11.5px; color: #0b5cad; font-weight: 700; margin-left: 3px; }

/* ── 2026-11-02 작업스케줄표 → 생산일지: 줄 · 제품명을 누르면 그 제품 일지(log-jump.mjs) ── */
.team-hybrid-screen tr[data-log-job] { cursor: pointer; }
.team-hybrid-screen tr[data-log-job]:hover > td, .team-hybrid-screen tr[data-log-job]:hover + tr.hy-memo-row > td { background: var(--accent-soft, #e2f3e9); }
.team-hybrid-screen tr[data-log-job] td:nth-child(2) .hy-big { text-decoration: underline dotted var(--line-strong); text-underline-offset: 4px; }
.team-hybrid-screen tr[data-log-job]:hover td:nth-child(2) .hy-big { color: var(--accent); text-decoration-color: var(--accent); }
.log-jump { border: 0; background: none; padding: 0; margin: 0; min-height: 0; height: auto; font: inherit; color: inherit; text-align: left; cursor: pointer; text-decoration: underline dotted var(--line-strong); text-underline-offset: 3px; }
.log-jump:hover { color: var(--accent); text-decoration-color: var(--accent); }
.log-jump-note { margin: 0 0 12px; padding: 10px 14px; border-left: 4px solid var(--warn, #b54708); border-radius: 6px; background: var(--warn-soft, #fff4e5); font-size: 15px; font-weight: 600; }

/* ── 2026-11-02 사용자 "생산일지는 13인치 태블릿을 기준으로 비율이랑 아이콘 크기 맞춰줘 (ideal 하게)" ──
   기준 = 13인치 가로(1366 × 1024 · 갤럭시 탭 1280 × 800). 손가락으로 누르는 칸은 44px 이상, 표 한 줄 48px, 숫자 18px,
   아이콘(시계 · 체크 상자) 22px. 세로로 들거나 1100px보다 좁으면 인쇄 구역 왼쪽 · 오른쪽이 위아래로(위 규칙 그대로). 인쇄 · 가공 일지 화면만. */
section[data-panel="log"] { --lt-font: 16px; --lt-small: 14px; --lt-tap: 44px; --lt-row: 48px; --lt-num: 18px; --lt-icon: 22px; }
section[data-panel="log"] #lgtabs [role="tab"] { min-height: 48px; padding: 0 22px; font-size: 16px; }
section[data-panel="log"] .log-top { gap: 10px 12px; align-items: flex-end; }
section[data-panel="log"] .log-top .f > .l { font-size: var(--lt-small); }
section[data-panel="log"] .log-top select { height: var(--lt-tap); min-height: var(--lt-tap); font-size: var(--lt-font); }
section[data-panel="log"] .actions.log-top > :is(.btn, .btn.small) { min-height: var(--lt-tap); padding: 0 16px; font-size: 15px; border-radius: 8px; } /* .actions:has(…) > .btn.small(작은 단추)보다 앞서게 */
section[data-panel="log"] .log-top .btn.primary, section[data-panel="log"] .log-top .btn[type="submit"] { min-height: 48px; padding: 0 20px; font-size: 16px; }
section[data-panel="log"] form.print-sheet > .actions .btn, section[data-panel="log"] form.conv-sheet > .actions .btn { min-height: var(--lt-tap); padding: 0 18px; font-size: 15px; border-radius: 8px; }
/* 머리(결재 · 작업 일자 · 근무 시간 · 작업자) */
section[data-panel="log"] form:is(.print-sheet, .conv-sheet) { padding: 16px; font-size: var(--lt-font); }
section[data-panel="log"] form:is(.print-sheet, .conv-sheet) .cs-top th, section[data-panel="log"] form:is(.print-sheet, .conv-sheet) .cs-top td { height: 50px; padding: 3px 12px; }
section[data-panel="log"] form:is(.print-sheet, .conv-sheet) .cs-top .cs-title { height: 60px; font-size: 28px; }
section[data-panel="log"] form:is(.print-sheet, .conv-sheet) .cs-top th:not(.cs-title):not(.ps-gyeol-l) { font-size: 15px; }
section[data-panel="log"] form:is(.print-sheet, .conv-sheet) .cs-top col.cs-sign { width: 84px; }
section[data-panel="log"] form.print-sheet .cs-top td.cs-stamp { height: 64px; }
section[data-panel="log"] form:is(.print-sheet, .conv-sheet) .cs-kv { gap: 4px 8px; font-size: var(--lt-font); }
/* 머리 칸이 좁으면(13인치 가로 · 메뉴 펼침) 이름표 한 줄 · 값 한 줄로 — 시각 두 칸 · [점심 분] · [저녁 분]은 묶음(cs-pair)째 넘어감 */
section[data-panel="log"] form:is(.print-sheet, .conv-sheet) .cs-pair { display: inline-flex; align-items: center; gap: 6px; white-space: nowrap; }
section[data-panel="log"] form:is(.print-sheet, .conv-sheet) .cs-kv input:not([type="checkbox"]), section[data-panel="log"] form:is(.print-sheet, .conv-sheet) .cs-kv select { height: 40px; font-size: var(--lt-font); }
section[data-panel="log"] form.print-sheet .cs-top .ps-machine { height: 48px; min-width: 76px; font-size: 26px; }
section[data-panel="log"] form.print-sheet .cs-kv input[name="lunch"], section[data-panel="log"] form.print-sheet .cs-kv input[name="dinner"] { width: 64px; }
section[data-panel="log"] form.print-sheet .ps-workers .worker-choices { gap: 8px 10px; }
section[data-panel="log"] form.print-sheet .ps-workers .worker-choice { display: inline-flex; align-items: center; gap: 8px; min-height: var(--lt-tap); padding: 0 14px 0 10px; font-size: var(--lt-font); border-radius: 8px; }
section[data-panel="log"] form:is(.print-sheet, .conv-sheet) input[type="checkbox"], section[data-panel="log"] form:is(.print-sheet, .conv-sheet) input[type="radio"] { width: var(--lt-icon); height: var(--lt-icon); margin: 0; accent-color: var(--accent); flex: 0 0 auto; }
section[data-panel="log"] form.print-sheet .ps-workers .worker-extra input { height: 40px; font-size: var(--lt-font); }
section[data-panel="log"] form.conv-sheet .cs-kv .conversion-workers select { min-width: 160px; }
/* 인쇄 제품 구역 왼쪽(롤 표) · 오른쪽(동판 · 색도 · 시간표) = 반반 — 오른쪽 칸이 많아 13인치에서 색도 칸이 좁지 않게 */
@media (min-width: 1101px) { section[data-panel="log"] form.print-sheet .ps-block { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); } }
/* 제품 구역 머리 줄(제품명 · 속도 · 원자재 · 동판 · 피치 …) */
section[data-panel="log"] form:is(.print-sheet, .conv-sheet) :is(.ps-meta, .cs-meta) { min-height: 52px; gap: 6px 14px; padding: 4px 12px; }
section[data-panel="log"] form:is(.print-sheet, .conv-sheet) :is(.ps-meta, .cs-meta) :is(label, > span) { gap: 6px; font-size: var(--lt-font); }
section[data-panel="log"] form:is(.print-sheet, .conv-sheet) :is(.ps-meta, .cs-meta) input:not([type="checkbox"]):not([type="radio"]):not([type="hidden"]), section[data-panel="log"] form:is(.print-sheet, .conv-sheet) :is(.ps-meta, .cs-meta) select { height: 40px; font-size: var(--lt-font); }
section[data-panel="log"] form:is(.print-sheet, .conv-sheet) .cs-item select { height: var(--lt-tap); font-size: 17px; font-weight: 700; }
section[data-panel="log"] form.print-sheet .ps-meta input.ps-num, section[data-panel="log"] form.print-sheet .ps-meta .ps-speed input { width: 80px; }
section[data-panel="log"] form.print-sheet .ps-meta input.ps-short { width: 96px; }
section[data-panel="log"] form.conv-sheet .cs-speed input, section[data-panel="log"] form.conv-sheet .cs-temp input { width: 80px; }
/* 롤 표 · 가공 표: 한 줄 48px, 숫자 18px */
section[data-panel="log"] form.print-sheet .ps-rolls col.ps-c-no, section[data-panel="log"] form.conv-sheet .cs-table col.cs-c-n { width: 48px; }
section[data-panel="log"] form:is(.print-sheet, .conv-sheet) :is(.ps-rolls, .cs-table) thead th { height: 38px; font-size: 15px; }
section[data-panel="log"] form:is(.print-sheet, .conv-sheet) :is(.ps-rolls, .cs-table) th, section[data-panel="log"] form:is(.print-sheet, .conv-sheet) :is(.ps-rolls, .cs-table) td { height: var(--lt-row); }
section[data-panel="log"] form:is(.print-sheet, .conv-sheet) :is(.ps-rolls, .cs-table) td.cs-n { font-size: 15px; }
section[data-panel="log"] form:is(.print-sheet, .conv-sheet) :is(.ps-rolls, .cs-table) td input, section[data-panel="log"] form:is(.print-sheet, .conv-sheet) :is(.ps-rolls, .cs-table) td select { height: calc(var(--lt-row) - 1px); font-size: var(--lt-num); }
section[data-panel="log"] form:is(.print-sheet, .conv-sheet) :is(.ps-rolls, .cs-table) td.cs-lot select { font-size: 15px; padding-left: 8px; }
section[data-panel="log"] form.print-sheet .ps-rolls td.ps-lotno { font-size: 14px; }
section[data-panel="log"] form.print-sheet .ps-rolls tfoot :is(th, td) { font-size: 15px; }
section[data-panel="log"] form.print-sheet .ps-mcell i { font-size: 14px; padding: 0 8px 0 4px; }
section[data-panel="log"] form.print-sheet .ps-mcell b { font-size: var(--lt-num); }
section[data-panel="log"] form.conv-sheet .cs-table col.cs-c-def { width: 8%; }
section[data-panel="log"] form.conv-sheet .cs-table col.cs-c-t { width: 13%; }
/* 시계 단추: 아이콘 22px · 누르는 칸 40px */
section[data-panel="log"] form:is(.print-sheet, .conv-sheet) :is(.ps-stage, .cs-table) .cs-now { width: 40px; height: 40px; }
section[data-panel="log"] form:is(.print-sheet, .conv-sheet) .cs-now svg { width: var(--lt-icon); height: var(--lt-icon); }
section[data-panel="log"] form.conv-sheet .cs-table td.cs-tcell .cs-tw:has(.cs-now) input { padding-right: 42px; }
/* 색도 표 · 동그라미 고르기 · 진행 시간표 */
section[data-panel="log"] form.print-sheet .ps-colors :is(th, td) { height: 42px; font-size: 14px; }
section[data-panel="log"] form.print-sheet .ps-colors tr > :first-child { width: 108px; }
section[data-panel="log"] form.print-sheet .ps-colors input { height: 41px; font-size: var(--lt-font); }
section[data-panel="log"] form.print-sheet .ps-picks { gap: 6px; }
section[data-panel="log"] form.print-sheet .ps-pick { min-height: 40px; padding: 0 14px; font-size: var(--lt-font); }
section[data-panel="log"] form.print-sheet .ps-stages { grid-template-columns: minmax(0, 1fr) 212px; gap: 12px; padding: 8px 12px; }
section[data-panel="log"] form.print-sheet .ps-legend { gap: 6px; }
section[data-panel="log"] form.print-sheet .ps-stage { font-size: 15px; }
section[data-panel="log"] form.print-sheet .ps-stage .cs-tw { width: 124px; }
section[data-panel="log"] form.print-sheet .ps-stage input { height: 42px; padding-right: 42px; font-size: var(--lt-num); }
section[data-panel="log"] form.print-sheet .ps-season { font-size: 15px; }
/* 글자 단추(+ 롤 추가 · 사양서 · 이전 기록 · + 줄 5개) = 손가락 크기 단추 */
section[data-panel="log"] form:is(.print-sheet, .conv-sheet) .cs-foot { min-height: 56px; gap: 8px 10px; padding: 6px 12px; }
section[data-panel="log"] form:is(.print-sheet, .conv-sheet) .cs-tools { gap: 8px; }
section[data-panel="log"] form:is(.print-sheet, .conv-sheet) .cs-link { display: inline-flex; align-items: center; min-height: 40px; padding: 0 14px; border: 1px solid var(--line-strong, #9aa39d); border-radius: 8px; background: #fff; color: var(--accent); font-size: 15px; font-weight: 600; text-decoration: none; }
section[data-panel="log"] form:is(.print-sheet, .conv-sheet) .cs-link:hover { background: var(--accent-soft, #e2f3e9); }
section[data-panel="log"] form:is(.print-sheet, .conv-sheet) :is(.cs-wind, [data-totals]) { font-size: var(--lt-small); }
/* 가공 기기 체크(롤 6 · 낱장 4): 그린 상자 22px · 누르는 칸 44px */
section[data-panel="log"] form.conv-sheet .cs-machines { gap: 6px 8px; }
section[data-panel="log"] form.conv-sheet .cs-chk { display: inline-flex; align-items: center; gap: 8px; min-height: var(--lt-tap); padding: 0 14px 0 10px; border: 1px solid var(--line, #d0d5d2); border-radius: 8px; font-size: var(--lt-font); }
section[data-panel="log"] form.conv-sheet .cs-chk .cs-box { flex: 0 0 auto; width: var(--lt-icon); height: var(--lt-icon); border: 2px solid #5b6560; border-radius: 4px; background: #fff; }
section[data-panel="log"] form.conv-sheet .cs-chk[aria-pressed="true"] { border-color: var(--accent); }
section[data-panel="log"] form.conv-sheet .cs-chk[aria-pressed="true"] .cs-box { border-color: var(--accent); background: var(--accent) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3.5 8.5l3 3 6-7' fill='none' stroke='%23fff' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center / 16px no-repeat; }
section[data-panel="log"] form.conv-sheet .cs-unit { gap: 14px; font-size: var(--lt-font); }
section[data-panel="log"] form.conv-sheet .cs-unit label { display: inline-flex; align-items: center; gap: 6px; min-height: 40px; }
section[data-panel="log"] form.conv-sheet .cs-note textarea { min-height: 64px; font-size: var(--lt-font); }
/* 가공 일지 위 팀별 진행 줄(‹ ›) */
section[data-panel="log"] .ps-row { grid-template-columns: 104px var(--lt-tap) minmax(0, 1fr) var(--lt-tap); gap: 10px; }
section[data-panel="log"] .ps-row .ps-title { font-size: var(--lt-font); }
section[data-panel="log"] .ps-nav { width: var(--lt-tap); height: var(--lt-tap); border-radius: 8px; font-size: 22px; }
section[data-panel="log"] .ps-row .ps-item { flex-basis: 272px; padding: 10px 14px; }
section[data-panel="log"] .ps-row .ps-item b { font-size: 15px; }
section[data-panel="log"] .ps-row .ps-item span { font-size: var(--lt-small); }
/* 2026-11-02 사용자 "가로보기는 지금처럼 · 세로보기는 첨부한 배치(비율은 맞춰서) · 롤 10줄": 한 화면이 폭에 따라 배치만 바뀜.
   가로(1100px 넘음) = 왼쪽 제품 · 롤 표 | 오른쪽 동판 · 색도 · 시간표. 롤 10줄로 왼쪽이 길어져 오른쪽 남는 높이는 시간표 칸이 채움.
   세로(1100px 이하) = 사용자 "작업자 정보 → 제품명 → 제품-동판 → 제품-원단": 제품명 · 속도 → 동판 규격 · 풀림 · 피치 · 건조온도 · 색도 표 · 동판 확인 → 원자재 · 원단 처리 확인 · 롤 표 → 시간표(왼쪽 그림 · 오른쪽 ①~⑤ 시각).
   왼쪽 · 오른쪽 상자를 display: contents로 풀고 order로 줄 세움(입력 칸 · 저장 모양은 그대로). */
section[data-panel="log"] form.print-sheet .ps-right > .ps-stages { flex: 1 1 auto; }
/* 가로: 롤 10줄로 오른쪽 아래가 비어 시간표는 위(가로 꽉) · ①~⑤ 시각은 아래 두 칸 — 작게 옆에 붙어 있던 그림을 크게 */
@media (min-width: 1101px) {
  section[data-panel="log"] form.print-sheet .ps-right > .ps-stages { grid-template-columns: minmax(0, 1fr); align-content: center; gap: 14px; padding: 12px 16px; }
  section[data-panel="log"] form.print-sheet .ps-right > .ps-stages .ps-legend { grid-template-columns: repeat(2, minmax(0, 1fr)); column-gap: 24px; }
  section[data-panel="log"] form.print-sheet .ps-right > .ps-stages .ps-stage .cs-tw { width: 124px; }
}
@media (max-width: 1100px) {
  section[data-panel="log"] form.print-sheet .ps-block { display: flex; flex-direction: column; }
  section[data-panel="log"] form.print-sheet :is(.ps-left, .ps-right) { display: contents; }
  section[data-panel="log"] form.print-sheet .ps-left > :first-child { order: 1; border-bottom: 2px solid #222; } /* 제품명 */
  section[data-panel="log"] form.print-sheet .ps-right > * { order: 2; } /* 제품-동판 */
  section[data-panel="log"] form.print-sheet .ps-left > :nth-child(2) { order: 3; margin-top: -1px; border-top: 2px solid #222; } /* 제품-원단: 원자재 */
  section[data-panel="log"] form.print-sheet .ps-right > .ps-treat { order: 4; } /* 원단 처리 확인 */
  section[data-panel="log"] form.print-sheet .ps-left > :nth-child(n+3) { order: 5; } /* 롤 표 · 단추 */
  section[data-panel="log"] form.print-sheet .ps-right > .ps-stages { order: 6; }
  section[data-panel="log"] form.print-sheet .ps-left > .cs-foot { border-bottom: 2px solid #222; }
  section[data-panel="log"] form.print-sheet .ps-colors tr > :first-child { width: 120px; }
  section[data-panel="log"] form.print-sheet .ps-meta .cs-item { flex: 1 1 0; min-width: 0; } /* 제품명 · 속도(rpm) 한 줄(첨부 배치처럼) */
  section[data-panel="log"] form.print-sheet .ps-stages { grid-template-columns: minmax(0, 560px) 236px; justify-content: space-between; gap: 24px; padding: 12px 16px; }
}

/* 2026-11-02 묶음 출고 창 '이번 출고로 끝내기'(ship-bundles.mjs) */
.bdl-ship .bdl-short { justify-content: flex-end; min-height: 0; margin-top: 6px; font-size: 12.5px; font-weight: 600; color: var(--warn, #b54708); white-space: normal; }
.bdl-ship .bdl-short[hidden] { display: none; }
/* ── 2026-11-02 인쇄 [완료] = 간단한 생산일지 양식(print-complete-sheet.mjs, Q424 A) — 생산일지(print-sheet)와 같은 굵은 테두리 · 회색 머리줄 · 밑줄 칸. 종이처럼 흰 바탕 고정 */
.pcs { display: flex; flex-direction: column; gap: 10px; }
.pcs-sheet { border: 2px solid #222; border-radius: 12px; overflow: hidden; background: #fff; color: #111; }
.pcs-meta { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 18px; min-height: 42px; padding: 4px 12px; border-bottom: 1px solid #555; }
.pcs-meta.pcs-last { border-bottom: 0; border-top: 1px solid #555; }
.pcs-kv { display: inline-flex; align-items: center; gap: 6px; margin: 0; min-width: 0; }
.pcs-grow { flex: 1 1 auto; }
.pcs .k { font-weight: 700; white-space: nowrap; }
.pcs-item { font-size: 16px; font-weight: 700; }
.pcs-more { color: #5b646c; font-size: 13px; }
.pcs-meta input:not([type="checkbox"]) { height: 30px; min-width: 0; border: 0; border-bottom: 1px solid #bbb; border-radius: 0; background: transparent; padding: 0 4px; color: inherit; font: inherit; font-weight: 500; box-shadow: none; }
.pcs-meta input[type="date"] { width: 148px; }
.pcs-grow input:not([type="checkbox"]) { flex: 1 1 auto; width: 100%; }
.pcs-rolls { width: 100%; border-collapse: collapse; table-layout: fixed; }
.pcs-rolls col.c-no { width: 40px; }
.pcs-rolls col.c-m { width: 96px; }
.pcs-rolls col.c-d { width: 84px; }
.pcs-rolls col.c-left { width: 112px; }
.pcs-rolls th, .pcs-rolls td { height: 40px; padding: 0; border: 1px solid #555; background: transparent; color: inherit; text-align: center; vertical-align: middle; }
.pcs-rolls tr > :first-child { border-left: 0; }
.pcs-rolls tr > :last-child { border-right: 0; }
.pcs-rolls thead th { height: 32px; border-top: 0; background: #f5f5f5; font-size: 13px; font-weight: 700; }
.pcs-rolls tfoot th, .pcs-rolls tfoot td { background: #f5f5f5; font-size: 14px; font-weight: 700; }
.pcs-rolls tfoot tr > * { border-bottom: 0; }
.pcs-n { font-size: 13px; font-weight: 700; }
.pcs-lot select, .pcs-fixed { display: flex; align-items: center; width: 100%; height: 39px; min-height: 0; border: 0; border-radius: 0; background-color: transparent; padding: 0 8px; color: inherit; font: inherit; font-size: 13px; text-align: left; box-shadow: none; }
.pcs-lot select:disabled { color: #5b646c; }
.pcs-fixed { color: #5b646c; }
.pcs-m { display: flex; align-items: center; height: 100%; }
.pcs-m input:not([type="checkbox"]), .pcs-m b { flex: 1 1 auto; width: 0; min-width: 0; border: 0; border-radius: 0; background: transparent; padding: 0 2px 0 4px; color: inherit; font: inherit; font-size: 15px; text-align: right; box-shadow: none; }
.pcs-m input:not([type="checkbox"]) { height: 39px; }
.pcs-m b { font-weight: 700; }
.pcs-m i { padding: 0 8px 0 3px; color: #555; font-size: 12px; font-style: normal; }
.pcs-m input::placeholder { color: #6b747c; opacity: 1; }
.pcs-m:has(input.auto-filled) { background: var(--auto-fill-bg, #eef0f2); }
.pcs-m input.auto-filled:not([type="checkbox"]) { background: transparent; }
.pcs-rolls input:focus, .pcs-rolls select:focus { outline: 2px solid var(--accent); outline-offset: -2px; background: #fffbe6; }
.pcs-left { padding: 0 8px; font-size: 12.5px; line-height: 1.25; }
.pcs-rolls td.pcs-left { padding: 0 8px; }
.pcs-left.keep { color: #13603c; font-weight: 600; }
.pcs-left.cut { color: #5b646c; }
.pcs-left.over { color: #7a5a00; }
.pcs-yield { font-size: 13px; }
.pcs-rolls tfoot td.pcs-yield { font-size: 13px; }
.pcs-yield b { font-size: 15px; }
.pcs-reason { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 10px; min-height: 44px; padding: 4px 12px; border-top: 1px solid #555; background: #fff8f6; }
.pcs-reason[hidden] { display: none; }
.pcs-reason input:not([type="radio"]) { flex: 1 1 150px; min-width: 120px; height: 30px; border: 0; border-bottom: 1px solid #bbb; border-radius: 0; background: transparent; padding: 0 4px; color: inherit; font: inherit; box-shadow: none; }
.pcs-foot { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 6px 14px; }
.pcs-skip { margin: 0; font-size: 13px; color: var(--muted); }
.pcs-tip { margin: 0; }
.pcs-meta.pcs-info { min-height: 34px; background: #fff8e6; color: #7a5a00; font-size: 13px; }
/* ── 2026-11-02 원단 발주 무게 칸 · 1롤 150kg 경고(film-weight.mjs, Q429~Q432) */
.film-weight { margin: 8px 0; border: 1px solid var(--line); border-radius: 8px; overflow: hidden; background: var(--surface, #fff); color: var(--ink); font-family: var(--sans); font-size: 13.5px; white-space: normal; }
.film-weight[hidden] { display: none; }
.film-weight .fw-head { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 10px; padding: 8px 12px; border-bottom: 1px solid var(--line); font-size: 14px; font-weight: 700; }
.film-weight .fw-head small { color: var(--muted); font-size: 12.5px; font-weight: 400; }
.film-weight table { width: 100%; border-collapse: collapse; font-size: 13.5px; }
.film-weight th, .film-weight td { padding: 8px 12px; border: 0; border-bottom: 1px solid var(--line); text-align: left; white-space: nowrap; }
.film-weight tbody tr:last-child td { border-bottom: 0; }
.film-weight th { background: var(--surface-2, #f7f8f7); color: var(--muted); font-size: 12.5px; font-weight: 600; }
.film-weight .num { text-align: right; }
.film-weight .fw-one { font-size: 15px; font-weight: 700; }
.film-weight tr.over .fw-one { color: var(--bad); }
.film-weight .fw-tag { display: inline-block; margin-left: 6px; padding: 1px 7px; border-radius: 999px; background: var(--bad); color: #fff; font-size: 11.5px; font-weight: 700; vertical-align: 1px; }
.film-weight .fw-alert { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 12px; padding: 10px 12px; border-top: 1px solid var(--warn); background: var(--warn-soft); color: var(--warn); }
.film-weight .fw-alert b { font-size: 14.5px; }
.film-weight .fw-alert span { flex: 1 1 260px; }
.film-weight .fw-none { margin: 0; padding: 8px 12px; }
/* ── 2026-11-02 입고 창 '이미 쓴 롤은 재고에 안 넣음'(late-film.mjs, Q428 A) */
.late-film { margin: 8px 0 0; padding: 10px 12px; border: 1px solid var(--line); border-left: 4px solid var(--accent); border-radius: 8px; background: var(--accent-soft); }
.late-film[hidden] { display: none; }
.late-film .check-line { margin: 0; color: var(--ink); }
.late-film .hint { margin: 4px 0 0; }

/* 2026-11-03 거래처 1안 — 기존 팝업, 구조화된 개별 행과 명시적 기본 주소. */
dialog.modal:has(> .party-editor-form) { width: min(900px, 96vw); max-height: 94vh; overflow: hidden; }
.party-editor-form { display: flex; flex-direction: column; max-height: min(86vh, 840px); }
.party-editor-form > .mh, .party-editor-form > .mf { flex: none; }
.party-editor-form > .mh { gap: 12px; align-items: center; }
.party-editor-form > .mh > .pill { margin-left: auto; white-space: nowrap; }
.party-editor-form > .mh > [data-close] { flex: none; }
.party-editor-identity { display: flex; flex-wrap: wrap; gap: 5px 10px; align-items: center; margin-top: 5px; font-size: 12px; }
.party-editor-identity strong { font-weight: 600; }
.party-editor-identity code { color: var(--muted); font-size: 11px; }
.party-editor-form > .mb { min-height: 0; max-height: none; overflow: auto; gap: 24px; padding: 18px 20px 22px; scrollbar-color: var(--line-strong) var(--surface-2); scrollbar-width: thin; }
.party-editor-form > .mf { background: var(--surface-2); }
.party-editor-section { min-width: 0; }
.party-editor-section-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin: 0 0 11px; }
.party-editor-section-head h3 { font-size: 13px; font-weight: 700; margin: 0; }
.party-editor-section-head > .hint { font-size: 11px; }
.party-editor-section .grid { padding: 0; grid-template-columns: repeat(2, minmax(0, 1fr)); }
.party-editor-section .check-line { flex-wrap: wrap; gap: 6px 12px; }
.party-record-source { display: none !important; }
.party-record-editor .row-editor-head, .party-record-editor .row-editor-row { display: grid; grid-template-columns: repeat(var(--party-cols), minmax(0, 1fr)) 48px; gap: 8px; align-items: center; }
.party-record-editor .row-editor-head { font-size: 11px; padding: 0; }
.party-record-editor > [data-rows] { gap: 9px; }
.party-record-editor .row-editor-row { padding: 0; border: 0; border-radius: 0; }
.party-record-editor .party-record-cell { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.party-record-editor .party-record-cell input { width: 100%; min-width: 0; caret-color: var(--accent); }
.party-record-editor .party-record-label { display: none; color: var(--muted); font-size: 11px; }
.party-record-editor .row-editor-row > [data-remove] { min-width: 44px; }
.party-record-editor > [data-add] { margin-top: 5px; }
.party-record-editor.party-address-editor .row-editor-head, .party-record-editor.party-address-editor .row-editor-row { grid-template-columns: minmax(0, .8fr) minmax(0, 2fr) minmax(0, .65fr) 64px 48px; }
.party-address-default { display: inline-flex; align-items: center; gap: 5px; white-space: nowrap; font-size: 12px; min-height: var(--control-h); }
.party-address-default input[type=radio] { width: 16px; height: 16px; margin: 0; accent-color: var(--accent); }
.party-editor-section-hint { font-size: 11px; margin: 8px 0 0; }
.party-editor-settings { border-top: 1px solid var(--line); padding-top: 16px; }
.party-editor-settings > summary { cursor: pointer; font-size: 13px; font-weight: 600; }
.party-editor-settings > summary .hint { margin-left: 8px; font-size: 11px; font-weight: 400; }
.party-editor-settings[open] > summary { margin-bottom: 16px; }
.party-editor-settings > .grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.party-editor-settings > .grid > [data-customer-supplies], .party-editor-settings .film-rules { grid-column: 1 / -1; }
.party-editor-settings > .hint { margin: 10px 0 0; font-size: 11px; }
@media (max-width: 650px) {
  .party-editor-form { max-height: 92vh; }
  .party-editor-form > .mh { padding: 13px 14px; }
  .party-editor-form > .mb { padding: 16px 14px 20px; gap: 22px; }
  .party-editor-form > .mf { padding: 12px 14px; }
  .party-editor-identity { gap: 3px 8px; }
  .party-record-editor .row-editor-head { display: none; }
  .party-record-editor .row-editor-row, .party-record-editor.party-address-editor .row-editor-row { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; padding: 12px 0; border-top: 1px solid var(--line); }
  .party-record-editor .row-editor-row:first-child { padding-top: 0; border-top: 0; }
  .party-record-editor .party-record-label { display: block; }
  .party-record-editor .row-editor-row > [data-remove] { justify-self: end; }
  .party-address-editor .party-record-cell:nth-child(2) { grid-column: 1 / -1; grid-row: 2; }
  .party-address-editor .party-address-default { grid-column: 1; }
  .party-editor-settings > summary .hint { display: block; margin: 4px 0 0 16px; }
}
@media (max-width: 400px) {
  .party-editor-section .grid, .party-editor-settings > .grid { grid-template-columns: minmax(0, 1fr); }
  .party-editor-form > .mh { gap: 7px; }
  .party-editor-form > .mh h2 { font-size: 15px; }
}
/* 2026-11-03 총괄 작업스케줄표 인쇄 칸 원단 롤(Q437 A · Q438 A 끝난 칸도 옅게 · Q439 A 출력에도) — overview-ui.mjs printRollOf. 롤 줄이 있는 줄만 칸을 조금 높임 */
.ov-route.tall .ov-seg { height: 62px; }
.ov-seg .ov-roll { display: block; font-size: 11.5px; font-weight: 700; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; margin-top: 1px; }
.ov-seg .ov-roll i { font-style: normal; font-weight: 600; opacity: .8; }
.ov-seg .ov-roll .w { color: var(--bad); opacity: 1; font-weight: 700; }
.ov-seg.st-now .ov-roll .w { color: #fff; text-decoration: underline; }
.ov-seg.st-done .ov-roll { opacity: .85; }
.ov-src { font-style: normal; display: inline-block; font-size: 11px; font-weight: 700; border-radius: 3px; padding: 0 4px; margin-left: 2px; vertical-align: 1px; background: rgba(0, 0, 0, .08); }
.ov-seg.st-now .ov-src { background: rgba(255, 255, 255, .22); }
.ov-paper .ov-route.tall .ov-seg { height: calc(46px * var(--ov-k)); }
.ov-paper .ov-seg .ov-roll { font-size: calc(9.5px * var(--ov-k)); margin-top: 0; }
.ov-paper .ov-src { font-size: calc(8.5px * var(--ov-k)); padding: 0 3px; background: none; border: 1px solid currentColor; }
/* 2026-11-04 생산일지: 승인 기다리는 내 일지 띠 · 제출한 일지 [수정하기] · 수정 기록(log-edits.mjs) */
.log-waiting { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 8px; margin: 8px 0; padding: 8px 12px; border: 1px solid var(--line); border-radius: 8px; background: var(--surface-2, #f8faf8); }
.log-waiting .btn.on { border-color: var(--accent); color: var(--accent); font-weight: 700; }
.log-submitted { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 12px; margin: 8px 0; padding: 10px 12px; border: 1px solid #e0b84a; border-radius: 8px; background: var(--warn-soft); }
.log-submitted > b { color: var(--warn); }
.log-edits { margin: 8px 0; padding: 8px 12px; border-left: 3px solid var(--warn); background: #fffaf0; border-radius: 4px; font-size: 13px; }
.log-edits .le-row { margin-top: 6px; }
.log-edits .le-when { font-weight: 700; }
.log-edits .le-why { color: var(--muted); }
.log-edits .le-diff { color: var(--ink); margin-top: 2px; }
/* 2026-11-04 생산일지 [수정하기] · 반려 · 알림(log-edits.mjs) */
.log-waiting .lw-group { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 4px 6px; margin-right: 10px; }
.log-waiting .lw-reject b { color: var(--bad); }
.log-waiting .lw-done b { color: var(--accent-soft-ink, #166b44); }
.log-submitted.done { border-color: var(--line); background: var(--accent-soft, #e2f3e9); }
.log-submitted.done > b { color: var(--accent-soft-ink, #166b44); }
.log-submitted.reject { border-color: #e5a29b; background: var(--bad-soft, #fbe6e3); }
.log-submitted.reject > b { color: var(--bad); }
.log-notice { margin: 8px 0; padding: 10px 12px; border-radius: 8px; border: 1px solid #e0b84a; background: var(--warn-soft); font-size: 13.5px; }
.log-notice.reject { border-color: #e5a29b; background: var(--bad-soft, #fbe6e3); }
.log-notice > b { margin-right: 6px; }
.log-notice .actions { display: flex; gap: 6px; margin-top: 6px; }
.log-amend { margin: 10px 0 4px; padding: 12px; border: 2px solid var(--accent); border-radius: 8px; background: #fff; }
.log-amend .f { max-width: 640px; }
.log-amend .actions { display: flex; gap: 8px; margin-top: 8px; }
.log-amend-top { font-weight: 700; color: var(--accent); }

/* 2026-11-04 생산일지 결재 칸 '작성' = 제출한 계정 서명(마이페이지 등록) · 없으면 이름 — public/log-writer.mjs */
td[data-writer-cell] { text-align: center; vertical-align: middle; padding: 2px 3px; }
.lw-sign { display: block; max-width: 100%; max-height: 54px; margin: 0 auto; object-fit: contain; }
.lw-mine .lw-sign { opacity: .45; }
.lw-name { display: block; text-align: center; font-weight: 700; font-size: 15px; line-height: 1.2; word-break: keep-all; }
.lw-input { width: 100%; box-sizing: border-box; min-width: 0; text-align: center; font-size: 15px; padding: 6px 2px; border: 1px dashed var(--line, #b9c2cc); border-radius: 4px; background: #fffef4; }
.lw-input:focus { border-style: solid; }
.print-paper.paper-document .pp-stamp .lw-sign, .cp-stamp .lw-sign { max-height: 9mm; }
.pp-stamp .lw-name, .cp-stamp .lw-name { font-size: 12pt; }
.lw-old { display: flex; flex-direction: column; gap: 4px; }
.lw-old .lw-sign { margin: 0; max-height: 40px; }
.lw-approval { display: flex; align-items: center; gap: 10px; margin: 6px 0 8px; padding: 6px 10px; border: 1px solid var(--line, #d8dee4); border-radius: 6px; width: fit-content; }
.lw-approval .lw-sign { display: inline-block; max-height: 40px; max-width: 120px; margin: 0; }
.lw-approval .lw-name { display: inline; }
section[data-panel="log"] form:is(.print-sheet, .conv-sheet) .cs-top td[data-writer-cell] { padding: 3px 4px; } /* 작성 칸은 이름 칸이 칸을 꽉 채우게 */

/* 2026-11-04 Q440~Q443 인쇄 색상 10칸(제품 사양) · 승인 창 '제품 정보와 다른 칸' — public/print-spec-sync.mjs */
.f.spec-colors { grid-column: 1 / -1; }
.spec-color-grid { display: grid; grid-template-columns: repeat(10, minmax(0, 1fr)); gap: 6px; }
.spec-color-grid label { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.spec-color-grid label > span { font-size: 12px; color: var(--muted, #6b7785); text-align: center; }
.spec-color-grid input { width: 100%; min-width: 0; box-sizing: border-box; text-align: center; }
@media (max-width: 900px) { .spec-color-grid { grid-template-columns: repeat(5, minmax(0, 1fr)); } }
.spec-sync { margin: 8px 0; padding: 8px 12px; border: 1px solid #e3c766; background: #fffaf0; border-radius: 6px; }
.spec-sync label { display: flex; align-items: baseline; gap: 6px; flex-wrap: wrap; }
.spec-sync ul { margin: 6px 0 0 22px; padding: 0; }
.spec-sync li { line-height: 1.6; }
.spec-sync-amend { display: flex; align-items: center; gap: 6px; margin: 4px 0; }

/* 2026-11-04 Q444~Q447 A 태블릿 시간 칸 = 드럼 다이얼(시 · 분 두 줄을 굴려 가운데 줄) — public/time-dial.mjs */
.td-overlay { position: fixed; inset: 0; z-index: 1000; background: rgba(20, 28, 36, .38); display: flex; align-items: center; justify-content: center; padding: 16px; }
.td-sheet { width: min(420px, 100%); background: #fff; border-radius: 16px; padding: 16px 18px 12px; box-shadow: 0 18px 48px rgba(0, 0, 0, .25); }
.td-top { display: flex; justify-content: space-between; align-items: baseline; gap: 12px; margin-bottom: 8px; }
.td-label { color: var(--muted, #6b7785); font-size: 16px; }
.td-big { font-size: 38px; font-weight: 800; letter-spacing: 1px; }
.td-drum { position: relative; display: flex; justify-content: center; align-items: center; gap: 8px; height: 260px; }
.td-drum::before { content: ''; position: absolute; left: 10px; right: 10px; top: 104px; height: 52px; border-radius: 10px; background: #e7f3ef; border: 1px solid #b9dccf; pointer-events: none; }
.td-col { position: relative; z-index: 1; width: 112px; height: 260px; overflow-y: scroll; scroll-snap-type: y mandatory; overscroll-behavior: contain; touch-action: pan-y; scrollbar-width: none;
  -webkit-mask-image: linear-gradient(transparent, #000 28%, #000 72%, transparent); mask-image: linear-gradient(transparent, #000 28%, #000 72%, transparent); }
.td-col::-webkit-scrollbar { display: none; }
.td-item, .td-pad { height: 52px; line-height: 52px; text-align: center; }
.td-item { font-size: 30px; font-weight: 700; scroll-snap-align: center; user-select: none; color: #44505c; cursor: pointer; }
.td-item.on { color: #10251f; }
.td-colon { position: relative; z-index: 1; font-size: 32px; font-weight: 800; }
.td-acts { display: flex; gap: 8px; margin-top: 12px; }
.td-acts button { flex: 1; height: 52px; border-radius: 10px; border: 1px solid var(--line, #d5dbe2); background: #fff; font-size: 18px; font-weight: 700; font-family: inherit; }
.td-acts .ok { background: var(--brand, #1f6f5c); border-color: var(--brand, #1f6f5c); color: #fff; }
.td-keys { display: block; margin: 10px auto 0; border: 0; background: none; color: var(--muted, #6b7785); font-size: 14px; text-decoration: underline; font-family: inherit; }
.dial-toggle { white-space: nowrap; }
.dial-toggle.on { background: #e7f3ef; border-color: #b9dccf; color: #1f6f5c; }

/* 2026-11-09 Q462 A 외주 (자차) 발송 · 회수 — 납품과 따로(로즈 · 점선 · '발송 →' / '회수 ←' 글자). 납품 건수에 안 셈. 글자 대비 #9d174d on #fdeef4 ≈ 7:1 */
:root { --out: #be185d; --out-ink: #9d174d; --out-soft: #fdeef4; --out-line: #f2b8cf; }
.cal-ev.out-trip { background: var(--out-soft); color: var(--out-ink); border: 1.5px dashed var(--out); padding: 0 4px; font-weight: 600; }
.cal-ev.out-trip > b:first-child { font-weight: 800; }
.cal-ev.out-trip.done { opacity: .6; }
.cal-ev.out-trip.late { background: #fde8e8; color: #9b1c1c; border-color: #c62828; }
.cal-out-sep { display: flex; align-items: center; gap: 4px; margin-top: 4px; font-size: 11px; font-weight: 800; color: var(--out-ink); white-space: nowrap; }
.cal-out-sep::after { content: ""; flex: 1; border-top: 1.5px dashed var(--out-line); }
.ship-cal .dnum .cnt-out { font-size: 11px; font-weight: 800; color: var(--out-ink); background: var(--out-soft); border: 1px solid var(--out-line); border-radius: 10px; padding: 0 5px; margin-left: 2px; }
.ship-show label.cal-ev.out-trip { display: inline-flex; align-items: center; gap: 3px; }
.cd-kind.out-box { margin-top: 8px; border: 1.5px dashed var(--out); background: #fffafc; border-radius: 8px; padding: 6px 10px 4px; }
.cd-kind.out-box .cd-kind-h { color: var(--out-ink); font-weight: 700; }
.cd-kind.out-box .out-why { font-weight: 500; color: var(--muted); }
.out-ln { display: grid; grid-template-columns: auto minmax(0, 1fr) auto auto; gap: 10px; align-items: center; padding: 6px 0; border-top: 1px solid #f6dce7; }
.out-box .cd-kind-h + .out-ln { border-top: 0; }
.out-tag { display: inline-flex; align-items: center; font-size: 12px; font-weight: 800; color: var(--out-ink); background: #fff; border: 1.5px dashed var(--out); border-radius: 4px; padding: 1px 7px; white-space: nowrap; }
.out-who { min-width: 0; font-size: 13px; }
.out-who .link-btn { font-size: 13px; }
.out-q { font-weight: 800; white-space: nowrap; font-variant-numeric: tabular-nums; }
.out-act { display: inline-flex; gap: 6px; align-items: center; white-space: nowrap; }
.out-ln.done .out-who b, .out-ln.done .out-q { color: var(--muted); }
.btn.out-btn { border-color: var(--out); color: var(--out-ink); background: #fff; }
.btn.out-btn:hover { background: var(--out-soft); }
.out-mt { display: inline-block; padding: 0 6px; border-radius: 3px; font-size: 12px; font-weight: 700; color: #fff; line-height: 1.5; }
.out-mt.m-own { background: #187a4c; } .out-mt.m-hired { background: #2f62c4; } .out-mt.m-pickup { background: #5a5f66; }
.outsource-plan-now { margin: 4px 0 8px; }
.outsource-plan { margin-bottom: 8px; }
.map-pin.out { border: 2px dashed #fff; }
.map-lbl.out { color: #9d174d; font-weight: 700; }
.ship-map-paper .run-chip.out { background: #fff; color: #9d174d; border: 1.5px dashed #be185d; }
.schedule-document .sch-key.out-trip { background: #fff; color: #9d174d; border: 1.5px dashed #be185d; }
.schedule-document .sl-ocnt { font-size: 12.5px; font-weight: 800; color: #9d174d; background: #fff; border: 1.5px dashed #be185d; border-radius: 4px; padding: 0 6px; align-self: center; }
.schedule-document .sl-out { border: 1.5px dashed #be185d; border-top: 0; background: #fffafc; break-inside: avoid; }
.schedule-document .sl-ohd { font-size: 12.5px; font-weight: 800; color: #9d174d; padding: 1px 9px; border-top: 1.5px dashed #be185d; background: #fdeef4; }
.schedule-document .sl-ogrp { display: grid; grid-template-columns: 128px minmax(0, 1fr); border-top: 1px dotted #f2b8cf; --sl-bg: #fff; --sl-bd: #be185d; --sl-tx: #9d174d; }
.schedule-document .sl-ohd + .sl-ogrp { border-top: 0; }
.schedule-document .sl-ogrp .sl-pty b { font-size: 14px; color: #9d174d; }
.schedule-document .sl-ogrp.done .sl-pty b { text-decoration: line-through; color: #6b7470; }
.schedule-document .sl-addr-h.out { color: #9d174d; margin-left: 8px; }
.schedule-document .mrow.out-trip { background: #fff; border: 1px dashed #be185d; color: #9d174d; }
.schedule-document .mrow.out-trip.done { opacity: .5; } .schedule-document .sl-out .sl-note { color: #9d174d; }
.schedule-document h2 .sch-out-note { font-size: 13px; font-weight: 600; margin-left: 8px; }

/* 2026-11-10 Q466 A · Q467 A [롤] 창 재고 원단 · 원단 롤 칸 재고 줄 — 색만으로 구분하지 않게 '새 원단' · '재고' 글자 꼬리표 */
.fp-tag { display: inline-flex; align-items: center; font-size: 12px; font-weight: 800; border-radius: 4px; padding: 1px 7px; line-height: 1.55; white-space: nowrap; }
.fp-tag.new { background: #eef1ef; color: #3f4a46; border: 1px solid #c9d1cd; }
.fp-tag.stock { background: #d9eee1; color: #1e6b43; border: 1px solid #9fd0b2; }
.fp-sum { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 10px; border: 1px solid var(--line); border-radius: 10px; padding: 8px 12px; background: #f7f9f8; margin-bottom: 10px; font-size: 13.5px; }
.fp-sum b { font-weight: 800; }
.fp-ok { color: #1e6b43; font-weight: 800; } .fp-warn { color: #8a5300; font-weight: 800; } .fp-bad { color: #b3261e; font-weight: 800; }
.fp-h { display: flex; align-items: center; gap: 8px; margin: 2px 0 8px; flex-wrap: wrap; }
.fp-h .fp-right { margin-left: auto; }
.fp-sec { border: 1px solid var(--line); border-radius: 10px; padding: 10px 12px; margin-top: 12px; }
.fp-table { width: 100%; border-collapse: collapse; font-size: 13px; }
.fp-table th { text-align: left; font-size: 12px; color: var(--muted); font-weight: 700; border-bottom: 1px solid var(--line); padding: 5px 6px; background: #f7f9f8; }
.fp-table td { border-bottom: 1px solid #eef1ef; padding: 5px 6px; vertical-align: middle; }
.fp-table .num { text-align: right; white-space: nowrap; font-variant-numeric: tabular-nums; }
.fp-table tr.on td { background: #f3faf6; }
.fp-table tr.off td { color: #7b847f; }
.fp-step { display: inline-flex; align-items: center; gap: 4px; }
.fp-step input { width: 44px; text-align: center; padding: 3px 4px; }
.fp-who { font-size: 12.5px; }
.fp-quick { margin-top: 10px; border: 1px dashed #9fd0b2; border-radius: 8px; padding: 9px 10px; background: #f7fbf8; }
.fp-qh { display: flex; gap: 8px; align-items: baseline; flex-wrap: wrap; margin-bottom: 6px; }
.fp-qrow { display: grid; grid-template-columns: 150px 100px minmax(0, 1fr) auto; gap: 10px; align-items: end; }
@media (max-width: 760px) { .fp-qrow { grid-template-columns: 1fr 1fr; } }
.roll-cell .roll-picks { margin-top: 3px; }
.roll-cell .roll-pick { display: flex; align-items: center; gap: 5px; font-size: 13px; margin-top: 2px; white-space: nowrap; }
/* 2026-11-10 Q468 A · Q469 A 외주 기록 창 [외주 취소] 확인 칸 */
.outsource-cancel { margin-top: 14px; border: 1px solid var(--bad, #b3392f); border-radius: 8px; padding: 10px 12px; background: var(--bad-soft, #fbe6e3); }
.outsource-cancel h3 { margin: 0 0 6px; font-size: 14px; color: var(--bad, #b3392f); }
.outsource-cancel p { margin: 4px 0 8px; }
.outsource-cancel .f { max-width: 420px; }
.outsource-cancel .actions { display: flex; gap: 8px; margin: 8px 0 0; }
.outsource-cancel .btn.danger { background: var(--bad, #b3392f); border-color: var(--bad, #b3392f); color: var(--surface, #fff); }

/* 2026-11-11 원단 롤 칸 줄 맞춤(새 원단 길이별 · 재고) */
.roll-cell .roll-lines { display: grid; grid-template-columns: 1fr; row-gap: 3px; }
.roll-cell .roll-lines b { display: flex; align-items: center; gap: 6px; }
.schedule-hybrid .hy-roll-line { white-space: nowrap; }
.schedule-hybrid .hy-roll-tag { font-size: 11px; font-weight: 800; color: #333; border: 1px solid #999; border-radius: 3px; padding: 0 4px; vertical-align: 1px; }
.ts-big.ts-line { font-size: 20px; line-height: 1.2; }
.ts-big .ts-tag { font-size: 12px; font-weight: 800; border: 1px solid currentColor; border-radius: 4px; padding: 1px 5px; vertical-align: 3px; letter-spacing: 0; }

/* 2026-11-11 [메모] 창 — 수주 메모 + 공정마다 메모 */
.memo-all { display: grid; gap: 10px; min-width: min(560px, 86vw); }
.memo-all .f { margin: 0; }
.memo-all .f textarea { width: 100%; min-height: 56px; font-size: 15px; }
.memo-all .memo-here textarea { border-color: var(--accent, #1e7a4d); box-shadow: 0 0 0 2px rgba(30,122,77,.12); }
.memo-all .memo-now { font-size: 12px; font-weight: 800; color: var(--accent, #1e7a4d); border: 1px solid currentColor; border-radius: 4px; padding: 0 5px; margin-left: 4px; }
.memo-all .memo-who { margin-left: 6px; }

/* 2026-11-11 인쇄 일지 양식 — 제품명 한 줄 · 납기/호기 칩 · 줄바꿈 정리 · LOT NO 예정 번호(회색) */
[data-print-editor] form.print-sheet .ps-meta.ps-item-row { flex-wrap: nowrap; }
[data-print-editor] form.print-sheet .ps-meta.ps-info-row { flex-wrap: nowrap; justify-content: space-between; }
[data-print-editor] form.print-sheet .ps-jobinfo { display: inline-flex; flex-wrap: wrap; gap: 6px; min-width: 0; }
[data-print-editor] form.print-sheet .ps-chip { display: inline-flex; align-items: center; height: 28px; padding: 0 10px; border: 1px solid #9aa5a0; border-radius: 6px; background: #f3f5f4; font-weight: 700; font-size: 14px; white-space: nowrap; }
[data-print-editor] form.print-sheet .ps-meta.ps-plate-row, [data-print-editor] form.print-sheet .ps-meta.ps-three { flex-wrap: nowrap; }
[data-print-editor] form.print-sheet .ps-meta.ps-three { gap: 4px 22px; }
[data-print-editor] form.print-sheet .ps-rolls td.ps-lotno.auto-filled { color: #8a938f; font-style: normal; background: var(--auto-fill-bg, #eef0f2); }

/* 2026-11-11 인쇄 일지 시안 A — 제품 구역을 세로 한 장으로(제품명 → 원자재 → 동판 → 작업 시간 및 교체 내용 → 투입 롤) */
[data-print-editor] form.print-sheet .ps-block.ps-long, section[data-panel="log"] form.print-sheet .ps-block.ps-long { display: block; }
[data-print-editor] form.print-sheet .ps-long .ps-sec + .ps-sec { border-top: 2px solid #222; }
[data-print-editor] form.print-sheet .ps-long .ps-sech { display: flex; align-items: baseline; gap: 12px; padding: 7px 12px; background: #eeefee; border-bottom: 1px solid #555; font-size: 16px; }
[data-print-editor] form.print-sheet .ps-long .ps-sech b { font-weight: 800; }
[data-print-editor] form.print-sheet .ps-long .ps-sech small { font-size: 13px; font-weight: 500; color: #5b665f; }
[data-print-editor] form.print-sheet .ps-long .ps-meta { flex-wrap: wrap; }
[data-print-editor] form.print-sheet .ps-long .ps-meta.ps-item-row { flex-wrap: nowrap; }
[data-print-editor] form.print-sheet .ps-long .ps-meta:last-child { border-bottom: 0; }
[data-print-editor] form.print-sheet .ps-long .ps-gap { margin-left: 18px; }
[data-print-editor] form.print-sheet .ps-long .ps-picks .ps-pick + .ps-pick { margin-left: 4px; }
[data-print-editor] form.print-sheet .ps-long .ps-colors { width: 100%; }
[data-print-editor] form.print-sheet .ps-long .ps-memo { padding: 10px 12px; border-bottom: 1px solid #555; }
[data-print-editor] form.print-sheet .ps-long .ps-memo textarea { display: block; width: 100%; min-height: 104px; resize: vertical; border: 1px solid #9aa5a0; border-radius: 6px; padding: 10px 12px; font: inherit; font-size: 16px; line-height: 1.6; background: #fff; }
[data-print-editor] form.print-sheet .ps-long .ps-stages.ps-stages-row, section[data-panel="log"] form.print-sheet .ps-long .ps-stages.ps-stages-row { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 0; padding: 0; align-items: stretch; }
[data-print-editor] form.print-sheet .ps-long .ps-stages-row .ps-stage { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 8px 12px; border-right: 1px solid #555; margin: 0; font-weight: 700; white-space: nowrap; }
[data-print-editor] form.print-sheet .ps-long .ps-stages-row .ps-stage:last-child { border-right: 0; }
[data-print-editor] form.print-sheet .ps-long .ps-rolls { width: 100%; }
[data-print-editor] form.print-sheet .ps-long .ps-rolls col.ps-c-lotno { width: 16%; }
[data-print-editor] form.print-sheet .ps-long .ps-rolls col.ps-c-film { width: 22%; }
[data-print-editor] form.print-sheet .ps-long .ps-rolls col.ps-c-spd { width: 11%; }
[data-print-editor] form.print-sheet .ps-long .ps-rolls td.ps-spd input { width: 100%; text-align: center; }
@media (max-width: 900px) { [data-print-editor] form.print-sheet .ps-long .ps-stages.ps-stages-row { grid-template-columns: repeat(2, minmax(0, 1fr)); } [data-print-editor] form.print-sheet .ps-long .ps-stages-row .ps-stage { border-bottom: 1px solid #555; } }

/* 2026-11-11 결재함 '생산일지' 탭 · 관리 › 결재라인 */
.lr-row { display: grid; gap: 6px; }
.lr-head { display: flex; flex-wrap: wrap; gap: 6px 14px; align-items: baseline; }
.lr-facts { display: flex; flex-wrap: wrap; gap: 4px 18px; font-size: 14px; }
.lr-prod { margin: 0; padding-left: 18px; font-size: 14px; }
.lr-line { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; font-size: 13px; }
.lr-line i { font-style: normal; color: var(--muted, #5b665f); }
.lr-step { border: 1px solid var(--line, #cfd6d2); border-radius: 6px; padding: 2px 8px; background: #fff; }
.lr-step.ok { border-color: #1e7a4d; color: #1e7a4d; font-weight: 700; }
.lr-step.bad { border-color: #b3392f; color: #b3392f; font-weight: 700; }
.lr-sub { margin: 18px 0 8px; font-size: 15px; }
.al-form { border: 1px solid var(--line, #cfd6d2); border-radius: 8px; padding: 12px 14px; margin: 12px 0; background: #fff; }
.al-head { display: flex; flex-wrap: wrap; gap: 4px 12px; align-items: baseline; margin-bottom: 8px; }
.al-head b { font-size: 16px; }
.al-people { display: flex; flex-wrap: wrap; gap: 8px; }
.al-person { display: inline-flex; align-items: center; gap: 8px; min-height: 44px; padding: 0 14px 0 10px; border: 1px solid var(--line, #cfd6d2); border-radius: 8px; cursor: pointer; }
.al-person input { width: 20px; height: 20px; }
.al-foot { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-top: 10px; }

/* 2026-11-11 생산일지 — 저장 안 된 작성 내용 되살림 알림 */
.log-draft-note { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 14px; margin: 0 0 10px; padding: 10px 14px; border: 1px solid #c9a227; border-radius: 8px; background: #fff8dc; font-size: 15px; }
.log-draft-note b { font-weight: 800; }
.log-draft-note .btn { margin-left: auto; min-height: 40px; }

/* 2026-11-11 승인 탭 — 근태 확인 대기 */
.log-review { margin: 0 0 18px; padding: 12px 14px; border: 1px solid var(--line, #d5dbd7); border-radius: 8px; background: #f6faf7; }
.log-review h3 { margin: 0 0 8px; font-size: 16px; }
.log-review h3 small { font-weight: 500; font-size: 13px; color: var(--muted, #5b665f); margin-left: 8px; }
.log-review-job { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 2px 0; }
