Reusable Empty States & Loading Skeletons for VIA Platform
Use these when lists, tables, or sections have no data to display.
<div class="via-empty-state">
<div class="via-empty-icon">🚛</div>
<div class="via-empty-title">No hay convoys activos</div>
<div class="via-empty-description">...</div>
<button class="via-empty-action">
Crear Nuevo Convoy
</button>
</div>Use these while data is loading to improve perceived performance.
<div class="via-skeleton-card">
<div class="via-skeleton via-skeleton-circle"
style="width: 48px; height: 48px;"></div>
<div class="via-skeleton via-skeleton-text lg"></div>
<div class="via-skeleton via-skeleton-text"></div>
</div>How to integrate these components into your VIA pages.
<link rel="stylesheet" href="via-components.css">
<div id="convoyList">
<!-- Show skeleton initially -->
<div class="via-skeleton-card">
<div class="via-skeleton via-skeleton-text lg"></div>
<div class="via-skeleton via-skeleton-text"></div>
</div>
</div>
<script>
// Fetch data
fetch('/api/convoys')
.then(res => res.json())
.then(data => {
// Replace skeleton with real data
document.getElementById('convoyList').innerHTML =
renderConvoys(data);
});
</script><script>
fetch('/api/convoys')
.then(res => res.json())
.then(data => {
const container = document.getElementById('convoyList');
if (data.length === 0) {
// Show empty state
container.innerHTML = `
<div class="via-empty-state">
<div class="via-empty-icon">🚛</div>
<div class="via-empty-title">No hay convoys activos</div>
<div class="via-empty-description">
Comienza creando tu primer convoy.
</div>
<button class="via-empty-action">
Crear Nuevo Convoy
</button>
</div>
`;
} else {
// Render data
container.innerHTML = renderConvoys(data);
}
})
.catch(error => {
// Show error state
container.innerHTML = `
<div class="via-empty-state">
<div class="via-empty-icon">⚠️</div>
<div class="via-empty-title">Error al cargar datos</div>
<button class="via-empty-action" onclick="location.reload()">
Reintentar
</button>
</div>
`;
});
</script>