/* =========================================================
   Dragon Sentinel - Estilos globales
   Sin colores hardcoded: todo via tokens.css
   Soporta tema claro/oscuro mediante [data-theme] en <html>
   ========================================================= */

*, *::before, *::after { box-sizing: border-box; }

html, body {
    margin: 0;
    padding: 0;
    height: 100%;
    font-family: var(--ds-font-family);
    font-size: var(--ds-fs-base);
    line-height: var(--ds-lh-base);
    color: var(--ds-text);
    background: var(--ds-bg);
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    transition: background var(--ds-transition-base), color var(--ds-transition-base);
}

a { text-decoration: none; color: inherit; }

h1, h2, h3, h4, h5, h6 {
    margin: 0;
    font-weight: var(--ds-fw-semibold);
    color: var(--ds-text-strong);
    line-height: var(--ds-lh-tight);
}

h1 { font-family: var(--ds-font-display); font-size: var(--ds-fs-2xl); letter-spacing: -0.02em; font-weight: var(--ds-fw-bold); }
h2 { font-family: var(--ds-font-display); font-size: var(--ds-fs-xl); letter-spacing: -0.01em; }
h3 { font-size: var(--ds-fs-lg); font-weight: var(--ds-fw-semibold); }

p  { margin: 0; }

::selection {
    background: var(--ds-primary-soft);
    color: var(--ds-primary-dark);
}

/* Scrollbars finos */
* { scrollbar-width: thin; scrollbar-color: var(--ds-border-strong) transparent; }
*::-webkit-scrollbar { width: 8px; height: 8px; }
*::-webkit-scrollbar-track { background: transparent; }
*::-webkit-scrollbar-thumb { background: var(--ds-border-strong); border-radius: var(--ds-radius-pill); }
*::-webkit-scrollbar-thumb:hover { background: var(--ds-text-soft); }

/* =========================================================
   APP SHELL
   ========================================================= */
.ds-shell {
    display: flex;
    min-height: 100vh;
    background: var(--ds-bg);
}

.ds-sidebar {
    width: var(--ds-sidebar-width);
    flex-shrink: 0;
    background: linear-gradient(180deg, var(--ds-sidebar-bg-start) 0%, var(--ds-sidebar-bg-end) 100%);
    color: var(--ds-sidebar-text);
    position: sticky;
    top: 0;
    height: 100vh;
    min-height: 0;
    display: flex;
    flex-direction: column;
    z-index: var(--ds-z-sidebar);
    border-right: 1px solid rgba(255,255,255,0.05);
    box-shadow: 2px 0 12px rgba(0,0,0,0.18);
    transition: width var(--ds-transition-base);
}

/* El panel del menú ocupa el alto disponible y deja que el nav haga scroll sin recortar títulos (p. ej. con zoom alto). */
.ds-sidebar > .ds-side {
    flex: 1;
    min-height: 0;
}

/* Logo empresa (logo-dragon-sentinel.svg): mismo asset en sidebar, login y topbar móvil; NavMenu también por si lo volvemos a usar.
   El SVG es horizontal (viewBox ~90×52): no forzar cuadrado o quedan bandas vacías con object-fit: contain. */
.ds-brand-logo {
    display: block;
    object-fit: contain;
    max-width: 100%;
    height: auto;
    flex-shrink: 0;
}

.ds-brand-logo--sidebar { width: 56px; height: auto; }
.ds-brand-logo--login { width: min(128px, 52vw); height: auto; margin: 0 auto; }
.ds-brand-logo--topbar { width: 42px; height: auto; max-height: 34px; }
.ds-brand-logo--nav { width: 44px; height: auto; }

.ds-sidebar.is-collapsed { width: var(--ds-sidebar-width-collapsed); }

.ds-main {
    flex: 1;
    display: flex;
    flex-direction: column;
    min-width: 0;
}

/* TopBar solo en móvil (menú hamburguesa); en escritorio no reservamos altura. */
@media (min-width: 769px) {
    .ds-topbar-slot {
        display: none;
    }
}

.ds-topbar {
    background: var(--ds-topbar-bg);
    color: var(--ds-topbar-text);
    border-bottom: 1px solid var(--ds-topbar-border);
    height: var(--ds-topbar-height);
    padding: 0 var(--ds-space-5);
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--ds-space-4);
    position: sticky;
    top: 0;
    z-index: var(--ds-z-topbar);
    backdrop-filter: saturate(140%) blur(8px);
    transition: background var(--ds-transition-base), border-color var(--ds-transition-base);
}

.ds-topbar--slim {
    min-height: 48px;
    height: auto;
    padding-top: 0.35rem;
    padding-bottom: 0.35rem;
}

.ds-content {
    flex: 1;
    padding: var(--ds-space-5) var(--ds-space-6);
    overflow-y: auto;
    overflow-x: hidden;
}

.ds-content-inner {
    max-width: var(--ds-content-max);
    margin: 0 auto;
    /* Solo opacidad: un transform aquí rompería el position:fixed de menús/popups
       (menú de acciones ⋮, dropdowns y datepickers de Radzen). */
    animation: ds-page-enter 0.24s ease;
}

@keyframes ds-page-enter {
    from { opacity: 0; }
    to   { opacity: 1; }
}

/* =========================================================
   PAGE HEADER
   ========================================================= */

/* Volver: siempre arriba a la izquierda, antes del título. Es navegación y no una
   acción de la página, así que no comparte lugar con ds-page-actions. */
.ds-back-link {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    margin-bottom: var(--ds-space-3);
    padding: 0.2rem 0.45rem 0.2rem 0.3rem;
    margin-left: -0.3rem;
    border-radius: var(--ds-radius-sm);
    font-size: var(--ds-fs-sm);
    font-weight: var(--ds-fw-medium);
    color: var(--ds-text-muted);
    transition: color var(--ds-transition-fast), background var(--ds-transition-fast);
}
.ds-back-link i { font-size: 1rem; transition: transform var(--ds-transition-fast); }
.ds-back-link:hover { color: var(--ds-text-strong); background: var(--ds-surface-hover); }
.ds-back-link:hover i { transform: translateX(-2px); }
.ds-back-link:focus-visible { outline: none; box-shadow: 0 0 0 3px var(--ds-ring); }

.ds-page-header {
    display: flex;
    justify-content: space-between;
    align-items: flex-start;
    margin-bottom: var(--ds-space-5);
    gap: var(--ds-space-4);
    flex-wrap: wrap;
}

.ds-page-header__title { min-width: 0; flex: 1; }

.ds-page-header__title--wrap h1,
.ds-page-header__title--wrap p {
    overflow-wrap: anywhere;
    word-break: break-word;
    hyphens: auto;
}

.ds-page-header__hint {
    overflow-wrap: anywhere;
    word-break: break-word;
}

