/* ══════════════════════════════════════════════════════════════════════
   잡아바 UIUX 개편 · 컴포넌트  v2 (2026-09-04)
   ----------------------------------------------------------------------
   시안 실측 규격을 재사용 가능한 단위로 정규화한다. 페이지 CSS 는 이 컴포넌트를
   조합·배치만 하고 규격을 다시 정의하지 않는다.
   목차 : Button · Link · Chip · Badge · Card-media · Gauge · Bar · Notice ·
          Table(운영 유지) · List row · Summary  (뒤 3종은 마이페이지용 · 시트에 수록)
   ★ 수직 정렬 : 버튼·칩은 고정 높이 + flex 중앙정렬. line-height 로 높이를 만들지 않는다.
   ══════════════════════════════════════════════════════════════════════ */

/* ── Button ──────────────────────────────────────────────────────────
   기본 pill(h41 · Paperlogy Medium 16) · 사각형(--rect h50 r8 SemiBold) · 소형(--sm h30 r8 14)
   운영 교체 대상 : .rl-btn · .ai_entry_btn → .jb-btn 규격으로 통일 */
.jb-btn{
  display:inline-flex; align-items:center; justify-content:center; gap:6px;
  height:var(--jb-btn-h); padding:0 20px; border:1px solid transparent; border-radius:var(--jb-r-pill);
  font-family:var(--jb-font-display); font-weight:var(--jb-fw-medium); font-size:var(--jb-fs-base); line-height:1;
  text-decoration:none; white-space:nowrap; cursor:pointer; background:none;
  transition:background var(--jb-dur-fast) var(--jb-ease), border-color var(--jb-dur-fast) var(--jb-ease), color var(--jb-dur-fast) var(--jb-ease);
}
.jb-btn--primary  { background:var(--jb-brand); border-color:var(--jb-brand); color:var(--jb-on-brand); }
.jb-btn--primary:hover{ background:var(--jb-brand-hover); border-color:var(--jb-brand-hover); }
/* 보조 버튼 = «아웃라인» 하나로 통일한다(2026-09-23 사용자 지시 · D169 · dev 반영 2026-09-24 D186 ①).
   종전 --secondary 는 «회색 테두리 + 먹색 글자»라 브랜드 톤 밖이었고, --outline 과 «같은 자리»에 서로 다른
   모양으로 섞여 있었다. 기준 모양 = 「맞춤 공고 추천」 버튼(흰 면 · 브랜드 테두리 · 브랜드 글자 · pill).
   두 이름을 «둘 다 남긴» 것은 기존 마크업을 고치지 않기 위해서다(--secondary 31파일 · --outline 8파일). */
.jb-btn--secondary,
.jb-btn--outline  { background:var(--jb-surface); border-color:var(--jb-brand); color:var(--jb-brand); }
.jb-btn--secondary:hover,
.jb-btn--outline:hover{ background:var(--jb-brand-weak); }
.jb-btn--ghost    { color:var(--jb-muted); }
.jb-btn--ghost:hover{ background:var(--jb-bg-subtle); color:var(--jb-ink); }
/* 브랜드 면 위 CTA (로그인 패널) : 흰 면 · 옅은 틸 2px · #222 SemiBold */
.jb-btn--onbrand  { background:var(--jb-surface); border:2px solid var(--jb-brand-soft); color:var(--jb-ink); font-weight:var(--jb-fw-semibold); }
.jb-btn--onbrand:hover{ background:var(--jb-brand-weak); }

.jb-btn--rect{ height:var(--jb-btn-h-rect); border-radius:var(--jb-r-btn); font-weight:var(--jb-fw-semibold); }
.jb-btn--sm  { height:var(--jb-btn-h-sm); padding:0 10px; border-radius:var(--jb-r-btn); font-size:var(--jb-fs-sm); }
.jb-btn--lg  { height:var(--jb-btn-h-rect); padding:0 28px; font-size:var(--jb-fs-md); }
.jb-btn--block{ width:100%; }
/* 버튼 «행» (팝업 하단 등) — 나란히 · 중앙 · 간격 10 (2026-09-27 · D271).
   운영의 `.ac`(text-align:center)를 대신한다. `.jb-btn` 이 inline-flex 라 gap 으로 간격을 준다.
   ⚠️ 세로 여백은 «주지 않는다» — 종전 `.ac` 도 여백이 없었고, 넣으면 요청 밖의 변화가 된다. */
.jb-btnrow{ display:flex; justify-content:center; align-items:center; gap:10px; }
/* ⚠️ 모바일 분기는 «두지 않았다» — 390 에서도 70+10+70=150 으로 들어간다. 꽉 채우는 모양은 요청에 없다. */
/* 점선 «추가» 버튼 (2026-09-18 · D90) — 직종·지역처럼 팝업에서 골라 담는 자리.
   실행 버튼이 아니라 «빈 칸을 채우러 가는 자리»라 점선으로 둔다(채워지면 위에 칩이 쌓인다). */
.jb-btn--dashed{ border-style:dashed; background:none; color:var(--jb-muted); font-weight:var(--jb-fw-regular); }
.jb-btn--dashed:hover{ border-color:var(--jb-brand); color:var(--jb-brand); background:none; }
/* 2026-09-23 삭제(D169) · dev 반영 2026-09-24(D186 ①) — `.jb-btn--sm.jb-btn--secondary{ color:#666 }` 은
   위 통일 규격을 깨뜨린다. 소형이라고 글자색이 달라질 이유가 없다(크기만 다르다). */
.jb-btn[disabled], .jb-btn.is-disabled{ background:var(--jb-bg-subtle); border-color:var(--jb-border); color:var(--jb-disabled); cursor:not-allowed; pointer-events:none; }
/* ▲ 링크형 버튼 · jb- 카드형 앵커의 «운영 import.css a:link 대응» 색 규칙은 legacy-bridge.css 로 옮겼다(2026-09-18 D130 4-0 · DS 파일에 운영 대응 규칙을 두지 않는다) */

/* ── Text link (라벨 + 화살표 20) ───────────────────────────────────── */
.jb-link{
  display:inline-flex; align-items:center; gap:6px;
  font-family:var(--jb-font-display); font-weight:var(--jb-fw-semibold); font-size:var(--jb-fs-base); line-height:var(--jb-lh-tight);
  color:var(--jb-muted); text-decoration:none; }
.jb-link:hover{ color:var(--jb-brand); }
.jb-link--brand{ color:var(--jb-brand); }
.jb-link--brand:hover{ color:var(--jb-brand-hover); }
.jb-link__arrow{ flex:none; width:20px; height:20px; }

/* ── Chip / pill tab (h41 · 16px · 선택 #333) ───────────────────────── */
.jb-chips{ display:flex; align-items:center; gap:var(--jb-sp-3); flex-wrap:wrap; }
.jb-chip{
  display:inline-flex; align-items:center; justify-content:center;
  height:var(--jb-btn-h); padding:0 19px; border:1px solid transparent; border-radius:var(--jb-r-pill);
  background:var(--jb-surface); color:var(--jb-ink);
  font-family:var(--jb-font-body); font-weight:var(--jb-fw-regular); font-size:var(--jb-fs-base);
  cursor:pointer; transition:background var(--jb-dur-fast) var(--jb-ease); text-decoration:none; }
.jb-chip:hover{ background:var(--jb-bg-subtle); }
.jb-chip--on-tint { background:var(--jb-surface); }                       /* 회색 섹션 위 (기본) */
.jb-chip--outline { border-color:var(--jb-border); }                      /* 흰 배경 위 · 메인 맞춤추천 */
.jb-chip--on-white{ background:var(--jb-bg-subtle); }                     /* 흰 배경 위 · 마이페이지 */
.jb-chip--on-white:hover{ background:var(--jb-bg-hover); }
/* 토글 칩(button)은 aria-pressed 로 상태를 싣는다 — 카탈로그 10-3·프로토타입 .chip[aria-pressed] 와 같다(UI2026 2단계 재개발 때 누락 발견) */
.jb-chip[aria-selected="true"], .jb-chip[aria-pressed="true"], .jb-chip.is-active{
  background:var(--jb-inverse); border-color:var(--jb-inverse); color:var(--jb-on-inverse); font-weight:var(--jb-fw-semibold); }
/* 2026-09-17 단위테스트 04-6 : 선택 상태에서 칩 안의 건수 등 자식 요소도 반전색을 따른다
   (자식이 제 색을 가지고 있으면 검은 글자가 남아 안 보인다).
   ★ 정본(design/css/components.css)은 aria-selected · is-active 두 훅만 적었으나
     04 공공채용 필터 칩의 마크업은 aria-pressed 다(정본 job-public-list.html:185 · dev publicJobList.jsp:107).
     그 훅을 빼면 정작 04-6 이 지적한 「(43) 이 검정으로 남는다」가 안 고쳐지므로
     바로 위 선택 규칙과 «같은 3종»을 받게 한다. */
.jb-chip[aria-selected="true"] *, .jb-chip[aria-pressed="true"] *, .jb-chip.is-active *{ color:inherit; }

/* ── Badge (h20 · r4 · 12 SemiBold) — 운영 .rl-badge 교체 ──────────── */
.jb-badge{
  display:inline-flex; align-items:center; justify-content:center; height:20px; padding:0 6px; border-radius:var(--jb-r-sm);
  font-family:var(--jb-font-body); font-size:var(--jb-fs-2xs); font-weight:var(--jb-fw-semibold); line-height:1;
  white-space:nowrap; background:var(--jb-bg-subtle); color:var(--jb-muted); }
.jb-badge--dday   { color:var(--jb-danger); }
.jb-badge--always { color:var(--jb-brand); }   /* 마감일 없음(「채용시까지」 · 「상시」) — 목록 카드 `.jb-jobcard__dday--always` 와 같은 의미색 (2026-09-18 D129 ④) */
.jb-badge--brand  { background:var(--jb-brand-weak);   color:var(--jb-brand-deep); }
.jb-badge--solid  { background:var(--jb-brand);        color:var(--jb-on-brand); }
.jb-badge--success{ background:var(--jb-success-weak); color:var(--jb-success); }
.jb-badge--warning{ background:var(--jb-warning-weak); color:var(--jb-warning-ink); }
.jb-badge--danger { background:var(--jb-danger);       color:var(--jb-on-brand); }
.jb-badge--outline{ background:var(--jb-surface); border:1px solid var(--jb-border); }
/* 상태 태그 (AI 매칭 '부분 입력' · 추천 '맞춤정보') : h26/28 · pill · 14 SemiBold 브랜드 */
.jb-tag{ display:inline-flex; align-items:center; height:26px; padding:0 10px; border-radius:var(--jb-r-pill);
  background:var(--jb-brand-weak); font-family:var(--jb-font-display); font-weight:var(--jb-fw-semibold);
  font-size:var(--jb-fs-sm); line-height:1; color:var(--jb-brand); }
.jb-tag--outline{ height:28px; padding:0 11px; background:var(--jb-surface); border:1px solid var(--jb-border); }
/* D83 ⑨ (2026-09-18) — 경고 상태 태그. AI 매칭 준비도의 「이력서 미등록」·「기준 미선택」·「정보 부족」이 쓴다.
   없으면 경고가 「부분 입력」과 같은 브랜드 톤으로 보인다(종전 `.aimb_kicker.is_warn` = amber 였다). */
.jb-tag--warning{ background:var(--jb-warning-weak); color:var(--jb-warning-ink); }

/* ── Label (라운딩 박스 · 옅은 회색 면 · 검은 글자) ────────────────────
   카드 안에서 '지역 · 채용분야'처럼 값 자체를 감싸는 라벨.
   상태를 나타내는 Badge(h20 · 12 · 회색 글자) · Tag(브랜드 톤)와 역할이 다르므로
   별도 컴포넌트로 둔다. 아이콘을 넣을 때는 .jb-label__ico 를 함께 쓴다. */
.jb-label{ display:inline-flex; align-items:center; gap:var(--jb-sp-2);
  height:28px; padding:0 12px; border-radius:var(--jb-r-btn);
  background:var(--jb-bg-subtle); color:var(--jb-ink);
  font-family:var(--jb-font-body); font-weight:var(--jb-fw-medium);
  font-size:var(--jb-fs-sm); line-height:1; white-space:nowrap; }
.jb-label__ico{ flex:none; width:14px; height:14px; color:var(--jb-muted); }

/* ── Card-media (아이콘 + 텍스트 가로 카드 · 630×191) ─────────────────
   Figma : p40/60 · 아이콘 x60 · 텍스트 x150 · 제목 22 · 설명 16 · 링크 y90
   아이콘 30→42 확대(2026-09-04) : gap 60→48 로 텍스트 시작점(x150) 유지 */
.jb-card-media{
  display:flex; align-items:center; gap:48px; min-height:191px;
  padding:var(--jb-pad-card); border-radius:var(--jb-r-card); background:var(--jb-surface);
  text-decoration:none; overflow:hidden; transition:box-shadow var(--jb-dur-base) var(--jb-ease); }
.jb-card-media:hover{ box-shadow:var(--jb-shadow-hover); }
.jb-card-media__icon{ flex:none; width:var(--jb-icon-card); height:var(--jb-icon-card); }
.jb-card-media__body{ flex:1 1 auto; min-width:0; display:flex; flex-direction:column; gap:var(--jb-sp-6); }
.jb-card-media__title{ display:block; margin:0 0 var(--jb-sp-3); font-family:var(--jb-font-display);
  font-weight:var(--jb-fw-semibold); font-size:var(--jb-fs-h4); line-height:var(--jb-lh-tight); color:var(--jb-ink); }
.jb-card-media__desc{ display:block; font-size:var(--jb-fs-base); line-height:var(--jb-lh-tight); letter-spacing:-.02em; color:var(--jb-muted); }

/* ── Gauge (도넛 100 · 링 10 · conic-gradient) ──────────────────────
   숫자 22 Bold 브랜드 + % 16 #333 세로 적층. flex column 중앙정렬 (grid place-items 는 행 stretch 로 벌어짐) */
.jb-gauge{ position:relative; display:flex; flex-direction:column; align-items:center; justify-content:center; flex:none;
  width:var(--jb-gauge); height:var(--jb-gauge); border-radius:50%;
  background:conic-gradient(var(--jb-brand) calc(var(--jb-rate,0) * 1%), var(--jb-border-weak) 0); }
.jb-gauge::after{ content:""; position:absolute; inset:10px; border-radius:50%; background:var(--jb-surface); }
.jb-gauge__num, .jb-gauge__unit{ position:relative; z-index:1; font-family:var(--jb-font-body); }
.jb-gauge__num { font-weight:var(--jb-fw-bold); font-size:var(--jb-fs-h4); line-height:29px; color:var(--jb-brand); }
.jb-gauge__unit{ font-size:var(--jb-fs-base); line-height:21px; color:var(--jb-inverse); }

/* ── Progress bar ───────────────────────────────────────────────────── */
.jb-bar{ display:block; width:100%; max-width:150px; height:6px; border-radius:var(--jb-r-pill); background:var(--jb-border-soft); overflow:hidden; }
.jb-bar__fill{ display:block; height:100%; border-radius:var(--jb-r-pill); background:var(--jb-brand-light); }

/* ── Notice bar ─────────────────────────────────────────────────────── */
.jb-notice{ display:flex; align-items:center; justify-content:space-between; gap:var(--jb-sp-4); flex-wrap:wrap;
  padding:14px 20px; border:1px solid var(--jb-border); border-radius:var(--jb-r-box); background:var(--jb-bg-section); }
.jb-notice--brand{ background:var(--jb-brand-weak); border-color:var(--jb-brand-soft); }
/* 되돌릴 수 없는 처리의 «위험 고지» (2026-09-18 · D85)
   회원탈퇴처럼 «무엇이 사라지는지»를 먼저 말해야 하는 자리. 배지(jb-badge--danger)는 있었지만
   문단형 고지 변형이 없어 신설했다. --brand 와 같은 골격이고 색만 위험색으로 바꾼다. */
.jb-notice--danger{ border-color:var(--jb-danger-line); background:var(--jb-danger-weak); color:var(--jb-ink); }
.jb-notice--danger .jb-notice__ico{ color:var(--jb-danger); }

/* ── Table [운영 현행 유지 · 교체 대상 아님] ────────────────────────── */
.jb-table{ width:100%; border-collapse:collapse; }
.jb-table th, .jb-table td{ font-family:var(--jb-font-body); text-align:center; border-bottom:1px solid var(--jb-border); }
.jb-table th{ padding:14px 16px; background:var(--jb-th-bg); font-weight:var(--jb-fw-medium); font-size:var(--jb-fs-xs); color:var(--jb-muted); }
/* 헤더 위 굵은 선 (2026-09-18 · D88) — 목록이 «어디서 시작하는지»를 분명히 한다.
   본문 행 구분선(1px)보다 굵어야 헤더가 행으로 읽히지 않는다. */
.jb-table thead th{ border-top:2px solid var(--jb-ink); }
.jb-table td{ padding:16px; font-size:var(--jb-fs-sm); color:var(--jb-body); vertical-align:middle; }
.jb-table .jb-td-left{ text-align:left; }
/* 빈 상태 행 (2026-09-18 · D87) — 6개 퍼블이 쓰는데 정의가 없었다.
   `.jb-table td` 가 이미 가운데 정렬이라 «지금은» 티가 안 나지만, 빈 상태는
   「데이터가 없다」를 말하는 자리라 본문 행과 톤이 달라야 한다. */
/* ⚠️ 2026-09-18 실측 — 종전 `.jb-table__empty` (0,1,0) 는 바로 위 `.jb-table td` (0,1,1) 에 **져서**
   한 번도 적용된 적이 없다(계산값 `padding:16px` · `color:--jb-body`). 의도한 60/16 여백과
   `--jb-muted` 가 전혀 안 나왔다. 특정도를 (0,2,1) 로 올려 잡는다. 정본에도 같은 결함이 있다 — 보고했다. */
.jb-table .jb-table__empty{ padding:var(--jb-sp-8) var(--jb-sp-4); color:var(--jb-muted); }   /* 정본 이름(0,2,0) · D130 4-0 */
/* 좁은 화면에서 표가 컬럼을 밀지 않도록 표 자체만 가로 스크롤시킨다 */
.jb-tablewrap{ overflow-x:auto; }
.jb-tablewrap .jb-table{ min-width:760px; }
/* 빈 표는 가로 스크롤을 풀어 안내 문구가 390 에서 잘리지 않게 한다 (2026-09-18 QA E21 — 760 가운데라 「등록된 데이…」로 잘림) */
.jb-tablewrap .jb-table:has(.jb-table__empty){ min-width:0; }

/* ── List row (마이페이지 · h142 · p40/20 · 첫 행 상단선 #222) ─────── */
.jb-listrow{ display:flex; align-items:center; justify-content:space-between; gap:var(--jb-sp-5); flex-wrap:wrap;
  padding:40px 20px; border-top:1px solid var(--jb-border); background:var(--jb-surface); }
.jb-listrow:first-child{ border-top-color:var(--jb-ink); }
.jb-listrow:last-child{ border-bottom:1px solid var(--jb-border); }
.jb-listrow__body{ display:flex; flex-direction:column; gap:var(--jb-sp-3); min-width:0; }
.jb-listrow__title{ display:flex; align-items:center; gap:var(--jb-sp-3); margin:0;
  font-family:var(--jb-font-display); font-weight:var(--jb-fw-semibold); font-size:var(--jb-fs-lg); line-height:var(--jb-lh-tight); color:var(--jb-ink); }
.jb-listrow__desc{ margin:0; font-size:var(--jb-fs-base); line-height:1.5; color:var(--jb-muted); }

/* ── Summary bar (마이페이지 회원정보 요약 · r20 · #F8F8F8) ─────────── */
.jb-summary{ display:flex; align-items:center; padding:16px 0; border-radius:var(--jb-r-card); background:var(--jb-bg-summary); }
.jb-summary__id{ flex:1 1 auto; min-width:0; display:flex; flex-direction:column; justify-content:space-between; height:100px; padding:8px 40px; }
.jb-summary__meta{ display:flex; align-items:center; gap:var(--jb-sp-3); font-family:var(--jb-font-display); font-size:var(--jb-fs-base); line-height:var(--jb-lh-tight); }
.jb-summary__type{ font-weight:var(--jb-fw-semibold); color:var(--jb-brand); }
.jb-summary__div{ width:1px; height:12px; background:var(--jb-border); }
.jb-summary__name{ font-family:var(--jb-font-display); font-weight:var(--jb-fw-semibold); font-size:32px; line-height:var(--jb-lh-tight); color:var(--jb-ink); }
.jb-summary__stat{ flex:none; display:flex; flex-direction:column; justify-content:center; gap:24px; width:200px; height:100px; padding:0 30px; border-left:1px solid var(--jb-border); }
.jb-summary__stat-label{ font-family:var(--jb-font-display); font-weight:var(--jb-fw-medium); font-size:var(--jb-fs-sm); line-height:var(--jb-lh-tight); color:var(--jb-muted); }
.jb-summary__stat-num{ font-weight:var(--jb-fw-bold); font-size:30px; line-height:var(--jb-lh-tight); color:var(--jb-ink); }
.jb-summary__stat--key .jb-summary__stat-num{ color:var(--jb-brand); }

/* ── 반응형 ─────────────────────────────────────────────────────────── */
@media (max-width:900px){
  .jb-card-media{ gap:var(--jb-sp-5); padding:24px 20px; }
  .jb-listrow{ padding:24px 16px; }
  .jb-summary{ flex-direction:column; align-items:stretch; padding:8px 0; }
  .jb-summary__id{ height:auto; padding:16px 20px; gap:8px; }
  .jb-summary__stat{ flex-direction:row; align-items:center; justify-content:space-between; width:100%; height:auto; padding:14px 20px; gap:6px; border-left:0; border-top:1px solid var(--jb-border); }
}

/* ══════════════════════════════════════════════════════════════════════
   목록 · 상세 · 폼 컴포넌트   v1 (2026-09-04 · 사용자 승인)
   ----------------------------------------------------------------------
   구성 기준 : 화면 구성은 프로토타입, 데이터 바인딩/id 규약/JS 함수는 운영 승계
   목차 : [공통] Crumb · Pagehead · Tabbar · Modal
          [목록] Jobcat · Searchbar/Searchbox · Filter · Resulthead · Sorttabs ·
                 Jobcard · Joblist/More · Empty · Pagination
          [상세] Detailhead · Prose · Sidebox · Sidesum · Attach · Disclaimer
          [폼]   Fieldset · Form row · Input/Select/Textarea · Check · Radio ·
                 File · Agree
          [확장] Chip removable/count · Notice plain · Table info
   ══════════════════════════════════════════════════════════════════════ */


/* ── Icon (mask 방식 · currentColor 를 따라가므로 상태별 색 전환이 된다) ──
   사용 : <i class="jb-ico jb-ico--map-pin" aria-hidden="true"></i>
   크기 : 기본 20px. 컴포넌트 쪽 규칙(예: .jb-jobcard__loc-ico)이 덮어쓴다. */
.jb-ico{ display:inline-block; flex:none; width:20px; height:20px; background-color:currentColor;
  -webkit-mask-image:var(--jb-ico); mask-image:var(--jb-ico);
  -webkit-mask-repeat:no-repeat;    mask-repeat:no-repeat;
  -webkit-mask-position:center;     mask-position:center;
  -webkit-mask-size:contain;        mask-size:contain; }
