/**
 * Shared UI primitives. Existing feature components retain their JavaScript
 * contracts; this layer gives their common HTML a single visual language.
 */

/* Buttons */
.btn,
.pv-button,
.btn-v12-action,
.btn-v12-primary,
.btn-v12-success,
.load-more-btn,
button[data-ui-button] {
    align-items: center;
    background: var(--color-surface-1);
    border: 1px solid var(--color-outline-strong);
    border-radius: var(--radius-sm);
    box-shadow: none;
    color: var(--color-ink);
    cursor: pointer;
    display: inline-flex;
    font-size: var(--font-size-sm);
    font-weight: 650;
    gap: var(--space-2);
    justify-content: center;
    line-height: 1.15;
    min-height: 2.25rem;
    padding: 0.58rem 0.85rem;
    text-decoration: none;
    transition:
        background var(--duration-fast) ease,
        border-color var(--duration-fast) ease,
        box-shadow var(--duration-fast) ease,
        color var(--duration-fast) ease,
        transform var(--duration-fast) ease;
}

.btn:hover,
.pv-button:hover,
.btn-v12-action:hover,
.btn-v12-primary:hover,
.btn-v12-success:hover,
.load-more-btn:hover,
button[data-ui-button]:hover {
    background: var(--color-surface-2);
    border-color: var(--color-outline-strong);
    color: var(--color-ink);
    transform: translateY(-1px);
}

.btn:active,
.pv-button:active,
.btn-v12-action:active,
.btn-v12-primary:active,
.btn-v12-success:active {
    transform: translateY(0);
}

.btn:disabled,
.pv-button:disabled,
.btn-v12-action:disabled,
.btn-v12-primary:disabled,
.btn-v12-success:disabled,
button:disabled {
    cursor: not-allowed;
    opacity: 0.48;
    transform: none;
}

.btn-primary,
.pv-button-primary,
.btn-v12-primary,
.btn-v12-success,
[data-variant="primary"] {
    background: var(--color-primary) !important;
    border-color: var(--color-primary) !important;
    color: var(--color-on-primary) !important;
}

.btn-primary:hover,
.pv-button-primary:hover,
.btn-v12-primary:hover,
.btn-v12-success:hover,
[data-variant="primary"]:hover {
    background: var(--color-primary-hover) !important;
    border-color: var(--color-primary-hover) !important;
    color: var(--color-on-primary) !important;
}

.btn-secondary,
[data-variant="secondary"] {
    background: var(--color-surface-1) !important;
    border-color: var(--color-outline-strong) !important;
    color: var(--color-ink) !important;
}

.btn-danger,
.pv-button-danger,
[data-variant="danger"] {
    background: var(--color-danger) !important;
    border-color: var(--color-danger) !important;
    color: #fff !important;
}

.btn-danger:hover,
.pv-button-danger:hover,
[data-variant="danger"]:hover {
    background: color-mix(in srgb, var(--color-danger) 86%, #000) !important;
}

.btn-ghost,
.pv-button-subtle,
[data-variant="ghost"] {
    background: transparent !important;
    border-color: transparent !important;
    color: var(--color-ink-muted) !important;
}

.btn-ghost:hover,
.pv-button-subtle:hover,
[data-variant="ghost"]:hover {
    background: var(--color-surface-2) !important;
    color: var(--color-ink) !important;
}

/* Forms */
input:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="file"]),
select,
textarea,
.form-input,
.form-select,
.search-input,
.pv-input,
.pv-select {
    background: var(--color-surface-1);
    border: 1px solid var(--color-outline-strong);
    border-radius: var(--radius-sm);
    box-shadow: 0 1px 1px rgb(30 60 120 / 0.025);
    color: var(--color-ink);
    min-height: 2.5rem;
    padding: 0.62rem 0.75rem;
    transition:
        border-color var(--duration-fast) ease,
        box-shadow var(--duration-fast) ease,
        background var(--duration-fast) ease;
}