/* Indicador "en vivo": punto verde con pulso suave + texto discreto.
   Reemplaza el hint de auto-actualización como estado, no como cabecera. */
.ds-live-indicator {
    display: inline-flex;
    align-items: center;
    gap: 0.45rem;
    margin-top: var(--ds-space-2);
    font-size: var(--ds-fs-xs);
    font-weight: var(--ds-fw-medium);
    color: var(--ds-text-muted);
    line-height: 1.3;
}

.ds-live-indicator__dot {
    flex: 0 0 auto;
    width: 7px;
    height: 7px;
    border-radius: 50%;
    background: var(--ds-success);
    box-shadow: 0 0 0 0 rgba(22, 163, 74, 0.45);
    animation: ds-live-pulse 2.2s ease-out infinite;
}

@keyframes ds-live-pulse {
    0%   { box-shadow: 0 0 0 0 rgba(22, 163, 74, 0.45); }
    70%  { box-shadow: 0 0 0 6px rgba(22, 163, 74, 0); }
    100% { box-shadow: 0 0 0 0 rgba(22, 163, 74, 0); }
}

@media (prefers-reduced-motion: reduce) {
    .ds-live-indicator__dot { animation: none; }
}

.ds-kpi-bar--wrap-labels .ds-kpi-bar__label {
    white-space: normal;
    overflow: visible;
    text-overflow: clip;
    hyphens: auto;
}

.ds-kpi-bar--wrap-labels .ds-kpi-bar__hint {
    overflow-wrap: anywhere;
}

