I’ll build this as a production-ready animations.css for RX Theme: variables, reusable keyframes, utility classes, accessibility-safe motion reduction, scroll animations, loaders, effects, and medical-site friendly UI motion.
Dear friend, paste this full code into:
assets/static/static-css/utilities/animations.css
/*!
* RX Theme - Advanced Animation Utilities
* File: assets/static/static-css/utilities/animations.css
* Purpose: Reusable, performance-friendly CSS animations for RX Theme
* Author: rxharun.com
*/
/* =========================================================
01. Animation Design Tokens
========================================================= */
:root {
--rx-motion-none: 0ms;
--rx-motion-fastest: 100ms;
--rx-motion-fast: 150ms;
--rx-motion-normal: 250ms;
--rx-motion-medium: 400ms;
--rx-motion-slow: 650ms;
--rx-motion-slower: 900ms;
--rx-motion-slowest: 1200ms;
--rx-delay-none: 0ms;
--rx-delay-xs: 75ms;
--rx-delay-sm: 150ms;
--rx-delay-md: 250ms;
--rx-delay-lg: 400ms;
--rx-delay-xl: 650ms;
--rx-ease-linear: linear;
--rx-ease-standard: cubic-bezier(0.4, 0, 0.2, 1);
--rx-ease-in: cubic-bezier(0.4, 0, 1, 1);
--rx-ease-out: cubic-bezier(0, 0, 0.2, 1);
--rx-ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
--rx-ease-smooth: cubic-bezier(0.25, 0.8, 0.25, 1);
--rx-ease-bounce: cubic-bezier(0.34, 1.56, 0.64, 1);
--rx-ease-elastic: cubic-bezier(0.68, -0.55, 0.27, 1.55);
--rx-anim-distance-xs: 4px;
--rx-anim-distance-sm: 8px;
--rx-anim-distance-md: 16px;
--rx-anim-distance-lg: 24px;
--rx-anim-distance-xl: 40px;
--rx-anim-distance-2xl: 64px;
--rx-anim-scale-xs: 0.98;
--rx-anim-scale-sm: 0.95;
--rx-anim-scale-md: 0.9;
--rx-anim-scale-lg: 0.85;
--rx-anim-blur-sm: 4px;
--rx-anim-blur-md: 8px;
--rx-anim-blur-lg: 16px;
--rx-anim-ring-color: rgba(14, 165, 233, 0.35);
--rx-anim-pulse-color: rgba(14, 165, 233, 0.25);
}
/* =========================================================
02. Global Motion Safety
========================================================= */
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.001ms !important;
animation-delay: 0ms !important;
animation-iteration-count: 1 !important;
scroll-behavior: auto !important;
transition-duration: 0.001ms !important;
transition-delay: 0ms !important;
}
}
/* =========================================================
03. Animation Base Helpers
========================================================= */
.rx-animate {
animation-duration: var(--rx-motion-medium);
animation-timing-function: var(--rx-ease-standard);
animation-fill-mode: both;
will-change: transform, opacity;
}
.rx-animate-fast {
animation-duration: var(--rx-motion-fast);
}
.rx-animate-normal {
animation-duration: var(--rx-motion-normal);
}
.rx-animate-medium {
animation-duration: var(--rx-motion-medium);
}
.rx-animate-slow {
animation-duration: var(--rx-motion-slow);
}
.rx-animate-slower {
animation-duration: var(--rx-motion-slower);
}
.rx-animate-once {
animation-iteration-count: 1;
}
.rx-animate-infinite {
animation-iteration-count: infinite;
}
.rx-animate-linear {
animation-timing-function: var(--rx-ease-linear);
}
.rx-animate-ease {
animation-timing-function: var(--rx-ease-standard);
}
.rx-animate-ease-in {
animation-timing-function: var(--rx-ease-in);
}
.rx-animate-ease-out {
animation-timing-function: var(--rx-ease-out);
}
.rx-animate-smooth {
animation-timing-function: var(--rx-ease-smooth);
}
.rx-animate-bounce {
animation-timing-function: var(--rx-ease-bounce);
}
.rx-animate-elastic {
animation-timing-function: var(--rx-ease-elastic);
}
.rx-delay-xs {
animation-delay: var(--rx-delay-xs);
}
.rx-delay-sm {
animation-delay: var(--rx-delay-sm);
}
.rx-delay-md {
animation-delay: var(--rx-delay-md);
}
.rx-delay-lg {
animation-delay: var(--rx-delay-lg);
}
.rx-delay-xl {
animation-delay: var(--rx-delay-xl);
}
/* =========================================================
04. Fade Animations
========================================================= */
@keyframes rxFadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@keyframes rxFadeOut {
from {
opacity: 1;
}
to {
opacity: 0;
}
}
@keyframes rxFadeInUp {
from {
opacity: 0;
transform: translate3d(0, var(--rx-anim-distance-lg), 0);
}
to {
opacity: 1;
transform: translate3d(0, 0, 0);
}
}
@keyframes rxFadeInDown {
from {
opacity: 0;
transform: translate3d(0, calc(var(--rx-anim-distance-lg) * -1), 0);
}
to {
opacity: 1;
transform: translate3d(0, 0, 0);
}
}
@keyframes rxFadeInLeft {
from {
opacity: 0;
transform: translate3d(calc(var(--rx-anim-distance-lg) * -1), 0, 0);
}
to {
opacity: 1;
transform: translate3d(0, 0, 0);
}
}
@keyframes rxFadeInRight {
from {
opacity: 0;
transform: translate3d(var(--rx-anim-distance-lg), 0, 0);
}
to {
opacity: 1;
transform: translate3d(0, 0, 0);
}
}
.rx-fade-in {
animation-name: rxFadeIn;
}
.rx-fade-out {
animation-name: rxFadeOut;
}
.rx-fade-in-up {
animation-name: rxFadeInUp;
}
.rx-fade-in-down {
animation-name: rxFadeInDown;
}
.rx-fade-in-left {
animation-name: rxFadeInLeft;
}
.rx-fade-in-right {
animation-name: rxFadeInRight;
}
/* =========================================================
05. Slide Animations
========================================================= */
@keyframes rxSlideInUp {
from {
transform: translate3d(0, 100%, 0);
visibility: visible;
}
to {
transform: translate3d(0, 0, 0);
}
}
@keyframes rxSlideInDown {
from {
transform: translate3d(0, -100%, 0);
visibility: visible;
}
to {
transform: translate3d(0, 0, 0);
}
}
@keyframes rxSlideInLeft {
from {
transform: translate3d(-100%, 0, 0);
visibility: visible;
}
to {
transform: translate3d(0, 0, 0);
}
}
@keyframes rxSlideInRight {
from {
transform: translate3d(100%, 0, 0);
visibility: visible;
}
to {
transform: translate3d(0, 0, 0);
}
}
@keyframes rxSlideOutUp {
from {
transform: translate3d(0, 0, 0);
}
to {
visibility: hidden;
transform: translate3d(0, -100%, 0);
}
}
@keyframes rxSlideOutDown {
from {
transform: translate3d(0, 0, 0);
}
to {
visibility: hidden;
transform: translate3d(0, 100%, 0);
}
}
.rx-slide-in-up {
animation-name: rxSlideInUp;
}
.rx-slide-in-down {
animation-name: rxSlideInDown;
}
.rx-slide-in-left {
animation-name: rxSlideInLeft;
}
.rx-slide-in-right {
animation-name: rxSlideInRight;
}
.rx-slide-out-up {
animation-name: rxSlideOutUp;
}
.rx-slide-out-down {
animation-name: rxSlideOutDown;
}
/* =========================================================
06. Zoom and Scale Animations
========================================================= */
@keyframes rxZoomIn {
from {
opacity: 0;
transform: scale3d(var(--rx-anim-scale-md), var(--rx-anim-scale-md), 1);
}
to {
opacity: 1;
transform: scale3d(1, 1, 1);
}
}
@keyframes rxZoomOut {
from {
opacity: 1;
transform: scale3d(1, 1, 1);
}
to {
opacity: 0;
transform: scale3d(var(--rx-anim-scale-md), var(--rx-anim-scale-md), 1);
}
}
@keyframes rxPopIn {
0% {
opacity: 0;
transform: scale3d(0.75, 0.75, 1);
}
70% {
opacity: 1;
transform: scale3d(1.05, 1.05, 1);
}
100% {
transform: scale3d(1, 1, 1);
}
}
@keyframes rxPopOut {
0% {
opacity: 1;
transform: scale3d(1, 1, 1);
}
100% {
opacity: 0;
transform: scale3d(0.75, 0.75, 1);
}
}
.rx-zoom-in {
animation-name: rxZoomIn;
}
.rx-zoom-out {
animation-name: rxZoomOut;
}
.rx-pop-in {
animation-name: rxPopIn;
}
.rx-pop-out {
animation-name: rxPopOut;
}
/* =========================================================
07. Rotate, Spin, Flip
========================================================= */
@keyframes rxSpin {
to {
transform: rotate(360deg);
}
}
@keyframes rxSpinReverse {
to {
transform: rotate(-360deg);
}
}
@keyframes rxRotateIn {
from {
opacity: 0;
transform: rotate(-12deg) scale(0.95);
}
to {
opacity: 1;
transform: rotate(0deg) scale(1);
}
}
@keyframes rxFlipX {
from {
transform: perspective(800px) rotateX(0);
}
to {
transform: perspective(800px) rotateX(360deg);
}
}
@keyframes rxFlipY {
from {
transform: perspective(800px) rotateY(0);
}
to {
transform: perspective(800px) rotateY(360deg);
}
}
.rx-spin {
animation-name: rxSpin;
animation-timing-function: linear;
}
.rx-spin-reverse {
animation-name: rxSpinReverse;
animation-timing-function: linear;
}
.rx-rotate-in {
animation-name: rxRotateIn;
}
.rx-flip-x {
animation-name: rxFlipX;
backface-visibility: visible;
}
.rx-flip-y {
animation-name: rxFlipY;
backface-visibility: visible;
}
/* =========================================================
08. Attention Animations
========================================================= */
@keyframes rxPulse {
0%,
100% {
transform: scale3d(1, 1, 1);
}
50% {
transform: scale3d(1.04, 1.04, 1);
}
}
@keyframes rxSoftPulse {
0%,
100% {
box-shadow: 0 0 0 0 var(--rx-anim-pulse-color);
}
50% {
box-shadow: 0 0 0 10px rgba(14, 165, 233, 0);
}
}
@keyframes rxHeartbeat {
0%,
28%,
70%,
100% {
transform: scale(1);
}
14%,
42% {
transform: scale(1.12);
}
}
@keyframes rxBounce {
0%,
20%,
53%,
80%,
100% {
transform: translate3d(0, 0, 0);
}
40%,
43% {
transform: translate3d(0, -18px, 0);
}
70% {
transform: translate3d(0, -9px, 0);
}
90% {
transform: translate3d(0, -3px, 0);
}
}
@keyframes rxShakeX {
0%,
100% {
transform: translate3d(0, 0, 0);
}
15%,
45%,
75% {
transform: translate3d(-8px, 0, 0);
}
30%,
60%,
90% {
transform: translate3d(8px, 0, 0);
}
}
@keyframes rxShakeY {
0%,
100% {
transform: translate3d(0, 0, 0);
}
15%,
45%,
75% {
transform: translate3d(0, -8px, 0);
}
30%,
60%,
90% {
transform: translate3d(0, 8px, 0);
}
}
@keyframes rxWobble {
0%,
100% {
transform: translateX(0);
}
15% {
transform: translateX(-16px) rotate(-5deg);
}
30% {
transform: translateX(12px) rotate(4deg);
}
45% {
transform: translateX(-8px) rotate(-3deg);
}
60% {
transform: translateX(5px) rotate(2deg);
}
75% {
transform: translateX(-3px) rotate(-1deg);
}
}
.rx-pulse {
animation-name: rxPulse;
}
.rx-soft-pulse {
animation-name: rxSoftPulse;
}
.rx-heartbeat {
animation-name: rxHeartbeat;
}
.rx-bounce {
animation-name: rxBounce;
transform-origin: center bottom;
}
.rx-shake-x {
animation-name: rxShakeX;
}
.rx-shake-y {
animation-name: rxShakeY;
}
.rx-wobble {
animation-name: rxWobble;
}
/* =========================================================
09. Medical Theme Specific Animations
========================================================= */
@keyframes rxMedicalPulse {
0% {
box-shadow: 0 0 0 0 rgba(16, 185, 129, 0.38);
}
70% {
box-shadow: 0 0 0 14px rgba(16, 185, 129, 0);
}
100% {
box-shadow: 0 0 0 0 rgba(16, 185, 129, 0);
}
}
@keyframes rxCareGlow {
0%,
100% {
filter: drop-shadow(0 0 0 rgba(14, 165, 233, 0));
}
50% {
filter: drop-shadow(0 0 10px rgba(14, 165, 233, 0.35));
}
}
@keyframes rxEcgLine {
0% {
stroke-dashoffset: 240;
}
100% {
stroke-dashoffset: 0;
}
}
@keyframes rxHealthFloat {
0%,
100% {
transform: translate3d(0, 0, 0);
}
50% {
transform: translate3d(0, -10px, 0);
}
}
.rx-medical-pulse {
animation-name: rxMedicalPulse;
animation-duration: 1600ms;
animation-iteration-count: infinite;
}
.rx-care-glow {
animation-name: rxCareGlow;
animation-duration: 2200ms;
animation-iteration-count: infinite;
}
.rx-ecg-line {
stroke-dasharray: 240;
animation-name: rxEcgLine;
animation-duration: 1800ms;
animation-timing-function: linear;
animation-iteration-count: infinite;
}
.rx-health-float {
animation-name: rxHealthFloat;
animation-duration: 2600ms;
animation-timing-function: var(--rx-ease-in-out);
animation-iteration-count: infinite;
}
/* =========================================================
10. Skeleton, Shimmer, Loading
========================================================= */
@keyframes rxShimmer {
100% {
transform: translateX(100%);
}
}
@keyframes rxLoaderDots {
0%,
80%,
100% {
opacity: 0.35;
transform: scale(0.75);
}
40% {
opacity: 1;
transform: scale(1);
}
}
@keyframes rxProgressBar {
0% {
transform: translateX(-100%);
}
50% {
transform: translateX(-25%);
}
100% {
transform: translateX(100%);
}
}
.rx-skeleton {
position: relative;
overflow: hidden;
color: transparent !important;
background: rgba(148, 163, 184, 0.18);
border-radius: 0.5rem;
}
.rx-skeleton::after {
position: absolute;
inset: 0;
content: "";
transform: translateX(-100%);
background: linear-gradient(
90deg,
transparent,
rgba(255, 255, 255, 0.42),
transparent
);
animation: rxShimmer 1400ms infinite;
}
.rx-loader-dot {
animation-name: rxLoaderDots;
animation-duration: 1200ms;
animation-iteration-count: infinite;
animation-timing-function: ease-in-out;
}
.rx-loader-dot:nth-child(2) {
animation-delay: 150ms;
}
.rx-loader-dot:nth-child(3) {
animation-delay: 300ms;
}
.rx-progress-indeterminate {
position: relative;
overflow: hidden;
}
.rx-progress-indeterminate::before {
position: absolute;
inset-block: 0;
left: 0;
width: 60%;
content: "";
background: currentColor;
animation: rxProgressBar 1400ms var(--rx-ease-in-out) infinite;
}
/* =========================================================
11. Hover Animation Utilities
========================================================= */
.rx-hover-lift {
transition:
transform var(--rx-motion-normal) var(--rx-ease-out),
box-shadow var(--rx-motion-normal) var(--rx-ease-out);
}
.rx-hover-lift:hover {
transform: translateY(-4px);
}
.rx-hover-lift-sm:hover {
transform: translateY(-2px);
}
.rx-hover-lift-lg:hover {
transform: translateY(-8px);
}
.rx-hover-scale {
transition: transform var(--rx-motion-normal) var(--rx-ease-out);
}
.rx-hover-scale:hover {
transform: scale(1.035);
}
.rx-hover-scale-sm:hover {
transform: scale(1.015);
}
.rx-hover-scale-lg:hover {
transform: scale(1.06);
}
.rx-hover-rotate {
transition: transform var(--rx-motion-normal) var(--rx-ease-out);
}
.rx-hover-rotate:hover {
transform: rotate(2deg);
}
.rx-hover-bright {
transition: filter var(--rx-motion-normal) var(--rx-ease-out);
}
.rx-hover-bright:hover {
filter: brightness(1.08);
}
.rx-hover-dim {
transition: opacity var(--rx-motion-normal) var(--rx-ease-out);
}
.rx-hover-dim:hover {
opacity: 0.78;
}
/* =========================================================
12. Button and Link Micro Interactions
========================================================= */
.rx-btn-press {
transition:
transform var(--rx-motion-fast) var(--rx-ease-out),
filter var(--rx-motion-fast) var(--rx-ease-out);
}
.rx-btn-press:active {
transform: translateY(1px) scale(0.985);
filter: brightness(0.96);
}
.rx-link-underline {
position: relative;
text-decoration: none;
}
.rx-link-underline::after {
position: absolute;
right: 0;
bottom: -0.12em;
left: 0;
height: 2px;
content: "";
transform: scaleX(0);
transform-origin: right;
background: currentColor;
transition: transform var(--rx-motion-normal) var(--rx-ease-out);
}
.rx-link-underline:hover::after,
.rx-link-underline:focus-visible::after {
transform: scaleX(1);
transform-origin: left;
}
.rx-icon-nudge {
transition: transform var(--rx-motion-normal) var(--rx-ease-out);
}
.rx-icon-nudge:hover {
transform: translateX(4px);
}
/* =========================================================
13. Focus Ring Animations
========================================================= */
@keyframes rxFocusRing {
0% {
box-shadow: 0 0 0 0 var(--rx-anim-ring-color);
}
100% {
box-shadow: 0 0 0 5px rgba(14, 165, 233, 0);
}
}
.rx-focus-animate:focus-visible {
outline: 2px solid currentColor;
outline-offset: 3px;
animation: rxFocusRing 700ms var(--rx-ease-out);
}
/* =========================================================
14. Dropdown, Modal, Drawer
========================================================= */
@keyframes rxDropdownIn {
from {
opacity: 0;
transform: translateY(-8px) scale(0.98);
}
to {
opacity: 1;
transform: translateY(0) scale(1);
}
}
@keyframes rxModalIn {
from {
opacity: 0;
transform: translateY(20px) scale(0.96);
}
to {
opacity: 1;
transform: translateY(0) scale(1);
}
}
@keyframes rxBackdropIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
.rx-dropdown-in {
animation-name: rxDropdownIn;
animation-duration: var(--rx-motion-normal);
animation-timing-function: var(--rx-ease-out);
animation-fill-mode: both;
transform-origin: top center;
}
.rx-modal-in {
animation-name: rxModalIn;
animation-duration: var(--rx-motion-medium);
animation-timing-function: var(--rx-ease-out);
animation-fill-mode: both;
}
.rx-backdrop-in {
animation-name: rxBackdropIn;
animation-duration: var(--rx-motion-normal);
animation-timing-function: var(--rx-ease-out);
animation-fill-mode: both;
}
/* =========================================================
15. Accordion and Reveal Helpers
========================================================= */
@keyframes rxAccordionDown {
from {
height: 0;
opacity: 0;
}
to {
height: var(--rx-accordion-height, auto);
opacity: 1;
}
}
@keyframes rxAccordionUp {
from {
height: var(--rx-accordion-height, auto);
opacity: 1;
}
to {
height: 0;
opacity: 0;
}
}
.rx-accordion-down {
overflow: hidden;
animation-name: rxAccordionDown;
animation-duration: var(--rx-motion-medium);
animation-timing-function: var(--rx-ease-out);
animation-fill-mode: both;
}
.rx-accordion-up {
overflow: hidden;
animation-name: rxAccordionUp;
animation-duration: var(--rx-motion-medium);
animation-timing-function: var(--rx-ease-in);
animation-fill-mode: both;
}
/* =========================================================
16. Scroll Reveal Utilities
========================================================= */
.rx-reveal {
opacity: 0;
transform: translateY(var(--rx-anim-distance-lg));
transition:
opacity var(--rx-motion-slow) var(--rx-ease-out),
transform var(--rx-motion-slow) var(--rx-ease-out);
will-change: opacity, transform;
}
.rx-reveal.is-visible,
.rx-reveal.rx-visible {
opacity: 1;
transform: translateY(0);
}
.rx-reveal-left {
opacity: 0;
transform: translateX(calc(var(--rx-anim-distance-lg) * -1));
transition:
opacity var(--rx-motion-slow) var(--rx-ease-out),
transform var(--rx-motion-slow) var(--rx-ease-out);
}
.rx-reveal-right {
opacity: 0;
transform: translateX(var(--rx-anim-distance-lg));
transition:
opacity var(--rx-motion-slow) var(--rx-ease-out),
transform var(--rx-motion-slow) var(--rx-ease-out);
}
.rx-reveal-left.is-visible,
.rx-reveal-left.rx-visible,
.rx-reveal-right.is-visible,
.rx-reveal-right.rx-visible {
opacity: 1;
transform: translateX(0);
}
.rx-reveal-scale {
opacity: 0;
transform: scale(0.96);
transition:
opacity var(--rx-motion-slow) var(--rx-ease-out),
transform var(--rx-motion-slow) var(--rx-ease-out);
}
.rx-reveal-scale.is-visible,
.rx-reveal-scale.rx-visible {
opacity: 1;
transform: scale(1);
}
/* =========================================================
17. Stagger Children
========================================================= */
.rx-stagger > * {
animation-fill-mode: both;
}
.rx-stagger > *:nth-child(1) {
animation-delay: 0ms;
}
.rx-stagger > *:nth-child(2) {
animation-delay: 80ms;
}
.rx-stagger > *:nth-child(3) {
animation-delay: 160ms;
}
.rx-stagger > *:nth-child(4) {
animation-delay: 240ms;
}
.rx-stagger > *:nth-child(5) {
animation-delay: 320ms;
}
.rx-stagger > *:nth-child(6) {
animation-delay: 400ms;
}
.rx-stagger > *:nth-child(7) {
animation-delay: 480ms;
}
.rx-stagger > *:nth-child(8) {
animation-delay: 560ms;
}
.rx-stagger > *:nth-child(9) {
animation-delay: 640ms;
}
.rx-stagger > *:nth-child(10) {
animation-delay: 720ms;
}
/* =========================================================
18. Image Effects
========================================================= */
.rx-img-zoom-wrap {
overflow: hidden;
}
.rx-img-zoom-wrap img,
.rx-img-zoom {
transition:
transform var(--rx-motion-slow) var(--rx-ease-out),
filter var(--rx-motion-slow) var(--rx-ease-out);
will-change: transform;
}
.rx-img-zoom-wrap:hover img,
.rx-img-zoom:hover {
transform: scale(1.06);
}
.rx-img-soft-focus {
transition: filter var(--rx-motion-medium) var(--rx-ease-out);
}
.rx-img-soft-focus:hover {
filter: contrast(1.05) saturate(1.05);
}
/* =========================================================
19. Text Animation Utilities
========================================================= */
@keyframes rxTextClipIn {
from {
clip-path: inset(0 100% 0 0);
}
to {
clip-path: inset(0 0 0 0);
}
}
@keyframes rxTextRise {
from {
opacity: 0;
transform: translateY(0.75em);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.rx-text-clip-in {
animation-name: rxTextClipIn;
animation-duration: var(--rx-motion-slow);
animation-timing-function: var(--rx-ease-out);
animation-fill-mode: both;
}
.rx-text-rise {
animation-name: rxTextRise;
animation-duration: var(--rx-motion-medium);
animation-timing-function: var(--rx-ease-out);
animation-fill-mode: both;
}
/* =========================================================
20. Notification and Alert Animations
========================================================= */
@keyframes rxToastIn {
from {
opacity: 0;
transform: translate3d(0, 16px, 0) scale(0.98);
}
to {
opacity: 1;
transform: translate3d(0, 0, 0) scale(1);
}
}
@keyframes rxToastOut {
from {
opacity: 1;
transform: translate3d(0, 0, 0) scale(1);
}
to {
opacity: 0;
transform: translate3d(0, 16px, 0) scale(0.98);
}
}
.rx-toast-in {
animation-name: rxToastIn;
animation-duration: var(--rx-motion-medium);
animation-timing-function: var(--rx-ease-out);
animation-fill-mode: both;
}
.rx-toast-out {
animation-name: rxToastOut;
animation-duration: var(--rx-motion-normal);
animation-timing-function: var(--rx-ease-in);
animation-fill-mode: both;
}
.rx-alert-attention {
animation: rxSoftPulse 1400ms var(--rx-ease-out) 2;
}
/* =========================================================
21. Menu and Navigation Animations
========================================================= */
.rx-menu-item {
transition:
color var(--rx-motion-normal) var(--rx-ease-out),
background-color var(--rx-motion-normal) var(--rx-ease-out),
transform var(--rx-motion-normal) var(--rx-ease-out);
}
.rx-menu-item:hover {
transform: translateX(3px);
}
.rx-nav-fade > * {
opacity: 0;
transform: translateY(8px);
animation: rxFadeInUp var(--rx-motion-medium) var(--rx-ease-out) forwards;
}
.rx-nav-fade > *:nth-child(1) {
animation-delay: 40ms;
}
.rx-nav-fade > *:nth-child(2) {
animation-delay: 80ms;
}
.rx-nav-fade > *:nth-child(3) {
animation-delay: 120ms;
}
.rx-nav-fade > *:nth-child(4) {
animation-delay: 160ms;
}
.rx-nav-fade > *:nth-child(5) {
animation-delay: 200ms;
}
.rx-nav-fade > *:nth-child(6) {
animation-delay: 240ms;
}
/* =========================================================
22. Card and Content Block Animations
========================================================= */
.rx-card-motion {
transition:
transform var(--rx-motion-normal) var(--rx-ease-out),
box-shadow var(--rx-motion-normal) var(--rx-ease-out),
border-color var(--rx-motion-normal) var(--rx-ease-out);
will-change: transform;
}
.rx-card-motion:hover {
transform: translateY(-5px);
}
.rx-card-press {
transition:
transform var(--rx-motion-fast) var(--rx-ease-out),
box-shadow var(--rx-motion-fast) var(--rx-ease-out);
}
.rx-card-press:active {
transform: scale(0.992);
}
/* =========================================================
23. Page Transition Helpers
========================================================= */
@keyframes rxPageEnter {
from {
opacity: 0;
transform: translateY(12px);
filter: blur(3px);
}
to {
opacity: 1;
transform: translateY(0);
filter: blur(0);
}
}
@keyframes rxPageExit {
from {
opacity: 1;
transform: translateY(0);
filter: blur(0);
}
to {
opacity: 0;
transform: translateY(-8px);
filter: blur(3px);
}
}
.rx-page-enter {
animation: rxPageEnter var(--rx-motion-medium) var(--rx-ease-out) both;
}
.rx-page-exit {
animation: rxPageExit var(--rx-motion-normal) var(--rx-ease-in) both;
}
/* =========================================================
24. Floating, Breathing, Background Effects
========================================================= */
@keyframes rxFloat {
0%,
100% {
transform: translateY(0);
}
50% {
transform: translateY(-12px);
}
}
@keyframes rxBreath {
0%,
100% {
transform: scale(1);
opacity: 0.95;
}
50% {
transform: scale(1.025);
opacity: 1;
}
}
@keyframes rxGradientShift {
0% {
background-position: 0% 50%;
}
50% {
background-position: 100% 50%;
}
100% {
background-position: 0% 50%;
}
}
.rx-float {
animation-name: rxFloat;
animation-duration: 3200ms;
animation-timing-function: var(--rx-ease-in-out);
animation-iteration-count: infinite;
}
.rx-breath {
animation-name: rxBreath;
animation-duration: 3200ms;
animation-timing-function: var(--rx-ease-in-out);
animation-iteration-count: infinite;
}
.rx-gradient-shift {
background-size: 200% 200%;
animation-name: rxGradientShift;
animation-duration: 5000ms;
animation-timing-function: ease;
animation-iteration-count: infinite;
}
/* =========================================================
25. Width, Height, Progress, Counter Visuals
========================================================= */
@keyframes rxGrowWidth {
from {
width: 0;
}
to {
width: var(--rx-grow-width, 100%);
}
}
@keyframes rxGrowHeight {
from {
height: 0;
}
to {
height: var(--rx-grow-height, 100%);
}
}
.rx-grow-width {
animation-name: rxGrowWidth;
animation-duration: var(--rx-motion-slow);
animation-timing-function: var(--rx-ease-out);
animation-fill-mode: both;
}
.rx-grow-height {
animation-name: rxGrowHeight;
animation-duration: var(--rx-motion-slow);
animation-timing-function: var(--rx-ease-out);
animation-fill-mode: both;
}
/* =========================================================
26. Blur and Filter Animations
========================================================= */
@keyframes rxBlurIn {
from {
opacity: 0;
filter: blur(var(--rx-anim-blur-md));
}
to {
opacity: 1;
filter: blur(0);
}
}
@keyframes rxBlurOut {
from {
opacity: 1;
filter: blur(0);
}
to {
opacity: 0;
filter: blur(var(--rx-anim-blur-md));
}
}
.rx-blur-in {
animation-name: rxBlurIn;
}
.rx-blur-out {
animation-name: rxBlurOut;
}
/* =========================================================
27. Direction and Transform Origin Helpers
========================================================= */
.rx-origin-center {
transform-origin: center;
}
.rx-origin-top {
transform-origin: top;
}
.rx-origin-bottom {
transform-origin: bottom;
}
.rx-origin-left {
transform-origin: left;
}
.rx-origin-right {
transform-origin: right;
}
.rx-origin-top-left {
transform-origin: top left;
}
.rx-origin-top-right {
transform-origin: top right;
}
.rx-origin-bottom-left {
transform-origin: bottom left;
}
.rx-origin-bottom-right {
transform-origin: bottom right;
}
/* =========================================================
28. Transition Utility Classes
========================================================= */
.rx-transition {
transition:
color var(--rx-motion-normal) var(--rx-ease-out),
background-color var(--rx-motion-normal) var(--rx-ease-out),
border-color var(--rx-motion-normal) var(--rx-ease-out),
box-shadow var(--rx-motion-normal) var(--rx-ease-out),
opacity var(--rx-motion-normal) var(--rx-ease-out),
transform var(--rx-motion-normal) var(--rx-ease-out),
filter var(--rx-motion-normal) var(--rx-ease-out);
}
.rx-transition-fast {
transition-duration: var(--rx-motion-fast);
}
.rx-transition-slow {
transition-duration: var(--rx-motion-slow);
}
.rx-transition-transform {
transition: transform var(--rx-motion-normal) var(--rx-ease-out);
}
.rx-transition-opacity {
transition: opacity var(--rx-motion-normal) var(--rx-ease-out);
}
.rx-transition-colors {
transition:
color var(--rx-motion-normal) var(--rx-ease-out),
background-color var(--rx-motion-normal) var(--rx-ease-out),
border-color var(--rx-motion-normal) var(--rx-ease-out);
}
.rx-transition-shadow {
transition: box-shadow var(--rx-motion-normal) var(--rx-ease-out);
}
/* =========================================================
29. Animation Pause and Play
========================================================= */
.rx-anim-paused {
animation-play-state: paused !important;
}
.rx-anim-running {
animation-play-state: running !important;
}
.rx-hover-pause:hover {
animation-play-state: paused;
}
.rx-hover-play:hover {
animation-play-state: running;
}
/* =========================================================
30. Utility Animation Assignments
========================================================= */
.rx-anim-fade-in {
animation: rxFadeIn var(--rx-motion-medium) var(--rx-ease-out) both;
}
.rx-anim-fade-in-up {
animation: rxFadeInUp var(--rx-motion-medium) var(--rx-ease-out) both;
}
.rx-anim-fade-in-down {
animation: rxFadeInDown var(--rx-motion-medium) var(--rx-ease-out) both;
}
.rx-anim-fade-in-left {
animation: rxFadeInLeft var(--rx-motion-medium) var(--rx-ease-out) both;
}
.rx-anim-fade-in-right {
animation: rxFadeInRight var(--rx-motion-medium) var(--rx-ease-out) both;
}
.rx-anim-zoom-in {
animation: rxZoomIn var(--rx-motion-medium) var(--rx-ease-out) both;
}
.rx-anim-pop-in {
animation: rxPopIn var(--rx-motion-medium) var(--rx-ease-bounce) both;
}
.rx-anim-spin {
animation: rxSpin 900ms linear infinite;
}
.rx-anim-pulse {
animation: rxPulse 1400ms var(--rx-ease-in-out) infinite;
}
.rx-anim-bounce {
animation: rxBounce 1100ms ease infinite;
}
/* =========================================================
31. Data Attribute Animation API
Usage:
<div data-rx-animate="fade-up"></div>
========================================================= */
[data-rx-animate] {
animation-duration: var(--rx-motion-medium);
animation-timing-function: var(--rx-ease-out);
animation-fill-mode: both;
}
[data-rx-animate="fade"] {
animation-name: rxFadeIn;
}
[data-rx-animate="fade-up"] {
animation-name: rxFadeInUp;
}
[data-rx-animate="fade-down"] {
animation-name: rxFadeInDown;
}
[data-rx-animate="fade-left"] {
animation-name: rxFadeInLeft;
}
[data-rx-animate="fade-right"] {
animation-name: rxFadeInRight;
}
[data-rx-animate="zoom"] {
animation-name: rxZoomIn;
}
[data-rx-animate="pop"] {
animation-name: rxPopIn;
animation-timing-function: var(--rx-ease-bounce);
}
[data-rx-animate="blur"] {
animation-name: rxBlurIn;
}
[data-rx-delay="xs"] {
animation-delay: var(--rx-delay-xs);
}
[data-rx-delay="sm"] {
animation-delay: var(--rx-delay-sm);
}
[data-rx-delay="md"] {
animation-delay: var(--rx-delay-md);
}
[data-rx-delay="lg"] {
animation-delay: var(--rx-delay-lg);
}
[data-rx-delay="xl"] {
animation-delay: var(--rx-delay-xl);
}
/* =========================================================
32. Performance Helpers
========================================================= */
.rx-will-change-transform {
will-change: transform;
}
.rx-will-change-opacity {
will-change: opacity;
}
.rx-will-change-auto {
will-change: auto;
}
.rx-backface-hidden {
backface-visibility: hidden;
}
.rx-gpu {
transform: translateZ(0);
}
/* =========================================================
33. Print Safety
========================================================= */
@media print {
*,
*::before,
*::after {
animation: none !important;
transition: none !important;
transform: none !important;
filter: none !important;
}
}
Use it like this:
<div class="rx-animate rx-fade-in-up rx-animate-medium">
Your content
</div>
<a class="rx-link-underline rx-transition" href="#">
Read more
</a>
<div class="rx-card-motion">
Medical article card
</div>
Best file connection in your theme:
wp_enqueue_style(
'rx-animations',
get_template_directory_uri() . '/assets/static/static-css/utilities/animations.css',
array(),
wp_get_theme()->get('Version')
);