/*
 * ============================================================================
 *  밀리AI 참고 컴포넌트 레이어 — 디자인 참고 저장소 globals.css 이식본
 * ============================================================================
 *
 *  원본: .reference/miliai-hddn/src/app/globals.css
 *  기준: 35458a0 (2026-08-03, "Merge pull request #21")
 *
 *  ⚠️ 이 파일은 손으로 고치지 않는다.
 *     참고가 바뀌면 원본 diff 를 같은 클래스명·같은 자리에 그대로 옮긴다.
 *     각 절 제목에 원본 줄 번호를 적어 두었으니 diff 를 찾을 때 쓴다.
 *     우리 사정으로 값을 바꿔야 하면 theme/components.css 나 화면 CSS 에서 덮어쓴다.
 *
 *  ── 이식하지 않은 것과 그 이유 ──────────────────────────────────────────
 *
 *  1) 레거시 Tailwind 임의값 리맵 (원본 249–301, 338–382)
 *     `.mili-light [class*="bg-[#0b110d]"] { … !important }` 식으로 옛 Tailwind 클래스를
 *     토큰에 되돌리는 블록이다. 우리에겐 그런 클래스가 없어 전부 죽은 규칙이 된다.
 *     대신 docs/design-system.md 의 **hex → 토큰 번역표**로 옮겼다 —
 *     참고 TSX 를 읽고 우리 화면에 옮길 때 그 표를 쓴다.
 *
 *  2) `[class*="rounded-"] { border-radius: 0 !important }` (원본 142)
 *     Tailwind 가 뿌리는 rounded-* 유틸을 전역으로 눕히는 규칙이다.
 *     우리 등가물은 theme/variables.css 의 `--bs-border-radius*: 0` 다섯 줄이고,
 *     그쪽이 Bootstrap 컴포넌트를 정확히 겨냥한다. 이 규칙을 그대로 옮기면
 *     나중에 누가 `.rounded-pill` 을 쓸 때 조용히 각져 버린다.
 *
 *  3) 학습 워크스페이스 (원본 597–1327, 전체의 44%)
 *     **css/vod/learn.css 가 이미 같은 클래스명으로 163개 규칙을 갖고 있다.**
 *     여기로 복제하면 정본이 두 벌이 되므로 그 파일을 정본으로 둔다.
 *     참고의 워크스페이스 diff 는 css/vod/learn.css 에 옮긴다.
 *
 *  4) 홈 미션맵 (원본 306–321) · 홈 글래스/reveal (personal-home.css)
 *     css/home.css 가 정본이다. 우리 홈은 참고와 같은 고정 캔버스 방식이라
 *     화면 CSS 안에서 좌표계와 함께 관리해야 한다.
 *
 *  5) Tailwind DOM 을 겨냥한 숨김 규칙 (원본 131–138)
 *     `.mb-6:has(> a[href="/showcase"])` 처럼 참고 마크업에만 있는 것을 지운다.
 *     우리는 그 요소를 애초에 그리지 않는다.
 *
 *  ── 우리 쪽 사정으로 손본 것 ────────────────────────────────────────────
 *
 *  a) LNB 항목이 참고는 `<button>`, 우리는 `<a>` 다(실제 페이지 이동이라 링크가 옳다).
 *     그래서 `aside.mili-lnb nav button` 선택자를 `.mili-lnb .mili-nav-item` 으로 바꿨다.
 *  b) 참고가 여러 번 덮어쓴 규칙(`.mili-nav-item-active` 는 162줄과 563줄 두 번)은
 *     **최종 계산값 한 벌만** 적었다. 원본 줄 번호를 둘 다 주석에 남긴다.
 *  c) `color-mix()` 는 정부망 구형 브라우저에서 무효가 되어 색이 통째로 빠진다.
 *     `-rgb` 짝이 있는 토큰은 `rgba(var(--x-rgb), .N)` 으로 바꾸고,
 *     짝이 없는 것(`--course-accent`)만 @supports 폴백을 붙여 색을 유지한다.
 * ============================================================================
 */

/* ============================================================
   base — 원본 3–13
   ============================================================ */
*,
*::before,
*::after {
    letter-spacing: 0 !important;
}

html {
    background: var(--mili-app-bg);
    scroll-behavior: smooth;
}

body {
    min-width: 320px;
    background: var(--mili-app-bg);
    /* 참고는 본문 기본색이 --mili-text 다. 보조색은 컴포넌트가 각자 지정한다. */
    color: var(--mili-text);
    font-family: var(--mili-font-sans);
    -webkit-font-smoothing: antialiased;
}

img,
svg,
video,
canvas {
    max-width: 100%;
}

/* ============================================================
   페이지 그리드 · 셸 — 원본 14–59
   ============================================================ */
.mili-header-grid,
.mili-page-grid {
    width: min(calc(100% - (var(--mili-page-padding) * 2)), var(--mili-content-max));
    margin-inline: auto;
}

.mili-page-grid {
    display: grid;
    grid-template-columns: repeat(var(--mili-grid-columns), minmax(0, 1fr));
    gap: var(--mili-grid-gutter);
    padding-block: 32px 48px;
}

/* 자식은 기본적으로 전폭을 쓴다. 컬럼을 쪼개는 화면만 각자 grid-column 을 지정한다. */
.mili-page-grid > * {
    grid-column: 1 / -1;
    min-width: 0;
}

.mili-page-shell {
    min-width: 0;
}

