@charset "utf-8";
/* ============================================================================
   base.css: 요소 기본값 · 접근성 유틸 · 레거시 격리
   ============================================================================
   ⚠ `ie-` 는 **in-erp** 의 약자다. Internet Explorer 가 아니다 (ADR D-03).

   ── 이 파일의 규칙 3가지
      1) 요소 셀렉터는 전부 `:where()` 로 감싼다 → 특이도 (0,0,0).
         우리 CSS 는 **언레이어드**라 특이도 0 이어도 `@layer gnu` 안의 어떤 규칙보다 이긴다.
         동시에 우리가 포크하지 않은 그누보드 스킨(회원·검색)의 `#mb_login .frm_input` 같은
         규칙에는 **져 준다**. 이게 "코어를 이기되 스킨은 안 깨뜨리는" 유일한 지점이다.
      2) `*` 셀렉터를 쓰지 않는다.
         `css/default.css:24~28` 이 `*{box-sizing:border-box}` 를 이미 선언했고
         `:459~463` 이 `.cheditor-popup-window *{box-sizing:content-box}` 로 되돌린다.
         우리가 `*{box-sizing:border-box}` 를 언레이어드로 재선언하면 그 복구가
         레이어에 갇혀 무력화되고 **cheditor5 팝업 레이아웃이 깨진다.**
      3) `outline:none` 전역 선언 금지. 포커스 링은 `:focus-visible` 로 항상 보장한다.
   ============================================================================ */

/* ── 문서 ────────────────────────────────────────────────────────────────
   css/default.css:4 `html{overflow-y:scroll}` 를 무력화한다.
   app-shell 은 html/body 가 스크롤되지 않는 구조인데, 저걸 두면 우측에 17px 죽은 띠가 생긴다. */
:where(html.ie-html) {
  block-size: 100%;
  overflow: hidden;
  -webkit-text-size-adjust: 100%;
}

/* css/default.css:5 `body{font-size:0.75em; font-family:'Malgun Gothic',dotum,sans-serif}`
   맑은 고딕은 숫자 자폭이 불균일해 **금액 열이 흔들린다**(08 §3.1). 폰트·크기를 되돌린다.
   그누보드는 body 12px 기준으로 em 을 쓰므로, 레거시 마크업에서는 아래 .ie-legacy 로 12px 를 복구한다. */
:where(body.ie-body) {
  margin: 0;
  block-size: 100%;
  overflow: hidden;
  font-family: var(--ie-font-sans);
  font-size: var(--ie-fs-14);
  line-height: var(--ie-lh-ui);
  color: var(--ie-c-text-body);
  background: var(--ie-c-surface-page);
  letter-spacing: 0;
  word-break: keep-all;          /* 한국어 어절 단위 줄바꿈: css/default.css:19 의 break-all 무력화 */
  overflow-wrap: break-word;     /* 긴 URL·영문은 강제 분리 */
  -webkit-font-smoothing: antialiased;
}

/* css/default.css:7,13,17 이 input/textarea/select/h1~h6 에도 맑은 고딕을 따로 박는다.
   하나만 덮으면 나머지가 남는다. 4곳을 한 번에 처리한다. */
:where(.ie-shell input, .ie-shell textarea, .ie-shell select, .ie-shell button,
       .ie-shell h1, .ie-shell h2, .ie-shell h3, .ie-shell h4, .ie-shell h5, .ie-shell h6) {
  font-family: inherit;
}

:where(.ie-shell h1, .ie-shell h2, .ie-shell h3, .ie-shell h4, .ie-shell h5, .ie-shell h6) {
  margin: 0;
  color: var(--ie-c-text-title);
  line-height: var(--ie-lh-tight);
  letter-spacing: -0.015em;
  font-weight: var(--ie-fw-semi);
}
:where(.ie-shell p) { margin: 0; word-break: keep-all; overflow-wrap: break-word; }

/* css/default.css:22 `a{color:#000;text-decoration:none}`: 링크가 전부 검정이 된다. */
:where(.ie-shell a) { color: var(--ie-c-text-link); text-decoration: none; }
:where(.ie-shell a:hover) { text-decoration: underline; }

/* css/default.css:20 `hr{display:none}`: <hr> 구분선이 통째로 사라진다. 원인 추적이 어려운 유형. */
:where(.ie-content hr) {
  display: block; block-size: 0; margin: var(--ie-sp-5) 0;
  border: 0; border-block-start: 1px solid var(--ie-c-border);
}

