/*
 * VOD 과정 상세(/courses/{courseNo}) 화면 전용.
 *
 * 목록(/courses)과 같은 다크 셸을 쓴다 — 레이아웃 껍데기(.catalog-layout / .catalog-shell /
 * .catalog-page / .catalog-menu-btn / .catalog-theme-toggle)는 css/vod/course-list.css 가 아니라
 * 이 화면도 함께 쓰는 값이라 거기 정의를 그대로 물려받지 않고, base-layout 이 두 파일을 함께
 * 로드하지는 않으므로 여기에 다시 둔다(화면 전용 CSS 는 서로를 참조하지 않는 것이 이 프로젝트 규약).
 *
 * 재사용 컴포넌트(.detail-hero / .detail-facts / .detail-cta / .curriculum /
 * .level-gauge / .wish-btn)는
 * theme/components.css 에 있고 전부 --mili-* 시맨틱 토큰을 쓰므로 <body class="mili-theme-dark"> 만으로
 * 다크로 재배색된다. 이 파일은 그 위에 얹는 화면 전용 블록(과정 소개·관련 스킬)과
 * 시안 고유의 다크 표면 마감만 담는다.
 *
 * 흰색 알파(rgba(255,255,255,.04) 등)는 브랜드 색이 아니라 시안이 지정한 표면 값이라
 * 토큰화하지 않고 그대로 둔다(home.css·course-list.css 상단 주석과 같은 방침).
 */

/* ===== 1) 본문 열 =====
   얼개는 theme/components.css §8 공용이다. 폭은 화면 CSS 가 아니라 셸이 정한다
   (design-system.md §7) — 이 화면은 shellWidth 를 넘기지 않으므로 기본값인
   Standard(--mili-content-standard, 1200px)를 그대로 쓴다. 2열 그리드가 이미 우측
   20rem 을 쓰므로 본문을 더 넓히면 읽기 줄이 길어진다 — 세로 여백만 이 파일 소관이다. */

.catalog-page {
	padding-block: 3rem 4rem;
}

.catalog-page--detail {
	padding-top: var(--mili-space-8);
}

/* ===== 1) 히어로 =====
   전면 재실측(get_design_context, node 2769:91248/91263/91269, 2026-08-27) — 이전 구현(난이도별
   그라디언트, coverImgAttachNo 있을 때만 사진)은 구조 자체가 틀렸다. 시안은 난이도와 무관하게
   **항상** 사진 카드(.detail-hero__cover) + 고정 다크 정보 카드(.detail-hero__info)의 2단 구성이다.
   PBL 상세(project-detail.jsp, 같은 날 별도 세션이 Figma node 2769:91849 기준으로 먼저 갱신)가
   이미 이 정확한 패턴(.detail-hero 공용 셸 + course-card__thumb--N 폴백)을 구현해 놓았다 —
   같은 디자인 시스템이라 클래스 이름·구조를 그대로 따르고(화면 전용 CSS 는 서로 참조하지 않는다는
   규약이라 값은 복제), VOD 고유의 배지 배치(타입 배지 좌상단 + 수강중 필·북마크 우상단)만 다르게 얹는다.

   .detail-hero 자체(min-height/padding/그라디언트 배경/::after 오버레이)는 theme/components.css
   §"과정명을 얹는 표지"의 공용 정의다 — 여기서는 그 낡은 단일 그라디언트 레이아웃을 무력화하고
   2단 구조로 다시 짠다(PBL 의 .detail-hero.pbl-card--* 무력화와 같은 방식). */
.detail-hero {
	display: block;
	min-height: 0;
	padding: 0;
	background: none;
	border: 1px solid rgba(255, 255, 255, 0.1);
}

.detail-hero::after {
	content: none;
}

/* 모바일(≤767px) — 2026-09-02 실측(node 3488:75109)에서는 표지가 기기 폭(390px)과 같아 뷰포트 끝까지
   번지고 반경도 없었다(각짐). 2026-09-21 디자인 수정 요청으로 화면 좌우 여백 12px·반경 12px 카드형이
   됐다. .app-page 가 폭으로 좌우 여백(--mili-page-padding)을 만들므로, 그 여백을 음수 마진으로
   상쇄한 뒤 12px 만 남긴다 — 페이지 여백 토큰이 바뀌어도 표지 여백은 12px 로 유지된다.
   overflow:hidden 은 components.css 의 .detail-hero 공용 정의가 이미 갖고 있어 자식(사진·정보 카드)
   모서리도 함께 둥글게 잘린다. */
@media (max-width: 767px) {
	.detail-hero {
		margin-inline: calc(var(--mili-page-padding) * -1 + 0.75rem);
		border-radius: var(--mili-radius-card);
		border: 0;
	}
}

/* ⚠️ 표지 내부 요소(cover/tag/bookmark/learners/info/eyebrow/title/summary/chips)의 모바일 값은
   여기 두지 않는다 — 그 base 규칙들이 이 지점보다 "뒤"(파일 하단, §9 모바일 미디어쿼리)에 있어서
   특정성이 같으면 소스 순서가 늦은 base 규칙이 이겨 버린다(실제로 이 실수로 aspect-ratio·배지
   위치가 전혀 안 먹힌 채 배포될 뻔했다 — 2026-09-02). 모바일 오버라이드는 반드시 base 규칙보다
   "뒤"에 와야 한다는 프로젝트 규칙(§9 도입부 주석, 홈 프로모 배너와 같은 교훈)을 여기서도 지켜
   파일 하단 §9 블록에 모아 둔다. */

/* 사진 카드 — 실표지(coverImgAttachNo) 또는 공용 배경 40장(course-card__thumb--N, PBL 상세와
   같은 자산) 중 하나가 항상 채운다. 852:360 은 Figma 프레임 실측 비율. */
.detail-hero__cover {
	position: relative;
	aspect-ratio: 852 / 360;
	overflow: hidden;
}

.detail-hero__cover-img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
	/* course-card__thumb--N 폴백은 <img> 가 아니라 <span> 이라 --card-bg 를 직접 그려야 한다
	   (PBL 의 .detail-hero__cover-img 와 같은 이유). */
	background-image: var(--card-bg, none);
	background-position: center;
	background-size: cover;
	background-color: var(--mili-slate-900);
}

