:root {
    --gallery-accent: #635bff;
    --gallery-accent-rgb: 99, 91, 255;
}

html {
    min-height: 100%;
}

body {
    min-height: 100vh;
}

.navbar-brand .bi {
    color: #a8a4ff;
}

.skip-link {
    position: fixed;
    z-index: 1100;
    top: 0.75rem;
    left: 0.75rem;
    padding: 0.75rem 1rem;
    border-radius: 0.5rem;
    background: var(--bs-body-bg);
    color: var(--bs-body-color);
    box-shadow: var(--bs-box-shadow);
}

.letter-spaced {
    letter-spacing: 0.08em;
}

.sidebar-card {
    position: sticky;
    top: 5.5rem;
    max-height: calc(100vh - 7rem);
    overflow-y: auto;
}

.folder-list {
    gap: 0.25rem;
}

.folder-list .list-group-item {
    padding: 0.7rem 0.75rem;
}

.folder-list .list-group-item.active {
    background-color: var(--gallery-accent);
}

.gallery-card {
    content-visibility: auto;
    contain-intrinsic-size: 360px 340px;
    transition: transform 180ms ease, box-shadow 180ms ease;
}

.gallery-card:hover {
    transform: translateY(-3px);
    box-shadow: 0 1rem 2rem rgba(24, 26, 42, 0.14) !important;
}

.gallery-open {
    width: 100%;
    cursor: zoom-in;
}

.gallery-open:focus-visible {
    outline: 0.25rem solid rgba(var(--gallery-accent-rgb), 0.4);
    outline-offset: -0.25rem;
}

.gallery-thumbnail {
    aspect-ratio: 4 / 3;
    object-fit: cover;
    background: var(--bs-tertiary-bg);
    transition: transform 220ms ease;
}

.gallery-thumbnail[data-src] {
    background:
        linear-gradient(110deg, transparent 30%, rgba(255, 255, 255, 0.35) 45%, transparent 60%),
        var(--bs-tertiary-bg);
    background-size: 220% 100%;
    animation: thumbnail-loading 1.4s linear infinite;
}

.gallery-card:hover .gallery-thumbnail {
    transform: scale(1.025);
}

.gallery-zoom {
    position: absolute;
    right: 0.75rem;
    bottom: 0.75rem;
    opacity: 0.82;
}

.gallery-pagination .pagination {
    gap: 0.25rem;
}

.gallery-pagination .page-link {
    min-width: 2.5rem;
    border-radius: 0.5rem !important;
    text-align: center;
}

.modal-photo {
    width: 100%;
    max-height: calc(100vh - 8rem);
    object-fit: contain;
    transition: opacity 160ms ease;
}

.modal-photo:not([src]) {
    visibility: hidden;
}

.modal-photo.is-loading {
    opacity: 0.35;
}

.slideshow-frame {
    display: flex;
    min-height: min(72vh, 48rem);
    align-items: center;
    justify-content: center;
    overflow: hidden;
    background: #090a0c;
}

#slideshowLoading,
#slideshowError {
    z-index: 3;
}

@keyframes thumbnail-loading {
    to {
        background-position-x: -220%;
    }
}

.carousel-control-prev,
.carousel-control-next {
    width: clamp(3.5rem, 10%, 6rem);
    opacity: 0.85;
}

.carousel-control-prev:hover,
.carousel-control-next:hover,
.carousel-control-prev:focus-visible,
.carousel-control-next:focus-visible {
    opacity: 1;
}

.carousel-control-prev-icon,
.carousel-control-next-icon {
    width: 2.5rem;
    height: 2.5rem;
    padding: 1.5rem;
    border-radius: 50%;
    background-color: rgba(0, 0, 0, 0.55);
    background-size: 1.4rem;
}

.min-w-0 {
    min-width: 0;
}

.empty-state {
    border: 1px dashed var(--bs-border-color) !important;
}

.offcanvas {
    --bs-offcanvas-width: min(88vw, 22rem);
}

.login-page {
    background:
        radial-gradient(circle at 15% 20%, rgba(var(--gallery-accent-rgb), 0.2), transparent 32rem),
        var(--bs-tertiary-bg);
}

.login-card {
    max-width: 30rem;
}

.login-icon {
    width: 4rem;
    height: 4rem;
    background: rgba(var(--gallery-accent-rgb), 0.12);
    color: var(--gallery-accent);
    font-size: 1.75rem;
}

@media (prefers-reduced-motion: reduce) {
    .gallery-card,
    .gallery-thumbnail {
        transition: none;
    }

    .gallery-thumbnail[data-src] {
        animation: none;
    }
}
