Packages

phoenix_kit

1.7.113
1.7.208 1.7.207 1.7.206 1.7.205 1.7.204 1.7.203 1.7.202 1.7.201 1.7.200 1.7.199 1.7.198 1.7.197 1.7.196 1.7.194 1.7.193 1.7.192 1.7.191 1.7.190 1.7.189 1.7.187 1.7.186 1.7.185 1.7.184 1.7.183 1.7.182 1.7.181 1.7.180 1.7.179 1.7.178 1.7.177 1.7.176 1.7.175 1.7.174 1.7.173 1.7.172 1.7.171 1.7.170 1.7.169 1.7.168 1.7.167 1.7.166 1.7.165 1.7.164 1.7.162 1.7.161 1.7.160 1.7.159 1.7.157 1.7.156 1.7.155 1.7.154 1.7.153 1.7.152 1.7.151 1.7.150 1.7.149 1.7.146 1.7.145 1.7.144 1.7.143 1.7.138 1.7.133 1.7.132 1.7.131 1.7.130 1.7.128 1.7.126 1.7.125 1.7.121 1.7.120 1.7.119 1.7.118 1.7.117 1.7.116 1.7.115 1.7.114 1.7.113 1.7.112 1.7.111 1.7.110 1.7.109 1.7.108 1.7.107 1.7.106 1.7.105 1.7.104 1.7.103 1.7.102 1.7.101 1.7.100 1.7.99 1.7.98 1.7.97 1.7.96 1.7.95 1.7.94 1.7.93 1.7.92 1.7.91 1.7.90 1.7.89 1.7.88 1.7.87 1.7.86 1.7.85 1.7.84 1.7.83 1.7.82 1.7.81 1.7.80 1.7.79 1.7.78 1.7.77 1.7.76 1.7.75 1.7.74 1.7.71 1.7.70 1.7.69 1.7.66 1.7.65 1.7.64 1.7.63 1.7.62 1.7.61 1.7.59 1.7.58 1.7.57 1.7.56 1.7.55 1.7.54 1.7.53 1.7.52 1.7.51 1.7.49 1.7.44 1.7.43 1.7.42 1.7.41 1.7.39 1.7.38 1.7.37 1.7.36 1.7.34 1.7.33 1.7.31 1.7.30 1.7.29 1.7.28 1.7.27 1.7.26 1.7.25 1.7.24 1.7.23 1.7.22 1.7.21 1.7.20 1.7.19 1.7.18 1.7.17 1.7.16 1.7.15 1.7.14 1.7.13 1.7.12 1.7.11 1.7.10 1.7.9 1.7.8 1.7.7 1.7.6 1.7.5 1.7.4 1.7.3 1.7.2 1.7.1 1.7.0 1.6.20 1.6.19 1.6.18 1.6.17 1.6.16 1.6.15 1.6.14 1.6.13 1.6.12 1.6.11 1.6.10 1.6.9 1.6.8 1.6.7 1.6.6 1.6.5 1.6.4 1.6.3 1.5.2 1.5.1 1.5.0 1.4.9 1.4.8 1.4.7 1.4.6 1.4.5 1.4.4 1.4.3 1.4.2 1.4.1 1.4.0 1.3.2 1.3.1 1.3.0 1.2.10 1.2.9 1.2.8 1.2.7 1.2.5 1.2.4 1.2.2 1.2.1 1.2.0 1.1.0 1.0.0

A foundation for building Elixir Phoenix apps — SaaS, social networks, ERP systems, marketplaces, and more

Current section

Files

Jump to
phoenix_kit priv static assets dashboard_animations.css
Raw

priv/static/assets/dashboard_animations.css