/* Celdas de tabla: una línea + tooltip nativo con el texto completo */
.ds-truncate--cell {
    display: block;
    max-width: 100%;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.ds-truncate--inline {
    display: inline-block;
    max-width: 100%;
    vertical-align: bottom;
}

/* Chips dentro de grillas: no desbordan la celda */
.ds-grid__radzen .ds-chip {
    max-width: 100%;
    display: inline-block;
    vertical-align: bottom;
}

/* Headers de Radzen DataGrid: wrap en vez de truncar con "..." */
.rz-data-grid .rz-column-title,
.rz-datatable .rz-column-title {
    white-space: normal;
    word-break: break-word;
    line-height: 1.3;
    overflow: visible;
    text-overflow: unset;
}

/* Celdas de Radzen: wrap en vez de una sola línea */
.rz-data-grid td .rz-cell-data,
.rz-datatable td .rz-cell-data {
    white-space: normal;
    word-break: break-word;
    overflow: visible;
}

/* Tablas HTML (.ds-table) con scroll en pantallas chicas */
.ds-table-wrap {
    width: 100%;
    max-width: 100%;
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
}

.ds-table-wrap .ds-table {
    width: 100%;
    min-width: min(100%, 520px);
}

.ds-table-wrap .ds-table th {
    white-space: normal;
    word-break: break-word;
    hyphens: auto;
    vertical-align: bottom;
}

.ds-table-wrap .ds-table td {
    max-width: 28rem;
    vertical-align: middle;
}

.ds-table th[title],
.ds-table td .ds-truncate--cell {
    cursor: default;
}

.ds-page-header__title h1 {
    font-family: var(--ds-font-display);
    font-size: var(--ds-fs-2xl);
    font-weight: var(--ds-fw-bold);
    letter-spacing: -0.025em;
    line-height: 1.15;
}

.ds-page-header__title p {
    margin-top: var(--ds-space-1);
    color: var(--ds-text-muted);
    font-size: var(--ds-fs-sm);
}

.ds-page-actions {
    display: flex;
    gap: var(--ds-space-2);
    flex-wrap: wrap;
}

/* =========================================================
   PANELS / CARDS
   ========================================================= */
.ds-panel {
    background: var(--ds-surface);
    border: 1px solid var(--ds-border);
    border-radius: var(--ds-radius-lg);
    padding: var(--ds-space-5);
    box-shadow: var(--ds-shadow-sm);
    transition: background var(--ds-transition-base), border-color var(--ds-transition-base), box-shadow var(--ds-transition-base);
}

.ds-panel + .ds-panel { margin-top: var(--ds-space-4); }

.ds-panel--flush { padding: 0; overflow: hidden; }

.ds-panel__title {
    margin: 0 0 var(--ds-space-3) 0;
    font-family: var(--ds-font-display);
    font-size: var(--ds-fs-lg);
    font-weight: var(--ds-fw-semibold);
    letter-spacing: -0.01em;
    color: var(--ds-text-strong);
    display: flex;
    align-items: center;
    gap: var(--ds-space-2);
}

.ds-panel__title i { color: var(--ds-primary); }

.ds-panel__header {
    padding: var(--ds-space-4) var(--ds-space-5);
    border-bottom: 1px solid var(--ds-border);
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: var(--ds-space-3);
    background: var(--ds-surface);
}

.ds-panel__body { padding: var(--ds-space-5); }

/* =========================================================
   METRIC CARDS (sobrios, sin hover por defecto)
   ========================================================= */
.ds-metrics {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
    gap: var(--ds-space-3);
    margin-bottom: var(--ds-space-4);
}

.ds-metric {
    background: var(--ds-surface);
    border: 1px solid var(--ds-border);
    border-radius: var(--ds-radius-md);
    padding: var(--ds-space-3) var(--ds-space-4);
    display: flex;
    gap: var(--ds-space-3);
    align-items: center;
    position: relative;
    min-width: 0;
}

.ds-metric__icon {
    width: 38px;
    height: 38px;
    border-radius: var(--ds-radius-md);
    background: var(--ds-surface-hover);
    color: var(--ds-text-muted);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 1.05rem;
    flex-shrink: 0;
}

/* Variantes de color: solo se aplican cuando hace falta semántica
   (alerta / éxito / atención). Por defecto el card es neutro. */
.ds-metric--danger  .ds-metric__icon { background: var(--ds-danger-soft);  color: var(--ds-danger); }
.ds-metric--warning .ds-metric__icon { background: var(--ds-warning-soft); color: var(--ds-warning); }
.ds-metric--success .ds-metric__icon { background: var(--ds-success-soft); color: var(--ds-success); }
.ds-metric--info    .ds-metric__icon { background: var(--ds-info-soft);    color: var(--ds-info); }
.ds-metric--primary .ds-metric__icon { background: var(--ds-primary-soft); color: var(--ds-primary); }

.ds-metric__content { min-width: 0; flex: 1; }

.ds-metric__label {
    font-size: var(--ds-fs-xs);
    color: var(--ds-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.05em;
    font-weight: var(--ds-fw-semibold);
    margin-bottom: 2px;
    line-height: 1.2;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.ds-metric__value {
    font-size: 1.55rem;
    font-weight: var(--ds-fw-bold);
    color: var(--ds-text-strong);
    line-height: 1.1;
    display: flex;
    align-items: baseline;
    gap: 6px;
    font-family: "Sora", var(--ds-font-family);
}

.ds-metric__sub {
    font-size: var(--ds-fs-xs);
    color: var(--ds-text-muted);
    margin-top: 2px;
}

.ds-metric__delta {
    font-size: var(--ds-fs-xs);
    font-weight: var(--ds-fw-semibold);
    padding: 1px 6px;
    border-radius: var(--ds-radius-sm);
    background: var(--ds-success-soft);
    color: var(--ds-success-strong);
}

.ds-metric__delta--down { background: var(--ds-danger-soft); color: var(--ds-danger-strong); }

/* =========================================================
   KPI BAR — fila horizontal compacta de estadísticas
   (sin cards individuales, separadas por divider)
   ========================================================= */
.ds-kpi-bar {
    display: flex;
    align-items: stretch;
    background: var(--ds-surface);
    border: 1px solid var(--ds-border);
    border-radius: var(--ds-radius-lg);
    overflow: hidden;
    margin-bottom: var(--ds-space-4);
    box-shadow: var(--ds-shadow-sm);
}

.ds-kpi-bar__item {
    flex: 1;
    min-width: 0;
    padding: var(--ds-space-4) var(--ds-space-4);
    display: flex;
    flex-direction: column;
    gap: 6px;
    border-left: 1px solid var(--ds-border-soft);
    position: relative;
    transition: background var(--ds-transition-fast);
}

.ds-kpi-bar__item:hover { background: var(--ds-surface-alt); }

.ds-kpi-bar__item:first-child { border-left: none; }

.ds-kpi-bar__label {
    font-size: var(--ds-fs-xs);
    color: var(--ds-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.05em;
    font-weight: var(--ds-fw-semibold);
    line-height: 1.2;
    display: flex;
    align-items: center;
    gap: 6px;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.ds-kpi-bar__label .ds-kpi-bar__dot {
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: var(--ds-text-muted);
    flex-shrink: 0;
}

.ds-kpi-bar__dot--success { background: var(--ds-success); }
.ds-kpi-bar__dot--warning { background: var(--ds-warning); }
.ds-kpi-bar__dot--danger  { background: var(--ds-danger); }
.ds-kpi-bar__dot--info    { background: var(--ds-info); }

.ds-kpi-bar__value {
    font-size: 1.95rem;
    font-weight: var(--ds-fw-bold);
    color: var(--ds-text-strong);
    line-height: 1;
    font-family: "Sora", var(--ds-font-family);
    letter-spacing: -0.02em;
    font-variant-numeric: tabular-nums;
}

.ds-kpi-bar__hint {
    font-size: var(--ds-fs-xs);
    color: var(--ds-text-muted);
    line-height: 1.2;
}

.ds-kpi-bar__hint--danger { color: var(--ds-danger-strong); font-weight: var(--ds-fw-semibold); }

.ds-kpi-bar__value--warning { color: var(--ds-warning); }
.ds-kpi-bar__value--danger  { color: var(--ds-danger); }

a.ds-kpi-bar__item {
    text-decoration: none;
    color: inherit;
    cursor: pointer;
}

/* Dashboard (Inicio) */
.dh-page {
    display: flex;
    flex-direction: column;
    gap: var(--ds-space-4);
    min-height: min(68vh, calc(100dvh - 9.5rem));
}

.dh-page .ds-page-header { margin-bottom: 0; }

.dh-hdr-date {
    font-size: var(--ds-fs-sm);
    color: var(--ds-text-muted);
    font-weight: var(--ds-fw-medium);
    white-space: nowrap;
}

.dh-section { min-width: 0; }

.dh-section .ds-kpi-bar { margin-bottom: 0; }

.dh-section__label {
    margin: 0 0 var(--ds-space-2);
    font-size: var(--ds-fs-xs);
    font-weight: var(--ds-fw-semibold);
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--ds-text-muted);
}

.dh-main {
    flex: 1;
    display: grid;
    grid-template-columns: minmax(0, 1.65fr) minmax(0, 1fr);
    gap: var(--ds-space-3);
    min-height: 16rem;
    align-items: stretch;
}

.dh-panel-stretch {
    display: flex;
    flex-direction: column;
    min-height: 0;
    height: 100%;
    margin-top: 0 !important;
}

.dh-panel-hdr {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--ds-space-3);
    margin-bottom: var(--ds-space-3);
    flex-shrink: 0;
}

.dh-panel-hdr .ds-panel__title { margin: 0; }

.dh-panel-body {
    flex: 1;
    min-height: 0;
    display: flex;
    flex-direction: column;
}

.dh-link {
    display: inline-flex;
    align-items: center;
    gap: 3px;
    font-size: var(--ds-fs-xs);
    font-weight: var(--ds-fw-semibold);
    color: var(--ds-primary);
    text-decoration: none;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    flex-shrink: 0;
}

.dh-link:hover { color: var(--ds-primary-dark); }

.dh-list {
    list-style: none;
    padding: 0;
    margin: 0;
    flex: 1;
    min-height: 0;
    overflow-y: auto;
}

.dh-list__row {
    display: flex;
    align-items: center;
    gap: var(--ds-space-3);
    padding: 0.6rem 0.35rem;
    border-bottom: 1px solid var(--ds-border-soft);
    border-radius: var(--ds-radius-sm);
    cursor: pointer;
    transition: background var(--ds-transition-fast);
}

.dh-list__row:last-child { border-bottom: none; }
.dh-list__row:hover { background: var(--ds-surface-hover); }
.dh-list__row--static { cursor: default; }
.dh-list__row--static:hover { background: none; }

.dh-list__body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }

.dh-list__title {
    font-size: var(--ds-fs-sm);
    color: var(--ds-text-strong);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.dh-list__title--plain { color: var(--ds-text); }

.dh-list__sub {
    display: flex;
    align-items: center;
    gap: 3px;
    font-size: var(--ds-fs-xs);
    color: var(--ds-text-muted);
}

.dh-list__sub i { font-size: 0.8rem; flex-shrink: 0; }

.dh-list__end { flex-shrink: 0; }

.dh-muted { color: var(--ds-text-muted); font-weight: var(--ds-fw-normal); }

.dh-time {
    font-size: var(--ds-fs-sm);
    color: var(--ds-text-muted);
    font-variant-numeric: tabular-nums;
    font-weight: var(--ds-fw-medium);
}

.dh-quick {
    margin-top: auto;
    padding-top: var(--ds-space-4);
    border-top: 1px solid var(--ds-border-soft);
    flex-shrink: 0;
}

.dh-quick__title {
    margin: 0 0 var(--ds-space-1);
    font-size: var(--ds-fs-xs);
    font-weight: var(--ds-fw-semibold);
    text-transform: uppercase;
    letter-spacing: 0.05em;
    color: var(--ds-text-muted);
}

.dh-quick__hint {
    margin: 0 0 var(--ds-space-3);
    font-size: var(--ds-fs-xs);
    color: var(--ds-text-muted);
    line-height: 1.35;
}

.dh-quick__links {
    display: flex;
    flex-wrap: wrap;
    gap: var(--ds-space-2);
}

.dh-quick__link {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 0.45rem 0.75rem;
    border-radius: var(--ds-radius-md);
    border: 1px solid var(--ds-border);
    background: var(--ds-surface-alt);
    color: var(--ds-text-strong);
    font-size: var(--ds-fs-sm);
    font-weight: var(--ds-fw-medium);
    text-decoration: none;
    transition: background var(--ds-transition-fast), border-color var(--ds-transition-fast);
}

.dh-quick__link:hover {
    background: var(--ds-surface-hover);
    border-color: var(--ds-border-strong);
}

.dh-quick__link i { color: var(--ds-primary); font-size: 1rem; }

.dh-fleet-health { flex-shrink: 0; margin-top: 0 !important; }

.dh-fleet-health__head { margin-bottom: var(--ds-space-4); }

.dh-fleet-health__head .ds-panel__title { margin: 0; }

.dh-fleet-health__sub {
    margin: var(--ds-space-1) 0 0;
    font-size: var(--ds-fs-sm);
    color: var(--ds-text-muted);
}

.dh-fleet-health__grid {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: var(--ds-space-4);
    align-items: start;
}

.dh-stat {
    display: flex;
    align-items: flex-start;
    gap: var(--ds-space-3);
    min-width: 0;
}

.dh-stat__body {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 4px;
}

.dh-stat__label {
    font-size: var(--ds-fs-xs);
    font-weight: var(--ds-fw-semibold);
    text-transform: uppercase;
    letter-spacing: 0.05em;
    color: var(--ds-text-muted);
}

.dh-stat__value {
    font-size: 1.35rem;
    font-weight: var(--ds-fw-bold);
    color: var(--ds-text-strong);
    line-height: 1;
    font-family: "Sora", var(--ds-font-family);
    font-variant-numeric: tabular-nums;
}

.dh-stat__value--warn { color: var(--ds-warning); }

.dh-stat__hint {
    font-size: var(--ds-fs-xs);
    color: var(--ds-text-muted);
    line-height: 1.3;
}

.dh-stat__hint--danger {
    color: var(--ds-danger-strong);
    font-weight: var(--ds-fw-semibold);
}

.dh-ring {
    --dh-ring-pct: 0;
    --dh-ring-color: var(--ds-primary);
    flex-shrink: 0;
    width: 52px;
    height: 52px;
    border-radius: 50%;
    display: grid;
    place-items: center;
    background: conic-gradient(
        var(--dh-ring-color) calc(var(--dh-ring-pct) * 1%),
        var(--ds-border-soft) 0
    );
}

.dh-ring__inner {
    width: 40px;
    height: 40px;
    border-radius: 50%;
    background: var(--ds-surface);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 0.7rem;
    font-weight: var(--ds-fw-bold);
    color: var(--ds-text-strong);
    font-variant-numeric: tabular-nums;
    line-height: 1;
}

.dh-fleet-bar {
    height: 10px;
    display: flex;
    border-radius: var(--ds-radius-pill);
    overflow: hidden;
    background: var(--ds-border-soft);
    margin-top: 2px;
}

.dh-fleet-seg { height: 100%; transition: width var(--ds-transition-base); }
.dh-fleet-seg--info    { background: var(--ds-info); }
.dh-fleet-seg--success { background: var(--ds-success); }
.dh-fleet-seg--warning { background: var(--ds-warning); }
.dh-fleet-seg--muted   { background: var(--ds-border-strong); }

.dh-fleet-dots {
    display: flex;
    flex-wrap: wrap;
    gap: 6px 12px;
    margin-top: var(--ds-space-2);
}

.dh-fleet-dots span {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    font-size: var(--ds-fs-xs);
    color: var(--ds-text-muted);
}

.dh-fleet-dots strong { color: var(--ds-text-strong); font-weight: var(--ds-fw-semibold); }

.dh-dot {
    display: inline-block;
    width: 7px;
    height: 7px;
    border-radius: 50%;
    flex-shrink: 0;
}

.dh-dot--info    { background: var(--ds-info); }
.dh-dot--success { background: var(--ds-success); }
.dh-dot--warning { background: var(--ds-warning); }
.dh-dot--muted   { background: var(--ds-border-strong); }

@media (max-width: 1024px) {
    .dh-main { grid-template-columns: 1fr; min-height: 0; }
    .dh-fleet-health__grid { grid-template-columns: 1fr; }
}

@media (max-width: 768px) {
    .ds-kpi-bar { flex-wrap: wrap; }
    .ds-kpi-bar__item {
        flex: 1 1 50%;
        border-left: 1px solid var(--ds-border-soft);
        border-top: 1px solid var(--ds-border-soft);
    }
    .ds-kpi-bar__item:first-child,
    .ds-kpi-bar__item:nth-child(2) { border-top: none; }
    .ds-kpi-bar__item:nth-child(odd) { border-left: none; }
}

/* =========================================================
   MOBILE CAROUSEL (cards horizontales)
   ========================================================= */
.ds-mobile-carousel {
    display: grid;
    grid-auto-flow: column;
    grid-auto-columns: clamp(13rem, 76%, 18rem);
    gap: var(--ds-space-3);
    overflow-x: auto;
    overflow-y: hidden;
    padding: 2px var(--ds-space-1) var(--ds-space-2) var(--ds-space-1);
    margin: 0 calc(var(--ds-space-1) * -1);
    scroll-snap-type: x mandatory;
    scrollbar-width: none;
    max-width: 100%;
    min-width: 0;
}
.ds-mobile-carousel::-webkit-scrollbar { display: none; }
.ds-mobile-carousel > * { scroll-snap-align: start; min-width: 0; }
.ds-mobile-carousel .ds-metric { height: 100%; }

/* =========================================================
   BUTTONS
   ========================================================= */
.ds-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: var(--ds-space-2);
    padding: 0.55rem 0.95rem;
    border-radius: var(--ds-radius-md);
    border: 1px solid var(--ds-border);
    background: var(--ds-surface);
    color: var(--ds-text);
    font-family: inherit;
    font-size: var(--ds-fs-sm);
    font-weight: var(--ds-fw-semibold);
    cursor: pointer;
    transition: background var(--ds-transition-fast),
                color var(--ds-transition-fast),
                border-color var(--ds-transition-fast),
                box-shadow var(--ds-transition-fast),
                transform var(--ds-transition-fast);
    white-space: nowrap;
    user-select: none;
    line-height: 1;
}

.ds-btn:hover { background: var(--ds-surface-hover); }
.ds-btn:focus-visible { outline: none; box-shadow: 0 0 0 3px var(--ds-ring); }
.ds-btn:active { transform: translateY(1px); }
.ds-btn:disabled, .ds-btn.is-disabled {
    opacity: 0.55;
    cursor: not-allowed;
    pointer-events: none;
}
.ds-btn i { font-size: 1em; }

.ds-btn--primary {
    background: var(--ds-primary);
    border-color: var(--ds-primary);
    color: var(--ds-primary-contrast);
    box-shadow: 0 1px 3px rgba(220, 38, 38, 0.20), 0 4px 10px rgba(220, 38, 38, 0.16);
}
.ds-btn--primary:hover {
    background: var(--ds-primary-dark);
    border-color: var(--ds-primary-dark);
    box-shadow: 0 1px 3px rgba(220, 38, 38, 0.25), 0 6px 16px rgba(220, 38, 38, 0.22);
}

/* Secundario: estilo tonal (no relleno sólido) — más sobrio y moderno */
.ds-btn--secondary {
    background: color-mix(in srgb, var(--ds-secondary) 10%, var(--ds-surface));
    border-color: color-mix(in srgb, var(--ds-secondary) 28%, var(--ds-border));
    color: var(--ds-secondary-dark);
}
.ds-btn--secondary:hover {
    background: color-mix(in srgb, var(--ds-secondary) 16%, var(--ds-surface));
    border-color: color-mix(in srgb, var(--ds-secondary) 45%, var(--ds-border));
    color: var(--ds-secondary-dark);
}
[data-theme="dark"] .ds-btn--secondary { color: var(--ds-secondary-light); }

.ds-btn--outline {
    background: transparent;
    border-color: var(--ds-primary);
    color: var(--ds-primary);
}
.ds-btn--outline:hover { background: var(--ds-primary-soft); }

.ds-btn--ghost {
    background: transparent;
    border-color: transparent;
    color: var(--ds-text-muted);
}
.ds-btn--ghost:hover {
    background: var(--ds-surface-hover);
    color: var(--ds-text);
}

.ds-btn--danger {
    background: var(--ds-danger);
    border-color: var(--ds-danger);
    color: var(--ds-primary-contrast);
}
.ds-btn--danger:hover { background: var(--ds-danger-strong); border-color: var(--ds-danger-strong); }

.ds-btn--sm { padding: 0.38rem 0.7rem; font-size: var(--ds-fs-xs); border-radius: var(--ds-radius-sm); }
.ds-btn--lg { padding: 0.75rem 1.3rem; font-size: var(--ds-fs-md); border-radius: var(--ds-radius-md); }
.ds-btn--block { width: 100%; }
.ds-btn--icon { width: 36px; height: 36px; padding: 0; border-radius: var(--ds-radius-md); }

/* =========================================================
   ICON BUTTONS (acciones compactas en tablas / toolbars)
   ========================================================= */
.ds-icon-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 32px;
    height: 32px;
    padding: 0;
    margin: 0 2px;
    border: 1px solid transparent;
    border-radius: var(--ds-radius-sm);
    background: transparent;
    color: var(--ds-text-muted);
    cursor: pointer;
    font-size: 1rem;
    line-height: 1;
    transition: background var(--ds-transition-fast),
                color var(--ds-transition-fast),
                border-color var(--ds-transition-fast),
                transform var(--ds-transition-fast);
}

.ds-icon-btn:hover {
    background: var(--ds-surface-hover);
    color: var(--ds-text-strong);
    transform: translateY(-1px);
}

.ds-icon-btn:focus-visible {
    outline: none;
    box-shadow: 0 0 0 3px var(--ds-ring);
}

.ds-icon-btn--ghost { color: var(--ds-text-muted); }
.ds-icon-btn--ghost:hover { color: var(--ds-primary); background: var(--ds-primary-soft); }

.ds-icon-btn--primary { color: var(--ds-primary); }
.ds-icon-btn--primary:hover { background: var(--ds-primary-soft); color: var(--ds-primary-dark); }

.ds-icon-btn--success { color: var(--ds-success); background: var(--ds-success-soft); }
.ds-icon-btn--success:hover { background: var(--ds-success); color: var(--ds-white); }

.ds-icon-btn--warning { color: var(--ds-warning); }
.ds-icon-btn--warning:hover { background: var(--ds-warning-soft); color: var(--ds-warning-strong); }

.ds-icon-btn--danger { color: var(--ds-danger); }
.ds-icon-btn--danger:hover { background: var(--ds-danger-soft); color: var(--ds-danger-strong); }

.ds-icon-btn--info { color: var(--ds-info); background: var(--ds-info-soft); }
.ds-icon-btn--info:hover { background: var(--ds-info); color: var(--ds-white); }

.ds-icon-btn:disabled,
.ds-icon-btn[disabled] {
    opacity: 0.45;
    cursor: not-allowed;
    transform: none;
}

.ds-row-actions {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 0.25rem;
}

/* Mismo peso visual para los iconos del tablero (chip suave en los tres), para que no
   choque el salto entre las filas con confirmar/rechazar y la de suplente. */
.ds-row-actions .ds-icon-btn--danger { background: var(--ds-danger-soft); }
.ds-row-actions .ds-icon-btn--danger:hover { background: var(--ds-danger); color: var(--ds-white); }

/* Placeholder muteado para filas sin acción ("Lista"), para que no quede el hueco vacío. */
.ds-actions-empty {
    color: var(--ds-text-soft);
    user-select: none;
}

/* =========================================================
   CHIPS
   ========================================================= */
.ds-chip {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 3px 10px;
    border-radius: var(--ds-radius-pill);
    font-size: var(--ds-fs-xs);
    font-weight: var(--ds-fw-semibold);
    background: var(--ds-surface-hover);
    color: var(--ds-text);
    white-space: nowrap;
    line-height: 1.5;
}

.ds-chip--success { background: var(--ds-success-soft); color: var(--ds-success-strong); }
.ds-chip--warning { background: var(--ds-warning-soft); color: var(--ds-warning-strong); }
.ds-chip--danger  { background: var(--ds-danger-soft);  color: var(--ds-danger-strong); }
.ds-chip--info    { background: var(--ds-info-soft);    color: var(--ds-info-strong); }
.ds-chip--muted   { background: var(--ds-surface-hover); color: var(--ds-text-muted); }
.ds-chip--primary { background: var(--ds-primary-soft); color: var(--ds-primary-dark); }
.ds-chip--secondary { background: var(--ds-secondary-soft); color: var(--ds-secondary-dark); }

/* =========================================================
   ROW HIGHLIGHTS (tablas)
   ========================================================= */
.ds-row--warning { background: var(--ds-warning-soft) !important; }
.ds-row--danger  { background: var(--ds-danger-soft)  !important; }
.ds-row--success { background: var(--ds-success-soft) !important; }

/* Ganan al striping de filas alternas (.rz-row-striped, especificidad 0,2,0) para que
   el resaltado de fila se vea en TODAS las filas, no solo en las impares. */
.ds-grid__radzen tr.ds-row--warning { background: var(--ds-warning-soft) !important; }
.ds-grid__radzen tr.ds-row--danger  { background: var(--ds-danger-soft)  !important; }
.ds-grid__radzen tr.ds-row--success { background: var(--ds-success-soft) !important; }

/* =========================================================
   FORMS
   ========================================================= */
.ds-form-grid {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: var(--ds-space-4);
}

.ds-form-row {
    display: flex;
    gap: var(--ds-space-4);
    flex-wrap: wrap;
    align-items: flex-end;
}

.ds-form-field {
    display: flex;
    flex-direction: column;
    gap: 6px;
    min-width: 0;
}

.ds-form-field label {
    font-size: var(--ds-fs-xs);
    font-weight: var(--ds-fw-semibold);
    color: var(--ds-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.04em;
}

.ds-form-field--full { grid-column: 1 / -1; }

.ds-form-actions {
    display: flex;
    gap: var(--ds-space-2);
    margin-top: var(--ds-space-5);
    justify-content: flex-end;
    flex-wrap: wrap;
}

@media (max-width: 640px) {
    .ds-form-grid { grid-template-columns: 1fr; }
}

/* Inputs nativos cuando se usan sin Radzen */
.ds-input, .ds-textarea, .ds-select {
    width: 100%;
    padding: 0.55rem 0.8rem;
    border: 1px solid var(--ds-border-strong);
    border-radius: var(--ds-radius-md);
    background: var(--ds-surface);
    color: var(--ds-text);
    font-family: inherit;
    font-size: var(--ds-fs-sm);
    line-height: 1.4;
    transition: border-color var(--ds-transition-fast), box-shadow var(--ds-transition-fast);
}
.ds-input:focus, .ds-textarea:focus, .ds-select:focus {
    outline: none;
    border-color: var(--ds-primary);
    box-shadow: 0 0 0 3px var(--ds-ring);
}

/* =========================================================
   MODAL (overlay centrado reutilizable — componente DsModal)
   ========================================================= */
.ds-modal-backdrop {
    position: fixed;
    inset: 0;
    background: rgba(10, 15, 28, 0.65);
    backdrop-filter: blur(4px);
    z-index: var(--ds-z-modal);
    display: flex;
    align-items: center;
    justify-content: center;
    padding: var(--ds-space-4);
    animation: ds-fade-in 0.15s ease-out;
}

/* Con un modal abierto, bloqueamos el scroll del fondo. Además de ser el comportamiento
   esperado, evita que el desplegable de los combos (Radzen) se desacomode al scrollear
   detrás del modal. Aplica a todos los modales (DsModal) del sistema. */
body:has(.ds-modal-backdrop) {
    overflow: hidden;
}

.ds-modal-box {
    background: var(--ds-surface-elevated);
    border: 1px solid var(--ds-border);
    border-radius: var(--ds-radius-xl);
    box-shadow: var(--ds-shadow-xl);
    width: 100%;
    max-width: 620px;
    max-height: calc(100vh - 3rem);
    display: flex;
    flex-direction: column;
    overflow: hidden;
    animation: ds-modal-in 0.18s cubic-bezier(.16, 1, .3, 1);
}

.ds-modal-box--sm { max-width: 460px; }
.ds-modal-box--md { max-width: 620px; }
.ds-modal-box--lg { max-width: 880px; }

.ds-modal-header {
    display: flex;
    align-items: center;
    gap: var(--ds-space-3);
    padding: var(--ds-space-5) var(--ds-space-5) var(--ds-space-4);
    border-bottom: 1px solid var(--ds-border);
    flex-shrink: 0;
}

.ds-modal-header__icon {
    width: 38px;
    height: 38px;
    border-radius: var(--ds-radius-md);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 1.3rem;
    flex-shrink: 0;
    background: var(--ds-primary-soft);
    color: var(--ds-primary);
}
.ds-modal-header__icon--primary { background: var(--ds-primary-soft); color: var(--ds-primary); }
.ds-modal-header__icon--info    { background: var(--ds-info-soft);    color: var(--ds-info); }
.ds-modal-header__icon--success { background: var(--ds-success-soft); color: var(--ds-success); }
.ds-modal-header__icon--warning { background: var(--ds-warning-soft); color: var(--ds-warning); }
.ds-modal-header__icon--danger  { background: var(--ds-danger-soft);  color: var(--ds-danger); }
.ds-modal-header__icon--muted   { background: var(--ds-surface-hover); color: var(--ds-text-muted); }

.ds-modal-header__text { min-width: 0; flex: 1; }

.ds-modal-title {
    margin: 0;
    font-size: var(--ds-fs-lg);
    line-height: 1.3;
}

.ds-modal-subtitle {
    margin: 0.15rem 0 0;
    color: var(--ds-text-muted);
    font-size: var(--ds-fs-sm);
    line-height: 1.45;
}

.ds-modal-close {
    margin-left: auto;
    align-self: flex-start;
    flex-shrink: 0;
}

.ds-modal-body {
    padding: var(--ds-space-5);
    overflow-y: auto;
    min-height: 0;
}

/* Texto de pregunta en modales de confirmación: resaltado (no muted como el subtítulo). */
.ds-modal-question {
    margin: 0;
    color: var(--ds-text);
    line-height: 1.55;
}

.ds-modal-footer {
    display: flex;
    justify-content: flex-end;
    gap: var(--ds-space-2);
    padding: var(--ds-space-4) var(--ds-space-5) var(--ds-space-5);
    border-top: 1px solid var(--ds-border);
    flex-shrink: 0;
}

@keyframes ds-fade-in {
    from { opacity: 0; }
    to   { opacity: 1; }
}
@keyframes ds-modal-in {
    from { opacity: 0; transform: scale(.96) translateY(-8px); }
    to   { opacity: 1; transform: scale(1) translateY(0); }
}

/* =========================================================
   FIELD DISPLAY (label + value)
   ========================================================= */
.ds-detail-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
    gap: var(--ds-space-4);
}

.ds-field-display {
    display: flex;
    flex-direction: column;
    gap: 2px;
    min-width: 0;
}

/* =========================================================
   ALERTS
   ========================================================= */
.ds-alert {
    border-radius: var(--ds-radius-md);
    padding: var(--ds-space-3) var(--ds-space-4);
    border-left: 4px solid var(--ds-info);
    background: var(--ds-info-soft);
    color: var(--ds-info-strong);
    margin-bottom: var(--ds-space-4);
}
.ds-alert strong { display: inline-flex; align-items: center; gap: 8px; font-weight: var(--ds-fw-semibold); }
.ds-alert p { margin-top: 4px; font-size: var(--ds-fs-sm); }

.ds-alert--danger  { border-color: var(--ds-danger);  background: var(--ds-danger-soft);  color: var(--ds-danger-strong); }
.ds-alert--warning { border-color: var(--ds-warning); background: var(--ds-warning-soft); color: var(--ds-warning-strong); }
.ds-alert--info    { border-color: var(--ds-info);    background: var(--ds-info-soft);    color: var(--ds-info-strong); }
.ds-alert--success { border-color: var(--ds-success); background: var(--ds-success-soft); color: var(--ds-success-strong); }

/* Texto secundario bajo listas vacías (mismo tono en toda la app) */
.ds-quiet-empty-hint {
    margin: var(--ds-space-2) 0 0;
    font-size: var(--ds-fs-sm);
    line-height: 1.45;
    color: var(--ds-text-muted);
    max-width: 32rem;
}

/* =========================================================
   EMPTY STATE
   ========================================================= */
.ds-empty {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    text-align: center;
    padding: var(--ds-space-10) var(--ds-space-4);
    color: var(--ds-text-muted);
    gap: var(--ds-space-2);
}
.ds-empty i { font-size: 2.5rem; opacity: 0.5; }
.ds-empty h2 { color: var(--ds-text-strong); margin-top: var(--ds-space-2); }
.ds-empty p { margin-bottom: var(--ds-space-3); }
.ds-empty--large i { font-size: 3.5rem; }

/* =========================================================
   LOADING (DsLoading — spinner CSS)
   ========================================================= */
.ds-loading {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    text-align: center;
    gap: 1rem;
    padding: var(--ds-space-8) var(--ds-space-4);
    color: var(--ds-text-muted);
}

.ds-loading--compact {
    padding: var(--ds-space-4);
    gap: 0.75rem;
}

.ds-loading--fill {
    min-height: 42vh;
}

.ds-loading--inline {
    flex-direction: row;
    justify-content: flex-start;
    text-align: left;
    padding: 0.65rem 0;
    gap: 0.6rem;
    font-weight: var(--ds-fw-medium);
}

.ds-loading--inline .ds-spinner {
    width: 15px;
    height: 15px;
    border-width: 2px;
}

.ds-spinner {
    width: 2.75rem;
    height: 2.75rem;
    flex-shrink: 0;
    border-radius: 50%;
    border: 3px solid var(--ds-border);
    border-top-color: var(--ds-primary);
    animation: ds-spinner-rotate 0.75s linear infinite;
}

.ds-loading--compact .ds-spinner {
    width: 2rem;
    height: 2rem;
    border-width: 2px;
}

@keyframes ds-spinner-rotate {
    to { transform: rotate(360deg); }
}

.ds-spin {
    animation: ds-spinner-rotate 0.75s linear infinite;
    display: inline-block;
}

@media (prefers-reduced-motion: reduce) {
    .ds-spin { animation: none; }
}

.ds-loading__text {
    margin: 0;
    max-width: 26rem;
    font-size: var(--ds-fs-sm);
    line-height: 1.45;
    color: var(--ds-text-muted);
}

/* =========================================================
   TIMELINE
   ========================================================= */
.ds-timeline { list-style: none; padding: 0; margin: 0; }

.ds-timeline li {
    position: relative;
    padding: var(--ds-space-3) 0 var(--ds-space-3) var(--ds-space-6);
    border-left: 2px solid var(--ds-border);
}
.ds-timeline li::before {
    content: "";
    position: absolute;
    left: -7px;
    top: var(--ds-space-4);
    width: 12px;
    height: 12px;
    border-radius: 50%;
    background: var(--ds-primary);
    border: 2px solid var(--ds-surface);
    box-shadow: 0 0 0 2px var(--ds-primary-soft);
}
.ds-timeline li.is-done::before    { background: var(--ds-success); box-shadow: 0 0 0 2px var(--ds-success-soft); }
.ds-timeline li.is-pending::before { background: var(--ds-border-strong); box-shadow: 0 0 0 2px var(--ds-border-soft); }

/* =========================================================
   MAP PLACEHOLDER
   ========================================================= */
.ds-map-placeholder {
    background: linear-gradient(135deg, var(--ds-secondary-soft) 0%, var(--ds-info-soft) 100%);
    border: 2px dashed var(--ds-secondary);
    border-radius: var(--ds-radius-lg);
    padding: var(--ds-space-8);
    text-align: center;
    color: var(--ds-secondary-dark);
    min-height: 380px;
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    gap: var(--ds-space-2);
}
.ds-map-placeholder i { font-size: 3rem; opacity: 0.65; }

[data-theme="dark"] .ds-map-placeholder {
    color: var(--ds-secondary-light);
}

/* =========================================================
   TABLE (ds-table)
   ========================================================= */
.ds-table {
    width: 100%;
    border-collapse: separate;
    border-spacing: 0;
    font-size: var(--ds-fs-sm);
}

.ds-table thead th {
    background: var(--ds-table-head-bg);
    color: var(--ds-table-head-text);
    text-align: left;
    padding: var(--ds-space-3) var(--ds-space-4);
    font-size: var(--ds-fs-xs);
    font-weight: var(--ds-fw-bold);
    text-transform: uppercase;
    letter-spacing: 0.055em;
    border-bottom: 2px solid var(--ds-border);
    white-space: nowrap;
}

.ds-table tbody td {
    padding: var(--ds-space-3) var(--ds-space-4);
    border-bottom: 1px solid var(--ds-table-border);
    color: var(--ds-text);
}

.ds-table tbody tr:hover { background: var(--ds-table-row-hover); }
.ds-table tbody tr:last-child td { border-bottom: none; }

/* =========================================================
   UTILITIES
   ========================================================= */
.ds-text-muted   { color: var(--ds-text-muted) !important; }
.ds-text-strong  { color: var(--ds-text-strong) !important; font-weight: var(--ds-fw-semibold); }
.ds-text-primary { color: var(--ds-primary) !important; }
.ds-text-success { color: var(--ds-success) !important; }
.ds-text-danger  { color: var(--ds-danger)  !important; }
.ds-text-warning { color: var(--ds-warning) !important; }

/* Valor de dato ausente (DsValue): atenuado y en cursiva para que se entienda
   que no llegó el dato, sin el guion suelto. */
.ds-empty-value {
    color: var(--ds-text-soft);
    font-style: italic;
    font-size: 0.92em;
}

.ds-stack-1 { display: flex; flex-direction: column; gap: var(--ds-space-1); }
.ds-stack-2 { display: flex; flex-direction: column; gap: var(--ds-space-2); }
.ds-stack-3 { display: flex; flex-direction: column; gap: var(--ds-space-3); }
.ds-stack-4 { display: flex; flex-direction: column; gap: var(--ds-space-4); }
.ds-row-2   { display: flex; gap: var(--ds-space-2); align-items: center; flex-wrap: wrap; }
.ds-row-3   { display: flex; gap: var(--ds-space-3); align-items: center; flex-wrap: wrap; }
.ds-row-4   { display: flex; gap: var(--ds-space-4); align-items: center; flex-wrap: wrap; }
.ds-row--end { justify-content: flex-end; }

.ds-grid-2 { display: grid; grid-template-columns: repeat(2, 1fr); gap: var(--ds-space-4); }
.ds-grid-3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--ds-space-4); }
.ds-grid-auto { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: var(--ds-space-4); }

