14 / 31
All 31 in 31 Tailwind CSS Hero Sections
- 01Centered Hero Section in Tailwind CSS with Serif Headline & Dual CTA
- 02Tailwind CSS Split Hero Section with Dashboard Mockup
- 03Tailwind CSS Animated Gradient Mesh Hero Section
- 04Glassmorphism Hero Section in Tailwind CSS with Aurora Background
- 05Tailwind CSS Developer Hero Section with Terminal Window
- 06Tailwind Hero Section with Animated Geometric Shapes Background
- 07Tailwind CSS Hero Section with Star Rating & Logo Cloud
- 08Tailwind CSS Animated Headline Hero with Staggered Word Reveal
- 09Before and After Image Comparison Slider Hero in Tailwind CSS
- 10Full-Screen Tailwind Hero with Animated Scroll Down Indicator
- 11Magazine Cover Hero Section in Tailwind CSS
- 12Asymmetric Typography Hero Section in Tailwind CSS
- 13Tailwind CSS Hero Section with Oversized Background Number
- 14Infinite Scrolling Marquee Hero Section in Tailwind CSS
- 15Tailwind CSS Hero Section with Image & Overlay Card
- 16Brutalist Hero Section in Tailwind CSS
- 17Vertical Text Hero Section in Tailwind CSS (Japanese Writing Mode)
- 18Kinetic Typography Hero in Tailwind CSS with Animated Letters
- 19Bento Grid Hero Section in Tailwind CSS
- 20Animated Gradient Text Hero Section in Tailwind CSS
- 21Tailwind CSS Product Hero with Floating Feature Badges
- 22Tailwind CSS Hero Section with Pricing Card
- 23Mobile App Landing Page Hero in Tailwind CSS with App Store Buttons
- 24Neon Glow Hero Section in Tailwind CSS (Cyberpunk)
- 25Parallax Mountain Landscape Hero in Tailwind CSS
- 26Isometric Illustration Hero Section in Tailwind CSS
- 273D Card Stack Hero in Tailwind CSS with Hover Fan-Out
- 28Animated Starfield Background Hero in Tailwind CSS
- 29Glitch Text Effect Hero Section in Tailwind CSS
- 30Animated Conic Gradient Ring Hero in Tailwind CSS
- 31Mouse-Tracking Liquid Glass Lens Hero in Tailwind CSS
Infinite Scrolling Marquee Hero Section in Tailwind CSS
A streetwear drop hero — two counter-scrolling marquee bands frame the drop details, a countdown-style date strip and a hot CTA. Tangerine on chocolate. Seamless loops (no jump), pause on hover, and frozen under reduced motion.
Complete Tailwind CSS landing page templates in HTML, React, Next.js and Vue · from $49
Cruip · Affiliate link
The code
<section class="ths-14 flex w-full min-h-svh flex-col justify-between overflow-hidden bg-ths14-bg py-8 font-ths14-sans text-ths14-cream" aria-label="Marquee hero">
<div aria-hidden="true" class="group -mx-[5%] -rotate-2 border-y-4 border-ths14-bg bg-ths14-tang py-4 text-ths14-bg">
<div class="flex w-max animate-ths14-roll font-ths14-display text-[clamp(32px,5.5vw,60px)] leading-none font-black tracking-[-0.01em] whitespace-nowrap italic group-hover:[animation-play-state:paused] motion-reduce:animate-none">
<span class="pr-8">EVERYTHING SELLS OUT ✦ EVERYTHING SELLS OUT ✦ EVERYTHING SELLS OUT ✦ EVERYTHING SELLS OUT ✦</span>
<span class="pr-8">EVERYTHING SELLS OUT ✦ EVERYTHING SELLS OUT ✦ EVERYTHING SELLS OUT ✦ EVERYTHING SELLS OUT ✦</span>
</div>
</div>
<div class="grid flex-1 place-items-center px-5 py-14 text-center">
<div class="max-w-2xl">
<h1 class="font-ths14-display text-[clamp(38px,6vw,68px)] leading-[1.02] font-black tracking-[-0.025em] text-balance [font-stretch:110%]">Drop 04. <em class="text-ths14-amber">Tuesday 11am EST.</em></h1>
<p class="mx-auto mt-4 max-w-md text-[17px] leading-relaxed text-ths14-mut">72 pieces. No restock. No back-orders. No DM begging.</p>
<ul class="mt-7 flex flex-wrap justify-center gap-2 font-ths14-mono text-[11px] font-bold tracking-[0.14em] uppercase">
<li class="border border-ths14-tang/60 px-3 py-1.5 text-ths14-tang">72 units</li>
<li class="border border-ths14-tang/60 px-3 py-1.5 text-ths14-tang">Limit 1 per customer</li>
<li class="border border-ths14-tang/60 px-3 py-1.5 text-ths14-tang">Ships 48h</li>
</ul>
<a href="#join" class="mt-8 inline-flex min-h-12 items-center gap-2 bg-ths14-amber px-8 text-[15px] font-extrabold tracking-[0.04em] text-ths14-bg transition hover:bg-ths14-cream focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-ths14-amber motion-reduce:transition-none">⏰ Set the alarm</a>
</div>
</div>
<div aria-hidden="true" class="group -mx-[5%] rotate-1 border-y-4 border-ths14-tang bg-ths14-bg py-4 text-ths14-tang">
<div class="flex w-max animate-ths14-roll font-ths14-display text-[clamp(32px,5.5vw,60px)] leading-none font-black whitespace-nowrap italic [animation-direction:reverse] group-hover:[animation-play-state:paused] motion-reduce:animate-none">
<span class="pr-8">NO RESTOCK ✦ NO RESTOCK ✦ NO RESTOCK ✦ NO RESTOCK ✦ NO RESTOCK ✦ NO RESTOCK ✦</span>
<span class="pr-8">NO RESTOCK ✦ NO RESTOCK ✦ NO RESTOCK ✦ NO RESTOCK ✦ NO RESTOCK ✦ NO RESTOCK ✦</span>
</div>
</div>
</section><section class="ths-14 flex w-full min-h-svh flex-col justify-between overflow-hidden bg-ths14-bg py-8 font-ths14-sans text-ths14-cream" aria-label="Marquee hero">
<div aria-hidden="true" class="group -mx-[5%] -rotate-2 border-y-4 border-ths14-bg bg-ths14-tang py-4 text-ths14-bg">
<div class="flex w-max animate-ths14-roll font-ths14-display text-[clamp(32px,5.5vw,60px)] leading-none font-black tracking-[-0.01em] whitespace-nowrap italic group-hover:[animation-play-state:paused] motion-reduce:animate-none">
<span class="pr-8">EVERYTHING SELLS OUT ✦ EVERYTHING SELLS OUT ✦ EVERYTHING SELLS OUT ✦ EVERYTHING SELLS OUT ✦</span>
<span class="pr-8">EVERYTHING SELLS OUT ✦ EVERYTHING SELLS OUT ✦ EVERYTHING SELLS OUT ✦ EVERYTHING SELLS OUT ✦</span>
</div>
</div>
<div class="grid flex-1 place-items-center px-5 py-14 text-center">
<div class="max-w-2xl">
<h1 class="font-ths14-display text-[clamp(38px,6vw,68px)] leading-[1.02] font-black tracking-[-0.025em] text-balance [font-stretch:110%]">Drop 04. <em class="text-ths14-amber">Tuesday 11am EST.</em></h1>
<p class="mx-auto mt-4 max-w-md text-[17px] leading-relaxed text-ths14-mut">72 pieces. No restock. No back-orders. No DM begging.</p>
<ul class="mt-7 flex flex-wrap justify-center gap-2 font-ths14-mono text-[11px] font-bold tracking-[0.14em] uppercase">
<li class="border border-ths14-tang/60 px-3 py-1.5 text-ths14-tang">72 units</li>
<li class="border border-ths14-tang/60 px-3 py-1.5 text-ths14-tang">Limit 1 per customer</li>
<li class="border border-ths14-tang/60 px-3 py-1.5 text-ths14-tang">Ships 48h</li>
</ul>
<a href="#join" class="mt-8 inline-flex min-h-12 items-center gap-2 bg-ths14-amber px-8 text-[15px] font-extrabold tracking-[0.04em] text-ths14-bg transition hover:bg-ths14-cream focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-ths14-amber motion-reduce:transition-none">⏰ Set the alarm</a>
</div>
</div>
<div aria-hidden="true" class="group -mx-[5%] rotate-1 border-y-4 border-ths14-tang bg-ths14-bg py-4 text-ths14-tang">
<div class="flex w-max animate-ths14-roll font-ths14-display text-[clamp(32px,5.5vw,60px)] leading-none font-black whitespace-nowrap italic [animation-direction:reverse] group-hover:[animation-play-state:paused] motion-reduce:animate-none">
<span class="pr-8">NO RESTOCK ✦ NO RESTOCK ✦ NO RESTOCK ✦ NO RESTOCK ✦ NO RESTOCK ✦ NO RESTOCK ✦</span>
<span class="pr-8">NO RESTOCK ✦ NO RESTOCK ✦ NO RESTOCK ✦ NO RESTOCK ✦ NO RESTOCK ✦ NO RESTOCK ✦</span>
</div>
</div>
</section>@import "tailwindcss";
@theme {
--color-ths14-bg: #2a1410;
--color-ths14-bg: oklch(0.222 0.037 31.2);
--color-ths14-cream: #ffe4d6;
--color-ths14-cream: oklch(0.937 0.035 49.2);
--color-ths14-mut: #d6b8a9;
--color-ths14-mut: oklch(0.804 0.04 48.2);
--color-ths14-tang: #f04e23;
--color-ths14-tang: oklch(0.645 0.205 35.1);
--color-ths14-amber: #f5b148;
--color-ths14-amber: oklch(0.806 0.142 74.7);
--font-ths14-display: 'Archivo', system-ui, sans-serif;
--font-ths14-sans: 'Geist', system-ui, sans-serif;
--font-ths14-mono: 'JetBrains Mono', ui-monospace, monospace;
--animate-ths14-roll: ths14-roll 24s linear infinite;
@keyframes ths14-roll {
to {
transform: translateX(-50%);
}
}
}
/* Root rule: the full-bleed contract, stated in CSS as well as in the markup's utilities, so the
stage is sized before the browser build compiles. */
.ths-14 {
width: 100%;
min-height: 100svh;
}@import "tailwindcss";
@theme {
--color-ths14-bg: #2a1410;
--color-ths14-bg: oklch(0.222 0.037 31.2);
--color-ths14-cream: #ffe4d6;
--color-ths14-cream: oklch(0.937 0.035 49.2);
--color-ths14-mut: #d6b8a9;
--color-ths14-mut: oklch(0.804 0.04 48.2);
--color-ths14-tang: #f04e23;
--color-ths14-tang: oklch(0.645 0.205 35.1);
--color-ths14-amber: #f5b148;
--color-ths14-amber: oklch(0.806 0.142 74.7);
--font-ths14-display: 'Archivo', system-ui, sans-serif;
--font-ths14-sans: 'Geist', system-ui, sans-serif;
--font-ths14-mono: 'JetBrains Mono', ui-monospace, monospace;
--animate-ths14-roll: ths14-roll 24s linear infinite;
@keyframes ths14-roll {
to {
transform: translateX(-50%);
}
}
}
/* Root rule: the full-bleed contract, stated in CSS as well as in the markup's utilities, so the
stage is sized before the browser build compiles. */
.ths-14 {
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-ths14-bg: #2a1410;
--color-ths14-bg: oklch(0.222 0.037 31.2);
--color-ths14-cream: #ffe4d6;
--color-ths14-cream: oklch(0.937 0.035 49.2);
--color-ths14-mut: #d6b8a9;
--color-ths14-mut: oklch(0.804 0.04 48.2);
--color-ths14-tang: #f04e23;
--color-ths14-tang: oklch(0.645 0.205 35.1);
--color-ths14-amber: #f5b148;
--color-ths14-amber: oklch(0.806 0.142 74.7);
--font-ths14-display: 'Archivo', system-ui, sans-serif;
--font-ths14-sans: 'Geist', system-ui, sans-serif;
--font-ths14-mono: 'JetBrains Mono', ui-monospace, monospace;
--animate-ths14-roll: ths14-roll 24s linear infinite;
@keyframes ths14-roll {
to {
transform: translateX(-50%);
}
}
}
/* Root rule: the full-bleed contract, stated in CSS as well as in the markup's utilities, so the
stage is sized before the browser build compiles. */
.ths-14 {
width: 100%;
min-height: 100svh;
}@import "tailwindcss";
@theme {
--color-ths14-bg: #2a1410;
--color-ths14-bg: oklch(0.222 0.037 31.2);
--color-ths14-cream: #ffe4d6;
--color-ths14-cream: oklch(0.937 0.035 49.2);
--color-ths14-mut: #d6b8a9;
--color-ths14-mut: oklch(0.804 0.04 48.2);
--color-ths14-tang: #f04e23;
--color-ths14-tang: oklch(0.645 0.205 35.1);
--color-ths14-amber: #f5b148;
--color-ths14-amber: oklch(0.806 0.142 74.7);
--font-ths14-display: 'Archivo', system-ui, sans-serif;
--font-ths14-sans: 'Geist', system-ui, sans-serif;
--font-ths14-mono: 'JetBrains Mono', ui-monospace, monospace;
--animate-ths14-roll: ths14-roll 24s linear infinite;
@keyframes ths14-roll {
to {
transform: translateX(-50%);
}
}
}
/* Root rule: the full-bleed contract, stated in CSS as well as in the markup's utilities, so the
stage is sized before the browser build compiles. */
.ths-14 {
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=Archivo:ital,wdth,wght@0,62..125,700..900;1,62..125,800..900&family=Geist:wght@400;500;600&family=JetBrains+Mono:wght@500;700&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=Archivo:ital,wdth,wght@0,62..125,700..900;1,62..125,800..900&family=Geist:wght@400;500;600&family=JetBrains+Mono:wght@500;700&display=swap">What changed in the port
Which parts became utilities, which stayed CSS, and why.
.hs-14__l span { animation-direction: reverse }became[animation-direction:reverse]on the track.- Bug fix from the CSS original: the 32px flex gap was excluded from the
-100%translate, so the loop jumped every cycle; the singlew-maxtrack moving-50%is seamless. - UI upgrade: tilted tape bands, pause-on-hover, drop-detail chips, and muted copy raised from
#c8a899to#d6b8a9(9:1).
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: Infinite Scrolling Marquee Hero Section in Tailwind CSS
Source: https://codefronts.com/layouts/tailwind-css-hero-sections/tailwind-infinite-scrolling-marquee-hero-section/
A streetwear drop hero — two counter-scrolling marquee bands frame the drop details, a countdown-style date strip and a hot CTA. Tangerine on chocolate. Seamless loops (no jump), pause on hover, and frozen under reduced motion.
## HTML
```html
<section class="ths-14 flex w-full min-h-svh flex-col justify-between overflow-hidden bg-ths14-bg py-8 font-ths14-sans text-ths14-cream" aria-label="Marquee hero">
<div aria-hidden="true" class="group -mx-[5%] -rotate-2 border-y-4 border-ths14-bg bg-ths14-tang py-4 text-ths14-bg">
<div class="flex w-max animate-ths14-roll font-ths14-display text-[clamp(32px,5.5vw,60px)] leading-none font-black tracking-[-0.01em] whitespace-nowrap italic group-hover:[animation-play-state:paused] motion-reduce:animate-none">
<span class="pr-8">EVERYTHING SELLS OUT ✦ EVERYTHING SELLS OUT ✦ EVERYTHING SELLS OUT ✦ EVERYTHING SELLS OUT ✦</span>
<span class="pr-8">EVERYTHING SELLS OUT ✦ EVERYTHING SELLS OUT ✦ EVERYTHING SELLS OUT ✦ EVERYTHING SELLS OUT ✦</span>
</div>
</div>
<div class="grid flex-1 place-items-center px-5 py-14 text-center">
<div class="max-w-2xl">
<h1 class="font-ths14-display text-[clamp(38px,6vw,68px)] leading-[1.02] font-black tracking-[-0.025em] text-balance [font-stretch:110%]">Drop 04. <em class="text-ths14-amber">Tuesday 11am EST.</em></h1>
<p class="mx-auto mt-4 max-w-md text-[17px] leading-relaxed text-ths14-mut">72 pieces. No restock. No back-orders. No DM begging.</p>
<ul class="mt-7 flex flex-wrap justify-center gap-2 font-ths14-mono text-[11px] font-bold tracking-[0.14em] uppercase">
<li class="border border-ths14-tang/60 px-3 py-1.5 text-ths14-tang">72 units</li>
<li class="border border-ths14-tang/60 px-3 py-1.5 text-ths14-tang">Limit 1 per customer</li>
<li class="border border-ths14-tang/60 px-3 py-1.5 text-ths14-tang">Ships 48h</li>
</ul>
<a href="#join" class="mt-8 inline-flex min-h-12 items-center gap-2 bg-ths14-amber px-8 text-[15px] font-extrabold tracking-[0.04em] text-ths14-bg transition hover:bg-ths14-cream focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-ths14-amber motion-reduce:transition-none">⏰ Set the alarm</a>
</div>
</div>
<div aria-hidden="true" class="group -mx-[5%] rotate-1 border-y-4 border-ths14-tang bg-ths14-bg py-4 text-ths14-tang">
<div class="flex w-max animate-ths14-roll font-ths14-display text-[clamp(32px,5.5vw,60px)] leading-none font-black whitespace-nowrap italic [animation-direction:reverse] group-hover:[animation-play-state:paused] motion-reduce:animate-none">
<span class="pr-8">NO RESTOCK ✦ NO RESTOCK ✦ NO RESTOCK ✦ NO RESTOCK ✦ NO RESTOCK ✦ NO RESTOCK ✦</span>
<span class="pr-8">NO RESTOCK ✦ NO RESTOCK ✦ NO RESTOCK ✦ NO RESTOCK ✦ NO RESTOCK ✦ NO RESTOCK ✦</span>
</div>
</div>
</section>
```
## CSS
```css
@import "tailwindcss";
@theme {
--color-ths14-bg: #2a1410;
--color-ths14-bg: oklch(0.222 0.037 31.2);
--color-ths14-cream: #ffe4d6;
--color-ths14-cream: oklch(0.937 0.035 49.2);
--color-ths14-mut: #d6b8a9;
--color-ths14-mut: oklch(0.804 0.04 48.2);
--color-ths14-tang: #f04e23;
--color-ths14-tang: oklch(0.645 0.205 35.1);
--color-ths14-amber: #f5b148;
--color-ths14-amber: oklch(0.806 0.142 74.7);
--font-ths14-display: 'Archivo', system-ui, sans-serif;
--font-ths14-sans: 'Geist', system-ui, sans-serif;
--font-ths14-mono: 'JetBrains Mono', ui-monospace, monospace;
--animate-ths14-roll: ths14-roll 24s linear infinite;
@keyframes ths14-roll {
to {
transform: translateX(-50%);
}
}
}
/* Root rule: the full-bleed contract, stated in CSS as well as in the markup's utilities, so the
stage is sized before the browser build compiles. */
.ths-14 {
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: Infinite Scrolling Marquee Hero Section in Tailwind CSS
Source: https://codefronts.com/layouts/tailwind-css-hero-sections/tailwind-infinite-scrolling-marquee-hero-section/
A streetwear drop hero — two counter-scrolling marquee bands frame the drop details, a countdown-style date strip and a hot CTA. Tangerine on chocolate. Seamless loops (no jump), pause on hover, and frozen under reduced motion.
## HTML
```html
<section class="ths-14 flex w-full min-h-svh flex-col justify-between overflow-hidden bg-ths14-bg py-8 font-ths14-sans text-ths14-cream" aria-label="Marquee hero">
<div aria-hidden="true" class="group -mx-[5%] -rotate-2 border-y-4 border-ths14-bg bg-ths14-tang py-4 text-ths14-bg">
<div class="flex w-max animate-ths14-roll font-ths14-display text-[clamp(32px,5.5vw,60px)] leading-none font-black tracking-[-0.01em] whitespace-nowrap italic group-hover:[animation-play-state:paused] motion-reduce:animate-none">
<span class="pr-8">EVERYTHING SELLS OUT ✦ EVERYTHING SELLS OUT ✦ EVERYTHING SELLS OUT ✦ EVERYTHING SELLS OUT ✦</span>
<span class="pr-8">EVERYTHING SELLS OUT ✦ EVERYTHING SELLS OUT ✦ EVERYTHING SELLS OUT ✦ EVERYTHING SELLS OUT ✦</span>
</div>
</div>
<div class="grid flex-1 place-items-center px-5 py-14 text-center">
<div class="max-w-2xl">
<h1 class="font-ths14-display text-[clamp(38px,6vw,68px)] leading-[1.02] font-black tracking-[-0.025em] text-balance [font-stretch:110%]">Drop 04. <em class="text-ths14-amber">Tuesday 11am EST.</em></h1>
<p class="mx-auto mt-4 max-w-md text-[17px] leading-relaxed text-ths14-mut">72 pieces. No restock. No back-orders. No DM begging.</p>
<ul class="mt-7 flex flex-wrap justify-center gap-2 font-ths14-mono text-[11px] font-bold tracking-[0.14em] uppercase">
<li class="border border-ths14-tang/60 px-3 py-1.5 text-ths14-tang">72 units</li>
<li class="border border-ths14-tang/60 px-3 py-1.5 text-ths14-tang">Limit 1 per customer</li>
<li class="border border-ths14-tang/60 px-3 py-1.5 text-ths14-tang">Ships 48h</li>
</ul>
<a href="#join" class="mt-8 inline-flex min-h-12 items-center gap-2 bg-ths14-amber px-8 text-[15px] font-extrabold tracking-[0.04em] text-ths14-bg transition hover:bg-ths14-cream focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-ths14-amber motion-reduce:transition-none">⏰ Set the alarm</a>
</div>
</div>
<div aria-hidden="true" class="group -mx-[5%] rotate-1 border-y-4 border-ths14-tang bg-ths14-bg py-4 text-ths14-tang">
<div class="flex w-max animate-ths14-roll font-ths14-display text-[clamp(32px,5.5vw,60px)] leading-none font-black whitespace-nowrap italic [animation-direction:reverse] group-hover:[animation-play-state:paused] motion-reduce:animate-none">
<span class="pr-8">NO RESTOCK ✦ NO RESTOCK ✦ NO RESTOCK ✦ NO RESTOCK ✦ NO RESTOCK ✦ NO RESTOCK ✦</span>
<span class="pr-8">NO RESTOCK ✦ NO RESTOCK ✦ NO RESTOCK ✦ NO RESTOCK ✦ NO RESTOCK ✦ NO RESTOCK ✦</span>
</div>
</div>
</section>
```
## CSS
```css
@import "tailwindcss";
@theme {
--color-ths14-bg: #2a1410;
--color-ths14-bg: oklch(0.222 0.037 31.2);
--color-ths14-cream: #ffe4d6;
--color-ths14-cream: oklch(0.937 0.035 49.2);
--color-ths14-mut: #d6b8a9;
--color-ths14-mut: oklch(0.804 0.04 48.2);
--color-ths14-tang: #f04e23;
--color-ths14-tang: oklch(0.645 0.205 35.1);
--color-ths14-amber: #f5b148;
--color-ths14-amber: oklch(0.806 0.142 74.7);
--font-ths14-display: 'Archivo', system-ui, sans-serif;
--font-ths14-sans: 'Geist', system-ui, sans-serif;
--font-ths14-mono: 'JetBrains Mono', ui-monospace, monospace;
--animate-ths14-roll: ths14-roll 24s linear infinite;
@keyframes ths14-roll {
to {
transform: translateX(-50%);
}
}
}
/* Root rule: the full-bleed contract, stated in CSS as well as in the markup's utilities, so the
stage is sized before the browser build compiles. */
.ths-14 {
width: 100%;
min-height: 100svh;
}
```How this works
Why the original jumped. Each span translated by -100% of itself, but the 32px gap between them was not part of that distance — so every loop snapped 32px. Here one w-max track holds both copies (each with trailing padding instead of a gap) and moves by exactly -50%.
Tilted tape. The bands are rotated -rotate-2 / rotate-1 and widened with -mx-[5%] so no corner shows, giving the hero a taped-poster energy.
Make it yours
- Speed: change
24sin--animate-ths14-roll. - Flat bands: remove the
rotate-*utilities. - Swap copy in both duplicates — they must match for the loop to stay seamless.
Gotchas — read before shipping
- Each copy must be wider than the viewport; repeat the phrase until it is.
- The marquee text is decorative and
aria-hidden; anything essential must also appear in the main copy.
Browser support
| Chrome | Safari | Firefox | Edge |
|---|---|---|---|
| 111+ | 16.4+ | 128+ | 111+ |
Plain transforms and keyframes; Tailwind v4's floor is the only requirement.