/* 2026-09-08 — 실물 표지(<img>)는 기본 배경(<span>) 위에 덧씌운다(roadmap-detail-cover__img 와
   같은 방식). <img> 가 onerror 로 제거되면 아래 기본 배경이 그대로 드러난다. */
.detail-hero__cover-img--photo {
	position: absolute;
	inset: 0;
}

/* 배지 가독성을 위한 어둡게 하는 오버레이 — PBL 의 .detail-hero__cover::after 와 같은 값
   (공용 .detail-hero::after 를 위에서 무력화했으므로 화면마다 다시 그린다). */
.detail-hero__cover::after {
	content: "";
	position: absolute;
	inset: 0;
	background: linear-gradient(180deg, rgba(0, 0, 0, 0.05) 30%, rgba(0, 0, 0, 0.45) 100%);
}

/* 콘텐츠 종류 태그 — 박스 스타일(배경·테두리·색·패딩·폰트)은 공용 .tag.vod(theme/figma-classes.css)가
   이미 다크·라이트 정확한 값(Figma node 2042:215476 표준, 2026-08-31 전환)을 갖고 있다. 여기서는
   표지 좌상단 절대위치만 얹는다 — 예전엔 이 규칙이 .tag.vod 값을 그대로 다시 박아 넣고 있었는데
   (배경/테두리/색 전부 다크값 리터럴), 다크에서는 우연히 같은 값이라 안 보였지만 라이트에서는
   .tag.vod 의 라이트 오버라이드(#2F871D 등)를 이 화면에서만 덮어써 버려 라이트 배지 색이
   틀리게 나왔다(2026-09-02 사용자 지적 "화이트일때 박스 색상"). */
.detail-hero__tag {
	position: absolute;
	top: 1.25rem;
	left: 1.25rem;
	z-index: 1;
}

/* 관심목록(찜) 토글 아이콘 — 로그인 전이거나 신청 불가한 과정에서는 감싸는 <form> 없이
   장식용 disabled 버튼만 남는다(2026-09-09, 사이드바 텍스트 버튼을 이 자리로 통합). */
.detail-hero__bookmark {
	position: absolute;
	top: 1.25rem;
	right: 1.25rem;
	z-index: 1;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 2rem;
	height: 2rem;
	border: 0;
	border-radius: var(--mili-radius-pill);
	background: rgba(26, 29, 34, 0.8);
	color: var(--mili-neutral-100);
	cursor: pointer;
}

.detail-hero__bookmark:disabled {
	cursor: default;
}

/* "N명 수강 중" — 표지 하단좌측 단독 배지(Figma node 4038:312702 "Light/강의/상세/학습전"
   실측, 2026-09-22 — 데스크톱도 모바일과 같은 자리로 통일. 이전엔 데스크톱만 북마크 왼쪽
   상단에 붙었으나 시안은 폭과 무관하게 항상 하단좌측이다). 사진 위 오버레이라 배경은 테마와
   무관하다(rgba(26,29,34,.8), course-list.css .catalog-card__bookmark 와 같은 스크림 계열).
   텍스트 #F8F9FA 는 --mili-neutral-100 과 정확히 일치해 토큰을 쓴다. */
.detail-hero__learners {
	position: absolute;
	left: 1.25rem;
	bottom: 1.25rem;
	z-index: 1;
	display: inline-flex;
	align-items: center;
	gap: 0.25rem;
	min-height: 32px;
	padding: 0.5rem 0.75rem;
	border-radius: var(--mili-radius-pill);
	background: rgba(26, 29, 34, 0.8);
	color: var(--mili-neutral-100);
	/* 2026-09-22 Figma get_design_context 실측(node 4839:195326, "Body/B3/SemiBold") — 14px,
	   목록 카드 .catalog-card__count-pill 과 같은 크기(그동안 caption 12px 로 더 작았다). */
	font-size: var(--mili-body-b3-size);
	font-weight: var(--mili-font-weight-semibold);
	white-space: nowrap;
}

.detail-hero__learners .bi-people {
	width: 0.875rem;
	height: 0.875rem;
	font-size: 0.875rem;
	line-height: 1;
	flex-shrink: 0;
}

/* 상태 배지(수강중/수료) — 북마크 왼쪽, 표지 우측 상단(PBL 상세와 통일, 2026-09-03).
   "N명 수강 중"은 위 .detail-hero__learners 가 하단좌측에서 독립적으로 그린다 — 래퍼
   .detail-hero__cover-badges 는 display:contents 로 풀어 DOM 은 그대로 두고 배치만
   각자 갖는다(모바일 §9 와 같은 기법을 전 폭에 적용, 2026-09-22). */
.detail-hero__cover-badges {
	position: static;
	display: contents;
}

.detail-hero__cover-badges .course-card__badge {
	position: absolute;
	top: 1.25rem;
	right: calc(1.25rem + 2rem + var(--mili-space-2));
	z-index: 1;
}

/* 색 — Figma MO-상세 스펙(수강중=흰 배경, 수료=Primary/500 라임, 둘 다 어두운 글자)은 공용
   .course-card__badge--enrolled/--done(목록 카드와 공유, 어두운 배경+흰 글자)과 다르다. 공용
   클래스 자체를 바꾸면 목록 카드까지 색이 바뀌므로 표지 배지에만 좁혀 덮어쓴다. Primary/500 은
   라이트 모드에서 값이 바뀌는 토큰(라이트 #afe57e)이라 사진 위 오버레이인 이 배지엔 안 맞아
   시안 다크 프레임 값을 리터럴로 고정한다(이 파일의 다른 오버레이 배경(rgba(26,29,34,.8) 등)과
   같은 방침). */
.detail-hero__cover-badges .course-card__badge--enrolled {
	background: var(--mili-neutral-50);
	color: var(--mili-neutral-900);
}

.detail-hero__cover-badges .course-card__badge--done {
	background: #b4ff39;
	color: var(--mili-neutral-900);
}