textarea {
    min-height: 6.5rem;
    resize: vertical;
}

input::placeholder,
textarea::placeholder {
    color: var(--color-ink-subtle);
}

input:not([type="checkbox"]):not([type="radio"]):focus,
select:focus,
textarea:focus,
.form-input:focus,
.form-select:focus,
.search-input:focus,
.pv-input:focus,
.pv-select:focus {
    border-color: var(--color-primary);
    box-shadow: 0 0 0 3px var(--color-focus);
    outline: 0;
}

input[type="checkbox"],
input[type="radio"] {
    accent-color: var(--color-primary);
}

label,
.pv-field label,
.form-group > label {
    color: var(--color-ink-muted);
    font-size: var(--font-size-xs);
    font-weight: 650;
    letter-spacing: 0.015em;
}

.help-text,
small {
    color: var(--color-ink-subtle);
}

/* Cards and panels */
.card,
.panel,
.stat-card,
.pv-panel,
.pv-stat,
.pv-import-card,
.pv-safety-note,
.pv-confidence-card,
.pv-chart-card,
.pv-insight-card,
.pv-history-card,
.pv-evidence-actions-card,
.file-list,
.upload-history-card,
.progress-item,
#catalog-hold-panel {
    background: var(--color-surface-1);
    border: 1px solid var(--color-outline);
    border-radius: var(--radius-md);
    box-shadow: var(--shadow-1);
    color: var(--color-ink);
}

.stat-value,
.pv-stat strong {
    color: var(--color-ink);
    font-family: var(--font-mono);
    font-variant-numeric: tabular-nums;
    letter-spacing: -0.035em;
}

.stat-label,
.pv-stat span {
    color: var(--color-ink-muted);
}

/* Tables */
.table-scroll,
.table-container,
.v12-table-wrapper,
[class$="-table-wrapper"] {
    max-width: 100%;
    overflow: auto;
    scrollbar-color: var(--color-outline-strong) transparent;
}

table {
    border-collapse: separate;
    border-spacing: 0;
    color: var(--color-ink);
    width: 100%;
}

thead th {
    background: var(--color-surface-2);
    border-bottom: 1px solid var(--color-outline-strong);
    color: var(--color-ink-muted);
    font-size: var(--font-size-2xs);
    font-weight: 750;
    letter-spacing: 0.07em;
    padding: 0.72rem 0.8rem;
    position: sticky;
    text-transform: uppercase;
    top: 0;
    z-index: 2;
}

tbody td {
    background: var(--color-surface-1);
    border-bottom: 1px solid var(--color-outline-subtle);
    color: var(--color-ink);
    font-size: var(--font-size-sm);
    padding: 0.72rem 0.8rem;
    vertical-align: middle;
}

tbody tr:hover td {
    background: color-mix(in srgb, var(--color-primary-subtle) 42%, var(--color-surface-1));
}

tbody tr:last-child td {
    border-bottom: 0;
}

/* Badges */
.badge,
[class*="badge"],
.status-badge,
.pv-badge {
    border-radius: var(--radius-full);
    font-size: var(--font-size-2xs);
    font-weight: 750;
    line-height: 1.2;
}

[data-tone="success"],
.badge-success,
.status-success {
    background: var(--color-success-subtle) !important;
    color: var(--color-success) !important;
}

[data-tone="warning"],
.badge-warning,
.status-warning {
    background: var(--color-warning-subtle) !important;
    color: var(--color-warning) !important;
}

[data-tone="danger"],
.badge-danger,
.status-error {
    background: var(--color-danger-subtle) !important;
    color: var(--color-danger) !important;
}

[data-tone="info"],
.badge-info {
    background: var(--color-info-subtle) !important;
    color: var(--color-info) !important;
}

/* Empty/loading/error states */
.empty-state,
.loading,
.pv-loading,
.pv-detail-empty,
.error-state,
.price-sheet-empty {
    align-items: center;
    color: var(--color-ink-muted);
    display: flex;
    flex-direction: column;
    gap: var(--space-3);
    justify-content: center;
    min-height: 12rem;
    padding: var(--space-8);
    text-align: center;
}

