@push('styles')
    <link rel="stylesheet" href="{{ asset('css/tresipunt-dashboard.css') }}">
@endpush

<div class="dash">

    {{-- ============ Cabecera ============
         Saludo + una frase que responde "¿tengo algo que hacer?" antes de leer
         nada más. Un título que dijera "Dashboard" no aporta nada: ya se sabe
         dónde estás por el menú. Ver briefs/dashboard.md. --}}
    <div style="display:flex; align-items:flex-end; justify-content:space-between; gap:24px; flex-wrap:wrap;">
        <div>
            <div class="dash__eyebrow">{{ ucfirst(now()->translatedFormat('l, j \d\e F')) }}</div>
            <h1 class="dash__title">{{ $bienvenida['saludo'] }}</h1>
            <div class="dash__lead">{{ $bienvenida['resumen'] }}</div>
        </div>
    </div>

    {{-- Aviso de rol limitado: no es una página rota, es que este perfil no llega
         a todo. Ver briefs/general.md. --}}
    @unless($puede['environments'] && $puede['apiLogs'])
        <div class="dash-note">
            <svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="flex:none;"><circle cx="12" cy="12" r="10"/><path d="M12 16v-4"/><path d="M12 8h.01"/></svg>
            Estás viendo la parte que te corresponde según tu rol. El estado del parque y la actividad de la API requieren permisos de administración.
        </div>
    @endunless

    {{-- ============ KPIs ============
         Una celda por área, cada una enlazada a su listado: el KPI no es el
         destino, es la puerta. Solo aparecen las áreas que el rol puede ver. --}}
    @if($kpis)
        <div class="dash-kpis" style="--dash-kpi-cols:{{ count($kpis) }};">
            @foreach($kpis as $kpi)
                <a href="{{ $kpi['url'] }}" wire:navigate class="dash-kpi">
                    <span class="dash-kpi__label">{{ $kpi['label'] }}</span>
                    <span class="dash-kpi__line">
                        <strong class="dash-kpi__value">{{ number_format($kpi['valor'], 0, ',', '.') }}</strong>
                        <span class="dash-kpi__detail">
                            {{ $kpi['detalle'] }}@if($kpi['alerta']) · <span class="dash-kpi__alert">{{ $kpi['alerta'] }}</span>@endif
                        </span>
                    </span>
                </a>
            @endforeach
        </div>
    @endif

    {{-- ============ Requiere tu atención ============
         **Plegado por defecto.** Es el bloque más largo de la pantalla y, el día que
         todo va bien, empujaba el resto del Dashboard fuera de la vista para decir
         «Todo en orden». Ahora la cabecera responde la pregunta —¿tengo algo que
         hacer, y de qué tipo?— y el detalle se abre si lo hay.

         El resumen plegado lleva **el número y la marca de cada nivel**, no solo un
         total: «3» no dice si son tres avisos informativos o tres entornos caídos, y
         esa diferencia es justo la que decide si se abre. --}}
    <section class="dash-card" x-data="{ abierto: false }">

        <div class="dash-card__head" style="cursor:pointer; align-items:center;"
             @click="abierto = !abierto" role="button" tabindex="0"
             @keydown.enter="abierto = !abierto" @keydown.space.prevent="abierto = !abierto"
             :aria-expanded="abierto ? 'true' : 'false'">

            <div style="display:flex; align-items:center; gap:12px; flex-wrap:wrap; min-width:0;">
                <h2 class="dash-card__title">Requiere tu atención</h2>

                {{-- El resumen: solo cuando está plegado. Abierto, el detalle ya está
                     debajo y repetirlo es ruido. --}}
                {{-- **El `display` va en una clase, no en el `style`.** `x-show` de Alpine
                     apaga el elemento con `display:none` y al volver a mostrarlo hace
                     `removeProperty('display')`: se lleva por delante el `display:flex`
                     que estuviera en el atributo. O sea que en cuanto se abría y cerraba
                     el bloque una vez, los contadores se quedaban sin flex ni `gap` y se
                     leía «4 avisos1 informativo». --}}
                <div x-show="!abierto" class="dash-att__sums">
                    @if($hayAtencion)
                        @if($atencionPorNivel['crit'] > 0)
                            <span class="dash-att__sum" style="color:var(--danger-500);">
                                <svg viewBox="0 0 14 14" width="11" height="11"><path d="M7 1.5 13 12H1Z" fill="var(--danger-500)"/></svg>
                                {{ $atencionPorNivel['crit'] }} {{ $atencionPorNivel['crit'] === 1 ? 'crítico' : 'críticos' }}
                            </span>
                        @endif
                        @if($atencionPorNivel['warn'] > 0)
                            <span class="dash-att__sum" style="color:var(--warning-500);">
                                <svg viewBox="0 0 14 14" width="11" height="11"><rect x="3" y="3" width="8" height="8" rx="1.5" transform="rotate(45 7 7)" fill="var(--warning-500)"/></svg>
                                {{ $atencionPorNivel['warn'] }} {{ $atencionPorNivel['warn'] === 1 ? 'aviso' : 'avisos' }}
                            </span>
                        @endif
                        @if($atencionPorNivel['info'] > 0)
                            <span class="dash-att__sum" style="color:var(--info-500);">
                                <svg viewBox="0 0 14 14" width="11" height="11"><circle cx="7" cy="7" r="5" fill="none" stroke="var(--info-500)" stroke-width="2"/></svg>
                                {{ $atencionPorNivel['info'] }} {{ $atencionPorNivel['info'] === 1 ? 'informativo' : 'informativos' }}
                            </span>
                        @endif
                    @else
                        <span class="dash-att__sum" style="color:var(--success-500);">
                            <svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="var(--success-500)" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6 9 17l-5-5"/></svg>
                            Todo en orden
                        </span>
                    @endif
                </div>
            </div>

            <span style="display:flex; align-items:center; gap:8px; flex:none;">
                <span x-show="!abierto" style="font-size:12px; color:var(--text-muted);">
                    {{ $hayAtencion ? 'Ver detalle' : 'Ver' }}
                </span>
                <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="var(--text-subtle)"
                     stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
                     :style="abierto ? 'transform:rotate(180deg); transition:transform .15s' : 'transition:transform .15s'">
                    <path d="m6 9 6 6 6-6"/>
                </svg>
            </span>
        </div>

        <div x-show="abierto" x-cloak>

            @if($hayAtencion)
                {{-- El número va en la propia pastilla: así se ve el volumen de cada
                     categoría sin tener que pulsar los cuatro filtros.

                     **Con `flex-wrap`**, que faltaba: sin él, en cuanto la suma de las
                     cuatro pasaba del ancho de la tarjeta —«Informativos 3» y el panel a
                     media pantalla— se salían por la derecha en vez de bajar.

                     Y el número en su propia cápsula: pegado con un espacio, «Todos 21» se
                     lee como una sola cosa y en «Críticos 11» no se distingue dónde acaba
                     la palabra. --}}
                <div style="display:flex; flex-wrap:wrap; gap:6px; margin-bottom:12px;">
                    @foreach(['all' => 'Todos', 'crit' => 'Críticos', 'warn' => 'Avisos', 'info' => 'Informativos'] as $clave => $etiqueta)
                        @php $activa = $attentionFilter === $clave; @endphp
                        <button type="button" wire:click="setAttentionFilter('{{ $clave }}')"
                                class="dash-pill {{ $activa ? '' : 'dash-pill--muted' }}"
                                style="display:inline-flex; align-items:center; gap:6px; border:none; cursor:pointer;
                                       font-size:11.5px; padding:3px 4px 3px 10px; white-space:nowrap;
                                       {{ $activa ? 'background:var(--neutral-800); color:#fff;' : '' }}">
                            {{ $etiqueta }}
                            <span style="display:inline-flex; min-width:18px; justify-content:center;
                                         border-radius:999px; padding:0 5px; font-size:10.5px; font-weight:700;
                                         {{ $activa
                                            ? 'background:rgb(255 255 255 / 22%); color:#fff;'
                                            : 'background:var(--surface-card); color:var(--text-muted);' }}">
                                {{ $atencionPorNivel[$clave] }}
                            </span>
                        </button>
                    @endforeach
                </div>
            @endif

        {{-- Altura acotada con desplazamiento propio: el bloque nunca empuja los KPIs
             ni el resto del Dashboard fuera de la pantalla, pase lo que pase con el
             volumen de incidencias. Cada bloque de origen aporta como máximo 5 filas
             más una de resumen, así que aquí no hay paginado —el paginado está en el
             listado al que enlaza cada fila. --}}
        <div class="dash-att__list">

        @forelse($atencion as $item)
            <div class="dash-att">
                @if($item['level'] === 'crit')
                    <svg class="dash-att__mark" viewBox="0 0 14 14"><path d="M7 1.5 13 12H1Z" fill="var(--danger-500)"/></svg>
                @elseif($item['level'] === 'warn')
                    <svg class="dash-att__mark" viewBox="0 0 14 14"><rect x="3" y="3" width="8" height="8" rx="1.5" transform="rotate(45 7 7)" fill="var(--warning-500)"/></svg>
                @else
                    <svg class="dash-att__mark" viewBox="0 0 14 14"><circle cx="7" cy="7" r="5" fill="none" stroke="var(--info-500)" stroke-width="2"/></svg>
                @endif

                <div class="dash-att__text">
                    <div><strong>{{ $item['subject'] }}</strong> {{ $item['rest'] }}</div>
                    <div class="dash-att__meta">{{ $item['meta'] }}</div>
                </div>

                <a href="{{ $item['url'] }}" wire:navigate class="dash-att__cta">
                    {{ $item['cta'] }}
                    <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m9 18 6-6-6-6"/></svg>
                </a>
            </div>
        @empty
            @if($hayAtencion)
                {{-- Hay incidencias, pero no de la categoría filtrada --}}
                <div class="dash-empty" style="margin-top:0;">
                    Ninguna incidencia de esta categoría.
                </div>
            @else
                <div class="dash-ok">
                    <div class="dash-ok__icon">
                        <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="var(--success-500)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"/><path d="m22 4-10 10.01-3-3"/></svg>
                    </div>
                    <div>
                        <div style="font-size:14px; font-weight:600; color:var(--text-strong);">Todo en orden</div>
                        <div style="font-size:12.5px; color:var(--text-muted); margin-top:2px;">
                            Sin incidencias activas. Comprobado hace menos de un minuto.
                        </div>
                    </div>
                </div>
            @endif
        @endforelse

        </div>{{-- /.dash-att__list --}}

        </div>{{-- /acordeón --}}
    </section>

    {{-- ============ Comprobar un dominio ============ --}}
    @if($puede['environments'])
        <section class="dash-card" style="padding:14px 20px 16px;">
            <div style="display:flex; align-items:center; gap:16px; flex-wrap:wrap;">
                <h2 class="dash-card__title" style="flex:none;">Comprobar un dominio</h2>
                <div class="dash-search">
                    <svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="var(--text-subtle)" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" style="flex:none;"><circle cx="11" cy="11" r="8"/><path d="m21 21-4.3-4.3"/></svg>
                    <input type="text" wire:model.live.debounce.400ms="domainQuery"
                           placeholder="Pega la URL de un cliente o su nombre — p. ej. moodle51">
                </div>
            </div>

            @if($dominio && $dominio['encontrado'])
                <div class="dash-facts">
                    <div>
                        <div class="dash-label">Entorno</div>
                        <div style="font-size:13.5px; margin-top:2px;">
                            <strong style="font-weight:600; color:var(--text-strong);">{{ $dominio['dominio'] }}</strong>
                            · {{ $dominio['cliente'] }}
                        </div>
                    </div>
                    <div>
                        <div class="dash-label">Licencia</div>
                        <div style="margin-top:3px;">
                            <span class="dash-pill {{ $dominio['licenciaOk'] ? 'dash-pill--ok' : 'dash-pill--bad' }}">
                                {{ $dominio['licencia'] }}
                            </span>
                        </div>
                    </div>
                    <div>
                        <div class="dash-label">Versión</div>
                        <div style="font-size:13px; margin-top:2px;">{{ $dominio['version'] }}</div>
                    </div>
                    <div>
                        <div class="dash-label">Última señal</div>
                        <div style="font-size:13px; margin-top:2px;">{{ $dominio['sync'] }}</div>
                    </div>
                    <div style="flex:1; display:flex; gap:16px; justify-content:flex-end;">
                        <a href="{{ $dominio['url'] }}" wire:navigate style="font-size:13px; font-weight:600;">Ver entorno</a>
                        @if($puede['apiLogs'])
                            <a href="{{ $dominio['urlLogs'] }}" wire:navigate style="font-size:13px; font-weight:600;">Logs</a>
                        @endif
                    </div>
                </div>
            @elseif($dominio)
                <div style="margin-top:10px; font-size:13px; color:var(--text-muted);">
                    Ningún entorno coincide. Comprueba el dominio o
                    <a href="{{ route('environments.index') }}" wire:navigate style="font-weight:600;">busca en Entornos</a>.
                </div>
            @endif
        </section>
    @endif

    {{-- ============ Estado del parque + Actividad ============ --}}
    @if($parque || $actividad)
        <div class="dash-grid-2">

            @if($parque)
                <section class="dash-card" style="padding:14px 20px 16px;">
                    <div style="display:flex; align-items:baseline; justify-content:space-between; margin-bottom:16px;">
                        <h2 class="dash-card__title">Estado del parque</h2>
                        <a href="{{ route('environments.index') }}" wire:navigate style="font-size:12.5px; font-weight:600;">Ver entornos</a>
                    </div>

                    @if($parque['versiones'])
                        <div style="display:flex; flex-direction:column; gap:10px;">
                            <div class="dash-label">Entornos por versión de Moodle</div>

                            @foreach($parque['versiones'] as $version)
                                {{-- Los que no tienen release conocida se pintan distinto a
                                     propósito: son sitios que llevan tiempo sin dar señal y
                                     arrastran lo que dejó el Manager antiguo, no una rama de
                                     Moodle. Con el mismo estilo que las demás se leían como
                                     una versión más. --}}
                                <div class="dash-bar-row">
                                    <span style="font-size:13px; {{ ($version['conocida'] ?? true) ? '' : 'color:var(--text-muted); font-style:italic;' }}"
                                          @unless ($version['conocida'] ?? true) title="Entornos cuyo Moodle no ha sincronizado con el Manager actual: no sabemos su release, solo el versiondb que dejó el Manager antiguo" @endunless>{{ $version['nombre'] }}</span>
                                    <div class="dash-bar">
                                        <div class="dash-bar__fill" style="width:{{ $version['pct'] }}%"></div>
                                    </div>
                                    <span class="dash-bar-row__n">{{ $version['n'] }}</span>
                                </div>
                            @endforeach

                            <div style="display:flex; gap:24px; flex-wrap:wrap; margin-top:10px; padding-top:14px; border-top:1px solid var(--divider); font-size:13px;">
                                <div>
                                    <strong style="font-weight:700; color:var(--text-strong);">{{ $parque['conSoporte'] }} de {{ $parque['total'] }}</strong>
                                    con soporte en vigor
                                    {{-- El flag `has_support` puesto sin contrato detrás. Se dice solo
                                         cuando hay alguno: si no, sobra. --}}
                                    @if ($parque['flagSinContrato'] > 0)
                                        <span style="color:var(--text-muted);">
                                            · {{ $parque['flagSinContrato'] }} marcado{{ $parque['flagSinContrato'] === 1 ? '' : 's' }} sin contrato
                                            <a href="{{ route('environments.index') }}" wire:navigate style="font-weight:600;">revisar</a>
                                        </span>
                                    @endif
                                </div>
                                @if($parque['sinLicencia'] > 0)
                                    <div>
                                        <strong style="font-weight:700; color:var(--danger-500);">{{ $parque['sinLicencia'] }}</strong>
                                        sin licencia asignada ·
                                        <a href="{{ route('environments.index') }}" wire:navigate style="font-weight:600;">revisar</a>
                                    </div>
                                @endif
                            </div>
                        </div>
                    @else
                        <div class="dash-empty" style="margin:0;">
                            Sin datos todavía. Crea tu primer entorno para ver aquí el estado del parque.
                        </div>
                    @endif
                </section>
            @endif

            @if($actividad)
                <section class="dash-card" style="padding:14px 20px 16px;">
                    <div style="display:flex; align-items:baseline; justify-content:space-between; margin-bottom:16px;">
                        <h2 class="dash-card__title">Actividad</h2>
                        <span style="font-size:11.5px; color:var(--text-subtle);">últimos 7 días</span>
                    </div>

                    @if($actividad['disponible'])
                        <div style="display:flex; flex-direction:column; gap:18px;">
                            <div class="dash-metric">
                                <div>
                                    <div style="font-size:12px; color:var(--text-muted);">Peticiones hoy</div>
                                    <div style="display:flex; align-items:baseline; gap:8px;">
                                        <span class="dash-metric__value">{{ number_format($actividad['hoy'], 0, ',', '.') }}</span>
                                        @if($actividad['variacion'] !== null)
                                            <span class="dash-metric__delta {{ $actividad['variacion'] >= 0 ? 'dash-metric__delta--up' : 'dash-metric__delta--flat' }}">
                                                {{ $actividad['variacion'] >= 0 ? '+' : '' }}{{ $actividad['variacion'] }}% vs ayer
                                            </span>
                                        @else
                                            <span class="dash-metric__delta dash-metric__delta--flat">sin referencia de ayer</span>
                                        @endif
                                    </div>
                                </div>

                                {{-- Sparkline en SVG: sin librería de gráficas, como pide el brief.
                                     La fórmula está en un solo sitio porque hay dos series —peticiones
                                     y % de error— y duplicarla es garantía de que se desajusten. --}}
                                @php
                                    $puntosDe = function (array $valores): string {
                                        $tope = max(0.0001, max($valores));

                                        return collect($valores)
                                            ->map(fn ($v, $i) => (2 + $i * 17.6) . ',' . (30 - ($v / $tope) * 24))
                                            ->implode(' ');
                                    };
                                    $puntos = $puntosDe($actividad['serie']);
                                @endphp
                                <svg width="110" height="34" viewBox="0 0 110 34" style="flex:none;">
                                    <polyline points="{{ $puntos }}" fill="none" stroke="var(--teal-500)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
                                </svg>
                            </div>

                            <div class="dash-metric" style="padding-top:16px; border-top:1px solid var(--divider);">
                                <div>
                                    <div style="font-size:12px; color:var(--text-muted);">Errores hoy</div>
                                    <div style="display:flex; align-items:baseline; gap:8px;">
                                        <span class="dash-metric__value">{{ number_format($actividad['errorPctHoy'], 1, ',', '.') }}%</span>
                                        <span class="dash-metric__delta {{ $actividad['errorPctHoy'] > $actividad['errorPctAyer'] ? 'dash-metric__delta--warn' : 'dash-metric__delta--flat' }}">
                                            ayer {{ number_format($actividad['errorPctAyer'], 1, ',', '.') }}%
                                        </span>
                                    </div>
                                </div>

                                {{-- La sparkline de errores va en **porcentaje**, no en número de
                                     errores: un día con 10.000 peticiones y 50 fallos está mejor que
                                     uno con 100 y 20, y una línea de absolutos diría lo contrario.

                                     Con la serie a cero no se dibuja: una línea plana en el suelo se
                                     lee como un gráfico roto, y «ningún error en siete días» ya lo
                                     dice el 0,0 % de al lado. --}}
                                @if (max($actividad['serieError']) > 0)
                                    <svg width="110" height="34" viewBox="0 0 110 34" style="flex:none;"
                                         role="img" aria-label="Porcentaje de error de los últimos 7 días">
                                        <polyline points="{{ $puntosDe($actividad['serieError']) }}" fill="none"
                                                  stroke="var(--warning-500)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
                                    </svg>
                                @endif
                            </div>
                        </div>
                    @else
                        {{-- Dato no disponible: se dice, no se pinta un 0 que se
                             confunde con "todo va bien". Ver briefs/general.md. --}}
                        <div style="font-size:14px; font-weight:600; color:var(--text-muted);">No disponible</div>
                        <div style="font-size:11.5px; color:var(--text-subtle); margin-top:2px;">
                            Sin peticiones registradas ni hoy ni ayer: no hay nada que comparar.
                        </div>
                    @endif
                </section>
            @endif

        </div>
    @endif

    {{-- ============ Contenido publicado ============ --}}
    @if($contenido)
        <section class="dash-card">
            <div class="dash-card__head">
                <h2 class="dash-card__title">Contenido publicado</h2>
                <a href="{{ route('products.index') }}" wire:navigate style="font-size:12.5px; font-weight:600;">Ver productos</a>
            </div>

            @if(count($contenido) > 0)
                <div class="dash-table-head">
                    <span>Producto</span>
                    <span>Última versión</span>
                    <span>Publicada</span>
                    <span>Alcance real</span>
                </div>

                @foreach($contenido as $producto)
                    <div class="dash-table-row">
                        <a href="{{ $producto['url'] }}" wire:navigate style="color:var(--text-strong); font-weight:600;">{{ $producto['nombre'] }}</a>
                        <span>{{ $producto['version'] }}</span>
                        <span style="color:var(--text-muted); font-size:12.5px;">{{ $producto['fecha'] }}</span>
                        @if($producto['publicado'])
                            {{-- El alcance real (cuántos entornos resuelven esta versión) es
                                 dato derivado que todavía no existe. Se dice, en lugar de
                                 inventar un porcentaje. Ver briefs/dashboard.md. --}}
                            <span style="font-size:12.5px; color:var(--text-subtle);">Pendiente de calcular</span>
                        @else
                            <span class="dash-pill dash-pill--muted" style="justify-self:start;">Sin versiones</span>
                        @endif
                    </div>
                @endforeach
            @else
                <div class="dash-empty">Ningún producto todavía.</div>
            @endif
        </section>
    @endif

    {{-- ============ Los sitios más grandes ============
         Implementa `Dashboard Manager.dc.html` (Claude Design).

         **La pregunta que no tenía respuesta en ningún sitio**: «¿cuáles son nuestros
         clientes gordos?». El dato ya lo mandaba cada Moodle en su telemetría diaria y solo
         se podía ver entrando entorno por entorno.

         Tres listas y no una porque no miden lo mismo, y el orden cambia entre ellas: un
         campus con muchos usuarios y pocos cursos es acceso masivo a poco contenido, y uno
         con muchos cursos y pocas matrículas es un catálogo que nadie usa todavía. Un
         ranking único obligaría a inventarse una fórmula que pondere las tres, y no hay
         ninguna que signifique algo.

         Un solo título para las tres y un rótulo corto en cada tarjeta: repetir «Sitios
         con…» en las tres es decir lo mismo cuatro veces.

         Va al final, encima de los accesos rápidos: no es algo que atender —para eso está
         «Requiere atención», arriba— sino algo que saber. --}}
    @if ($masGrandes)
        <section>
            <h2 style="font-family:'Plus Jakarta Sans',sans-serif; font-size:14px; font-weight:700; color:var(--text-strong); margin:0 0 12px;">
                Los sitios más grandes
            </h2>

            {{-- `auto-fit` y no tres columnas fijas: en pantalla estrecha bajan solas sin
                 necesitar un punto de ruptura escrito a mano. --}}
            <div style="display:grid; grid-template-columns:repeat(auto-fit, minmax(280px, 1fr)); gap:16px;">
                @foreach ($masGrandes as $lista)
                    <div style="background:var(--surface-card); border:1px solid var(--border-subtle); border-radius:12px; overflow:hidden;">
                        <div style="display:flex; align-items:center; gap:9px; padding:12px 18px 9px;">
                            {{-- El SVG se arma aquí con los trazos que da el componente, y
                                 no llega como HTML crudo: un `{!! !!}` con marcado que
                                 viene de PHP es la clase de cosa que un día lleva algo que
                                 no debía. --}}
                            <span style="color:var(--orange-500); display:flex;">
                                <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor"
                                     stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round">
                                    @foreach ($lista['icono'] as $trazo)
                                        <path d="{{ $trazo }}" />
                                    @endforeach
                                </svg>
                            </span>
                            <span style="font-size:11px; font-weight:600; letter-spacing:0.07em; text-transform:uppercase; color:var(--text-muted);">
                                {{ $lista['titulo'] }}
                            </span>
                        </div>

                        @forelse ($lista['filas'] as $i => $fila)
                            <div style="display:flex; align-items:center; gap:10px; padding:6px 18px; border-top:1px solid var(--divider); font-size:12.5px;">
                                <span style="flex:none; width:16px; font-size:11px; color:var(--text-subtle);">{{ $i + 1 }}</span>

                                <a href="{{ $fila['url'] }}" wire:navigate
                                   title="{{ $fila['nombre'] }}{{ $fila['cliente'] ? ' · ' . $fila['cliente'] : '' }}"
                                   style="flex:1; min-width:0; font-weight:400; color:var(--text-body); overflow:hidden; text-overflow:ellipsis; white-space:nowrap;">
                                    {{ $fila['dominio'] }}
                                </a>

                                <span style="flex:none; font-family:monospace; font-size:12px; font-weight:700; color:var(--text-strong);">
                                    {{ number_format($fila['cuantos'], 0, ',', '.') }}
                                </span>
                            </div>
                        @empty
                            {{-- Vacío no es «cero usuarios»: es que ningún sitio ha mandado
                                 todavía su telemetría. Decirlo evita leerlo como un dato. --}}
                            <div style="padding:10px 18px 14px; border-top:1px solid var(--divider); font-size:12.5px; color:var(--text-muted);">
                                Ningún sitio ha enviado {{ $lista['unidad'] }} todavía.
                            </div>
                        @endforelse
                    </div>
                @endforeach
            </div>
        </section>
    @endif

    {{-- ============ Accesos rápidos ============
         Los iconos salen del MISMO componente que el menú lateral
         (`x-nav-icon`) y con el MISMO nombre que usa el menú para esa sección, no
         de SVG escritos aquí: el mismo concepto no puede tener dos dibujos según
         dónde se mire. Ver known-issues MGR-029.

         Mapeo tomado de app/Livewire/Layout/Navigation.php:
           Entornos  → server-04       (environments.index)
           Clientes  → building-07     (clients.index)
           Licencias → check-done-02   (license_tokens.index) --}}
    <section>
        <h2 style="font-size:14px; font-weight:700; margin:0 0 12px;">Accesos rápidos</h2>
        <div class="dash-grid-3">
            @can('admin.environments.create')
                <a href="{{ route('environments.create') }}" wire:navigate class="dash-quick">
                    <span class="dash-quick__icon"><x-nav-icon name="server-04" :size="20" tint="orange" /></span>
                    Nuevo entorno
                </a>
            @endcan

            @can('admin.clients.create')
                <a href="{{ route('clients.create') }}" wire:navigate class="dash-quick">
                    <span class="dash-quick__icon"><x-nav-icon name="building-07" :size="20" tint="orange" /></span>
                    Nuevo cliente
                </a>
            @endcan

            @can('admin.license-tokens.create')
                <a href="{{ route('license_tokens.create') }}" wire:navigate class="dash-quick">
                    <span class="dash-quick__icon"><x-nav-icon name="check-done-02" :size="20" tint="orange" /></span>
                    Nuevo token
                </a>
            @endcan
        </div>
    </section>

</div>