.mili-page-header,
.mili-home-header {
    height: var(--mili-topbar-height);
    padding-block: 0;
    padding-inline: var(--mili-page-padding);
}

.mili-page-header > div,
.mili-home-header > div {
    width: min(calc(100% - (var(--mili-page-padding) * 2)), var(--mili-content-max));
    height: 100%;
    margin-inline: auto;
}

@media (min-width: 1024px) {
    .mili-page-shell {
        width: calc(100% - var(--mili-sidebar-width));
        margin-left: var(--mili-sidebar-width);
    }
}

/* 1024–1279px 은 라벨을 감춘 80px 아이콘 레일이다. */
@media (min-width: 1024px) and (max-width: 1279px) {
    :root {
        --mili-sidebar-width: var(--mili-sidebar-collapsed-width);
    }

    .mili-lnb > :first-child {
        display: grid;
        padding-inline: 0;
        place-items: center;
    }

    .mili-lnb nav {
        padding-inline: 12px;
    }

    .mili-lnb .mili-nav-item {
        justify-content: center;
        padding-inline: 0;
    }

    /* 라벨은 지우지 않고 시각적으로만 감춘다(스크린리더는 계속 읽는다). */
    .mili-lnb .mili-nav-item span {
        position: absolute;
        width: 1px;
        height: 1px;
        overflow: hidden;
        clip: rect(0 0 0 0);
        white-space: nowrap;
    }
}

@media (min-width: 768px) and (max-width: 1023px) {
    :root {
        --mili-grid-columns: var(--mili-tablet-grid-columns);
        --mili-grid-gutter: var(--mili-tablet-grid-gutter);
        --mili-page-padding: var(--mili-tablet-page-padding);
    }
}

@media (max-width: 767px) {
    :root {
        --mili-topbar-height: 56px;
        --mili-grid-columns: var(--mili-mobile-grid-columns);
        --mili-grid-gutter: var(--mili-mobile-grid-gutter);
        --mili-page-padding: var(--mili-mobile-page-padding);
    }

    .mili-page-grid {
        padding-block: 24px 36px;
    }
}

@media (min-width: 390px) and (max-width: 767px) {
    :root {
        --mili-page-padding: 20px;
    }
}

/* ============================================================
   타이포 · 포커스 · 수치 서체 — 원본 60–82
   ============================================================ */
h1,
h2,
h3,
h4,
h5,
h6,
[data-mili-title="true"] {
    font-weight: 700;
}

.mili-title-medium {
    font-weight: 500;
}

button,
input,
textarea,
select,
code,
kbd,
pre {
    font: inherit;
}

button {
    cursor: pointer;
}

button:disabled {
    cursor: not-allowed;
}

/* 전역 포커스 링. 개편 전 이 프로젝트에는 전역 규칙이 아예 없었다. */
:where(a, button, input, textarea, select, [tabindex]):focus-visible {
    outline: 2px solid var(--mili-focus);
    outline-offset: 2px;
}

/* 대시보드에서 홀로 읽히는 수치 전용(레벨·점수·진행률). 굵기는 붙이는 컴포넌트가 정한다. */
.mili-metric {
    font-family: var(--mili-font-metric);
    font-optical-sizing: auto;
    font-style: normal;
    font-variant-numeric: tabular-nums;
}

/* ============================================================
   검색 필드 — 원본 83–103, 496–511
   ------------------------------------------------------------
   참고는 `label:has(> input[placeholder*="검색"])` 로 placeholder 문자열을 보고 잡는다.
   문구가 바뀌면 조용히 스타일이 빠지므로 우리는 .mili-search-field 클래스를 명시한다.
   아이콘이 order:2 라 **오른쪽**에 온다 — 마크업 순서와 무관하다.
   ============================================================ */
.mili-search-field {
    display: flex;
    min-height: 52px;
    align-items: center;
    gap: 12px;
    overflow: hidden;
    padding: 0 16px;
    border: 1px solid var(--mili-border-strong);
    border-radius: var(--mili-radius-pill);
    background: var(--mili-surface-raised);
    color: var(--mili-text-secondary);
}

.mili-search-field > input {
    order: 1;
    height: 50px;
    min-width: 0;
    flex: 1;
    border: 0;
    background: transparent;
    padding: 0;
    caret-color: var(--mili-primary);
    color: var(--mili-text);
    outline: none;
}

.mili-search-field > input:focus-visible {
    outline: none;
}

.mili-search-field > input::selection {
    background: var(--mili-primary);
    color: var(--mili-primary-on);
}

.mili-search-field > button {
    order: 2;
    display: grid;
    width: 24px;
    height: 24px;
    place-items: center;
    border: 0;
    border-radius: 0;
    background: transparent;
    padding: 0;
    color: #f8f9fa;
}

.mili-search-field > button > svg,
.mili-search-field > button > i {
    width: 22px;
    height: 22px;
    font-size: 22px;
    line-height: 1;
}

/* 원본 544–546 — 포커스 링을 걷고 테두리만 한 단 진해진다(2026-08-03 개정).
   대신 캐럿과 선택 영역이 라임이라 포커스 위치는 그대로 읽힌다. */
.mili-search-field:focus-within {
    border-color: var(--mili-border-strong);
    box-shadow: none;
    outline: 0;
}

/* ============================================================
   탭 — 원본 104–108
   ============================================================ */