.error,
.pv-error,
.progress-item.error {
    background: var(--color-danger-subtle) !important;
    border-color: color-mix(in srgb, var(--color-danger) 28%, transparent) !important;
    color: var(--color-danger) !important;
}

.spinner,
[aria-busy="true"]::before {
    animation: talia-spin 0.8s linear infinite;
    border: 2px solid var(--color-outline-strong);
    border-radius: 50%;
    border-top-color: var(--color-primary);
    content: "";
    display: inline-block;
    height: 1.1rem;
    width: 1.1rem;
}

/* Dialogs — legacy and feature-specific modal families */
.modal,
.pv-modal-backdrop,
.ra-modal-backdrop,
.slang-modal,
.ghg-json-modal,
.ap-passport-overlay,
.access-security-modal {
    align-items: center;
    background: var(--color-overlay);
    inset: 0;
    justify-content: center;
    padding: clamp(1rem, 3vw, 2rem);
    position: fixed;
    z-index: 1000;
}

.modal[style*="display: block"],
.modal.is-open,
.pv-modal-backdrop,
.ra-modal-backdrop,
.slang-modal:not([style*="display:none"]):not([style*="display: none"]),
.access-security-modal {
    display: flex !important;
}

.modal-overlay,
.slang-modal-overlay {
    background: transparent;
    inset: 0;
    position: absolute;
}

.modal-content,
.modal-container,
.modal-box,
.pv-modal,
.ra-modal,
.slang-modal-content,
.ap-passport-modal,
.access-security-dialog {
    animation: talia-fade-up var(--duration-normal) var(--ease-out);
    background: var(--color-surface-1) !important;
    border: 1px solid var(--color-outline-strong) !important;
    border-radius: var(--radius-lg) !important;
    box-shadow: var(--shadow-modal) !important;
    color: var(--color-ink) !important;
    max-height: min(88vh, 860px);
    max-width: min(92vw, 720px);
    overflow: hidden;
    position: relative;
    width: 100%;
    z-index: 1;
}

.modal-large,
.large-modal,
.pv-modal-wide {
    max-width: min(94vw, 1120px) !important;
}

.modal-header,
.pv-modal-head,
.slang-modal-header,
.ut-modal-header,
.access-security-dialog__header {
    align-items: flex-start;
    background: var(--color-surface-1) !important;
    border-bottom: 1px solid var(--color-outline) !important;
    display: flex;
    gap: var(--space-4);
    justify-content: space-between;
    padding: var(--space-5) var(--space-6);
}

.modal-header h2,
.pv-modal-head h2,
.slang-modal-header h2 {
    color: var(--color-ink) !important;
    margin: 0;
}

.modal-body,
.pv-modal-body,
.slang-modal-body,
.access-security-dialog__body {
    background: var(--color-surface-1) !important;
    color: var(--color-ink) !important;
    max-height: calc(88vh - 9rem);
    overflow: auto;
    padding: var(--space-6);
}

.modal-footer,
.pv-modal-foot,
.slang-modal-footer,
.access-security-dialog__footer {
    align-items: center;
    background: var(--color-surface-2) !important;
    border-top: 1px solid var(--color-outline) !important;
    display: flex;
    gap: var(--space-3);
    justify-content: flex-end;
    padding: var(--space-4) var(--space-6);
}

.modal-close,
.slang-modal-close,
.ut-modal-close,
.rqi-close-btn,
.sd-json-close,
.ghg-json-close,
.ap-pp-close {
    align-items: center;
    background: transparent !important;
    border: 0 !important;
    border-radius: var(--radius-sm);
    color: var(--color-ink-muted) !important;
    cursor: pointer;
    display: inline-flex;
    font-size: 1.3rem;
    height: 2rem;
    justify-content: center;
    line-height: 1;
    padding: 0;
    width: 2rem;
}

