/* 그룹웨어 패널 (#gwPop) — 조직도 패널(orgPop)과 같은 우측 컬럼 문법.
   계약: docs/ARCHITECTURE_GROUPWARE.md §6. app.css 는 건드리지 않는다.
   모션: docs/MOTION_SPEC.md §4.2 클립 슬라이드 + FLIP (M5 gw-motion).
   width 트랜지션을 전면 제거하고 두 겹으로 나눈다 — 바깥(#gwPop)은 리플로우용
   overflow:hidden 클립 박스로 width/min-width 를 즉시(트랜지션 없이) 바꾸고,
   안쪽(.gw-inner, 고정폭 var(--gw-w))이 transform 으로 미끄러진다.
   .gw-inner 마크업은 index.html(M1 전용 소유) 을 건드릴 수 없어 gw.js 런타임에
   #gwPop 의 기존 자식을 감싸는 방식으로 추가한다. */
#gwPop{--gw-w:400px;width:var(--gw-w);min-width:var(--gw-w);position:relative;
  border-left:1px solid var(--line);overflow:hidden}
/* pointer-events:none — 모바일 폭에선 바깥이 inset:0 전면 레이어로 남으므로
   (아래 미디어 블록) 닫힘 상태가 클릭을 먹지 않게 즉시 차단한다
   (2026-07-29 "대화목록 클릭 안 됨" 실장애 픽스, MOTION_SPEC §4.1 같은 원칙) */
#gwPop.closed{width:0;min-width:0;border-left:0;pointer-events:none}
.gw-inner{width:var(--gw-w);min-width:var(--gw-w);height:100%;display:flex;flex-direction:column;
  background:#fbfaff;visibility:visible;transform:translate3d(0,0,0);   /* 불투명 — 슬라이드 중 블렌딩 깨짐 방지 */
  transition:transform var(--motion-dur-panel) var(--motion-ease-out),visibility 0s}
/* 닫혀도 visibility 는 유지 — hidden 이면 래스터가 버려져 다음 열기 첫 프레임에
   전체 재페인트(실측 385ms 멈춤)가 온다. 어차피 outer 클립으로 안 보이고
   클릭은 pointer-events:none 이 막는다 (2026-07-29 끊김 픽스) */
#gwPop.closed .gw-inner{transform:translate3d(100%,0,0);
  transition:transform var(--motion-dur-exit-panel) var(--motion-ease-in)}
