﻿/* =========================================================
   Reusable primitives. One class per responsibility.
   ========================================================= */

/* ---------- Buttons ---------- */
.btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 12px 28px;
    font: 600 16px/1 var(--font-family);
    border-radius: var(--radius-base);
    cursor: pointer;
    transition: background-color var(--duration-micro) var(--easing-default), border-color var(--duration-micro) var(--easing-default), color var(--duration-micro) var(--easing-default);
}

.btn--primary {
    background: var(--color-accent);
    color: #fff;
    border: none;
}

    .btn--primary:hover {
        background: var(--color-accent-hover);
    }

.btn--secondary {
    background: transparent;
    border: 1.5px solid var(--color-border-input);
    color: var(--color-text-btn-secondary);
}

    .btn--secondary:hover {
        border-color: var(--color-accent);
        color: var(--color-accent);
    }

.btn--sm {
    padding: 8px 20px;
    font-size: 14px;
}

.btn:disabled {
    opacity: 0.5;
    cursor: not-allowed;
    pointer-events: none;
}

/* ---------- Forms ---------- */
.input {
    width: 100%;
    padding: 12px 16px;
    font: 400 16px/1.4 var(--font-family);
    color: var(--color-text-primary);
    background: var(--color-card);
    border: 1.5px solid var(--color-border-input);
    border-radius: var(--radius-base);
    transition: border-color var(--duration-micro) var(--easing-default);
}

    .input::placeholder {
        color: var(--color-text-tertiary);
    }

    .input:focus {
        outline: none;
        border-color: var(--color-accent);
    }

.input--dark {
    background: var(--color-surface-dark);
    border-color: var(--color-border-dark);
    color: #fff;
}

/* ---------- Cards ---------- */
.card {
    background: var(--color-card);
    border: 1px solid var(--color-border);
    border-radius: var(--radius-base);
    box-shadow: var(--shadow-card);
    padding: 32px;
    transition: background-color var(--duration-micro) var(--easing-default);
}

    .card:hover {
        background: #F9FAFB;
    }

.card__title {
    font: var(--text-card-title);
    margin-bottom: 8px;
}

.card__body {
    font: var(--text-body-sm);
    color: var(--color-text-secondary);
}

/* ---------- Labels / eyebrow ---------- */
.label {
    font: var(--text-label);
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--color-accent);
}

/* ---------- Status badges ---------- */
.badge {
    font: var(--text-label);
    padding: 4px 12px;
    border-radius: var(--radius-base);
    border: 1px solid transparent;
}

.badge--success {
    color: var(--color-success);
    background: rgba(5,150,105,0.08);
    border-color: rgba(5,150,105,0.25);
}

.badge--warning {
    color: var(--color-warning);
    background: rgba(217,119,6,0.08);
    border-color: rgba(217,119,6,0.25);
}

.badge--error {
    color: var(--color-error);
    background: rgba(220,38,38,0.08);
    border-color: rgba(220,38,38,0.25);
}

/* ---------- Feedback ---------- */
.form-success {
    font: var(--text-body-sm);
    font-weight: 500;
    color: var(--color-success);
    margin-top: 16px;
}

.form-note {
    font: var(--text-label);
    color: var(--color-text-tertiary);
    margin-top: 16px;
}

.form-error {
    font: var(--text-body-sm);
    color: var(--color-error);
}

/* ---------- Utility ---------- */
.container {
    max-width: var(--container-max);
    margin: 0 auto;
    padding: 0 24px;
}

/* ---------- Scroll reveal (one-shot, settles, never replays) ---------- */

@media (prefers-reduced-motion: no-preference) {
    /* Hidden state — ONLY when JS has signalled it's active.
       If the script never loads, .reveal renders plainly. */
    html.js-reveal .reveal {
        opacity: 0;
        transform: translateY(24px);
        will-change: opacity, transform;
        transition: opacity 700ms cubic-bezier(0.16, 1, 0.3, 1) var(--reveal-delay, 0ms), transform 900ms cubic-bezier(0.16, 1, 0.3, 1) var(--reveal-delay, 0ms);
    }

        /* Settled state — commits and stops. */
        html.js-reveal .reveal.is-revealed {
            opacity: 1;
            transform: none;
            will-change: auto;
        }
}