/* ==========================================================================
   Native "Upload dataset" drawer — styles for /js/upload-drawer.js.
   Everything is scoped under #drawer-upload so the small utility classes the
   ported markup relies on (flex, gap-*, text-slate-*, …) can't leak into the
   rest of the studio. Colours map to the studio theme vars so the drawer
   works in both light and dark mode.
   ========================================================================== */

.upload-body {
    display: flex;
    flex-direction: column;
    gap: 12px;
    padding: 12px 14px 16px;
    overflow-y: auto;
    min-height: 0;
}

/* ---- Drop zone -------------------------------------------------------- */
#drawer-upload .upload-drop {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 8px;
    padding: 18px 12px;
    border: 1.5px dashed var(--ide-border);
    border-radius: var(--r-s);
    text-align: center;
    background: var(--ide-surface-2);
    transition:
        border-color 0.15s,
        background 0.15s;
}
#drawer-upload .upload-drop.ring-2 {
    border-color: var(--opteryx-teal);
    background: var(--accent-soft);
}
#drawer-upload .upload-headline {
    font-size: 12px;
    color: var(--ide-text);
    font-weight: 500;
}
#drawer-upload .upload-browse-btn {
    font-size: 11.5px;
    font-weight: 600;
    color: var(--on-accent);
    background: var(--opteryx-teal);
    border: none;
    border-radius: 6px;
    padding: 5px 14px;
    cursor: pointer;
}
#drawer-upload .upload-browse-btn:hover {
    filter: brightness(1.05);
}
#drawer-upload .upload-meta {
    font-size: 10px;
    color: var(--ide-text-faint);
    line-height: 1.4;
}

/* ---- Cards ------------------------------------------------------------ */
#drawer-upload .upload-card {
    border: 1px solid var(--ide-border);
    border-radius: var(--r-s);
    padding: 10px 12px;
    background: var(--ide-surface);
}
#drawer-upload .upload-card-head {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: 8px;
    margin-bottom: 8px;
}
#drawer-upload .upload-card-title {
    font-size: 12px;
    font-weight: 600;
    color: var(--ide-text);
}
#drawer-upload .upload-card-sub {
    font-size: 10.5px;
    color: var(--ide-text-muted);
    line-height: 1.4;
    margin-top: 2px;
}

/* ---- Files list + schema preview ------------------------------------- */
#drawer-upload .upload-files-list,
#drawer-upload .upload-schema-preview {
    margin-top: 8px;
    display: flex;
    flex-direction: column;
    gap: 6px;
}
#drawer-upload .upload-empty {
    font-size: 11px;
    color: var(--ide-text-faint);
    padding: 4px 0;
}
#drawer-upload .upload-file-row {
    background: var(--ide-surface-2);
    border: 1px solid var(--ide-border);
    border-radius: var(--r-s);
    padding: 8px;
}
#drawer-upload .upload-file-row-error {
    border-color: var(--danger);
    background: color-mix(in srgb, var(--danger) 6%, transparent);
}
#drawer-upload .progress-track {
    position: relative;
    overflow: hidden;
    height: 4px;
    border-radius: 999px;
    background: var(--ide-border);
}
#drawer-upload .progress-bar {
    height: 100%;
    background: var(--opteryx-teal);
    border-radius: 999px;
    width: 0;
    transition: width 0.2s;
}
/* Shown between "file picked" and the first progress event — the upload
   session round-trip happens in that gap and used to look like nothing. */
#drawer-upload .progress-bar.indeterminate {
    width: 40%;
    transition: none;
    animation: upload-indeterminate 1.1s ease-in-out infinite;
}
@keyframes upload-indeterminate {
    0% {
        transform: translateX(-110%);
    }
    100% {
        transform: translateX(260%);
    }
}
@media (prefers-reduced-motion: reduce) {
    #drawer-upload .progress-bar.indeterminate {
        width: 100%;
        opacity: 0.35;
        animation: none;
    }
}
#drawer-upload .file-status {
    font-size: 10.5px;
    color: var(--ide-text-muted);
    line-height: 1.4;
}
#drawer-upload .file-status-error {
    color: var(--danger);
    font-weight: 500;
}
#drawer-upload .uploaded-size {
    font-size: 10.5px;
    color: var(--ide-text-muted);
}
#drawer-upload .cancel,
#drawer-upload .remove,
#drawer-upload .server-remove {
    border: none;
    background: none;
    color: var(--ide-text-muted);
    cursor: pointer;
    padding: 2px;
    border-radius: 4px;
    display: inline-flex;
    align-items: center;
}
#drawer-upload .cancel:hover,
#drawer-upload .remove:hover,
#drawer-upload .server-remove:hover {
    color: var(--danger);
    background: var(--ide-hover);
}