.gw-head{display:flex;align-items:center;gap:6px;height:52px;padding:0 20px;flex:none;
  font-size:14px;font-weight:600;color:#3c4160}
.gw-tabs{display:flex;gap:4px;padding:0 14px 10px;border-bottom:1px solid var(--line);flex:none}
.gw-tab{position:relative;border:0;background:0 0;border-radius:10px;padding:7px 11px;
  font-size:12.5px;color:#6b7086;cursor:pointer}
.gw-tab:hover{background:var(--hover)}
.gw-tab.is-on{background:var(--accent-soft);color:var(--accent-deep);font-weight:600}
/* 탭 전환 콘텐츠 크로스페이드 (gw.js crossfadeRender, MOTION_SPEC §5 M5) —
   재렌더 사이 '불러오는 중…' 깜빡임을 opacity 로 감춘다. */
.gw-body{flex:1;overflow-y:auto;padding:12px 18px 20px;
  transition:opacity var(--motion-dur-micro) var(--motion-ease-out)}

/* 공통 카드/버튼 */
.gw-card{background:var(--card);border:1px solid var(--line);border-radius:14px;
  padding:12px 14px;margin-bottom:10px}
.gw-card.is-click{cursor:pointer}
.gw-card.is-click:hover{border-color:rgba(var(--accent-rgb),.35)}
.gw-t{font-size:13.5px;font-weight:600;color:#2e3350;display:flex;gap:6px;align-items:center}
.gw-sub{font-size:11.5px;color:var(--dim);margin-top:3px}
.gw-bodytext{font-size:12.5px;color:#4a4f66;line-height:1.65;margin-top:8px;white-space:pre-wrap}
.gw-pin{font-size:10px;font-weight:700;color:var(--accent-deep);background:var(--accent-soft);
  border-radius:6px;padding:1px 6px}
.gw-chip{font-size:10.5px;font-weight:640;border-radius:7px;padding:2px 7px}
.gw-chip.s-진행{color:#8a6d1a;background:#fdf3d7}
.gw-chip.s-승인{color:#177a4c;background:#e7f6ee}
.gw-chip.s-반려{color:#b3403f;background:#fdeaea}
.gw-chip.s-대기{color:#6b7086;background:#eef0f5}
.gw-btn{border:0;border-radius:11px;padding:8px 14px;font-size:12.5px;font-weight:600;
  cursor:pointer;color:#fff;background:var(--accent-grad)}
.gw-btn.ghost{background:#fff;color:#4a4f66;border:1px solid var(--line)}
.gw-btn.danger{background:linear-gradient(135deg,#ef7a72,#d9534f)}
.gw-btn:disabled{opacity:.45;cursor:default}
.gw-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.gw-sec-t{font-size:11px;font-weight:640;color:#7d8296;letter-spacing:.05em;
  padding:10px 2px 6px}
.gw-empty{font-size:12.5px;color:var(--dim);text-align:center;padding:26px 0}

/* 폼 */
.gw-form input[type=text],.gw-form input[type=number],.gw-form input[type=date],
.gw-form input[type=time],.gw-form textarea,.gw-form select{width:100%;border:1px solid var(--line);
  border-radius:11px;padding:9px 12px;font-size:13px;outline:0;background:#fff;
  font-family:inherit;margin-bottom:8px;box-sizing:border-box}
.gw-form input:focus,.gw-form textarea:focus{border-color:rgba(var(--accent-rgb),.35)}
/* 커스텀 셀렉트(gw-sel) — 네이티브 드롭다운 목록은 OS 스타일이라 교체 (gw.js selEnhance) */
.gw-sel{position:relative;margin-bottom:8px}
.gw-sel select{display:none}
.gw-sel-btn{width:100%;text-align:left;border:1px solid var(--line);border-radius:11px;
  padding:9px 34px 9px 12px;font-size:13px;background:#fff;color:var(--ink);
  font-family:inherit;cursor:pointer;position:relative}
.gw-sel-btn:after{content:"";position:absolute;right:14px;top:50%;width:7px;height:7px;
  border-right:1.6px solid #8c91a1;border-bottom:1.6px solid #8c91a1;
  transform:translateY(-70%) rotate(45deg)}
.gw-sel-btn.is-open{border-color:var(--accent);background:var(--accent-soft);color:var(--accent-deep)}
.gw-sel-btn.is-open:after{border-color:var(--accent-deep);transform:translateY(-30%) rotate(225deg)}
.gw-sel-pop{position:absolute;left:0;right:0;top:calc(100% + 4px);z-index:30;background:#fff;
  border:1px solid var(--line);border-radius:12px;box-shadow:0 14px 40px #27225d26;
  padding:4px;max-height:200px;overflow-y:auto;display:flex;flex-direction:column}
/* .aho-anim 계약(gw.js selEnhance 가 ahoShow/ahoHide 로 여닫는다) — 표면별 오버라이드만(§4.1).
   지속시간은 .aho-anim 기본값(pop 위계)이 그대로 맞아서 진입 거리만 줄인다. */
.gw-sel-pop{--aho-rise:6px}
.gw-sel-pop button{border:0;background:0 0;border-radius:8px;text-align:left;padding:8px 10px;
  font-size:13px;color:#2f3450;cursor:pointer;font-family:inherit;flex:none}
.gw-sel-pop button:hover{background:var(--hover)}
.gw-sel-pop button.is-on{background:var(--accent-soft);color:var(--accent-deep);font-weight:640}
.gw-form textarea{min-height:90px;resize:vertical;line-height:1.6}
.gw-form label.gw-check{font-size:12.5px;color:#4a4f66;display:flex;gap:6px;align-items:center;
  margin-bottom:8px}
.gw-line-it{display:flex;align-items:center;gap:8px;background:var(--side-bg);border-radius:10px;
  padding:6px 10px;margin-bottom:6px;font-size:12.5px;color:#3c4160}
.gw-line-it .x{margin-left:auto;border:0;background:0 0;cursor:pointer;color:#9a9fb2;font-size:13px}
.gw-line-it .x:hover{color:#d9534f}

.gw-del{margin-left:auto;border:0;background:0 0;cursor:pointer;color:#9a9fb2;font-size:13px}
.gw-del:hover{color:#d9534f}
.gw-line-it .seq{flex:none;font-size:10.5px;font-weight:700;color:var(--accent-deep)}

/* 결재 하위 탭 */
.gw-subtabs{display:flex;gap:4px;margin-bottom:10px}
.gw-subtab{border:1px solid var(--line);background:#fff;border-radius:9px;padding:5px 10px;
  font-size:11.5px;color:#6b7086;cursor:pointer}
.gw-subtab.is-on{background:var(--accent-soft);border-color:transparent;
  color:var(--accent-deep);font-weight:600}

/* 결재선 타임라인 */
.gw-step{display:flex;gap:10px;align-items:flex-start;padding:7px 2px;font-size:12.5px;color:#3c4160}
.gw-step .seq{flex:none;width:20px;height:20px;border-radius:50%;background:#eef0f5;color:#6b7086;
  font-size:11px;font-weight:700;display:flex;align-items:center;justify-content:center}
.gw-step.now .seq{background:var(--accent);color:#fff}
.gw-step .cmt{font-size:11.5px;color:var(--dim);margin-top:2px;white-space:pre-wrap}

/* 근태 */
.gw-att-big{display:flex;gap:10px;margin:6px 0 14px}
.gw-att-big .gw-btn{flex:1;padding:14px 0;font-size:14px;border-radius:14px}
.gw-att-big .out{background:linear-gradient(135deg,#3d4258,#23273a)}
.gw-att-now{font-size:12.5px;color:#4a4f66;text-align:center;margin-bottom:12px}
.gw-att-tbl{width:100%;border-collapse:collapse;font-size:12px;color:#3c4160}
.gw-att-tbl th{font-weight:600;color:#7d8296;text-align:left;padding:5px 6px;
  border-bottom:1px solid var(--line);font-size:11px}
.gw-att-tbl td{padding:6px;border-bottom:1px solid #f0eff6}

/* 배지 (app.css 의 .n-badge 문법 재사용이 안 되는 위치 대비) */
.gw-badge{min-width:16px;height:16px;border-radius:8px;background:#ef4d63;color:#fff;
  font-size:10px;font-weight:700;display:inline-flex;align-items:center;justify-content:center;
  padding:0 4px;margin-left:5px;vertical-align:1px}

/* 시큐어 모드 색 승계 */
html.secure .gw-btn{background:linear-gradient(135deg,#28b273,#177a4c)}

/* 모바일: 조직도 패널과 동일한 전면 오버레이 (§4.3 오버레이 서랍 문법).
   position:fixed 오버레이라 형제 레이아웃에 영향이 없어 FLIP 불필요 —
   #work 서랍과 동일하게 .gw-inner 의 transform 만 움직인다. */
@media (width<=760px){
  #gwPop{position:fixed;inset:0;z-index:76;width:100vw;min-width:100vw;border-left:0}
  #gwPop .gw-inner{width:100vw;min-width:100vw;
    transition:transform var(--motion-dur-drawer) var(--motion-ease-out),visibility 0s}
  #gwPop.closed{width:100vw;min-width:100vw}
  #gwPop.closed .gw-inner{transform:translate3d(102%,0,0);
    transition:transform var(--motion-dur-exit-drawer) var(--motion-ease-in)}
}

/* 타이포 위계(애플식) — 주제 제목 규칙은 app.css 의 2026-07-28 블록과 동일 */
.gw-head>span:first-child{font-size:17px;font-weight:800;letter-spacing:-.02em;color:#15192e}

/* 휴가/연차 (2026-07-29 추가분 — 기존 셀렉터는 위에서 수정하지 않는다) */
#gwLeaveBox{margin-bottom:8px;padding:10px 12px;background:var(--side-bg);border-radius:12px}
#gwLeaveBox .gw-sec-t{padding-top:0}
.gw-warn{font-size:11.5px;color:#b3403f;font-weight:600;margin-top:2px}
.gw-leave-tbl{width:100%;border-collapse:collapse;font-size:12.5px;color:#3c4160;margin-top:8px}
.gw-leave-tbl th{width:64px;text-align:left;font-weight:600;color:#7d8296;
  padding:5px 6px;vertical-align:top}
.gw-leave-tbl td{padding:5px 6px}
.gw-chip.s-연차{color:#3357c2;background:#e8edfb}
.gw-chip.s-반차{color:#8a6d1a;background:#fdf3d7}
.gw-chip.s-경조{color:#7d3fa8;background:#f3e8fb}

/* 일정 · 자원예약 (2026-08-12, §9.2 — 기존 셀렉터는 위에서 수정하지 않는다).
   패널이 좁아(--gw-w 400px, 본문 364px) 7칸 그리드는 고정폭을 쓰지 않는다:
   minmax(0,1fr) + min-width:0 이라 폭이 줄면 칸이 같이 줄고 넘치지 않는다
   (§5.5 짤림 제로 — 고정폭 안쪽 래퍼가 사고의 1순위 원인이었다). */
.gw-cal-head{display:flex;align-items:center;gap:4px;margin-bottom:8px}
.gw-cal-ym{flex:1;min-width:0;text-align:center;font-size:13.5px;font-weight:700;color:#2e3350}
.gw-cal-nav{flex:none;width:26px;height:26px;border:0;background:0 0;border-radius:9px;
  font-size:16px;line-height:1;color:#6b7086;cursor:pointer;font-family:inherit}
.gw-cal-nav:hover{background:var(--hover)}
.gw-cal-today{flex:none;padding:5px 10px;font-size:11.5px;border-radius:9px}
.gw-cal-grid{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:2px;margin-bottom:4px}
.gw-cal-wd{font-size:10.5px;color:#7d8296;text-align:center;padding:2px 0 4px}
.gw-cal-wd.s-sun{color:#c2554f}
.gw-cal-wd.s-sat{color:#3357c2}
.gw-cal-d{min-width:0;min-height:42px;border:1px solid transparent;background:0 0;
  border-radius:10px;padding:5px 0;cursor:pointer;font-family:inherit;
  display:flex;flex-direction:column;align-items:center;gap:4px}
.gw-cal-d:hover{background:var(--hover)}
.gw-cal-d .n{font-size:11.5px;line-height:1;color:#3c4160}
.gw-cal-d.s-sun .n{color:#c2554f}
.gw-cal-d.s-sat .n{color:#3357c2}
.gw-cal-d.is-off .n{opacity:.35}
.gw-cal-d.is-today{background:var(--accent-soft)}
.gw-cal-d.is-today .n{font-weight:700;color:var(--accent-deep)}
.gw-cal-d.is-sel{background:var(--accent-soft);border-color:var(--accent)}
.gw-cal-dots{display:flex;align-items:center;gap:2px;height:6px;overflow:hidden}
.gw-dot{flex:none;width:5px;height:5px;border-radius:50%;background:var(--accent)}
.gw-dot.s-personal{background:#9aa0b4}      /* 내 일정 (남에게 안 보이는 축) */
.gw-dot.s-res{background:#e0913a}           /* 자원 예약 (회의실·장비 점유) */
.gw-cal-more{font-size:9px;line-height:1;color:var(--dim)}
/* 그날 시트 — 인라인 콘텐츠라 .aho-anim 계약으로 짧게 입장만 시킨다(§4.1) */
#gwCalSheet{--aho-rise:5px}
.gw-cal-sheet-t{display:flex;align-items:center;gap:8px;font-size:13px;font-weight:700;
  color:#2e3350;padding:10px 2px 8px;border-top:1px solid var(--line);margin-top:6px}
.gw-cal-add{margin-left:auto;flex:none;padding:6px 11px;font-size:11.5px;border-radius:9px}
.gw-conf{font-size:11.5px;color:#4a4f66;line-height:1.6;margin-top:4px}
/* 시큐어 모드는 따로 덮지 않는다 — 기본 점이 var(--accent) 라 html.secure 의
   토큰 재정의를 그대로 탄다. 여기에 html.secure .gw-dot 를 더하면 특이도가
   .gw-dot.s-personal 을 이겨 개인/자원 구분이 통째로 초록이 된다. */