/* 아이콘 소스는 assets/img/icon/{ui,job}/*.svg 이며 아래는 그 파일을 data URI 로 인라인한 것이다.
   ★ 외부 파일 URL 을 쓰면 file:// 로 열었을 때 Chrome 이 mask 를 차단해 아이콘이 통째로 사라진다
     (파일마다 오리진이 달라 mask 의 same-origin 규칙에 걸린다). 운영(http)에서는 파일 URL 도 동작하지만
     검수 환경까지 같게 유지하려고 인라인한다. 아이콘을 고치면 SVG 파일 수정 후 이 블록을 다시 생성한다. */
.jb-ico--caret-down{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 9l7 7 7-7'/%3E%3C/svg%3E"); }
.jb-ico--chevron-left{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M15 5l-7 7 7 7'/%3E%3C/svg%3E"); }
.jb-ico--chevron-right{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 5l7 7-7 7'/%3E%3C/svg%3E"); }
.jb-ico--chevron-down{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 9l7 7 7-7'/%3E%3C/svg%3E"); }
.jb-ico--close{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 6l12 12M18 6L6 18'/%3E%3C/svg%3E"); }
.jb-ico--plus{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 5v14M5 12h14'/%3E%3C/svg%3E"); }
.jb-ico--check{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 12.5l5.5 5.5L20 7'/%3E%3C/svg%3E"); }
.jb-ico--reset{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 5v5h5'/%3E%3Cpath d='M4.6 14a8 8 0 1 0 1.2-6'/%3E%3C/svg%3E"); }
.jb-ico--filter{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 7h10M18 7h2M4 12h4M12 12h8M4 17h10M18 17h2'/%3E%3Ccircle cx='16' cy='7' r='2'/%3E%3Ccircle cx='10' cy='12' r='2'/%3E%3Ccircle cx='16' cy='17' r='2'/%3E%3C/svg%3E"); }
.jb-ico--map-pin{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 21s7-5.6 7-11a7 7 0 1 0-14 0c0 5.4 7 11 7 11z'/%3E%3Ccircle cx='12' cy='10' r='2.6'/%3E%3C/svg%3E"); }
/* ▼ R47 관심·알림 아이콘 2종 (2026-09-14) */
.jb-ico--heart{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 20.35 4.92 13.4a4.6 4.6 0 0 1 6.5-6.5l.58.58.58-.58a4.6 4.6 0 0 1 6.5 6.5z'/%3E%3C/svg%3E"); }
/* 🔴 2026-09-27 D275 — 관심 «등록됨» 상태의 하트(면을 채운다 · 정본 components.css:1243).
   같은 path 를 fill 로만 바꿨다 — 모양이 어긋나지 않는다. */
.jb-ico--heart-fill{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='currentColor'%3E%3Cpath d='M12 20.35 4.92 13.4a4.6 4.6 0 0 1 6.5-6.5l.58.58.58-.58a4.6 4.6 0 0 1 6.5 6.5z'/%3E%3C/svg%3E"); }
.jb-ico--bell{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M18 8.8a6 6 0 1 0-12 0c0 4.9-2 6.4-2 6.4h16s-2-1.5-2-6.4z'/%3E%3Cpath d='M10.3 18.8a2 2 0 0 0 3.4 0'/%3E%3C/svg%3E"); }
/* user-check · image — 프로토타입(lucide) 대외활동 목록 안내 줄 · 추천 콘텐츠 썸네일 자리 */
.jb-ico--user-check{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2'/%3E%3Ccircle cx='9' cy='7' r='4'/%3E%3Cpolyline points='16 11 18 13 22 9'/%3E%3C/svg%3E"); }
.jb-ico--image{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect width='18' height='18' x='3' y='3' rx='2' ry='2'/%3E%3Ccircle cx='9' cy='9' r='2'/%3E%3Cpath d='m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21'/%3E%3C/svg%3E"); }
/* hash · arrow-down — 프로토타입(lucide) 정책 카드 해시태그 · 「마감임박 전체보기」 (UI2026 12단계) */
/* link — 주소 복사(정책 · 채용 상세 헤더 · UI2026 13단계) */
.jb-ico--link{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M10 13a5 5 0 0 0 7.5.5l3-3a5 5 0 0 0-7-7l-1.7 1.7'/%3E%3Cpath d='M14 11a5 5 0 0 0-7.5-.5l-3 3a5 5 0 0 0 7 7l1.7-1.7'/%3E%3C/svg%3E"); }
.jb-ico--message{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 4h14a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2h-8l-5 4v-4H5a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2z'/%3E%3Cpath d='M8 10.5h.01M12 10.5h.01M16 10.5h.01' stroke-width='2.4'/%3E%3C/svg%3E"); }   /* 문자(SMS) 보내기 (2026-09-18) */
.jb-ico--hash{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='4' x2='20' y1='9' y2='9'/%3E%3Cline x1='4' x2='20' y1='15' y2='15'/%3E%3Cline x1='10' x2='8' y1='3' y2='21'/%3E%3Cline x1='16' x2='14' y1='3' y2='21'/%3E%3C/svg%3E"); }
.jb-ico--arrow-down{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 5v14'/%3E%3Cpath d='m19 12-7 7-7-7'/%3E%3C/svg%3E"); }
.jb-ico--paperclip{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 11.5l-8 8a5 5 0 0 1-7-7l8.5-8.5a3.4 3.4 0 0 1 4.8 4.8L9.7 17.4a1.8 1.8 0 0 1-2.5-2.5l7.8-7.8'/%3E%3C/svg%3E"); }
.jb-ico--flame{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3c2.5 3.2 5.5 5.2 5.5 9a5.5 5.5 0 0 1-11 0c0-2 .9-3.4 2-4.6.3 1.3 1 2.1 2 2.4C10 7.7 10.6 5.2 12 3z'/%3E%3C/svg%3E"); }
/* calendar — 공공 캠린더 보조 버튼(UI2026 4단계 · 결정 D13) */
.jb-ico--calendar{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='5' width='18' height='16' rx='2'/%3E%3Cpath d='M3 10h18M8 3v4M16 3v4'/%3E%3C/svg%3E"); }
.jb-ico--clock{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='8.5'/%3E%3Cpath d='M12 7.5V12l3 2'/%3E%3C/svg%3E"); }
.jb-ico--external{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14 4h6v6'/%3E%3Cpath d='M20 4l-8.5 8.5'/%3E%3Cpath d='M18 14v4.5A1.5 1.5 0 0 1 16.5 20h-11A1.5 1.5 0 0 1 4 18.5v-11A1.5 1.5 0 0 1 5.5 6H10'/%3E%3C/svg%3E"); }
.jb-ico--bulb{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='9.5' r='5.5'/%3E%3Cpath d='M9.5 17.2h5'/%3E%3Cpath d='M10.5 20h3'/%3E%3C/svg%3E"); }
.jb-ico--search-sm{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='6.5'/%3E%3Cpath d='M16 16l4.5 4.5'/%3E%3C/svg%3E"); }
.jb-ico--inbox{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3.5 13h5l1.5 3h4l1.5-3h5'/%3E%3Cpath d='M5.6 5.5h12.8l2.1 7.5v5a1.5 1.5 0 0 1-1.5 1.5H5a1.5 1.5 0 0 1-1.5-1.5v-5z'/%3E%3C/svg%3E"); }
.jb-ico--download{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 4v11'/%3E%3Cpath d='M7.5 10.5L12 15l4.5-4.5'/%3E%3Cpath d='M4.5 19h15'/%3E%3C/svg%3E"); }
.jb-ico--job-briefcase{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none'%3E%3Cg stroke='%2300AAA5' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='2.75' y='7.25' width='18.5' height='12.5' rx='2' fill='%2300AAA5' fill-opacity='0.15'/%3E%3Cpath d='M8.75 7.25V6a2 2 0 0 1 2-2h2.5a2 2 0 0 1 2 2v1.25'/%3E%3Cpath d='M2.75 12.5h18.5'/%3E%3C/g%3E%3C/svg%3E"); }
.jb-ico--job-code{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none'%3E%3Cg stroke='%2300AAA5' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='2.75' y='4.75' width='18.5' height='14.5' rx='2.5' fill='%2300AAA5' fill-opacity='0.15'/%3E%3Cpath d='M9.6 10.1 7.1 12.4l2.5 2.3'/%3E%3Cpath d='M14.4 10.1l2.5 2.3-2.5 2.3'/%3E%3C/g%3E%3C/svg%3E"); }
.jb-ico--job-graduation{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none'%3E%3Cg stroke='%2300AAA5' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 4.5 21.5 9 12 13.5 2.5 9z' fill='%2300AAA5' fill-opacity='0.15'/%3E%3Cpath d='M6.75 10.9V15c0 1.35 2.35 2.45 5.25 2.45S17.25 16.35 17.25 15v-4.1'/%3E%3Cpath d='M21.5 9v4.25'/%3E%3C/g%3E%3C/svg%3E"); }
.jb-ico--job-stethoscope{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none'%3E%3Cg stroke='%2300AAA5' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5.75 3.5v4.75a4.25 4.25 0 0 0 8.5 0V3.5'/%3E%3Cpath d='M4.25 3.5h3M12.75 3.5h3'/%3E%3Cpath d='M10 12.4v2.6a3.5 3.5 0 0 0 7 0v-1.2'/%3E%3Ccircle cx='17.5' cy='11.75' r='2.25' fill='%2300AAA5' fill-opacity='0.15'/%3E%3C/g%3E%3C/svg%3E"); }
.jb-ico--job-palette{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none'%3E%3Cg stroke='%2300AAA5' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3.75a8.25 8.25 0 0 0 0 16.5c1.3 0 2-.8 2-1.75 0-1.35-1.25-1.65-1.25-2.8 0-.85.7-1.45 1.65-1.45h1.35a4.55 4.55 0 0 0 4.55-4.55c0-3.3-3.6-5.95-8.3-5.95z' fill='%2300AAA5' fill-opacity='0.15'/%3E%3Ccircle cx='8.1' cy='10.2' r='1'/%3E%3Ccircle cx='12' cy='7.9' r='1'/%3E%3Ccircle cx='15.9' cy='10.2' r='1'/%3E%3C/g%3E%3C/svg%3E"); }
.jb-ico--job-utensils{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none'%3E%3Cg stroke='%2300AAA5' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M7 3.25v8'/%3E%3Cpath d='M4.75 3.25v4a2.25 2.25 0 0 0 4.5 0v-4'/%3E%3Cpath d='M7 11.25v9.5'/%3E%3Cpath d='M17.25 3.25c-1.55 0-2.75 1.9-2.75 4.75s1.2 3.75 2.75 3.75z' fill='%2300AAA5' fill-opacity='0.15'/%3E%3Cpath d='M17.25 3.25v17.5'/%3E%3C/g%3E%3C/svg%3E"); }
.jb-ico--job-bed{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none'%3E%3Cg stroke='%2300AAA5' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 18.5V6.5'/%3E%3Crect x='3' y='11.5' width='18' height='7' rx='1.5' fill='%2300AAA5' fill-opacity='0.15'/%3E%3Cpath d='M21 11.5A2.5 2.5 0 0 0 18.5 9H9.5'/%3E%3Ccircle cx='6.5' cy='9' r='1.6'/%3E%3C/g%3E%3C/svg%3E"); }
.jb-ico--job-headset{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none'%3E%3Cg stroke='%2300AAA5' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4.75 14v-2a7.25 7.25 0 0 1 14.5 0v2'/%3E%3Crect x='2.75' y='13.25' width='3.5' height='5.75' rx='1.75' fill='%2300AAA5' fill-opacity='0.15'/%3E%3Crect x='17.75' y='13.25' width='3.5' height='5.75' rx='1.75' fill='%2300AAA5' fill-opacity='0.15'/%3E%3Cpath d='M19.25 19v.5a2.25 2.25 0 0 1-2.25 2.25H13.5'/%3E%3C/g%3E%3C/svg%3E"); }
.jb-ico--job-truck{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none'%3E%3Cg stroke='%2300AAA5' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='2.75' y='6.75' width='10.5' height='8.75' rx='1.5' fill='%2300AAA5' fill-opacity='0.15'/%3E%3Cpath d='M13.25 9.75h3.9l3.85 3.6v2.15h-7.75z'/%3E%3Ccircle cx='7.25' cy='17.75' r='1.9'/%3E%3Ccircle cx='17' cy='17.75' r='1.9'/%3E%3C/g%3E%3C/svg%3E"); }
.jb-ico--job-hardhat{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none'%3E%3Cg stroke='%2300AAA5' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 16.25a8 8 0 0 1 16 0z' fill='%2300AAA5' fill-opacity='0.15'/%3E%3Cpath d='M2.75 16.25h18.5'/%3E%3Cpath d='M9.75 8.9V6.25A1.5 1.5 0 0 1 11.25 4.75h1.5a1.5 1.5 0 0 1 1.5 1.5V8.9'/%3E%3C/g%3E%3C/svg%3E"); }
.jb-ico--job-shield{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none'%3E%3Cg stroke='%2300AAA5' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3.25 19 6.1v5.4c0 4.05-2.8 7.35-7 9.25-4.2-1.9-7-5.2-7-9.25V6.1z' fill='%2300AAA5' fill-opacity='0.15'/%3E%3Cpath d='m9.25 11.9 2.15 2.15L15.4 10'/%3E%3C/g%3E%3C/svg%3E"); }
.jb-ico--job-sprout{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none'%3E%3Cg stroke='%2300AAA5' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 21v-7.5'/%3E%3Cpath d='M12 13.5c0-3.9 2.6-6.5 6.5-6.5 0 3.9-2.6 6.5-6.5 6.5z' fill='%2300AAA5' fill-opacity='0.15'/%3E%3Cpath d='M12 13.5c0-3.9-2.6-6.5-6.5-6.5 0 3.9 2.6 6.5 6.5 6.5z' fill='%2300AAA5' fill-opacity='0.15'/%3E%3C/g%3E%3C/svg%3E"); }
/* ▼ 20-B 추가 2종 — CMMN_203 13종은 기존 12개 아이콘으로 모자란다(생산·제조 · 마케팅·광고) */
.jb-ico--job-gear{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none'%3E%3Cg stroke='%2300AAA5' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='7.25' fill='%2300AAA5' fill-opacity='0.15'/%3E%3Ccircle cx='12' cy='12' r='2.75'/%3E%3Cpath d='M12 2.75v2M12 19.25v2M21.25 12h-2M4.75 12h-2M18.54 5.46l-1.41 1.41M6.87 17.13l-1.41 1.41M18.54 18.54l-1.41-1.41M6.87 6.87 5.46 5.46'/%3E%3C/g%3E%3C/svg%3E"); }
.jb-ico--job-megaphone{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none'%3E%3Cg stroke='%2300AAA5' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4.75 9.25h3.1l8.4-4.2v13.9l-8.4-4.2h-3.1a1.5 1.5 0 0 1-1.5-1.5v-2.5a1.5 1.5 0 0 1 1.5-1.5z' fill='%2300AAA5' fill-opacity='0.15'/%3E%3Cpath d='M19.25 9.5a3.1 3.1 0 0 1 0 5'/%3E%3Cpath d='M7.85 14.75v2.75a1.6 1.6 0 0 0 3.15.4'/%3E%3C/g%3E%3C/svg%3E"); }

/* ══ [공통] ═══════════════════════════════════════════════════════════ */

/* ── Crumb (브레드크럼) ─────────────────────────────────────────────── */
.jb-crumb{ display:flex; align-items:center; flex-wrap:wrap; gap:var(--jb-sp-2);
  font-size:var(--jb-fs-sm); line-height:var(--jb-lh-tight); color:var(--jb-muted); }
.jb-crumb a{ color:inherit; text-decoration:none; }
.jb-crumb a:hover{ color:var(--jb-brand); text-decoration:underline; }
.jb-crumb__sep{ color:var(--jb-ctrl-muted); }
.jb-crumb__current{ color:var(--jb-ink); font-weight:var(--jb-fw-medium); }

/* ── Pagehead (서브 페이지 타이틀 띠) ───────────────────────────────── */
.jb-pagehead{ padding:var(--jb-sp-8) 0 var(--jb-sp-7); background:var(--jb-bg-section); text-align:center; }
.jb-pagehead__title{ margin:0; font-family:var(--jb-font-display); font-weight:var(--jb-fw-bold);
  font-size:var(--jb-fs-display); line-height:var(--jb-lh-tight); color:var(--jb-ink); }
.jb-pagehead__desc{ margin:var(--jb-sp-3) 0 0; font-size:var(--jb-fs-md);
  line-height:var(--jb-lh-tight); color:var(--jb-muted); }

/* ── Tabbar (링크형 · 마이페이지 콘텐츠 탭 · 서버가 활성 탭 렌더) ──── */
.jb-tabbar{ display:flex; align-items:center; gap:var(--jb-sp-6); flex-wrap:wrap;
  border-bottom:1px solid var(--jb-border); }
.jb-tabbar__item{ position:relative; display:inline-flex; align-items:center; gap:var(--jb-sp-2);
  height:52px; padding:0 2px; border:0; border-bottom:2px solid transparent; background:none;
  font-family:var(--jb-font-display); font-weight:var(--jb-fw-medium); font-size:var(--jb-fs-md);
  line-height:1; color:var(--jb-muted); text-decoration:none; cursor:pointer; white-space:nowrap;
  transition:color var(--jb-dur-fast) var(--jb-ease), border-color var(--jb-dur-fast) var(--jb-ease); }
.jb-tabbar__item:hover{ color:var(--jb-ink); }
/* aria-selected — 같은 화면 안에서 패널을 바꾸는 tablist 는 이 훅을 쓴다(화면 이동은 aria-current) */
.jb-tabbar__item[aria-current="page"], .jb-tabbar__item[aria-selected="true"], .jb-tabbar__item.is-active{
  color:var(--jb-brand); font-weight:var(--jb-fw-bold); border-bottom-color:var(--jb-brand); }
/* 🔴 2026-09-18 로컬 실측 — 탭이 `<a>` 일 때 «활성 탭 글자색만» 브랜드색이 되지 않았다(밑줄·굵기는 됐다).
   위 §「jb- 카드형 앵커의 글자색 상속 복원」의 `a.jb-tabbar__item:link{color:inherit}`(0,2,1) 이
   바로 위 활성 규칙(0,2,0)을 이긴다. 탭바는 «전부» `<a>` 다
   (inc_mypage_tabs.jsp · rcmnInfo 추천 탭 · jobSprtList · entSprtList · trgtHub).
   ★ 색을 새로 정하지 않는다 — 같은 값을 (0,3,1) 로 올려 원래 규격을 되돌릴 뿐이다. `!important` 는 쓰지 않는다. */
/* ▼ 2026-09-18 · 18 QA 결함(D107) — «비선택» 탭 글자색이 부모색(#4E4E4E)으로 나왔다.
   위 §「jb- 카드형 앵커의 글자색 상속 복원」의 `a.jb-tabbar__item:link{ color:inherit }`(0,2,1)가
   `.jb-tabbar__item` 기본색(0,1,0)을 덮었고, 활성색만 아래 (0,3,1) 로 되살려 둔 상태였다.
   같은 (0,2,1) 로 기본색을 되돌린다 — 활성 규칙(0,3,1)이 여전히 이긴다.
   ⚠️ <a> 탭바를 쓰는 화면이 함께 바뀐다 — 마이페이지 탭 16 · jobSprt/entSprt 목록 · trgtHub · 마이페이지 추천 탭. */
a.jb-tabbar__item:link, a.jb-tabbar__item:visited{ color:var(--jb-muted); }
a.jb-tabbar__item[aria-current="page"]:link, a.jb-tabbar__item[aria-current="page"]:visited,
a.jb-tabbar__item[aria-selected="true"]:link, a.jb-tabbar__item[aria-selected="true"]:visited,
a.jb-tabbar__item.is-active:link, a.jb-tabbar__item.is-active:visited{ color:var(--jb-brand); }
.jb-tabbar__count{ font-family:var(--jb-font-body); font-weight:var(--jb-fw-regular);
  font-size:var(--jb-fs-sm); color:var(--jb-muted); }

/* ── Modal ──────────────────────────────────────────────────────────── */
.jb-modal{ position:fixed; inset:0; z-index:1200; display:none;
  align-items:center; justify-content:center; padding:var(--jb-sp-5); }
.jb-modal.is-open{ display:flex; }
.jb-modal__backdrop{ position:absolute; inset:0; background:rgba(0,0,0,.5); border:0; padding:0; cursor:pointer; }
.jb-modal__box{ position:relative; width:100%; max-width:420px; padding:var(--jb-sp-7) var(--jb-sp-6) var(--jb-sp-6);
  border-radius:var(--jb-r-card); background:var(--jb-surface); text-align:center; }
.jb-modal__title{ margin:0; font-family:var(--jb-font-display); font-weight:var(--jb-fw-bold);
  font-size:var(--jb-fs-h4); line-height:var(--jb-lh-tight); color:var(--jb-ink); }
.jb-modal__desc{ margin:var(--jb-sp-3) 0 0; font-size:var(--jb-fs-base); line-height:1.55; color:var(--jb-muted); }
.jb-modal__actions{ display:flex; gap:var(--jb-sp-3); margin-top:var(--jb-sp-6); }
.jb-modal__close{ position:absolute; top:14px; right:14px; width:32px; height:32px; padding:8px;
  border:0; background:none; cursor:pointer;
  color:var(--jb-ink); }   /* 아이콘색 명시 (2026-09-18 D128 ④ · D127 ② 와 같은 결함) — 비워 두면 정본 브라우저 기본 검정 · dev 운영 button 갈색 */

/* ══ [목록] ═══════════════════════════════════════════════════════════ */

/* ── Jobcat (직무 대분류 아이콘 그리드 · 개편 신규) ─────────────────
   축 = CMMN_203 관심직종 대분류 13종(2026-09-14 확정). 확정본 퍼블의 NB1~12 는 운영 코드가 0건이다 */
/* 섹션 래퍼 — 공공채용 목록에서는 목록 바로 위의 독립 밴드다 */
.jb-jobcat{ margin:var(--jb-sp-7) 0; }
.jb-jobcat__head{ display:flex; align-items:baseline; justify-content:space-between;
  gap:var(--jb-sp-3); flex-wrap:wrap; }
.jb-jobcat__title{ margin:0; font-family:var(--jb-font-display); font-weight:var(--jb-fw-bold);
  font-size:var(--jb-fs-h3); line-height:var(--jb-lh-tight); color:var(--jb-ink); }
.jb-jobcat__desc{ margin:0; font-size:var(--jb-fs-sm); color:var(--jb-muted); }
.jb-jobcat__grid{ display:grid; grid-template-columns:repeat(6,minmax(0,1fr));
  gap:var(--jb-sp-3); margin:var(--jb-sp-5) 0 0; padding:0; list-style:none; }
/* 13종(CMMN_203) 축에서는 6열이면 마지막 줄에 1칸만 남는다. 7열이면 7+6 으로 빈칸이 1개다.
   ★ 반응형 재정의(1024↓ 4열 · 640↓ 3열)보다 **앞**에 둬야 한다 — 특성도가 같아 순서로 갈린다 */
.jb-jobcat__grid--cols-7{ grid-template-columns:repeat(7,minmax(0,1fr)); }
.jb-jobcat__item{ display:flex; flex-direction:column; align-items:center; justify-content:center; gap:var(--jb-sp-3);
  width:100%; min-height:110px; padding:var(--jb-sp-4) var(--jb-sp-3);
  border:1px solid var(--jb-border); border-radius:var(--jb-r-box); background:var(--jb-surface);
  font-family:var(--jb-font-body); color:var(--jb-body); text-align:center; word-break:keep-all; cursor:pointer;
  transition:border-color var(--jb-dur-fast) var(--jb-ease), background var(--jb-dur-fast) var(--jb-ease); }
.jb-jobcat__item:hover{ border-color:var(--jb-brand); background:var(--jb-brand-weak); }
.jb-jobcat__ico{ flex:none; width:32px; height:32px; color:var(--jb-brand); }
/* 선택 시에는 item 의 color(--jb-on-brand)를 상속해 흰 선 + 흰 15% 틴트가 된다 */
.jb-jobcat__item[aria-pressed="true"] .jb-jobcat__ico{ color:inherit; }
.jb-jobcat__name{ font-size:var(--jb-fs-sm); font-weight:var(--jb-fw-medium); line-height:1.35; }
.jb-jobcat__item[aria-pressed="true"]{ border-color:var(--jb-brand); background:var(--jb-brand); color:var(--jb-on-brand); }

/* ── Searchbar (상세검색 토글) + Searchbox (접이 패널) ─────────────── */
.jb-searchbar{ display:flex; justify-content:flex-end; gap:var(--jb-sp-2);   /* 버튼이 2개 이상일 때 붙지 않게(06 901~1260 실측) */
  margin-top:var(--jb-sp-5); }
/* 06 2차 #4-2(D106 · 2026-09-18) — 상세 검색 줄 «좌측 끝» 안내문. 정본 components.css:317~318 그대로.
   토글은 justify-content:flex-end 로 우측에 남고, 안내문이 margin-right:auto 로 좌측 끝을 가져간다. */
.jb-searchbar{ align-items:center; }
.jb-searchbar__note{ margin:0 auto 0 0; font-size:var(--jb-fs-sm); font-weight:var(--jb-fw-bold); color:var(--jb-ink); }
.jb-searchbar__toggle{ display:inline-flex; align-items:center; gap:var(--jb-sp-2);
  height:var(--jb-btn-h); padding:0 18px; border:1px solid var(--jb-border); border-radius:var(--jb-r-pill);
  background:var(--jb-surface); font-family:var(--jb-font-display); font-weight:var(--jb-fw-medium);
  font-size:var(--jb-fs-base); line-height:1; color:var(--jb-body); cursor:pointer; }
.jb-searchbar__toggle:hover{ border-color:var(--jb-brand); color:var(--jb-brand); }
.jb-searchbar__caret{ width:16px; height:16px; transition:transform var(--jb-dur-fast) var(--jb-ease); }
.jb-searchbar__toggle[aria-expanded="true"] .jb-searchbar__caret{ transform:rotate(180deg); }

.jb-searchbox{ margin-top:var(--jb-sp-4); padding:var(--jb-sp-6);
  border:1px solid var(--jb-border); border-radius:var(--jb-r-card); background:var(--jb-surface); }
.jb-searchbox__keyword{ display:flex; align-items:center; gap:var(--jb-sp-3);
  height:var(--jb-input-h-lg); padding:0 var(--jb-sp-4);
  border:1px solid var(--jb-border); border-radius:var(--jb-r-btn); background:var(--jb-surface); }
.jb-searchbox__keyword:focus-within{ border-color:var(--jb-brand); box-shadow:var(--jb-ring); }
.jb-searchbox__keyword input{ flex:1 1 auto; min-width:0; height:100%; border:0; outline:0; background:none;
  font-family:var(--jb-font-body); font-size:var(--jb-fs-base); color:var(--jb-ink); }
.jb-searchbox__keyword input::placeholder{ color:var(--jb-disabled); }
.jb-searchbox__ico{ flex:none; width:20px; height:20px; }
.jb-searchbox__sub{ display:flex; align-items:flex-start; gap:var(--jb-sp-4); margin-top:var(--jb-sp-5); }
.jb-searchbox__sub-label{ flex:none; padding-top:9px; font-family:var(--jb-font-display);
  font-weight:var(--jb-fw-semibold); font-size:var(--jb-fs-sm); color:var(--jb-ink); }
/* 라벨 «아래»로 칩 — 2열처럼 가로 폭이 좁을 때 칩 공간을 확보한다
   (06 기업채용 모집분야 중분류·소분류 · D106 · D111 · 2026-09-18). 정본 components.css 그대로. */
.jb-searchbox__sub--stack{ flex-direction:column; gap:var(--jb-sp-3); }
.jb-searchbox__sub--stack .jb-searchbox__sub-label{ padding-top:0; }
/* 🔴 2026-09-27 D281 — 내용이 «한 줄»인 행은 «가운데» 정렬한다(사용자 지적 — 「지원금 사업만 보기」가 위쪽에 붙어 있었다).
   `.jb-searchbox__sub` 는 `align-items:flex-start` 다 — 칩이 «여러 줄»로 접히는 행에서 라벨을 첫 줄에 맞추려는 것이고,
   라벨의 `padding-top:9px`(+ page-list.css 의 `--jb-sp-2`)도 그 보정이다. 체크박스 한 개뿐인 행에서는 둘 다 «어긋나 보인다».
   ➡️ 체크(`.jb-check`)를 가진 행만 골라 되돌린다. 정본 components.css:359 와 같은 값이다.
   ★ 라벨 규칙은 (0,3,0) 이라 `page-list.css` 의 `.jb-listfilter .jb-searchbox__sub-label`(0,2,0)을 이긴다.
   ⚠️ `:has()` 미지원 브라우저에서는 «종전 모양»(위쪽 정렬)으로 남는다 — 깨지지 않는다. */
.jb-searchbox__sub:has(.jb-check){ align-items:center; }
.jb-searchbox__sub:has(.jb-check) .jb-searchbox__sub-label{ padding-top:0; }
/* ▼ 2026-09-17 단위테스트 02-3 — 선택 조건은 검색 박스 안에서 「별도 섹션」으로 분리한다.
   회색 면(--jb-bg-section)으로 구분하고(종전 border-top 은 뺀다), 칩이 0건이면 이 줄 자체를 그리지 않는다.
   ⚠️ 칩 0건 처리는 «둘 다» 둔다 — 화면(JSP)은 [hidden] 토글이 정본 동작이고
      (base.css `.jb-root [class^="jb-"][hidden]{display:none!important}` 가 이 display:flex 를 이긴다),
      아래 :empty 는 JS 가 돌지 않아 토글이 안 걸린 경우의 대비다. */
.jb-searchbox__foot{ display:flex; align-items:center; justify-content:space-between; gap:var(--jb-sp-4);
  flex-wrap:wrap; margin-top:var(--jb-sp-5); padding:var(--jb-sp-4) var(--jb-sp-5);
  background:var(--jb-bg-section); border-radius:var(--jb-r-box); }
.jb-searchbox__foot:empty{ display:none; }
.jb-searchbox__applied{ display:flex; align-items:center; gap:var(--jb-sp-2); flex-wrap:wrap; flex:1 1 320px; }
.jb-searchbox__applied-label{ font-family:var(--jb-font-display); font-weight:var(--jb-fw-semibold);
  font-size:var(--jb-fs-sm); color:var(--jb-ink); }
.jb-searchbox__actions{ display:flex; align-items:center; gap:var(--jb-sp-3); }
/* D291 (2026-09-27) — 모바일 2건(사용자 지적).
   ㉠ 「선택한 조건으로 검색」 행이 «왼쪽»에 몰려 있었다 → 가운데로.
      실측(390) : 묶음 중심 167 vs 내용 영역 중심 195 — 28px 치우침.
   ㉡ 「상세 검색」 버튼 «안»에서 글자가 2줄로 쪼개졌다.
      실측(390 · 06 기업채용) : bar 358 − note 236 − gap 6 = 버튼 «116» · padding 36 → 내용폭 «80»
      → 왼쪽 문구(.jb-searchbar__note)를 «버튼 아래»로 내려 버튼에 한 줄을 통째로 준다(사용자 지시).
      ⚠️ 04 공공채용에는 note 가 «없어» 버튼이 146px 다 — 06 에서만 드러나던 문제다. */
@media (max-width:900px){
  /* 🔴 D291 보정(2026-09-28 · 개발 세션 발견) — center «만» 주면 가운데로 «안 간다».
     .jb-searchbox__foot 가 flex(space-between · wrap)라 .jb-searchbox__actions 가 «내용 폭(227px)»으로 줄어
     왼쪽에 붙어 있었다. 상자 안에서 center 를 줘도 움직일 여백이 없다(정본에서도 좌 20 / 우 77 그대로였다).
     ➡️ 상자를 한 줄 «통째로» 쓰게(flex:1 1 100%) 해야 center 가 먹는다 → 좌 49 / 우 49.
     ⚠️ 내가 09-27 에 «원인만 재고» 고친 뒤 «고친 결과를 재지 않았다» — 치우침 28px 를 적어 놓고 확인을 건너뛰었다. */
  .jb-searchbox__actions{ justify-content:center; flex:1 1 100%; }
  .jb-searchbar{ flex-wrap:wrap; }
  .jb-searchbar__toggle{ order:1; }
  .jb-searchbar__note{ order:2; width:100%; margin:var(--jb-sp-2) 0 0; }
}
.jb-iconbtn{ display:inline-flex; align-items:center; justify-content:center; flex:none;
  width:var(--jb-btn-h); height:var(--jb-btn-h); padding:10px;
  border:1px solid var(--jb-border); border-radius:var(--jb-r-pill); background:var(--jb-surface); cursor:pointer;
  color:var(--jb-ink); }   /* 아이콘색 명시 (2026-09-18 D127 ②) — 비워 두면 정본은 브라우저 기본 검정, dev 는 운영 button{color:#3e332e} 갈색 */
.jb-iconbtn:hover{ border-color:var(--jb-brand); }
/* 2026-09-17 단위테스트 04-3 : 바깥 원형 테두리가 없는 아이콘 버튼.
   좌측 상세 조건 패널의 «초기화»처럼 제목 줄에 얹는 보조 액션에 쓴다. */
.jb-iconbtn--plain{ border:0; background:none; width:auto; height:auto; padding:4px; border-radius:var(--jb-r-sm); }
.jb-iconbtn--plain:hover{ border:0; background:var(--jb-bg-subtle); }

/* ── Filter (좌측 상세 조건 패널) ───────────────────────────────────── */
.jb-filter{ padding:var(--jb-sp-5); border:1px solid var(--jb-border); border-radius:var(--jb-r-card);
  background:var(--jb-surface); }
/* 2026-09-17 단위테스트 04-3 : 제목 줄 오른쪽에 초기화 아이콘을 놓는다(하단 텍스트 버튼이 아니라). */
.jb-filter__title{ padding-bottom:var(--jb-sp-3); border-bottom:1px solid var(--jb-ink);
  font-family:var(--jb-font-display); font-weight:var(--jb-fw-bold); font-size:var(--jb-fs-base); color:var(--jb-ink);
  display:flex; align-items:center; justify-content:space-between; gap:var(--jb-sp-2); }
.jb-filter__group{ padding:var(--jb-sp-4) 0; border-bottom:1px solid var(--jb-border); }
.jb-filter__group:last-of-type{ border-bottom:0; }
.jb-filter__group-title{ display:flex; align-items:center; gap:var(--jb-sp-2); margin-bottom:var(--jb-sp-3);
  font-family:var(--jb-font-display); font-weight:var(--jb-fw-semibold); font-size:var(--jb-fs-sm); color:var(--jb-ink); }
.jb-filter__options{ display:flex; flex-direction:column; gap:var(--jb-sp-2); }
.jb-filter__options--2{ display:grid; grid-template-columns:1fr 1fr; gap:var(--jb-sp-2) var(--jb-sp-3); }
.jb-filter__more{ width:100%; margin-top:var(--jb-sp-3); padding:10px 0;
  border:1px dashed var(--jb-border); border-radius:var(--jb-r-btn); background:none;
  font-family:var(--jb-font-body); font-size:var(--jb-fs-sm); color:var(--jb-muted); cursor:pointer;  line-height:16px; /* line-height:normal 이면 Noto 웹폰트에서 42px 로 커진다(2026-09-18 dev 실측) — 36px 고정 */ }
.jb-filter__more:hover{ background:var(--jb-bg-subtle); }
.jb-filter__more[aria-expanded="true"]{ border-style:solid; color:var(--jb-ink); font-weight:var(--jb-fw-semibold); }
/* ▲ dev 전용 `.jb-filter__acts{flex · gap · margin-top}` 삭제(D130 4-0 · 정본에 없고 page-list 가 상쇄 중이었다) */
.jb-filter__acts .jb-btn{ flex:1; }

/* 선택된 조건 칩 줄 — 결과 목록 위. 칩 자체는 JS 가 운영 클래스로 만들므로 브릿지에서 꾸민다 */
.jb-selcond{ margin-bottom:var(--jb-sp-4); }
.jb-selcond__list{ display:flex; flex-wrap:wrap; gap:var(--jb-sp-2); }

/* ── Result head (건수 + 조건 요약) ─────────────────────────────────── */
.jb-resulthead{ display:flex; align-items:center; justify-content:space-between; gap:var(--jb-sp-4);
  flex-wrap:wrap; margin-bottom:var(--jb-sp-4); font-size:var(--jb-fs-base); color:var(--jb-muted); }
.jb-resulthead__count{ font-family:var(--jb-font-display); font-weight:var(--jb-fw-bold);
  font-size:var(--jb-fs-lg); color:var(--jb-brand); }
/* UI2026-IT2F ②(D327) — «조회 중» : 같은 자리 · 같은 글꼴의 muted 글자(06 결과 머리 · 정본 job-corp-list 주석) */
.jb-resulthead__count.is-busy{ color:var(--jb-muted); }
.jb-resulthead__cond{ font-size:var(--jb-fs-sm); }
/* 🔴 2026-09-27 D264 — 조건 요약을 제목 «안»으로 붙이고 콜론을 여기서 낸다(정본 components.css:404).
   마크업에 콜론을 두지 «않는» 이유 = 조건 요약 span 을 내지 않는 화면이 생기면 콜론만 덩그러니 남는다.
   ::before 면 span 이 없을 때 콜론도 같이 사라진다(`.jb-me__cond span::after` 와 같은 방식).
   ⚪ 04·06 은 조건이 없을 때 「전체」를 내므로(D126 ②) 지금은 span 이 «항상» 있다 — 「검색 결과 : 전체」가 된다. */
.jb-resulthead__cond::before{ content:" : "; }
/* UI2026-IT2 X2 — 요약이 비면 콜론도 내지 않는다(정본 components.css 와 같다 · span 안에 공백·줄바꿈을 넣지 말 것 — :empty 가 안 걸린다) */
.jb-resulthead__cond:empty::before{ content:none; }
/* D46 — 프리셋(회원 관심조건)이 걸렸을 때 결과 헤더에 한 번만 알리는 문구.
   카드마다 「일치」 배지를 달면 전건에 붙어 정보가 0 이 되므로 여기로 모았다. */
.jb-resulthead__match{ margin-left:var(--jb-sp-2); font-size:var(--jb-fs-sm); color:var(--jb-brand); }
.jb-resulthead__match strong{ font-weight:var(--jb-fw-bold); }

/* ── Sort tabs (신규 NEW / 인기 HOT / 마감임박 · 운영 fn_SearchType) ── */
.jb-sorttabs{ display:flex; align-items:center; gap:var(--jb-sp-6); margin-bottom:var(--jb-sp-4);
  border-bottom:1px solid var(--jb-border); }
.jb-sorttabs__item{ display:inline-flex; align-items:center; gap:var(--jb-sp-2);
  height:44px; padding:0 2px; border:0; border-bottom:2px solid transparent; background:none;
  font-family:var(--jb-font-display); font-weight:var(--jb-fw-medium); font-size:var(--jb-fs-base);
  line-height:1; color:var(--jb-muted); cursor:pointer; }
.jb-sorttabs__item:hover{ color:var(--jb-ink); }
.jb-sorttabs__ico{ width:16px; height:16px; }
.jb-sorttabs__mark{ font-family:var(--jb-font-display); font-weight:var(--jb-fw-bold);
  font-size:var(--jb-fs-2xs); letter-spacing:.5px; }
/* 2026-09-17 단위테스트 04-10·11 : 탭 라벨은 «항상 같은 크기»다.
   안쪽 요소가 제 크기를 가지면 탭마다 글자 크기가 달라 보인다 → 강제로 상속시킨다. */
.jb-sorttabs__item > *:not(.jb-sorttabs__mark):not(.jb-sorttabs__ico){ font-size:inherit; font-weight:inherit; }
/* 선택 상태 훅을 «둘 다» 받는다 — 칩과 같은 규칙(aria-selected 또는 .is-active) */
.jb-sorttabs__item[aria-selected="true"], .jb-sorttabs__item[aria-pressed="true"], .jb-sorttabs__item.is-active{
  color:var(--jb-brand); font-weight:var(--jb-fw-bold); border-bottom-color:var(--jb-brand); }
.jb-sorttabs__item[aria-selected="true"] *, .jb-sorttabs__item[aria-pressed="true"] *, .jb-sorttabs__item.is-active *{ color:inherit; }

/* ── Job card (채용 공고 카드) ──────────────────────────────────────── */
.jb-jobcard{ position:relative;   /* D58 — stretched link 기준면 */
  display:flex; flex-direction:column; padding:var(--jb-sp-5);
  border:1px solid var(--jb-border); border-radius:var(--jb-r-card); background:var(--jb-surface);
  text-decoration:none; color:inherit;
  transition:border-color var(--jb-dur-fast) var(--jb-ease), box-shadow var(--jb-dur-base) var(--jb-ease); }
.jb-jobcard:hover{ border-color:var(--jb-brand); box-shadow:var(--jb-shadow-hover); }
.jb-jobcard__head{ display:flex; align-items:center; justify-content:space-between; gap:var(--jb-sp-2); min-height:28px; }
.jb-jobcard__flag{ display:inline-flex; align-items:center; height:22px; padding:0 var(--jb-sp-3);
  border:1px solid var(--jb-border); border-radius:var(--jb-r-pill);
  font-family:var(--jb-font-display); font-weight:var(--jb-fw-bold); font-size:var(--jb-fs-2xs); line-height:1;
  color:var(--jb-muted); }
.jb-jobcard__flag--new{ border-color:var(--jb-brand); color:var(--jb-brand); }
.jb-jobcard__flag--hot{ border-color:var(--jb-warning); color:var(--jb-warning-ink); }
.jb-jobcard__flag--end{ border-color:var(--jb-danger); color:var(--jb-danger); }
.jb-jobcard__org{ margin-top:var(--jb-sp-3); font-size:var(--jb-fs-sm); font-weight:var(--jb-fw-medium); color:var(--jb-muted); }
.jb-jobcard__title{ display:block; margin-top:var(--jb-sp-2);
  font-family:var(--jb-font-display); font-weight:var(--jb-fw-semibold); font-size:var(--jb-fs-lg);
  line-height:1.45; color:var(--jb-ink); }
/* ▼ 2026-09-18 · D119 3차 대조 — 제목 링크(stretched link)가 운영 갈색(#3E332E)으로 나왔다(04 · 06 공통 · 로컬 실측).
   import.css `a:link, a:visited{ color:#3e332e }`(0,1,1)가 `.jb-jobcard__title`(0,1,0)을 이긴다. 위 「앵커 글자색 상속 복원」 목록은
   `inherit` 로 되돌리는데 제목은 «자기 색(--jb-ink)»을 가진 요소라 같은 값을 가상클래스로 올린다(정본은 hover 색 없음). */
a.jb-jobcard__title:link, a.jb-jobcard__title:visited, a.jb-jobcard__title:hover, a.jb-jobcard__title:active{ color:var(--jb-ink); }
.jb-jobcard__meta{ display:flex; align-items:center; flex-wrap:wrap;   /* D58 — 하트·벨과 세로 중앙 */
  gap:var(--jb-sp-2); margin-top:var(--jb-sp-3); }
.jb-jobcard__foot{ display:flex; align-items:center; gap:var(--jb-sp-3); flex-wrap:wrap;
  margin-top:var(--jb-sp-4); padding-top:var(--jb-sp-3); border-top:1px solid var(--jb-border-weak);
  font-size:var(--jb-fs-sm); color:var(--jb-muted); }
.jb-jobcard__dday{ font-family:var(--jb-font-display); font-weight:var(--jb-fw-bold); color:var(--jb-danger); }
.jb-jobcard__dday--always{ color:var(--jb-brand); }
.jb-jobcard__field{ margin-left:auto; }

/* ══ 2026-09-17 단위테스트 04-13 — 카드 안 «관심·알림» 배치 (R47 · D58) ══════════
   정본 = design/css/components.css (2026-09-17 CHANGELOG 「카드 안 관심·알림 배치」)
   요건 = 하트·벨을 «칩 줄(__meta) 오른쪽 끝»에 둔다.
   문제 = 종전에는 카드 전체가 <a> 여서 버튼을 안에 못 넣었고, 그래서 바깥에 래퍼(li)를 한 겹 더 두었다.
          그 래퍼가 브릿지 규칙에 걸려 «테두리가 두 겹»이 됐다(04-1).
   해법 = «stretched link» — 카드는 <div>, 제목만 <a> 로 두고 그 ::after 가 카드 전체를 덮는다.
          링크는 카드 하나에 하나(접근성 유지)이고, 버튼은 그 위로 올려 클릭된다. 래퍼가 필요 없다. */
a.jb-jobcard__title::after{ content:""; position:absolute; inset:0; z-index:0; }
/* 밑줄 없음 (2026-09-18 D126 ④ · QA 06 2부 #14) — 지정이 없어 정본이 브라우저 기본 밑줄로 렌더됐다. 카드 전체가 링크(D58)라 제목은 «제목»처럼 보여야 한다(D121 ④ 색 규칙과 같은 취지) · 호버에만 밑줄 */
a.jb-jobcard__title{ text-decoration:none; }
a.jb-jobcard__title:hover{ text-decoration:underline; }
/* 태그는 한 줄 · 넘치면 자른다 (2026-09-18 D126 ⑤ · QA 06 2부 #6) — 워크넷 고용형태 원문(「기간의 정함이 없는 근로계약/ 파견근로 비희망/…」)이 26px pill 안에서 2줄로 넘쳤다. 원문 정규화는 개발 몫이고 이 규칙은 최후 방어다 */
.jb-tag{ max-width:100%; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }

/* 관심·알림 버튼 묶음 — 칩 줄 오른쪽 끝 · 링크 위 */
.jb-cardacts{ position:relative; z-index:1; margin-left:auto; display:inline-flex; align-items:center; gap:var(--jb-sp-2); }
/* D65(2026-09-17) — 정본 규격으로 통일. 카드 안에서 브랜드 **채움**은 강조가 과해
   버튼이 정보보다 튄다 → 32px · pill · 선택 시 **연한 브랜드 면**.
   ★ 상태 훅을 `.on` → **`aria-pressed`** 로 통일한다. 마크업이 이미 둘을 함께 붙이고 있어
     JSP 수정 없이 훅만 바꿔도 동작한다(`.on` 도 당분간 함께 받아 과도기를 덮는다). */
.jb-actbtn{ display:inline-flex; align-items:center; justify-content:center; flex:none;
  width:32px; height:32px; padding:0;
  border:1px solid var(--jb-border); border-radius:var(--jb-r-pill); background:var(--jb-surface);
  color:var(--jb-muted); cursor:pointer;
  transition:color var(--jb-dur-fast) var(--jb-ease), border-color var(--jb-dur-fast) var(--jb-ease),
             background var(--jb-dur-fast) var(--jb-ease); }
.jb-actbtn .jb-ico{ width:17px; height:17px; }
.jb-actbtn:hover{ border-color:var(--jb-brand); color:var(--jb-brand); }
/* 91-B — `jb-actbtn` 은 자기 색(`--jb-muted`)이 있다. 상속 복원이 아니라 그 색을 (0,2,1) 로 올린다 */
a.jb-actbtn:link, a.jb-actbtn:visited{ color:var(--jb-muted); }
a.jb-actbtn:hover, a.jb-actbtn:active{ color:var(--jb-brand); }
a.jb-actbtn[aria-pressed="true"]:link, a.jb-actbtn[aria-pressed="true"]:visited,
a.jb-actbtn.on:link, a.jb-actbtn.on:visited{ color:var(--jb-brand); }
.jb-actbtn[aria-pressed="true"], .jb-actbtn.on{
  border-color:var(--jb-brand); background:var(--jb-brand-weak); color:var(--jb-brand); }
.jb-actbtn[aria-pressed="true"] *, .jb-actbtn.on *{ color:inherit; }
/* 🔴 2026-09-27 D275 — «CTA 형» 관심 버튼(.jb-btn)도 선택 상태를 보여준다(정본 components.css:486).
   사용자 지적 : 상세 하단 「관심채용」을 눌러도 «모양이 안 변한다».
   원인 = 규격이 `.jb-actbtn`(원형 하트)에만 있었다. CTA 는 `.jb-btn jb-btn--secondary jb-btn--rect` 라 걸리지 않았다.
          JS 는 멀쩡했다 — fn_SyncActbtn 이 aria-pressed 를 «제대로» 갱신하고 있었다(CSS 만 없었다).
   ★ 선택됨 = «채운 하트 + 연한 브랜드 면». 「사선 하트」는 쓰지 않는다 —
     사선은 관례상 «해제·차단»을 뜻해 «등록됨»과 반대로 읽힌다.
   ★ 실측 — 저장소에서 `.jb-btn` + `aria-pressed` 는 «jobEntDtl.jsp:595 한 곳»뿐이다(전수 grep).
     그래서 이 규칙이 다른 버튼을 건드릴 여지가 없다.
   ★ 하트 채움은 `[aria-pressed="true"]` 로 걸어 «공통»이 된다 — 정책 3종 · 대외활동 상세의 `#btn_Like`
     와 목록 카드 하트가 모두 aria-pressed 를 갖고 JS 로 갱신한다(실측).
     ⚠️ 공공채용 «상세»에는 하트가 «없다» — D14 로 의도적으로 뺐다(관심은 목록 카드·마이페이지에서).
   ⚠️ `.jb-actbtn.on` 도 함께 적는다 — dev 는 `on` 과 aria-pressed 를 둘 다 쓰고(위 규칙도 그렇다)
      혹시 한쪽만 붙는 순간이 있어도 하트가 «면 색과 어긋나지» 않게 한다. */
.jb-btn[aria-pressed="true"]{ border-color:var(--jb-brand); background:var(--jb-brand-weak); color:var(--jb-brand); }
.jb-btn[aria-pressed="true"] .jb-ico--heart,
.jb-actbtn[aria-pressed="true"] .jb-ico--heart,
.jb-actbtn.on .jb-ico--heart{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='currentColor'%3E%3Cpath d='M12 20.35 4.92 13.4a4.6 4.6 0 0 1 6.5-6.5l.58.58.58-.58a4.6 4.6 0 0 1 6.5 6.5z'/%3E%3C/svg%3E"); }
/* 상세 공고명 우측 액션 — 제목과 한 줄. 제목이 길어도 버튼이 눌리지 않게 flex:none */
.jb-dtlhead{ display:flex; align-items:flex-start; justify-content:space-between; gap:var(--jb-sp-4); }
.jb-dtlhead__acts{ flex:none; }

/* ── Job list + More ────────────────────────────────────────────────── */
/* D62(2026-09-17) — 결과 목록은 **2열**이다.
   확정 디자인 `.jb-joblist` 에 열 정의가 없어 1열로 렌더된 것이고 **프로토타입은 2열**이다.
   화면설계 세션이 「04 지시서 #9(1열)는 무효」로 정정했다. 06 기업채용도 같은 컴포넌트라 함께 2열이 된다. */
.jb-joblist{ display:grid; grid-template-columns:repeat(2, minmax(0,1fr));
  gap:var(--jb-sp-3); transition:opacity var(--jb-dur-fast) var(--jb-ease); }
@media (max-width:900px){ .jb-joblist{ grid-template-columns:minmax(0,1fr); } }	/* D119 3차 — 1fr 은 카드의 최소 내용 폭(줄바꿈 없는 라벨)에 밀려 화면 밖으로 나갔다 */
.jb-joblist.is-refreshing{ opacity:.35; }

/* D63(2026-09-17) — 「곧! 마감되는 잡아바 추천공고」.
   설계 어디에도 없는 개발 신설 영역이지만 **사용자가 유지로 판정**했다(요건은 기능정의 세션이 FR 로 신설).
   회색 배경을 걷고 상단 라인 + 앞 콘텐츠와 여백으로 구분한다. */
.jb-reco-strip{ margin-top:var(--jb-sp-8); padding-top:var(--jb-sp-7);
  background:none; border-top:1px solid var(--jb-border); }
.jb-reco-strip__head{ display:flex; align-items:center; justify-content:space-between;
  gap:var(--jb-sp-4); margin-bottom:var(--jb-sp-5); }
.jb-reco-strip__title{ margin:0; font-family:var(--jb-font-display); font-weight:var(--jb-fw-bold);
  font-size:var(--jb-fs-h3); line-height:var(--jb-lh-tight); color:var(--jb-ink); }
@media (max-width:900px){
  .jb-reco-strip{ margin-top:var(--jb-sp-6); padding-top:var(--jb-sp-5); }
}
/* ── 가로로 넘기는 카드 줄 (2026-09-18 · D98 정정판 — D63 띠에 «넘기기»를 더한다) ──
   정본 = design/css/components.css:1293~1311 (값·이름 그대로)
   ⚠️ 규격을 새로 만들지 않는다 — 처음에 `.jb-cardslider`(회색 전폭 면)를 따로 만들었다가(4463c059e)
      D63(회색 면 금지 · 상단 구분선) 과 충돌해 걷어냈다.
   ★ 슬라이더 라이브러리를 쓰지 않는다(scroll-snap). JS = /resource/new_2026/js/card-slider.js
   ★ 스크롤바는 숨기되 «스크롤 자체»는 살린다 — overflow:hidden 이면 터치 사용자가 못 넘긴다. */
.jb-reco-strip__title{ display:flex; align-items:center; gap:var(--jb-sp-3); }
.jb-reco-strip__title .jb-ico{ flex:none; width:22px; height:22px; color:var(--jb-danger); }
.jb-reco-strip__nav{ display:flex; gap:var(--jb-sp-2); flex:none; }
.jb-reco-strip__nav .jb-iconbtn[disabled]{ opacity:.35; cursor:default; }
.jb-reco-strip__nav .jb-iconbtn[disabled]:hover{ border-color:var(--jb-border); }
.jb-reco-strip__track{ display:flex; gap:var(--jb-sp-5); margin:0; padding:0; list-style:none;
  overflow-x:auto; scroll-snap-type:x mandatory; scroll-behavior:smooth; scrollbar-width:none; }
.jb-reco-strip__track::-webkit-scrollbar{ display:none; }
/* li 는 «폭·스냅»만 맡는다 — 테두리를 주지 않는다(D58 · D99 ② 이중 테두리 방지) */
.jb-reco-strip__track > li{ display:flex; flex:0 0 300px; scroll-snap-align:start; }
.jb-reco-strip__track > li > .jb-jobcard{ flex:1 1 auto; }
/* 🔴 2026-09-30 D337 관련 · 2차 자체 테스트 IT-JOBP-G02 · IT-JOBC-G01 ④ — 띠 안 카드 모양이 제목 길이마다 달랐다(정본 결함 · R75).
   원인 = 제목 줄 수 제한이 없고 하단 줄(__foot)이 «내용 바로 아래»에 붙어, 1줄 제목 카드와 3줄 제목 카드의 D-day 줄 높이가 어긋났다.
   ① 제목은 2줄까지 · 넘치면 말줄임(D222 · D263 선례) · 1줄이어도 2줄 자리를 잡는다 ② 하단 줄은 카드 바닥에 붙인다.
   ★ 띠 안에서만 — 목록 카드 그리드는 행 단위로 높이가 맞으므로 건드리지 않는다.
   ★ overflow:hidden 은 제목 링크의 ::after(카드 전체 덮개 · D58)를 자르지 않는다 — ::after 의 기준은 .jb-jobcard(position:relative)다. */
.jb-reco-strip .jb-jobcard__title{ display:-webkit-box; -webkit-box-orient:vertical; -webkit-line-clamp:2; line-clamp:2; overflow:hidden;
  min-height:2.9em; }                                /* 2줄 × line-height 1.45 */
.jb-reco-strip .jb-jobcard__foot{ margin-top:auto; flex-wrap:nowrap; }   /* 한 줄 고정 — 분야 이름이 길면 줄이 꺾여 D-day 위치가 카드마다 달라졌다(정본 실측 203 · 236px) */
.jb-reco-strip .jb-jobcard__field{ min-width:0; overflow:hidden; white-space:nowrap; text-overflow:ellipsis; }
.jb-reco-strip .jb-jobcard__foot > :not(.jb-jobcard__field){ flex:none; white-space:nowrap; }   /* D-day · 마감일은 줄이지 않는다 — 줄이는 것은 분야 이름뿐 */
.jb-reco-strip .jb-jobcard__meta{ margin-bottom:var(--jb-sp-4); }   /* 하단 줄을 바닥에 붙여도 메타 줄과 간격이 줄지 않게 */
@media (max-width:768px){
  .jb-polcard__info dd{ white-space:normal; }   /* D258 — page-list.css 에서 옮겨 왔다 */
  .jb-reco-strip__track > li{ flex-basis:82%; }   /* 다음 카드가 살짝 보이게 — 넘길 수 있다는 신호 */
  .jb-reco-strip__nav{ display:none; }            /* 좁은 화면은 손으로 넘긴다 */
}
.jb-more{ display:flex; align-items:center; justify-content:center; gap:var(--jb-sp-2);
  min-width:260px; margin:var(--jb-sp-6) auto 0; padding:0 24px; height:var(--jb-btn-h-rect);
  border:1px solid var(--jb-border); border-radius:var(--jb-r-btn); background:var(--jb-surface);
  font-family:var(--jb-font-display); font-weight:var(--jb-fw-medium); font-size:var(--jb-fs-base);
  line-height:1; color:var(--jb-muted); cursor:pointer; }
.jb-more:hover{ border-color:var(--jb-brand); color:var(--jb-brand); background:var(--jb-brand-weak); }
.jb-more strong{ color:var(--jb-ink); }
.jb-more[disabled]{ cursor:default; opacity:.6; pointer-events:none; }

/* ── Empty state ────────────────────────────────────────────────────── */
.jb-empty{ display:flex; flex-direction:column; align-items:center; justify-content:center; gap:var(--jb-sp-4);
  min-height:220px; padding:var(--jb-sp-7) var(--jb-sp-5);
  border:1px solid var(--jb-border); border-radius:var(--jb-r-card); background:var(--jb-surface); text-align:center; }
.jb-empty__ico{ width:48px; height:48px; opacity:.35; }
.jb-empty__text{ margin:0; font-size:var(--jb-fs-base); color:var(--jb-muted); }

/* ── Pagination (번호형) ────────────────────────────────────────────── */
.jb-pagination{ display:flex; align-items:center; justify-content:center; flex-wrap:wrap; gap:var(--jb-sp-1);
  margin-top:var(--jb-sp-6); }
.jb-pagination__item{ display:inline-flex; align-items:center; justify-content:center;
  min-width:38px; height:38px; padding:0 var(--jb-sp-2); border:1px solid transparent; border-radius:var(--jb-r-btn);
  background:none; font-family:var(--jb-font-body); font-size:var(--jb-fs-sm); line-height:1;
  color:var(--jb-body); text-decoration:none; cursor:pointer; }
.jb-pagination__item:hover{ background:var(--jb-bg-subtle); }
.jb-pagination__item[aria-current="page"]{ background:var(--jb-brand); border-color:var(--jb-brand);
  color:var(--jb-on-brand); font-weight:var(--jb-fw-bold); }
.jb-pagination__item[aria-disabled="true"]{ color:var(--jb-disabled); pointer-events:none; }   /* <a> 에는 disabled 가 없다 — 첫 · 끝 쪽 ‹ › (D130 4-0) */
.jb-pagination__ico{ width:16px; height:16px; }

/* ══ [상세] ═══════════════════════════════════════════════════════════ */

/* ── Detail head (기관 · 분야 · 공고명) ─────────────────────────────── */
.jb-detailhead{ padding:var(--jb-sp-6); border-bottom:1px solid var(--jb-border); }
.jb-detailhead__meta{ display:flex; align-items:center; gap:var(--jb-sp-3); flex-wrap:wrap; margin:0;
  font-size:var(--jb-fs-sm); color:var(--jb-muted); }
.jb-detailhead__inst{ font-weight:var(--jb-fw-semibold); color:var(--jb-body); }
.jb-detailhead__div{ width:1px; height:12px; background:var(--jb-border); }
.jb-detailhead__title{ margin:var(--jb-sp-3) 0 0; font-family:var(--jb-font-display);
  font-weight:var(--jb-fw-bold); font-size:var(--jb-fs-h2); line-height:1.35; color:var(--jb-ink); }

/* ── Prose (관리자 에디터 본문 래퍼 · rcrutCntnt 를 그대로 받는다) ──
   운영 원천에 섹션 분리 컬럼이 없어 본문은 HTML 한 덩어리로 출력된다.
   에디터가 만드는 기본 태그만 최소 정규화하고 인라인 스타일은 건드리지 않는다. */
.jb-prose{ padding:var(--jb-sp-6); font-family:var(--jb-font-body); font-size:var(--jb-fs-base);
  line-height:var(--jb-lh-base); color:var(--jb-body); word-break:break-word; }
.jb-prose img{ max-width:100%; height:auto; }
.jb-prose table{ width:100%; border-collapse:collapse; margin:var(--jb-sp-4) 0; }
.jb-prose th, .jb-prose td{ padding:10px 12px; border:1px solid var(--jb-border); font-size:var(--jb-fs-sm); }
.jb-prose th{ background:var(--jb-th-bg); font-weight:var(--jb-fw-semibold); color:var(--jb-ink); }
.jb-prose h1, .jb-prose h2, .jb-prose h3, .jb-prose h4{ margin:var(--jb-sp-6) 0 var(--jb-sp-3);
  font-family:var(--jb-font-display); font-weight:var(--jb-fw-bold); color:var(--jb-ink); }
/* 크기를 명시한다 (2026-09-18 QA A3) — 비워 두면 운영 import.css `h1~h6{font-size:12px}` 가 이겨 소제목이 12px 이 됐다.
   값은 정본이 브라우저 기본으로 렌더하던 크기에 가까운 토큰(h4 16 · h2 24 은 동일) */
.jb-prose h1{ font-size:var(--jb-fs-h2); }
.jb-prose h2{ font-size:var(--jb-fs-h3); }
.jb-prose h3{ font-size:var(--jb-fs-md); }
.jb-prose h4{ font-size:var(--jb-fs-base); }
.jb-prose p{ margin:0 0 var(--jb-sp-3); }
.jb-prose ul, .jb-prose ol{ margin:0 0 var(--jb-sp-3); padding-left:20px; }
.jb-prose a{ color:var(--jb-brand); text-decoration:underline; }
.jb-prose__scroll{ overflow-x:auto; }

/* ── Side box (진행 상태 + CTA) ─────────────────────────────────────── */
.jb-sidebox{ padding:var(--jb-sp-5); border:1px solid var(--jb-border); border-radius:var(--jb-r-card);
  background:var(--jb-surface); }

/* 표준 연결영역 4종 래퍼(stdLinks.jsp)
   1단계 배포본에는 규칙이 없어 사이드박스 4개가 맞붙어 보더가 겹쳐 보였다(2026-09-14 실측).
   기본은 1열 + 간격. 우측 스티키 열(340px)에서의 모양은 그대로고 간격만 생긴다. */
/* 위 여백 — 상세 우측 스티키 박스 안에서 접수요약(.sminfo) 바로 뒤에 붙어 딱 붙어 보였다(단위테스트01 · 요약 하단 = 첫 카드 상단 957px).
   gap 은 카드 사이 간격만 준다. 레이아웃 속성이라 !important 를 쓰지 않는다 — 운영 리셋 div{margin-top:0}(0,0,1)은 클래스로 이긴다. */
.jb-stdlinks{ display:grid; gap:var(--jb-sp-4); align-items:start; margin-top:var(--jb-sp-4); }

/* 우측 열이 아직 없는 상세 화면에서 본문 폭(1260px)에 가로로 놓을 때 쓴다.
   해당 화면에 우측 스티키가 생기면 래퍼를 걷고 include 를 그 안으로 옮긴다. */
.jb-stdlinks-row .jb-stdlinks{ grid-template-columns:repeat(auto-fit, minmax(260px, 1fr)); }
.jb-sidestate{ display:flex; align-items:center; justify-content:space-between; gap:var(--jb-sp-3);
  margin-bottom:var(--jb-sp-4); font-size:var(--jb-fs-sm); color:var(--jb-muted); }
.jb-sidestate__val{ display:inline-flex; align-items:center; gap:var(--jb-sp-2); }
.jb-sidestate__dday{ font-family:var(--jb-font-display); font-weight:var(--jb-fw-bold);
  font-size:var(--jb-fs-lg); color:var(--jb-danger); }
/* 마감일이 없는 표기(「미정」 · 「상시」 · 「모집완료시」) — 브랜드색 (2026-09-22 · 13 C2 · D142 ⑤)
   기본값은 --jb-danger 라 「상시」가 「D-1」과 같은 빨강으로 보였다. 급하지 않은 상태에 위험색을 쓰지 않는다.
   ⚠️ 목록의 `.jb-badge--always`(배지)와 «같은 의미 · 같은 색 · 다른 컴포넌트»다 —
      상세 진행상태는 <b class="jb-sidestate__dday">(display 글꼴 · --jb-fs-lg · bold)라 배지 기본값(h20 · --jb-fs-2xs)이 얹히면 모양이 깨진다. */
.jb-sidestate__dday--always{ color:var(--jb-brand); }

/* ── Side summary (dl 요약) ─────────────────────────────────────────── */
.jb-sidesum{ margin:0; }
.jb-sidesum__row{ padding:0 0 var(--jb-sp-4); }
.jb-sidesum__row:last-child{ padding-bottom:0; }
.jb-sidesum dt{ margin-bottom:var(--jb-sp-2); font-size:var(--jb-fs-sm); color:var(--jb-muted); }
.jb-sidesum dd{ margin:0; font-size:var(--jb-fs-base); font-weight:var(--jb-fw-medium); color:var(--jb-ink); }
.jb-sidesum dd ul{ display:flex; flex-wrap:wrap; gap:var(--jb-sp-2); margin:0; padding:0; list-style:none; }

/* ── Attach (첨부 목록) ─────────────────────────────────────────────── */
.jb-attach{ padding:var(--jb-sp-5); border:1px solid var(--jb-border); border-radius:var(--jb-r-box);
  background:var(--jb-surface); }
.jb-attach__title{ margin:0 0 var(--jb-sp-3); font-family:var(--jb-font-display);
  font-weight:var(--jb-fw-semibold); font-size:var(--jb-fs-base); color:var(--jb-ink); }
.jb-attach__list{ display:flex; flex-direction:column; gap:var(--jb-sp-2); margin:0; padding:0; list-style:none; }
.jb-attach__link{ display:inline-flex; align-items:center; gap:var(--jb-sp-2);
  font-size:var(--jb-fs-sm); color:var(--jb-body); text-decoration:none; }
.jb-attach__link:hover{ color:var(--jb-brand); text-decoration:underline; }
/* 91-B — 운영 `a:link`(0,1,1) 가 위 (0,1,0) 선언을 이겨 첨부 링크가 푸터 갈색으로 렌더됐다.
   같은 깊이(0,2,1)로 올린다. 아이콘은 `currentColor` 라 함께 따라온다. */
a.jb-attach__link:link, a.jb-attach__link:visited{ color:var(--jb-body); }
a.jb-attach__link:hover, a.jb-attach__link:active{ color:var(--jb-brand); }
.jb-attach__ico{ flex:none; width:16px; height:16px; }

/* ── Disclaimer (재단 면책 안내 · 운영 전문 유지) ───────────────────── */
.jb-disclaimer{ padding:var(--jb-sp-5); border:1px solid var(--jb-border); border-radius:var(--jb-r-box);
  background:var(--jb-bg-subtle); font-size:var(--jb-fs-2xs); line-height:1.7; color:var(--jb-muted); }
.jb-disclaimer p{ margin:0; }
.jb-disclaimer p + p{ margin-top:var(--jb-sp-3); }

/* ══ [폼] ═════════════════════════════════════════════════════════════ */

/* ── Fieldset (폼 섹션 · 기본정보 / 구직상태 / 관심정보) ────────────── */
.jb-fieldset{ margin:0; padding:0; border:0; min-width:0; }
.jb-fieldset + .jb-fieldset{ margin-top:var(--jb-sp-7); padding-top:var(--jb-sp-7); border-top:1px solid var(--jb-border); }
/* legend 는 기본적으로 fieldset 의 border-top 위에 얹혀 구분선을 관통한다.
   float:left + width:100% 로 일반 블록처럼 흐르게 하고, 다음 형제에서 clear 한다. */
.jb-fieldset__legend{ display:block; float:left; width:100%; padding:0 0 var(--jb-sp-5);
  font-family:var(--jb-font-display); font-weight:var(--jb-fw-bold); font-size:var(--jb-fs-lg);
  line-height:var(--jb-lh-tight); color:var(--jb-ink); }
.jb-fieldset__legend + *{ clear:both; }

/* ── Form row (라벨 + 본체 + 도움말/에러) ───────────────────────────── */
.jb-form{ display:flex; flex-direction:column; gap:var(--jb-sp-5); }
.jb-form__row{ display:grid; grid-template-columns:140px minmax(0,1fr); gap:var(--jb-sp-4); align-items:start; }
.jb-form__label{ padding-top:13px; font-family:var(--jb-font-display); font-weight:var(--jb-fw-medium);
  font-size:var(--jb-fs-base); line-height:var(--jb-lh-tight); color:var(--jb-ink); }
.jb-form__req{ margin-left:2px; color:var(--jb-danger); }
.jb-form__body{ min-width:0; display:flex; flex-direction:column; gap:var(--jb-sp-3); }

/* ── 세로형 폼 (2026-09-18 · D90) — 라벨이 «위», 본문이 «아래» ──────────────
   가로형(140px 라벨 + 본문)은 값이 짧은 정보 확인 화면에 맞다. 선택지가 길거나
   칩·라디오가 여러 줄로 흐르는 «설정 폼»은 좌측 라벨 폭이 본문을 좁혀 줄바꿈이 늘어난다.
   ★ 항목 사이에 구분선을 둔다 — 세로로 이어지면 어디까지가 한 항목인지 흐려진다. */
.jb-form--stack .jb-form__row{ display:block; padding:var(--jb-sp-5) 0; border-bottom:1px solid var(--jb-border-soft); }
/* 첫 항목은 위 안내·제목과 «한 덩어리»가 아니므로 띄운다 (2026-09-18 사용자 확정 40px).
   ★ 바로 앞이 안내 박스면 그쪽 margin-bottom 을 걷는다 — 두 여백이 더해져 54px 이 된다.
     여백은 «한 쪽만» 갖게 해야 값이 예측된다. */
.jb-form--stack .jb-form__row:first-child{ padding-top:var(--jb-sp-7); }
.jb-notice:has(+ .jb-form--stack){ margin-bottom:0; }
.jb-form--stack .jb-form__row:last-child{ border-bottom:0; }
.jb-form--stack .jb-form__label{ display:block; padding-top:0; margin-bottom:var(--jb-sp-3); }
/* 한 줄에 둘 — 총 경력 · 최종학력처럼 짝을 이루는 항목 */
.jb-form--stack .jb-form__row--2{ display:grid; grid-template-columns:repeat(2, minmax(0,1fr)); gap:var(--jb-sp-6); }
.jb-form--stack .jb-form__row--2 > .jb-form__cell{ min-width:0; }
@media (max-width:768px){
  .jb-form--stack .jb-form__row--2{ grid-template-columns:1fr; gap:var(--jb-sp-5); }
}
.jb-form__inline{ display:flex; align-items:center; gap:var(--jb-sp-2); flex-wrap:wrap; }
.jb-form__static{ margin:0; padding-top:13px; font-size:var(--jb-fs-base); line-height:var(--jb-lh-tight); color:var(--jb-body); }
.jb-form__help{ margin:0; font-size:var(--jb-fs-xs); line-height:1.5; color:var(--jb-muted); }
.jb-form__error{ margin:0; font-size:var(--jb-fs-xs); line-height:1.5; color:var(--jb-danger); }
.jb-form__actions{ display:flex; justify-content:center; gap:var(--jb-sp-3);
  margin-top:var(--jb-sp-7); padding-top:var(--jb-sp-6); border-top:1px solid var(--jb-border); }

/* ── Input / Select / Textarea ──────────────────────────────────────── */
.jb-input, .jb-select, .jb-textarea{
  width:100%; padding:0 var(--jb-sp-4); border:1px solid var(--jb-border); border-radius:var(--jb-r-btn);
  background:var(--jb-surface); font-family:var(--jb-font-body); font-size:var(--jb-fs-base);
  line-height:var(--jb-lh-tight); color:var(--jb-ink); }
.jb-input, .jb-select{ height:var(--jb-input-h); }
.jb-textarea{ min-height:140px; padding:13px var(--jb-sp-4); line-height:var(--jb-lh-base); resize:vertical; }
.jb-input::placeholder, .jb-textarea::placeholder{ color:var(--jb-disabled); }
.jb-input:focus, .jb-select:focus, .jb-textarea:focus{ outline:0; border-color:var(--jb-brand); box-shadow:var(--jb-ring); }
.jb-input[readonly], .jb-input[disabled], .jb-select[disabled], .jb-textarea[disabled]{
  background:var(--jb-bg-subtle); color:var(--jb-muted); }
.jb-input.is-error, .jb-select.is-error, .jb-textarea.is-error{ border-color:var(--jb-danger); }
.jb-input--w120{ width:120px; flex:none; }
.jb-input--w200{ width:200px; flex:none; }
.jb-select{ appearance:none;
  background-image:url("/resource/new_2026/img/icon/ui/caret-down-select.svg");
  background-repeat:no-repeat; background-position:calc(100% - 14px) 50%; background-size:18px 18px; padding-right:38px; }
.jb-select--w110{ width:110px; flex:none; }

/* ── Check / Radio (커스텀 마크 · 운영 custom-checkbox 대응) ────────── */
.jb-check, .jb-radio{ display:inline-flex; align-items:center; gap:var(--jb-sp-2);
  font-family:var(--jb-font-body); font-size:var(--jb-fs-sm); line-height:var(--jb-lh-tight);
  color:var(--jb-body); cursor:pointer; }
.jb-check input, .jb-radio input{ position:absolute; width:1px; height:1px; opacity:0; }
.jb-check__mark, .jb-radio__mark{ position:relative; flex:none;
  width:var(--jb-mark); height:var(--jb-mark); border:1px solid var(--jb-border); background:var(--jb-surface);
  transition:background var(--jb-dur-fast) var(--jb-ease), border-color var(--jb-dur-fast) var(--jb-ease); }
.jb-check__mark{ border-radius:var(--jb-r-sm); }
.jb-radio__mark{ border-radius:50%; }
/* 2026-09-17 단위테스트 04-9 : 체크 아이콘을 «중앙 기준»으로 놓는다.
   종전 left/top 고정값(6px/2px)은 --jb-mark 가 20px 가 아닌 곳에서 마크 밖으로 삐져나왔다. */
.jb-check__mark::after{ content:""; position:absolute; left:50%; top:46%; width:5px; height:9px;
  border:solid var(--jb-on-brand); border-width:0 2px 2px 0;
  transform:translate(-50%,-50%) rotate(45deg); opacity:0; }
.jb-radio__mark::after{ content:""; position:absolute; inset:5px; border-radius:50%;
  background:var(--jb-on-brand); opacity:0; }
.jb-check input:checked + .jb-check__mark,
.jb-radio input:checked + .jb-radio__mark{ background:var(--jb-brand); border-color:var(--jb-brand); }
.jb-check input:checked + .jb-check__mark::after,
.jb-radio input:checked + .jb-radio__mark::after{ opacity:1; }
.jb-check input:focus-visible + .jb-check__mark,
.jb-radio input:focus-visible + .jb-radio__mark{ box-shadow:var(--jb-ring); }
.jb-check input:disabled + .jb-check__mark,
.jb-radio input:disabled + .jb-radio__mark{ background:var(--jb-bg-subtle); border-color:var(--jb-border); }
.jb-check__label{ min-width:0; overflow:hidden; white-space:nowrap; text-overflow:ellipsis; }
.jb-check__count{ flex:none; font-style:normal; font-size:var(--jb-fs-2xs); color:var(--jb-muted); }
.jb-checkgroup{ display:flex; flex-wrap:wrap; gap:var(--jb-sp-3) var(--jb-sp-5); }

/* ── File ───────────────────────────────────────────────────────────── */
.jb-file{ display:flex; align-items:center; gap:var(--jb-sp-2); flex-wrap:wrap; }
.jb-file input[type="file"]{ position:absolute; width:1px; height:1px; opacity:0; }
.jb-file__name{ flex:1 1 200px; min-width:0; height:var(--jb-input-h); padding:0 var(--jb-sp-4);
  display:flex; align-items:center; border:1px solid var(--jb-border); border-radius:var(--jb-r-btn);
  background:var(--jb-bg-subtle); font-size:var(--jb-fs-sm); color:var(--jb-muted);
  overflow:hidden; white-space:nowrap; text-overflow:ellipsis; }
.jb-file__list{ display:flex; flex-direction:column; gap:var(--jb-sp-2); margin:0; padding:0; list-style:none; }
.jb-file__item{ display:flex; align-items:center; gap:var(--jb-sp-2); font-size:var(--jb-fs-sm); color:var(--jb-body); }
.jb-file__del{ display:inline-flex; align-items:center; justify-content:center; width:20px; height:20px;
  padding:0; border:0; background:none; color:var(--jb-muted); cursor:pointer; }

/* ── Agree (약관 동의) ──────────────────────────────────────────────── */
.jb-agree{ border:1px solid var(--jb-border); border-radius:var(--jb-r-box); background:var(--jb-surface); }
.jb-agree__head{ display:flex; align-items:center; justify-content:space-between; gap:var(--jb-sp-3);
  padding:var(--jb-sp-4) var(--jb-sp-5); border-bottom:1px solid var(--jb-border); }
.jb-agree__title{ font-family:var(--jb-font-display); font-weight:var(--jb-fw-semibold);
  font-size:var(--jb-fs-base); color:var(--jb-ink); }
.jb-agree__body{ max-height:180px; padding:var(--jb-sp-4) var(--jb-sp-5); overflow-y:auto;
  font-size:var(--jb-fs-xs); line-height:1.7; color:var(--jb-muted); }
.jb-agree__foot{ padding:var(--jb-sp-4) var(--jb-sp-5); border-top:1px solid var(--jb-border);
  background:var(--jb-bg-subtle); }

/* ══ [기존 컴포넌트 확장] ═════════════════════════════════════════════ */

/* 조건 칩 : 삭제 버튼 · 건수 (운영 addCdCnt 승계) */
/* 2026-09-17 단위테스트 04-8 : 선택 조건 칩은 필터(채용분야) 칩과 «같은 규격»이다.
   높이·글자·라운딩을 따로 주지 않는다 — 삭제 버튼 자리만큼 오른쪽 여백만 줄인다. */
.jb-chip--removable{ padding-right:var(--jb-sp-3); }
.jb-chip__x{ display:inline-flex; align-items:center; justify-content:center; flex:none;
  width:18px; height:18px; margin-left:var(--jb-sp-2); padding:0; border:0; border-radius:50%;
  background:var(--jb-bg-subtle); color:var(--jb-muted); cursor:pointer;
  font-size:12px; line-height:1; }
/* × 는 «규격이» 그린다 — 마크업에 맡기면 빈 원만 남는다(2026-09-18 실제 사고) */
.jb-chip__x::before{ content:"×"; }
/* ⚠️ 정본에 없는 «개발본 전용» 가드 — 지우기 전에 반드시 읽을 것.
   dev 목록 5화면(02 대외활동 · 04 공공채용 · 08 취업교육 · 10 기업지원정책 · 12 일자리지원정책)은
   같은 버튼 안에 `<i class="jb-ico jb-ico--close">`(마스크 ✕)를 «직접» 넣는다
   (`extrActvList.jsp:420·424` · `publicJobList.jsp:1067` · `empmEduList.jsp:584` ·
    `entSprtList.jsp:611` · `jobSprtList.jsp:467`). 위 `::before` 만 이식하면 ✕ 가 «두 개» 그려진다.
   정본 퍼블도 두 갈래다 — `mypage-empsvc.html` 은 «빈 span»(규격이 그린다),
   `job-public-list.html`·`design-system.html` 은 «아이콘 자식»(마크업이 그린다).
   ➡️ 아이콘 자식이 있으면 규격은 그리지 않는다. 마크업을 한쪽으로 통일하면 이 줄을 지운다. */
.jb-chip__x:has(.jb-ico)::before{ content:none; }
/* 🔴 D99 ① (2026-09-18 실측) — 그 «아이콘 자식»이 버튼보다 커서 회색 원이 통째로 가려졌다.
   `.jb-ico` 기본이 20×20 인데 `.jb-chip__x` 는 18×18 이다(로컬 실측 — 버튼 18 / 아이콘 20).
   화면에는 맨 ✕ 글리프만 보이고 원형 배경이 사라진다. 버튼 «안»에 들어가는 크기로 줄인다.
   값 10px 은 정본이 `::before{ content:"×"; font-size:12px }` 로 그리는 글리프와 같은 눈높이다.
   ⚠️ 근본 해법은 마크업 통일이다 — dev 목록 5화면이 `<i>` 를 직접 넣는 것을 걷고 규격이 그리게 하면
      위 `:has()` 가드와 이 규칙을 «둘 다» 지울 수 있다. 04 지시 범위를 넘어 그대로 둔다. */
.jb-chip__x > .jb-ico{ width:10px; height:10px; }
.jb-chip[aria-selected="true"] .jb-chip__x, .jb-chip[aria-pressed="true"] .jb-chip__x, .jb-chip.is-active .jb-chip__x{
  background:var(--jb-on-brand-20); color:var(--jb-on-inverse); }
.jb-chip__count{ margin-left:var(--jb-sp-1); font-style:normal; font-size:var(--jb-fs-xs); color:var(--jb-muted); }
.jb-chip[aria-selected="true"] .jb-chip__count, .jb-chip[aria-pressed="true"] .jb-chip__count,
.jb-chip.is-active .jb-chip__count{ color:inherit; opacity:.75; }

/* 안내 박스 : 좌측 아이콘 + 본문 (버튼 없는 단순 안내) */
.jb-notice--plain{ justify-content:flex-start; align-items:flex-start; background:var(--jb-bg-subtle);
  border-color:var(--jb-border); font-size:var(--jb-fs-sm); line-height:1.6; color:var(--jb-muted); }
.jb-notice__ico{ flex:none; width:18px; height:18px; margin-top:1px; }
/* 아이콘 «바로 뒤» 본문은 남는 폭을 다 쓴다 (2026-09-18 · D91)
   `.jb-notice` 가 `justify-content:space-between` 이라(우측에 액션이 오는 경우를 위한 것)
   본문이 늘어나지 않으면 아이콘과 문구가 «양 끝»으로 밀려 253px 이 벌어진다(실측).
   ★ 변형별로 주지 않고 «아이콘 다음 본문»에 준다 — 새 변형을 만들 때마다 빠뜨리지 않는다.
   ※ flex-wrap:wrap 이라 basis:auto 면 좁은 폭에서 통째로 아래로 떨어지는 문제도 함께 막는다. */
.jb-notice__ico + span{ flex:1 1 0; min-width:0; }

/* 정보 테이블 : th 를 좌측 라벨로 쓰는 상세 정보형 */
.jb-table--info th{ width:160px; padding:14px 20px; text-align:left; color:var(--jb-ink);
  font-size:var(--jb-fs-sm); font-weight:var(--jb-fw-semibold); }
.jb-table--info td{ text-align:left; padding:14px 20px; }

/* ══ [반응형] ═════════════════════════════════════════════════════════ */
@media (max-width:1024px){
  .jb-jobcat__grid{ grid-template-columns:repeat(4,minmax(0,1fr)); }
}
@media (max-width:768px){
  .jb-pagehead{ padding:var(--jb-sp-6) 0 var(--jb-sp-5); }
  .jb-pagehead__title{ font-size:var(--jb-fs-h2); }
  .jb-pagehead__desc{ font-size:var(--jb-fs-sm); }
  .jb-jobcat__grid{ grid-template-columns:repeat(3,minmax(0,1fr)); gap:var(--jb-sp-2); }
  .jb-jobcat__item{ min-height:86px; gap:var(--jb-sp-2); padding:var(--jb-sp-3) var(--jb-sp-1); }
  .jb-jobcat__ico{ width:24px; height:24px; }
  .jb-jobcat__name{ font-size:var(--jb-fs-2xs); }
  .jb-searchbox{ padding:var(--jb-sp-4); }
  .jb-searchbox__sub{ flex-direction:column; gap:var(--jb-sp-2); }
  .jb-searchbox__sub-label{ padding-top:0; }
  /* 🔴 2026-09-27 D281 · 세로 배치에서는 되돌린다 — 여기서는 `flex-direction:column` 이라
     `align-items:center` 가 «가로» 중앙이 된다. 실측(390) — 지원금 행만 라벨좌 169 · 내용좌 120 으로
     밀리고 다른 행은 33 이었다. 세로에서는 중심을 맞출 «짝»이 없으므로 왼쪽 정렬이 맞다.
     ⚠️ 정본 components.css 에는 이 리셋이 «없다» — 설계 세션에 올렸다. */
  .jb-searchbox__sub:has(.jb-check){ align-items:flex-start; }
  .jb-sorttabs{ gap:var(--jb-sp-5); }
  .jb-detailhead{ padding:var(--jb-sp-5); }
  .jb-detailhead__title{ font-size:var(--jb-fs-h3); }
  .jb-prose{ padding:var(--jb-sp-5); }
  .jb-form__row{ grid-template-columns:1fr; gap:var(--jb-sp-2); }
  .jb-form__label{ padding-top:0; }
  .jb-form__static{ padding-top:0; }
  .jb-tabbar{ gap:var(--jb-sp-5); overflow-x:auto; flex-wrap:nowrap; }
  .jb-tabbar__item{ height:46px; font-size:var(--jb-fs-base); }
}

/* ── Link list (상세 사이드 '관련 정보 및 서비스') ──────────────────── */
.jb-linklist__title{ margin:0 0 var(--jb-sp-3); font-family:var(--jb-font-display);
  font-weight:var(--jb-fw-semibold); font-size:var(--jb-fs-base); color:var(--jb-ink); }
.jb-linklist__ul{ display:flex; flex-direction:column; gap:var(--jb-sp-2); margin:0; padding:0; list-style:none; }
.jb-linklist__ul a{ display:block; font-size:var(--jb-fs-sm); line-height:1.5;
  color:var(--jb-body); text-decoration:none; }
.jb-linklist__ul a:hover{ color:var(--jb-brand); text-decoration:underline; }
/* ── 건수를 단 링크 목록 (.jb-linklist__ul--count) ── 2026-09-18 · D101 · D111 · 05 §4-4
   「내 활동 이어가기」처럼 «내 것이 몇 건인지»가 링크 이름만큼 중요한 자리에 쓴다.
   ★ 건수가 0 인 줄은 «서버가 그리지 않는다» — 회색 0 을 늘어놓으면 할 일이 없다는 사실만 강조된다.
     전부 0 이면 카드 자체를 내지 않는다(마이페이지 .jb-goon 과 같은 규칙).
   ⚠️ 위 `.jb-linklist__ul a{ display:block }`(0,1,1)와 특정도가 같다 — «뒤»에 있어야 flex 가 이긴다. */
.jb-linklist__ul--count a{ display:flex; align-items:baseline; justify-content:space-between;
  gap:var(--jb-sp-3); }
.jb-linklist__ul--count a > span{ min-width:0; }
.jb-linklist__count{ flex:none; font-family:var(--jb-font-display); font-weight:var(--jb-fw-bold);
  color:var(--jb-brand); }
/* 링크 전체에 밑줄이 그어지면 숫자까지 딸려간다 — 글자 쪽만 긋는다 */
.jb-linklist__ul--count a:hover{ text-decoration:none; }
.jb-linklist__ul--count a:hover > span{ text-decoration:underline; }
/* 카드 ① 기관명 — 지시 95 「01 표준 연결영역」 #2 로 stdLinks.jsp 에서 마크업을 뺐다(현재 미사용).
   규칙은 남겨 둔다(다른 화면이 쓸 수 있고, 되돌릴 때 여기만 보면 된다). */
.jb-linklist__meta{ display:block; margin-top:2px; font-size:var(--jb-fs-xs); color:var(--jb-muted); }
.jb-linklist__foot{ margin-top:var(--jb-sp-4); }
/* ▼ 17단계 B-6 · B-7 (D166 · D169) — 링크 목록 우측 요소의 규격.
   2026-09-23 사용자 지시 : 「목록 우측을 라벨 배지로」 + 「`~D-3` 도 「상시」와 높이·텍스트 크기를 정확히 맞춰 ·
   다른 카드도 동일하게」. 「다른 카드도」가 일반화 의도라 페이지 CSS 가 아니라 부품에 둔다.
   🔴 두 부품의 기본 치수가 다르다 — `.jb-label` h28 · 14px(fs-sm) · 좌우 12 · r-btn
                                   `.jb-badge` h20 · 12px(fs-2xs) · 좌우 6 · r-sm
      한 줄에 나란히 서면 8px 씩 어긋나고, 4줄이면 32px 이 밀려 카드 하단 버튼 줄이 안 맞는다.
   ➡ 목록 «안에서만» 배지를 라벨과 같은 상자로 맞춘다. 남는 차이는 «색»뿐이고
      그 색(D-day = danger)이 곧 마감이라는 뜻을 나른다. `.jb-badge` 기본(h20)은 건드리지 않는다.
   ★ 영향 범위 실측(2026-09-23) — `.jb-linklist__ul` 안에 배지·라벨을 쓰는 dev 화면은 **0건**이었다.
     지금은 대상별 허브만 쓰므로 `.jb-hubpage` 한정과 결과가 같다. */
/* ▼ 보강(2026-09-23 사용자) — 「`D-7` 같은 라벨도 사이즈가 작다 · 좌측 라벨과 맞춰라」.
   카드 «메타 줄»에도 같은 혼재가 있어 자리를 하나 더한다.
   🔴 자리마다 덧붙이지 않으려고 전수 확인했다(dev JSP 기준 · 2026-09-23) —
     | 자리                     | 배지+라벨 혼재 | 판단 |
     | .jb-linklist__ul         | 있음(허브)     | 적용 |
     | .jb-policycard__meta     | 1곳(trgtHub)   | 적용 |
     | .jb-policycard__badges   | 0곳            | 🔁 D303 으로 «뒤집혔다» — 아래 참조 |
       🔴 D303 ② (2026-09-27 사용자) — 「라벨 사이즈를 통일해줘. 특히 «인력·고용» 라벨이 사이즈가 작아」.
          이 표는 «한 줄 안의 혼재»만 셌는데, 사용자는 «줄을 넘나들며» 배지(h20)와 라벨(h28)을 비교했다.
          실제로 배지줄 안에도 `.jb-label`(지역)이 나란히 서므로 h20 이 «보조 표시»가 아니라 «어긋난 것»으로 읽힌다.
          ➡️ 「작은 게 맞다」는 철회. 규격은 .jb-policycard__badges 블록(아래)에 둔다.
     | .jb-jobcard__meta        | 0곳(9곳 전부)  | 🔴 제외 — D-day 가 전용 클래스(.jb-jobcard__dday)다 |
     | .jb-summary__meta        | 0곳            | 🔴 제외 |
   ➡ 바뀌는 화면은 대상별 허브뿐이다(청년 카드 3 + 장애인 카드 3). 다른 화면 회귀 없음. */
.jb-linklist__ul .jb-label,
.jb-linklist__ul .jb-badge,
.jb-policycard__meta .jb-label,
.jb-policycard__meta .jb-badge{ flex:none; }
.jb-linklist__ul .jb-badge,
.jb-policycard__meta .jb-badge{ height:28px; padding:0 12px; border-radius:var(--jb-r-btn);
  font-family:var(--jb-font-body); font-weight:var(--jb-fw-medium); font-size:var(--jb-fs-sm); }

/* ── 표준 연결영역(stdLinks.jsp) 한정 — 지시 95 「01 표준 연결영역」 ───────
   #1 목록 항목마다 하단 구분선 · 마지막 항목은 선 없음
   #3 「회원이면 더 편해요」 카드 = 면(brand-weak) · 테두리 없음 · display 폰트 600
   근거 = 프로토타입 theme-neutral.css
          `.std-foot__col li{padding:5px 0;border-bottom:1px solid …}`
          `.std-foot__col li:last-child{border-bottom:0}` · `.std-foot__col--member{background:…}`
   🔄 2026-09-23 정정(D175) — 종전 주석은 「정본이 전역으로 준다」고 적었는데 «낡은 내용»이었다.
      정본은 2026-09-17 에 이미 좁혔다 → `.jb-sidebox .jb-linklist__ul > li`(정본 components.css:911~912).
      ➡️ 정본 규칙 하나면 상세 우측 · 허브 하단 4칼럼 · `.jb-tgarea` · 중장년 2단이 «전부» 걸린다.
      ⚠️ 그런데도 지금 `.jb-stdlinks` 로 두는 이유는 «시점» 때문이다 —
         `.jb-sidebox` 로 통일하면 15 차수에 판정을 마친 취업준비 허브(prepHub) 하단 4칼럼의
         선 · 여백이 함께 바뀌어 재검수가 필요하다. 17 은 대상별 허브만 여는 차수다.
      ➡️ 범위 통일은 «운영 CSS 흡수 차수»로 미룬다(91 대장 24번).
      ⚠️ 그때 함께 고칠 것 — 여기는 `padding:12px 0` «단축»을 쓰는데 정본은 `padding-bottom` 만 준다.
         그 단축이 `--guide` 의 `padding-left:30px` 를 덮어 아래에 보정 규칙을 또 달게 만든 원인이다.
      ⚠️ 17 에서는 대상별 허브만 열었다 — `.jb-tgarea` · `.jb-hubpage .jb-grid--2`(page-hub.css).
   ⚠️ gap 을 0 으로 두고 li 의 padding 으로 간격을 만든다. 그래야 글자~선~글자가 대칭이 된다
      (gap 을 남기면 선 위 10px · 선 아래 16px 로 어긋난다). 레이아웃 속성이라 !important 를 쓰지 않는다. */
.jb-stdlinks .jb-linklist__ul{ gap:0; }
.jb-stdlinks .jb-linklist__ul > li{ padding:var(--jb-sp-3) 0;
  border-bottom:1px solid var(--jb-border-soft); }
.jb-stdlinks .jb-linklist__ul > li:first-child{ padding-top:0; }
.jb-stdlinks .jb-linklist__ul > li:last-child{ padding-bottom:0; border-bottom:0; }

/* 가입 유도 카드(로그인 전) — 지시 95 「01 표준 연결영역」 #3 · 「회원이면 더 편해요」
   ★ 이름은 정본 «.jb-sidebox--brand» 다(design/css/components.css · CHANGELOG 2026-09-17 #2).
   대비 : --jb-ink(#222222) on --jb-brand-weak(#E2F4F5) = 14.0:1 (WCAG AAA 통과).
   구분선은 옅은 면 위에서 --jb-border-soft(#E9EEF0)가 보이지 않으므로
   같은 「옅은 테두리」 계열인 --jb-brand-soft 로 바꾼다(하드코딩 아님).
   ⚠️ 정본은 `border:0` 이지만 여기서는 «색만 투명»으로 둔다 — 보이는 결과는 같고 두 가지를 더 지킨다.
      ① 형제 카드(1px)와 박스 크기가 어긋나지 않는다(폭 2px · 높이 2px 차이 방지).
      ② 고대비 보기(page-hub.css `html.jb-view--contrast .jb-sidebox{border-color:#fff}` · (0,2,1))가
         그대로 이겨 흰 테두리를 되살린다. border:0 으로 지우면 고대비에서 카드 경계가 사라진다. */
.jb-sidebox--brand{ border-color:transparent; background:var(--jb-brand-weak); }
.jb-sidebox--brand,
.jb-sidebox--brand .jb-linklist__title,
.jb-sidebox--brand .jb-linklist__ul a{
  font-family:var(--jb-font-display); font-weight:var(--jb-fw-semibold); }
.jb-stdlinks .jb-sidebox--brand .jb-linklist__ul > li{
  font-family:var(--jb-font-display); font-weight:var(--jb-fw-semibold);
  font-size:var(--jb-fs-sm); line-height:1.5; color:var(--jb-ink);
  border-bottom-color:var(--jb-brand-soft); }

/* ── 안내형 목록 `.jb-linklist__ul--guide` — 「회원이면 더 편해요」 (05 지시 §2 · 2026-09-18) ──
   옆 카드가 전부 링크라 이 카드도 누르면 어디로 갈 것처럼 보였다. 실제로는 «로그인하면 생기는 것»의 안내다.
   ★ 구분선을 걷고 «체크 원형»을 붙여 「목록」이 아니라 「안내」로 읽히게 한다(번호 → 체크 · 사용자 확정).
   ★ 마크업은 <a> 가 아니라 <span> — 눌러지는 것처럼 보이지 않게.
   🔴 `.jb-ico` 하나로는 «면 + 흰 체크»를 못 만든다 — 배경색을 mask 로 깎는 방식이라 색 하나짜리 글리프만 나온다.
      원형 면은 li `::before`(CSS)가, 흰 체크는 «마크업의 <i class="jb-ico jb-ico--check">» 가 그린다.
      CSS 만 옮기고 마크업에서 <i> 를 빼면 «원만» 남는다.
   ── ① 정본 규격 (design/css/components.css:629~643 · 값·이름 그대로) ── */
.jb-linklist__ul--guide{ gap:var(--jb-sp-3); }
.jb-linklist__ul--guide > li{ display:flex; align-items:center; }
.jb-linklist__ul--guide > li{ position:relative; padding-left:30px; }
.jb-linklist__ul--guide > li::before{
  content:""; position:absolute; left:0; top:50%; transform:translateY(-50%);
  width:22px; height:22px; border-radius:50%; background:var(--jb-brand); }
.jb-linklist__ul--guide > li > .jb-ico{
  position:absolute; left:4px; top:50%; transform:translateY(-50%);
  width:14px; height:14px; background-color:var(--jb-on-brand); }
/* ▼ 05 QA 결함(D107) — 운영 layout.css 의 `*{ font-family:'Noto Sans KR' }` 가 span 에 «직접» 걸려
     부모(.jb-sidebox--brand · display 폰트)의 상속을 이겼다. inherit 로 부모 글꼴을 되찾는다.
     prepHub 는 부모가 원래 Noto 라 영향 없다. */
.jb-linklist__ul--guide > li > span{ min-width:0; font-family:inherit; font-size:var(--jb-fs-sm); line-height:1.5; color:var(--jb-body); }
/* ── ② 정본 구분선 제거 (design/css/components.css:874~875) ── */
.jb-linklist__ul--guide.jb-linklist__ul > li,
.jb-sidebox .jb-linklist__ul--guide > li{ padding-bottom:0; border-bottom:0; }
/* ── ③ dev 맥락 보정 — «정본에 없는 개발본 전용» · 지우기 전에 읽을 것 ──
   정본은 `.jb-linklist__ul > li` 구분선을 «전역»으로 주지만 dev 는 허브 회귀를 막으려고 `.jb-stdlinks` 로 좁혀 뒀다(위 908~924).
   그 규칙들이 정본 ①②보다 특정도가 높아 그대로 두면 ①②가 «진다».
     .jb-stdlinks .jb-linklist__ul{ gap:0 }                        (0,2,0)  → ① gap(0,1,0) 이 진다
     .jb-stdlinks .jb-linklist__ul > li{ padding:12px 0; border… }  (0,2,1)  → ① padding-left:30px 가 0 으로 덮여
                                                                             «체크 원이 글자 위에 겹친다»
   ➡️ 같은 스코프·같은 특정도로 «뒤»에 둬서 이긴다. `!important` 는 쓰지 않는다(레이아웃 속성). */
.jb-stdlinks .jb-linklist__ul.jb-linklist__ul--guide{ gap:var(--jb-sp-3); }
.jb-stdlinks .jb-linklist__ul--guide > li{ padding:0 0 0 30px; border-bottom:0; }

/* ══════════════════════════════════════════════════════════════════════
   허브 · 신청접수 컴포넌트   v1 (2026-09-04 · A 등급 화면 5종)
   ----------------------------------------------------------------------
   목차 : Subhead · Subhero · Apbanner · Poster · Checkgrid · Step ·
          Extcard · Viewtools · Policycard(승격)
   ══════════════════════════════════════════════════════════════════════ */

/* ── Subhead (서브 페이지 섹션 소제목 + 우측 링크) ───────────────────
   메인용 .jb-sechead(36px)보다 작은 서브 페이지 전용. 전 허브 화면 공통. */
.jb-subhead{ display:flex; align-items:flex-end; justify-content:space-between;
  gap:var(--jb-sp-4); flex-wrap:wrap; margin-bottom:var(--jb-sp-5); }
.jb-subhead__title{ margin:0; font-family:var(--jb-font-display); font-weight:var(--jb-fw-bold);
  font-size:var(--jb-fs-h3); line-height:var(--jb-lh-tight); color:var(--jb-ink); }
.jb-subhead__desc{ margin:var(--jb-sp-2) 0 0; font-size:var(--jb-fs-sm); color:var(--jb-muted); }

/* ── Subhero (허브 페이지 상단 소개 배너) ───────────────────────────── */
.jb-subhero{ display:grid; grid-template-columns:minmax(0,1fr) 380px; gap:var(--jb-sp-7);
  align-items:center; padding:var(--jb-pad-card); border-radius:var(--jb-r-card); background:var(--jb-bg-section); }
.jb-subhero__title{ margin:0; font-family:var(--jb-font-display); font-weight:var(--jb-fw-bold);
  font-size:var(--jb-fs-h2); line-height:1.35; color:var(--jb-ink); }
.jb-subhero__desc{ margin:var(--jb-sp-3) 0 0; font-size:var(--jb-fs-base); line-height:1.6; color:var(--jb-muted); }
.jb-subhero__side{ display:flex; flex-direction:column; gap:var(--jb-sp-3); }
.jb-subhero__stat{ padding:var(--jb-sp-4) var(--jb-sp-5); border-radius:var(--jb-r-box); background:var(--jb-surface); }
.jb-subhero__stat b{ display:block; font-family:var(--jb-font-display); font-weight:var(--jb-fw-semibold);
  font-size:var(--jb-fs-base); color:var(--jb-ink); }
.jb-subhero__stat span{ display:block; margin-top:var(--jb-sp-1); font-size:var(--jb-fs-xs); line-height:1.5; color:var(--jb-muted); }

/* ── Apbanner (추천 사업 캐러셀 · 신청·접수) ─────────────────────────
   슬라이드 전환은 기존 [data-slider] 훅을 그대로 쓴다. */
.jb-apbanner{ position:relative; border-radius:var(--jb-r-card); background:var(--jb-bg-section); overflow:hidden; }
.jb-apbanner__slide{ display:grid; grid-template-columns:minmax(0,1fr) 300px; gap:var(--jb-sp-7);
  align-items:center; min-height:280px; padding:var(--jb-sp-7) var(--jb-sp-8); }
.jb-apbanner__slide[hidden]{ display:none !important; }   /* jb- 컴포넌트 display 를 이긴다 */
.jb-apbanner__eyebrow{ display:inline-flex; align-items:center; height:26px; padding:0 var(--jb-sp-3);
  border-radius:var(--jb-r-pill); background:var(--jb-brand-weak);
  font-family:var(--jb-font-display); font-weight:var(--jb-fw-semibold); font-size:var(--jb-fs-xs);
  line-height:1; color:var(--jb-brand-deep); }
.jb-apbanner__title{ margin:var(--jb-sp-4) 0 0; font-family:var(--jb-font-display); font-weight:var(--jb-fw-bold);
  font-size:var(--jb-fs-h2); line-height:1.35; color:var(--jb-ink); }
.jb-apbanner__desc{ margin:var(--jb-sp-3) 0 var(--jb-sp-5); font-size:var(--jb-fs-base); line-height:1.6; color:var(--jb-muted); }
.jb-apbanner__nav{ position:absolute; right:var(--jb-sp-6); bottom:var(--jb-sp-5);
  display:flex; align-items:center; gap:var(--jb-sp-2); }
.jb-apbanner__nav button{ display:inline-flex; align-items:center; justify-content:center;
  width:var(--jb-ctrl); height:var(--jb-ctrl); padding:4px; border:0; border-radius:50%;
  background:var(--jb-surface); color:var(--jb-muted); cursor:pointer; }
.jb-apbanner__count{ font-family:var(--jb-font-display); font-size:var(--jb-fs-xs); color:var(--jb-muted); }

/* ── Poster (포스터형 카드 · 신청·접수 · 기업지원사업) ───────────────
   thumb 은 관리자 등록 포스터 이미지 자리. 이미지가 없으면 텍스트 포스터로 대체한다. */
.jb-poster{ display:flex; flex-direction:column; border:1px solid var(--jb-border);
  border-radius:var(--jb-r-card); background:var(--jb-surface); overflow:hidden;
  text-decoration:none; color:inherit;
  transition:border-color var(--jb-dur-fast) var(--jb-ease), box-shadow var(--jb-dur-base) var(--jb-ease); }
.jb-poster:hover{ border-color:var(--jb-brand); box-shadow:var(--jb-shadow-hover); }
.jb-poster__thumb{ position:relative; display:flex; flex-direction:column; align-items:center; justify-content:center;
  gap:var(--jb-sp-2); aspect-ratio:4 / 3; padding:var(--jb-sp-5); background:var(--jb-brand-weak); text-align:center; }
.jb-poster__thumb img{ position:absolute; inset:0; width:100%; height:100%; object-fit:cover; }
.jb-poster__eyebrow{ font-size:var(--jb-fs-2xs); color:var(--jb-brand-deep); }
.jb-poster__headline{ font-family:var(--jb-font-display); font-weight:var(--jb-fw-bold);
  font-size:var(--jb-fs-lg); line-height:1.35; color:var(--jb-brand-darker); }
.jb-poster__sub{ font-size:var(--jb-fs-2xs); color:var(--jb-brand-deep); }
.jb-poster__body{ display:flex; flex-direction:column; align-items:flex-start;
  gap:var(--jb-sp-2); padding:var(--jb-sp-5); }   /* align-items 를 주지 않으면 배지가 가로로 늘어난다 */
.jb-poster__title{ font-family:var(--jb-font-display); font-weight:var(--jb-fw-semibold);
  font-size:var(--jb-fs-base); line-height:1.45; color:var(--jb-ink); }
.jb-poster__date{ font-size:var(--jb-fs-xs); color:var(--jb-muted); }
.jb-poster__date b{ font-weight:var(--jb-fw-medium); color:var(--jb-body); }
/* 메타 여러 개를 한 줄에(기관 · 학습시간 등). __date 가 «날짜 한 줄» 전용이라 따로 둔다.
   2026-09-23 신설 — 취업준비 허브 「지금 듣기 좋은 교육」이 첫 사용처다. */
.jb-poster__meta{ display:flex; flex-wrap:wrap; gap:var(--jb-sp-1) var(--jb-sp-3);
  font-size:var(--jb-fs-xs); color:var(--jb-muted); }

/* ── Checkgrid (다열 체크 그리드 · 지역/사업유형 선택) ──────────────── */
.jb-filter__group-head{ display:flex; align-items:center; justify-content:space-between;
  gap:var(--jb-sp-3); flex-wrap:wrap; margin-bottom:var(--jb-sp-4); }
.jb-checkgrid{ display:grid; grid-template-columns:repeat(6,minmax(0,1fr)); gap:var(--jb-sp-3) var(--jb-sp-4); }
.jb-checkgrid--4{ grid-template-columns:repeat(4,minmax(0,1fr)); }

/* ── Step (단계 카드 · 취업준비 허브) ───────────────────────────────── */
.jb-step{ display:flex; flex-direction:column; gap:var(--jb-sp-3);
  padding:var(--jb-sp-6) var(--jb-sp-5); border:1px solid var(--jb-border);
  border-radius:var(--jb-r-card); background:var(--jb-surface); }
.jb-step__num{ display:inline-flex; align-items:center; align-self:flex-start; height:24px; padding:0 var(--jb-sp-3);
  border-radius:var(--jb-r-pill); background:var(--jb-brand); color:var(--jb-on-brand);
  font-family:var(--jb-font-display); font-weight:var(--jb-fw-bold); font-size:var(--jb-fs-2xs);
  letter-spacing:.04em; line-height:1; }
/* 2026-09-22 사용자 지시 — 아이콘을 «STEP 배지와 같은 줄 오른쪽»으로 올리고 크기를 2배(32 → 64)로 */
/* 머리 = 왼쪽(STEP 배지 + 제목) 한 묶음 · 오른쪽 아이콘 — 둘을 «위»로 맞춘다 */
.jb-step__head{ display:flex; align-items:flex-start; justify-content:space-between; gap:var(--jb-sp-3); }
.jb-step__headtxt{ display:flex; flex-direction:column; align-items:flex-start; gap:var(--jb-sp-2); min-width:0; }
.jb-step__ico{ width:64px; height:64px; flex:none; color:var(--jb-brand); }
.jb-step__title{ font-family:var(--jb-font-display); font-weight:var(--jb-fw-bold);
  font-size:var(--jb-fs-lg); line-height:var(--jb-lh-tight); color:var(--jb-ink); }
.jb-step__desc{ margin:0; font-size:var(--jb-fs-sm); line-height:1.6; color:var(--jb-muted); }
.jb-step__state{ margin-top:auto; padding:var(--jb-sp-3) var(--jb-sp-4); border-radius:var(--jb-r-btn);
  background:var(--jb-bg-subtle); font-size:var(--jb-fs-xs); line-height:1.5; color:var(--jb-muted); }
/* 🔴 2026-09-27 D284 — 버튼 사이 간격이 «없었다»(정본 components.css:1090 과 같은 값).
   STEP 1~3 은 버튼이 «하나»라 안 드러났고, 버튼이 둘인 STEP 4(문의하기 + 채용공고 보러가기)만 붙어 보였다.
   10px = `.jb-step` · `.jb-step__head` 가 이미 쓰는 값이다(새 값이 아니다).
   flex-wrap 은 좁은 폭에서 두 번째 버튼이 넘치지 않게 하는 보험이다. */
.jb-step__foot{ display:flex; gap:var(--jb-sp-3); flex-wrap:wrap; }

/* ── Extcard (외부 서비스 카드 · 대상별 서비스) ─────────────────────── */
.jb-extcard{ display:flex; flex-direction:column; gap:var(--jb-sp-3);
  padding:var(--jb-sp-5); border:1px solid var(--jb-border); border-radius:var(--jb-r-card);
  background:var(--jb-surface); text-decoration:none; color:inherit;
  transition:border-color var(--jb-dur-fast) var(--jb-ease); }
.jb-extcard:hover{ border-color:var(--jb-brand); }
.jb-extcard__top{ display:flex; align-items:center; justify-content:space-between; gap:var(--jb-sp-3); flex-wrap:wrap; }
.jb-extcard__name{ font-family:var(--jb-font-display); font-weight:var(--jb-fw-semibold);
  font-size:var(--jb-fs-md); line-height:var(--jb-lh-tight); color:var(--jb-ink); }
.jb-extcard__desc{ margin:0; font-size:var(--jb-fs-sm); line-height:1.6; color:var(--jb-muted); }
.jb-extcard__go{ display:inline-flex; align-items:center; gap:var(--jb-sp-1); margin-top:auto;
  font-family:var(--jb-font-display); font-weight:var(--jb-fw-semibold); font-size:var(--jb-fs-sm); color:var(--jb-brand); }
.jb-extcard__go-ico{ width:16px; height:16px; }

/* ── Viewtools (접근성 보기 도구 · 장애인 패널) ──────────────────────
   운영 장애인채용관(exhb seq=159)의 확대·명도 도구를 3버튼으로 단순화한 것.
   body 에 is-text-large / is-high-contrast 를 토글한다. */
.jb-viewtools{ display:flex; align-items:center; gap:var(--jb-sp-4); flex-wrap:wrap;
  padding:var(--jb-sp-4) var(--jb-sp-5); border:1px solid var(--jb-border);
  border-radius:var(--jb-r-box); background:var(--jb-bg-subtle); }
.jb-viewtools__title{ display:inline-flex; align-items:center; gap:var(--jb-sp-2);
  font-family:var(--jb-font-display); font-weight:var(--jb-fw-semibold); font-size:var(--jb-fs-sm); color:var(--jb-ink); }
.jb-viewtools__actions{ display:flex; gap:var(--jb-sp-2); flex-wrap:wrap; }
.jb-viewtools__actions button{ display:inline-flex; align-items:center; gap:var(--jb-sp-1);
  height:var(--jb-btn-h-sm); padding:0 var(--jb-sp-3); border:1px solid var(--jb-border);
  border-radius:var(--jb-r-btn); background:var(--jb-surface);
  font-family:var(--jb-font-body); font-size:var(--jb-fs-xs); line-height:1; color:var(--jb-body); cursor:pointer; }
.jb-viewtools__actions button[aria-pressed="true"]{ border-color:var(--jb-brand-deep); background:var(--jb-brand-deep); color:var(--jb-on-brand); }
.jb-viewtools__status{ margin-left:auto; font-size:var(--jb-fs-xs); color:var(--jb-muted); }

/* ── Policy card (page-list.css 에서 승격 · 정책·사업 카드 공용) ─────── */
.jb-policycard{ display:flex; flex-direction:column; gap:var(--jb-sp-3);
  padding:var(--jb-sp-5); border:1px solid var(--jb-border); border-radius:var(--jb-r-card);
  background:var(--jb-surface); text-decoration:none; color:inherit;
  transition:border-color var(--jb-dur-fast) var(--jb-ease); }
.jb-policycard:hover{ border-color:var(--jb-brand); }
.jb-policycard__badges{ display:flex; align-items:center; gap:var(--jb-sp-2); flex-wrap:wrap; }
/* 🔴 D303 ② (2026-09-27 사용자 지적) — 「인력·고용」(.jb-badge--brand)이 「하남시」(.jb-label)보다 «작다».
   실측 = 배지 h20 · padding 0 6px · fs-2xs · r-sm  ↔  라벨 h28 · padding 0 12px · fs-sm · r-btn.
   한 줄에 나란히 서는데 규격이 둘이라 눈에 띄게 어긋났다.
   ➡️ 배지줄 안의 .jb-badge 를 «라벨 규격»으로 맞춘다 — 같은 줄에 서는 것은 같은 크기다.
   ★ 범위 = 정본에서 이 부품을 쓰는 곳 biz-home(4) · target-hub(6) · design-system(2).
     화면별 오버라이드를 만들지 않는다(§배지·라벨 높이 통일의 기존 원칙).
   ⚠️ 17 대상별 서비스가 «함께» 바뀐다 — 앞 차수 합격분이라 배지줄만 커지고 나머지는 불변이어야 한다. */
.jb-policycard__badges .jb-badge{ height:28px; padding:0 12px; border-radius:var(--jb-r-btn);
  font-size:var(--jb-fs-sm); font-weight:var(--jb-fw-medium); }
.jb-policycard__title{ font-family:var(--jb-font-display); font-weight:var(--jb-fw-semibold);
  font-size:var(--jb-fs-md); line-height:1.45; color:var(--jb-ink); }
/* 🔴 D303 ③ (2026-09-27 사용자 지적) — 「화성산업진흥원 2026.07.27 ~ 2026.08.11 D-2」 줄에서
   D-day 배지와 좌측 텍스트의 «세로 정렬»이 어긋나 있었다.
   원인 = align-items 가 없어 기본값 stretch. 텍스트 span 은 줄 높이(≈20px)인데 배지는 28px 라,
   stretch 가 텍스트 상자를 28px 로 늘리고 «글자가 위로 붙었다».
   ➡️ align-items:center — 배지가 섞이는 줄은 «가운데»가 기준이다. */
.jb-policycard__meta{ display:flex; align-items:center; gap:var(--jb-sp-3); flex-wrap:wrap;
  font-size:var(--jb-fs-sm); color:var(--jb-muted); }
/* --media : 좌측 썸네일 (기업지원정책 목록) */
/* 🔴 D303 ① (2026-09-27 사용자 지시) — 썸네일을 «카드 높이를 채우는» 크기로 키우고 폭은 «원본 비율»로.
   종전 64x64 고정이라 카드 안에서 작았다. 실측 = 썸네일 원본 5건 전부 «338x254»(4:3 가로형).
   ➡️ align-items:stretch 로 높이를 카드에 맞추고 폭은 aspect-ratio 가 따라온다.
   🔴 함께 고친 것 — D231(2026-09-26)에서 JSP 에는 <img> 를 넣었는데 «CSS 규칙을 빠뜨렸다».
      `__thumb img` 도 `overflow:hidden` 도 없어 338x254 원본이 64px 상자를 삐져나오고 있었다.
      (그것이 사용자가 본 「썸네일이 작다·이상하다」의 절반이다.)
   ★ min-width:64px 는 «썸네일이 없을 때»(아이콘 대체)의 최소 폭 — 상태 분기의 쌍을 지킨다.
   🔴 «갱신»(2026-09-27 사용자 「이렇게까지 키워달라는 건 아니었어. 45% 줄여줘」) —
      처음에 `height:auto` + `align-self:stretch` + `aspect-ratio` 를 함께 줬더니 세 값이 서로를 밀었다.
      stretch 가 높이를 늘리면 aspect-ratio 가 폭을 늘리고 그 폭이 다시 높이를 밀어 «원본 338x254 까지» 커진다.
      ➡️ **비율을 지키는 값은 «한 변»으로 고정한다** — height:140px 하나만 박고 폭은 aspect-ratio 가 따라온다.
         338x254 → 186x140 = 한 변 55%(= 45% 축소). 부모의 align-items:stretch 는 «그대로 둔다»
         (body 가 짧은 카드에서도 썸네일 높이가 흔들리지 않는다). */
.jb-policycard--media{ flex-direction:row; align-items:stretch; gap:var(--jb-sp-4); }
.jb-policycard__thumb{ display:flex; align-items:center; justify-content:center; flex:0 0 auto;
  width:auto; height:140px; aspect-ratio:338/254; min-width:64px;
  border-radius:var(--jb-r-box); background:var(--jb-brand-weak); color:var(--jb-brand);
  overflow:hidden; }
.jb-policycard__thumb img{ width:100%; height:100%; object-fit:cover; }
.jb-policycard__thumb .jb-ico{ width:28px; height:28px; }   /* 썸네일이 «없을 때»의 대체 */
.jb-policycard__body{ display:flex; flex-direction:column; gap:var(--jb-sp-2); min-width:0; }

/* ══ [반응형] ═════════════════════════════════════════════════════════ */
@media (max-width:1024px){
  .jb-subhero{ grid-template-columns:1fr; gap:var(--jb-sp-5); padding:var(--jb-sp-6); }
  .jb-apbanner__slide{ grid-template-columns:1fr; padding:var(--jb-sp-6); }
  .jb-checkgrid{ grid-template-columns:repeat(4,minmax(0,1fr)); }
}
@media (max-width:768px){
  .jb-subhero__title{ font-size:var(--jb-fs-h3); }
  .jb-apbanner__title{ font-size:var(--jb-fs-h3); }
  .jb-apbanner__nav{ position:static; justify-content:center; padding:0 0 var(--jb-sp-5); }
  .jb-checkgrid, .jb-checkgrid--4{ grid-template-columns:repeat(2,minmax(0,1fr)); }
  .jb-subhead__title{ font-size:var(--jb-fs-h4); }
  .jb-policycard--media{ flex-direction:column; }
  /* D303 ① — 세로 배치에서는 가로를 꽉 채운 배너형이다.
     🔴 height 고정을 «풀어야» 비율(aspect-ratio)이 산다 — 140px 이 남으면 납작해진다. */
  .jb-policycard__thumb{ width:100%; height:auto; align-self:auto; }
  .jb-viewtools__status{ margin-left:0; width:100%; }
}

/* ══════════════════════════════════════════════════════════════════════
   AI 서비스 컴포넌트  (page-main.css 에서 승격 · 2026-09-04)
   ----------------------------------------------------------------------
   메인·마이페이지·AI 화면 공용. 섹션 배치(.jb-airdy / __lead / .jb-reco__grid)는
   page-main.css 에 남겨 두고 규격만 여기로 옮겼다.
   ★ 도넛은 CSS conic-gradient — style="--jb-rate:93" 으로 값을 주입한다.
   ⚠ 입력완료율·"추천 가능"·부족항목의 산출 규칙은 미정의(R24). 확정 전까지 표기값은 예시다.
   ══════════════════════════════════════════════════════════════════════ */
.jb-airdy__box { padding:31px; border:1px solid var(--jb-border-weak); border-radius:var(--jb-r-card); background:var(--jb-surface); }
.jb-airdy__head{ display:flex; align-items:center; gap:30px; min-height:100px; margin-bottom:26px; }
.jb-airdy__txt { display:flex; flex-direction:column; align-items:flex-start; min-width:0; }
.jb-airdy__title{ margin:12px 0 0; font-weight:var(--jb-fw-bold); font-size:var(--jb-fs-lg); line-height:var(--jb-lh-tight); letter-spacing:-.4px; color:var(--jb-ink); }
.jb-airdy__desc { margin:10px 0 0; font-size:var(--jb-fs-base); line-height:var(--jb-lh-tight); letter-spacing:-.16px; color:var(--jb-muted); }
.jb-airdy__foot { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:20px; }
.jb-airdy__item { display:flex; flex-direction:column; min-height:127px; padding:16px 20px 22px; border:1px solid var(--jb-border); border-radius:var(--jb-r-box); }
.jb-airdy__row  { display:flex; align-items:center; justify-content:space-between; gap:12px; min-height:30px; margin-bottom:8px; }
.jb-airdy__state{ font-size:var(--jb-fs-sm); line-height:18px; color:var(--jb-muted-weak); }
.jb-airdy__state--todo{ color:var(--jb-danger); }
.jb-airdy__name { display:block; margin-bottom:8px; font-weight:var(--jb-fw-bold); font-size:var(--jb-fs-md); line-height:23px; color:var(--jb-ink); }
.jb-airdy__meta { display:flex; align-items:center; font-size:var(--jb-fs-sm); line-height:18px; color:var(--jb-muted); }
/* ▼ UI2026-IT3 ③ D313 — dev 전용 보조 요소(정본에 없는 상태에서만 쓴다 · 종전 aiMatchBanner.jsp <style> 의 .aimb_chips · .aimb_actions 를 옮겼다)
     · .jb-airdy__chips   = 기준 미선택(needsResumeChoice) 상태의 보조 태그 행(.jb-chips 와 함께)
     · .jb-airdy__actions = 준비 완료 · 이력서 미등록 · 기준 미선택 · 조회 실패의 상단 CTA(head 의 마지막 칸 · 오른쪽 끝) */
.jb-airdy__chips  { margin-top:10px; gap:6px; }
.jb-airdy__actions{ flex:0 0 auto; display:flex; flex-direction:column; gap:10px; margin-left:auto; }
@media (max-width:900px){ .jb-airdy__actions{ margin-left:0; flex-direction:row; } }
.jb-airdy__meta b{ font-weight:var(--jb-fw-bold); color:var(--jb-inverse); }
.jb-airdy__meta i{ width:1px; height:12px; margin:0 10px; background:var(--jb-border); }
.jb-reco-card{ display:flex; flex-direction:column; align-items:flex-start; min-height:229px; padding:40px; border-radius:var(--jb-r-card);
  background:var(--jb-bg-section); text-decoration:none; transition:box-shadow var(--jb-dur-base) var(--jb-ease); }
.jb-reco-card:hover{ box-shadow:var(--jb-shadow-hover); }
.jb-reco-card__txt  { display:block; margin-top:20px; }
.jb-reco-card__title{ margin:0; font-weight:var(--jb-fw-bold); font-size:var(--jb-fs-lg); line-height:var(--jb-lh-tight); letter-spacing:-.4px; color:var(--jb-ink);
  /* 🔴 2026-09-25 D222 — 제목은 «2줄»까지. 넘치면 말줄임.
     정본 표본 제목이 짧아 안 드러났으나 실데이터는 3줄을 넘겨 카드 높이가 제각각이 된다. */
  display:-webkit-box; -webkit-box-orient:vertical; -webkit-line-clamp:2; line-clamp:2; overflow:hidden; }
.jb-reco-card__meta { display:block; margin-top:10px; font-size:var(--jb-fs-base); line-height:1.5; color:var(--jb-muted); }
.jb-reco-card__meta b{ font-weight:var(--jb-fw-medium); color:var(--jb-inverse); }
/* ── Policy card info (dt·dd 한 줄 쌍) ────────────────────────────────
   🔴 2026-09-27 D258 — page-list.css 에서 «옮겨 왔다». 정본 components.css:513~517 과 같은 자리다.
   두 화면군이 쓴다 — 목록(12·13·14 등)과 «메인 취업교육 카드»(D252).
   메인은 page-list.css 를 부르지 않아 거기 있으면 `> div{display:flex}` 가 안 먹는다. */
.jb-polcard__info{ margin:0; font-size:var(--jb-fs-xs); }
.jb-polcard__info > div{ display:flex; gap:6px; margin-top:5px; min-width:0; }
.jb-polcard__info dt{ flex:none; font-weight:var(--jb-fw-bold); color:var(--jb-body); }
.jb-polcard__info dt::after{ content:" :"; }
.jb-polcard__info dd{ margin:0; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; color:var(--jb-muted); }

.jb-reco-card__match{ display:block; margin-top:20px; font-weight:var(--jb-fw-semibold); font-size:var(--jb-fs-sm); line-height:1.5; letter-spacing:-.14px; color:var(--jb-inverse); }

/* ── Resume pick (매칭 기준 이력서 선택 · AI 개편 신규) ──────────────────
   개발서버에만 있는 화면 요소. 이력서 여러 벌 중 AI 매칭 기준이 될 1벌을 고른다.
   ⚠ % 값(입력완료율)의 산출 규칙이 미정의(R24) — 확정 전까지 표기값은 예시다. */
.jb-resumepick{ display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:var(--jb-gap-grid); }
.jb-resumepick__card{ display:flex; flex-direction:column; align-items:flex-start; gap:var(--jb-sp-2);
  padding:var(--jb-sp-5); border:1px solid var(--jb-border); border-radius:var(--jb-r-card);
  background:var(--jb-surface); font:inherit; text-align:left; cursor:pointer;
  transition:border-color var(--jb-dur-fast) var(--jb-ease), background var(--jb-dur-fast) var(--jb-ease); }
.jb-resumepick__card:hover{ border-color:var(--jb-brand); }
.jb-resumepick__card[aria-pressed="true"]{ border-color:var(--jb-brand); background:var(--jb-brand-weak); }
.jb-resumepick__top{ display:flex; align-items:center; justify-content:space-between; gap:var(--jb-sp-3); width:100%; }
.jb-resumepick__rate{ font-family:var(--jb-font-display); font-weight:var(--jb-fw-bold);
  font-size:var(--jb-fs-h4); line-height:1; color:var(--jb-brand); }
/* D83 ⑨ — 완료율 미산정 이력서는 숫자 대신 「보완 필요」를 낸다. 정본 mypage.html 에는 없는 상태다
   (종전 `.aimb_card_rate.is_warn`). 글자가 길어지므로 크기를 한 단계 낮춴 카드 폭을 안 넘게 한다. */
.jb-resumepick__rate.is-warn{ font-size:var(--jb-fs-base); color:var(--jb-danger); }
.jb-resumepick__flag{ font-style:normal; font-size:var(--jb-fs-xs); color:var(--jb-muted); }
.jb-resumepick__card[aria-pressed="true"] .jb-resumepick__flag{ font-weight:var(--jb-fw-semibold); color:var(--jb-brand-deep); }
.jb-resumepick__name{ font-family:var(--jb-font-display); font-weight:var(--jb-fw-semibold);
  font-size:var(--jb-fs-base); line-height:1.45; color:var(--jb-ink); }
.jb-resumepick__date{ font-size:var(--jb-fs-xs); color:var(--jb-muted); }
/* 🔴 2026-09-27 D273 — 「이력서 더보기」 자리(정본 components.css:1181 과 같은 값).
   7벌 이상일 때만 낸다 — 6벌 이하에서는 aiMatchBanner.jsp 가 [hidden] 을 준다
   (base.css 의 전역 `[class^="jb-"][hidden]{display:none!important}` 가 이 display:flex 를 이긴다 · D268). */
.jb-resumepick__more{ display:flex; justify-content:center; margin-top:var(--jb-sp-5); }

@media (max-width:768px){
  .jb-resumepick{ grid-template-columns:1fr; }
}

/* AI 매칭 준비도 — 좁은 화면 (원본 page-main.css 의 900px 전환점 유지) */
@media (max-width:900px){
  .jb-airdy__box{ padding:20px; }
  .jb-airdy__head{ flex-direction:column; align-items:flex-start; gap:16px; }
  .jb-airdy__foot{ grid-template-columns:1fr; }
}

/* ══════════════════════════════════════════════════════════════════════
   AI 서비스 (트랙 A) — 개발서버 dev-jobaba 실측 구성을 디자인시스템으로 재작성
   ────────────────────────────────────────────────────────────────────
   근거 : 개발팀 「퍼블-구현-갭-및-디자인계획.md §0」 — "구성·배치는 퍼블 / 색·버튼·타이포는 라이브".
          퍼블 원본(start_pkg/publishing)은 Tailwind CDN 유틸리티 의존이라 이식 불가로 폐기됐고,
          라이브 CSS 로 재구현된 개발서버 화면이 구성의 정본이다.
   색상 : 라이브 기준색 #38bab2 → 디자인시스템 Primary #00AAA5(--jb-brand) 로 승계.
          #38bab2 는 --jb-brand-light 로만 남아 게이지·프로그레스 채움에 쓴다.
   대조 : ai_rec_* → .jb-airec  /  rl-* → .jb-rlist  /  ai_entry → .jb-aientry
          aiws_* (워크스페이스) 는 B등급 — 실 개발 시 동시 퍼블 (res_* 시스템 종속)
   ══════════════════════════════════════════════════════════════════════ */

/* ── 아이콘 추가분 (AI 트랙) ─────────────────────────────────────────── */
.jb-ico--sparkles{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M11 3.5l1.7 4.3 4.3 1.7-4.3 1.7L11 15.5 9.3 11.2 5 9.5l4.3-1.7z' fill='%23000' fill-opacity='0.15'/%3E%3Cpath d='M18 14l.8 2 2 .8-2 .8-.8 2-.8-2-2-.8 2-.8z'/%3E%3C/svg%3E"); }
.jb-ico--refresh{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20.5 12a8.5 8.5 0 1 1-2.5-6' fill='%23000' fill-opacity='0.15'/%3E%3Cpath d='M20.5 3.5v5h-5'/%3E%3C/svg%3E"); }
.jb-ico--file-edit{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M13.5 2.5H7A2 2 0 0 0 5 4.5v15a2 2 0 0 0 2 2h5' fill='%23000' fill-opacity='0.15'/%3E%3Cpath d='M13.5 2.5L19 8v3'/%3E%3Cpath d='M13.5 2.5V8H19'/%3E%3Cpath d='M18.5 13.5l2.5 2.5-4.5 4.5H14v-2.5z'/%3E%3C/svg%3E"); }
.jb-ico--file-user{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M13.5 2.5H7A2 2 0 0 0 5 4.5v15a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8z' fill='%23000' fill-opacity='0.15'/%3E%3Cpath d='M13.5 2.5V8H19'/%3E%3Ccircle cx='12' cy='13' r='2'/%3E%3Cpath d='M9 18.2a3 3 0 0 1 6 0'/%3E%3C/svg%3E"); }
.jb-ico--file-plus{ --jb-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M13.5 2.5H7A2 2 0 0 0 5 4.5v15a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8z' fill='%23000' fill-opacity='0.15'/%3E%3Cpath d='M13.5 2.5V8H19'/%3E%3Cpath d='M12 11.5v6M9 14.5h6'/%3E%3C/svg%3E"); }

/* ── AI 진입 배너 (ai_entry) ─────────────────────────────────────────
   이력서 관리 최상단. AI 이력서 작성 워크스페이스(B등급)로 보내는 유일한 입구. */
.jb-aientry{ display:flex; align-items:center; justify-content:space-between; gap:var(--jb-sp-7);
  padding:30px 40px; border:1px solid var(--jb-brand-soft); border-radius:var(--jb-r-card);
  background:var(--jb-brand-weak); }
.jb-aientry__main{ min-width:0; }
.jb-aientry__badge{ display:inline-flex; align-items:center; height:24px; padding:0 10px;
  border-radius:var(--jb-r-pill); background:var(--jb-brand); color:var(--jb-on-brand);
  font-family:var(--jb-font-display); font-weight:var(--jb-fw-bold); font-size:var(--jb-fs-2xs); line-height:1; }
.jb-aientry__title{ margin:14px 0 0; font-family:var(--jb-font-display); font-weight:var(--jb-fw-bold);
  font-size:var(--jb-fs-lg); line-height:var(--jb-lh-tight); color:var(--jb-ink); }
.jb-aientry__desc{ margin:10px 0 0; font-size:var(--jb-fs-sm); line-height:1.6; color:var(--jb-muted); }
.jb-aientry__acts{ margin-top:var(--jb-sp-5); }
.jb-aientry__art{ flex:none; width:180px; }
.jb-aientry__art img{ display:block; width:100%; }

/* ── 기준(대표) 이력서 스트립 (ai_rec_strip · rl-strip) ───────────────
   이력서 관리 · 맞춤공고추천 두 화면 공용. 매칭 기준이 무엇인지 항상 상단에 고정 노출한다. */
.jb-airesume{ display:flex; align-items:center; justify-content:space-between; gap:var(--jb-sp-5); flex-wrap:wrap;
  padding:24px 30px; border:1px solid var(--jb-border); border-radius:var(--jb-r-card); background:var(--jb-surface); }
.jb-airesume__main{ min-width:0; }
.jb-airesume__tags{ display:flex; align-items:center; gap:var(--jb-sp-2); margin:0; }
.jb-airesume__title{ display:block; margin-top:var(--jb-sp-3);
  font-family:var(--jb-font-display); font-weight:var(--jb-fw-bold); font-size:var(--jb-fs-md);
  line-height:var(--jb-lh-tight); color:var(--jb-ink); }
.jb-airesume__meta{ margin:var(--jb-sp-2) 0 0; font-size:var(--jb-fs-sm); line-height:1.6; color:var(--jb-muted); }

/* ── 보완 안내바 (ai_rec_miss_bar) ──────────────────────────────────
   부족항목이 있을 때만 노출. 없으면 서버가 통째로 렌더하지 않는다(hidden). */
.jb-aifix{ display:flex; align-items:center; justify-content:space-between; gap:var(--jb-sp-4); flex-wrap:wrap;
  padding:14px 20px; border:1px solid var(--jb-warning-weak); border-radius:var(--jb-r-box);
  background:var(--jb-warning-weak); }
.jb-aifix__hint{ font-size:var(--jb-fs-sm); line-height:1.6; color:var(--jb-warning-ink); }
.jb-aifix__hint b{ font-weight:var(--jb-fw-bold); }

/* ── AI 추천 카드 (ai_rec_card) ─────────────────────────────────────
   🔴 2026-09-24 D189 (사용자 지시) — «2열». 종전 주석 「운영 확정 : 1열 리스트」는 폐기한다.
      (퍼블 시안의 3열 카드 · 도넛이 폐기된 것은 그대로다 — 3열이 아니라 2열이다.)
   ⚠️ 900 이하에서는 1열로 접는다 — 2열을 유지하면 카드가 좁아 제목이 여러 줄로 감긴다. */
.jb-airec{ display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:var(--jb-sp-3); margin:0; padding:0; list-style:none; }
@media (max-width:900px){ .jb-airec{ grid-template-columns:1fr; } }
.jb-airec__card{ display:flex; flex-direction:column; gap:var(--jb-sp-3); padding:var(--jb-sp-5) var(--jb-sp-6);
  border:1px solid var(--jb-border); border-radius:var(--jb-r-card); background:var(--jb-surface);
  transition:border-color var(--jb-dur-fast) var(--jb-ease), box-shadow var(--jb-dur-fast) var(--jb-ease); }
.jb-airec__card:hover{ border-color:var(--jb-brand); box-shadow:var(--jb-shadow-hover); }
.jb-airec__top{ display:flex; align-items:center; gap:var(--jb-sp-2); }
.jb-airec__src{ display:inline-flex; align-items:center; height:22px; padding:0 var(--jb-sp-3);
  border:1px solid var(--jb-border); border-radius:var(--jb-r-pill);
  font-size:var(--jb-fs-2xs); font-weight:var(--jb-fw-semibold); line-height:1; color:var(--jb-muted); }
.jb-airec__src--pub{ border-color:var(--jb-brand); color:var(--jb-brand); }
/* 2026-09-18 — 정본엔 `--pub` 하나뿐이라 민간·잡아바가 같은 회색이 된다.
   종전(JOBAIF-04 · 2026-08-20)은 「공공 파랑 / 민간 주황 / 잡아바 초록」으로 **색으로 출처를 갈랐다.**
   민간은 지원 경로가 외부 사이트로 나가므로 카드에서 바로 가려져야 한다 — 정본 «누락» 으로 보고 되살렸다.
   ⚠️ 종전은 «채움» 배지였지만 정본이 «아웃라인» 으로 바꿈 — 색만 가져오고 형태는 정본을 따른다. 리터럴 없이 토큰으로. */
.jb-airec__src--prv{ border-color:var(--jb-warning-ink); color:var(--jb-warning-ink); }
/* 잡아바는 «채움» 이다(D86) — 색을 하나 더 만들지 않고 «형태» 로 가른다.
   실측 — 공공 `--jb-brand` 색상각 178° ↔ 잡아바 `--jb-success` 176° 로 **차이가 2°**다.
   아웃라인 배지끼리 나란히 놓이면 같은 색으로 읽혀 색 구분의 취지가 무너진다.
   → 공공=아웃라인 청록 · 민간=아웃라인 주황 · 잡아바=**채움 청록**. 「우리 공고」를 채움으로 두는 것은 의미상도 맞는다. */
.jb-airec__src--unt{ border-color:var(--jb-brand); background:var(--jb-brand); color:var(--jb-on-brand); }
.jb-airec__pct{ margin-left:auto; font-family:var(--jb-font-display); font-weight:var(--jb-fw-bold);
  font-size:var(--jb-fs-md); line-height:1; color:var(--jb-brand); }
.jb-airec__title{ display:block; font-family:var(--jb-font-display); font-weight:var(--jb-fw-semibold);
  font-size:var(--jb-fs-lg); line-height:var(--jb-lh-tight); color:var(--jb-ink); text-decoration:none; }
.jb-airec__title:hover{ color:var(--jb-brand); text-decoration:underline; }
.jb-airec__org{ display:flex; align-items:center; gap:var(--jb-sp-3);
  font-size:var(--jb-fs-sm); line-height:1; color:var(--jb-muted); }
.jb-airec__org b{ font-weight:var(--jb-fw-medium); color:var(--jb-inverse); }
.jb-airec__reason{ display:flex; align-items:flex-start; gap:var(--jb-sp-2); flex-wrap:wrap;
  padding:var(--jb-sp-3) var(--jb-sp-4); border-radius:var(--jb-r-btn); background:var(--jb-bg-section);
  font-size:var(--jb-fs-sm); line-height:1.5; color:var(--jb-inverse); }
.jb-airec__reason b{ flex:none; font-weight:var(--jb-fw-semibold); color:var(--jb-brand-deep); }
.jb-airec__foot{ display:flex; align-items:center; justify-content:flex-end; }

/* ── 이력서 표 (rl-table) ───────────────────────────────────────────
   ★ 표 구조·열 구성은 개발서버 그대로 두고 마크업만 교체한다(개발 무수정 이관). */
.jb-rate{ display:flex; flex-direction:column; align-items:center; gap:var(--jb-sp-2); }
.jb-rate__top{ display:flex; align-items:center; gap:var(--jb-sp-2); }
.jb-rate__num{ font-family:var(--jb-font-display); font-weight:var(--jb-fw-bold);
  font-size:var(--jb-fs-base); line-height:1; color:var(--jb-brand); }
.jb-rate__num--low{ color:var(--jb-danger); }
.jb-lack{ display:inline-flex; align-items:center; gap:var(--jb-sp-2); flex-wrap:wrap; justify-content:center; }
.jb-lack__chip{ display:inline-flex; align-items:center; height:26px; padding:0 var(--jb-sp-3);
  border:1px solid var(--jb-border); border-radius:var(--jb-r-pill); background:var(--jb-surface);
  font-family:var(--jb-font-body); font-size:var(--jb-fs-xs); line-height:1; color:var(--jb-muted);
  text-decoration:none; cursor:pointer; transition:border-color var(--jb-dur-fast) var(--jb-ease); }
.jb-lack__chip:hover{ border-color:var(--jb-brand); color:var(--jb-brand); }
.jb-lack__none{ font-size:var(--jb-fs-sm); color:var(--jb-disabled); }
.jb-rlist__title{ display:inline-block; text-decoration:none; }
.jb-rlist__title strong{ display:block; font-family:var(--jb-font-display); font-weight:var(--jb-fw-semibold);
  font-size:var(--jb-fs-base); line-height:1.45; color:var(--jb-ink); }
.jb-rlist__title span{ display:block; margin-top:var(--jb-sp-1); font-size:var(--jb-fs-xs); color:var(--jb-muted); }
.jb-rlist__title:hover strong{ color:var(--jb-brand); text-decoration:underline; }
.jb-rlist__rep{ font-weight:var(--jb-fw-semibold); font-size:var(--jb-fs-sm); color:var(--jb-brand); }

/* ── 로딩 오버레이 (ai_rec_loading) ─────────────────────────────────
   추천 결과는 BE 가 산정해 내려준다. 산정 대기 동안만 노출한다. */
.jb-loading{ display:flex; flex-direction:column; align-items:center; justify-content:center; gap:var(--jb-sp-4);
  min-height:220px; border:1px solid var(--jb-border); border-radius:var(--jb-r-card); background:var(--jb-surface); }
.jb-loading__spin{ width:36px; height:36px; border:3px solid var(--jb-border-weak); border-top-color:var(--jb-brand);
  border-radius:50%; animation:jb-spin .8s linear infinite; }
.jb-loading__t{ margin:0; font-family:var(--jb-font-display); font-weight:var(--jb-fw-semibold);
  font-size:var(--jb-fs-base); color:var(--jb-ink); }
.jb-loading__s{ margin:0; font-size:var(--jb-fs-sm); color:var(--jb-muted); }
@keyframes jb-spin{ to{ transform:rotate(360deg); } }

@media (max-width:900px){
  .jb-aientry{ flex-direction:column; align-items:flex-start; gap:var(--jb-sp-5); padding:24px 20px; }
  .jb-aientry__art{ display:none; }
  .jb-airesume{ padding:20px; }
  .jb-airec__card{ padding:20px; }
  .jb-airec__top{ flex-wrap:wrap; }
  .jb-airec__pct{ margin-left:0; }
}

/* 안내 문단 여백을 명시한다 (2026-09-18 D122 · QA E14 · E18) — 정본은 `<p>` 브라우저 기본 여백(1em)에 기대고 있어
   운영 리셋 `p{margin:0}` 이 걸린 dev 에서만 0 이 됐다. 값은 정본 렌더 그대로(1em = 14px). */
p.jb-notice{ margin-block:1em; }

/* AI 트랙 화면 흐름 간격 — 유틸리티 클래스를 쓰지 않고 인접 조합으로 고정한다 */
.jb-aientry + .jb-mysec__head{ margin-top:var(--jb-sp-7); }
.jb-notice + .jb-notice{ margin-top:var(--jb-sp-4); }   /* 공고추천 0건 안내가 상단 안내에 붙지 않게 (E14) */
.jb-airesume + .jb-notice,
.jb-notice + .jb-airesume,                               /* AI 추천 — 안내 → 이력서 선택 (E18 · 빠져 있었다) */
.jb-notice + .jb-tablewrap,
.jb-tablewrap + .jb-notice,
.jb-empty + .jb-notice,                                  /* 표 → (숨은 빈 상태) → 안내 — `+` 가 빈 상태에 막혔다 (E18) */
.jb-airesume + .jb-aifix,
.jb-aifix + .jb-resulthead,
.jb-airesume + .jb-resulthead,
/* 2026-09-18 — 안내바와 표 «사이에 패널 래퍼가 끼는» 화면이 있다(통합접수 최근 신청현황 —
   정본도 `div[role=tabpanel]` 을 끼운다). 그러면 위 인접 규칙이 발화하지 않아 간격이 0 이 된다.
   ⚠️ 퍼블에서는 브라우저 기본 `<p>` 마진(14px)이 그 자리를 메우지만 dev 는 운영 리셋이 `p{margin:0}` 이라
      **안내 박스가 표의 2px 검정선에 붙는다**(실측 0px). */
.jb-notice + [data-tabpanel] > .jb-tablewrap{ margin-top:var(--jb-sp-5); }

/* ══ 2026-09-17 단위테스트 04-14 — 모바일 하단 «고정 액션 바» (D59) ═══════════
   정본 = design/css/components.css (2026-09-17 CHANGELOG 「모바일 하단 고정 액션 바」)
   목록 화면에서 조건을 고른 뒤 실행하는 바. 화면 하단에 고정된다.
   ⚠️ 운영 레거시(`.pbj_m_bottom` · `.btn_pop_open`)를 그대로 두지 말고 이 규격으로 바꾼다.
   ⚠️ z-index 는 바텀시트 310 · 딤 305 보다 «아래»인 300 이다(04-15 지시). */
.jb-mobilebar{ position:fixed; left:0; right:0; bottom:0; z-index:var(--jb-z-mobilebar);
  display:flex; align-items:center; gap:var(--jb-sp-3);
  padding:var(--jb-sp-3) var(--jb-sp-4);
  padding-bottom:calc(var(--jb-sp-3) + env(safe-area-inset-bottom, 0px));  /* 홈 인디케이터 회피 */
  background:var(--jb-surface); border-top:1px solid var(--jb-border); }
/* 바는 fixed 라 페이지 맨 아래 콘텐츠(더보기 버튼 · 푸터 첫 줄)를 상시 가린다.
   바가 뜨는 구간에서만 문서 아래에 바 높이만큼 여백을 준다(실측 바 h=69). */
@media (max-width:1260px){   /* D122 — 바 노출 구간(≤1260)과 같게 */
  body:has(.jb-mobilebar){ padding-bottom:calc(69px + env(safe-area-inset-bottom, 0px)); }
}
.jb-mobilebar__reset{ flex:none; }                       /* 좌측 초기화 — .jb-iconbtn 을 쓴다 */
.jb-mobilebar__submit{ flex:1 1 auto; height:48px;       /* 주 실행 버튼 — 브랜드색 */
  border:0; border-radius:var(--jb-r-btn); background:var(--jb-brand); color:var(--jb-on-brand);
  font-family:var(--jb-font-display); font-weight:var(--jb-fw-semibold); font-size:var(--jb-fs-base); cursor:pointer; }
.jb-mobilebar__submit:hover{ background:var(--jb-brand-hover); }
/* D71(2026-09-17) — 채팅 위젯 회피는 **CSS 로 못 한다.** 규칙을 뺐다.
   `#ch-plugin` 은 `position:relative; height:0` 껍데기이고 **실제 런처는 shadow DOM 안**이라
   (`div.Launcherstyled__LauncherButtonWrapper…` · `position:fixed; bottom:24px`) 바깥 CSS 가 닿지 않는다.
   ⚠️ 효과 없는 규칙을 남기면 「해결된 것처럼」 보여 더 위험하다 → **JS(ChannelIO API)로 처리**한다.
      `fn_JbChatBtn(show)` — `default_bottom.jsp` 가 띄우는 전역 `ChannelIO` 의
      `showChannelButton` / `hideChannelButton` 을 쓴다(하단 바·바텀시트가 뜨는 동안 숨긴다). */
/* 노출 구간 ≤1260 (2026-09-18 D122 — D74 정정) — 시트는 ≤1260 에서 뜨는데(D60) 바가 ≤900 에만 있어
   901~1260 에서는 시트를 «여는 곳»이 없었다(D74 는 「실행은 시트 안 버튼이 한다」만 보고 진입점을 놓쳤다).
   시트가 열리면 JS 가 바를 hidden 으로 숨기므로 둘이 동시에 뜨지 않는다. */
@media (min-width:1261px){ .jb-mobilebar{ display:none; } }
/* 시트가 열려 바를 숨길 때 (2026-09-18 D135) — 바가 `.jb-root` «밖»(body 직속)에 놓이면 base.css 의 `.jb-root [class^="jb-"][hidden]` 이 안 걸려
   `hidden` 을 줘도 display:flex 로 남는다(포커스 · 스크린리더에 남음 · dev 06 실측). 바 자체에 규칙을 둬 어디에 놓이든 숨는다. */
.jb-mobilebar[hidden]{ display:none; }


/* ══ 접기 영역 (2026-09-18 · D88) ═══════════════════════════════════════════
   길어서 화면을 밀어내는 요약 블록을 접을 수 있게 한다.
   <details class="jb-fold" open> + <summary class="jb-fold__bar"> · JS 없이 동작한다.

   ★ 버튼을 카드 «위로 띄우지 않는다»(absolute 금지) — 안쪽 우측에 흐름대로 둔다.
   ★ 닫히면 «요약»이 그 자리에 남는다 — 진행바 + % + 한 줄 문구.
     접었다는 이유로 «상태 자체»가 사라지면 안 된다(사용자 확정).
   ★ 닫혔을 때도 테두리가 남아 블록이 거기 있다는 것이 보인다. */
.jb-fold{ position:relative; margin-top:var(--jb-sp-5); }

/* 열림 — 버튼을 «카드 안쪽» 우측 상단에 얹는다.
   .jb-fold 가 카드와 같은 폭이므로(바깥 .jb-container 가 좌우 여백을 맡는다)
   right:20px 이 곧 카드 안쪽 20px 이다. 반응형에서 컨테이너 여백이 바뀌어도 어긋나지 않는다. */
.jb-fold[open] .jb-fold__bar{ position:absolute; top:var(--jb-sp-5); right:var(--jb-sp-5); z-index:1;
  padding:0; border:0; background:none; }

.jb-fold__bar{ display:flex; align-items:center; justify-content:flex-end; gap:var(--jb-sp-4);
  padding:var(--jb-sp-3) var(--jb-sp-5); border:1px solid transparent; border-radius:var(--jb-r-card);
  list-style:none; cursor:pointer;
  transition:background var(--jb-dur-fast) var(--jb-ease), border-color var(--jb-dur-fast) var(--jb-ease); }
.jb-fold__bar::-webkit-details-marker{ display:none; }

/* 닫힘 — 카드 테두리를 입고 요약을 보여 준다 */
.jb-fold:not([open]) .jb-fold__bar{ border-color:var(--jb-border); background:var(--jb-surface); }
.jb-fold:not([open]) .jb-fold__bar:hover{ border-color:var(--jb-brand); }

/* 요약 — 닫혔을 때만. 남는 폭을 다 쓰고 진행바가 그 안에서 늘어난다 */
.jb-fold__peek{ display:none; flex:1; min-width:0; align-items:center; justify-content:flex-start;
  gap:var(--jb-sp-3); font-size:var(--jb-fs-sm); color:var(--jb-body); }
.jb-fold:not([open]) .jb-fold__peek{ display:flex; }
/* 고정폭 — 늘어나게 두면 뒤 문구가 우측으로 밀려 「우측 표시」처럼 보인다 */
.jb-fold__track{ flex:none; width:78px; height:6px; border-radius:var(--jb-r-pill);
  background:var(--jb-bg-subtle); overflow:hidden; }
.jb-fold__track > i{ display:block; height:100%; border-radius:inherit; background:var(--jb-brand); }
.jb-fold__pct{ flex:none; font-family:var(--jb-font-display); font-weight:var(--jb-fw-bold);
  font-size:var(--jb-fs-base); color:var(--jb-brand); }
.jb-fold__label{ flex:0 1 auto; min-width:0; overflow:hidden; white-space:nowrap; text-overflow:ellipsis; }

/* 아이콘 버튼 — 열림·닫힘 모두 우측 끝 */
.jb-fold__ico{ flex:none; display:inline-flex; align-items:center; justify-content:center;
  width:32px; height:32px; border:1px solid var(--jb-border); border-radius:var(--jb-r-pill);
  background:var(--jb-surface); color:var(--jb-muted);
  transition:color var(--jb-dur-fast) var(--jb-ease), border-color var(--jb-dur-fast) var(--jb-ease); }
.jb-fold__bar:hover .jb-fold__ico{ border-color:var(--jb-brand); color:var(--jb-brand); }
.jb-fold__ico .jb-ico{ width:16px; height:16px; transition:transform var(--jb-dur-fast) var(--jb-ease); }
.jb-fold[open] .jb-fold__ico .jb-ico{ transform:rotate(180deg); }

/* 바로 아래 첫 블록은 바와 붙여 둔다(바가 곧 그 블록의 머리다) */
.jb-fold > .jb-mysec:first-of-type{ margin-top:0; }

@media (max-width:768px){
  .jb-fold__label{ display:none; }        /* 좁으면 진행바와 %만 남긴다 */
}
@media (prefers-reduced-motion:reduce){
  .jb-fold__bar, .jb-fold__ico, .jb-fold__ico .jb-ico{ transition:none; }
}

/* ══ 유형 구분 «격자 탭» (2026-09-18 · D88) ═══════════════════════════════
   관심·알림 목록의 콘텐츠 유형(일자리지원사업 · 취업교육 …)을 고르는 자리.
   ★ 칩(라운딩 버튼)으로 내지 않는다 — 항목이 8~9개라 칩으로 흘리면 줄이 들쭉날쭉하고
     「고르는 축」이 아니라 「걸린 조건」처럼 보인다. 격자 탭이 프로토타입 규격이다(사용자 확정).
   구조 : <div class="jb-catetabs" role="tablist"> + <button aria-selected>
   선 처리 — 바깥 위/왼쪽은 컨테이너가, 각 칸의 오른쪽/아래는 버튼이 그린다(겹선 방지). */
.jb-catetabs{ display:grid; grid-template-columns:repeat(4, minmax(0,1fr));
  margin-bottom:var(--jb-sp-5); border-top:1px solid var(--jb-ink); border-left:1px solid var(--jb-border); }
.jb-catetabs--5{ grid-template-columns:repeat(5, minmax(0,1fr)); }
.jb-catetabs > button{ min-height:50px; padding:10px 8px; border:0;
  border-right:1px solid var(--jb-border); border-bottom:1px solid var(--jb-border);
  background:var(--jb-bg-subtle); color:var(--jb-body);
  font-family:inherit; font-size:var(--jb-fs-xs); cursor:pointer; }
.jb-catetabs > button:hover{ background:var(--jb-bg-hover); }
/* 선택 — 면을 흰색으로 «들어올리고» 위쪽에 굵은 선을 얹는다(표 헤더와 같은 어법) */
.jb-catetabs > button[aria-selected="true"]{ position:relative; background:var(--jb-surface);
  color:var(--jb-ink); font-weight:var(--jb-fw-bold); box-shadow:inset 0 2px 0 var(--jb-ink); }
@media (max-width:768px){
  .jb-catetabs, .jb-catetabs--5{ grid-template-columns:repeat(2, minmax(0,1fr)); }
}

/* 목록 위 도구 줄 (개수 선택 등) — 우측 정렬 */
.jb-listtools{ display:flex; align-items:center; justify-content:flex-end; gap:var(--jb-sp-2);
  margin-bottom:var(--jb-sp-3); font-size:var(--jb-fs-sm); color:var(--jb-muted); }
.jb-listtools .jb-select{ width:auto; min-width:128px; }


/* ── 2026-09-18 D123 18 유지 블록 ── */
/* 18 마이페이지에서 «운영 기능이라 남긴» 블록을 정본에 올리면서 필요해진 규격만 모은다(D123 ⑤).

   ① 격자 탭 «링크형» — 하위 메뉴가 «다른 화면으로 이동»하는 자리(취업진단 5종 · 비대면 취업지원 3종).
      기존 .jb-catetabs 는 같은 화면 안에서 고르는 <button aria-selected> 만 그렸다.
      이동형은 <a aria-current="page"> 로 내고 모양은 버튼형과 «같게» 맞춘다(탭바 .jb-tabbar__item 과 같은 구분). */
/* ⚠️ box-sizing 을 직접 준다 — <a> 에는 jb- 클래스가 없어 base.css 의 border-box 가 닿지 않는다.
      button 은 UA 기본이 border-box 라 50 인데, 빠뜨리면 링크형만 71(50+패딩 20+선 1)이 된다(실측). */
.jb-catetabs > a{ box-sizing:border-box; display:flex; align-items:center; justify-content:center; min-height:50px; padding:10px 8px;
  border-right:1px solid var(--jb-border); border-bottom:1px solid var(--jb-border);
  background:var(--jb-bg-subtle); color:var(--jb-body); text-align:center; text-decoration:none;
  font-family:inherit; font-size:var(--jb-fs-xs); }
.jb-catetabs > a:hover{ background:var(--jb-bg-hover); }
.jb-catetabs > a[aria-current="page"]{ position:relative; background:var(--jb-surface);
  color:var(--jb-ink); font-weight:var(--jb-fw-bold); box-shadow:inset 0 2px 0 var(--jb-ink); }
/* 3칸 — 기본 4열에 3개를 넣으면 넷째 칸이 비어 윗선만 떠 보인다 */
.jb-catetabs--3{ grid-template-columns:repeat(3, minmax(0,1fr)); }
/* 탭바 바로 아래에 올 때 — 붙이면 탭바 밑줄과 격자 윗선이 겹쳐 두 줄로 보인다 */
.jb-tabbar + .jb-catetabs{ margin-top:var(--jb-sp-5); }
@media (max-width:768px){
  .jb-catetabs--3{ grid-template-columns:repeat(2, minmax(0,1fr)); }   /* 위 규칙이 기존 모바일 2열을 이기므로 다시 준다 */
}

/* ② 2열 정보 표(.jb-table--info)는 760 최소폭을 푼다 — 라벨 · 값 두 칸이라 좁은 화면에서도 접히며 읽힌다.
      가로 스크롤을 남기면 390 에서 값 칸이 화면 밖으로 밀린다(회원탈퇴 안내 표). */
.jb-tablewrap .jb-table--info{ min-width:0; }

/* ▼ 2026-09-18 D130 4-0 정본 동기화 */
@media print{ .jb-prose__scroll{ overflow:visible; } }   /* 인쇄 시 넓은 표 오른쪽 잘림 방지 (QA 4차 #17) */
/* 모달이 열린 동안 배경 스크롤 잠금 — 전 폭 (종전 is-drawer-open 은 ≤1260 에서만 잠겼다) */
body.is-modal-open{ overflow:hidden; }

/* ══════════════════════════════════════════════════════════════════════
   D317 (2026-09-28 사용자 지적) — «인라인 스타일»을 걷어낸 자리의 규칙
   ----------------------------------------------------------------------
   지적 = 「개발서버에 인라인 스타일을 넣은 게 좀 보이는데」
   🔴 원인은 «정본»이었다 — 확정 화면 퍼블에 style="" 가 83건 있었고, 개발은 「정본 1:1」대로 옮겼다.
   정리 원칙
     ㉠ 시각 스타일(여백·글자·색)  → 클래스 규칙으로 옮긴다
     ㉡ 표 열 폭 <col style>      → <col class="jb-col--wN">
     ㉢ 데이터 값(게이지·막대 %)   → 인라인 «허용» — 값이 데이터에서 온다. 단 방식은 --jb-rate «하나»로
     ㉣ 상태 토글 display:none    → hidden 속성(개발 쪽 · D268 로 [hidden] 이 jb- 부품에서도 확실히 먹는다)
   ➡️ 이제 정본에 남는 인라인은 «style="--jb-rate:N"» 뿐이다. 새로 style="" 을 쓰지 않는다.
   ══════════════════════════════════════════════════════════════════════ */

/* ㉡ 표 열 폭 — <col class="jb-col--wN"> (마이페이지 표 11벌이 쓴다) */
.jb-col--w68 { width:68px; }  .jb-col--w70 { width:70px; }  .jb-col--w80 { width:80px; }
.jb-col--w92 { width:92px; }  .jb-col--w96 { width:96px; }  .jb-col--w100{ width:100px; }
.jb-col--w104{ width:104px; } .jb-col--w110{ width:110px; } .jb-col--w120{ width:120px; }
.jb-col--w130{ width:130px; } .jb-col--w140{ width:140px; } .jb-col--w160{ width:160px; }
.jb-col--w200{ width:200px; } .jb-col--w260{ width:260px; }

/* ㉠ 셀렉트 폭 — 종전 `jb-select--w110` + style="width:150px" 로 «클래스와 인라인이 서로 달랐다»(실제 150) */
.jb-select--w150{ width:150px; flex:none; }

/* ㉠ 작은 소제목 — 17 중장년 패널의 「잡아바에서 바로 신청할 수 있어요」·「중장년 지원정책」 */
.jb-subhead--sm{ margin-bottom:var(--jb-sp-4); }
.jb-subhead--sm .jb-subhead__title{ font-size:var(--jb-fs-md); }

/* ㉠ 흐린 글자 */
.jb-text-muted{ color:var(--jb-muted); }

/* ㉠ 라디오 묶음 바로 뒤 안내 — 마이페이지 개인정보 수정 「구직상태를 변경하시면 …」 */
.jb-checkgroup + .jb-notice{ margin-top:var(--jb-sp-5); }

/* ㉢ 막대 두 종도 «--jb-rate» 로 — 종전 style="width:93%" (게이지는 이미 --jb-rate 였다) */
.jb-bar__fill,
.jb-fold__track > i{ width:calc(var(--jb-rate, 0) * 1%); }

/* ㉠ D317-② — 위아래 여백이 있는 안내 박스. 마이페이지 비밀번호 확인 게이트(indif/chkForm) 첫 안내
   종전 style="margin:16px 0" — 개편 커밋 9986567ff([UI2026 18])이 넣은 것이라 정리 대상이었다(정본 퍼블 없음).
   ⚠️ 셀렉터를 «두 클래스»로 둔다 — p.jb-notice{ margin-block:1em }(0,1,1)이 단일 클래스(0,1,0)를 이겨 14px 가 됐다(실측). */
.jb-notice.jb-notice--spaced{ margin:var(--jb-sp-4) 0; }
