/*
 * Button — one block, four variants, two sizes, an icon-only shape and
 * a busy state.
 *
 *   <button class="btn btn--primary">Save</button>
 *   <button class="btn btn--secondary btn--sm"><?= icon('refresh') ?>Refresh</button>
 *   <button class="btn btn--icon btn--ghost" aria-label="Close"><?= icon('x') ?></button>
 *   <button class="btn btn--primary is-busy" disabled>Saving</button>
 *
 * A bare `.btn` is the secondary style. `.btn--xs` and `.btn--active`
 * are pre-5.102 names still used by views (xs = sm; active = toggled).
 */
.btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: var(--sp-2);
    min-height: var(--height-control);
    padding: 0 var(--sp-4);
    border: 1px solid var(--color-border-hi);
    border-radius: var(--radius);
    background: var(--color-surface-hi);
    color: var(--color-text);
    font-size: var(--fs-sm);
    font-weight: 500;
    line-height: 1.2;
    white-space: nowrap;
    text-decoration: none;
    cursor: pointer;
    user-select: none;
    transition: background var(--t-fast), border-color var(--t-fast), color var(--t-fast), transform var(--t-fast);
}
.btn:hover    { background: var(--color-surface-alt); border-color: var(--color-text-dim); color: var(--color-text); }
.btn:active   { transform: translateY(1px); }
.btn:disabled, .btn[aria-disabled="true"] { opacity: 0.5; cursor: not-allowed; transform: none; }
.btn .icon    { width: 16px; height: 16px; }

/* Sizes */
.btn--sm, .btn--xs { min-height: var(--height-control-sm); padding: 0 var(--sp-3); font-size: var(--fs-xs); }
.btn--sm .icon, .btn--xs .icon { width: 14px; height: 14px; }
.btn--lg { min-height: 44px; padding: 0 var(--sp-5); font-size: var(--fs-base); }
.btn--block { width: 100%; }

/* Icon-only: square, no label. Always give it an aria-label. */
.btn--icon { width: var(--height-control); padding: 0; }
.btn--icon.btn--sm, .btn--icon.btn--xs { width: var(--height-control-sm); }

/* Variants */
.btn--secondary { background: var(--color-surface-hi); border-color: var(--color-border-hi); }
.btn--primary {
    background: var(--color-primary);
    border-color: var(--color-primary);
    color: #fff;
}
.btn--primary:hover { background: var(--color-primary-hi); border-color: var(--color-primary-hi); color: #fff; }
.btn--ghost {
    background: transparent;
    border-color: transparent;
    color: var(--color-text-muted);
}
.btn--ghost:hover { background: var(--color-surface-hi); border-color: transparent; color: var(--color-text); }
.btn--danger {
    background: var(--color-danger-soft);
    border-color: transparent;
    color: var(--color-danger);
}
.btn--danger:hover { background: var(--color-danger); border-color: var(--color-danger); color: #0A0A0F; }
/* Toggled state (range pickers, filter buttons rendered as .btn). */
.btn--active, .btn[aria-pressed="true"] {
    background: var(--color-primary-soft);
    border-color: transparent;
    color: var(--color-primary-hi);
}

/* Busy: label dims, a spinner takes the icon slot. */
.btn.is-busy { position: relative; color: transparent !important; pointer-events: none; }
.btn.is-busy::after {
    content: "";
    position: absolute;
    width: 14px;
    height: 14px;
    border: 2px solid currentColor;
    border-color: var(--color-text) transparent var(--color-text) transparent;
    border-radius: 50%;
    animation: btn-spin 0.8s linear infinite;
}
.btn--primary.is-busy::after { border-color: #fff transparent #fff transparent; }
@keyframes btn-spin { to { transform: rotate(360deg); } }

/* Row of buttons. */
.btn-group { display: inline-flex; gap: var(--sp-2); flex-wrap: wrap; align-items: center; }
