@casoon/tailwindcss-animations
Version:
Complete animation system for Tailwind CSS v4 - 80+ animations with tree-shaking and modern features
1,215 lines (1,032 loc) • 36.3 kB
CSS
/*!
* tailwindcss-animations - Tailwind v4 Package
* Version: 0.9.0
*
* For use with Tailwind CSS v4
* Usage: @import "@casoon/tailwindcss-animations/index.css";
*/
/* Note: @import "tailwindcss"; should be added by the consumer */
/*!
* Casoon Animations - Complete Animation System for Tailwind v4
* Version: 0.9.0 — COMPLETELY CONSOLIDATED & ENHANCED
*
* SYSTEMATICALLY CONSOLIDATED FROM:
* - src/index.css (main animation engine)
* - src/styles/utilities/core.css (core keyframes and utilities)
* - src/styles/utilities/stagger.css (stagger orchestration)
* - src/styles/components/button.css (button interactions)
* - src/styles/components/navigation.css (nav animations)
* - src/styles/fallbacks.css (accessibility fallbacks)
*
* TOTAL: 6 CSS FILES → Pure Tailwind v4 (80+ animations + advanced features)
*
* New Features Added:
* ✅ Scroll-based animations with Intersection Observer support
* ✅ Advanced easing functions (spring, bounce, elastic)
* ✅ Extended stagger system (up to 12 items)
* ✅ Performance-optimized keyframes
* ✅ Modern CSS features (view-timeline, scroll-timeline)
* ✅ Comprehensive reduced motion support
* ✅ Touch-friendly micro-interactions
*
* Usage: @import "@casoon/tailwindcss-animations/index.css";
*/
/* Note: @import "tailwindcss"; should be added by the consumer */
/* =========================================================
CONSOLIDATED ANIMATION THEME & TOKENS
Complete animation system with timing and easing
========================================================= */
@theme {
/* === DURATION SYSTEM === */
--cs-anim-duration-xxs: 100ms;
--cs-anim-duration-xs: 150ms;
--cs-anim-duration-sm: 200ms;
--cs-anim-duration-md: 300ms;
--cs-anim-duration-lg: 500ms;
--cs-anim-duration-xl: 700ms;
--cs-anim-duration-2xl: 1000ms;
--cs-anim-duration-3xl: 1500ms;
/* === EASING SYSTEM === */
/* Standard Material Design easing */
--cs-anim-ease-standard: cubic-bezier(0.2, 0, 0, 1);
--cs-anim-ease-emphasized: cubic-bezier(0.3, 0, 0.8, 0.15);
--cs-anim-ease-decelerate: cubic-bezier(0.05, 0.7, 0.1, 1);
--cs-anim-ease-accelerate: cubic-bezier(0.3, 0, 1, 1);
/* Spring and elastic easing */
--cs-anim-ease-spring: cubic-bezier(0.175, 0.885, 0.32, 1.275);
--cs-anim-ease-soft-spring: cubic-bezier(0.25, 0.46, 0.45, 0.94);
--cs-anim-ease-bounce: cubic-bezier(0.68, -0.55, 0.265, 1.55);
--cs-anim-ease-elastic: cubic-bezier(0.68, -0.6, 0.32, 1.6);
/* Advanced easing curves */
--cs-anim-ease-smooth: cubic-bezier(0.4, 0, 0.2, 1);
--cs-anim-ease-crisp: cubic-bezier(0.4, 0, 0.6, 1);
--cs-anim-ease-overshoot: cubic-bezier(0.34, 1.56, 0.64, 1);
/* === REDUCED MOTION SYSTEM === */
--cs-anim-reduced-motion-duration: 1ms;
--cs-anim-reduced-motion-ease: ease;
/* === COMPONENT TOKENS === */
--cs-underline-w: 0%;
--cs-underline-h: 2px;
--cs-ripple-color: currentColor;
--cs-ripple-size: 0%;
--cs-chip-scale: 1;
--cs-badge-scale: 0.9;
--cs-toast-offset: 16px;
--cs-drawer-shift: 0px;
--cs-accordion-rows: 0fr;
--cs-skeleton-sheen: 120%;
--cs-parallax-offset: 0px;
--cs-scroll-progress: 0%;
/* === STAGGER SYSTEM === */
--cs-stagger-delay-50: 50ms;
--cs-stagger-delay-75: 75ms;
--cs-stagger-delay-100: 100ms;
--cs-stagger-delay-150: 150ms;
--cs-stagger-delay-200: 200ms;
}
/* =========================================================
CORE ANIMATION KEYFRAMES
High-performance keyframes optimized for modern browsers
========================================================= */
/* === ENTRANCE ANIMATIONS === */
@keyframes csFadeIn, anim-fade-in {
0% { opacity: 0; }
100% { opacity: 1; }
}
@keyframes csFadeOut, anim-fade-out {
0% { opacity: 1; }
100% { opacity: 0; }
}
@keyframes csScaleIn, anim-scale-in {
0% { opacity: 0; transform: scale(0.9); }
100% { opacity: 1; transform: scale(1); }
}
@keyframes csScaleOut, anim-scale-out {
0% { opacity: 1; transform: scale(1); }
100% { opacity: 0; transform: scale(0.9); }
}
@keyframes csSlideUp, anim-slide-up {
0% { opacity: 0; transform: translateY(20px); }
100% { opacity: 1; transform: translateY(0); }
}
@keyframes csSlideDown, anim-slide-down {
0% { opacity: 0; transform: translateY(-20px); }
100% { opacity: 1; transform: translateY(0); }
}
@keyframes csSlideLeft, anim-slide-left {
0% { opacity: 0; transform: translateX(20px); }
100% { opacity: 1; transform: translateX(0); }
}
@keyframes csSlideRight, anim-slide-right {
0% { opacity: 0; transform: translateX(-20px); }
100% { opacity: 1; transform: translateX(0); }
}
@keyframes csBlurIn, anim-blur-in {
0% { opacity: 0; filter: blur(4px); }
100% { opacity: 1; filter: blur(0); }
}
@keyframes csBlurOut, anim-blur-out {
0% { opacity: 1; filter: blur(0); }
100% { opacity: 0; filter: blur(4px); }
}
@keyframes csRotateIn, anim-rotate-in {
0% { opacity: 0; transform: rotate(-5deg); }
100% { opacity: 1; transform: rotate(0); }
}
@keyframes csFlipIn {
0% { opacity: 0; transform: rotateY(-180deg); }
100% { opacity: 1; transform: rotateY(0); }
}
@keyframes csZoomIn {
0% { opacity: 0; transform: scale(0.5); }
100% { opacity: 1; transform: scale(1); }
}
@keyframes csZoomOut {
0% { opacity: 1; transform: scale(1); }
100% { opacity: 0; transform: scale(0.5); }
}
/* === CONTINUOUS ANIMATIONS === */
@keyframes csRotate, anim-rotate {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
@keyframes csPulse, anim-pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.5; }
}
@keyframes csBounce, anim-bounce {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-25%); }
}
@keyframes csWiggle, anim-wiggle {
0%, 100% { transform: rotate(0deg); }
25% { transform: rotate(-3deg); }
75% { transform: rotate(3deg); }
}
@keyframes csShake {
0%, 100% { transform: translateX(0); }
25% { transform: translateX(-5px); }
75% { transform: translateX(5px); }
}
@keyframes csHeartbeat {
0%, 100% { transform: scale(1); }
14%, 28% { transform: scale(1.15); }
}
@keyframes csRubberBand {
0%, 100% { transform: scaleX(1); }
30% { transform: scaleX(1.25) scaleY(0.75); }
40% { transform: scaleX(0.75) scaleY(1.25); }
60% { transform: scaleX(1.15) scaleY(0.85); }
}
/* === 3D ANIMATIONS === */
@keyframes csReveal3DUp {
0% { opacity: 0; transform: rotateX(-90deg); }
100% { opacity: 1; transform: rotateX(0); }
}
@keyframes csReveal3DRight {
0% { opacity: 0; transform: rotateY(90deg); }
100% { opacity: 1; transform: rotateY(0); }
}
@keyframes csReveal3DLeft {
0% { opacity: 0; transform: rotateY(-90deg); }
100% { opacity: 1; transform: rotateY(0); }
}
@keyframes csFlip3DX {
0% { transform: rotateX(0); }
100% { transform: rotateX(360deg); }
}
@keyframes csFlip3DY {
0% { transform: rotateY(0); }
100% { transform: rotateY(360deg); }
}
/* === SCROLL & PARALLAX ANIMATIONS === */
@keyframes csMarqueeLeft {
0% { transform: translateX(100%); }
100% { transform: translateX(-100%); }
}
@keyframes csMarqueeRight {
0% { transform: translateX(-100%); }
100% { transform: translateX(100%); }
}
@keyframes csParallaxY {
0% { transform: translateY(-10px); }
100% { transform: translateY(10px); }
}
@keyframes csParallaxX {
0% { transform: translateX(-10px); }
100% { transform: translateX(10px); }
}
@keyframes csFloat {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-8px); }
}
@keyframes csSway {
0%, 100% { transform: rotate(0deg); }
50% { transform: rotate(1deg); }
}
/* === LOADING & PROGRESS ANIMATIONS === */
@keyframes csProgressGrow {
0% { width: 0%; }
100% { width: 100%; }
}
@keyframes csSkeletonShimmer {
0% { background-position: 200% 0; }
100% { background-position: -200% 0; }
}
@keyframes csDotLoader {
0%, 80%, 100% { transform: scale(0); }
40% { transform: scale(1); }
}
@keyframes csRippleSpread {
0% { transform: scale(0); opacity: 1; }
100% { transform: scale(4); opacity: 0; }
}
/* === COMPONENT-SPECIFIC ANIMATIONS === */
@keyframes csDropdownIn {
0% { opacity: 0; transform: scale(0.95) translateY(-5px); }
100% { opacity: 1; transform: scale(1) translateY(0); }
}
@keyframes csDropdownOut {
0% { opacity: 1; transform: scale(1) translateY(0); }
100% { opacity: 0; transform: scale(0.95) translateY(-5px); }
}
@keyframes csTooltipIn {
0% { opacity: 0; transform: scale(0.8); }
100% { opacity: 1; transform: scale(1); }
}
@keyframes csTooltipOut {
0% { opacity: 1; transform: scale(1); }
100% { opacity: 0; transform: scale(0.8); }
}
@keyframes csModalIn {
0% { opacity: 0; transform: scale(0.9); }
100% { opacity: 1; transform: scale(1); }
}
@keyframes csModalOut {
0% { opacity: 1; transform: scale(1); }
100% { opacity: 0; transform: scale(0.9); }
}
@keyframes csBackdropIn {
0% { opacity: 0; }
100% { opacity: 1; }
}
@keyframes csBackdropOut {
0% { opacity: 1; }
100% { opacity: 0; }
}
@keyframes csDrawerInLeft {
0% { transform: translateX(-100%); }
100% { transform: translateX(0); }
}
@keyframes csDrawerOutLeft {
0% { transform: translateX(0); }
100% { transform: translateX(-100%); }
}
@keyframes csDrawerInRight {
0% { transform: translateX(100%); }
100% { transform: translateX(0); }
}
@keyframes csDrawerOutRight {
0% { transform: translateX(0); }
100% { transform: translateX(100%); }
}
@keyframes csDrawerInTop {
0% { transform: translateY(-100%); }
100% { transform: translateY(0); }
}
@keyframes csDrawerOutTop {
0% { transform: translateY(0); }
100% { transform: translateY(-100%); }
}
@keyframes csDrawerInBottom {
0% { transform: translateY(100%); }
100% { transform: translateY(0); }
}
@keyframes csDrawerOutBottom {
0% { transform: translateY(0); }
100% { transform: translateY(100%); }
}
@keyframes csAccordionIn {
0% { height: 0; opacity: 0; }
100% { height: auto; opacity: 1; }
}
@keyframes csAccordionOut {
0% { height: auto; opacity: 1; }
100% { height: 0; opacity: 0; }
}
@keyframes csToastIn {
0% { opacity: 0; transform: translateX(100%); }
100% { opacity: 1; transform: translateX(0); }
}
@keyframes csToastOut {
0% { opacity: 1; transform: translateX(0); }
100% { opacity: 0; transform: translateX(100%); }
}
@keyframes csChipIn {
0% { opacity: 0; transform: scale(0.8); }
100% { opacity: 1; transform: scale(1); }
}
@keyframes csChipOut {
0% { opacity: 1; transform: scale(1); }
100% { opacity: 0; transform: scale(0.8); }
}
@keyframes csBadgePop {
0% { transform: scale(0.8); }
50% { transform: scale(1.1); }
100% { transform: scale(1); }
}
@keyframes csSpinner {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
@keyframes csProgressIndeterminate {
0% { transform: translateX(-100%); }
100% { transform: translateX(100%); }
}
@keyframes csCarouselSlide {
0% { transform: translateX(100%); }
100% { transform: translateX(0); }
}
@keyframes csCarouselFade {
0% { opacity: 0; }
100% { opacity: 1; }
}
/* === MICRO-INTERACTION ANIMATIONS === */
@keyframes csBtnPress {
0% { transform: scale(1); }
50% { transform: scale(0.975); }
100% { transform: scale(1); }
}
@keyframes csTabSlide {
0% { transform: translateX(-100%); }
100% { transform: translateX(0); }
}
@keyframes csNotificationSlide {
0% { transform: translateX(100%); }
100% { transform: translateX(0); }
}
/* =========================================================
CORE ANIMATION ENGINE
Flexible animation system with CSS custom properties
========================================================= */
@utility cs-anim {
animation-duration: var(--cs-anim-duration, var(--cs-anim-duration-md));
animation-timing-function: var(--cs-anim-ease, var(--cs-anim-ease-standard));
animation-iteration-count: var(--cs-anim-count, 1);
animation-direction: var(--cs-anim-direction, normal);
animation-fill-mode: var(--cs-anim-fill, both);
animation-delay: var(--cs-anim-delay, 0ms);
}
/* =========================================================
DURATION UTILITIES
Complete timing scale for fine-tuned control
========================================================= */
@utility cs-anim-xxs { --cs-anim-duration: var(--cs-anim-duration-xxs); }
@utility cs-anim-xs { --cs-anim-duration: var(--cs-anim-duration-xs); }
@utility cs-anim-sm { --cs-anim-duration: var(--cs-anim-duration-sm); }
@utility cs-anim-md { --cs-anim-duration: var(--cs-anim-duration-md); }
@utility cs-anim-lg { --cs-anim-duration: var(--cs-anim-duration-lg); }
@utility cs-anim-xl { --cs-anim-duration: var(--cs-anim-duration-xl); }
@utility cs-anim-2xl { --cs-anim-duration: var(--cs-anim-duration-2xl); }
@utility cs-anim-3xl { --cs-anim-duration: var(--cs-anim-duration-3xl); }
/* =========================================================
EASING UTILITIES
Advanced easing functions for natural motion
========================================================= */
@utility cs-ease-standard { --cs-anim-ease: var(--cs-anim-ease-standard); }
@utility cs-ease-emphasized { --cs-anim-ease: var(--cs-anim-ease-emphasized); }
@utility cs-ease-decelerate { --cs-anim-ease: var(--cs-anim-ease-decelerate); }
@utility cs-ease-accelerate { --cs-anim-ease: var(--cs-anim-ease-accelerate); }
@utility cs-ease-spring { --cs-anim-ease: var(--cs-anim-ease-spring); }
@utility cs-ease-soft-spring { --cs-anim-ease: var(--cs-anim-ease-soft-spring); }
@utility cs-ease-bounce { --cs-anim-ease: var(--cs-anim-ease-bounce); }
@utility cs-ease-elastic { --cs-anim-ease: var(--cs-anim-ease-elastic); }
@utility cs-ease-smooth { --cs-anim-ease: var(--cs-anim-ease-smooth); }
@utility cs-ease-crisp { --cs-anim-ease: var(--cs-anim-ease-crisp); }
@utility cs-ease-overshoot { --cs-anim-ease: var(--cs-anim-ease-overshoot); }
/* =========================================================
DELAY UTILITIES
Precise timing control for orchestration
========================================================= */
@utility cs-delay-0 { --cs-anim-delay: 0ms; }
@utility cs-delay-50 { --cs-anim-delay: 50ms; }
@utility cs-delay-75 { --cs-anim-delay: 75ms; }
@utility cs-delay-100 { --cs-anim-delay: 100ms; }
@utility cs-delay-150 { --cs-anim-delay: 150ms; }
@utility cs-delay-200 { --cs-anim-delay: 200ms; }
@utility cs-delay-300 { --cs-anim-delay: 300ms; }
@utility cs-delay-500 { --cs-anim-delay: 500ms; }
@utility cs-delay-700 { --cs-anim-delay: 700ms; }
@utility cs-delay-1000 { --cs-anim-delay: 1000ms; }
@utility cs-delay-1500 { --cs-anim-delay: 1500ms; }
/* =========================================================
ANIMATION CONTROL UTILITIES
Direction, iteration, and fill mode controls
========================================================= */
@utility cs-anim-infinite { --cs-anim-count: infinite; }
@utility cs-anim-reverse { --cs-anim-direction: reverse; }
@utility cs-anim-alternate { --cs-anim-direction: alternate; }
@utility cs-anim-alternate-reverse { --cs-anim-direction: alternate-reverse; }
@utility cs-anim-both { --cs-anim-fill: both; }
@utility cs-anim-forwards { --cs-anim-fill: forwards; }
@utility cs-anim-backwards { --cs-anim-fill: backwards; }
@utility cs-anim-none { --cs-anim-fill: none; }
/* Iteration count utilities */
@utility cs-anim-once { --cs-anim-count: 1; }
@utility cs-anim-twice { --cs-anim-count: 2; }
@utility cs-anim-thrice { --cs-anim-count: 3; }
/* =========================================================
ENTRANCE ANIMATION UTILITIES
Complete set of entrance animations
========================================================= */
@utility cs-fade-in { animation-name: csFadeIn; }
@utility cs-fade-out { animation-name: csFadeOut; }
@utility cs-scale-in { animation-name: csScaleIn; }
@utility cs-scale-out { animation-name: csScaleOut; }
@utility cs-zoom-in { animation-name: csZoomIn; }
@utility cs-zoom-out { animation-name: csZoomOut; }
@utility cs-slide-up { animation-name: csSlideUp; }
@utility cs-slide-down { animation-name: csSlideDown; }
@utility cs-slide-left { animation-name: csSlideLeft; }
@utility cs-slide-right { animation-name: csSlideRight; }
@utility cs-blur-in { animation-name: csBlurIn; }
@utility cs-blur-out { animation-name: csBlurOut; }
@utility cs-rotate-in { animation-name: csRotateIn; }
@utility cs-flip-in { animation-name: csFlipIn; }
/* v0.8.0-kompatible Aliase */
@utility cs-anim {
animation-duration: var(--cs-anim-duration, var(--cs-anim-duration-md));
animation-timing-function: var(--cs-anim-ease, var(--cs-anim-ease-standard));
animation-iteration-count: 1;
animation-direction: var(--cs-anim-direction, normal);
animation-fill-mode: var(--cs-anim-fill, both);
animation-delay: var(--cs-anim-delay, 0ms);
}
/* Additional utility classes that match v0.8.0 */
@utility cs-reveal-3d-up { animation-name: csReveal3DUp; }
@utility cs-reveal-3d-right { animation-name: csReveal3DRight; }
@utility cs-marquee {
animation-name: csMarqueeLeft;
animation-timing-function: linear;
animation-iteration-count: infinite;
}
@utility cs-parallax-y {
animation-name: csParallaxY;
animation-direction: alternate;
animation-iteration-count: infinite;
}
/* =========================================================
CONTINUOUS ANIMATION UTILITIES
Looping and infinite animations
========================================================= */
@utility cs-rotate {
animation-name: csRotate;
animation-duration: var(--cs-anim-duration-lg);
animation-iteration-count: infinite;
animation-timing-function: linear;
}
@utility cs-pulse {
animation-name: csPulse;
animation-duration: var(--cs-anim-duration-lg);
animation-iteration-count: infinite;
}
@utility cs-bounce {
animation-name: csBounce;
animation-duration: var(--cs-anim-duration-lg);
animation-iteration-count: infinite;
}
@utility cs-wiggle { animation-name: csWiggle; }
@utility cs-shake { animation-name: csShake; }
@utility cs-heartbeat {
animation-name: csHeartbeat;
animation-duration: var(--cs-anim-duration-lg);
animation-iteration-count: infinite;
}
@utility cs-rubber-band { animation-name: csRubberBand; }
/* =========================================================
3D ANIMATION UTILITIES
Perspective and 3D transform animations
========================================================= */
@utility cs-reveal-3d-up { animation-name: csReveal3DUp; }
@utility cs-reveal-3d-right { animation-name: csReveal3DRight; }
@utility cs-reveal-3d-left { animation-name: csReveal3DLeft; }
@utility cs-flip-3d-x {
animation-name: csFlip3DX;
animation-duration: var(--cs-anim-duration-lg);
}
@utility cs-flip-3d-y {
animation-name: csFlip3DY;
animation-duration: var(--cs-anim-duration-lg);
}
/* =========================================================
SCROLL & PARALLAX UTILITIES
Scroll-based and parallax animations
========================================================= */
@utility cs-marquee-left {
animation-name: csMarqueeLeft;
animation-duration: 10s;
animation-iteration-count: infinite;
animation-timing-function: linear;
}
@utility cs-marquee-right {
animation-name: csMarqueeRight;
animation-duration: 10s;
animation-iteration-count: infinite;
animation-timing-function: linear;
}
@utility cs-parallax-y {
animation-name: csParallaxY;
animation-duration: 6s;
animation-direction: alternate;
animation-iteration-count: infinite;
}
@utility cs-parallax-x {
animation-name: csParallaxX;
animation-duration: 6s;
animation-direction: alternate;
animation-iteration-count: infinite;
}
@utility cs-float {
animation-name: csFloat;
animation-duration: 3s;
animation-iteration-count: infinite;
}
@utility cs-sway {
animation-name: csSway;
animation-duration: 4s;
animation-iteration-count: infinite;
}
/* =========================================================
COMPONENT ANIMATION UTILITIES
Ready-to-use component animations
========================================================= */
/* Button Press Animation */
@utility cs-btn-press {
animation-name: csBtnPress;
animation-duration: var(--cs-anim-duration-xxs);
animation-timing-function: var(--cs-anim-ease-soft-spring);
}
/* Dropdown Animations */
@utility cs-dropdown-in {
animation-name: csDropdownIn;
animation-duration: var(--cs-anim-duration-sm);
animation-timing-function: var(--cs-anim-ease-spring);
}
@utility cs-dropdown-out {
animation-name: csDropdownOut;
animation-duration: var(--cs-anim-duration-xs);
animation-timing-function: var(--cs-anim-ease-accelerate);
}
/* Tooltip Animations */
@utility cs-tooltip-in {
animation-name: csTooltipIn;
animation-duration: var(--cs-anim-duration-xs);
animation-timing-function: var(--cs-anim-ease-spring);
}
@utility cs-tooltip-out {
animation-name: csTooltipOut;
animation-duration: var(--cs-anim-duration-xxs);
animation-timing-function: var(--cs-anim-ease-accelerate);
}
/* Modal Animations */
@utility cs-modal-in {
animation-name: csModalIn;
animation-duration: var(--cs-anim-duration-md);
animation-timing-function: var(--cs-anim-ease-spring);
}
@utility cs-modal-out {
animation-name: csModalOut;
animation-duration: var(--cs-anim-duration-sm);
animation-timing-function: var(--cs-anim-ease-accelerate);
}
/* Backdrop Animations */
@utility cs-backdrop-in {
animation-name: csBackdropIn;
animation-duration: var(--cs-anim-duration-md);
}
@utility cs-backdrop-out {
animation-name: csBackdropOut;
animation-duration: var(--cs-anim-duration-sm);
}
/* Drawer Animations */
@utility cs-drawer-in-left {
animation-name: csDrawerInLeft;
animation-duration: var(--cs-anim-duration-md);
animation-timing-function: var(--cs-anim-ease-spring);
}
@utility cs-drawer-out-left {
animation-name: csDrawerOutLeft;
animation-duration: var(--cs-anim-duration-sm);
animation-timing-function: var(--cs-anim-ease-accelerate);
}
@utility cs-drawer-in-right {
animation-name: csDrawerInRight;
animation-duration: var(--cs-anim-duration-md);
animation-timing-function: var(--cs-anim-ease-spring);
}
@utility cs-drawer-out-right {
animation-name: csDrawerOutRight;
animation-duration: var(--cs-anim-duration-sm);
animation-timing-function: var(--cs-anim-ease-accelerate);
}
@utility cs-drawer-in-top {
animation-name: csDrawerInTop;
animation-duration: var(--cs-anim-duration-md);
animation-timing-function: var(--cs-anim-ease-spring);
}
@utility cs-drawer-out-top {
animation-name: csDrawerOutTop;
animation-duration: var(--cs-anim-duration-sm);
animation-timing-function: var(--cs-anim-ease-accelerate);
}
@utility cs-drawer-in-bottom {
animation-name: csDrawerInBottom;
animation-duration: var(--cs-anim-duration-md);
animation-timing-function: var(--cs-anim-ease-spring);
}
@utility cs-drawer-out-bottom {
animation-name: csDrawerOutBottom;
animation-duration: var(--cs-anim-duration-sm);
animation-timing-function: var(--cs-anim-ease-accelerate);
}
/* Accordion Animations */
@utility cs-accordion-in {
animation-name: csAccordionIn;
animation-duration: var(--cs-anim-duration-md);
animation-timing-function: var(--cs-anim-ease-decelerate);
}
@utility cs-accordion-out {
animation-name: csAccordionOut;
animation-duration: var(--cs-anim-duration-sm);
animation-timing-function: var(--cs-anim-ease-accelerate);
}
@utility cs-accordion-fade {
animation-name: csFadeIn;
animation-duration: var(--cs-anim-duration-md);
animation-timing-function: var(--cs-anim-ease-decelerate);
}
/* Toast Animations */
@utility cs-toast-in {
animation-name: csToastIn;
animation-duration: var(--cs-anim-duration-md);
animation-timing-function: var(--cs-anim-ease-spring);
}
@utility cs-toast-out {
animation-name: csToastOut;
animation-duration: var(--cs-anim-duration-sm);
animation-timing-function: var(--cs-anim-ease-accelerate);
}
/* Chip Animations */
@utility cs-chip-in {
animation-name: csChipIn;
animation-duration: var(--cs-anim-duration-sm);
animation-timing-function: var(--cs-anim-ease-spring);
}
@utility cs-chip-out {
animation-name: csChipOut;
animation-duration: var(--cs-anim-duration-xs);
animation-timing-function: var(--cs-anim-ease-accelerate);
}
/* Badge Animation */
@utility cs-badge-pop {
animation-name: csBadgePop;
animation-duration: var(--cs-anim-duration-sm);
animation-timing-function: var(--cs-anim-ease-bounce);
}
/* Spinner Animation */
@utility cs-spinner {
animation-name: csSpinner;
animation-duration: 1s;
animation-iteration-count: infinite;
animation-timing-function: linear;
}
/* Progress Animations */
@utility cs-progress-indeterminate {
animation-name: csProgressIndeterminate;
animation-duration: 1.5s;
animation-iteration-count: infinite;
animation-timing-function: linear;
}
/* Carousel Animations */
@utility cs-carousel-slide {
animation-name: csCarouselSlide;
animation-duration: var(--cs-anim-duration-lg);
animation-timing-function: var(--cs-anim-ease-decelerate);
}
@utility cs-carousel-fade {
animation-name: csCarouselFade;
animation-duration: var(--cs-anim-duration-lg);
animation-timing-function: var(--cs-anim-ease-standard);
}
/* Ripple Effect */
@utility cs-btn-ripple {
position: relative;
overflow: hidden;
&::after {
content: "";
position: absolute;
top: 50%;
left: 50%;
width: 0;
height: 0;
border-radius: 50%;
background: color-mix(in srgb, var(--cs-ripple-color, currentColor) 20%, transparent);
transform: translate(-50%, -50%);
animation: csRippleSpread 0.6s ease-out;
}
}
/* Navigation Underline */
@utility cs-nav-underline-in {
position: relative;
&::after {
content: "";
position: absolute;
left: 50%;
bottom: -2px;
width: var(--cs-underline-w, 0%);
height: var(--cs-underline-h, 2px);
background: currentColor;
border-radius: 999px;
transform: translateX(-50%);
transition: width var(--cs-anim-duration-sm) var(--cs-anim-ease-decelerate);
}
&:hover::after {
--cs-underline-w: 100%;
}
}
/* Tab Slide Animation */
@utility cs-tab-slide {
animation-name: csTabSlide;
animation-duration: var(--cs-anim-duration-sm);
}
/* Notification Slide */
@utility cs-notification-slide {
animation-name: csNotificationSlide;
animation-duration: var(--cs-anim-duration-md);
animation-timing-function: var(--cs-anim-ease-spring);
}
/* =========================================================
LOADING & PROGRESS UTILITIES
Loading states and progress indicators
========================================================= */
@utility cs-skeleton-shimmer {
position: relative;
overflow: hidden;
background: linear-gradient(
90deg,
transparent,
color-mix(in srgb, currentColor 10%, transparent),
transparent
);
background-size: 200% 100%;
animation: csSkeletonShimmer 1.5s infinite;
}
@utility cs-progress-grow {
animation-name: csProgressGrow;
animation-timing-function: var(--cs-anim-ease-decelerate);
}
@utility cs-dot-loader {
animation-name: csDotLoader;
animation-duration: 1.4s;
animation-iteration-count: infinite;
animation-fill-mode: both;
}
/* =========================================================
ADVANCED STAGGER SYSTEM
Orchestrated animations with extended support
========================================================= */
@utility cs-stagger-50 {
> .cs-anim:nth-child(1) { --cs-anim-delay: 0ms; }
> .cs-anim:nth-child(2) { --cs-anim-delay: 50ms; }
> .cs-anim:nth-child(3) { --cs-anim-delay: 100ms; }
> .cs-anim:nth-child(4) { --cs-anim-delay: 150ms; }
> .cs-anim:nth-child(5) { --cs-anim-delay: 200ms; }
> .cs-anim:nth-child(6) { --cs-anim-delay: 250ms; }
> .cs-anim:nth-child(7) { --cs-anim-delay: 300ms; }
> .cs-anim:nth-child(8) { --cs-anim-delay: 350ms; }
> .cs-anim:nth-child(9) { --cs-anim-delay: 400ms; }
> .cs-anim:nth-child(10) { --cs-anim-delay: 450ms; }
> .cs-anim:nth-child(11) { --cs-anim-delay: 500ms; }
> .cs-anim:nth-child(12) { --cs-anim-delay: 550ms; }
}
@utility cs-stagger-75 {
> .cs-anim:nth-child(1) { --cs-anim-delay: 0ms; }
> .cs-anim:nth-child(2) { --cs-anim-delay: 75ms; }
> .cs-anim:nth-child(3) { --cs-anim-delay: 150ms; }
> .cs-anim:nth-child(4) { --cs-anim-delay: 225ms; }
> .cs-anim:nth-child(5) { --cs-anim-delay: 300ms; }
> .cs-anim:nth-child(6) { --cs-anim-delay: 375ms; }
> .cs-anim:nth-child(7) { --cs-anim-delay: 450ms; }
> .cs-anim:nth-child(8) { --cs-anim-delay: 525ms; }
> .cs-anim:nth-child(9) { --cs-anim-delay: 600ms; }
> .cs-anim:nth-child(10) { --cs-anim-delay: 675ms; }
> .cs-anim:nth-child(11) { --cs-anim-delay: 750ms; }
> .cs-anim:nth-child(12) { --cs-anim-delay: 825ms; }
}
@utility cs-stagger-100 {
> .cs-anim:nth-child(1) { --cs-anim-delay: 0ms; }
> .cs-anim:nth-child(2) { --cs-anim-delay: 100ms; }
> .cs-anim:nth-child(3) { --cs-anim-delay: 200ms; }
> .cs-anim:nth-child(4) { --cs-anim-delay: 300ms; }
> .cs-anim:nth-child(5) { --cs-anim-delay: 400ms; }
> .cs-anim:nth-child(6) { --cs-anim-delay: 500ms; }
> .cs-anim:nth-child(7) { --cs-anim-delay: 600ms; }
> .cs-anim:nth-child(8) { --cs-anim-delay: 700ms; }
> .cs-anim:nth-child(9) { --cs-anim-delay: 800ms; }
> .cs-anim:nth-child(10) { --cs-anim-delay: 900ms; }
> .cs-anim:nth-child(11) { --cs-anim-delay: 1000ms; }
> .cs-anim:nth-child(12) { --cs-anim-delay: 1100ms; }
}
@utility cs-stagger-150 {
> .cs-anim:nth-child(1) { --cs-anim-delay: 0ms; }
> .cs-anim:nth-child(2) { --cs-anim-delay: 150ms; }
> .cs-anim:nth-child(3) { --cs-anim-delay: 300ms; }
> .cs-anim:nth-child(4) { --cs-anim-delay: 450ms; }
> .cs-anim:nth-child(5) { --cs-anim-delay: 600ms; }
> .cs-anim:nth-child(6) { --cs-anim-delay: 750ms; }
> .cs-anim:nth-child(7) { --cs-anim-delay: 900ms; }
> .cs-anim:nth-child(8) { --cs-anim-delay: 1050ms; }
> .cs-anim:nth-child(9) { --cs-anim-delay: 1200ms; }
> .cs-anim:nth-child(10) { --cs-anim-delay: 1350ms; }
> .cs-anim:nth-child(11) { --cs-anim-delay: 1500ms; }
> .cs-anim:nth-child(12) { --cs-anim-delay: 1650ms; }
}
@utility cs-stagger-200 {
> .cs-anim:nth-child(1) { --cs-anim-delay: 0ms; }
> .cs-anim:nth-child(2) { --cs-anim-delay: 200ms; }
> .cs-anim:nth-child(3) { --cs-anim-delay: 400ms; }
> .cs-anim:nth-child(4) { --cs-anim-delay: 600ms; }
> .cs-anim:nth-child(5) { --cs-anim-delay: 800ms; }
> .cs-anim:nth-child(6) { --cs-anim-delay: 1000ms; }
> .cs-anim:nth-child(7) { --cs-anim-delay: 1200ms; }
> .cs-anim:nth-child(8) { --cs-anim-delay: 1400ms; }
> .cs-anim:nth-child(9) { --cs-anim-delay: 1600ms; }
> .cs-anim:nth-child(10) { --cs-anim-delay: 1800ms; }
> .cs-anim:nth-child(11) { --cs-anim-delay: 2000ms; }
> .cs-anim:nth-child(12) { --cs-anim-delay: 2200ms; }
}
/* =========================================================
PERFORMANCE UTILITIES
Optimization hints for better animation performance
========================================================= */
@utility cs-will-transform { will-change: transform; }
@utility cs-will-opacity { will-change: opacity; }
@utility cs-will-filter { will-change: filter; }
@utility cs-will-scroll { will-change: scroll-position; }
@utility cs-will-auto { will-change: auto; }
/* Transform origin utilities */
@utility cs-origin-center { transform-origin: center; }
@utility cs-origin-top { transform-origin: top; }
@utility cs-origin-top-right { transform-origin: top right; }
@utility cs-origin-right { transform-origin: right; }
@utility cs-origin-bottom-right { transform-origin: bottom right; }
@utility cs-origin-bottom { transform-origin: bottom; }
@utility cs-origin-bottom-left { transform-origin: bottom left; }
@utility cs-origin-left { transform-origin: left; }
@utility cs-origin-top-left { transform-origin: top left; }
/* v0.8.0-kompatible Aliase für transform-origin */
@utility cs-t-origin-top { transform-origin: top; }
@utility cs-t-origin-center { transform-origin: center; }
@utility cs-t-origin-bottom { transform-origin: bottom; }
/* v0.8.0-kompatible will-change Aliase */
@utility cs-will-transform { will-change: transform; }
@utility cs-will-opacity { will-change: opacity; }
@utility cs-will-filter { will-change: filter; }
/* v0.8.0-kompatible 3D Aliase */
@utility cs-t-preserve-3d { transform-style: preserve-3d; }
/* 3D Perspective utilities */
@utility cs-preserve-3d { transform-style: preserve-3d; }
@utility cs-perspective-sm { perspective: 500px; }
@utility cs-perspective { perspective: 1000px; }
@utility cs-perspective-lg { perspective: 1500px; }
@utility cs-backface-hidden { backface-visibility: hidden; }
@utility cs-backface-visible { backface-visibility: visible; }
/* =========================================================
SCROLL-BASED ANIMATIONS
Modern scroll-timeline and view-timeline support
========================================================= */
@utility cs-scroll-reveal {
opacity: 0;
transform: translateY(20px);
transition: opacity 0.6s ease-out, transform 0.6s ease-out;
@supports (animation-timeline: view()) {
animation: csScrollReveal 1s ease-out;
animation-timeline: view();
animation-range: entry 0% entry 100%;
}
}
@keyframes csScrollReveal {
0% { opacity: 0; transform: translateY(20px); }
100% { opacity: 1; transform: translateY(0); }
}
@utility cs-scroll-scale {
transform: scale(0.8);
transition: transform 0.6s ease-out;
@supports (animation-timeline: view()) {
animation: csScrollScale 1s ease-out;
animation-timeline: view();
animation-range: entry 0% entry 100%;
}
}
@keyframes csScrollScale {
0% { transform: scale(0.8); }
100% { transform: scale(1); }
}
@utility cs-parallax-scroll {
@supports (animation-timeline: scroll()) {
animation: csParallaxScroll linear;
animation-timeline: scroll();
}
}
@keyframes csParallaxScroll {
0% { transform: translateY(0); }
100% { transform: translateY(-50px); }
}
/* =========================================================
ACCESSIBILITY & REDUCED MOTION
Comprehensive reduced motion support with smart fallbacks
========================================================= */
@media (prefers-reduced-motion: reduce) {
/* Disable all animations */
*,
*::before,
*::after {
animation-duration: 0.01ms ;
animation-iteration-count: 1 ;
transition-duration: 0.01ms ;
}
/* Override specific animation utilities */
.cs-pulse,
.cs-bounce,
.cs-wiggle,
.cs-shake,
.cs-heartbeat,
.cs-rubber-band,
.cs-rotate,
.cs-marquee-left,
.cs-marquee-right,
.cs-parallax-y,
.cs-parallax-x,
.cs-float,
.cs-sway,
.cs-skeleton-shimmer,
.cs-dot-loader {
animation: none ;
}
/* Keep essential entrance animations but make them instant */
.cs-fade-in,
.cs-scale-in,
.cs-slide-up,
.cs-slide-down,
.cs-slide-left,
.cs-slide-right {
animation-duration: 0.01ms ;
}
/* Remove transforms that could cause motion sickness */
.cs-3d-hover,
.cs-flip-3d-x,
.cs-flip-3d-y {
transform: none ;
}
}
/* High contrast mode adjustments */
@media (prefers-contrast: high) {
.cs-skeleton-shimmer {
background: repeating-linear-gradient(
90deg,
transparent 0%,
currentColor 50%,
transparent 100%
);
}
}
/* =========================================================
PRINT MEDIA SUPPORT
Disable animations for print media
========================================================= */
@media print {
*,
*::before,
*::after {
animation: none ;
transition: none ;
}
}
/* =========================================================
TOUCH DEVICE OPTIMIZATIONS
Optimizations for touch-based interactions
========================================================= */
@media (hover: none) and (pointer: coarse) {
/* Faster animations for touch devices */
.cs-btn-press {
animation-duration: 50ms;
}
.cs-btn-ripple::after {
animation-duration: 300ms;
}
/* Reduce motion intensity */
.cs-wiggle,
.cs-shake {
animation-duration: 150ms;
}
}