/* 스크롤 방지 */
body.scroll_lock {
    position: fixed;
    width: 100%;
    overflow-y:hidden;
}

/* 이벤트 리스트 초기 렌더링 및 로딩 UI */
.skeleton-box,
.skeleton-line {
    background: linear-gradient(
            90deg,
            #eee 25%,
            #f5f5f5 37%,
            #eee 63%
    );
    background-size: 400% 100%;
    animation: skeleton 1.4s ease infinite;
}

.skeleton-line {
    display: block;
    height: 14px;
    margin-top: 8px;
    border-radius: 4px;
}

.skeleton-line.short {
    width: 40%;
}

.skeleton-line.half {
    width: 60%;
}

@keyframes skeleton {
    0% {
        background-position: 100% 0;
    }
    100% {
        background-position: 0 0;
    }
}


/* 레이지 로딩 관련 */
.lazy {
    background: #f5f5f5 url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='400' height='300'%3E%3Crect width='100%25' height='100%25' fill='%23f5f5f5'/%3E%3C/svg%3E") center center no-repeat;
}

.layout_card {
    --opacity: 1;
    opacity: var(--opacity);
    transition: opacity .3s ease;
}

@keyframes pulse {
    0% { --opacity: 0.4; }
    50% { --opacity: 0.7; }
    100% { --opacity: 0.4; }
}

.layout_card.is-loading {
    animation: pulse 1.2s ease-in-out infinite;
    pointer-events: none;
}

/* 페스티벌 리스트 전환 애니메이션 */
#festivalListLayout {
    transition: opacity 0.25s ease;
}

#festivalListLayout.is-loading {
    opacity: 0.4;
    pointer-events: none;
    animation: pulse 1.2s ease-in-out infinite;
}

@keyframes cardFadeIn {
    from { opacity: 0; }
    to   { opacity: 1; }
}

.festival-card {
    animation: cardFadeIn 0.25s ease-out;
}
/* Toastify 커스텀 */

/* ===== Toastify base override ===== */
.toastify {
    padding: 0;
    background: none;
    box-shadow: none;
}

/* ===== react-hot-toast style ===== */
.rht-toast {
    display: flex;
    align-items: center;
    gap: 10px;

    min-width: 280px;
    max-width: 420px;

    padding: 12px 16px;
    border-radius: 12px;

    background: #ffffff;
    color: #1f2937;

    font-family: system-ui, -apple-system, BlinkMacSystemFont,
    "Segoe UI", Roboto, "Apple SD Gothic Neo",
    "Noto Sans KR", sans-serif;

    font-size: 14px;
    line-height: 1.4;

    box-shadow:
            0 10px 15px -3px rgba(0,0,0,.1),
            0 4px 6px -2px rgba(0,0,0,.05);

    position: relative;
    overflow: hidden;

    animation: rht-slide-in .2s ease-out;
}

/* left color bar */
.rht-toast::before {
    content: '';
    width: 4px;
    height: 100%;
    background: #3b82f6;
    border-radius: 2px;
}

/* ===== icon ===== */
.rht-icon {
    width: 18px;
    height: 18px;
    flex-shrink: 0;
}

/* ===== content ===== */
.rht-content {
    flex: 1;
    word-break: break-word;
}

/* ===== progress bar ===== */
.rht-progress {
    position: absolute;
    bottom: 0;
    left: 0;
    height: 3px;
    width: 100%;
    background: rgba(0,0,0,.08);
    animation: rht-progress linear forwards;
}

/* ===== types ===== */
.rht-success::before { background: #22c55e; }
.rht-error::before   { background: #ef4444; }
.rht-warning::before { background: #f59e0b; }
.rht-info::before    { background: #3b82f6; }
.rht-loading::before { background: #6366f1; }

/* ===== loading spinner ===== */
.rht-spinner {
    width: 18px;
    height: 18px;
    border: 2px solid #e5e7eb;
    border-top-color: #6366f1;
    border-radius: 50%;
    animation: rht-spin 0.8s linear infinite;
}

/* ===== animations ===== */
@keyframes rht-slide-in {
    from {
        opacity: 0;
        transform: translateY(-6px);
    }
    to {
        opacity: 1;
        transform: translateY(0);
    }
}

@keyframes rht-spin {
    to { transform: rotate(360deg); }
}

@keyframes rht-progress {
    from { width: 100%; }
    to   { width: 0%; }
}

/* ===== mobile ===== */
@media (max-width: 480px) {
    .rht-toast {
        min-width: auto;
        max-width: calc(100vw - 32px);
    }
}

/* ===== 별점 rating 관련 ===== */

.star_full {
    pointer-events: none;
    transition-duration: 0.5s;
}

.star_rating_box {
    cursor: pointer;
}

.star_number,
.review_number_total {
    transition: color 0.2s ease;
}

/*