.ds-mt-1 { margin-top: var(--ds-space-1); }
.ds-mt-2 { margin-top: var(--ds-space-2); }
.ds-mt-3 { margin-top: var(--ds-space-3); }
.ds-mt-4 { margin-top: var(--ds-space-4); }
.ds-mt-5 { margin-top: var(--ds-space-5); }
.ds-mb-1 { margin-bottom: var(--ds-space-1); }
.ds-mb-2 { margin-bottom: var(--ds-space-2); }
.ds-mb-3 { margin-bottom: var(--ds-space-3); }
.ds-mb-4 { margin-bottom: var(--ds-space-4); }

.ds-w-full { width: 100%; }

.ds-only-mobile { display: none; }
.ds-only-desktop { display: initial; }

/* =========================================================
   DASHBOARD GRID (rediseño)
   ========================================================= */
.ds-dashboard {
    display: grid;
    grid-template-columns: repeat(12, 1fr);
    gap: var(--ds-space-4);
}

.ds-dashboard__metrics {
    grid-column: span 12;
    display: grid;
    grid-template-columns: repeat(5, minmax(0, 1fr));
    gap: var(--ds-space-3);
}

.ds-dashboard__col-main { grid-column: span 8; min-width: 0; }
.ds-dashboard__col-side { grid-column: span 4; min-width: 0; }