/* 정보 카드 — 실측: 난이도 무관 고정 배경(Neutral/870), 24px 균등 패딩(데스크톱). 라이트 배경은
   2026-08-27 당시엔 데스크톱 시안이 없어 모바일(§9, node 3488:76765)에만 적용했었다 — 2026-09-14
   Figma QA(node 3374:92496, "썸네일 다크→라이트" 요청)로 데스크톱도 같은 모바일 확정값(Neutral/100
   배경 + Neutral/900 글자)을 그대로 올린다. 별도 데스크톱 라이트 프레임을 다시 실측하지 않고
   모바일 값을 재사용하는 이유: 모바일 값 자체가 "난이도 무관 고정 배경"이라는 같은 컴포넌트의
   라이트 변형이고, 이 카드 안에 폭에 따라 달라지는 값은 크기(패딩/폰트)뿐이지 색은 아니기 때문. */
.detail-hero__info {
	padding: 1.5rem;
	background: var(--mili-neutral-870);
}

.mili-light .detail-hero__info {
	background: var(--mili-neutral-100);
}

.mili-light .detail-hero__eyebrow,
.mili-light .detail-hero__title,
.mili-light .detail-hero__summary {
	color: var(--mili-neutral-900);
}

.detail-hero__eyebrow {
	margin: 0 0 1.25rem;
	max-width: 56rem;
	color: var(--mili-neutral-100);
	font-size: var(--mili-body-b3-size);
	line-height: var(--mili-body-b3-line);
	font-weight: var(--mili-font-weight-regular);
}

/* font-weight: Figma QA(node 2884:47954, "강의 상세 타이틀: Heading/H2/Bold") 실측 — 로드맵 상세
   (roadmap.css .roadmap-detail-head__title)도 같은 h2 토큰에 bold 를 쓴다. 모바일(§9)은 이 QA 범위
   밖이라 기존 semibold 를 그대로 유지하도록 별도로 되돌린다. */
.detail-hero__title {
	margin: 0;
	max-width: 56rem;
	color: var(--mili-neutral-100);
	font-size: var(--mili-heading-h2-size);
	font-weight: var(--mili-font-weight-bold);
	letter-spacing: var(--mili-heading-h2-letter-spacing);
	line-height: var(--mili-heading-h2-line);
}

/* line-height 1.6 은 리터럴 — --mili-body-b2-line(130%)이 "Body/B2" 라는 이름과 달리 실측(160%)과
   어긋나는 낡은 스케일이라(PBL project-detail.css 의 같은 자리도 리터럴을 쓴다), 토큰 대신 실측값을
   직접 못박는다. */
.detail-hero__summary {
	margin: 0.75rem 0 0;
	max-width: 56rem;
	color: var(--mili-neutral-100);
	font-size: var(--mili-body-b2-size);
	line-height: 1.6;
	display: -webkit-box;
	-webkit-line-clamp: 2;
	-webkit-box-orient: vertical;
	overflow: hidden;
}

.detail-hero__chips {
	display: flex;
	flex-wrap: wrap;
	gap: var(--mili-space-2);
	margin-top: 2rem;
}

/* 2026-09-02 사용자 지적 — PBL 상세(project-detail.css, Figma node 2769:91878 실측)는
   이미 모서리 5px 인데 이 화면만 각진 채로 남아 있었다. 같은 .detail-hero__chip 컴포넌트라
   PBL 값을 그대로 맞춘다. */
.detail-hero__chip {
	padding: 0.5rem 0.75rem;
	border-radius: var(--mili-radius-button);
	background: rgba(255, 255, 255, 0.15);
	color: var(--mili-neutral-100);
	font-size: var(--mili-body-b3-size);
	font-weight: var(--mili-font-weight-bold);
	white-space: nowrap;
}

/* 2026-09-22 사용자 지적 — 라이트 모드에선 .detail-hero__info 배경이 밝게 바뀌는데(위 §1-2)
   이 칩은 테마 구분 없이 반투명 흰 배경 + 흰 글자를 그대로 써서 밝은 카드 위에서 안 보였다.
   §9 모바일 칩(아래, node 3488:76909 실측)이 이미 쓰는 라이트 값(흰 배경+Neutral/900 글자)을
   데스크톱에도 그대로 올린다. */
.mili-light .detail-hero__chip {
	background: var(--mili-neutral-50);
	color: var(--mili-neutral-900);
}

/* ===== 1-3) .course-detail-hero__* 레거시 — /courses/{courseNo}/preview 모달 전용 =====
   이 화면(course-detail.jsp)은 더 이상 안 쓴다(위 §1 로 교체됨). 하지만 `_course-preview.jsp`
   (로드맵 미리보기 모달 조각, Figma node 1581:12398 — 이번 반영 대상인 2769:91240 과는 다른 프레임)
   와 `theme/components.css` 의 `.course-preview__hero .course-detail-hero__title` 이 이 클래스들을
   그대로 재사용하고 있어 지우면 그 화면이 깨진다. 지시받은 범위(표지 히어로, node 2769:91240) 밖이라
   손대지 않고 값을 그대로 보존한다. */
.course-detail-hero__eyebrow {
	margin: 0;
	color: rgba(255, 255, 255, 0.7);
	font-size: var(--mili-body-b3-size);
	line-height: 1.5;
}

.course-detail-hero__title {
	margin: 1.25rem 0 0;
	max-width: 44rem;
	color: var(--mili-neutral-50);
	font-size: 2.125rem;
	font-weight: 800;
	letter-spacing: 0;
	line-height: 1.2;
}

.course-detail-hero__lead {
	margin: 0.75rem 0 0;
	max-width: 42rem;
	color: rgba(255, 255, 255, 0.8);
	font-size: var(--mili-body-b3-size);
	line-height: 1.4;
	display: -webkit-box;
	-webkit-line-clamp: 2;
	-webkit-box-orient: vertical;
	overflow: hidden;
}

.course-detail-hero__tags {
	display: flex;
	flex-wrap: wrap;
	gap: var(--mili-space-2);
	margin-top: var(--mili-space-8);
}

.course-detail-hero__tag {
	padding: 0.5rem 0.75rem;
	background: rgba(255, 255, 255, 0.15);
	color: var(--mili-neutral-50);
	font-size: var(--mili-body-b3-size);
	font-weight: var(--mili-font-weight-bold);
	white-space: nowrap;
}

