/* ============================================================
 * 페이지 inline <style> 통합 (W3C 표준 준수 — body 내 style 금지)
 * 기존 각 JSP의 <style> 블록을 외부 CSS로 이전.
 * ============================================================ */

/* ------------------------------------------------------------
 * layout/footer.jsp — 공통 로딩 스피너 (app:loading:show/hide)
 * ------------------------------------------------------------ */
.app-loading-spinner {
    display: inline-block;
    width: 40px;
    height: 40px;
    border: 4px solid #d3dae6;
    border-top-color: #0a4dcb;
    border-radius: 50%;
    animation: appLoadingSpin 0.7s linear infinite;
}
@keyframes appLoadingSpin {
    to { transform: rotate(360deg); }
}

/* ------------------------------------------------------------
 * 공통: archive-container의 no-data 메시지
 * (사용 페이지: conts/list, conts/sectionDetail, fclt/list,
 *  intg/book/list, intg/fclt/list, intg/rcds/list, intg/prsn/list,
 *  pvData/main, tmln/list)
 * ------------------------------------------------------------ */
.archive-container .no-data {
    border: 1px solid #dfdfdf;
    border-radius: 6px;
    display: flex;
    justify-content: center;
    align-items: center;
    padding: 40px 20px;
    min-height: 100px;
}
.archive-container .no-data .txt {
    color: #767676;
}

/* ------------------------------------------------------------
 * 공통: AJAX fade-in 전환
 * (사용 페이지: actv/book, actv/cult, actv/edu, actv/lib,
 *  prgrm/evnt, prgrm/exhb)
 * ------------------------------------------------------------ */
.result-group-body > * {
    transition: opacity 0.25s ease;
}

/* ============================================================
 * actv/edu/list.jsp — fullcalendar popover 숨김
 * ============================================================ */
.fc-popover-misc,
.fc-more-popover-misc {
    display: none !important;
}

/* ============================================================
 * actv/hstry/list.jsp — 타임라인 영역 로딩 + fade-in
 * ============================================================ */
@keyframes pvSpin {
    to { transform: rotate(360deg); }
}

.highlight-area {
    position: relative;
}
.highlight-area #timelineWrap {
    min-height: 200px;
}
.highlight-area.is-loading #timelineWrap {
    visibility: hidden;
}
.highlight-area.is-loading::after {
    content: '';
    position: absolute;
    top: 50%; left: 50%;
    width: 28px; height: 28px;
    margin: -14px 0 0 -14px;
    border: 3px solid #ddd;
    border-top-color: #256ef4;
    border-radius: 50%;
    animation: pvSpin 0.6s linear infinite;
    z-index: 1;
}
.highlight-area #timelineWrap > * {
    opacity: 0;
    transform: translateY(10px);
    transition: opacity 0.3s ease, transform 0.3s ease;
}
.event-detail-item.is-active > .event-card {
    outline: 2px solid #2462d6;
    border-color: transparent;
}
.highlight-area.is-loaded #timelineWrap > * {
    opacity: 1;
    transform: translateY(0);
}

/* ============================================================
 * actv/main.jsp + prgrm/main.jsp — 섹션 높이 고정 (점프 방지)
 * ============================================================ */
.section-exhibition .section-body { min-height: 80px; }
.section-exhibition .slider-wrapper.card-list-wrap {
    height: 590px;
    overflow: hidden;
}
.exhibition-container .no-data {
    height: 590px;
    padding: 0 20px;
}
@media (max-width: 1279px) {
    .section-exhibition .slider-wrapper.card-list-wrap,
    .exhibition-container .no-data { height: 480px; }
}
@media (max-width: 767px) {
    .section-exhibition .slider-wrapper.card-list-wrap,
    .exhibition-container .no-data { height: 400px; }
}