/* css/default.css:11 `legend{position:absolute;text-indent:-9999em}`
   <fieldset><legend> 폼 섹션 제목이 화면에서 사라진다. 우리 폼에서만 되살린다.
   레거시(.ie-legacy) 안에서는 그누보드 동작을 그대로 둔다. 스킨이 그걸 전제로 짜여 있다. */
:where(.ie-content:not(.ie-legacy) fieldset) { margin: 0; padding: 0; border: 0; min-inline-size: 0; }
:where(.ie-content:not(.ie-legacy) legend) {
  position: static; inline-size: auto; block-size: auto; overflow: visible;
  text-indent: 0; clip: auto; clip-path: none;
  font-size: var(--ie-fs-15); font-weight: var(--ie-fw-semi);
  color: var(--ie-c-text-title); padding: 0 0 var(--ie-sp-2);
}

/* css/default.css:10 `ul,dl,dt,dd{list-style:none}`: 게시글 본문 밖에서는 마커가 안 되살아난다.
   <ol> 은 아예 리셋 대상도 아니라 비대칭이다. 우리 영역에서 대칭으로 맞춘다. */
:where(.ie-content:not(.ie-legacy) ul, .ie-content:not(.ie-legacy) ol) { margin: 0; padding: 0; list-style: none; }
:where(.ie-prose ul) { list-style: disc;    margin: 0 0 var(--ie-sp-4); padding-inline-start: 1.4em; }
:where(.ie-prose ol) { list-style: decimal; margin: 0 0 var(--ie-sp-4); padding-inline-start: 1.6em; }

/* css/default.css:21 `pre{overflow-x:scroll}`: 항상 가로 스크롤바가 그려진다. */
:where(.ie-content pre) {
  overflow-x: auto; font-family: var(--ie-font-mono); font-size: var(--ie-fs-13);
  background: var(--ie-c-surface-sunken); padding: var(--ie-sp-3);
  border-radius: var(--ie-r-md); margin: 0 0 var(--ie-sp-4);
}
:where(.ie-content code) { font-family: var(--ie-font-mono); font-size: 0.92em; }

:where(.ie-content img) { max-inline-size: 100%; block-size: auto; }
:where(.ie-content table) { border-collapse: collapse; }

/* ── 숫자 · 금액 (08 §3.3) ────────────────────────────────────────────────
   ERP 에서 금액 열이 흔들리면 그 표는 실패다. */
.ie-num {
  font-variant-numeric: tabular-nums lining-nums;
  font-feature-settings: "tnum" 1, "lnum" 1;
  font-variant-ligatures: none;
  letter-spacing: 0;
}
.ie-num--money { text-align: right; font-weight: var(--ie-fw-semi); }
.ie-num--minus { color: var(--ie-danger); }
.ie-num--zero  { color: var(--ie-gray-500); }
.ie-num--none  { color: var(--ie-c-text-disabled); }

/* ── 스크린리더 전용 ──────────────────────────────────────────────────────
   ★ `.sound_only` 를 반드시 함께 정의한다.
     get_paging()(lib/common.lib.php:47) 이 <span class="sound_only">페이지</span> 를 낸다.
     정의를 빠뜨리면 페이지네이션에 "열린3페이지" 같은 글자가 화면에 노출된다. */
/* `.ie-sr-only` 는 별칭이다. 규약은 `.ie-sr` 이지만 실제 코드가 `.ie-sr-only` 로 쓴 곳이
   있고(캘린더 폼·공휴일·목록), 정의가 없으면 **숨겨야 할 텍스트가 화면에 그대로 노출된다**.
   이름을 통일하는 것보다 별칭 한 줄이 안전하다. 마크업을 고치다 빠뜨리면 그 화면만 조용히 깨진다. */
.ie-sr,
.ie-sr-only,
.ie-shell .sound_only,
.ie-shell .msg_sound_only {
  position: absolute !important;
  inline-size: 1px; block-size: 1px;
  margin: -1px; padding: 0; overflow: hidden;
  clip: rect(0, 0, 0, 0); clip-path: inset(50%);
  white-space: nowrap; border: 0;
}
/* 위 !important 는 그누보드 css/default.css:219 의 `.sound_only{…!important ×5}` 와
   같은 값을 유지하기 위한 것이다(레이어에 갇힌 원본을 그대로 재현). 새 예외가 아니다. */

/* 포커스 시에만 드러나는 요소 (스킵 링크·검색 버튼) */
.ie-sr-focusable {
  position: absolute; inline-size: 1px; block-size: 1px; overflow: hidden;
  clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; padding: 0;
}
.ie-sr-focusable:focus-visible {
  position: static; inline-size: auto; block-size: auto; clip: auto;
  padding: 0 var(--ie-sp-2);
}