/* ===== 3) 본문 섹션 공통 ===== */

.course-section {
	margin-bottom: var(--mili-space-5);
}

.course-section__head {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: var(--mili-space-3);
	margin-bottom: var(--mili-space-4);
}

/* 실측(참고 앱 Panel 내부 h2): text-2xl font-bold. */
.course-section__title {
	display: flex;
	align-items: center;
	gap: var(--mili-space-2);
	margin: 0 0 1rem;
	font-size: var(--mili-heading-h3-size);
	font-weight: var(--mili-font-weight-bold);
	letter-spacing: -0.02em;
	color: var(--mili-ink);
}

/* 실측(get_design_context, node 2769:91319/91325): 알약 배지 — .tag.neutral(theme/figma-classes.css)
   이 이미 쓰는 토큰 조합을 그대로 가져온다(다크 neutral-750/50, 라이트 neutral-300/950). */
.course-section__count {
	flex: 0 0 auto;
	padding: 0.25rem 0.5rem;
	border-radius: var(--mili-radius-pill);
	background: var(--mili-neutral-750);
	color: var(--mili-neutral-50);
	font-size: var(--mili-body-b3-size);
	font-weight: var(--mili-font-weight-medium);
	letter-spacing: -0.02em;
}

.mili-light .course-section__count {
	background: var(--mili-neutral-300);
	color: var(--mili-neutral-950);
}

/* 섹션 본문 판. Figma 댓글(4038:312685, 김민경/히든피거스) 반영 — 데스크톱 32px → 24px 로
   축소하고(md 전용 확대 제거) 배경을 --mili-surface(라이트 #FFFFFF)에서 Neutral/100(#f8f9fa)로
   교체. .mili-theme-dark 는 어차피 아래 §7 에서 그라디언트로 덮어써 다크 렌더링엔 영향 없다. */
.course-panel {
	padding: 1.5rem;
	border: 1px solid var(--mili-border);
	border-radius: var(--mili-radius-card);
	background: var(--mili-neutral-100);
}

/* ===== 4) 과정 소개 =====
   본문 서식은 .mili-rich(theme/components.css §24)가 맡는다 — pre-line 을 되살리지 말 것
   (개행·문단은 서버(RichText)가 이미 <p>/<br> 로 옮겨 두었다). */

.course-desc {
	margin: 0;
	color: var(--mili-body);
	font-size: 0.9375rem;
	line-height: 1.8;
	word-break: break-word;
}

/* ===== 5) 관련 스킬 =====
   .course-skills__ 계열 / .skill-chip 계열은 theme/components.css §24-1 로 옮겼다(2026-08-12) —
   로드맵 미리보기 모달이 이 화면 CSS 를 로드하지 않는 페이지(roadmap/*)에 AJAX 조각으로 꽂히면서
   3번째 소비자가 생겨, 더 이상 화면마다 복제하는 대신 공용 컴포넌트로 승격했다. */

/* ===== 6) 컴포넌트 보정 ===== */

/* 상단 navbar 가 없는 셸이라 --mili-navbar-height 만큼 띄울 이유가 없다
   (components.css 의 기본값은 main-layout 이 있는 화면 기준). */
@media (min-width: 992px) {
	.detail-shell__aside {
		top: 1.5rem;
	}
}

/*
 * 좁은 화면에서 예전에는 .detail-shell__aside { order: -1 } 로 사이드바를 표지 위로 끌어올렸다
 * (신청 버튼이 스크롤 아래 묻히지 않도록). 2026-08-17 제거 — 같은 aside 에 들어 있는
 * "추천 컨텐츠"까지 표지보다 먼저 나와, 아직 강의를 보지도 않은 사람에게 다른 콘텐츠를
 * 먼저 들이미는 순서였다. 신청 버튼은 이제 하단 고정 바텀시트가 항상 노출한다
 * (theme/components.css §5-5-1 + js/common/detail-cta-sheet.js).
 * 그 결과 aside 는 제자리(본문 아래)에 머물고 추천 컨텐츠도 본문 뒤로 간다.
 */

/* 커리큘럼 헤더 왼쪽 — 순번 배지 + 제목(PBL .mission-accordion__lead 와 같은 얼개, 실측은
   위 §1-1 히어로 주석 참고). */
.curriculum__lead {
	display: flex;
	align-items: flex-start;
	gap: var(--mili-space-3);
	min-width: 0;
}

/* 순번 배지는 공용 .step-seq(theme/components.css §29)가 그린다 — 프로젝트 미션 여정·
   로드맵 학습 단계와 같은 배지다(2026-08-17 일관성 점검 V-01). 실측(get_design_context,
   node 2058:230058 Dark·2058:232584 Light "Syllabus 강의 커리큘럼" 실제 케이스, 2026-08-27
   재실측)하면 라이트·다크가 서로 반전된 24px 원이다 — 라이트는 검정 원(Neutral/900)+밝은
   글자(Neutral/200), 다크는 흰 원(Neutral/100)+어두운 글자(Neutral/900). 이전엔 다크 값을
   테마 구분 없이 고정해 라이트에서도 흰 원이 나오고 있었다(옅은 배경 위 흰 원이라 거의 안
   보임). .step-seq 공용 정의(PBL 미션·로드맵 단계와 공유)는 건드리지 않고 이 화면
   (.curriculum__seq)에서만 겹쳐 쓴다. */
.curriculum__seq.step-seq {
	width: 24px;
	height: 24px;
	background: var(--mili-neutral-900);
	color: var(--mili-neutral-200);
	font-size: 0.75rem;
	font-weight: var(--mili-font-weight-regular);
}

.mili-theme-dark .curriculum__seq.step-seq {
	background: var(--mili-neutral-100);
	color: var(--mili-neutral-900);
}

/* 커리큘럼 헤더 오른쪽 — 개수 + 셰브론. */
.curriculum__right {
	display: flex;
	align-items: center;
	gap: var(--mili-space-2);
	flex: 0 0 auto;
}

/* 아코디언이 펼쳐지면 헤더의 화살표를 뒤집는다. */
.curriculum__head[aria-expanded="true"] .bi-chevron-down {
	transform: rotate(180deg);
}