.modal-close:hover,
.slang-modal-close:hover,
.ut-modal-close:hover,
.rqi-close-btn:hover {
    background: var(--color-surface-2) !important;
    color: var(--color-ink) !important;
}

/* Toasts */
#toast-container {
    bottom: var(--space-6);
    display: flex;
    flex-direction: column;
    gap: var(--space-2);
    pointer-events: none;
    position: fixed;
    right: var(--space-6);
    z-index: 1500;
}

.toast,
.toast-notification {
    align-items: flex-start;
    background: var(--color-surface-1) !important;
    border: 1px solid var(--color-outline-strong) !important;
    border-radius: var(--radius-md) !important;
    box-shadow: var(--shadow-3) !important;
    color: var(--color-ink) !important;
    display: flex;
    gap: var(--space-3);
    max-width: 26rem;
    padding: var(--space-4) !important;
    pointer-events: auto;
    transform: translateX(calc(100% + var(--space-8)));
    transition: opacity var(--duration-normal) ease, transform var(--duration-normal) var(--ease-out);
    opacity: 0;
}

.toast.is-visible {
    opacity: 1;
    transform: translateX(0);
}

.toast-icon {
    align-items: center;
    background: var(--color-info-subtle);
    border-radius: var(--radius-full);
    color: var(--color-info);
    display: inline-flex;
    flex: 0 0 auto;
    height: 1.75rem;
    justify-content: center;
    width: 1.75rem;
}

.toast[data-tone="success"] .toast-icon {
    background: var(--color-success-subtle);
    color: var(--color-success);
}

.toast[data-tone="error"] .toast-icon {
    background: var(--color-danger-subtle);
    color: var(--color-danger);
}

.toast-message {
    align-self: center;
    flex: 1;
    font-size: var(--font-size-sm);
    line-height: 1.45;
}

.toast-close {
    align-items: center;
    background: transparent;
    border: 0;
    border-radius: var(--radius-xs);
    color: var(--color-ink-subtle);
    cursor: pointer;
    display: inline-flex;
    flex: 0 0 auto;
    height: 1.75rem;
    justify-content: center;
    width: 1.75rem;
}

.toast-close:hover {
    background: var(--color-surface-2);
    color: var(--color-ink);
}

/* Compact, accessible replacement for native alert/confirm/prompt chrome. */
.feedback-dialog-backdrop {
    align-items: center;
    background: color-mix(in srgb, var(--color-overlay) 88%, transparent);
    display: flex;
    inset: 0;
    justify-content: center;
    opacity: 0;
    padding: var(--space-4);
    position: fixed;
    transition: opacity var(--duration-normal) ease;
    /* Above every legacy modal (gate-holding 9000, upload-history/grouped 9999,
       .modal 9999, calculate-all/proposal-detail 10000). At 4000 a confirm
       raised from inside an open modal rendered BEHIND it, leaving the caller
       awaiting a dialog the operator could not see or dismiss (Gate Holding
       "Reject" was a dead button). Keep this the highest layer in the app. */
    z-index: 11000;
}

.feedback-dialog-backdrop[hidden] {
    display: none;
}

.feedback-dialog-backdrop.is-visible {
    opacity: 1;
}

.feedback-dialog {
    align-items: start;
    background: var(--color-surface-1);
    border: 1px solid var(--color-outline-strong);
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow-modal);
    color: var(--color-ink);
    display: grid;
    gap: 0 var(--space-3);
    grid-template-columns: 2.35rem minmax(0, 1fr) 2rem;
    max-width: min(92vw, 31rem);
    padding: var(--space-5);
    transform: translateY(8px) scale(0.985);
    transition: transform var(--duration-normal) var(--ease-out);
    width: 100%;
}

.feedback-dialog-backdrop.is-visible .feedback-dialog {
    transform: translateY(0) scale(1);
}

.feedback-dialog__icon {
    align-items: center;
    background: var(--color-info-subtle);
    border-radius: var(--radius-full);
    color: var(--color-info);
    display: inline-flex;
    font-size: 1.05rem;
    height: 2.35rem;
    justify-content: center;
    width: 2.35rem;
}