/**
* PhoenixKit Dashboard Animation System
*
* Custom animations for dashboard tabs, badges, and attention indicators.
* Include this file in your app.css or import it in your Tailwind config.
*/
/* ============================================================================
Shake Animation
Used for error states and urgent attention
============================================================================ */
@keyframes shake {
0%, 100% { transform: translateX(0); }
10%, 30%, 50%, 70%, 90% { transform: translateX(-2px); }
20%, 40%, 60%, 80% { transform: translateX(2px); }
}
.animate-shake {
animation: shake 0.5s ease-in-out;
}
.animate-shake-continuous {
animation: shake 0.5s ease-in-out infinite;
}
/* ============================================================================
Glow Animation
Soft glowing effect for highlighting
============================================================================ */
@keyframes glow {
0%, 100% {
box-shadow: 0 0 5px currentColor;
opacity: 1;
}
50% {
box-shadow: 0 0 20px currentColor, 0 0 30px currentColor;
opacity: 0.8;
}
}
.animate-glow {
animation: glow 2s ease-in-out infinite;
}
/* Icon glow variant */
@keyframes icon-glow {
0%, 100% {
filter: drop-shadow(0 0 2px currentColor);
}
50% {
filter: drop-shadow(0 0 8px currentColor) drop-shadow(0 0 12px currentColor);
}
}
.animate-icon-glow {
animation: icon-glow 2s ease-in-out infinite;
}
/* ============================================================================
Pulse Variants
Enhanced pulse animations for different contexts
============================================================================ */
/* Subtle pulse for badges */
@keyframes pulse-subtle {
0%, 100% {
opacity: 1;
transform: scale(1);
}
50% {
opacity: 0.7;
transform: scale(1.05);
}
}
.animate-pulse-subtle {
animation: pulse-subtle 2s ease-in-out infinite;
}
/* Strong pulse for urgent items */
@keyframes pulse-strong {
0%, 100% {
opacity: 1;
transform: scale(1);
box-shadow: 0 0 0 0 currentColor;
}
50% {
opacity: 0.9;
transform: scale(1.1);
box-shadow: 0 0 0 4px transparent;
}
}
.animate-pulse-strong {
animation: pulse-strong 1s ease-in-out infinite;
}
/* Ring pulse (expands outward) */
@keyframes pulse-ring {
0% {
box-shadow: 0 0 0 0 oklch(var(--p) / 0.7);
}
70% {
box-shadow: 0 0 0 10px oklch(var(--p) / 0);
}
100% {
box-shadow: 0 0 0 0 oklch(var(--p) / 0);
}
}
.animate-pulse-ring {
animation: pulse-ring 1.5s ease-out infinite;
}
/* ============================================================================
Bounce Variants
============================================================================ */
/* Gentle bounce */
@keyframes bounce-gentle {
0%, 100% {
transform: translateY(0);
animation-timing-function: cubic-bezier(0.8, 0, 1, 1);
}
50% {
transform: translateY(-15%);
animation-timing-function: cubic-bezier(0, 0, 0.2, 1);
}
}
.animate-bounce-gentle {
animation: bounce-gentle 1s infinite;
}
/* Single bounce (for new items) */
@keyframes bounce-once {
0% { transform: translateY(0); }
20% { transform: translateY(-10px); }
40% { transform: translateY(0); }
60% { transform: translateY(-5px); }
80% { transform: translateY(0); }
100% { transform: translateY(0); }
}
.animate-bounce-once {
animation: bounce-once 0.6s ease-out;
}
/* ============================================================================
Badge Specific Animations
============================================================================ */
/* Badge pop-in animation */
@keyframes badge-pop {
0% {
transform: scale(0);
opacity: 0;
}
50% {
transform: scale(1.2);
}
100% {
transform: scale(1);
opacity: 1;
}
}
.animate-badge-pop {
animation: badge-pop 0.3s ease-out;
}
/* Badge value change animation */
@keyframes badge-change {
0% {
transform: scale(1);
}
25% {
transform: scale(1.2);
}
50% {
transform: scale(0.9);
}
100% {
transform: scale(1);
}
}
.animate-badge-change {
animation: badge-change 0.3s ease-out;
}
/* Badge attention animation */
@keyframes badge-attention {
0%, 100% {
transform: scale(1);
box-shadow: 0 0 0 0 currentColor;
}
50% {
transform: scale(1.1);
box-shadow: 0 0 8px currentColor;
}
}
.animate-badge-attention {
animation: badge-attention 1s ease-in-out infinite;
}
/* ============================================================================
Dot Indicator Animations
============================================================================ */
/* Online/active dot pulse */
@keyframes dot-pulse {
0%, 100% {
opacity: 1;
}
50% {
opacity: 0.5;
}
}
.animate-dot-pulse {
animation: dot-pulse 2s ease-in-out infinite;
}
/* Dot ripple effect */
@keyframes dot-ripple {
0% {
box-shadow: 0 0 0 0 currentColor;
opacity: 0.7;
}
100% {
box-shadow: 0 0 0 8px transparent;
opacity: 0;
}
}
.animate-dot-ripple::after {
content: '';
position: absolute;
inset: 0;
border-radius: inherit;
animation: dot-ripple 1.5s ease-out infinite;
}
/* ============================================================================
Tab Transition Animations
============================================================================ */
/* Tab active state transition */
.tab-transition {
transition: all 0.2s ease-in-out;
}
/* Tab hover scale */
.tab-hover-scale {
transition: transform 0.15s ease-out;
}
.tab-hover-scale:hover {
transform: translateX(2px);
}
/* Tab active indicator slide */
@keyframes tab-indicator-slide {
from {
transform: scaleX(0);
opacity: 0;
}
to {
transform: scaleX(1);
opacity: 1;
}
}
.animate-tab-indicator {
animation: tab-indicator-slide 0.2s ease-out;
transform-origin: left;
}
/* ============================================================================
Presence Indicator Animations
============================================================================ */
/* Presence dot breathing */
@keyframes presence-breathe {
0%, 100% {
opacity: 1;
transform: scale(1);
}
50% {
opacity: 0.6;
transform: scale(0.9);
}
}
.animate-presence-breathe {
animation: presence-breathe 3s ease-in-out infinite;
}
/* User join animation */
@keyframes user-join {
0% {
transform: scale(0) translateY(10px);
opacity: 0;
}
60% {
transform: scale(1.1) translateY(-2px);
}
100% {
transform: scale(1) translateY(0);
opacity: 1;
}
}
.animate-user-join {
animation: user-join 0.4s ease-out;
}
/* ============================================================================
Group Collapse Animation
============================================================================ */
@keyframes collapse {
from {
max-height: 500px;
opacity: 1;
}
to {
max-height: 0;
opacity: 0;
}
}
@keyframes expand {
from {
max-height: 0;
opacity: 0;
}
to {
max-height: 500px;
opacity: 1;
}
}
.animate-collapse {
animation: collapse 0.3s ease-out forwards;
overflow: hidden;
}
.animate-expand {
animation: expand 0.3s ease-out forwards;
overflow: hidden;
}
/* ============================================================================
Fade In/Out Animations
Used for progress bars and dynamic content
============================================================================ */
@keyframes fade-in {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@keyframes fade-in-down {
from {
opacity: 0;
transform: translateY(-8px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes fade-out {
from {
opacity: 1;
}
to {
opacity: 0;
}
}
.animate-fade-in {
animation: fade-in 0.3s ease-out;
}
.animate-fade-in-down {
animation: fade-in-down 0.3s ease-out;
}
.animate-fade-out {
animation: fade-out 0.2s ease-in forwards;
}
/* ============================================================================
Utility Classes
============================================================================ */
/* Disable animations for users who prefer reduced motion */
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}
/* Animation delay utilities */
.animation-delay-100 { animation-delay: 100ms; }
.animation-delay-200 { animation-delay: 200ms; }
.animation-delay-300 { animation-delay: 300ms; }
.animation-delay-500 { animation-delay: 500ms; }
.animation-delay-1000 { animation-delay: 1000ms; }
/* Animation duration utilities */
.animation-duration-fast { animation-duration: 0.15s; }
.animation-duration-normal { animation-duration: 0.3s; }
.animation-duration-slow { animation-duration: 0.5s; }
.animation-duration-slower { animation-duration: 1s; }