.curriculum__head .bi-chevron-down {
	display: inline-block;
	transition: transform 0.15s ease-in-out;
}

@media (prefers-reduced-motion: reduce) {
	.curriculum__head .bi-chevron-down {
		transition: none;
	}
}

/* "목록으로" — 실측(get_design_context, node 2769:91448)이 components.css 의 공용 정의
   (Figma node 1543:950/951 근거, 각짐/작은 패딩)와 달라졌다 — 지금은 radius 5px, padding 20/12px,
   테두리 Neutral/700, 글자 16px Medium Neutral/550. 공용 정의는 PBL 상세와 공유하므로 건드리지
   않고 이 화면에서만 겹쳐 쓴다. */
.detail-shell__back {
	padding: 0.75rem 1.25rem;
	border-radius: var(--mili-radius-button);
	border-color: var(--mili-neutral-700);
	color: var(--mili-neutral-550);
	font-weight: var(--mili-font-weight-medium);
}

.mili-light .detail-shell__back {
	border-color: var(--mili-neutral-550);
	color: var(--mili-neutral-800);
}

/* 댓글(common/_content-comments.jsp, 3화면 공용)이 이 화면의 다른 섹션 제목(.course-section__title,
   24px)과 크기·형식이 달라 보인다는 지적(2026-08-27) — 제목·개수 숫자 둘 다 같은 크기로 맞춘다
   (숫자만 작게 남겨 뒀다가 다시 지적받음 — 따로 안 맞출 이유가 없다). 공용 정의(components.css)
   자체는 커뮤니티 게시판 등 다른 맥락과도 공유해 건드리지 않는다. */
.content-comments__title,
.content-comments__count {
	font-size: var(--mili-heading-h3-size);
}

.content-comments__count {
	color: var(--mili-muted);
}

/* ===== 6-1) 액션 카드 내부 =====
   실측(참고 앱 PublicCourseDetail 사이드바 Panel): dl(학습기간 등) + 버튼들.
   여기 정의는 이 화면(course-detail.css) 안에서만 쓰고, 바깥 판(.detail-cta)과
   모바일 전용 과정명(.detail-cta__course)·하단 캡션(.detail-cta__note)은
   components.css 의 공용 정의를 그대로 쓴다(PBL 상세와 공유).
   레벨 배지(.detail-cta__level-badge)는 2026-08-12 QA7 pin4 로 뺐다 — 표지에 이미 같은
   레벨 라벨이 있어 중복이었다(마크업도 course-detail.jsp 에서 함께 제거). */

/* 정보표(.detail-cta__facts / __facts-row)는 2026-08-18 에 theme/components.css §5-5 로
   옮겼다 — 로드맵 상세 2곳이 같은 표를 쓰게 되면서 재사용 컴포넌트가 됐다. */

/* 관심목록(찜) 토글은 2026-09-09 부터 사이드바 텍스트 버튼을 없애고 표지 아이콘
   (.detail-hero__bookmark)으로 옮겼다 — 이 화면 전용 색 보정 대상에서 빠졌다. */

/* ===== 6-2) 액션 버튼(이 화면 전용) =====
   2026-09-02 갱신 — 로드맵 담기 버튼(0개/N개 색)은 theme/components.css 의 컴포넌트 클래스
   (.roadmap-add__trigger.neutral, §22)로 승격했고, 수강신청/학습하기는 흰 채움
   `.btn.medium.default`(Figma node 3522:41074/41048 실측)로 바뀌어 더 이상 이 화면에서
   색을 겹쳐 쓸 필요가 없다 — 두 항목 모두 여기 있던 화면 전용 오버라이드를 지웠다.

   ⚠️ theme/reference.css:943 의 `button { font: ... !important; }` (14px/500, 의도된 전역 규칙 —
   "12px 을 전제로 짠 곳은 그 파일에서 !important 로 되돌린다"고 주석에 명시) 가 .btn.medium 의
   12px/600 지정을 실제 <button> 태그에서 이긴다(<a> 태그인 "학습하기"/비로그인 링크는 안 걸린다).
   그래서 실제 <button> 인 자리(수강신청 submit·로드맵 트리거) 는 font-size/line-height/
   font-weight 를 !important 로 다시 못박아야 시안 실측(12px/600/130%)이 나온다. */

.detail-shell__aside .detail-cta__header-row button.btn.medium {
	font-size: var(--mili-caption-size) !important;
	line-height: var(--mili-caption-line) !important;
	font-weight: var(--mili-font-weight-semibold) !important;
}

/* ============================================================================
   7) 다크 표면층 (<body class="mili-theme-dark">)
   ----------------------------------------------------------------------------
   위까지는 --mili-* 시맨틱 토큰만 썼으므로 다크 body 만으로 이미 배색이 뒤집힌다.
   여기에는 시안 고유의 마감(흰색 알파 표면·그라디언트 카드)만 둔다.
   ============================================================================ */

.mili-theme-dark .course-panel,
.mili-theme-dark .detail-facts {
	border-color: rgba(255, 255, 255, 0.06);
	background: linear-gradient(146deg,
		rgba(255, 255, 255, 0.04) 0%,
		rgba(255, 255, 255, 0.01) 60%,
		rgba(var(--mili-brand-rgb), 0.02) 100%);
}

/* 액션 카드는 판 위에 떠 있어야 해서 한 단계 더 밝게 + 그림자를 지운다(검정 위에서는 안 보인다). */
.mili-theme-dark .detail-cta {
	border-color: rgba(255, 255, 255, 0.08);
	background: rgba(255, 255, 255, 0.04);
	box-shadow: none;
}

/*
 * 바텀시트(theme/components.css §5-5-1)일 때는 위 반투명 표면을 쓸 수 없다 — 시트가 본문 위에
 * 떠 있어서 rgba(255,255,255,.04) 로는 아래 글자가 그대로 비친다. 불투명 표면으로 되돌리고
 * 그림자도 살린다(위 규칙이 box-shadow:none 이라 공용 시트 그림자를 지운다).
 * 선택자 특이도가 위 .mili-theme-dark .detail-cta 와 같으므로 반드시 뒤에 있어야 한다.
 */