@media (max-width: 1280px) {
    .ds-dashboard__metrics { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}

@media (max-width: 1024px) {
    .ds-dashboard__col-main,
    .ds-dashboard__col-side { grid-column: span 12; }
    .ds-grid-2, .ds-grid-3 { grid-template-columns: 1fr; }
}

@media (max-width: 640px) {
    .ds-dashboard__metrics { display: none; }
    .ds-only-mobile  { display: initial; }
    .ds-only-desktop { display: none; }
}

/* =========================================================
   RESPONSIVE
   ========================================================= */
@media (max-width: 1024px) {
    .ds-content { padding: var(--ds-space-4) var(--ds-space-4); }
}

@media (max-width: 768px) {
    .ds-sidebar {
        position: fixed;
        transform: translateX(-100%);
        transition: transform var(--ds-transition-base);
        box-shadow: var(--ds-shadow-xl);
    }
    .ds-sidebar.is-mobile-open { transform: translateX(0); }
    .ds-sidebar.is-collapsed { width: var(--ds-sidebar-width); }

    .ds-topbar { padding: 0 var(--ds-space-3); min-height: 48px; height: auto; }
    .ds-content { padding: var(--ds-space-3); }
    .ds-page-header { flex-direction: column; align-items: stretch; margin-bottom: var(--ds-space-4); }
    .ds-metrics { display: none; }
}

/* =========================================================
   MOBILE BACKDROP
   ========================================================= */
.ds-mobile-backdrop {
    position: fixed;
    inset: 0;
    background: rgba(15, 23, 42, 0.45);
    z-index: calc(var(--ds-z-sidebar) - 1);
    opacity: 0;
    visibility: hidden;
    transition: opacity var(--ds-transition-base), visibility var(--ds-transition-base);
}

.ds-mobile-backdrop.is-visible { opacity: 1; visibility: visible; }

/* =========================================================
   BLAZOR ERROR UI
   ========================================================= */
#blazor-error-ui {
    background: var(--ds-danger-soft);
    color: var(--ds-danger-strong);
    bottom: 0;
    box-shadow: 0 -1px 2px rgba(15, 23, 42, 0.2);
    display: none;
    left: 0;
    padding: 0.75rem 1.25rem;
    position: fixed;
    width: 100%;
    z-index: var(--ds-z-toast);
}
#blazor-error-ui .dismiss { cursor: pointer; position: absolute; right: 0.75rem; top: 0.5rem; }

