/* ===================================================================================================
    로그인(templates/system/account/login.html) — 로그인 전용 셸(_layout/empty)이 tokens · base · font-style · theme 를 싣는다.
    - 입력 · 버튼은 원자(gn-controls: .form-floating.gn-field · .gn-btn), 아이콘은 bootstrap-icons.
    - 모바일 우선: 기본은 한 칸 카드(폼만), lg 부터 오른쪽에 그림 칸이 붙는 두 칸 카드.
    - 자체 CSS 를 쓰는 이유(규칙 2): 배경 그라데이션 · 두 칸 카드 · 입력칸 안의 비밀번호 보기 버튼은 BS 에 없다.
=================================================================================================== */
.gn-login {
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: 100vh;
    min-height: 100dvh;
    padding: var(--gn-space-5) var(--gn-space-4);
    background:
        radial-gradient(60rem 30rem at 15% -10%, var(--gn-blue-100), transparent 60%),
        radial-gradient(50rem 28rem at 100% 110%, var(--gn-blue-50), transparent 60%),
        var(--gn-color-bg-body);
    letter-spacing: 0;
}
.gn-login-card {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    width: 100%;
    max-width: 62rem;
    overflow: hidden;
    border: 1px solid var(--gn-color-border-default);
    border-radius: var(--gn-radius-xl);
    background: var(--gn-color-bg-surface);
    box-shadow: var(--gn-shadow-xl);
}
@media (min-width: 992px) {
    .gn-login-card { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
}

/* 폼 칸 */
.gn-login-form {
    display: flex;
    align-items: center;
    padding: var(--gn-space-8) var(--gn-space-5);
}
@media (min-width: 768px) {
    .gn-login-form { padding: var(--gn-space-8) var(--gn-space-8); }
}
.gn-login-inner { width: 100%; max-width: 24rem; margin: 0 auto; }
.gn-login-logo { display: inline-flex; margin-bottom: var(--gn-space-7); }
.gn-login-logo img { height: 2rem; }
.gn-login-title {
    margin: 0 0 var(--gn-space-6);
    font-size: var(--gn-font-size-2xl);
    line-height: 1.4;
    font-weight: var(--gn-font-weight-bold);
    letter-spacing: -0.02em;
    color: var(--gn-color-text-primary);
    word-break: keep-all;
}
.gn-login-fields { display: grid; gap: var(--gn-space-4); }

/* 비밀번호 칸 — 오른쪽 안에 보기 버튼 */
.gn-login-pwd { position: relative; }
.gn-login-pwd .form-control { padding-right: 3rem; }
.gn-login-eye {
    position: absolute;
    top: 1.8125rem;                                /* 입력칸 높이(3.5rem + 테두리)의 가운데 — 검증 메시지가 칸 아래에 붙어도 따라 내려가지 않는다 */
    right: var(--gn-space-2);
    z-index: 4;                                    /* form-floating 의 라벨(z 2~)보다 위 */
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 2rem;
    height: 2rem;
    padding: 0;
    border: 0;
    border-radius: var(--gn-radius-md);
    background: none;
    font-size: 1.0625rem;
    color: var(--gn-gray-500);
    transform: translateY(-50%);
}
/* 검증 오류 아이콘(BS .is-invalid 가 입력칸 오른쪽에 그린다)과 겹치지 않게 보기 버튼을 안쪽으로 */
.gn-login-pwd:has(.is-invalid) .gn-login-eye { right: 2.5rem; }
.gn-login-pwd .form-control.is-invalid { padding-right: 5rem; }
.gn-login-eye:hover { background: var(--gn-gray-100); color: var(--gn-gray-700); }
.gn-login-eye:focus-visible { outline: 0; box-shadow: var(--gn-shadow-focus); }

/* 안내 줄 — Caps Lock · 로그인 실패 */
.gn-login-hint,
.gn-login-alert {
    display: flex;
    align-items: center;
    gap: var(--gn-space-2);
    margin: var(--gn-space-4) 0 0;
    padding: var(--gn-space-3);
    border-radius: var(--gn-radius-md);
    font-size: 0.8125rem;
}
.gn-login-hint[hidden] { display: none; }
.gn-login-hint { background: var(--gn-status-share-bg); color: var(--gn-status-share-fg); }
.gn-login-alert { background: var(--gn-status-reject-bg); color: var(--gn-status-reject-fg); }
.gn-login-submit { margin-top: var(--gn-space-6); }
.gn-login-submit .spinner-border { margin-right: var(--gn-space-2); }

/* 그림 칸 — lg 이상에서만 */
.gn-login-art { display: none; }
@media (min-width: 992px) {
    .gn-login-art {
        display: flex;
        align-items: center;
        justify-content: center;
        padding: var(--gn-space-8);
        border-left: 1px solid var(--gn-color-border-default);
        background: linear-gradient(160deg, var(--gn-blue-50), var(--gn-gray-50));
    }
    .gn-login-art img { width: 100%; max-width: 26rem; height: auto; }
}

/* ── 세션 종료(templates/system/account/session-ended.html) — 같은 카드를 한 칸으로 ─────────────────────────── */
.gn-login-card-single { max-width: 28rem; text-align: center; }
@media (min-width: 992px) {
    .gn-login-card.gn-login-card-single { grid-template-columns: minmax(0, 1fr); }
}
.gn-login-card-single .gn-login-logo { display: flex; justify-content: center; }
.gn-login-card-single .gn-login-title { margin-bottom: var(--gn-space-2); }
.gn-login-done-icon {
    display: flex;
    margin-inline: auto;
    align-items: center;
    justify-content: center;
    width: 3.5rem;
    height: 3.5rem;
    margin-bottom: var(--gn-space-5);
    border-radius: var(--gn-radius-circle);
    background: var(--gn-blue-50);
    font-size: 1.5rem;
    color: var(--gn-blue-600);
}
.gn-login-done-desc { margin: 0; font-size: var(--gn-font-size-sm); line-height: var(--gn-line-height-relaxed); color: var(--gn-color-text-muted); }
