06 / 30
All 30 in 30 Tailwind CSS Hover Effects
- 01Tailwind Underline Draw Hover Effect
- 02Tailwind Text Glitch Hover Effect
- 03Tailwind Letter Spacing Expand Hover Effect
- 04Tailwind Gradient Text Reveal Hover Effect
- 05Tailwind Split Text Hover Effect
- 06Tailwind Neon Glow Text Hover Effect
- 07Tailwind Magnetic Liquid Button Hover Effect
- 08Tailwind Border Draw Hover Effect
- 09Tailwind Shimmer Shine Button Hover Effect
- 10Tailwind Fill Wipe Button Hover Effect
- 11Tailwind 3D Press Button Hover Effect
- 12Tailwind Ripple Button Hover Effect
- 13Tailwind 3D Tilt Card Hover Effect
- 14Tailwind Card Flip Hover Effect
- 15Tailwind Glassmorphism Card Hover Effect
- 16Tailwind Spotlight Card Hover Effect
- 17Tailwind Slide Reveal Card Hover Effect
- 18Tailwind Stack Lift Card Hover Effect
- 19Tailwind Zoom Pan Image Hover Effect
- 20Tailwind Color Channel Split Hover Effect
- 21Tailwind Duotone Image Hover Effect
- 22Tailwind Curtain Reveal Image Hover Effect
- 23Tailwind Ken Burns Image Hover Effect
- 24Tailwind Image Tilt Depth Hover Effect
- 25Tailwind Underline Slide Nav Hover Effect
- 26Tailwind Highlight Fill Nav Hover Effect
- 27Tailwind Strikethrough Hover Link Effect
- 28Tailwind Inline Word Swap Hover Effect
- 29Tailwind Dot Trail Cursor Hover Effect
- 30Tailwind Magnetic Cursor Pull Hover Effect
Tailwind Neon Glow Text Hover Effect
Six electroluminescent text hovers — classic tube, flicker, hue cycle, multi-layer bloom, retro arcade and icy frost. Stacked text-shadow has no utility form and gets none here; what the port gains is that the dim resting glow and the lit hover glow are adjacent, so the pair is edited together.
Untitled UI Pro: 5,000+ React + Tailwind CSS v4 components · from $349 one-time
Untitled UI React · Affiliate link
The code
<section class="thv-06 w-full min-h-svh grid place-items-center bg-thv06-bg font-thv06-sans px-6 py-14">
<div class="w-[min(720px,100%)] flex flex-col gap-3">
<div class="flex flex-wrap items-center justify-between gap-5 px-10 py-8 rounded-xl bg-white/[0.02] border border-white/[0.06]">
<span tabindex="0" class="inline-block text-[clamp(1.6rem,4vw,2.4rem)] font-bold tracking-[0.15em] text-thv06-pink rounded-xs [text-shadow:0_0_4px_#ff00de44] transition-[text-shadow,color] duration-400 hover:text-white hover:[text-shadow:0_0_4px_#fff,0_0_16px_var(--color-thv06-pink),0_0_40px_var(--color-thv06-pink),0_0_80px_var(--color-thv06-pink)] focus-visible:text-white focus-visible:[text-shadow:0_0_4px_#fff,0_0_16px_var(--color-thv06-pink),0_0_40px_var(--color-thv06-pink)] focus-visible:outline-2 focus-visible:outline-offset-6 focus-visible:outline-thv06-pink motion-reduce:transition-none">NEON</span>
<span class="shrink-0 text-[11px] tracking-[0.12em] uppercase text-thv06-dim">classic tube glow</span>
</div>
<div class="flex flex-wrap items-center justify-between gap-5 px-10 py-8 rounded-xl bg-white/[0.02] border border-white/[0.06]">
<span tabindex="0" class="inline-block text-[clamp(1.6rem,4vw,2.4rem)] font-bold tracking-[0.15em] text-thv06-green rounded-xs transition-[text-shadow,color] duration-300 hover:text-white hover:[text-shadow:0_0_4px_#fff,0_0_18px_var(--color-thv06-green),0_0_50px_var(--color-thv06-green)] hover:animate-thv06-flicker focus-visible:text-white focus-visible:[text-shadow:0_0_4px_#fff,0_0_18px_var(--color-thv06-green),0_0_50px_var(--color-thv06-green)] focus-visible:outline-2 focus-visible:outline-offset-6 focus-visible:outline-thv06-green motion-reduce:hover:animate-none">FLICKER</span>
<span class="shrink-0 text-[11px] tracking-[0.12em] uppercase text-thv06-dim">pulsing flicker</span>
</div>
<div class="flex flex-wrap items-center justify-between gap-5 px-10 py-8 rounded-xl bg-white/[0.02] border border-white/[0.06]">
<span tabindex="0" class="inline-block text-[clamp(1.6rem,4vw,2.4rem)] font-bold tracking-[0.15em] text-thv06-orange rounded-xs [text-shadow:0_0_4px_#ff440033] transition-[text-shadow,color] duration-400 hover:text-white hover:[text-shadow:0_0_6px_#fff,0_0_20px_var(--color-thv06-orange),0_0_60px_var(--color-thv06-orange)] hover:animate-thv06-hue focus-visible:text-white focus-visible:[text-shadow:0_0_6px_#fff,0_0_20px_var(--color-thv06-orange),0_0_60px_var(--color-thv06-orange)] focus-visible:outline-2 focus-visible:outline-offset-6 focus-visible:outline-thv06-orange motion-reduce:hover:animate-none">SPECTRUM</span>
<span class="shrink-0 text-[11px] tracking-[0.12em] uppercase text-thv06-dim">hue-rotate cycle</span>
</div>
<div class="flex flex-wrap items-center justify-between gap-5 px-10 py-8 rounded-xl bg-white/[0.02] border border-white/[0.06]">
<span tabindex="0" class="inline-block text-[clamp(1.6rem,4vw,2.4rem)] font-bold tracking-[0.15em] text-thv06-violet rounded-xs [text-shadow:0_0_4px_#7c3aed44] transition-[text-shadow,color] duration-500 ease-[cubic-bezier(.4,0,.2,1)] hover:text-white hover:[text-shadow:0_0_2px_#fff,0_0_8px_#a78bfa,0_0_20px_#7c3aed,0_0_50px_#6d28d9,0_0_100px_#5b21b6,0_0_180px_#4c1d95] focus-visible:text-white focus-visible:[text-shadow:0_0_2px_#fff,0_0_8px_#a78bfa,0_0_20px_#7c3aed,0_0_50px_#6d28d9] focus-visible:outline-2 focus-visible:outline-offset-6 focus-visible:outline-thv06-violet motion-reduce:transition-none">BLOOM</span>
<span class="shrink-0 text-[11px] tracking-[0.12em] uppercase text-thv06-dim">multi-layer bloom</span>
</div>
<div class="flex flex-wrap items-center justify-between gap-5 px-10 py-8 rounded-xl bg-white/[0.02] border border-white/[0.06]">
<span tabindex="0" class="inline-block font-thv06-mono text-[clamp(1.4rem,3.6vw,2.1rem)] font-bold tracking-[0.15em] text-thv06-yellow rounded-xs [text-shadow:0_0_4px_#ffee0044] transition-[text-shadow,color] duration-250 ease-[steps(2)] hover:text-white hover:[text-shadow:2px_2px_0_#ff6600,0_0_10px_var(--color-thv06-yellow),0_0_30px_var(--color-thv06-yellow),0_0_60px_#ff6600] focus-visible:text-white focus-visible:[text-shadow:2px_2px_0_#ff6600,0_0_10px_var(--color-thv06-yellow),0_0_30px_var(--color-thv06-yellow)] focus-visible:outline-2 focus-visible:outline-offset-6 focus-visible:outline-thv06-yellow motion-reduce:transition-none">HI-SCORE</span>
<span class="shrink-0 text-[11px] tracking-[0.12em] uppercase text-thv06-dim">retro arcade</span>
</div>
<div class="flex flex-wrap items-center justify-between gap-5 px-10 py-8 rounded-xl bg-white/[0.02] border border-white/[0.06]">
<span tabindex="0" class="inline-block text-[clamp(1.6rem,4vw,2.4rem)] font-bold tracking-[0.15em] text-thv06-ice rounded-xs [text-shadow:0_0_4px_#a5f3fc44] transition-[text-shadow,color,letter-spacing] duration-500 hover:text-white hover:tracking-[0.25em] hover:[text-shadow:0_0_4px_#fff,0_0_16px_var(--color-thv06-ice),0_0_40px_#0ea5e9,0_0_80px_#0369a1] focus-visible:text-white focus-visible:tracking-[0.25em] focus-visible:[text-shadow:0_0_4px_#fff,0_0_16px_var(--color-thv06-ice),0_0_40px_#0ea5e9] focus-visible:outline-2 focus-visible:outline-offset-6 focus-visible:outline-thv06-ice motion-reduce:transition-none">ICE</span>
<span class="shrink-0 text-[11px] tracking-[0.12em] uppercase text-thv06-dim">icy frost glow</span>
</div>
</div>
</section><section class="thv-06 w-full min-h-svh grid place-items-center bg-thv06-bg font-thv06-sans px-6 py-14">
<div class="w-[min(720px,100%)] flex flex-col gap-3">
<div class="flex flex-wrap items-center justify-between gap-5 px-10 py-8 rounded-xl bg-white/[0.02] border border-white/[0.06]">
<span tabindex="0" class="inline-block text-[clamp(1.6rem,4vw,2.4rem)] font-bold tracking-[0.15em] text-thv06-pink rounded-xs [text-shadow:0_0_4px_#ff00de44] transition-[text-shadow,color] duration-400 hover:text-white hover:[text-shadow:0_0_4px_#fff,0_0_16px_var(--color-thv06-pink),0_0_40px_var(--color-thv06-pink),0_0_80px_var(--color-thv06-pink)] focus-visible:text-white focus-visible:[text-shadow:0_0_4px_#fff,0_0_16px_var(--color-thv06-pink),0_0_40px_var(--color-thv06-pink)] focus-visible:outline-2 focus-visible:outline-offset-6 focus-visible:outline-thv06-pink motion-reduce:transition-none">NEON</span>
<span class="shrink-0 text-[11px] tracking-[0.12em] uppercase text-thv06-dim">classic tube glow</span>
</div>
<div class="flex flex-wrap items-center justify-between gap-5 px-10 py-8 rounded-xl bg-white/[0.02] border border-white/[0.06]">
<span tabindex="0" class="inline-block text-[clamp(1.6rem,4vw,2.4rem)] font-bold tracking-[0.15em] text-thv06-green rounded-xs transition-[text-shadow,color] duration-300 hover:text-white hover:[text-shadow:0_0_4px_#fff,0_0_18px_var(--color-thv06-green),0_0_50px_var(--color-thv06-green)] hover:animate-thv06-flicker focus-visible:text-white focus-visible:[text-shadow:0_0_4px_#fff,0_0_18px_var(--color-thv06-green),0_0_50px_var(--color-thv06-green)] focus-visible:outline-2 focus-visible:outline-offset-6 focus-visible:outline-thv06-green motion-reduce:hover:animate-none">FLICKER</span>
<span class="shrink-0 text-[11px] tracking-[0.12em] uppercase text-thv06-dim">pulsing flicker</span>
</div>
<div class="flex flex-wrap items-center justify-between gap-5 px-10 py-8 rounded-xl bg-white/[0.02] border border-white/[0.06]">
<span tabindex="0" class="inline-block text-[clamp(1.6rem,4vw,2.4rem)] font-bold tracking-[0.15em] text-thv06-orange rounded-xs [text-shadow:0_0_4px_#ff440033] transition-[text-shadow,color] duration-400 hover:text-white hover:[text-shadow:0_0_6px_#fff,0_0_20px_var(--color-thv06-orange),0_0_60px_var(--color-thv06-orange)] hover:animate-thv06-hue focus-visible:text-white focus-visible:[text-shadow:0_0_6px_#fff,0_0_20px_var(--color-thv06-orange),0_0_60px_var(--color-thv06-orange)] focus-visible:outline-2 focus-visible:outline-offset-6 focus-visible:outline-thv06-orange motion-reduce:hover:animate-none">SPECTRUM</span>
<span class="shrink-0 text-[11px] tracking-[0.12em] uppercase text-thv06-dim">hue-rotate cycle</span>
</div>
<div class="flex flex-wrap items-center justify-between gap-5 px-10 py-8 rounded-xl bg-white/[0.02] border border-white/[0.06]">
<span tabindex="0" class="inline-block text-[clamp(1.6rem,4vw,2.4rem)] font-bold tracking-[0.15em] text-thv06-violet rounded-xs [text-shadow:0_0_4px_#7c3aed44] transition-[text-shadow,color] duration-500 ease-[cubic-bezier(.4,0,.2,1)] hover:text-white hover:[text-shadow:0_0_2px_#fff,0_0_8px_#a78bfa,0_0_20px_#7c3aed,0_0_50px_#6d28d9,0_0_100px_#5b21b6,0_0_180px_#4c1d95] focus-visible:text-white focus-visible:[text-shadow:0_0_2px_#fff,0_0_8px_#a78bfa,0_0_20px_#7c3aed,0_0_50px_#6d28d9] focus-visible:outline-2 focus-visible:outline-offset-6 focus-visible:outline-thv06-violet motion-reduce:transition-none">BLOOM</span>
<span class="shrink-0 text-[11px] tracking-[0.12em] uppercase text-thv06-dim">multi-layer bloom</span>
</div>
<div class="flex flex-wrap items-center justify-between gap-5 px-10 py-8 rounded-xl bg-white/[0.02] border border-white/[0.06]">
<span tabindex="0" class="inline-block font-thv06-mono text-[clamp(1.4rem,3.6vw,2.1rem)] font-bold tracking-[0.15em] text-thv06-yellow rounded-xs [text-shadow:0_0_4px_#ffee0044] transition-[text-shadow,color] duration-250 ease-[steps(2)] hover:text-white hover:[text-shadow:2px_2px_0_#ff6600,0_0_10px_var(--color-thv06-yellow),0_0_30px_var(--color-thv06-yellow),0_0_60px_#ff6600] focus-visible:text-white focus-visible:[text-shadow:2px_2px_0_#ff6600,0_0_10px_var(--color-thv06-yellow),0_0_30px_var(--color-thv06-yellow)] focus-visible:outline-2 focus-visible:outline-offset-6 focus-visible:outline-thv06-yellow motion-reduce:transition-none">HI-SCORE</span>
<span class="shrink-0 text-[11px] tracking-[0.12em] uppercase text-thv06-dim">retro arcade</span>
</div>
<div class="flex flex-wrap items-center justify-between gap-5 px-10 py-8 rounded-xl bg-white/[0.02] border border-white/[0.06]">
<span tabindex="0" class="inline-block text-[clamp(1.6rem,4vw,2.4rem)] font-bold tracking-[0.15em] text-thv06-ice rounded-xs [text-shadow:0_0_4px_#a5f3fc44] transition-[text-shadow,color,letter-spacing] duration-500 hover:text-white hover:tracking-[0.25em] hover:[text-shadow:0_0_4px_#fff,0_0_16px_var(--color-thv06-ice),0_0_40px_#0ea5e9,0_0_80px_#0369a1] focus-visible:text-white focus-visible:tracking-[0.25em] focus-visible:[text-shadow:0_0_4px_#fff,0_0_16px_var(--color-thv06-ice),0_0_40px_#0ea5e9] focus-visible:outline-2 focus-visible:outline-offset-6 focus-visible:outline-thv06-ice motion-reduce:transition-none">ICE</span>
<span class="shrink-0 text-[11px] tracking-[0.12em] uppercase text-thv06-dim">icy frost glow</span>
</div>
</div>
</section>@import "tailwindcss";
@theme {
--color-thv06-bg: #020204;
--color-thv06-bg: oklch(0.09 0.01 285);
--color-thv06-dim: #3a3a4a;
--color-thv06-dim: oklch(0.37 0.02 285);
--color-thv06-pink: #ff00de;
--color-thv06-pink: oklch(0.66 0.35 330);
--color-thv06-green: #39ff14;
--color-thv06-green: oklch(0.88 0.29 135);
--color-thv06-orange: #ff4400;
--color-thv06-orange: oklch(0.65 0.24 37);
--color-thv06-violet: #7c3aed;
--color-thv06-violet: oklch(0.54 0.25 295);
--color-thv06-yellow: #ffee00;
--color-thv06-yellow: oklch(0.93 0.2 106);
--color-thv06-ice: #a5f3fc;
--color-thv06-ice: oklch(0.9 0.08 200);
--font-thv06-sans: 'Space Grotesk', system-ui, sans-serif;
--font-thv06-mono: 'JetBrains Mono', ui-monospace, monospace;
--animate-thv06-flicker: thv06-flicker 2s linear infinite;
--animate-thv06-hue: thv06-hue 3s linear infinite;
}
.thv-06 {
width: 100%;
min-height: 100svh;
}
.thv-06 ::selection {
background: var(--color-thv06-pink);
color: #fff;
}
@keyframes thv06-flicker {
0%,
19%,
21%,
23%,
25%,
54%,
56%,
100% {
text-shadow: 0 0 4px #fff, 0 0 18px var(--color-thv06-green), 0 0 50px var(--color-thv06-green);
color: #fff;
}
20%,
24%,
55% {
text-shadow: none;
color: var(--color-thv06-green);
}
}
@keyframes thv06-hue {
0% {
filter: hue-rotate(0deg);
}
100% {
filter: hue-rotate(360deg);
}
}@import "tailwindcss";
@theme {
--color-thv06-bg: #020204;
--color-thv06-bg: oklch(0.09 0.01 285);
--color-thv06-dim: #3a3a4a;
--color-thv06-dim: oklch(0.37 0.02 285);
--color-thv06-pink: #ff00de;
--color-thv06-pink: oklch(0.66 0.35 330);
--color-thv06-green: #39ff14;
--color-thv06-green: oklch(0.88 0.29 135);
--color-thv06-orange: #ff4400;
--color-thv06-orange: oklch(0.65 0.24 37);
--color-thv06-violet: #7c3aed;
--color-thv06-violet: oklch(0.54 0.25 295);
--color-thv06-yellow: #ffee00;
--color-thv06-yellow: oklch(0.93 0.2 106);
--color-thv06-ice: #a5f3fc;
--color-thv06-ice: oklch(0.9 0.08 200);
--font-thv06-sans: 'Space Grotesk', system-ui, sans-serif;
--font-thv06-mono: 'JetBrains Mono', ui-monospace, monospace;
--animate-thv06-flicker: thv06-flicker 2s linear infinite;
--animate-thv06-hue: thv06-hue 3s linear infinite;
}
.thv-06 {
width: 100%;
min-height: 100svh;
}
.thv-06 ::selection {
background: var(--color-thv06-pink);
color: #fff;
}
@keyframes thv06-flicker {
0%,
19%,
21%,
23%,
25%,
54%,
56%,
100% {
text-shadow: 0 0 4px #fff, 0 0 18px var(--color-thv06-green), 0 0 50px var(--color-thv06-green);
color: #fff;
}
20%,
24%,
55% {
text-shadow: none;
color: var(--color-thv06-green);
}
}
@keyframes thv06-hue {
0% {
filter: hue-rotate(0deg);
}
100% {
filter: hue-rotate(360deg);
}
}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-thv06-bg: #020204;
--color-thv06-bg: oklch(0.09 0.01 285);
--color-thv06-dim: #3a3a4a;
--color-thv06-dim: oklch(0.37 0.02 285);
--color-thv06-pink: #ff00de;
--color-thv06-pink: oklch(0.66 0.35 330);
--color-thv06-green: #39ff14;
--color-thv06-green: oklch(0.88 0.29 135);
--color-thv06-orange: #ff4400;
--color-thv06-orange: oklch(0.65 0.24 37);
--color-thv06-violet: #7c3aed;
--color-thv06-violet: oklch(0.54 0.25 295);
--color-thv06-yellow: #ffee00;
--color-thv06-yellow: oklch(0.93 0.2 106);
--color-thv06-ice: #a5f3fc;
--color-thv06-ice: oklch(0.9 0.08 200);
--font-thv06-sans: 'Space Grotesk', system-ui, sans-serif;
--font-thv06-mono: 'JetBrains Mono', ui-monospace, monospace;
--animate-thv06-flicker: thv06-flicker 2s linear infinite;
--animate-thv06-hue: thv06-hue 3s linear infinite;
}
.thv-06 {
width: 100%;
min-height: 100svh;
}
.thv-06 ::selection {
background: var(--color-thv06-pink);
color: #fff;
}
@keyframes thv06-flicker {
0%,
19%,
21%,
23%,
25%,
54%,
56%,
100% {
text-shadow: 0 0 4px #fff, 0 0 18px var(--color-thv06-green), 0 0 50px var(--color-thv06-green);
color: #fff;
}
20%,
24%,
55% {
text-shadow: none;
color: var(--color-thv06-green);
}
}
@keyframes thv06-hue {
0% {
filter: hue-rotate(0deg);
}
100% {
filter: hue-rotate(360deg);
}
}@import "tailwindcss";
@theme {
--color-thv06-bg: #020204;
--color-thv06-bg: oklch(0.09 0.01 285);
--color-thv06-dim: #3a3a4a;
--color-thv06-dim: oklch(0.37 0.02 285);
--color-thv06-pink: #ff00de;
--color-thv06-pink: oklch(0.66 0.35 330);
--color-thv06-green: #39ff14;
--color-thv06-green: oklch(0.88 0.29 135);
--color-thv06-orange: #ff4400;
--color-thv06-orange: oklch(0.65 0.24 37);
--color-thv06-violet: #7c3aed;
--color-thv06-violet: oklch(0.54 0.25 295);
--color-thv06-yellow: #ffee00;
--color-thv06-yellow: oklch(0.93 0.2 106);
--color-thv06-ice: #a5f3fc;
--color-thv06-ice: oklch(0.9 0.08 200);
--font-thv06-sans: 'Space Grotesk', system-ui, sans-serif;
--font-thv06-mono: 'JetBrains Mono', ui-monospace, monospace;
--animate-thv06-flicker: thv06-flicker 2s linear infinite;
--animate-thv06-hue: thv06-hue 3s linear infinite;
}
.thv-06 {
width: 100%;
min-height: 100svh;
}
.thv-06 ::selection {
background: var(--color-thv06-pink);
color: #fff;
}
@keyframes thv06-flicker {
0%,
19%,
21%,
23%,
25%,
54%,
56%,
100% {
text-shadow: 0 0 4px #fff, 0 0 18px var(--color-thv06-green), 0 0 50px var(--color-thv06-green);
color: #fff;
}
20%,
24%,
55% {
text-shadow: none;
color: var(--color-thv06-green);
}
}
@keyframes thv06-hue {
0% {
filter: hue-rotate(0deg);
}
100% {
filter: hue-rotate(360deg);
}
}<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=Space+Grotesk:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600;800&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=Space+Grotesk:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600;800&display=swap">What changed in the port
Which parts became utilities, which stayed CSS, and why.
- Nothing about the shadow stack got shorter, and that is the honest result:
text-shadowis authored motion-free artwork, not a scale. The port's value is adjacency plus the token references inside the bracket. - UI change from the CSS original: every tube lights on
focus-visible:too, with a slightly shorter stack so the focus ring stays legible through the bloom. motion-reduce:hover:animate-nonekeeps the glow and drops the strobe. A 2s flicker is precisely the pattern photosensitive users filter out.
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 Neon Glow Text Hover Effect
Source: https://codefronts.com/motion/tailwind-css-hover-effects/tailwind-neon-glow-text-hover-effect/
Six electroluminescent text hovers — classic tube, flicker, hue cycle, multi-layer bloom, retro arcade and icy frost. Stacked text-shadow has no utility form and gets none here; what the port gains is that the dim resting glow and the lit hover glow are adjacent, so the pair is edited together.
## HTML
```html
<section class="thv-06 w-full min-h-svh grid place-items-center bg-thv06-bg font-thv06-sans px-6 py-14">
<div class="w-[min(720px,100%)] flex flex-col gap-3">
<div class="flex flex-wrap items-center justify-between gap-5 px-10 py-8 rounded-xl bg-white/[0.02] border border-white/[0.06]">
<span tabindex="0" class="inline-block text-[clamp(1.6rem,4vw,2.4rem)] font-bold tracking-[0.15em] text-thv06-pink rounded-xs [text-shadow:0_0_4px_#ff00de44] transition-[text-shadow,color] duration-400 hover:text-white hover:[text-shadow:0_0_4px_#fff,0_0_16px_var(--color-thv06-pink),0_0_40px_var(--color-thv06-pink),0_0_80px_var(--color-thv06-pink)] focus-visible:text-white focus-visible:[text-shadow:0_0_4px_#fff,0_0_16px_var(--color-thv06-pink),0_0_40px_var(--color-thv06-pink)] focus-visible:outline-2 focus-visible:outline-offset-6 focus-visible:outline-thv06-pink motion-reduce:transition-none">NEON</span>
<span class="shrink-0 text-[11px] tracking-[0.12em] uppercase text-thv06-dim">classic tube glow</span>
</div>
<div class="flex flex-wrap items-center justify-between gap-5 px-10 py-8 rounded-xl bg-white/[0.02] border border-white/[0.06]">
<span tabindex="0" class="inline-block text-[clamp(1.6rem,4vw,2.4rem)] font-bold tracking-[0.15em] text-thv06-green rounded-xs transition-[text-shadow,color] duration-300 hover:text-white hover:[text-shadow:0_0_4px_#fff,0_0_18px_var(--color-thv06-green),0_0_50px_var(--color-thv06-green)] hover:animate-thv06-flicker focus-visible:text-white focus-visible:[text-shadow:0_0_4px_#fff,0_0_18px_var(--color-thv06-green),0_0_50px_var(--color-thv06-green)] focus-visible:outline-2 focus-visible:outline-offset-6 focus-visible:outline-thv06-green motion-reduce:hover:animate-none">FLICKER</span>
<span class="shrink-0 text-[11px] tracking-[0.12em] uppercase text-thv06-dim">pulsing flicker</span>
</div>
<div class="flex flex-wrap items-center justify-between gap-5 px-10 py-8 rounded-xl bg-white/[0.02] border border-white/[0.06]">
<span tabindex="0" class="inline-block text-[clamp(1.6rem,4vw,2.4rem)] font-bold tracking-[0.15em] text-thv06-orange rounded-xs [text-shadow:0_0_4px_#ff440033] transition-[text-shadow,color] duration-400 hover:text-white hover:[text-shadow:0_0_6px_#fff,0_0_20px_var(--color-thv06-orange),0_0_60px_var(--color-thv06-orange)] hover:animate-thv06-hue focus-visible:text-white focus-visible:[text-shadow:0_0_6px_#fff,0_0_20px_var(--color-thv06-orange),0_0_60px_var(--color-thv06-orange)] focus-visible:outline-2 focus-visible:outline-offset-6 focus-visible:outline-thv06-orange motion-reduce:hover:animate-none">SPECTRUM</span>
<span class="shrink-0 text-[11px] tracking-[0.12em] uppercase text-thv06-dim">hue-rotate cycle</span>
</div>
<div class="flex flex-wrap items-center justify-between gap-5 px-10 py-8 rounded-xl bg-white/[0.02] border border-white/[0.06]">
<span tabindex="0" class="inline-block text-[clamp(1.6rem,4vw,2.4rem)] font-bold tracking-[0.15em] text-thv06-violet rounded-xs [text-shadow:0_0_4px_#7c3aed44] transition-[text-shadow,color] duration-500 ease-[cubic-bezier(.4,0,.2,1)] hover:text-white hover:[text-shadow:0_0_2px_#fff,0_0_8px_#a78bfa,0_0_20px_#7c3aed,0_0_50px_#6d28d9,0_0_100px_#5b21b6,0_0_180px_#4c1d95] focus-visible:text-white focus-visible:[text-shadow:0_0_2px_#fff,0_0_8px_#a78bfa,0_0_20px_#7c3aed,0_0_50px_#6d28d9] focus-visible:outline-2 focus-visible:outline-offset-6 focus-visible:outline-thv06-violet motion-reduce:transition-none">BLOOM</span>
<span class="shrink-0 text-[11px] tracking-[0.12em] uppercase text-thv06-dim">multi-layer bloom</span>
</div>
<div class="flex flex-wrap items-center justify-between gap-5 px-10 py-8 rounded-xl bg-white/[0.02] border border-white/[0.06]">
<span tabindex="0" class="inline-block font-thv06-mono text-[clamp(1.4rem,3.6vw,2.1rem)] font-bold tracking-[0.15em] text-thv06-yellow rounded-xs [text-shadow:0_0_4px_#ffee0044] transition-[text-shadow,color] duration-250 ease-[steps(2)] hover:text-white hover:[text-shadow:2px_2px_0_#ff6600,0_0_10px_var(--color-thv06-yellow),0_0_30px_var(--color-thv06-yellow),0_0_60px_#ff6600] focus-visible:text-white focus-visible:[text-shadow:2px_2px_0_#ff6600,0_0_10px_var(--color-thv06-yellow),0_0_30px_var(--color-thv06-yellow)] focus-visible:outline-2 focus-visible:outline-offset-6 focus-visible:outline-thv06-yellow motion-reduce:transition-none">HI-SCORE</span>
<span class="shrink-0 text-[11px] tracking-[0.12em] uppercase text-thv06-dim">retro arcade</span>
</div>
<div class="flex flex-wrap items-center justify-between gap-5 px-10 py-8 rounded-xl bg-white/[0.02] border border-white/[0.06]">
<span tabindex="0" class="inline-block text-[clamp(1.6rem,4vw,2.4rem)] font-bold tracking-[0.15em] text-thv06-ice rounded-xs [text-shadow:0_0_4px_#a5f3fc44] transition-[text-shadow,color,letter-spacing] duration-500 hover:text-white hover:tracking-[0.25em] hover:[text-shadow:0_0_4px_#fff,0_0_16px_var(--color-thv06-ice),0_0_40px_#0ea5e9,0_0_80px_#0369a1] focus-visible:text-white focus-visible:tracking-[0.25em] focus-visible:[text-shadow:0_0_4px_#fff,0_0_16px_var(--color-thv06-ice),0_0_40px_#0ea5e9] focus-visible:outline-2 focus-visible:outline-offset-6 focus-visible:outline-thv06-ice motion-reduce:transition-none">ICE</span>
<span class="shrink-0 text-[11px] tracking-[0.12em] uppercase text-thv06-dim">icy frost glow</span>
</div>
</div>
</section>
```
## CSS
```css
@import "tailwindcss";
@theme {
--color-thv06-bg: #020204;
--color-thv06-bg: oklch(0.09 0.01 285);
--color-thv06-dim: #3a3a4a;
--color-thv06-dim: oklch(0.37 0.02 285);
--color-thv06-pink: #ff00de;
--color-thv06-pink: oklch(0.66 0.35 330);
--color-thv06-green: #39ff14;
--color-thv06-green: oklch(0.88 0.29 135);
--color-thv06-orange: #ff4400;
--color-thv06-orange: oklch(0.65 0.24 37);
--color-thv06-violet: #7c3aed;
--color-thv06-violet: oklch(0.54 0.25 295);
--color-thv06-yellow: #ffee00;
--color-thv06-yellow: oklch(0.93 0.2 106);
--color-thv06-ice: #a5f3fc;
--color-thv06-ice: oklch(0.9 0.08 200);
--font-thv06-sans: 'Space Grotesk', system-ui, sans-serif;
--font-thv06-mono: 'JetBrains Mono', ui-monospace, monospace;
--animate-thv06-flicker: thv06-flicker 2s linear infinite;
--animate-thv06-hue: thv06-hue 3s linear infinite;
}
.thv-06 {
width: 100%;
min-height: 100svh;
}
.thv-06 ::selection {
background: var(--color-thv06-pink);
color: #fff;
}
@keyframes thv06-flicker {
0%,
19%,
21%,
23%,
25%,
54%,
56%,
100% {
text-shadow: 0 0 4px #fff, 0 0 18px var(--color-thv06-green), 0 0 50px var(--color-thv06-green);
color: #fff;
}
20%,
24%,
55% {
text-shadow: none;
color: var(--color-thv06-green);
}
}
@keyframes thv06-hue {
0% {
filter: hue-rotate(0deg);
}
100% {
filter: hue-rotate(360deg);
}
}
```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 Neon Glow Text Hover Effect
Source: https://codefronts.com/motion/tailwind-css-hover-effects/tailwind-neon-glow-text-hover-effect/
Six electroluminescent text hovers — classic tube, flicker, hue cycle, multi-layer bloom, retro arcade and icy frost. Stacked text-shadow has no utility form and gets none here; what the port gains is that the dim resting glow and the lit hover glow are adjacent, so the pair is edited together.
## HTML
```html
<section class="thv-06 w-full min-h-svh grid place-items-center bg-thv06-bg font-thv06-sans px-6 py-14">
<div class="w-[min(720px,100%)] flex flex-col gap-3">
<div class="flex flex-wrap items-center justify-between gap-5 px-10 py-8 rounded-xl bg-white/[0.02] border border-white/[0.06]">
<span tabindex="0" class="inline-block text-[clamp(1.6rem,4vw,2.4rem)] font-bold tracking-[0.15em] text-thv06-pink rounded-xs [text-shadow:0_0_4px_#ff00de44] transition-[text-shadow,color] duration-400 hover:text-white hover:[text-shadow:0_0_4px_#fff,0_0_16px_var(--color-thv06-pink),0_0_40px_var(--color-thv06-pink),0_0_80px_var(--color-thv06-pink)] focus-visible:text-white focus-visible:[text-shadow:0_0_4px_#fff,0_0_16px_var(--color-thv06-pink),0_0_40px_var(--color-thv06-pink)] focus-visible:outline-2 focus-visible:outline-offset-6 focus-visible:outline-thv06-pink motion-reduce:transition-none">NEON</span>
<span class="shrink-0 text-[11px] tracking-[0.12em] uppercase text-thv06-dim">classic tube glow</span>
</div>
<div class="flex flex-wrap items-center justify-between gap-5 px-10 py-8 rounded-xl bg-white/[0.02] border border-white/[0.06]">
<span tabindex="0" class="inline-block text-[clamp(1.6rem,4vw,2.4rem)] font-bold tracking-[0.15em] text-thv06-green rounded-xs transition-[text-shadow,color] duration-300 hover:text-white hover:[text-shadow:0_0_4px_#fff,0_0_18px_var(--color-thv06-green),0_0_50px_var(--color-thv06-green)] hover:animate-thv06-flicker focus-visible:text-white focus-visible:[text-shadow:0_0_4px_#fff,0_0_18px_var(--color-thv06-green),0_0_50px_var(--color-thv06-green)] focus-visible:outline-2 focus-visible:outline-offset-6 focus-visible:outline-thv06-green motion-reduce:hover:animate-none">FLICKER</span>
<span class="shrink-0 text-[11px] tracking-[0.12em] uppercase text-thv06-dim">pulsing flicker</span>
</div>
<div class="flex flex-wrap items-center justify-between gap-5 px-10 py-8 rounded-xl bg-white/[0.02] border border-white/[0.06]">
<span tabindex="0" class="inline-block text-[clamp(1.6rem,4vw,2.4rem)] font-bold tracking-[0.15em] text-thv06-orange rounded-xs [text-shadow:0_0_4px_#ff440033] transition-[text-shadow,color] duration-400 hover:text-white hover:[text-shadow:0_0_6px_#fff,0_0_20px_var(--color-thv06-orange),0_0_60px_var(--color-thv06-orange)] hover:animate-thv06-hue focus-visible:text-white focus-visible:[text-shadow:0_0_6px_#fff,0_0_20px_var(--color-thv06-orange),0_0_60px_var(--color-thv06-orange)] focus-visible:outline-2 focus-visible:outline-offset-6 focus-visible:outline-thv06-orange motion-reduce:hover:animate-none">SPECTRUM</span>
<span class="shrink-0 text-[11px] tracking-[0.12em] uppercase text-thv06-dim">hue-rotate cycle</span>
</div>
<div class="flex flex-wrap items-center justify-between gap-5 px-10 py-8 rounded-xl bg-white/[0.02] border border-white/[0.06]">
<span tabindex="0" class="inline-block text-[clamp(1.6rem,4vw,2.4rem)] font-bold tracking-[0.15em] text-thv06-violet rounded-xs [text-shadow:0_0_4px_#7c3aed44] transition-[text-shadow,color] duration-500 ease-[cubic-bezier(.4,0,.2,1)] hover:text-white hover:[text-shadow:0_0_2px_#fff,0_0_8px_#a78bfa,0_0_20px_#7c3aed,0_0_50px_#6d28d9,0_0_100px_#5b21b6,0_0_180px_#4c1d95] focus-visible:text-white focus-visible:[text-shadow:0_0_2px_#fff,0_0_8px_#a78bfa,0_0_20px_#7c3aed,0_0_50px_#6d28d9] focus-visible:outline-2 focus-visible:outline-offset-6 focus-visible:outline-thv06-violet motion-reduce:transition-none">BLOOM</span>
<span class="shrink-0 text-[11px] tracking-[0.12em] uppercase text-thv06-dim">multi-layer bloom</span>
</div>
<div class="flex flex-wrap items-center justify-between gap-5 px-10 py-8 rounded-xl bg-white/[0.02] border border-white/[0.06]">
<span tabindex="0" class="inline-block font-thv06-mono text-[clamp(1.4rem,3.6vw,2.1rem)] font-bold tracking-[0.15em] text-thv06-yellow rounded-xs [text-shadow:0_0_4px_#ffee0044] transition-[text-shadow,color] duration-250 ease-[steps(2)] hover:text-white hover:[text-shadow:2px_2px_0_#ff6600,0_0_10px_var(--color-thv06-yellow),0_0_30px_var(--color-thv06-yellow),0_0_60px_#ff6600] focus-visible:text-white focus-visible:[text-shadow:2px_2px_0_#ff6600,0_0_10px_var(--color-thv06-yellow),0_0_30px_var(--color-thv06-yellow)] focus-visible:outline-2 focus-visible:outline-offset-6 focus-visible:outline-thv06-yellow motion-reduce:transition-none">HI-SCORE</span>
<span class="shrink-0 text-[11px] tracking-[0.12em] uppercase text-thv06-dim">retro arcade</span>
</div>
<div class="flex flex-wrap items-center justify-between gap-5 px-10 py-8 rounded-xl bg-white/[0.02] border border-white/[0.06]">
<span tabindex="0" class="inline-block text-[clamp(1.6rem,4vw,2.4rem)] font-bold tracking-[0.15em] text-thv06-ice rounded-xs [text-shadow:0_0_4px_#a5f3fc44] transition-[text-shadow,color,letter-spacing] duration-500 hover:text-white hover:tracking-[0.25em] hover:[text-shadow:0_0_4px_#fff,0_0_16px_var(--color-thv06-ice),0_0_40px_#0ea5e9,0_0_80px_#0369a1] focus-visible:text-white focus-visible:tracking-[0.25em] focus-visible:[text-shadow:0_0_4px_#fff,0_0_16px_var(--color-thv06-ice),0_0_40px_#0ea5e9] focus-visible:outline-2 focus-visible:outline-offset-6 focus-visible:outline-thv06-ice motion-reduce:transition-none">ICE</span>
<span class="shrink-0 text-[11px] tracking-[0.12em] uppercase text-thv06-dim">icy frost glow</span>
</div>
</div>
</section>
```
## CSS
```css
@import "tailwindcss";
@theme {
--color-thv06-bg: #020204;
--color-thv06-bg: oklch(0.09 0.01 285);
--color-thv06-dim: #3a3a4a;
--color-thv06-dim: oklch(0.37 0.02 285);
--color-thv06-pink: #ff00de;
--color-thv06-pink: oklch(0.66 0.35 330);
--color-thv06-green: #39ff14;
--color-thv06-green: oklch(0.88 0.29 135);
--color-thv06-orange: #ff4400;
--color-thv06-orange: oklch(0.65 0.24 37);
--color-thv06-violet: #7c3aed;
--color-thv06-violet: oklch(0.54 0.25 295);
--color-thv06-yellow: #ffee00;
--color-thv06-yellow: oklch(0.93 0.2 106);
--color-thv06-ice: #a5f3fc;
--color-thv06-ice: oklch(0.9 0.08 200);
--font-thv06-sans: 'Space Grotesk', system-ui, sans-serif;
--font-thv06-mono: 'JetBrains Mono', ui-monospace, monospace;
--animate-thv06-flicker: thv06-flicker 2s linear infinite;
--animate-thv06-hue: thv06-hue 3s linear infinite;
}
.thv-06 {
width: 100%;
min-height: 100svh;
}
.thv-06 ::selection {
background: var(--color-thv06-pink);
color: #fff;
}
@keyframes thv06-flicker {
0%,
19%,
21%,
23%,
25%,
54%,
56%,
100% {
text-shadow: 0 0 4px #fff, 0 0 18px var(--color-thv06-green), 0 0 50px var(--color-thv06-green);
color: #fff;
}
20%,
24%,
55% {
text-shadow: none;
color: var(--color-thv06-green);
}
}
@keyframes thv06-hue {
0% {
filter: hue-rotate(0deg);
}
100% {
filter: hue-rotate(360deg);
}
}
```How this works
The glow is a stack, and stacks stay arbitrary. Three to six text-shadow layers at increasing radii are authored values, not design-scale tokens. What Tailwind contributes is the variant: hover:[text-shadow:...] sits inches from the resting [text-shadow:0_0_4px_#ff00de44], so the two can't drift.
Colours come from @theme, inside the arbitrary value. var(--color-thv06-pink) works inside the bracket, so one token edit recolours every layer — the CSS original's best property, preserved.
Flicker and hue-rotate become animate- utilities. Both keyframes live in the stylesheet and are registered in @theme; the markup just says hover:animate-thv06-flicker.
Make it yours
- Add ambient fill with a fourth layer:
0_0_120px_var(--color-thv06-pink). - Harder blink: change the flicker
@themeentry to.15s steps(2) infinite. - Retube the whole demo through
--color-thv06-*— every layer reads the token.
Gotchas — read before shipping
- Six shadow layers repaint on every frame; keep continuous flicker to one element per viewport.
- Neon only reads on a very dark ground — the
bg-thv06-bgtoken is near-black on purpose. filter: hue-rotaterotates the element and every child; keep the glowing word childless.
Browser support
| Chrome | Safari | Firefox | Edge |
|---|---|---|---|
| 111+ | 16.4+ | 128+ | 111+ |
text-shadow transitions and hue-rotate are universally supported; the floor is Tailwind v4's generated sheet.