05 / 20
All 20 in 20 Tailwind CSS Text Gradient
- 01Tailwind CSS Gradient Text Hero Heading
- 02Tailwind Glowing Gradient Text (Web3 Neon Glow)
- 03Tailwind Gradient Text Logo for Navbar
- 04Bold Minimalist Gradient Heading in Tailwind CSS
- 05Tailwind Gradient Text on Hover Animation
- 06Tailwind Gradient Text Button & Gradient Border Button
- 07Tailwind Active Nav Link with Gradient Text
- 08Tailwind Animated Gradient Text (Moving Gradient)
- 09Cyberpunk Neon Gradient Text in Tailwind CSS
- 10Tailwind Metallic Gold Gradient Text Effect
- 11Glassmorphism Card with Gradient Text in Tailwind
- 12Pastel Gradient Text in Tailwind CSS
- 13Tailwind Vertical Gradient Text (Top to Bottom)
- 14Tailwind Radial Gradient Text Effect
- 15Tailwind Rainbow Gradient Text (Multi-Color)
- 16Tailwind Gradient Text with Outline Stroke
- 17Tailwind Gradient Text Fallback with @supports
- 18Tailwind bg-clip-text Gradient Utility Classes Cheat Sheet
- 19Tailwind Gradient Text on Multiline Paragraph
- 20Tailwind Dark Mode Gradient Text Toggle
Tailwind Gradient Text on Hover Animation
Hover any link or card and the gradient wipes across the letters from left to right. It's two background layers clipped to the text — a solid ink layer underneath and a gradient layer whose width animates from 0% to 100%. Unlike the original's instant swap, this is a real, interruptible transition.
Untitled UI Pro: 5,000+ React + Tailwind CSS v4 components · from $349 one-time
Untitled UI React · Affiliate link
The code
<section class="ttg-05 w-full min-h-svh grid place-items-center bg-ttg05-bg px-5 py-14 font-ttg05-sans text-ttg05-ink" aria-label="Gradient text on hover demo">
<div class="w-full max-w-2xl rounded-3xl border border-white/8 bg-ttg05-card p-8 shadow-[0_30px_60px_-30px_rgb(0_0_0/0.7)] max-sm:p-6">
<p class="font-ttg05-mono text-[11px] tracking-[0.16em] text-ttg05-mut uppercase">Hover or tab through the links</p>
<nav class="mt-4 flex flex-wrap gap-1" aria-label="Demo">
<a href="#" class="inline-flex min-h-11 items-center rounded-lg bg-[linear-gradient(90deg,var(--color-ttg05-a),var(--color-ttg05-b)),linear-gradient(var(--color-ttg05-solid),var(--color-ttg05-solid))] bg-[length:0%_100%,100%_100%] bg-no-repeat bg-clip-text px-3.5 text-base font-semibold text-transparent transition-[background-size] duration-500 ease-out hover:bg-[length:100%_100%,100%_100%] focus-visible:bg-[length:100%_100%,100%_100%] focus-visible:outline-2 focus-visible:outline-ttg05-a motion-reduce:transition-none">Home</a>
<a href="#" class="inline-flex min-h-11 items-center rounded-lg bg-[linear-gradient(90deg,var(--color-ttg05-a),var(--color-ttg05-b)),linear-gradient(var(--color-ttg05-solid),var(--color-ttg05-solid))] bg-[length:0%_100%,100%_100%] bg-no-repeat bg-clip-text px-3.5 text-base font-semibold text-transparent transition-[background-size] duration-500 ease-out hover:bg-[length:100%_100%,100%_100%] focus-visible:bg-[length:100%_100%,100%_100%] focus-visible:outline-2 focus-visible:outline-ttg05-a motion-reduce:transition-none">Features</a>
<a href="#" class="inline-flex min-h-11 items-center rounded-lg bg-[linear-gradient(90deg,var(--color-ttg05-a),var(--color-ttg05-b)),linear-gradient(var(--color-ttg05-solid),var(--color-ttg05-solid))] bg-[length:0%_100%,100%_100%] bg-no-repeat bg-clip-text px-3.5 text-base font-semibold text-transparent transition-[background-size] duration-500 ease-out hover:bg-[length:100%_100%,100%_100%] focus-visible:bg-[length:100%_100%,100%_100%] focus-visible:outline-2 focus-visible:outline-ttg05-a motion-reduce:transition-none">Pricing</a>
<a href="#" class="inline-flex min-h-11 items-center rounded-lg bg-[linear-gradient(90deg,var(--color-ttg05-a),var(--color-ttg05-b)),linear-gradient(var(--color-ttg05-solid),var(--color-ttg05-solid))] bg-[length:0%_100%,100%_100%] bg-no-repeat bg-clip-text px-3.5 text-base font-semibold text-transparent transition-[background-size] duration-500 ease-out hover:bg-[length:100%_100%,100%_100%] focus-visible:bg-[length:100%_100%,100%_100%] focus-visible:outline-2 focus-visible:outline-ttg05-a motion-reduce:transition-none">Changelog</a>
<a href="#" class="inline-flex min-h-11 items-center rounded-lg bg-[linear-gradient(90deg,var(--color-ttg05-a),var(--color-ttg05-b)),linear-gradient(var(--color-ttg05-solid),var(--color-ttg05-solid))] bg-[length:0%_100%,100%_100%] bg-no-repeat bg-clip-text px-3.5 text-base font-semibold text-transparent transition-[background-size] duration-500 ease-out hover:bg-[length:100%_100%,100%_100%] focus-visible:bg-[length:100%_100%,100%_100%] focus-visible:outline-2 focus-visible:outline-ttg05-a motion-reduce:transition-none">Contact</a>
</nav>
<div class="my-7 h-px bg-white/8"></div>
<div class="grid gap-3.5 sm:grid-cols-3">
<a href="#" class="group rounded-2xl border border-white/8 bg-white/[0.025] p-5 transition hover:-translate-y-0.5 hover:border-ttg05-a/40 hover:bg-white/[0.045] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ttg05-a motion-reduce:transition-none">
<h3 class="flex items-center justify-between text-[15.5px] font-bold"><span class="bg-[linear-gradient(90deg,var(--color-ttg05-a),var(--color-ttg05-b)),linear-gradient(var(--color-ttg05-ink),var(--color-ttg05-ink))] bg-[length:0%_100%,100%_100%] bg-no-repeat bg-clip-text text-transparent transition-[background-size] duration-500 group-hover:bg-[length:100%_100%,100%_100%] group-focus-visible:bg-[length:100%_100%,100%_100%] motion-reduce:transition-none">Analytics</span><span aria-hidden="true" class="text-ttg05-mut transition group-hover:translate-x-0.5 group-hover:text-ttg05-b">→</span></h3>
<p class="mt-2 text-[13.5px]/[1.6] text-ttg05-mut">Real-time dashboards for every metric your team cares about.</p>
</a>
<a href="#" class="group rounded-2xl border border-white/8 bg-white/[0.025] p-5 transition hover:-translate-y-0.5 hover:border-ttg05-a/40 hover:bg-white/[0.045] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ttg05-a motion-reduce:transition-none">
<h3 class="flex items-center justify-between text-[15.5px] font-bold"><span class="bg-[linear-gradient(90deg,var(--color-ttg05-a),var(--color-ttg05-b)),linear-gradient(var(--color-ttg05-ink),var(--color-ttg05-ink))] bg-[length:0%_100%,100%_100%] bg-no-repeat bg-clip-text text-transparent transition-[background-size] duration-500 group-hover:bg-[length:100%_100%,100%_100%] group-focus-visible:bg-[length:100%_100%,100%_100%] motion-reduce:transition-none">Integrations</span><span aria-hidden="true" class="text-ttg05-mut transition group-hover:translate-x-0.5 group-hover:text-ttg05-b">→</span></h3>
<p class="mt-2 text-[13.5px]/[1.6] text-ttg05-mut">Connect to 200+ tools with one-click OAuth flows.</p>
</a>
<a href="#" class="group rounded-2xl border border-white/8 bg-white/[0.025] p-5 transition hover:-translate-y-0.5 hover:border-ttg05-a/40 hover:bg-white/[0.045] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ttg05-a motion-reduce:transition-none">
<h3 class="flex items-center justify-between text-[15.5px] font-bold"><span class="bg-[linear-gradient(90deg,var(--color-ttg05-a),var(--color-ttg05-b)),linear-gradient(var(--color-ttg05-ink),var(--color-ttg05-ink))] bg-[length:0%_100%,100%_100%] bg-no-repeat bg-clip-text text-transparent transition-[background-size] duration-500 group-hover:bg-[length:100%_100%,100%_100%] group-focus-visible:bg-[length:100%_100%,100%_100%] motion-reduce:transition-none">Collaboration</span><span aria-hidden="true" class="text-ttg05-mut transition group-hover:translate-x-0.5 group-hover:text-ttg05-b">→</span></h3>
<p class="mt-2 text-[13.5px]/[1.6] text-ttg05-mut">Shared workspaces with granular permission controls.</p>
</a>
</div>
</div>
</section><section class="ttg-05 w-full min-h-svh grid place-items-center bg-ttg05-bg px-5 py-14 font-ttg05-sans text-ttg05-ink" aria-label="Gradient text on hover demo">
<div class="w-full max-w-2xl rounded-3xl border border-white/8 bg-ttg05-card p-8 shadow-[0_30px_60px_-30px_rgb(0_0_0/0.7)] max-sm:p-6">
<p class="font-ttg05-mono text-[11px] tracking-[0.16em] text-ttg05-mut uppercase">Hover or tab through the links</p>
<nav class="mt-4 flex flex-wrap gap-1" aria-label="Demo">
<a href="#" class="inline-flex min-h-11 items-center rounded-lg bg-[linear-gradient(90deg,var(--color-ttg05-a),var(--color-ttg05-b)),linear-gradient(var(--color-ttg05-solid),var(--color-ttg05-solid))] bg-[length:0%_100%,100%_100%] bg-no-repeat bg-clip-text px-3.5 text-base font-semibold text-transparent transition-[background-size] duration-500 ease-out hover:bg-[length:100%_100%,100%_100%] focus-visible:bg-[length:100%_100%,100%_100%] focus-visible:outline-2 focus-visible:outline-ttg05-a motion-reduce:transition-none">Home</a>
<a href="#" class="inline-flex min-h-11 items-center rounded-lg bg-[linear-gradient(90deg,var(--color-ttg05-a),var(--color-ttg05-b)),linear-gradient(var(--color-ttg05-solid),var(--color-ttg05-solid))] bg-[length:0%_100%,100%_100%] bg-no-repeat bg-clip-text px-3.5 text-base font-semibold text-transparent transition-[background-size] duration-500 ease-out hover:bg-[length:100%_100%,100%_100%] focus-visible:bg-[length:100%_100%,100%_100%] focus-visible:outline-2 focus-visible:outline-ttg05-a motion-reduce:transition-none">Features</a>
<a href="#" class="inline-flex min-h-11 items-center rounded-lg bg-[linear-gradient(90deg,var(--color-ttg05-a),var(--color-ttg05-b)),linear-gradient(var(--color-ttg05-solid),var(--color-ttg05-solid))] bg-[length:0%_100%,100%_100%] bg-no-repeat bg-clip-text px-3.5 text-base font-semibold text-transparent transition-[background-size] duration-500 ease-out hover:bg-[length:100%_100%,100%_100%] focus-visible:bg-[length:100%_100%,100%_100%] focus-visible:outline-2 focus-visible:outline-ttg05-a motion-reduce:transition-none">Pricing</a>
<a href="#" class="inline-flex min-h-11 items-center rounded-lg bg-[linear-gradient(90deg,var(--color-ttg05-a),var(--color-ttg05-b)),linear-gradient(var(--color-ttg05-solid),var(--color-ttg05-solid))] bg-[length:0%_100%,100%_100%] bg-no-repeat bg-clip-text px-3.5 text-base font-semibold text-transparent transition-[background-size] duration-500 ease-out hover:bg-[length:100%_100%,100%_100%] focus-visible:bg-[length:100%_100%,100%_100%] focus-visible:outline-2 focus-visible:outline-ttg05-a motion-reduce:transition-none">Changelog</a>
<a href="#" class="inline-flex min-h-11 items-center rounded-lg bg-[linear-gradient(90deg,var(--color-ttg05-a),var(--color-ttg05-b)),linear-gradient(var(--color-ttg05-solid),var(--color-ttg05-solid))] bg-[length:0%_100%,100%_100%] bg-no-repeat bg-clip-text px-3.5 text-base font-semibold text-transparent transition-[background-size] duration-500 ease-out hover:bg-[length:100%_100%,100%_100%] focus-visible:bg-[length:100%_100%,100%_100%] focus-visible:outline-2 focus-visible:outline-ttg05-a motion-reduce:transition-none">Contact</a>
</nav>
<div class="my-7 h-px bg-white/8"></div>
<div class="grid gap-3.5 sm:grid-cols-3">
<a href="#" class="group rounded-2xl border border-white/8 bg-white/[0.025] p-5 transition hover:-translate-y-0.5 hover:border-ttg05-a/40 hover:bg-white/[0.045] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ttg05-a motion-reduce:transition-none">
<h3 class="flex items-center justify-between text-[15.5px] font-bold"><span class="bg-[linear-gradient(90deg,var(--color-ttg05-a),var(--color-ttg05-b)),linear-gradient(var(--color-ttg05-ink),var(--color-ttg05-ink))] bg-[length:0%_100%,100%_100%] bg-no-repeat bg-clip-text text-transparent transition-[background-size] duration-500 group-hover:bg-[length:100%_100%,100%_100%] group-focus-visible:bg-[length:100%_100%,100%_100%] motion-reduce:transition-none">Analytics</span><span aria-hidden="true" class="text-ttg05-mut transition group-hover:translate-x-0.5 group-hover:text-ttg05-b">→</span></h3>
<p class="mt-2 text-[13.5px]/[1.6] text-ttg05-mut">Real-time dashboards for every metric your team cares about.</p>
</a>
<a href="#" class="group rounded-2xl border border-white/8 bg-white/[0.025] p-5 transition hover:-translate-y-0.5 hover:border-ttg05-a/40 hover:bg-white/[0.045] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ttg05-a motion-reduce:transition-none">
<h3 class="flex items-center justify-between text-[15.5px] font-bold"><span class="bg-[linear-gradient(90deg,var(--color-ttg05-a),var(--color-ttg05-b)),linear-gradient(var(--color-ttg05-ink),var(--color-ttg05-ink))] bg-[length:0%_100%,100%_100%] bg-no-repeat bg-clip-text text-transparent transition-[background-size] duration-500 group-hover:bg-[length:100%_100%,100%_100%] group-focus-visible:bg-[length:100%_100%,100%_100%] motion-reduce:transition-none">Integrations</span><span aria-hidden="true" class="text-ttg05-mut transition group-hover:translate-x-0.5 group-hover:text-ttg05-b">→</span></h3>
<p class="mt-2 text-[13.5px]/[1.6] text-ttg05-mut">Connect to 200+ tools with one-click OAuth flows.</p>
</a>
<a href="#" class="group rounded-2xl border border-white/8 bg-white/[0.025] p-5 transition hover:-translate-y-0.5 hover:border-ttg05-a/40 hover:bg-white/[0.045] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ttg05-a motion-reduce:transition-none">
<h3 class="flex items-center justify-between text-[15.5px] font-bold"><span class="bg-[linear-gradient(90deg,var(--color-ttg05-a),var(--color-ttg05-b)),linear-gradient(var(--color-ttg05-ink),var(--color-ttg05-ink))] bg-[length:0%_100%,100%_100%] bg-no-repeat bg-clip-text text-transparent transition-[background-size] duration-500 group-hover:bg-[length:100%_100%,100%_100%] group-focus-visible:bg-[length:100%_100%,100%_100%] motion-reduce:transition-none">Collaboration</span><span aria-hidden="true" class="text-ttg05-mut transition group-hover:translate-x-0.5 group-hover:text-ttg05-b">→</span></h3>
<p class="mt-2 text-[13.5px]/[1.6] text-ttg05-mut">Shared workspaces with granular permission controls.</p>
</a>
</div>
</div>
</section>@import "tailwindcss";
@theme {
--color-ttg05-bg: #0c0c11;
--color-ttg05-bg: oklch(0.16 0.008 285);
--color-ttg05-card: #16161e;
--color-ttg05-card: oklch(0.2 0.012 285);
--color-ttg05-ink: #eceef3;
--color-ttg05-ink: oklch(0.95 0.006 270);
--color-ttg05-solid: #b3b9c6;
--color-ttg05-solid: oklch(0.79 0.018 265);
--color-ttg05-mut: #9ba1af;
--color-ttg05-mut: oklch(0.72 0.018 270);
--color-ttg05-a: #9b5cf6;
--color-ttg05-a: oklch(0.64 0.22 295);
--color-ttg05-b: #f2509a;
--color-ttg05-b: oklch(0.68 0.21 355);
--font-ttg05-sans: 'Geist', system-ui, sans-serif;
--font-ttg05-mono: 'Geist Mono', ui-monospace, monospace;
}
.ttg-05 {
width: 100%;
min-height: 100svh;
}@import "tailwindcss";
@theme {
--color-ttg05-bg: #0c0c11;
--color-ttg05-bg: oklch(0.16 0.008 285);
--color-ttg05-card: #16161e;
--color-ttg05-card: oklch(0.2 0.012 285);
--color-ttg05-ink: #eceef3;
--color-ttg05-ink: oklch(0.95 0.006 270);
--color-ttg05-solid: #b3b9c6;
--color-ttg05-solid: oklch(0.79 0.018 265);
--color-ttg05-mut: #9ba1af;
--color-ttg05-mut: oklch(0.72 0.018 270);
--color-ttg05-a: #9b5cf6;
--color-ttg05-a: oklch(0.64 0.22 295);
--color-ttg05-b: #f2509a;
--color-ttg05-b: oklch(0.68 0.21 355);
--font-ttg05-sans: 'Geist', system-ui, sans-serif;
--font-ttg05-mono: 'Geist Mono', ui-monospace, monospace;
}
.ttg-05 {
width: 100%;
min-height: 100svh;
}Setup — do this once per project
Skip this if your project already runs Tailwind v4.
<script src="https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"></script>
<script src="https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"></script>Compiles in the browser — perfect for a CodePen or a quick test, not for production.
npm install tailwindcss @tailwindcss/vite
npm install tailwindcss @tailwindcss/vite// vite.config.js ("type": "module" in package.json)
import { defineConfig } from 'vite'
import tailwindcss from '@tailwindcss/vite'
export default defineConfig({
plugins: [tailwindcss()],
})// vite.config.js ("type": "module" in package.json)
import { defineConfig } from 'vite'
import tailwindcss from '@tailwindcss/vite'
export default defineConfig({
plugins: [tailwindcss()],
})Any v4 setup works — Vite, PostCSS or the CLI. Nothing in this demo is bundler-specific.
@import "tailwindcss";
@theme {
--color-ttg05-bg: #0c0c11;
--color-ttg05-bg: oklch(0.16 0.008 285);
--color-ttg05-card: #16161e;
--color-ttg05-card: oklch(0.2 0.012 285);
--color-ttg05-ink: #eceef3;
--color-ttg05-ink: oklch(0.95 0.006 270);
--color-ttg05-solid: #b3b9c6;
--color-ttg05-solid: oklch(0.79 0.018 265);
--color-ttg05-mut: #9ba1af;
--color-ttg05-mut: oklch(0.72 0.018 270);
--color-ttg05-a: #9b5cf6;
--color-ttg05-a: oklch(0.64 0.22 295);
--color-ttg05-b: #f2509a;
--color-ttg05-b: oklch(0.68 0.21 355);
--font-ttg05-sans: 'Geist', system-ui, sans-serif;
--font-ttg05-mono: 'Geist Mono', ui-monospace, monospace;
}
.ttg-05 {
width: 100%;
min-height: 100svh;
}@import "tailwindcss";
@theme {
--color-ttg05-bg: #0c0c11;
--color-ttg05-bg: oklch(0.16 0.008 285);
--color-ttg05-card: #16161e;
--color-ttg05-card: oklch(0.2 0.012 285);
--color-ttg05-ink: #eceef3;
--color-ttg05-ink: oklch(0.95 0.006 270);
--color-ttg05-solid: #b3b9c6;
--color-ttg05-solid: oklch(0.79 0.018 265);
--color-ttg05-mut: #9ba1af;
--color-ttg05-mut: oklch(0.72 0.018 270);
--color-ttg05-a: #9b5cf6;
--color-ttg05-a: oklch(0.64 0.22 295);
--color-ttg05-b: #f2509a;
--color-ttg05-b: oklch(0.68 0.21 355);
--font-ttg05-sans: 'Geist', system-ui, sans-serif;
--font-ttg05-mono: 'Geist Mono', ui-monospace, monospace;
}
.ttg-05 {
width: 100%;
min-height: 100svh;
}<link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Geist:wght@400..800&family=Geist+Mono:wght@500&display=swap">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Geist:wght@400..800&family=Geist+Mono:wght@500&display=swap">What changed in the port
Which parts became utilities, which stayed CSS, and why.
- The original carried three abandoned attempts (
::before,::afterwithattr(), an empty span rule) before the working one; the port is one technique, stated once. - UI upgrade: the hover is now a left-to-right gradient wipe via animated
background-size, instead of an instant colour swap that the browser cannot tween. - UI upgrade: feature tiles became real links with lift, border tint and arrow nudge; every hover state has a
focus-visible:twin for keyboard users. - Muted copy rose from
#64748b(3.6:1) to 7:1 on the card.
Here's a working CSS demo from CodeFronts. Use it as-is or adapt to your framework. All classes are scoped under a unique prefix so the code won't collide with your existing styles. MIT licensed.
Demo: Tailwind Gradient Text on Hover Animation
Source: https://codefronts.com/motion/tailwind-css-text-gradient/tailwind-gradient-text-on-hover-animation/
Hover any link or card and the gradient wipes across the letters from left to right. It's two background layers clipped to the text — a solid ink layer underneath and a gradient layer whose width animates from 0% to 100%. Unlike the original's instant swap, this is a real, interruptible transition.
## HTML
```html
<section class="ttg-05 w-full min-h-svh grid place-items-center bg-ttg05-bg px-5 py-14 font-ttg05-sans text-ttg05-ink" aria-label="Gradient text on hover demo">
<div class="w-full max-w-2xl rounded-3xl border border-white/8 bg-ttg05-card p-8 shadow-[0_30px_60px_-30px_rgb(0_0_0/0.7)] max-sm:p-6">
<p class="font-ttg05-mono text-[11px] tracking-[0.16em] text-ttg05-mut uppercase">Hover or tab through the links</p>
<nav class="mt-4 flex flex-wrap gap-1" aria-label="Demo">
<a href="#" class="inline-flex min-h-11 items-center rounded-lg bg-[linear-gradient(90deg,var(--color-ttg05-a),var(--color-ttg05-b)),linear-gradient(var(--color-ttg05-solid),var(--color-ttg05-solid))] bg-[length:0%_100%,100%_100%] bg-no-repeat bg-clip-text px-3.5 text-base font-semibold text-transparent transition-[background-size] duration-500 ease-out hover:bg-[length:100%_100%,100%_100%] focus-visible:bg-[length:100%_100%,100%_100%] focus-visible:outline-2 focus-visible:outline-ttg05-a motion-reduce:transition-none">Home</a>
<a href="#" class="inline-flex min-h-11 items-center rounded-lg bg-[linear-gradient(90deg,var(--color-ttg05-a),var(--color-ttg05-b)),linear-gradient(var(--color-ttg05-solid),var(--color-ttg05-solid))] bg-[length:0%_100%,100%_100%] bg-no-repeat bg-clip-text px-3.5 text-base font-semibold text-transparent transition-[background-size] duration-500 ease-out hover:bg-[length:100%_100%,100%_100%] focus-visible:bg-[length:100%_100%,100%_100%] focus-visible:outline-2 focus-visible:outline-ttg05-a motion-reduce:transition-none">Features</a>
<a href="#" class="inline-flex min-h-11 items-center rounded-lg bg-[linear-gradient(90deg,var(--color-ttg05-a),var(--color-ttg05-b)),linear-gradient(var(--color-ttg05-solid),var(--color-ttg05-solid))] bg-[length:0%_100%,100%_100%] bg-no-repeat bg-clip-text px-3.5 text-base font-semibold text-transparent transition-[background-size] duration-500 ease-out hover:bg-[length:100%_100%,100%_100%] focus-visible:bg-[length:100%_100%,100%_100%] focus-visible:outline-2 focus-visible:outline-ttg05-a motion-reduce:transition-none">Pricing</a>
<a href="#" class="inline-flex min-h-11 items-center rounded-lg bg-[linear-gradient(90deg,var(--color-ttg05-a),var(--color-ttg05-b)),linear-gradient(var(--color-ttg05-solid),var(--color-ttg05-solid))] bg-[length:0%_100%,100%_100%] bg-no-repeat bg-clip-text px-3.5 text-base font-semibold text-transparent transition-[background-size] duration-500 ease-out hover:bg-[length:100%_100%,100%_100%] focus-visible:bg-[length:100%_100%,100%_100%] focus-visible:outline-2 focus-visible:outline-ttg05-a motion-reduce:transition-none">Changelog</a>
<a href="#" class="inline-flex min-h-11 items-center rounded-lg bg-[linear-gradient(90deg,var(--color-ttg05-a),var(--color-ttg05-b)),linear-gradient(var(--color-ttg05-solid),var(--color-ttg05-solid))] bg-[length:0%_100%,100%_100%] bg-no-repeat bg-clip-text px-3.5 text-base font-semibold text-transparent transition-[background-size] duration-500 ease-out hover:bg-[length:100%_100%,100%_100%] focus-visible:bg-[length:100%_100%,100%_100%] focus-visible:outline-2 focus-visible:outline-ttg05-a motion-reduce:transition-none">Contact</a>
</nav>
<div class="my-7 h-px bg-white/8"></div>
<div class="grid gap-3.5 sm:grid-cols-3">
<a href="#" class="group rounded-2xl border border-white/8 bg-white/[0.025] p-5 transition hover:-translate-y-0.5 hover:border-ttg05-a/40 hover:bg-white/[0.045] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ttg05-a motion-reduce:transition-none">
<h3 class="flex items-center justify-between text-[15.5px] font-bold"><span class="bg-[linear-gradient(90deg,var(--color-ttg05-a),var(--color-ttg05-b)),linear-gradient(var(--color-ttg05-ink),var(--color-ttg05-ink))] bg-[length:0%_100%,100%_100%] bg-no-repeat bg-clip-text text-transparent transition-[background-size] duration-500 group-hover:bg-[length:100%_100%,100%_100%] group-focus-visible:bg-[length:100%_100%,100%_100%] motion-reduce:transition-none">Analytics</span><span aria-hidden="true" class="text-ttg05-mut transition group-hover:translate-x-0.5 group-hover:text-ttg05-b">→</span></h3>
<p class="mt-2 text-[13.5px]/[1.6] text-ttg05-mut">Real-time dashboards for every metric your team cares about.</p>
</a>
<a href="#" class="group rounded-2xl border border-white/8 bg-white/[0.025] p-5 transition hover:-translate-y-0.5 hover:border-ttg05-a/40 hover:bg-white/[0.045] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ttg05-a motion-reduce:transition-none">
<h3 class="flex items-center justify-between text-[15.5px] font-bold"><span class="bg-[linear-gradient(90deg,var(--color-ttg05-a),var(--color-ttg05-b)),linear-gradient(var(--color-ttg05-ink),var(--color-ttg05-ink))] bg-[length:0%_100%,100%_100%] bg-no-repeat bg-clip-text text-transparent transition-[background-size] duration-500 group-hover:bg-[length:100%_100%,100%_100%] group-focus-visible:bg-[length:100%_100%,100%_100%] motion-reduce:transition-none">Integrations</span><span aria-hidden="true" class="text-ttg05-mut transition group-hover:translate-x-0.5 group-hover:text-ttg05-b">→</span></h3>
<p class="mt-2 text-[13.5px]/[1.6] text-ttg05-mut">Connect to 200+ tools with one-click OAuth flows.</p>
</a>
<a href="#" class="group rounded-2xl border border-white/8 bg-white/[0.025] p-5 transition hover:-translate-y-0.5 hover:border-ttg05-a/40 hover:bg-white/[0.045] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ttg05-a motion-reduce:transition-none">
<h3 class="flex items-center justify-between text-[15.5px] font-bold"><span class="bg-[linear-gradient(90deg,var(--color-ttg05-a),var(--color-ttg05-b)),linear-gradient(var(--color-ttg05-ink),var(--color-ttg05-ink))] bg-[length:0%_100%,100%_100%] bg-no-repeat bg-clip-text text-transparent transition-[background-size] duration-500 group-hover:bg-[length:100%_100%,100%_100%] group-focus-visible:bg-[length:100%_100%,100%_100%] motion-reduce:transition-none">Collaboration</span><span aria-hidden="true" class="text-ttg05-mut transition group-hover:translate-x-0.5 group-hover:text-ttg05-b">→</span></h3>
<p class="mt-2 text-[13.5px]/[1.6] text-ttg05-mut">Shared workspaces with granular permission controls.</p>
</a>
</div>
</div>
</section>
```
## CSS
```css
@import "tailwindcss";
@theme {
--color-ttg05-bg: #0c0c11;
--color-ttg05-bg: oklch(0.16 0.008 285);
--color-ttg05-card: #16161e;
--color-ttg05-card: oklch(0.2 0.012 285);
--color-ttg05-ink: #eceef3;
--color-ttg05-ink: oklch(0.95 0.006 270);
--color-ttg05-solid: #b3b9c6;
--color-ttg05-solid: oklch(0.79 0.018 265);
--color-ttg05-mut: #9ba1af;
--color-ttg05-mut: oklch(0.72 0.018 270);
--color-ttg05-a: #9b5cf6;
--color-ttg05-a: oklch(0.64 0.22 295);
--color-ttg05-b: #f2509a;
--color-ttg05-b: oklch(0.68 0.21 355);
--font-ttg05-sans: 'Geist', system-ui, sans-serif;
--font-ttg05-mono: 'Geist Mono', ui-monospace, monospace;
}
.ttg-05 {
width: 100%;
min-height: 100svh;
}
```Here's a working CSS demo from CodeFronts. Use it as-is or adapt to your framework. All classes are scoped under a unique prefix so the code won't collide with your existing styles. MIT licensed.
Demo: Tailwind Gradient Text on Hover Animation
Source: https://codefronts.com/motion/tailwind-css-text-gradient/tailwind-gradient-text-on-hover-animation/
Hover any link or card and the gradient wipes across the letters from left to right. It's two background layers clipped to the text — a solid ink layer underneath and a gradient layer whose width animates from 0% to 100%. Unlike the original's instant swap, this is a real, interruptible transition.
## HTML
```html
<section class="ttg-05 w-full min-h-svh grid place-items-center bg-ttg05-bg px-5 py-14 font-ttg05-sans text-ttg05-ink" aria-label="Gradient text on hover demo">
<div class="w-full max-w-2xl rounded-3xl border border-white/8 bg-ttg05-card p-8 shadow-[0_30px_60px_-30px_rgb(0_0_0/0.7)] max-sm:p-6">
<p class="font-ttg05-mono text-[11px] tracking-[0.16em] text-ttg05-mut uppercase">Hover or tab through the links</p>
<nav class="mt-4 flex flex-wrap gap-1" aria-label="Demo">
<a href="#" class="inline-flex min-h-11 items-center rounded-lg bg-[linear-gradient(90deg,var(--color-ttg05-a),var(--color-ttg05-b)),linear-gradient(var(--color-ttg05-solid),var(--color-ttg05-solid))] bg-[length:0%_100%,100%_100%] bg-no-repeat bg-clip-text px-3.5 text-base font-semibold text-transparent transition-[background-size] duration-500 ease-out hover:bg-[length:100%_100%,100%_100%] focus-visible:bg-[length:100%_100%,100%_100%] focus-visible:outline-2 focus-visible:outline-ttg05-a motion-reduce:transition-none">Home</a>
<a href="#" class="inline-flex min-h-11 items-center rounded-lg bg-[linear-gradient(90deg,var(--color-ttg05-a),var(--color-ttg05-b)),linear-gradient(var(--color-ttg05-solid),var(--color-ttg05-solid))] bg-[length:0%_100%,100%_100%] bg-no-repeat bg-clip-text px-3.5 text-base font-semibold text-transparent transition-[background-size] duration-500 ease-out hover:bg-[length:100%_100%,100%_100%] focus-visible:bg-[length:100%_100%,100%_100%] focus-visible:outline-2 focus-visible:outline-ttg05-a motion-reduce:transition-none">Features</a>
<a href="#" class="inline-flex min-h-11 items-center rounded-lg bg-[linear-gradient(90deg,var(--color-ttg05-a),var(--color-ttg05-b)),linear-gradient(var(--color-ttg05-solid),var(--color-ttg05-solid))] bg-[length:0%_100%,100%_100%] bg-no-repeat bg-clip-text px-3.5 text-base font-semibold text-transparent transition-[background-size] duration-500 ease-out hover:bg-[length:100%_100%,100%_100%] focus-visible:bg-[length:100%_100%,100%_100%] focus-visible:outline-2 focus-visible:outline-ttg05-a motion-reduce:transition-none">Pricing</a>
<a href="#" class="inline-flex min-h-11 items-center rounded-lg bg-[linear-gradient(90deg,var(--color-ttg05-a),var(--color-ttg05-b)),linear-gradient(var(--color-ttg05-solid),var(--color-ttg05-solid))] bg-[length:0%_100%,100%_100%] bg-no-repeat bg-clip-text px-3.5 text-base font-semibold text-transparent transition-[background-size] duration-500 ease-out hover:bg-[length:100%_100%,100%_100%] focus-visible:bg-[length:100%_100%,100%_100%] focus-visible:outline-2 focus-visible:outline-ttg05-a motion-reduce:transition-none">Changelog</a>
<a href="#" class="inline-flex min-h-11 items-center rounded-lg bg-[linear-gradient(90deg,var(--color-ttg05-a),var(--color-ttg05-b)),linear-gradient(var(--color-ttg05-solid),var(--color-ttg05-solid))] bg-[length:0%_100%,100%_100%] bg-no-repeat bg-clip-text px-3.5 text-base font-semibold text-transparent transition-[background-size] duration-500 ease-out hover:bg-[length:100%_100%,100%_100%] focus-visible:bg-[length:100%_100%,100%_100%] focus-visible:outline-2 focus-visible:outline-ttg05-a motion-reduce:transition-none">Contact</a>
</nav>
<div class="my-7 h-px bg-white/8"></div>
<div class="grid gap-3.5 sm:grid-cols-3">
<a href="#" class="group rounded-2xl border border-white/8 bg-white/[0.025] p-5 transition hover:-translate-y-0.5 hover:border-ttg05-a/40 hover:bg-white/[0.045] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ttg05-a motion-reduce:transition-none">
<h3 class="flex items-center justify-between text-[15.5px] font-bold"><span class="bg-[linear-gradient(90deg,var(--color-ttg05-a),var(--color-ttg05-b)),linear-gradient(var(--color-ttg05-ink),var(--color-ttg05-ink))] bg-[length:0%_100%,100%_100%] bg-no-repeat bg-clip-text text-transparent transition-[background-size] duration-500 group-hover:bg-[length:100%_100%,100%_100%] group-focus-visible:bg-[length:100%_100%,100%_100%] motion-reduce:transition-none">Analytics</span><span aria-hidden="true" class="text-ttg05-mut transition group-hover:translate-x-0.5 group-hover:text-ttg05-b">→</span></h3>
<p class="mt-2 text-[13.5px]/[1.6] text-ttg05-mut">Real-time dashboards for every metric your team cares about.</p>
</a>
<a href="#" class="group rounded-2xl border border-white/8 bg-white/[0.025] p-5 transition hover:-translate-y-0.5 hover:border-ttg05-a/40 hover:bg-white/[0.045] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ttg05-a motion-reduce:transition-none">
<h3 class="flex items-center justify-between text-[15.5px] font-bold"><span class="bg-[linear-gradient(90deg,var(--color-ttg05-a),var(--color-ttg05-b)),linear-gradient(var(--color-ttg05-ink),var(--color-ttg05-ink))] bg-[length:0%_100%,100%_100%] bg-no-repeat bg-clip-text text-transparent transition-[background-size] duration-500 group-hover:bg-[length:100%_100%,100%_100%] group-focus-visible:bg-[length:100%_100%,100%_100%] motion-reduce:transition-none">Integrations</span><span aria-hidden="true" class="text-ttg05-mut transition group-hover:translate-x-0.5 group-hover:text-ttg05-b">→</span></h3>
<p class="mt-2 text-[13.5px]/[1.6] text-ttg05-mut">Connect to 200+ tools with one-click OAuth flows.</p>
</a>
<a href="#" class="group rounded-2xl border border-white/8 bg-white/[0.025] p-5 transition hover:-translate-y-0.5 hover:border-ttg05-a/40 hover:bg-white/[0.045] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ttg05-a motion-reduce:transition-none">
<h3 class="flex items-center justify-between text-[15.5px] font-bold"><span class="bg-[linear-gradient(90deg,var(--color-ttg05-a),var(--color-ttg05-b)),linear-gradient(var(--color-ttg05-ink),var(--color-ttg05-ink))] bg-[length:0%_100%,100%_100%] bg-no-repeat bg-clip-text text-transparent transition-[background-size] duration-500 group-hover:bg-[length:100%_100%,100%_100%] group-focus-visible:bg-[length:100%_100%,100%_100%] motion-reduce:transition-none">Collaboration</span><span aria-hidden="true" class="text-ttg05-mut transition group-hover:translate-x-0.5 group-hover:text-ttg05-b">→</span></h3>
<p class="mt-2 text-[13.5px]/[1.6] text-ttg05-mut">Shared workspaces with granular permission controls.</p>
</a>
</div>
</div>
</section>
```
## CSS
```css
@import "tailwindcss";
@theme {
--color-ttg05-bg: #0c0c11;
--color-ttg05-bg: oklch(0.16 0.008 285);
--color-ttg05-card: #16161e;
--color-ttg05-card: oklch(0.2 0.012 285);
--color-ttg05-ink: #eceef3;
--color-ttg05-ink: oklch(0.95 0.006 270);
--color-ttg05-solid: #b3b9c6;
--color-ttg05-solid: oklch(0.79 0.018 265);
--color-ttg05-mut: #9ba1af;
--color-ttg05-mut: oklch(0.72 0.018 270);
--color-ttg05-a: #9b5cf6;
--color-ttg05-a: oklch(0.64 0.22 295);
--color-ttg05-b: #f2509a;
--color-ttg05-b: oklch(0.68 0.21 355);
--font-ttg05-sans: 'Geist', system-ui, sans-serif;
--font-ttg05-mono: 'Geist Mono', ui-monospace, monospace;
}
.ttg-05 {
width: 100%;
min-height: 100svh;
}
```How this works
Why the original snapped. background-clip and gradients aren't interpolable, so toggling them on hover is instant. background-size is interpolable, so the port pre-applies both colours and animates the size of the gradient layer:
<a class="bg-[linear-gradient(90deg,var(--color-ttg05-a),var(--color-ttg05-b)),
linear-gradient(var(--color-ttg05-ink),var(--color-ttg05-ink))]
bg-[length:0%_100%,100%_100%] bg-no-repeat bg-clip-text text-transparent
transition-[background-size] duration-500
hover:bg-[length:100%_100%,100%_100%]">Layer order. The first background layer paints on top, so the gradient wipes over the solid ink. Because both layers are clipped to the glyphs, the text is always fully coloured — never invisible mid-transition.
Keyboard parity. Every hover: has a focus-visible: twin, so tabbing gets the same wipe as pointing.
Make it yours
- Wipe from the right: add
bg-rightso the layer grows from the right edge. - Slower, luxurious wipe:
duration-700 ease-out. - Vertical fill: swap the sizes to
0%_100%→100%_0%with abg-bottomorigin. - Underline too: add
after:utilities withafter:scale-x-0 hover:after:scale-x-100.
Gotchas — read before shipping
- List the layers' sizes in the same order as the images; a single
bg-[length:…]value applies to every layer. bg-no-repeatis required — a repeating 0%-wide layer still tiles a hairline on some engines.- Inline links that wrap across lines wipe each line separately only with
box-decoration-clone; otherwise the wipe runs across the combined box.
Browser support
| Chrome | Safari | Firefox | Edge |
|---|---|---|---|
| 111+ | 16.4+ | 128+ | 111+ |
Transitioning background-size on background-clip:text is smooth in all evergreen engines.