@media (max-width: 991.98px) {
	.mili-theme-dark .detail-cta--sheet {
		/* 2026-09-02: Figma node 3522:41074 등 실측값(Neutral/900)으로 교체 — 이전엔
		   위 §5-5-1 공용 시트 규칙과 짝을 맞춘 --mili-surface(Neutral/870)이었다. */
		background: var(--mili-neutral-900);
		box-shadow: var(--mili-shadow-lg);
	}
}

.mili-theme-dark .detail-cta__course,
.mili-theme-dark .detail-cta__note {
	border-color: rgba(255, 255, 255, 0.08);
}

.mili-theme-dark .curriculum {
	border-color: rgba(255, 255, 255, 0.06);
}

.mili-theme-dark .curriculum__section + .curriculum__section {
	border-top-color: rgba(255, 255, 255, 0.06);
}

.mili-theme-dark .curriculum__head:hover {
	background: rgba(255, 255, 255, 0.04);
}

/* 최상위 목차만 나열하는 정적 헤더는 호버 배경을 주지 않는다(components.css 의 --static 과 짝). */
.mili-theme-dark .curriculum__head--static:hover {
	background: transparent;
}

.mili-theme-dark .curriculum__item {
	border-top-color: rgba(255, 255, 255, 0.05);
}

/* .skill-chip / .course-skills__group 다크 보정도 components.css §24-1 로 옮겼다(위 §5 참고).
   (2026-08-28: 원래 이 주석에 별표+슬래시 조기 종료 오타가 있어 바로 뒤에 오는 다음 규칙의
   선택자를 깨진 텍스트가 통째로 삼켜 파서가 그 규칙 전체를 버리는 사고가 있었다 — §8 모바일
   탭바의 .detail-mobile-tabs 기본 display:none 규칙이 사라져 데스크톱에도 탭이 보였다.
   기존 주석이었지만 바로 다음 규칙을 깨뜨려 여기서 함께 고친다.) */

/* ============================================================================
   8) 모바일 탭바(≤767px 전용)
   ----------------------------------------------------------------------------
   실측(get_design_context, Figma node 2804:28408 다크·2804:29022 라이트, 2026-08-28).
   데스크톱은 손대지 않는다 — 탭바는 기본 display:none 이고 이 미디어쿼리 안에서만 보인다.
   패널 필터링(js/vod/course-detail.js)도 이 폭에서만 동작해, 데스크톱은 지금처럼
   모든 섹션이 그대로 세로로 쌓인다.

   색 대조(다크/라이트 실측):
     비활성 탭 밑줄  : Neutral/700 #66686c(다크) → Neutral/500 #dcdcdc(라이트)
     비활성 탭 글자  : Neutral/600 #989a9e(다크) → Neutral/700 #66686c(라이트)
     활성 탭 밑줄    : Primary/500 #b4ff39(다크, --mili-primary-500 그대로 일치)
                       → 라이트는 시안이 Primary/Text #2f871d 를 쓰는데 primitives.css 에
                       대응 토큰이 없어(2026-08-28 사용자 확인) 가장 가까운 기존 토큰인
                       --mili-green-700(#269638)으로 근사한다.
     활성 탭 글자    : Neutral/50 white(다크) → Neutral/900 #0e1013(라이트)
   ============================================================================ */

.detail-mobile-tabs {
	display: none;
}

/* 데스크톱에는 대응 콘텐츠가 없는 새 자리라 항상 숨긴다(아래 미디어쿼리가 모바일 폭에서만
   다시 보여준다). */
.detail-tabpanel--recommend {
	display: none;
}