/* ---- Commit form ------------------------------------------------------ */
#drawer-upload .upload-form {
    display: flex;
    flex-direction: column;
    gap: 9px;
    margin-top: 6px;
}
#drawer-upload .upload-field {
    display: flex;
    flex-direction: column;
    gap: 4px;
}
#drawer-upload .upload-label {
    font-size: 11px;
    font-weight: 500;
    color: var(--ide-text-muted);
}
#drawer-upload .upload-label-muted {
    color: var(--ide-text-faint);
    font-weight: 400;
}
#drawer-upload .upload-control {
    width: 100%;
    box-sizing: border-box;
    font-size: 12px;
    padding: 6px 8px;
    border: 1px solid var(--ide-border);
    border-radius: var(--r-s);
    background: var(--ide-surface);
    color: var(--ide-text);
}
#drawer-upload .upload-control:focus {
    outline: none;
    border-color: var(--opteryx-teal);
    box-shadow: 0 0 0 3px var(--accent-soft);
}
#drawer-upload .upload-radio-group {
    display: flex;
    gap: 14px;
}
#drawer-upload .upload-radio {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    font-size: 11.5px;
    color: var(--ide-text);
    cursor: pointer;
}
#drawer-upload .upload-form-footer {
    display: flex;
    justify-content: flex-end;
    gap: 8px;
    margin-top: 2px;
}
#drawer-upload .upload-primary-btn,
#drawer-upload .upload-ghost-btn,
#drawer-upload .ghost-btn {
    font-size: 11.5px;
    font-weight: 600;
    border-radius: 6px;
    padding: 6px 12px;
    cursor: pointer;
    border: 1px solid transparent;
}
#drawer-upload .upload-primary-btn {
    background: var(--opteryx-teal);
    color: var(--on-accent);
    border-color: var(--opteryx-teal);
}
#drawer-upload .upload-primary-btn:hover {
    filter: brightness(1.05);
}
#drawer-upload .upload-primary-btn:disabled,
#drawer-upload .upload-primary-btn.opacity-60 {
    opacity: 0.55;
    cursor: not-allowed;
}
#drawer-upload .upload-ghost-btn,
#drawer-upload .ghost-btn {
    background: var(--ide-surface);
    color: var(--ide-text-muted);
    border-color: var(--ide-border);
}
#drawer-upload .upload-ghost-btn:hover,
#drawer-upload .ghost-btn:hover {
    background: var(--ide-hover);
    color: var(--ide-text);
}
#drawer-upload .upload-ghost-btn:disabled {
    opacity: 0.55;
    cursor: not-allowed;
}

/* ---- Error banner ----------------------------------------------------- */
#drawer-upload .upload-error-banner {
    border: 1px solid var(--danger);
    border-radius: var(--r-s);
    padding: 8px 10px;
    background: color-mix(in srgb, var(--danger) 8%, transparent);
}
#drawer-upload .upload-error-title {
    font-size: 11.5px;
    font-weight: 600;
    color: var(--danger);
    margin-bottom: 2px;
}
#drawer-upload .upload-error-content {
    font-size: 11px;
    color: var(--danger);
    line-height: 1.45;
}

/* ==========================================================================
   Scoped utility shims — the ported markup (file rows, schema rows, inspect
   issues) is generated with Tailwind-style class names. These reproduce just
   the utilities that markup uses, scoped so they never touch the rest of the
   app. Colours route through theme vars for dark-mode safety.
   ========================================================================== */
