Animated, mesh, conic and text gradients built from the theme colours.
1Conic Rotation
A spinning conic gradient behind round content such as avatars, scores or loaders. Class: fx-conic-rotation
85
<div class="d-flex flex-wrap align-items-center justify-content-center gap-3 p-3 h-100" style="min-height:200px">
<div class="fx-conic-rotation">
<img src="../assets/img/avatar-8.svg" alt="Profile with a spinning ring" class="object-fit-cover" style="width:96px;height:96px">
</div>
<div class="fx-conic-rotation">
<div class="bg-body d-grid fw-bold fs-4" style="width:96px;height:96px;place-items:center">
85
</div>
</div>
</div>
/* CSS (already in assets/css/effects.css) */
.fx-conic-rotation { position: relative; isolation: isolate; overflow: hidden; border-radius: 50%; padding: 5px; }
.fx-conic-rotation::before {
content: ""; position: absolute; inset: -30%; z-index: -1;
background: conic-gradient(var(--wt-primary), var(--wt-accent), var(--wt-secondary), var(--wt-primary));
animation: fx-conic-rotation-spin 3s linear infinite;
}
.fx-conic-rotation > * { display: block; border-radius: 50%; }
@keyframes fx-conic-rotation-spin { to { transform: rotate(360deg); } }
@media (prefers-reduced-motion: reduce) {
.fx-conic-rotation, .fx-conic-rotation::before, .fx-conic-rotation::after, .fx-conic-rotation *, .fx-conic-rotation *::before, .fx-conic-rotation *::after { animation: none !important; transition: none !important; }
}2Color Morphing
Smoothly cycles a background and its glow through the theme colours - nice for badges and CTAs. Class: fx-color-morphing
<div class="d-flex flex-wrap align-items-center justify-content-center gap-3 p-3 h-100" style="min-height:200px">
<button type="button" class="btn btn-lg border-0 rounded-pill fx-color-morphing">Join the beta</button>
<div class="fx-color-morphing rounded-circle d-grid fs-3" style="width:72px;height:72px;place-items:center">
<i class="bi bi-lightning-charge-fill" aria-hidden="true"></i>
</div>
</div>
/* CSS (already in assets/css/effects.css) */
.fx-color-morphing { color: var(--wt-on-primary, #fff); background-color: var(--wt-primary); animation: fx-color-morphing-morph 6s ease-in-out infinite; }
@keyframes fx-color-morphing-morph {
0%, 100% { background-color: var(--wt-primary); box-shadow: 0 10px 24px -10px rgba(var(--wt-primary-rgb), .8); }
33% { background-color: var(--wt-accent); box-shadow: 0 10px 24px -10px rgba(var(--wt-accent-rgb), .8); }
66% { background-color: var(--wt-secondary); box-shadow: 0 10px 24px -10px rgba(var(--wt-secondary-rgb), .8); }
}
@media (prefers-reduced-motion: reduce) {
.fx-color-morphing, .fx-color-morphing::before, .fx-color-morphing::after, .fx-color-morphing *, .fx-color-morphing *::before, .fx-color-morphing *::after { animation: none !important; transition: none !important; }
}