.ie-skip {
  position: absolute; inset-block-start: -60px; inset-inline-start: var(--ie-sp-3);
  z-index: var(--ie-z-toast);
  background: var(--ie-c-action); color: var(--ie-c-action-on);
  padding: var(--ie-sp-2) var(--ie-sp-4); border-radius: var(--ie-r-md);
  font-size: var(--ie-fs-14); font-weight: var(--ie-fw-semi);
  transition: inset-block-start var(--ie-dur-fast) var(--ie-ease);
}
.ie-skip:focus-visible { inset-block-start: var(--ie-sp-2); text-decoration: none; }

/* ── 아이콘 (인라인 SVG 스프라이트) ───────────────────────────────────────
   viewBox 는 <symbol> 이 갖고 있으므로 사용처는 크기만 지정하면 된다. */
.ie-sprite { display: none; }
.ie-i {
  inline-size: 16px; block-size: 16px; flex: 0 0 auto;
  fill: none; stroke: currentColor; stroke-width: 1.75;
  stroke-linecap: round; stroke-linejoin: round;
  vertical-align: -0.18em;
}
.ie-i--12 { inline-size: 12px; block-size: 12px; }
.ie-i--20 { inline-size: 20px; block-size: 20px; }
.ie-i--40 { inline-size: 40px; block-size: 40px; stroke-width: 1.25; }

/* ── 레거시 격리 (10_CSS.md §1.5 3층 방어선) ──────────────────────────────
   우리가 포크하지 않는 화면(로그인·회원가입·비번찾기·통합검색·새창·캡차)은
   그누보드 스킨이 그대로 렌더된다. 그 CSS 는 **body 12px 를 전제로 em 을 쓴다.**
   우리가 14px 로 올렸으므로 레거시 마크업 안에서만 기준을 되돌린다.
   안 하면 .btn(1.4em) 이 16.8→19.6px, #bo_v_tit(2em) 이 24→28px 로 팽창한다. */
.ie-legacy { font-size: 12px; color: var(--ie-c-text-body); }
.ie-legacy .ie-btn,
.ie-legacy .ie-table,
.ie-legacy .ie-badge,
.ie-legacy .ie-pagehead { font-size: var(--ie-fs-14); }
.ie-legacy .ie-pagehead__title { font-size: var(--ie-fs-20); }

/* ── @layer 미지원 환경: 조용히 깨지지 않고 시끄럽게 알린다 ───────────────
   격리 전체가 @layer 에 걸려 있다(Chrome/Edge 99+, FF 97+, Safari 15.4+ / 2022-03).
   미지원이면 그누보드 CSS 가 레이어 없이 우리와 뒤섞여 화면이 무너진다. */
.ie-nolayer .ie-shell::before {
  content: "이 브라우저는 지원되지 않습니다. Chrome 또는 Edge 최신 버전을 사용해 주세요.";
  display: block; padding: var(--ie-sp-3) var(--ie-sp-4);
  background: var(--ie-danger-tint); color: var(--ie-danger-ink);
  border-block-end: 1px solid var(--ie-danger-border);
  font-size: var(--ie-fs-14); text-align: center;
}

/* ── `hidden` 속성은 무엇이든 이겨야 한다 ────────────────────────────────
   ★ `!important` 를 쓰는 이유
     `[hidden]` 은 특이도 (0,1,0) 이다. 컴포넌트가 `.ie-field { display:flex }` 처럼
     **같은 특이도로 나중에** display 를 지정하면 `hidden` 이 조용히 무시된다.
     실제로 그랬다. 캘린더 반복 폼의 요일/일자 블록이 동시에 보이고, 일정 유형과
     무관하게 연차 차감 필드가 M5 부터 계속 노출돼 있었다(실브라우저 검증에서 발견).
     HTTP 응답만 보면 `hidden` 이 붙어 있으니 정상으로 보인다. 눈으로만 잡히는 종류다.

     `hidden` 은 "이건 지금 보이면 안 된다"는 **작성자의 명시적 선언**이므로
     레이아웃 규칙이 이걸 이기는 상황 자체가 버그다. 여기서 못 박는다.
     (숨긴 채로 레이아웃을 잡아야 하면 `hidden` 이 아니라 `.ie-sr` 이나 별도 상태 클래스를 쓴다.) */
[hidden] { display: none !important; }