/* =========================================================
   RADZEN OVERRIDES — ajustes globales de componentes Radzen
   ========================================================= */

/* Ícono de búsqueda en dropdowns filtrables (AllowFiltering) —
   Radzen lo renderiza al tamaño del texto base; lo achicamos y
   le bajamos la opacidad para que sea un detalle decorativo. */
.rz-dropdown-filter-icon,
.rz-multiselect-filter-icon {
    font-size: 0.7rem !important;
    opacity: 0.38;
    pointer-events: none;
    flex-shrink: 0;
}

/* Contenedor del input de filtro — padding más ajustado */
.rz-dropdown-filter-container {
    padding: 0.3rem 0.6rem;
    gap: 0.35rem;
}

/* Input de filtro — tamaño de texto coherente con el sistema */
.rz-dropdown-filter {
    font-size: var(--ds-fs-sm) !important;
}

/* =========================================================
   LEGACY ALIASES (compat con código viejo)
   ========================================================= */
.page-header { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: var(--ds-space-5); gap: var(--ds-space-4); flex-wrap: wrap; }
.page-header__title h1 { font-family: var(--ds-font-display); font-size: var(--ds-fs-2xl); font-weight: var(--ds-fw-bold); letter-spacing: -0.025em; color: var(--ds-text-strong); }
.page-header__title p { margin-top: var(--ds-space-1); color: var(--ds-text-muted); font-size: var(--ds-fs-sm); }
.panel { background: var(--ds-surface); border: 1px solid var(--ds-border); border-radius: var(--ds-radius-lg); padding: var(--ds-space-5); box-shadow: var(--ds-shadow-sm); }
.panel + .panel { margin-top: var(--ds-space-4); }
.text-muted   { color: var(--ds-text-muted); }
.text-danger  { color: var(--ds-danger); }
.text-warn    { color: var(--ds-warning); }
.text-ok      { color: var(--ds-success); }
.mt-1 { margin-top: var(--ds-space-2); }
.mt-2 { margin-top: var(--ds-space-4); }
.mt-3 { margin-top: var(--ds-space-6); }
