feat: enhance loading skeleton for tickets list with improved styling and structure
This commit is contained in:
@@ -27,8 +27,31 @@
|
||||
}
|
||||
|
||||
@if (isLoading()) {
|
||||
<header class="tickets-list__skeleton-header" aria-hidden="true">
|
||||
<div class="tickets-list__skeleton-selection">
|
||||
<span class="tickets-list__skeleton-check"></span>
|
||||
<span class="tickets-list__skeleton-line tickets-list__skeleton-line--section"></span>
|
||||
</div>
|
||||
<div class="tickets-list__skeleton-bulk-actions">
|
||||
<span class="tickets-list__skeleton-icon"></span>
|
||||
<span class="tickets-list__skeleton-icon"></span>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
@for (item of [1, 2, 3, 4]; track item) {
|
||||
<div class="tickets-list__skeleton" aria-hidden="true"></div>
|
||||
<div class="tickets-list__skeleton" aria-hidden="true">
|
||||
<span class="tickets-list__skeleton-check"></span>
|
||||
<div class="tickets-list__skeleton-details">
|
||||
<span class="tickets-list__skeleton-line tickets-list__skeleton-line--title"></span>
|
||||
<span class="tickets-list__skeleton-line tickets-list__skeleton-line--id"></span>
|
||||
</div>
|
||||
<span class="tickets-list__skeleton-line tickets-list__skeleton-line--date"></span>
|
||||
<div class="tickets-list__skeleton-actions">
|
||||
<span class="tickets-list__skeleton-button"></span>
|
||||
<span class="tickets-list__skeleton-icon"></span>
|
||||
<span class="tickets-list__skeleton-icon"></span>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
} @else if (tickets().length) {
|
||||
@for (ticket of activeTickets(); track ticket.id) {
|
||||
|
||||
@@ -75,15 +75,96 @@
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.tickets-list__skeleton {
|
||||
height: 77px;
|
||||
.tickets-list__skeleton-header {
|
||||
display: flex;
|
||||
min-height: 58px;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
padding-bottom: 12px;
|
||||
border-bottom: 1px solid #dddddd;
|
||||
background: linear-gradient(90deg, transparent, #f3f3f3, transparent);
|
||||
background-size: 200% 100%;
|
||||
animation: loading 1.4s infinite;
|
||||
}
|
||||
|
||||
@keyframes loading {
|
||||
.tickets-list__skeleton-selection,
|
||||
.tickets-list__skeleton-bulk-actions,
|
||||
.tickets-list__skeleton-actions {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.tickets-list__skeleton-selection {
|
||||
gap: 16px;
|
||||
}
|
||||
|
||||
.tickets-list__skeleton-bulk-actions,
|
||||
.tickets-list__skeleton-actions {
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.tickets-list__skeleton {
|
||||
display: grid;
|
||||
grid-template-columns: auto minmax(0, 1fr) 78px auto;
|
||||
min-height: 76px;
|
||||
align-items: center;
|
||||
gap: 16px;
|
||||
padding: 16px 0;
|
||||
border-bottom: 1px solid #dddddd;
|
||||
}
|
||||
|
||||
.tickets-list__skeleton-check,
|
||||
.tickets-list__skeleton-line,
|
||||
.tickets-list__skeleton-icon,
|
||||
.tickets-list__skeleton-button {
|
||||
display: block;
|
||||
border-radius: 4px;
|
||||
background: linear-gradient(90deg, #eeeeee 20%, #f7f7f7 50%, #eeeeee 80%);
|
||||
background-size: 200% 100%;
|
||||
animation: tickets-loading 1.4s ease-in-out infinite;
|
||||
}
|
||||
|
||||
.tickets-list__skeleton-check {
|
||||
width: 21px;
|
||||
height: 21px;
|
||||
border-radius: 2px;
|
||||
}
|
||||
|
||||
.tickets-list__skeleton-details {
|
||||
display: grid;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.tickets-list__skeleton-line--section {
|
||||
width: 120px;
|
||||
height: 14px;
|
||||
}
|
||||
|
||||
.tickets-list__skeleton-line--title {
|
||||
width: min(240px, 75%);
|
||||
height: 13px;
|
||||
}
|
||||
|
||||
.tickets-list__skeleton-line--id {
|
||||
width: 86px;
|
||||
height: 11px;
|
||||
}
|
||||
|
||||
.tickets-list__skeleton-line--date {
|
||||
width: 64px;
|
||||
height: 11px;
|
||||
justify-self: center;
|
||||
}
|
||||
|
||||
.tickets-list__skeleton-button {
|
||||
width: 115px;
|
||||
height: 36px;
|
||||
}
|
||||
|
||||
.tickets-list__skeleton-icon {
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
@keyframes tickets-loading {
|
||||
to {
|
||||
background-position: -200% 0;
|
||||
}
|
||||
@@ -93,4 +174,23 @@
|
||||
.tickets-page__title {
|
||||
margin-top: 24px;
|
||||
}
|
||||
|
||||
.tickets-list__skeleton {
|
||||
grid-template-columns: auto minmax(0, 1fr) auto;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.tickets-list__skeleton-line--date {
|
||||
grid-column: 2;
|
||||
justify-self: start;
|
||||
}
|
||||
|
||||
.tickets-list__skeleton-actions {
|
||||
grid-column: 3;
|
||||
grid-row: 1 / span 2;
|
||||
}
|
||||
|
||||
.tickets-list__skeleton-actions .tickets-list__skeleton-icon {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user