kv-tube/static/css/modules/utils.css

212 lines
No EOL
3.8 KiB
CSS

/* ===== Animations ===== */
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
/* ===== Skeleton Loader (Shimmer) ===== */
.skeleton {
background: var(--yt-bg-secondary);
background: linear-gradient(90deg,
var(--yt-bg-secondary) 25%,
var(--yt-bg-hover) 50%,
var(--yt-bg-secondary) 75%);
background-size: 200% 100%;
animation: shimmer 1.5s infinite;
border-radius: 4px;
}
@keyframes shimmer {
0% {
background-position: 200% 0;
}
100% {
background-position: -200% 0;
}
}
.skeleton-card {
display: flex;
flex-direction: column;
gap: 12px;
}
.skeleton-thumb {
width: 100%;
aspect-ratio: 16/9;
border-radius: var(--yt-radius-lg);
}
.skeleton-details {
display: flex;
gap: 12px;
}
.skeleton-avatar {
width: 36px;
height: 36px;
border-radius: 50%;
flex-shrink: 0;
}
.skeleton-text {
flex: 1;
display: flex;
flex-direction: column;
gap: 8px;
}
.skeleton-title {
height: 14px;
width: 90%;
}
.skeleton-meta {
height: 12px;
width: 60%;
}
.skeleton-short {
width: 180px;
height: 320px;
border-radius: 12px;
background: var(--yt-bg-secondary);
background: linear-gradient(90deg,
var(--yt-bg-secondary) 25%,
var(--yt-bg-hover) 50%,
var(--yt-bg-secondary) 75%);
background-size: 200% 100%;
animation: shimmer 1.5s infinite;
flex-shrink: 0;
}
.skeleton-comment {
display: flex;
gap: 16px;
margin-bottom: 20px;
}
.skeleton-comment-avatar {
width: 40px;
height: 40px;
border-radius: 50%;
background: var(--yt-bg-secondary);
}
.skeleton-comment-body {
flex: 1;
display: flex;
flex-direction: column;
gap: 8px;
}
.skeleton-line {
height: 12px;
border-radius: 4px;
background: var(--yt-bg-secondary);
background: linear-gradient(90deg,
var(--yt-bg-secondary) 25%,
var(--yt-bg-hover) 50%,
var(--yt-bg-secondary) 75%);
background-size: 200% 100%;
animation: shimmer 1.5s infinite;
}
/* ===== Loader ===== */
.yt-loader {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
width: 100%;
height: 100%;
min-height: 300px;
color: var(--yt-text-secondary);
background: transparent;
}
/* ===== Friendly Empty State ===== */
.yt-empty-state {
grid-column: 1 / -1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 60px 20px;
text-align: center;
color: var(--yt-text-secondary);
}
.yt-empty-icon {
font-size: 48px;
margin-bottom: 24px;
opacity: 0.5;
}
.yt-empty-title {
font-size: 18px;
font-weight: 500;
margin-bottom: 8px;
color: var(--yt-text-primary);
}
.yt-empty-desc {
font-size: 14px;
margin-bottom: 24px;
}
/* ===== Toasts ===== */
.yt-toast-container {
position: fixed;
bottom: 24px;
left: 24px;
z-index: 9999;
display: flex;
flex-direction: column;
gap: 12px;
pointer-events: none;
}
.yt-toast {
background: #1f1f1f;
color: #fff;
padding: 12px 24px;
border-radius: 8px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
font-size: 14px;
animation: slideUp 0.3s ease;
pointer-events: auto;
display: flex;
align-items: center;
gap: 12px;
min-width: 280px;
border-left: 4px solid #3ea6ff;
}
.yt-toast.error {
border-left-color: #ff4e45;
}
.yt-toast.success {
border-left-color: #2ba640;
}
@keyframes slideUp {
from {
transform: translateY(100%);
opacity: 0;
}
to {
transform: translateY(0);
opacity: 1;
}
}