| |
|
|
| |
| .lazy-image { |
| opacity: 0; |
| transition: opacity 0.3s ease; |
| background-color: #f0f0f0; |
| background-size: cover; |
| background-position: center; |
| background-repeat: no-repeat; |
| } |
|
|
| .lazy-image.loaded { |
| opacity: 1; |
| } |
|
|
| .lazy-image.loading { |
| background-image: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCIgZmlsbD0iI2YwZjBmMCIvPjx0ZXh0IHg9IjUwJSIgeT0iNTAlIiBkeD0iMCUiZmlsbD0idXJsKCNjMDAwMDAwKSIgZm9udC1zaXplPSIxNCIgZmlsbD0iIzMzMzMzMyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZHk9Ii4zZW0iPuaIkOWbvueJhzwvdGV4dD48L3N2Zz4='); |
| } |
|
|
| .lazy-image.error { |
| background-image: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCIgZmlsbD0iI2ZmZiIvPjx0ZXh0IHg9IjUwJSIgeT0iNTAlIiBkeD0iMCUiZmlsbD0idXJsKCNjMDAwMDAwKSIgZm9udC1zaXplPSIxNCIgZmlsbD0iIzMzMzMzMyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZHk9Ii4zZW0iPlVubGljZS1EZXNjcmlwdGlvbi1BZHZhbmNlZCAtLTwvdGV4dD48L3N2Zz4='); |
| } |
|
|
| |
| .lazy-component { |
| opacity: 0; |
| transform: translateY(20px); |
| transition: opacity 0.3s ease, transform 0.3s ease; |
| } |
|
|
| .lazy-component.loaded { |
| opacity: 1; |
| transform: translateY(0); |
| } |
|
|
| .lazy-component.loading { |
| min-height: 200px; |
| background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%); |
| background-size: 200% 100%; |
| animation: lazyLoading 1.5s infinite; |
| } |
|
|
| @keyframes lazyLoading { |
| 0% { |
| background-position: 200% 0; |
| } |
| 100% { |
| background-position: -200% 0; |
| } |
| } |
|
|
| |
| .lazy-background { |
| background-color: #f8f9fa; |
| background-size: cover; |
| background-position: center; |
| background-repeat: no-repeat; |
| transition: background-image 0.3s ease; |
| } |
|
|
| .lazy-background.loaded { |
| background-image: var(--lazy-bg-image); |
| } |
|
|
| |
| .lazy-video { |
| opacity: 0; |
| transition: opacity 0.3s ease; |
| } |
|
|
| .lazy-video.loaded { |
| opacity: 1; |
| } |
|
|
| .lazy-video video { |
| width: 100%; |
| height: 100%; |
| object-fit: cover; |
| } |
|
|
| |
| .lazy-iframe { |
| opacity: 0; |
| transition: opacity 0.3s ease; |
| } |
|
|
| .lazy-iframe.loaded { |
| opacity: 1; |
| } |
|
|
| .lazy-iframe iframe { |
| width: 100%; |
| height: 100%; |
| border: none; |
| } |
|
|
| |
| .no-intersection-observer .lazy-image, |
| .no-intersection-observer .lazy-component, |
| .no-intersection-observer .lazy-background, |
| .no-intersection-observer .lazy-video, |
| .no-intersection-observer .lazy-iframe { |
| opacity: 1; |
| transform: none; |
| } |
|
|
| |
| .loading-skeleton { |
| background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%); |
| background-size: 200% 100%; |
| animation: loadingSkeleton 1.5s infinite; |
| } |
|
|
| @keyframes loadingSkeleton { |
| 0% { |
| background-position: 200% 0; |
| } |
| 100% { |
| background-position: -200% 0; |
| } |
| } |
|
|
| .loading-pulse { |
| animation: loadingPulse 1.5s ease-in-out infinite; |
| } |
|
|
| @keyframes loadingPulse { |
| 0%, 100% { |
| opacity: 1; |
| } |
| 50% { |
| opacity: 0.5; |
| } |
| } |
|
|
| .loading-spinner { |
| border: 3px solid #f3f3f3; |
| border-top: 3px solid var(--primary-color); |
| border-radius: 50%; |
| width: 40px; |
| height: 40px; |
| animation: loadingSpin 1s linear infinite; |
| } |
|
|
| @keyframes loadingSpin { |
| 0% { |
| transform: rotate(0deg); |
| } |
| 100% { |
| transform: rotate(360deg); |
| } |
| } |
|
|
| |
| .progressive-image { |
| opacity: 0; |
| transition: opacity 0.3s ease; |
| } |
|
|
| .progressive-image.loaded-low { |
| opacity: 0.5; |
| } |
|
|
| .progressive-image.loaded-high { |
| opacity: 1; |
| } |
|
|
| |
| .placeholder-avatar { |
| background: linear-gradient(45deg, #e0e0e0 25%, #f0f0f0 50%, #e0e0e0 75%); |
| background-size: 200% 200%; |
| animation: placeholderAnimation 1.5s ease infinite; |
| } |
|
|
| @keyframes placeholderAnimation { |
| 0% { |
| background-position: 0% 50%; |
| } |
| 50% { |
| background-position: 100% 50%; |
| } |
| 100% { |
| background-position: 0% 50%; |
| } |
| } |
|
|
| .placeholder-card { |
| background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%); |
| background-size: 200% 100%; |
| animation: placeholderAnimation 1.5s ease infinite; |
| } |
|
|
| |
| .error-state { |
| background: #fff5f5; |
| border: 1px solid #fed7d7; |
| border-radius: 8px; |
| padding: 16px; |
| text-align: center; |
| color: #c53030; |
| } |
|
|
| .error-state svg { |
| width: 48px; |
| height: 48px; |
| margin-bottom: 8px; |
| color: #c53030; |
| } |
|
|
| |
| .retry-button { |
| background: var(--primary-color); |
| color: white; |
| border: none; |
| padding: 8px 16px; |
| border-radius: 4px; |
| cursor: pointer; |
| font-size: 14px; |
| margin-top: 8px; |
| transition: background 0.2s ease; |
| } |
|
|
| .retry-button:hover { |
| background: var(--primary-color-dark); |
| } |
|
|
| .retry-button:focus { |
| outline: 2px solid var(--primary-color); |
| outline-offset: 2px; |
| } |
|
|
| |
| .performance-indicator { |
| position: fixed; |
| top: 10px; |
| right: 10px; |
| background: rgba(0, 0, 0, 0.8); |
| color: white; |
| padding: 8px 12px; |
| border-radius: 4px; |
| font-size: 12px; |
| font-family: monospace; |
| z-index: 9999; |
| } |
|
|
| .performance-indicator.good { |
| background: rgba(34, 197, 94, 0.8); |
| } |
|
|
| .performance-indicator.warning { |
| background: rgba(251, 191, 36, 0.8); |
| } |
|
|
| .performance-indicator.poor { |
| background: rgba(239, 68, 68, 0.8); |
| } |
|
|
| |
| .lazy-load-threshold-0 { |
| opacity: 0; |
| transition: opacity 0.3s ease; |
| } |
|
|
| .lazy-load-threshold-0.loaded { |
| opacity: 1; |
| } |
|
|
| .lazy-load-threshold-100 { |
| opacity: 0; |
| transition: opacity 0.3s ease; |
| } |
|
|
| .lazy-load-threshold-100.loaded { |
| opacity: 1; |
| } |
|
|
| .lazy-load-threshold-200 { |
| opacity: 0; |
| transition: opacity 0.3s ease; |
| } |
|
|
| .lazy-load-threshold-200.loaded { |
| opacity: 1; |
| } |
|
|
| .lazy-load-threshold-300 { |
| opacity: 0; |
| transition: opacity 0.3s ease; |
| } |
|
|
| .lazy-load-threshold-300.loaded { |
| opacity: 1; |
| } |
|
|
| |
| @media (max-width: 767px) { |
| .mobile-lazy-image { |
| opacity: 0; |
| transition: opacity 0.5s ease; |
| } |
| |
| .mobile-lazy-image.loaded { |
| opacity: 1; |
| } |
| |
| .mobile-lazy-component { |
| opacity: 0; |
| transform: translateY(30px); |
| transition: opacity 0.5s ease, transform 0.5s ease; |
| } |
| |
| .mobile-lazy-component.loaded { |
| opacity: 1; |
| transform: translateY(0); |
| } |
| } |
|
|
| |
| @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { |
| .lazy-image.high-dpi { |
| image-rendering: -webkit-optimize-contrast; |
| image-rendering: crisp-edges; |
| } |
| } |
|
|
| |
| @media (prefers-reduced-data: reduce) { |
| .lazy-image.low-data { |
| display: none; |
| } |
| |
| .lazy-placeholder.low-data { |
| display: block; |
| } |
| } |
|
|
| |
| @media (prefers-reduced-motion: reduce) { |
| .lazy-image, |
| .lazy-component, |
| .lazy-background, |
| .lazy-video, |
| .lazy-iframe { |
| transition: none; |
| } |
| |
| .loading-skeleton, |
| .loading-pulse, |
| .placeholder-avatar, |
| .placeholder-card { |
| animation: none; |
| } |
| } |
|
|
| |
| @media print { |
| .lazy-image, |
| .lazy-video, |
| .lazy-iframe { |
| opacity: 1 !important; |
| transform: none !important; |
| } |
| |
| .loading-skeleton, |
| .loading-pulse, |
| .loading-spinner { |
| display: none !important; |
| } |
| } |