/* ============================================================
 * NoidNoggin — UI State Primitives
 *
 * Styles for Empty, Loading (Skeleton), and Error states used
 * across list renderers. Consumes --ds-* tokens directly so the
 * primitives flip with the active theme automatically.
 * ============================================================ */

/* ── shared shell ─────────────────────────────────────────── */
.ds-state {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 0.75rem;
    padding: 3rem 1.5rem;
    text-align: center;
    color: var(--ds-text);
    background: var(--ds-surface);
    border: 0.0625rem dashed var(--ds-border);
    border-radius: 0.75rem;
    grid-column: 1 / -1;
}

.ds-state__icon {
    width: 3rem;
    height: 3rem;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border-radius: 50%;
    background: var(--ds-surface-raised);
    color: var(--ds-text-muted);
    font-size: 1.25rem;
}

.ds-state__title {
    margin: 0;
    font-size: 1.05rem;
    font-weight: 700;
    color: var(--ds-text);
}

.ds-state__body {
    margin: 0;
    max-width: 28rem;
    color: var(--ds-text-muted);
    font-size: 0.9rem;
    line-height: 1.5;
}

.ds-state__cta {
    margin-top: 0.5rem;
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    min-height: 2.5rem;
    padding: 0.55rem 1.1rem;
    border: 0.0625rem solid var(--ds-accent);
    border-radius: 0.5rem;
    background: var(--ds-accent);
    color: #ffffff;
    font-weight: 600;
    font-size: 0.9rem;
    text-decoration: none;
    cursor: pointer;
}

.ds-state__cta:hover,
.ds-state__cta:focus-visible {
    background: var(--ds-accent-strong);
    border-color: var(--ds-accent-strong);
    outline: none;
    box-shadow: var(--ds-focus-ring);
}

/* ── error variant ───────────────────────────────────────── */
.ds-state--error {
    border-style: solid;
    border-color: color-mix(in srgb, var(--ds-error) 45%, var(--ds-border));
}

.ds-state--error .ds-state__icon {
    background: color-mix(in srgb, var(--ds-error) 18%, transparent);
    color: var(--ds-error);
}

.ds-state--error .ds-state__title {
    color: var(--ds-error);
}

/* ── skeleton (loading) ──────────────────────────────────── */
.ds-skeleton {
    display: grid;
    gap: 0.875rem;
    grid-column: 1 / -1;
}

.ds-skeleton-line,
.ds-skeleton-card,
.ds-skeleton-row,
.ds-skeleton-block {
    position: relative;
    overflow: hidden;
    background: var(--ds-surface-raised);
    border: 0.0625rem solid var(--ds-border);
    border-radius: 0.5rem;
}

.ds-skeleton-line {
    height: 0.875rem;
    border: 0;
    border-radius: 0.4rem;
}

.ds-skeleton-card {
    min-height: 12rem;
    padding: 1.5rem;
}

.ds-skeleton-row {
    height: 3rem;
}

.ds-skeleton-block {
    min-height: 6rem;
}

.ds-skeleton-card::after,
.ds-skeleton-row::after,
.ds-skeleton-block::after,
.ds-skeleton-line::after {
    content: "";
    position: absolute;
    inset: 0;
    background: linear-gradient(
        90deg,
        transparent 0%,
        color-mix(in srgb, var(--ds-text) 6%, transparent) 50%,
        transparent 100%
    );
    transform: translateX(-100%);
    animation: ds-skeleton-shimmer 1.6s ease-in-out infinite;
}

@media (prefers-reduced-motion: reduce) {
    .ds-skeleton-card::after,
    .ds-skeleton-row::after,
    .ds-skeleton-block::after,
    .ds-skeleton-line::after {
        animation: none;
    }
}

@keyframes ds-skeleton-shimmer {
    100% {
        transform: translateX(100%);
    }
}

/* Skeleton card body (mimics title + meta lines) */
.ds-skeleton-card__title {
    width: 60%;
    height: 1rem;
    margin-bottom: 0.75rem;
    background: color-mix(in srgb, var(--ds-text) 12%, transparent);
    border-radius: 0.4rem;
}

.ds-skeleton-card__line {
    width: 90%;
    height: 0.7rem;
    margin-bottom: 0.5rem;
    background: color-mix(in srgb, var(--ds-text) 10%, transparent);
    border-radius: 0.4rem;
}

.ds-skeleton-card__line:last-child {
    width: 70%;
}

/* When a skeleton lives inside a CSS grid (e.g. brains-grid),
 * stretch each card across the available column track. */
.ds-skeleton[data-variant="card"] {
    grid-column: 1 / -1;
    display: grid;
    grid-template-columns: inherit;
    gap: inherit;
}