.feedback-dialog-backdrop[data-tone="success"] .feedback-dialog__icon {
    background: var(--color-success-subtle);
    color: var(--color-success);
}

.feedback-dialog-backdrop[data-tone="warning"] .feedback-dialog__icon {
    background: var(--color-warning-subtle);
    color: var(--color-warning);
}

.feedback-dialog-backdrop[data-tone="error"] .feedback-dialog__icon {
    background: var(--color-danger-subtle);
    color: var(--color-danger);
}

.feedback-dialog__content {
    min-width: 0;
    padding-top: 0.1rem;
}

.feedback-dialog__content h2 {
    font-size: var(--font-size-lg);
    margin: 0 0 var(--space-2);
}

.feedback-dialog__content p {
    color: var(--color-ink-muted);
    font-size: var(--font-size-sm);
    line-height: 1.55;
    margin: 0;
    overflow-wrap: anywhere;
    white-space: pre-line;
}

.feedback-dialog__field {
    display: block;
    margin-top: var(--space-4);
}

.feedback-dialog__field[hidden] {
    display: none;
}

.feedback-dialog__field input {
    background: var(--color-surface-2);
    border: 1px solid var(--color-outline-strong);
    border-radius: var(--radius-sm);
    color: var(--color-ink);
    min-height: 2.65rem;
    padding: 0.65rem 0.75rem;
    transition: border-color var(--duration-fast) ease, box-shadow var(--duration-fast) ease;
    width: 100%;
}

.feedback-dialog__field input:focus {
    border-color: var(--color-primary);
    box-shadow: 0 0 0 3px var(--color-focus);
    outline: none;
}

.feedback-dialog__close {
    height: 2rem;
    margin: -0.25rem -0.25rem 0 0;
    width: 2rem;
}

.feedback-dialog__actions {
    display: flex;
    gap: var(--space-2);
    grid-column: 2 / -1;
    justify-content: flex-end;
    margin-top: var(--space-5);
}

.feedback-dialog__actions .btn {
    min-width: 5.5rem;
}

.feedback-dialog-backdrop[data-mode="confirm"] .feedback-dialog,
.feedback-dialog-backdrop[data-mode="prompt"] .feedback-dialog {
    border-top: 3px solid color-mix(in srgb, var(--color-warning) 72%, var(--color-outline-strong));
}

.feedback-dialog-backdrop[data-tone="error"] .feedback-dialog {
    border-top-color: color-mix(in srgb, var(--color-danger) 78%, var(--color-outline-strong));
}

@media (max-width: 720px) {
    .modal,
    .pv-modal-backdrop,
    .ra-modal-backdrop,
    .slang-modal,
    .access-security-modal {
        align-items: flex-end;
        padding: 0;
    }

    .modal-content,
    .modal-container,
    .modal-box,
    .pv-modal,
    .ra-modal,
    .slang-modal-content,
    .access-security-dialog {
        border-bottom-left-radius: 0 !important;
        border-bottom-right-radius: 0 !important;
        max-height: 94vh;
        max-width: none !important;
    }

    .modal-header,
    .pv-modal-head,
    .slang-modal-header,
    .ut-modal-header,
    .access-security-dialog__header,
    .modal-body,
    .pv-modal-body,
    .slang-modal-body,
    .access-security-dialog__body,
    .modal-footer,
    .pv-modal-foot,
    .slang-modal-footer,
    .access-security-dialog__footer {
        padding-left: var(--space-4);
        padding-right: var(--space-4);
    }

    .feedback-dialog-backdrop {
        align-items: flex-end;
        padding: var(--space-3);
    }

    .feedback-dialog {
        max-width: none;
        padding: var(--space-4);
    }

    .feedback-dialog__actions {
        grid-column: 1 / -1;
    }

    .feedback-dialog__actions .btn {
        flex: 1;
    }
}
