Modern CSS Gradient Effects
Animated, mesh, conic and text gradients built from the theme colours.
1Animated Rainbow
A full-spectrum gradient that flows endlessly across banners, buttons and progress bars. Class: fx-animated-rainbow
The neighbourhood kitchen everyone loves
Every colour, always moving.
<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-animated-rainbow rounded-4 p-4 text-center w-100" style="max-width:18rem;text-shadow:0 1px 3px rgba(0,0,0,.3)">
<h3 class="h5 fw-bold mb-1">The neighbourhood kitchen everyone loves</h3>
<p class="small mb-0">Every colour, always moving.</p>
</div>
<button type="button" class="btn rounded-pill border-0 fx-animated-rainbow">Celebrate</button>
</div>
/* CSS (already in assets/css/effects.css) */
.fx-animated-rainbow {
color: #fff;
background: linear-gradient(90deg, #ff3d7f, #ff9f1c, #ffd23f, #3bce73, #2ec4ff, #7b5cff, #ff3d7f);
background-size: 300% 100%;
animation: fx-animated-rainbow-flow 8s linear infinite;
}
@keyframes fx-animated-rainbow-flow { to { background-position: -150% 0; } }
@media (prefers-reduced-motion: reduce) {
.fx-animated-rainbow, .fx-animated-rainbow::before, .fx-animated-rainbow::after, .fx-animated-rainbow *, .fx-animated-rainbow *::before, .fx-animated-rainbow *::after { animation: none !important; transition: none !important; }
}2Conic Rotation
A spinning conic gradient behind round content such as avatars, scores or loaders. Class: fx-conic-rotation
90
<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">
90
</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; }
}3Text Mask
Large text that works as a window onto a moving gradient - or onto an image set with an inline background-image. Class: fx-text-mask
WILD
Wander
<div class="d-flex flex-wrap align-items-center justify-content-center gap-3 p-3 h-100" style="min-height:200px">
<div class="text-center">
<div class="display-3 fw-bold lh-1 fx-text-mask">
WILD
</div>
<div class="display-5 fw-bold lh-1 fx-text-mask" style="--fx-mask-img:initial;background-image:url(https://images.unsplash.com/photo-1570560258879-af7f8e1447ac?auto=format&fit=crop&w=1200&h=800&q=70)">
Wander
</div>
</div>
</div>
/* CSS (already in assets/css/effects.css) */
.fx-text-mask {
color: var(--wt-primary-ink);
background-image: var(--fx-mask-img, linear-gradient(135deg, var(--wt-primary) 0%, var(--wt-accent) 30%, var(--wt-secondary) 60%, var(--wt-primary) 100%));
background-size: cover; background-position: 0% 50%;
-webkit-background-clip: text; background-clip: text;
-webkit-text-fill-color: transparent;
animation: fx-text-mask-pan 10s ease-in-out infinite alternate;
}
.fx-text-mask:not([style*="--fx-mask-img"]) { background-size: 300% 300%; }
@keyframes fx-text-mask-pan { to { background-position: 100% 50%; } }
@media (prefers-reduced-motion: reduce) {
.fx-text-mask, .fx-text-mask::before, .fx-text-mask::after, .fx-text-mask *, .fx-text-mask *::before, .fx-text-mask *::after { animation: none !important; transition: none !important; }
}