.mili-tabs > button,
.mili-tabs > a,
button.mili-tab,
a.mili-tab {
    border-radius: 4px;
}

/* ============================================================
   프레임 · 컨트롤 — 원본 144–154, 333–337, 368
   ------------------------------------------------------------
   .mili-control 의 3px 오프셋 하드 섀도가 참고의 "각진 전술 컨트롤" 인상을 만든다.
   라이트에서는 원본이 그림자를 통째로 끈다(원본 294–295).
   ============================================================ */
.mili-frame {
    position: relative;
    border: 1px solid var(--mili-border);
    background: var(--mili-surface);
    box-shadow: 0 18px 42px rgb(0 0 0 / 28%);
    transition: border-color 0.2s ease, box-shadow 0.2s ease, background-color 0.2s ease;
}

.mili-frame.fixed {
    position: fixed;
}

.mili-dark .mili-frame {
    box-shadow: 0 14px 34px rgb(0 0 0 / 22%);
}

.mili-light .mili-frame {
    box-shadow: 0 10px 24px rgb(30 34 39 / 5%);
}

.mili-hover-target {
    position: relative;
}

.mili-showcase-card {
    border-width: 0;
}

/* 프로필 칩은 오프셋 그림자를 쓰지 않는다 — 원본 146(.mili-profile-control). */
.mili-profile-control {
    box-shadow: none;
}

/* 완전한 원으로 남는 예외 — 나머지는 각지거나 뱃지 반경(99px)을 쓴다. 원본 148–150. */
.mili-course-bookmark,
.mili-streak-day {
    border-radius: var(--mili-radius-pill);
}

/* 강의 카드 헤더의 북마크 · 수강 인원 — 원본 478–481 */
.mili-course-bookmark {
    display: inline-flex;
    width: 38px;
    height: 38px;
    align-items: center;
    justify-content: center;
    border: 0;
    background-color: rgb(26 29 34 / 24%);
    color: #f8f9fa;
    transition: background-color 180ms ease, color 180ms ease;
}

.mili-course-bookmark svg {
    transition: fill 180ms ease, transform 180ms ease;
}

.mili-course-bookmark.is-saved svg {
    transform: scale(1.04);
}

.mili-course-students {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 5px;
    min-height: 36px;
    padding: 0 13px;
    border: 0;
    border-radius: var(--mili-radius-badge);
    background-color: rgb(26 29 34 / 24%);
    color: #f8f9fa;
    font-size: var(--mili-text-sm);
    font-weight: 700;
    white-space: nowrap;
}

/* 태그·뱃지류는 알약이 아니라 99px 뱃지 반경이다 — 원본 569–571 */
.mili-tag,
.mili-course-tag,
.mili-course-detail-level {
    border-radius: var(--mili-radius-badge);
}

/* ============================================================
   좌측 내비게이션(LNB) — 원본 155–186, 384–398, 563–595
   ------------------------------------------------------------
   ⚠️ 원본은 .mili-nav-item-active 를 두 번 선언하고 뒤쪽(563)이 이긴다.
      여기에는 **최종 계산값 한 벌만** 적었다.
        선택 = 라임 꽉 찬 배경 + 어두운 글자, 코너 마크 없음
        호버 = 옅은 라임 배경 + 라임 글자 + 13px 코너 브라켓
   ============================================================ */
.mili-lnb,
.mili-mobile-lnb {
    overflow: hidden;
    border-radius: 0;
    background: var(--mili-sidebar-bg);
    color: var(--mili-text);
}

.mili-lnb {
    box-shadow: inset 0 1px 0 rgb(255 255 255 / 4%);
}

.mili-light .mili-lnb,
.mili-light .mili-mobile-lnb {
    box-shadow: none;
}

.mili-nav-item {
    position: relative;
    border: 1px solid transparent;
    border-radius: 0;
    color: var(--mili-text);
    transition: color 0.18s ease, border-color 0.18s ease, background-color 0.18s ease, opacity 0.18s ease;
}

/* 테크니컬 코너 브라켓 — 좌상단 / 우하단 두 조각. 기본은 투명하고 호버에서만 뜬다. */
.mili-nav-item::before,
.mili-nav-item::after {
    content: "";
    position: absolute;
    width: 13px;
    height: 13px;
    opacity: 0;
    pointer-events: none;
    transition: opacity 0.18s ease;
}

.mili-nav-item::before {
    left: -1px;
    top: -1px;
    border-left: 2px solid var(--mili-primary);
    border-top: 2px solid var(--mili-primary);
}

.mili-nav-item::after {
    right: -1px;
    bottom: -1px;
    border-right: 2px solid var(--mili-primary);
    border-bottom: 2px solid var(--mili-primary);
}

.mili-nav-item-active {
    border-color: var(--mili-primary);
    background-color: var(--mili-primary);
    color: var(--mili-primary-on);
}

.mili-nav-item-active::before,
.mili-nav-item-active::after {
    opacity: 0;
}

.mili-nav-item:not(.mili-nav-item-active):hover,
.mili-nav-item:not(.mili-nav-item-active):focus-visible {
    border-color: var(--mili-primary-border);
    background-color: var(--mili-primary-bg);
    color: var(--mili-primary);
}

.mili-nav-item:not(.mili-nav-item-active):hover::before,
.mili-nav-item:not(.mili-nav-item-active):hover::after,
.mili-nav-item:not(.mili-nav-item-active):focus-visible::before,
.mili-nav-item:not(.mili-nav-item-active):focus-visible::after {
    opacity: 1;
}

