diff --git a/src/app/pages/category/category.component.html b/src/app/pages/category/category.component.html index d5927c2..8027a43 100644 --- a/src/app/pages/category/category.component.html +++ b/src/app/pages/category/category.component.html @@ -20,17 +20,17 @@ @if (loading() && items().length > 0) { @for (i of skeletonSlots; track i) { -
+ } } diff --git a/src/app/pages/category/category.component.scss b/src/app/pages/category/category.component.scss index e932864..731849c 100644 --- a/src/app/pages/category/category.component.scss +++ b/src/app/pages/category/category.component.scss @@ -310,59 +310,27 @@ padding: 40px 20px; } -// Skeleton loading cards +// Skeleton loading cards (shimmer/animation owned by shared app-skeleton) .skeleton-card { pointer-events: none; - .skeleton-image { - background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%); - background-size: 200% 100%; - animation: shimmer 1.5s infinite; + .item-image { + display: block; + aspect-ratio: 1 / 1; } - .skeleton-line { - border-radius: 6px; - background: linear-gradient(90deg, #e8e8e8 25%, #d8d8d8 50%, #e8e8e8 75%); - background-size: 200% 100%; - animation: shimmer 1.5s infinite; - } - - .skeleton-title { - height: 16px; - width: 80%; - } - - .skeleton-rating { - height: 12px; - width: 50%; - } - - .skeleton-price { - height: 18px; - width: 40%; - margin-top: auto; - } - - .skeleton-stock { - height: 6px; - width: 60px; + .item-details app-skeleton { + display: block; + margin-bottom: var(--space-sm, 8px); } .skeleton-btn { - height: 42px; - background: linear-gradient(90deg, #5a8a85 25%, #497671 50%, #5a8a85 75%); - background-size: 200% 100%; - animation: shimmer 1.5s infinite; + display: block; border-radius: 0 0 13px 13px; margin-top: -1px; } } -@keyframes shimmer { - 0% { background-position: 200% 0; } - 100% { background-position: -200% 0; } -} - // Responsive @media (max-width: 1200px) { .items-grid { diff --git a/src/app/pages/category/category.component.ts b/src/app/pages/category/category.component.ts index 943dc52..03dbf26 100644 --- a/src/app/pages/category/category.component.ts +++ b/src/app/pages/category/category.component.ts @@ -12,10 +12,11 @@ import { SCROLL_THRESHOLD_PX, SCROLL_DEBOUNCE_MS, ITEMS_PER_PAGE } from '../../c import { ProductFacade } from '../../facades/platform/product.facade'; import { ProductCardComponent } from '../../components/product-card/product-card.component'; import { IconComponent } from '../../shared/ui/icon/icon.component'; +import { SkeletonComponent } from '../../shared/ui/skeleton/skeleton.component'; @Component({ selector: 'app-category', - imports: [RouterLink, LangRoutePipe, TranslatePipe, ProductCardComponent, IconComponent], + imports: [RouterLink, LangRoutePipe, TranslatePipe, ProductCardComponent, IconComponent, SkeletonComponent], templateUrl: './category.component.html', styleUrls: ['./category.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush diff --git a/src/app/pages/search/search.component.html b/src/app/pages/search/search.component.html index 86ed5ff..43cc007 100644 --- a/src/app/pages/search/search.component.html +++ b/src/app/pages/search/search.component.html @@ -72,17 +72,17 @@ @if (loading() && items().length > 0) { @for (i of skeletonSlots; track i) { -
+ } } diff --git a/src/app/pages/search/search.component.scss b/src/app/pages/search/search.component.scss index c1ab463..1a7cb8c 100644 --- a/src/app/pages/search/search.component.scss +++ b/src/app/pages/search/search.component.scss @@ -352,59 +352,27 @@ text-align: center; } -// Skeleton loading cards +// Skeleton loading cards (shimmer/animation owned by shared app-skeleton) .skeleton-card { pointer-events: none; - .skeleton-image { - background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%); - background-size: 200% 100%; - animation: shimmer 1.5s infinite; + .item-image { + display: block; + aspect-ratio: 1 / 1; } - .skeleton-line { - border-radius: 6px; - background: linear-gradient(90deg, #e8e8e8 25%, #d8d8d8 50%, #e8e8e8 75%); - background-size: 200% 100%; - animation: shimmer 1.5s infinite; - } - - .skeleton-title { - height: 16px; - width: 80%; - } - - .skeleton-rating { - height: 12px; - width: 50%; - } - - .skeleton-price { - height: 18px; - width: 40%; - margin-top: auto; - } - - .skeleton-stock { - height: 6px; - width: 60px; + .item-details app-skeleton { + display: block; + margin-bottom: var(--space-sm, 8px); } .skeleton-btn { - height: 42px; - background: linear-gradient(90deg, #5a8a85 25%, #497671 50%, #5a8a85 75%); - background-size: 200% 100%; - animation: shimmer 1.5s infinite; + display: block; border-radius: 0 0 13px 13px; margin-top: -1px; } } -@keyframes shimmer { - 0% { background-position: 200% 0; } - 100% { background-position: -200% 0; } -} - @media (max-width: 768px) { .search-header h1 { font-size: var(--font-size-3xl, 1.5rem); diff --git a/src/app/pages/search/search.component.ts b/src/app/pages/search/search.component.ts index 7ecdcf8..36dd8bf 100644 --- a/src/app/pages/search/search.component.ts +++ b/src/app/pages/search/search.component.ts @@ -13,10 +13,11 @@ import { SEARCH_DEBOUNCE_MS, ITEMS_PER_PAGE, SCROLL_THRESHOLD_PX, SCROLL_DEBOUNC import { ProductFacade } from '../../facades/platform/product.facade'; import { ProductCardComponent } from '../../components/product-card/product-card.component'; import { IconComponent } from '../../shared/ui/icon/icon.component'; +import { SkeletonComponent } from '../../shared/ui/skeleton/skeleton.component'; @Component({ selector: 'app-search', - imports: [FormsModule, TranslatePipe, ProductCardComponent, IconComponent], + imports: [FormsModule, TranslatePipe, ProductCardComponent, IconComponent, SkeletonComponent], templateUrl: './search.component.html', styleUrls: ['./search.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush