/* 过渡效果 */
.transition-all {
    transition: all 0.3s ease;
}

.transition-colors {
    transition: colors 0.3s ease;
}

.transition-opacity {
    transition: opacity 0.3s ease;
}

/* Hover 效果 */
.hover\:scale-102:hover {
    transform: scale(1.02);
}

.hover\:shadow-sm:hover {
    box-shadow: 0 .125rem .25rem rgba(0,0,0,.075);
}

.hover\:shadow-md:hover {
    box-shadow: 0 .5rem 1rem rgba(0,0,0,.15);
}

/* 淡入动画 */
.fade-in {
    opacity: 0;
    animation: fadeIn 0.5s ease forwards;
}

@keyframes fadeIn {
    from { opacity: 0; }
    to { opacity: 1; }
}

/* 滑入动画 */
.slide-up {
    opacity: 0;
    transform: translateY(20px);
    animation: slideUp 0.5s ease forwards;
}

@keyframes slideUp {
    from {
        opacity: 0;
        transform: translateY(20px);
    }
    to {
        opacity: 1;
        transform: translateY(0);
    }
}

/* 淡入滑入组合动画 */
.fade-slide-in {
    opacity: 0;
    transform: translateX(20px);
    animation: fadeSlideIn 0.5s ease forwards;
}

@keyframes fadeSlideIn {
    from {
        opacity: 0;
        transform: translateX(20px);
    }
    to {
        opacity: 1;
        transform: translateX(0);
    }
}

/* 弹跳动画 */
.bounce-in {
    animation: bounceIn 0.5s cubic-bezier(0.68, -0.55, 0.265, 1.55);
}

@keyframes bounceIn {
    0% { transform: scale(0); }
    50% { transform: scale(1.2); }
    100% { transform: scale(1); }
}

/* 旋转动画 */
.rotate-in {
    animation: rotateIn 0.5s ease;
}

@keyframes rotateIn {
    from { transform: rotate(-180deg); }
    to { transform: rotate(0); }
}

/* 动画延迟工具类 */
.delay-100 { animation-delay: 100ms; }
.delay-200 { animation-delay: 200ms; }
.delay-300 { animation-delay: 300ms; }
.delay-400 { animation-delay: 400ms; }
.delay-500 { animation-delay: 500ms; }

/* 图表容器动画 */
.chart-wrapper {
    opacity: 0;
    transform: translateY(20px);
    will-change: transform, opacity;
}

.chart-wrapper.fade-slide-in {
    animation: chartFadeIn 0.5s cubic-bezier(0.16, 1, 0.3, 1) forwards;
}

@keyframes chartFadeIn {
    0% {
        opacity: 0;
        transform: translateY(20px);
    }
    100% {
        opacity: 1;
        transform: translateY(0);
    }
}

/* 延迟类 */
.delay-400 { animation-delay: 400ms; }
.delay-500 { animation-delay: 500ms; }
.delay-600 { animation-delay: 600ms; }
.delay-700 { animation-delay: 700ms; }

/* 扩展延迟类 */
.delay-800 { animation-delay: 800ms; }
.delay-900 { animation-delay: 900ms; }
.delay-1000 { animation-delay: 1000ms; }

/* 折叠按钮图标动画 */
.collapse-toggle .bi {
    transition: transform 0.3s ease;
}

.collapse-toggle[aria-expanded="true"] .bi {
    transform: rotate(180deg);
}

.collapse-toggle[aria-expanded="false"] .bi {
    transform: rotate(0deg);
}

/* 确保图标在转换时保持清晰 */
.transition-transform {
    will-change: transform;
    transform-origin: center;
}

/* 可点击的标题栏样式 */
.schedule-header {
    cursor: pointer;
    user-select: none;
}

.schedule-header:hover {
    filter: brightness(95%);
}

/* 折叠图标动画 */
.schedule-header[aria-expanded="true"] .bi {
    transform: rotate(180deg);
}

.schedule-header[aria-expanded="false"] .bi {
    transform: rotate(0deg);
}

.schedule-header .bi {
    transition: transform 0.3s ease;
} 