/* 상단 유틸리티 버튼 */
.mili-gnb-item {
    position: relative;
    transition: color 0.18s ease, border-color 0.18s ease, background-color 0.18s ease, opacity 0.18s ease;
}

.mili-gnb-item:hover,
.mili-gnb-item:focus-visible {
    border-color: rgba(var(--mili-brand-rgb), 0.62);
    color: var(--mili-primary);
    opacity: 1;
}

.mili-nav-item:focus-visible,
.mili-gnb-item:focus-visible {
    outline: 2px solid var(--mili-primary-strong);
    outline-offset: 2px;
}

.mili-mobile-menu-backdrop {
    background: rgb(0 0 0 / 45%);
}

.mili-light .mili-mobile-menu-backdrop {
    background: rgb(0 0 0 / 22%);
}

/* ============================================================
   상단바 — 원본 401–427
   ============================================================ */
/* 원본 405–423 — 아래 테두리는 **라이트에만** 남는다(다크는 405 를 409 가 지운다). */
.mili-page-header {
    background: var(--mili-app-bg);
    border-bottom: 1px solid var(--mili-border);
}

.mili-dark .mili-page-header {
    border-bottom: 0;
}

.mili-light .mili-page-header {
    background: #ffffff;
}

/* 홈은 배경 픽셀 인터랙션 위에 얹히므로 스크림 그라디언트를 쓴다. */
.mili-home-header {
    background: linear-gradient(to bottom, rgb(9 10 12 / 86%) 0%, rgb(9 10 12 / 56%) 55%, transparent 100%);
    border-bottom: 0;
}

.mili-light .mili-home-header {
    background: linear-gradient(to bottom, rgb(255 255 255 / 92%) 0%, rgb(255 255 255 / 66%) 55%, transparent 100%);
    border-bottom: 1px solid rgb(222 226 230 / 74%);
}

/* ============================================================
   전역 전환 — 원본 187, 211–245
   ============================================================ */
button:not(.mili-control),
a {
    transition: color 0.18s ease, border-color 0.18s ease, background-color 0.18s ease, transform 0.18s ease,
        box-shadow 0.18s ease;
}

@keyframes mili-page-card-reveal {
    from {
        opacity: 0;
        transform: translateY(18px) scale(0.985);
        filter: blur(5px);
    }

    to {
        opacity: 1;
        transform: translateY(0) scale(1);
        filter: blur(0);
    }
}

/* 진입 스태거는 마크업이 --mili-entry-delay 로 준다(참고 PortalApp.tsx:258 = 80 + min(i,8)*70 ms). */
.mili-page-card-reveal {
    opacity: 0;
    animation: mili-page-card-reveal 560ms cubic-bezier(0.22, 1, 0.36, 1) var(--mili-entry-delay, 160ms) forwards;
    will-change: transform, opacity, filter;
}

/* ============================================================
   공통 프리미티브 — 참고 design-system/components/PortalPrimitives.tsx
   ------------------------------------------------------------
   원본은 Tailwind 유틸 조합이라 CSS 규칙이 따로 없다. 계산된 값을 클래스로 고정한다.
   ============================================================ */

/* ActionButton — min-h-11 / px-4 / text-sm / font-bold + .mili-control .mili-action-button
   ⚠️ .mili-control 자체는 반경 0 이지만, ActionButton 은 .mili-action-button 을 함께 달아
      5px 로 되살린다(원본 147, 2026-08-03 개정). 각진 판 위의 살짝 둥근 버튼이 현재 규약이다. */
.mili-control {
    display: inline-flex;
    min-height: 44px;
    align-items: center;
    justify-content: center;
    gap: 8px;
    padding: 0 16px;
    border: 0;
    border-radius: 0;
    background: var(--mili-primary);
    color: var(--mili-primary-on);
    font-size: var(--mili-text-sm);
    font-weight: 700;
    line-height: 1;
    box-shadow: 3px 3px 0 rgb(0 0 0 / 42%);
    transition: color 0.18s ease, border-color 0.18s ease, background-color 0.18s ease, transform 0.18s ease,
        box-shadow 0.18s ease;
}

.mili-control:hover {
    background: var(--mili-primary-strong);
    color: var(--mili-primary-on);
}

.mili-control--subtle {
    border: 1px solid var(--mili-border);
    background: var(--mili-surface-interactive);
    color: var(--mili-text);
}

.mili-control--subtle:hover {
    border-color: var(--mili-border-strong);
    background: var(--mili-surface-interactive);
    color: var(--mili-text);
}

.mili-action-button {
    border-radius: var(--mili-radius-button);
}

.mili-control--block {
    width: 100%;
}

.mili-control:disabled,
.mili-control[aria-disabled="true"] {
    opacity: 0.55;
    box-shadow: none;
}

/* 라이트에서는 원본이 컨트롤 그림자를 통째로 끈다(원본 294–295). */
.mili-light .mili-control {
    box-shadow: none;
}

/* PageHeading — eyebrow 는 원본에서도 렌더되지 않는다(구조분해 누락). 만들지 않는다. */
.mili-entry-heading {
    display: flex;
    flex-direction: column;
    gap: 16px;
    margin-bottom: 28px;
    padding-bottom: 24px;
    border-bottom: 1px solid var(--mili-border);
}

.mili-entry-heading h1 {
    color: var(--mili-text);
    font-size: 30px;
    font-weight: 700;
}