/* prgrm/main 전용 오버라이드 (더 큰 높이) */
body.prgrm-main .section-exhibition .section-body { min-height: 540px; }
body.prgrm-main .section-exhibition .slider-wrapper.card-list-wrap,
body.prgrm-main .exhibition-container .no-data {
    height: 540px;
}
@media (max-width: 1279px) {
    body.prgrm-main .section-exhibition .section-body { min-height: 440px; }
    body.prgrm-main .section-exhibition .slider-wrapper.card-list-wrap,
    body.prgrm-main .exhibition-container .no-data { height: 440px; }
}
@media (max-width: 767px) {
    body.prgrm-main .section-exhibition .section-body { min-height: 360px; }
    body.prgrm-main .section-exhibition .slider-wrapper.card-list-wrap,
    body.prgrm-main .exhibition-container .no-data { height: 360px; }
}

/* ============================================================
 * com/fileViewer.jsp — 파일 뷰어 팝업
 * ============================================================ */
body.file-viewer { margin: 0; padding: 0; height: 100%; overflow: hidden; background: #2b2b2b; }
.file-viewer .viewer-toolbar {
    display: flex; align-items: center; justify-content: space-between;
    height: 48px; padding: 0 16px; background: #323232; color: #fff; font-size: 14px;
    box-shadow: 0 1px 4px rgba(0,0,0,0.3); z-index: 10; position: relative;
}
.file-viewer .viewer-toolbar .file-name {
    font-weight: 500; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 60%;
}
.file-viewer .viewer-toolbar .toolbar-actions {
    display: flex; gap: 8px; align-items: center;
}
.file-viewer .viewer-toolbar button,
.file-viewer .viewer-toolbar a {
    background: rgba(255,255,255,0.1); border: none; color: #fff; padding: 6px 12px;
    border-radius: 4px; cursor: pointer; font-size: 13px; text-decoration: none;
    display: inline-flex; align-items: center; gap: 4px;
}
.file-viewer .viewer-toolbar button:hover,
.file-viewer .viewer-toolbar a:hover {
    background: rgba(255,255,255,0.2);
}
.file-viewer .viewer-content {
    height: calc(100% - 48px); overflow: auto; display: flex; justify-content: center; align-items: flex-start;
}
.file-viewer #pdf-container {
    width: 100%; height: 100%; overflow: auto; padding: 16px 0;
    display: flex; flex-direction: column; align-items: center; gap: 8px;
}
.file-viewer #pdf-container canvas {
    box-shadow: 0 2px 8px rgba(0,0,0,0.5); max-width: 100%;
}
.file-viewer .pdf-page-info { color: #aaa; font-size: 12px; margin-top: 4px; }
.file-viewer .image-viewer {
    display: flex; justify-content: center; align-items: center;
    width: 100%; height: 100%; padding: 16px; box-sizing: border-box;
}
.file-viewer .image-viewer img { max-width: 100%; max-height: 100%; object-fit: contain; }
.file-viewer .loading { color: #aaa; font-size: 16px; text-align: center; padding-top: 100px; }
.file-viewer .page-nav { display: flex; align-items: center; gap: 8px; }
.file-viewer .page-nav input {
    width: 50px; text-align: center; background: rgba(255,255,255,0.1);
    border: 1px solid rgba(255,255,255,0.3); color: #fff; padding: 4px; border-radius: 4px;
}
.file-viewer .page-nav span { color: #ccc; font-size: 13px; }

/* ============================================================
 * error/error.jsp — 에러 페이지
 * ============================================================ */
.error-page {
    display: flex; flex-direction: column; align-items: center; justify-content: center;
    min-height: 100vh; padding: 40px 20px; text-align: center;
    background: #F8FAFC; font-family: 'Pretendard', 'Noto Sans KR', sans-serif;
}
.error-page .error-icon { width: 120px; height: 120px; margin-bottom: 40px; position: relative; }
.error-page .error-icon-circle {
    width: 120px; height: 120px; border-radius: 50%;
    background: linear-gradient(135deg, #E8F0FE 0%, #D4E3FC 100%);
    display: flex; align-items: center; justify-content: center;
}
.error-page .error-code {
    font-size: 48px; font-weight: 800; color: #1A4292;
    margin: 0 0 12px 0; letter-spacing: -1px;
}
.error-page .error-msg { font-size: 18px; color: #333; font-weight: 600; margin: 0 0 8px 0; }
.error-page .error-desc { font-size: 14px; color: #888; line-height: 1.7; margin: 0 0 48px 0; }
.error-page .error-actions { display: flex; gap: 12px; flex-wrap: wrap; justify-content: center; }
.error-page .btn-home {
    display: inline-flex; align-items: center; gap: 8px;
    padding: 14px 36px; background: #1A4292; color: #fff;
    border-radius: 8px; font-size: 15px; font-weight: 600;
    text-decoration: none; border: none; cursor: pointer; transition: background 0.2s;
}
.error-page .btn-home:hover { background: #143573; }
.error-page .btn-back {
    display: inline-flex; align-items: center; gap: 8px;
    padding: 14px 36px; background: #fff; color: #1A4292;
    border: 1px solid #1A4292; border-radius: 8px;
    font-size: 15px; font-weight: 600; text-decoration: none;
    cursor: pointer; transition: background 0.2s;
}
.error-page .btn-back:hover { background: #F0F4FF; }
.error-page .error-footer { margin-top: 60px; font-size: 12px; color: #aaa; }

/* ============================================================
 * intro/stats.jsp — 통계 페이지
 * ============================================================ */
.period-summary { display: none !important; }

.stats-content-area { position: relative; min-height: 120px; }
.stats-loading {
    position: absolute; top: 0; left: 0; right: 0; bottom: 0;
    background: rgba(255,255,255,0.75); z-index: 10;
    display: flex; align-items: center; justify-content: center;
}
.stats-spinner {
    width: 32px; height: 32px;
    border: 3px solid #ddd; border-top-color: #3b82f6;
    border-radius: 50%;
    animation: statsSpin 0.7s linear infinite;
}
@keyframes statsSpin { to { transform: rotate(360deg); } }

.chart-slider-wrapper .btn-nav.swiper-button-disabled {
    opacity: 0.3;
    cursor: default;
    pointer-events: none;
}

.keyword-rank-list { min-height: 240px; }
.keyword-rank-list .no-data-txt {
    display: flex; align-items: center; justify-content: center;
    min-height: 240px; text-align: center; color: #888;
}
.chart-body > .no-data-txt {
    display: flex; align-items: center; justify-content: center;
    min-height: 240px; text-align: center; color: #888;
}

.chart-full-wrapper {
    background: #fff; border-radius: 8px; padding: 0;
    border: 1px solid #e5e7eb;
}
.chart-full-wrapper .chart-head {
    background: #3b82f6; color: #fff; font-weight: 600;
    padding: 10px 20px; border-radius: 8px 8px 0 0; font-size: 15px;
}
.chart-full-wrapper .chart-body { padding: 12px 20px 16px; }

/* ============================================================
 * main.jsp — 메인 페이지 섹션 최소 높이
 * ============================================================ */
.section-exhibition .section-body,
.section-education .section-body,
.section-notice .tab-panel {
    min-height: 300px;
}

/* ============================================================
 * pvData/conts/detail.jsp — 보훈콘텐츠 상세
 * ============================================================ */
.visual-archive-container .visual-title,
.visual-archive-container .visual-desc {
    white-space: pre-line;
}
.visual-slider .swiper-slide iframe,
.visual-slider .swiper-slide video {
    width: 100%; height: 100%; border: none;
}
._conts-reveal { animation: contsFadeIn 0.4s ease-out; }
@keyframes contsFadeIn {
    from { opacity: 0; transform: translateY(16px); }
    to { opacity: 1; transform: translateY(0); }
}

/* ============================================================
 * pvData/intg/hstry/list.jsp + srch/section/hstry.jsp — 역사 배지 인라인
 * ============================================================ */
.result-group .history-list .item .info .title,
.history-list .item .info .title {
    display: inline;
}
.result-group .history-list .item .info .title .badge,
.history-list .item .info .title .badge {
    vertical-align: middle;
    margin-left: 4px;
}
.result-group .history-list .item .info .desc {
    display: -webkit-box;
    overflow: hidden;
    text-overflow: ellipsis;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 3;
}

/* ============================================================
 * pvData/intg/hstry/detail.jsp + prsn/detail.jsp — 상세 보강
 * ============================================================ */
.archive-container .history-category.blue {
    border-color: #d6e4f9;
    background-color: #eaf0fa;
    color: #1a56a8;
}
.history-view-wrapper .info-list-wrap .title-area .title {
    font-size: 27px;
}
.archive-container .memorial-detail-content .txt {
    word-break: break-all;
    overflow-wrap: break-word;
}
.archive-container .result-group + .history-view-wrapper {
    margin-top: 24px;
}

/* ============================================================
 * pvData/intg/prsn/list.jsp + pvData/main.jsp + srch/section/prsn.jsp
 * — 인물 배지 + 이름 가로 정렬
 * ============================================================ */
.person-list .item .card .info {
    display: inline-flex !important;
    align-items: center;
    gap: 4px;
}
.person-list .item .card .info .badge {
    flex-shrink: 0;
    font-size: 11px;
    line-height: 1;
    padding: 2px 6px;
}
.person-list .item .card .info .name {
    width: auto !important;
    display: inline !important;
}

/* ============================================================
 * pvData/intg/book/_style.jsp — 도서 카드
 * ============================================================ */
.result-group .book-list.book-card-list {
    display: flex; flex-direction: column; gap: 12px;
}
.result-group .book-list.book-card-list > .item {
    border: 1px solid #e5e5e5;
    border-radius: 8px;
    padding: 20px 24px;
    background: #fff;
    transition: border-color 0.15s, box-shadow 0.15s;
}
.result-group .book-list.book-card-list > .item:hover {
    border-color: #c5c5c5;
    box-shadow: 0 2px 8px rgba(0,0,0,0.06);
}
.result-group .book-list.book-card-list > .item .info { width: 100%; }

.book-title-row { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.book-title-row .title {
    margin-bottom: 0 !important;
    font-size: 17px; font-weight: 600; color: #111;
}

.book-meta { margin-top: 10px; padding-top: 10px; border-top: 1px solid #f0f0f0; }
.book-meta-row { font-size: 14px; color: #555; line-height: 1.8; }
.book-meta-row dt, .book-meta-row dd { display: inline; margin: 0; }
.book-meta-row dt { font-weight: 600; color: #333; }
.book-meta-row dt::after { content: ' '; }
.book-meta-row .book-sep { margin: 0 8px; color: #ccc; }

/* ============================================================
 * pvData/intg/rcds/_style.jsp — 사료 카드
 * ============================================================ */
.result-group .book-list.rcds-list {
    display: flex; flex-direction: column; gap: 12px;
}
.result-group .book-list.rcds-list > .item {
    border: 1px solid #e5e5e5;
    border-radius: 8px;
    padding: 20px 24px;
    background: #fff;
    transition: border-color 0.15s, box-shadow 0.15s;
}
.result-group .book-list.rcds-list > .item:hover {
    border-color: #c5c5c5;
    box-shadow: 0 2px 8px rgba(0,0,0,0.06);
}
.result-group .book-list.rcds-list > .item .info { width: 100%; }

.rcds-title-row { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.rcds-title-row .title {
    margin-bottom: 0 !important;
    font-size: 17px; font-weight: 600; color: #111;
}
.rcds-clsf-badges { display: flex; gap: 4px; flex-shrink: 0; }
.rcds-clsf-badge {
    display: inline-block; padding: 2px 8px; border-radius: 3px;
    font-size: 12px; font-weight: 500;
}
.rcds-clsf-badge-INDEP { background: #eaf6ec; color: #008645; }
.rcds-clsf-badge-DMCR  { background: #e7f4fe; color: #2462d6; }
.rcds-clsf-badge-PTRT  { background: #fdefec; color: #dc2347; }

.rcds-meta { margin-top: 10px; padding-top: 10px; border-top: 1px solid #f0f0f0; }
.rcds-meta-row { font-size: 14px; color: #555; line-height: 1.8; }
.rcds-meta-row dt, .rcds-meta-row dd { display: inline; margin: 0; }
.rcds-meta-row dt { font-weight: 600; color: #333; }
.rcds-meta-row dt::after { content: ' '; }
.rcds-meta-row .rcds-sep { margin: 0 8px; color: #ccc; }

/* ============================================================
 * pvData/map/map.jsp — 지도 검색
 * ============================================================ */
.map-search-container .search-sort .btn-sort:not(.is-active) {
    filter: grayscale(100%);
    opacity: 0.55;
}
.map-search-container .search-sort .btn-sort {
    transition: filter 0.2s, opacity 0.2s;
}
.map-search-container .result-list .result-item::before {
    background-color: #ddd;
}
.map-search-container .result-list .result-item .btn-pin {
    display: none !important;
}
.map-search-container .result-list .result-item.is-active .btn-pin {
    display: flex !important;
}

.map-info-overlay {
    background: #fff;
    border-radius: 8px;
    box-shadow: 0 2px 12px rgba(0,0,0,0.18);
    min-width: 220px;
    max-width: 300px;
    position: relative;
    font-family: inherit;
}
.map-info-overlay .info-head {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 12px 14px 8px;
    border-bottom: 1px solid #eee;
}
.map-info-overlay .info-title {
    font-size: 15px;
    font-weight: 600;
    color: #333;
    flex: 1;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    line-height: 1.3;
}
.map-info-overlay .btn-info-close {
    background: none; border: none;
    font-size: 18px; color: #999; cursor: pointer;
    padding: 0 0 0 8px; line-height: 1;
}
.map-info-overlay .btn-info-close:hover { color: #333; }
.map-info-overlay .info-body { padding: 8px 14px 10px; }
.map-info-overlay .info-addr {
    font-size: 13px; color: #666; line-height: 1.45;
    margin: 0 0 6px; word-break: keep-all;
}
.map-info-overlay .info-badge {
    display: inline-block; padding: 2px 8px; border-radius: 3px;
    font-size: 12px; font-weight: 500;
}
.map-info-overlay .info-badge-green  { background: #eaf6ec; color: #008645; }
.map-info-overlay .info-badge-blue   { background: #e7f4fe; color: #2462d6; }
.map-info-overlay .info-badge-red    { background: #fdefec; color: #dc2347; }
.map-info-overlay .info-badge-gray   { background: #f0f0f0; color: #666; }
.map-info-overlay .info-foot { padding: 0 14px 12px; text-align: right; }
.map-info-overlay .btn-detail {
    background: #2a5db0; color: #fff; border: none; border-radius: 4px;
    padding: 6px 16px; font-size: 13px; cursor: pointer;
}
.map-info-overlay .btn-detail:hover { background: #1e4a8c; }
.map-info-overlay .info-tail {
    position: absolute;
    bottom: -8px; left: 50%;
    transform: translateX(-50%);
    width: 0; height: 0;
    border-left: 8px solid transparent;
    border-right: 8px solid transparent;
    border-top: 8px solid #fff;
}

/* ============================================================
 * srch/layout.jsp — 통합검색 결과 카드 4열 고정
 * ============================================================ */
.search-contents .result-group .card-list-wrap .card-list {
    flex-wrap: wrap;
}
.search-contents .result-group .card-list-wrap .card-list .card-item {
    flex: 0 1 calc(25% - 23px);
}
.search-contents .result-group .card-list-wrap .card-list .card-item .card-thumb {
    aspect-ratio: 270 / 370;
    overflow: hidden;
}
.search-contents .result-group .card-list-wrap .card-list .card-item .card-thumb img {
    width: 100%; height: 100%; object-fit: cover;
}
@media (max-width: 767px) {
    .search-contents .result-group .card-list-wrap .card-list .card-item {
        flex: 0 1 calc(50% - 15px);
    }
}