#drawer-upload .flex {
    display: flex;
}
#drawer-upload .inline-flex {
    display: inline-flex;
}
#drawer-upload .items-center {
    align-items: center;
}
#drawer-upload .justify-between {
    justify-content: space-between;
}
#drawer-upload .justify-center {
    justify-content: center;
}
#drawer-upload .flex-1 {
    flex: 1 1 0%;
}
#drawer-upload .flex-shrink-0 {
    flex-shrink: 0;
}
#drawer-upload .min-w-0 {
    min-width: 0;
}
#drawer-upload .w-full {
    width: 100%;
}
#drawer-upload .w-0 {
    width: 0;
}
#drawer-upload .w-4 {
    width: 16px;
}
#drawer-upload .h-4 {
    height: 16px;
}
#drawer-upload .w-3\.5 {
    width: 14px;
}
#drawer-upload .h-3\.5 {
    height: 14px;
}
#drawer-upload .h-1 {
    height: 4px;
}
#drawer-upload .gap-1 {
    gap: 4px;
}
#drawer-upload .gap-2 {
    gap: 8px;
}
#drawer-upload .gap-3 {
    gap: 12px;
}
#drawer-upload .ml-auto {
    margin-left: auto;
}
#drawer-upload .ml-4 {
    margin-left: 16px;
}
#drawer-upload .mr-3 {
    margin-right: 12px;
}
#drawer-upload .mt-1 {
    margin-top: 4px;
}
#drawer-upload .mt-2 {
    margin-top: 8px;
}
#drawer-upload .mb-1 {
    margin-bottom: 4px;
}
#drawer-upload .p-1 {
    padding: 4px;
}
#drawer-upload .p-3 {
    padding: 12px;
}
#drawer-upload .px-2 {
    padding-left: 8px;
    padding-right: 8px;
}
#drawer-upload .py-1 {
    padding-top: 4px;
    padding-bottom: 4px;
}
#drawer-upload .rounded {
    border-radius: 4px;
}
#drawer-upload .rounded-lg {
    border-radius: 8px;
}
#drawer-upload .overflow-hidden {
    overflow: hidden;
}
#drawer-upload .overflow-y-auto {
    overflow-y: auto;
}
#drawer-upload .max-h-48 {
    max-height: 12rem;
}
#drawer-upload .truncate {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
#drawer-upload .break-words {
    overflow-wrap: anywhere;
}
#drawer-upload .font-code {
    font-family: var(--font-mono);
}
#drawer-upload .font-medium {
    font-weight: 500;
}
#drawer-upload .font-semibold {
    font-weight: 600;
}
#drawer-upload .text-xs {
    font-size: 11px;
}
#drawer-upload .text-sm {
    font-size: 12px;
}
#drawer-upload .text-slate-400 {
    color: var(--ide-text-faint);
}
#drawer-upload .text-slate-500 {
    color: var(--ide-text-muted);
}
#drawer-upload .text-slate-600 {
    color: var(--ide-text-muted);
}
#drawer-upload .text-slate-700 {
    color: var(--ide-text);
}
#drawer-upload .text-red-600,
#drawer-upload .text-red-700,
#drawer-upload .text-red-800 {
    color: var(--danger);
}
#drawer-upload .text-emerald-700 {
    color: var(--success);
}
#drawer-upload .hover\:text-emerald-800:hover {
    color: var(--success);
}
#drawer-upload .bg-emerald-500 {
    background: var(--success);
}
#drawer-upload .bg-slate-100 {
    background: var(--ide-surface-2);
}
#drawer-upload .bg-red-50 {
    background: color-mix(in srgb, var(--danger) 8%, transparent);
}
#drawer-upload .border {
    border: 1px solid var(--ide-border);
}
#drawer-upload .border-red-200 {
    border-color: color-mix(in srgb, var(--danger) 35%, transparent);
}
#drawer-upload .opacity-80 {
    opacity: 0.8;
}
#drawer-upload .space-y-0\.5 > * + * {
    margin-top: 2px;
}
#drawer-upload .space-y-1 > * + * {
    margin-top: 4px;
}
#drawer-upload .list-disc {
    list-style: disc;
    padding-left: 18px;
}
#drawer-upload .list-\[circle\] {
    list-style: circle;
    padding-left: 18px;
}
#drawer-upload .hidden {
    display: none;
}