.mili-entry-heading p {
    margin-top: 12px;
    max-width: 672px;
    color: var(--mili-text-secondary);
    font-size: var(--mili-text-sm);
    line-height: 24px;
}

@media (min-width: 768px) {
    .mili-entry-heading {
        flex-direction: row;
        align-items: flex-end;
        justify-content: space-between;
    }

    .mili-entry-heading h1 {
        font-size: 36px;
    }
}

/* EmptyState — Panel 안에 아이콘 박스 + 제목 + 설명 */
.mili-empty-state {
    display: grid;
    min-height: 300px;
    place-items: center;
    padding: 32px;
    text-align: center;
}

/* 2026-08-03 개정 — 56px 테두리 박스를 걷고 라임 아이콘만 남겼다
   (PortalPrimitives.tsx:56, `mx-auto block w-fit text-[var(--mili-primary)]`). */
.mili-empty-state__icon {
    display: block;
    width: fit-content;
    margin: 0 auto;
    color: var(--mili-primary);
    font-size: 24px;
    line-height: 1;
}

.mili-empty-state__title {
    margin-top: 20px;
    color: var(--mili-text);
    font-size: var(--mili-text-lg);
    font-weight: 700;
}

.mili-empty-state__copy {
    margin-top: 12px;
    color: var(--mili-text-secondary);
    font-size: var(--mili-text-sm);
    line-height: 24px;
}

/* 라임 대문자 소제목 — 원본 742–747 */
.mili-eyebrow {
    color: var(--mili-primary);
    font-size: var(--mili-text-xs);
    font-weight: 900;
}

/* ============================================================
   강의 카드 · 필터 — 원본 429–459
   ------------------------------------------------------------
   카드에는 썸네일 이미지가 없다. 80px 높이의 레벨 그라디언트 헤더 스트립뿐이다.
   ============================================================ */
.mili-course-card {
    background: var(--mili-surface);
    border: 0;
    border-radius: var(--mili-radius-card);
    transition: none;
}

.mili-course-header {
    background: var(--course-header);
}