@media (max-width: 767px) {
	/* ----------------------------------------------------------------------
	   9) 표지(히어로) 모바일 값 — 실측(get_design_context, node 3488:75109 다크·
	   3488:76765 라이트, 2026-09-02). 위쪽 base 규칙(§1)보다 반드시 "뒤"에 와야 특정성이
	   같은 프로퍼티에서 이긴다(파일 상단 §1 끝의 경고 주석 참고).
	   ---------------------------------------------------------------------- */

	/* 표지 사진 높이 — 데스크톱 비율(852:360)을 그대로 물려받아 모바일 폭(390px)에 대입하면
	   164.8px 로, 실측 219px 와 어긋난다(이미지가 낮게 짜부라진다, "이미지 사이즈도 다름" 지적). */
	.detail-hero__cover {
		aspect-ratio: 390 / 219;
	}

	/* 태그·북마크 절대위치 — 오버레이 안쪽 여백이 데스크톱 20px 가 아니라 16px 다. "N명 수강 중"은
	   북마크 옆(우측 상단)이 아니라 표지 하단좌측 단독 배지로 자리 자체가 바뀐다. */
	.detail-hero__tag,
	.detail-hero__bookmark {
		top: 1rem;
	}

	.detail-hero__tag {
		left: 1rem;
	}

	.detail-hero__bookmark {
		right: 1rem;
	}

	/* 모바일 전용 오프셋 — 위(§1-1)에서 이미 전 폭에 static/contents·절대배치를 걸었으므로
	   여기서는 좁은 폭에서만 달라지는 값(1.25rem→1rem)만 겹쳐 쓴다. */
	.detail-hero__cover-badges .course-card__badge {
		top: 1rem;
		right: calc(1rem + 2rem + var(--mili-space-2));
	}

	.detail-hero__learners {
		left: 1rem;
		bottom: 1rem;
	}

	/* 정보 카드 — 실측 패딩은 24px 균등이 아니라 세로 12px·가로 20px 다. 라이트 배경은 시안에
	   Neutral/100(#f8f9fa) 으로 명시돼 있는데 이전엔 다크 값(Neutral/870)을 테마 구분 없이 항상
	   써서 라이트에서도 검은 판이 나왔다("화이트일때 박스 색상" 지적의 핵심 원인). */
	.detail-hero__info {
		padding: 0.75rem 1.25rem;
	}

	.mili-light .detail-hero__info {
		background: var(--mili-neutral-100);
	}

	/* 글자 크기 — 데스크톱 토큰(heading-h2/body-b3/body-b2)을 모바일에 그대로 물려써 실측보다
	   컸다("모든 텍스트 사이즈 다름" 지적). 모바일 프레임 실측값: eyebrow 12px·title 18px(2026-09-21 24→18 수정)·
	   eyebrow↔title 간격 20px(12→20 수정)·summary 14px/1.3/4줄클램프(플레이스홀더 문구 자체가 "최대 4줄까지 노출"이라 명시). 라이트
	   글자색은 Neutral/900, 다크는 기존 그대로(Neutral/100). */
	.detail-hero__eyebrow {
		margin-bottom: 1.25rem;
		font-size: var(--mili-caption-size);
		line-height: 1.3;
	}

	.mili-light .detail-hero__eyebrow {
		color: var(--mili-neutral-900);
	}

	.detail-hero__title {
		font-size: var(--mili-body-b1-size);
		font-weight: var(--mili-font-weight-semibold);
		line-height: 1.4;
	}

	.mili-light .detail-hero__title {
		color: var(--mili-neutral-900);
	}

	.detail-hero__summary {
		font-size: var(--mili-body-b3-size);
		line-height: 1.3;
		-webkit-line-clamp: 4;
	}

	.mili-light .detail-hero__summary {
		color: var(--mili-neutral-900);
	}

	/* 칩 — 실측 결과 줄바꿈 목록이 아니라 3열×2행 그리드다. 패딩도 8px 균등(이전엔 8px/12px),
	   글자는 12px Regular(이전엔 14px Bold — 다른 칩보다 유독 두꺼워 보이던 원인). 배경은
	   다크 Neutral/800(이미 맞는 값), 라이트는 흰 배경 + 어두운 글자(이전엔 반투명 흰 배경을
	   테마 구분 없이 써서 라이트 배경 위에서 거의 안 보였다 — 화이트 박스 색상 지적의 또 다른
	   축). 2026-09-02 재확인(node 3488:76909) — 모서리 반경 5px·글자 중앙 정렬이 빠져 있었다. */
	.detail-hero__chips {
		display: grid;
		grid-template-columns: repeat(3, minmax(0, 1fr));
		gap: 0.5rem;
		margin-top: 1.5rem;
	}

	.detail-hero__chip {
		display: flex;
		align-items: center;
		justify-content: center;
		padding: 0.5rem;
		border-radius: var(--mili-radius-button);
		background: var(--mili-neutral-800);
		font-size: var(--mili-caption-size);
		font-weight: var(--mili-font-weight-regular);
		text-align: center;
	}

	.mili-light .detail-hero__chip {
		background: var(--mili-neutral-50);
		color: var(--mili-neutral-900);
	}

	/* 2026-08-30 버그 수정 — 바로 위 §8 도입부 주석("아래 미디어쿼리가 모바일 폭에서만
	   다시 보여준다")이 약속한 규칙이 실제로는 빠져 있었다. 그 결과 JS(course-detail.js)가
	   활성 탭에 style.display='' 를 줘도 위 무조건부 규칙(display:none)이 계속 이겨
	   "추천 학습" 탭을 클릭해도 항상 빈 화면이었다(이전 라운드엔 내용 자체가 없어 겉으로
	   드러나지 않았던 버그 — 이번에 실제 콘텐츠를 채우며 발견). 인라인 스타일이 클래스보다
	   우선하므로, 여기서 모바일 폭 기본값만 되돌리면 비활성 탭(JS 의 display:none 인라인)은
	   여전히 숨고 활성 탭만 보인다. */
	.detail-tabpanel--recommend {
		display: block;
	}

	/* overflow-y 는 계속 hidden 으로 막는다 — 버튼 테두리 등 미세한 높이 오차만으로도 세로
	   스크롤이 함께 생겨 버리는 문제(2026-09-03)는 가로 스크롤을 없애도 그대로 남는다.
	   컨테이너 border-bottom 은 그대로 유지(개별 탭 밑줄이 그 위에 겹쳐 그려진다).

	   2026-09-08 "탭 있으면 좌우 스크롤 안 되고 꽉 차게" 요청으로 가로 스크롤을 없애고
	   균등폭(flex:1 1 0)으로 되돌린다 — 단 2026-09-03 에 이 방식을 되돌렸던 원인(라벨
	   말줄임)은 white-space:normal(줄바꿈 허용)로 다시 막는다. 그때는 nowrap 상태로 균등폭만
	   줬다가 잘렸던 것이라, 이번엔 줄바꿈까지 같이 켜는 점이 다르다(사용자 확인 후 재적용). */
	/* .app-page 좌우 여백(--mili-page-padding)만큼 음수 마진으로 상쇄해 뷰포트 끝까지 채운다
	   (표지 .detail-hero 와 같은 패턴, §1 상단 주석 참고). 되돌리는 패딩을 두면 밑줄만
	   끝까지 가고 탭 글자·클릭 영역은 여전히 안쪽에 머물러 "여백 그대로"로 보였다(2026-09-14
	   사용자 재지적) — 컨테이너에는 패딩을 주지 않고, 각 탭 버튼 자체의 좌우 패딩만으로
	   여백을 만들어 버튼 영역이 화면 끝까지 꽉 차게 한다. */
	.detail-mobile-tabs {
		display: flex;
		margin-inline: calc(var(--mili-page-padding) * -1);
		/* 실측(2026-09-22): 탭↔타이틀 여백 12px→20px 수정. */
		margin-bottom: 1.25rem;
		overflow-x: hidden;
		overflow-y: hidden;
		border-bottom: 1px solid var(--mili-neutral-700);
	}

	.mili-light .detail-mobile-tabs {
		border-bottom-color: var(--mili-neutral-500);
	}

	.detail-mobile-tabs__btn {
		flex: 1 1 0;
		min-width: 0;
		padding: 0.75rem 0.5rem 0.8125rem;
		border: 0;
		border-bottom: 1px solid var(--mili-neutral-700);
		background: none;
		color: var(--mili-neutral-600);
		font-size: var(--mili-body-b3-size);
		white-space: normal;
		text-align: center;
		cursor: pointer;
	}

	.mili-light .detail-mobile-tabs__btn {
		border-bottom-color: var(--mili-neutral-500);
		color: var(--mili-neutral-700);
	}

	.detail-mobile-tabs__btn.is-active {
		border-bottom-color: var(--mili-primary-500);
		color: var(--mili-neutral-50);
	}

	.mili-light .detail-mobile-tabs__btn.is-active {
		border-bottom-color: var(--mili-green-700);
		color: var(--mili-neutral-900);
	}

	/* 실측(2026-09-22): 섹션 타이틀("강의 정보" 등) 24px→18px 수정. */
	.course-section__title {
		font-size: var(--mili-body-b1-size);
	}

	/* "추천 학습" 탭 패널은 위에서 기본 숨김이다 — JS(course-detail.js)가 이 폭에서
	   탭 클릭 시에만 보여준다. JS 가 없으면 끝까지 숨겨진 채로 남는다(빈 placeholder 라
	   안전한 폴백). */

	/* "추천 학습" 탭 카드 그리드 — 2026-09-22 사용자 지시로 전용 카드(.detail-recommend-card)를
	   걷어내고 강의 목록 카드 정본(course-list.css .catalog-grid/.catalog-card)을 그대로
	   재사용한다(JSP 가 course-list.css 를 직접 링크, mypage/wishlist.jsp 와 같은 패턴).
	   이 파일에 남길 스타일은 없다 — .catalog-grid 는 이미 부모 .detail-tabpanel--recommend
	   의 모바일 전용 표시 규칙(위 §)만 물려받으면 된다. */

	/* 사이드바 "추천 콘텐츠"(_related-content.jsp, 썸네일 없는 텍스트 목록)는 데스크톱 전용
	   콘텐츠다 — 모바일에는 이미 위 "추천 학습" 탭(.catalog-grid, 썸네일 카드)이 같은
	   내용을 제공한다. .detail-shell__aside 는 order 조정 없이 본문 아래로 그냥 흘러들어와
	   숨기지 않으면 댓글 뒤에 "추천 콘텐츠"가 중복으로 한 번 더 나온다(2026-09-02 사용자 지적
	   "강의 소개에 추천 콘텐츠 왜 있어" — 실제로는 특정 탭 소속이 아니라 그냥 맨 아래 고정으로
	   나와 있던 것인데, 보고 있던 탭 바로 뒤에 붙어 있어 그 탭 소속처럼 보였다). */
	.detail-shell__aside .detail-related {
		display: none;
	}

	/* "관련 스킬" — 실측(get_design_context, node 2804:29459, 2026-09-02) 결과 섹션 전체를
	   감싸는 큰 박스가 없다(개별 스킬 칩만 각자 작은 카드다, .skill-chip 은 이미 그 값과
	   일치해 손대지 않는다). .course-panel 은 "강의 소개"·"관련 스킬" 두 곳에 공용으로 쓰여
	   전역으로 벗기면 "강의 소개"까지 박스가 빠지므로, 이 섹션에만 좁혀 무력화한다. */
	[data-tab-panel="skills"] .course-panel {
		padding: 0;
		border: 0;
		border-radius: var(--mili-radius-none);
		background: none;
	}

	/* ----------------------------------------------------------------------
	   8-2) "강의 정보" — 실측(디자인 형상, Figma QA node 3374:112602 pin2, 2026-09-04):
	   카드(테두리+배경)가 아니라 행마다 하이라인으로만 구분한 맨몸 목록이다. 데스크톱은
	   그대로 카드형(components.css §5 .detail-facts)을 쓴다 — 시안이 데스크톱까지 바꾸라고
	   지시하지 않았고(모바일 프레임만 있음), .detail-facts 는 PBL/VOD 미리보기 모달
	   (_project-preview.jsp/_course-preview.jsp, roadmap-preview-modal.js)과 공유하는
	   컴포넌트라 공용 정의 자체는 건드리지 않는다 — 이 화면(course-detail.css)에서만,
	   그것도 모바일 폭에서만 겹쳐 쓴다.
	   ---------------------------------------------------------------------- */
	.detail-facts {
		gap: 0;
		padding: 0;
		border: 0;
		border-radius: var(--mili-radius-none);
		background: none;
	}

	.detail-facts__row {
		padding-block: var(--mili-space-3);
		border-bottom: 1px solid var(--mili-border);
	}

	.detail-facts__row:last-child {
		border-bottom: 0;
	}

	/* ----------------------------------------------------------------------
	   8-3) 액션 카드 정보표(이수시간/교육일수) + 진행률 — 실측(디자인 형상, node 3374:112602
	   pin4, 2026-09-04): 이수시간↔교육일수 사이 선 삭제, 그 대신 정보표 전체 "아래"에 선을
	   하나 추가해 진행률과 구분한다. 진행률↔수료 안내 문구 사이 선도 삭제.
	   .detail-cta__facts-row / .detail-cta__note 는 로드맵 상세(mypage/roadmap-detail.jsp,
	   roadmap/detail.jsp)와 공유하는 컴포넌트라 공용 정의(components.css)는 그대로 두고
	   이 화면 모바일 폭에서만 겹쳐 쓴다.
	   ---------------------------------------------------------------------- */
	.detail-cta__facts {
		padding-bottom: var(--mili-space-4);
		border-bottom: 1px solid var(--mili-border);
	}

	.detail-cta__facts-row {
		padding-bottom: 0;
		border-bottom: 0;
	}

	.detail-cta__note {
		padding-top: 0;
		border-top: 0;
	}

	/* ----------------------------------------------------------------------
	   8-4) "목록으로" — 실측(디자인 형상, node 3374:112602 pin5, 2026-09-04): 세로 높이 36px.
	   위 §6-1 데스크톱 겸용 오버라이드(padding 0.75rem 1.25rem)는 그대로 두고, 모바일에서만
	   세로 패딩을 걷어내고 고정 높이(2.25rem = 36px, 시스템 .btn.medium 과 같은 높이 규격)로
	   맞춘다 — 가로 패딩·테두리색·글자 스타일은 기존 값 그대로다.
	   ---------------------------------------------------------------------- */
	.detail-shell__back {
		height: 2.25rem;
		padding-top: 0;
		padding-bottom: 0;
	}
}