.mili-course-card[data-course-level="basic"] {
    --course-accent: #65d14a;
    --course-header: linear-gradient(112deg, #079879 0%, #b5e95c 100%);
}

.mili-course-card[data-course-level="intermediate"] {
    --course-accent: #62a1ff;
    --course-header: linear-gradient(112deg, #2458d8 0%, #559aff 100%);
}

.mili-course-card[data-course-level="advanced"] {
    --course-accent: #ff9a4d;
    --course-header: linear-gradient(112deg, #ee6b31 0%, #ed76bc 100%);
}

.mili-course-card[data-course-level="basic"] .mili-course-accent {
    color: #46d559;
}

.mili-course-card[data-course-level="intermediate"] .mili-course-accent {
    color: #72b4ff;
}

.mili-course-card[data-course-level="advanced"] .mili-course-accent {
    color: #ff996a;
}

.mili-course-accent {
    color: var(--course-accent);
}

/* --course-accent 는 [data-palette] 로 바뀌는 동적 값이라 -rgb 짝을 만들 수 없다.
   구형 브라우저에서는 중성 알파로, color-mix 를 아는 브라우저에서는 원본 값으로 그린다. */
.mili-course-tag {
    border: 1px solid rgb(255 255 255 / 24%);
    background: rgb(255 255 255 / 8%);
    color: var(--course-accent);
}

@supports (color: color-mix(in srgb, red 50%, transparent)) {
    .mili-course-tag {
        border-color: color-mix(in srgb, var(--course-accent) 40%, transparent);
        background: color-mix(in srgb, var(--course-accent) 14%, transparent);
    }
}

.mili-course-filter {
    display: inline-flex;
    min-height: 40px;
    align-items: center;
    justify-content: center;
    padding: 0 20px;
    border: 1px solid var(--mili-border);
    border-radius: var(--mili-radius-filter);
    background: transparent;
    color: var(--mili-text-secondary);
    font-size: var(--mili-text-sm);
    font-weight: 700;
    line-height: normal;
}

.mili-course-filter:hover,
.mili-course-filter:focus-visible {
    border-color: var(--mili-primary-border);
    color: var(--mili-primary);
}

.mili-course-filter.is-active {
    border-color: var(--mili-primary);
    background: var(--mili-primary);
    color: var(--mili-primary-on);
}

/* ============================================================
   강의 상세 히어로 — 원본 515–543
   ------------------------------------------------------------
   히어로만 LNB 오른쪽 경계부터 화면 끝까지 풀블리드로 번진다.
   컨테이너 쿼리 단위(cqw)를 써서 본문 그리드 시작선은 유지한다.
   ============================================================ */
.mili-page-shell:has(.mili-course-detail-hero) {
    container-type: inline-size;
    overflow-x: clip;
}

.mili-page-grid:has(.mili-course-detail-hero) {
    padding-top: 0;
}

.mili-course-detail-hero {
    width: 100cqw;
    margin-left: calc((100% - 100cqw) / 2);
    background-color: var(--course-header);
    background-position: center;
    background-repeat: no-repeat;
    background-size: cover;
    border: 1px solid var(--mili-border);
}

@supports (color: color-mix(in srgb, red 50%, transparent)) {
    .mili-course-detail-hero {
        border-color: color-mix(in srgb, var(--course-accent) 55%, var(--mili-border));
    }
}

.mili-course-detail-hero > div {
    margin-left: calc((100cqw - min(calc(100cqw - (var(--mili-page-padding) * 2)), var(--mili-content-max))) / 2);
}

.mili-course-detail-hero[data-course-level="basic"] {
    --course-accent: #46d559;
}

.mili-course-detail-hero[data-course-level="intermediate"] {
    --course-accent: #72b4ff;
}

.mili-course-detail-hero[data-course-level="advanced"] {
    --course-accent: #ff996a;
}

/* 상세 안의 패널은 12px 로 되살린다(원본 566–568). */
.mili-page-grid:has(.mili-course-detail-hero) .mili-frame,
.mili-page-grid:has(.mili-course-detail-hero) .mili-frame > article {
    border-radius: var(--mili-radius-card);
}

/* 난이도 배지만 글자가 검정이다(원본 569). 반경은 위 .mili-tag 규약(99px)을 따른다. */
.mili-course-detail-level {
    color: #000;
}

.mili-page-shell:has(.mili-course-detail-hero[data-course-level="basic"]) .mili-course-detail-level {
    background: #b5e95c;
}

.mili-page-shell:has(.mili-course-detail-hero[data-course-level="intermediate"]) .mili-course-detail-level {
    background: #5d94ed;
}

.mili-page-shell:has(.mili-course-detail-hero[data-course-level="advanced"]) .mili-course-detail-level {
    background: #ff996a;
}

/* ============================================================
   내 학습 카드 — 원본 462–514
   ============================================================ */
.mili-learning-page .mili-entry-heading {
    border-bottom: 1px solid var(--mili-border);
    padding-bottom: 32px;
}

.mili-learning-tabs {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
    margin-top: 32px;
}

.mili-learning-tabs button,
.mili-learning-tabs a {
    display: inline-flex;
    min-height: 40px;
    align-items: center;
    justify-content: center;
    padding: 0 20px;
    border: 1px solid var(--mili-border);
    border-radius: var(--mili-radius-filter);
    background: transparent;
    color: var(--mili-text-secondary);
    font-size: var(--mili-text-sm);
    font-weight: 700;
}

.mili-learning-tabs button:hover,
.mili-learning-tabs button:focus-visible,
.mili-learning-tabs a:hover,
.mili-learning-tabs a:focus-visible {
    border-color: var(--mili-primary-border);
    color: var(--mili-primary);
}

.mili-learning-tabs button.is-active,
.mili-learning-tabs a.is-active {
    border-color: var(--mili-primary);
    background: var(--mili-primary);
    color: var(--mili-primary-on);
}

.mili-learning-grid {
    display: grid;
    grid-template-columns: repeat(1, minmax(0, 1fr));
    gap: 24px;
    margin-top: 18px;
}

@media (min-width: 680px) {
    .mili-learning-grid {
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }
}

@media (min-width: 1024px) {
    .mili-learning-grid {
        grid-template-columns: repeat(3, minmax(0, 1fr));
    }
}

.mili-learning-card {
    overflow: hidden;
    border: 0;
    border-radius: var(--mili-radius-card);
    background: var(--mili-surface-raised);
    color: var(--mili-text);
    text-align: left;
    box-shadow: none;
}

.mili-learning-card:focus-visible {
    outline: 2px solid var(--mili-focus);
    outline-offset: 3px;
}

.mili-learning-card-cover {
    display: flex;
    height: 80px;
    align-items: center;
    justify-content: space-between;
    padding: 0 20px;
    background-color: #218f79;
    background-position: center;
    background-size: 100% 100%;
}

.mili-learning-card-icon,
.mili-learning-card-students {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    color: #f8f9fa;
}

.mili-learning-card-icon {
    width: 38px;
    height: 38px;
    border-radius: var(--mili-radius-pill);
    background: rgb(26 29 34 / 24%);
}

.mili-learning-card-students {
    gap: 5px;
    min-height: 36px;
    padding: 0 13px;
    border-radius: var(--mili-radius-badge);
    background: rgb(26 29 34 / 34%);
    font-size: var(--mili-text-sm);
    font-weight: 700;
    white-space: nowrap;
}

.mili-learning-card-body {
    display: flex;
    min-height: 280px;
    flex-direction: column;
    padding: 22px 24px 20px;
}

button.mili-learning-card-body {
    width: 100%;
    border: 0;
    background: transparent;
    color: inherit;
    text-align: left;
}

.mili-learning-card-meta {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    color: var(--mili-text-secondary);
    font-size: var(--mili-text-sm);
}

.mili-learning-card h2 {
    margin-top: 12px;
    font-size: var(--mili-text-md);
    font-weight: 700;
    line-height: 1.5;
}

/* 레벨이 지정된 카드(= VOD 강의)만 제목이 한 단 크다(2026-08-03 핸드오프). */
.mili-learning-card[data-course-level] h2 {
    font-size: 18px;
}

.mili-learning-card p {
    margin-top: 10px;
    color: #f8f9fa;
    font-size: var(--mili-text-sm);
    line-height: 1.5;
}

.mili-learning-progress-wrap {
    margin-top: auto;
}

.mili-learning-progress-wrap > b {
    display: block;
    margin: 0 0 12px auto;
    color: var(--mili-primary);
    font-size: var(--mili-text-lg);
    font-weight: 700;
    line-height: 1;
    text-align: right;
}

.mili-learning-progress {
    height: 7px;
    overflow: hidden;
    background: rgba(var(--mili-text-muted-rgb), 0.24);
}

.mili-learning-progress i {
    display: block;
    height: 100%;
    background: var(--mili-primary);
}

.mili-learning-card-action {
    display: flex;
    align-items: center;
    gap: 5px;
    margin-top: 18px;
    color: var(--mili-primary);
    font-size: var(--mili-text-sm);
    font-weight: 700;
}

.mili-learning-card-bookmark {
    border: 0;
    cursor: pointer;
    transition: transform 180ms ease, background-color 180ms ease, color 180ms ease, box-shadow 180ms ease;
}

.mili-learning-card-bookmark svg {
    transition: transform 180ms ease, fill 180ms ease;
}

.mili-learning-card-bookmark:hover {
    transform: scale(1.06);
}

.mili-learning-card-bookmark:focus-visible {
    outline: 2px solid var(--mili-focus);
    outline-offset: 3px;
}

.mili-learning-card-bookmark.is-saved {
    background: rgb(26 29 34 / 24%);
    color: #f8f9fa;
    box-shadow: none;
}

.mili-learning-card-bookmark.is-saved svg {
    transform: scale(1.04);
    fill: currentColor;
}

.mili-learning-project-card .mili-learning-card-cover {
    background-image: linear-gradient(112deg, #2458d8 0%, #559aff 100%);
}

@media (max-width: 639px) {
    .mili-learning-page .mili-entry-heading {
        padding-bottom: 24px;
    }

    .mili-learning-tabs {
        margin-top: 24px;
    }

    .mili-learning-tabs button,
    .mili-learning-tabs a {
        flex: 1 1 auto;
        padding: 0 12px;
        font-size: var(--mili-text-xs);
    }

    .mili-learning-card-cover {
        height: 82px;
        padding: 0 16px;
    }

    .mili-learning-card-icon {
        width: 42px;
        height: 42px;
    }

    .mili-learning-card-students {
        min-height: 34px;
        padding: 0 12px;
        font-size: var(--mili-text-xs);
    }

    .mili-learning-card-body {
        min-height: 224px;
        padding: 18px 18px 16px;
    }
}

/* ============================================================
   보상 오버레이 — 원본 191–221
   ------------------------------------------------------------
   2026-08-03 에 전면 재설계됐다. 옛 "코너 브라켓 + Mission Complete 글로우" 판은
   통째로 사라지고(.mili-reward-corner*, .mili-report-label, .mili-complete-stage,
   .mili-mission-complete 및 title-* 키프레임 전부 삭제), 아래 카드형으로 바뀌었다.
   ============================================================ */
.mili-reward-overlay {
    position: fixed;
    inset: 0;
    z-index: 120;
    display: grid;
    place-items: center;
    overflow-x: hidden;
    overflow-y: auto;
    overscroll-behavior-x: none;
    padding: 24px;
}

.mili-reward-dim {
    position: absolute;
    inset: 0;
    background: rgb(0 0 0 / 74%);
}

.mili-reward-scan {
    position: absolute;
    inset: 0;
    pointer-events: none;
    background: linear-gradient(90deg, transparent 0%, rgb(183 255 49 / 7%) 48%, transparent 52%);
    animation: mili-reward-scan 2.8s linear infinite;
    will-change: transform;
}

html:has(.mili-reward-overlay),
body:has(.mili-reward-overlay) {
    overflow-x: hidden;
}

.mili-reward-modal {
    position: relative;
    width: min(100%, 708px);
    border: 1px solid #2b3036;
    border-radius: 0;
    background: #0e1013;
    padding: 66px 50px 40px;
    box-shadow: 0 0 36px rgb(183 255 49 / 16%);
    animation: mili-reward-enter 0.5s cubic-bezier(0.16, 1, 0.3, 1) both;
}

.mili-reward-divider {
    height: 1px;
    background: #2b3036;
}

.mili-reward-heading {
    padding: 48px 20px 54px;
    text-align: center;
}

.mili-reward-heading h2 {
    margin: 0;
    color: #fff;
    font-family: var(--mili-font-metric);
    font-optical-sizing: auto;
    font-size: clamp(38px, 5vw, 50px);
    font-weight: 800;
    line-height: 1;
}

.mili-reward-heading p {
    margin: 16px 0 0;
    color: #f2f4f0;
    font-size: 14px;
    font-weight: 700;
}

.mili-reward-grid {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 10px;
    margin-top: 38px;
}

.mili-reward-item {
    position: relative;
    min-height: 122px;
    overflow: hidden;
    border: 1px solid #2b3036;
    background: #15181c;
    padding: 17px 14px;
    opacity: 0;
    animation: mili-reward-item 0.45s cubic-bezier(0.16, 1, 0.3, 1) forwards;
}

.mili-reward-item p {
    position: relative;
    z-index: 1;
    margin: 0;
    color: #b7ff31;
    font-size: 11px;
    font-weight: 800;
    line-height: 1.25;
}

.mili-reward-item b {
    position: relative;
    z-index: 1;
    display: block;
    margin-top: 6px;
    color: #fff;
    font-size: 19px;
    font-weight: 800;
    line-height: 1.2;
}

.mili-reward-item small {
    display: inline-block;
    margin-left: 4px;
    border-radius: 0;
    background: #a9f541;
    padding: 2px 4px;
    color: #0e1013;
    font-size: 9px;
    vertical-align: middle;
}

.mili-reward-metric,
.mili-reward-xp-display {
    font-family: var(--mili-font-metric);
    font-optical-sizing: auto;
    font-variant-numeric: tabular-nums;
}

.mili-reward-art {
    position: absolute;
    right: 12px;
    bottom: 9px;
    pointer-events: none;
}

.mili-reward-art img {
    display: block;
    width: auto;
    height: auto;
    object-fit: contain;
}

.mili-reward-art-light {
    display: none !important;
}

.mili-reward-art-streak img {
    width: 58px;
    height: 76px;
}

.mili-reward-art-attendance img {
    width: 66px;
    height: 69px;
}

.mili-reward-art-badge {
    right: 10px;
    bottom: 7px;
}

.mili-reward-art-badge img {
    width: 76px;
    height: auto;
}

.mili-reward-xp-display {
    position: absolute;
    right: 12px;
    bottom: 7px;
    background: linear-gradient(to bottom, #0e1013 0%, #628739 100%);
    -webkit-background-clip: text;
    background-clip: text;
    color: transparent;
    -webkit-text-fill-color: transparent;
    font-size: 43px;
    font-weight: 800;
    line-height: 1;
}

.mili-reward-footnote {
    margin: 22px 0 12px;
    color: rgb(255 255 255 / 48%);
    text-align: center;
    font-size: 10px;
    line-height: 1.5;
}

.mili-reward-confirm {
    display: flex;
    width: 240px;
    min-height: 40px;
    margin: 0 auto;
    align-items: center;
    justify-content: center;
    gap: 8px;
    border: 0;
    border-radius: var(--mili-radius-button);
    background: #b7ff31;
    padding: 0 16px;
    color: #0e1013;
    font-size: 14px;
    font-weight: 500;
    line-height: 1;
}

.mili-reward-confirm img {
    display: block;
    width: 15px;
    height: 15px;
}

.mili-reward-confirm:hover,
.mili-reward-confirm:focus-visible {
    background: #c8ff5f;
}

/* 라이트 — 원본 262–271 */
.mili-light .mili-reward-dim {
    background: rgb(18 24 20 / 62%);
}

.mili-light .mili-reward-modal {
    border-color: #e1e5dc;
    background: #fff;
    box-shadow: 0 0 36px rgb(109 159 23 / 14%);
}

.mili-light .mili-reward-divider,
.mili-light .mili-reward-item {
    border-color: #e1e5dc;
}

.mili-light .mili-reward-divider {
    background: #e1e5dc;
}

.mili-light .mili-reward-item {
    background: #f7f8f4;
}

.mili-light .mili-reward-heading h2,
.mili-light .mili-reward-heading p,
.mili-light .mili-reward-item b {
    color: #1b1d1b;
}

.mili-light .mili-reward-item p {
    color: #6d9f17;
}

.mili-light .mili-reward-art:not(.mili-reward-art-badge) .mili-reward-art-dark {
    display: none !important;
}

.mili-light .mili-reward-art-light {
    display: block !important;
}

.mili-light .mili-reward-xp-display {
    background-image: linear-gradient(to bottom, #f7f8f4 0%, #78ae28 100%);
}

@keyframes mili-reward-enter {
    from {
        opacity: 0;
        transform: translateY(22px) scale(0.96);
    }

    to {
        opacity: 1;
        transform: translateY(0) scale(1);
    }
}

@keyframes mili-reward-item {
    from {
        opacity: 0;
        transform: translateY(14px);
    }

    to {
        opacity: 1;
        transform: translateY(0);
    }
}

@keyframes mili-reward-scan {
    from {
        transform: translateX(-100%);
    }

    to {
        transform: translateX(100%);
    }
}

@media (max-width: 620px) {
    .mili-reward-overlay {
        padding: 16px;
    }

    .mili-reward-modal {
        padding: 34px 24px 28px;
    }

    .mili-reward-heading {
        padding: 35px 8px 40px;
    }

    .mili-reward-grid {
        margin-top: 26px;
    }

    .mili-reward-item {
        min-height: 110px;
    }

    .mili-reward-xp-display {
        font-size: 32px;
    }
}

/* ============================================================
   뱃지 마크 — 원본 302–304
   ============================================================ */
.mili-badge-mark {
    display: grid;
    width: 54px;
    height: 54px;
    place-items: center;
    clip-path: polygon(25% 7%, 75% 7%, 100% 50%, 75% 93%, 25% 93%, 0 50%);
    background: linear-gradient(135deg, #fff2a8, #b88a26 58%, #564217);
    box-shadow: 0 8px 14px rgb(110 77 16 / 18%);
    color: #2a230e;
    font-weight: 900;
}

.mili-badge-mark[data-shape="shield"] {
    clip-path: polygon(50% 0, 92% 17%, 84% 73%, 50% 100%, 16% 73%, 8% 17%);
}

.mili-badge-mark[data-shape="circle"] {
    clip-path: circle(48%);
}

/* ============================================================
   모션 감소 — 원본 245
   ------------------------------------------------------------
   ⚠️ 한 블록에 모아 둔다. 나눠 두면 한쪽만 고치는 사고가 난다.
   ============================================================ */
@media (prefers-reduced-motion: reduce) {
    .mili-reward-scan,
    .mili-reward-modal,
    .mili-reward-item,
    .mili-page-card-reveal {
        animation: none !important;
        opacity: 1 !important;
        transform: none !important;
        filter: none !important;
    }
}
