28 / 33
All 33 in 33 Tailwind CSS Card Hover Effects
- 01Tailwind 3D Tilt & Parallax Card with Depth Layers
- 02Tailwind Glowing Gradient & Glassmorphic Border Card
- 03Tailwind Image Zoom Card with Slide-Up Content Reveal
- 04Tailwind 3D Flip Card (Front to Back) with backface-visibility
- 05Tailwind Sibling De-emphasis Pricing Grid with has-hover
- 06Tailwind Minimalist Elevation Card with Layered Dynamic Shadows
- 07Tailwind Elastic Lift Card with Spring Cubic-Bezier
- 08Tailwind Animated Conic Gradient Border Card with @property
- 09Tailwind Stacked Layer Reveal Card (Fanned Risograph Deck)
- 10Tailwind Holographic Foil Shimmer Card with mix-blend-mode
- 11Tailwind Curtain Reveal Card (Parting Velvet Halves)
- 12Tailwind Corner Peel Card with clip-path Triangles
- 13Tailwind Neon Sign Card with Layered Text-Shadow Glow
- 14Tailwind CRT Scanline Terminal Card with Sweeping Beam
- 15Tailwind Depth Parallax Landscape Card with Layer Multipliers
- 16Tailwind Cursor Spotlight Card with Masked Border Highlight
- 17Tailwind 3D Tilt Product Card with Specular Glare
- 18Tailwind Slide-Up Panel Card with Peek Header Swap
- 19Tailwind Credit Card Flip with Magnetic Strip & CVV
- 20Tailwind RGB Channel-Split Glitch Card
- 21Tailwind Rotating Conic Aura Card with Blurred Gradient Bloom
- 22Tailwind Blob-to-Rectangle Border Morph Card
- 23Tailwind Magnetic Float Orb Card with Pointer Attraction
- 24Tailwind Typewriter Reveal Card with Steps Animation & Caret
- 25Tailwind Magazine Overlay Slide Card (Full-Face Panel Takeover)
- 26Tailwind Breathing Film Grain Card with SVG Turbulence Noise
- 27Tailwind Frosted Glass Intensify Card with Deepening Backdrop Blur
- 28Tailwind Blueprint Reveal Card with Circular clip-path Wipe
- 29Tailwind Cursor-Anchored Shockwave Ripple Card
- 30Tailwind Color-Burn Ignition Card with Grayscale-to-Fire Hover
- 31Tailwind Prismatic Light Sweep Card with Screen Blend Bar
- 32Tailwind Book Cover Open Card with Hinged 3D Rotation
- 33Tailwind Drifting Aurora Ribbons Card with Blurred Gradient Bands
Tailwind Blueprint Reveal Card with Circular clip-path Wipe
A product card that wipes into a technical blueprint — grid paper, dimension lines, tolerances — via a circle that expands from the top-right corner. clip-path: circle() animates cleanly because only the radius changes, and that single-value interpolation is what makes the wipe smooth.
Untitled UI Pro: 5,000+ React + Tailwind CSS v4 components · from $349 one-time
Untitled UI React · Affiliate link
The code
<section class="tch-28 w-full min-h-svh grid place-items-center bg-tch28-bg font-tch28-mono p-8">
<article tabindex="0" class="group relative w-[340px] h-[440px] rounded-md overflow-hidden cursor-pointer outline-none bg-tch28-paper border border-tch28-edge shadow-[0_16px_36px_rgb(30_50_80/0.15)] focus-visible:outline-2 focus-visible:outline-tch28-blue focus-visible:outline-offset-4">
<div class="absolute inset-0 z-1 p-[2.4rem] flex flex-col justify-between text-tch28-ink bg-[radial-gradient(circle_at_70%_20%,#f0f3f7,#fdfdfb_60%)] transition-opacity duration-500 group-hover:opacity-0 group-focus-visible:opacity-0">
<span class="text-[0.72rem] tracking-[0.16em] text-tch28-mut">MODEL · ARC-01</span>
<div class="size-[130px] mx-auto my-4 rounded-[50%_50%_50%_12px] bg-[linear-gradient(145deg,#2d6cdf,#16306b)] shadow-[0_14px_30px_rgb(40_80_160/0.35)]"></div>
<div>
<h2 class="font-tch28-display font-bold text-[2rem] leading-none">Arc Pendant</h2>
<p class="text-[0.82rem] leading-[1.6] text-tch28-mut mt-1.5">Hand-blown matte ceramic lamp.</p>
</div>
</div>
<div class="absolute inset-0 z-2 p-[2.4rem] flex flex-col justify-between text-tch28-bink bg-tch28-blue bg-[linear-gradient(rgb(255_255_255/0.12)_1px,transparent_1px),linear-gradient(90deg,rgb(255_255_255/0.12)_1px,transparent_1px)] bg-[length:22px_22px] [clip-path:circle(0%_at_100%_0%)] transition-[clip-path] duration-600 ease-[cubic-bezier(0.65,0,0.35,1)] group-hover:[clip-path:circle(150%_at_100%_0%)] group-focus-visible:[clip-path:circle(150%_at_100%_0%)] motion-reduce:transition-none">
<span class="text-[0.72rem] tracking-[0.16em]">DRAWING № 01 — REV C</span>
<div class="relative size-[130px] mx-auto my-4 rounded-[50%_50%_50%_12px] border-[1.5px] border-tch28-line before:content-[''] before:absolute before:-inset-x-8 before:top-1/2 before:h-px before:bg-[repeating-linear-gradient(90deg,#6f9aff_0_6px,transparent_6px_10px)] after:content-[''] after:absolute after:-inset-y-8 after:left-1/2 after:w-px after:bg-[repeating-linear-gradient(0deg,#6f9aff_0_6px,transparent_6px_10px)]"></div>
<div>
<h2 class="font-tch28-display font-bold text-[1.6rem] leading-[1.05]">Arc Pendant<br>Cross-Section</h2>
<p class="text-[0.74rem] leading-[1.7] text-tch28-spec mt-1.5">Ø 130mm · cord 1.8m<br>E27 · 2700K · matte glaze<br>TOL ±0.5mm</p>
</div>
</div>
</article>
</section><section class="tch-28 w-full min-h-svh grid place-items-center bg-tch28-bg font-tch28-mono p-8">
<article tabindex="0" class="group relative w-[340px] h-[440px] rounded-md overflow-hidden cursor-pointer outline-none bg-tch28-paper border border-tch28-edge shadow-[0_16px_36px_rgb(30_50_80/0.15)] focus-visible:outline-2 focus-visible:outline-tch28-blue focus-visible:outline-offset-4">
<div class="absolute inset-0 z-1 p-[2.4rem] flex flex-col justify-between text-tch28-ink bg-[radial-gradient(circle_at_70%_20%,#f0f3f7,#fdfdfb_60%)] transition-opacity duration-500 group-hover:opacity-0 group-focus-visible:opacity-0">
<span class="text-[0.72rem] tracking-[0.16em] text-tch28-mut">MODEL · ARC-01</span>
<div class="size-[130px] mx-auto my-4 rounded-[50%_50%_50%_12px] bg-[linear-gradient(145deg,#2d6cdf,#16306b)] shadow-[0_14px_30px_rgb(40_80_160/0.35)]"></div>
<div>
<h2 class="font-tch28-display font-bold text-[2rem] leading-none">Arc Pendant</h2>
<p class="text-[0.82rem] leading-[1.6] text-tch28-mut mt-1.5">Hand-blown matte ceramic lamp.</p>
</div>
</div>
<div class="absolute inset-0 z-2 p-[2.4rem] flex flex-col justify-between text-tch28-bink bg-tch28-blue bg-[linear-gradient(rgb(255_255_255/0.12)_1px,transparent_1px),linear-gradient(90deg,rgb(255_255_255/0.12)_1px,transparent_1px)] bg-[length:22px_22px] [clip-path:circle(0%_at_100%_0%)] transition-[clip-path] duration-600 ease-[cubic-bezier(0.65,0,0.35,1)] group-hover:[clip-path:circle(150%_at_100%_0%)] group-focus-visible:[clip-path:circle(150%_at_100%_0%)] motion-reduce:transition-none">
<span class="text-[0.72rem] tracking-[0.16em]">DRAWING № 01 — REV C</span>
<div class="relative size-[130px] mx-auto my-4 rounded-[50%_50%_50%_12px] border-[1.5px] border-tch28-line before:content-[''] before:absolute before:-inset-x-8 before:top-1/2 before:h-px before:bg-[repeating-linear-gradient(90deg,#6f9aff_0_6px,transparent_6px_10px)] after:content-[''] after:absolute after:-inset-y-8 after:left-1/2 after:w-px after:bg-[repeating-linear-gradient(0deg,#6f9aff_0_6px,transparent_6px_10px)]"></div>
<div>
<h2 class="font-tch28-display font-bold text-[1.6rem] leading-[1.05]">Arc Pendant<br>Cross-Section</h2>
<p class="text-[0.74rem] leading-[1.7] text-tch28-spec mt-1.5">Ø 130mm · cord 1.8m<br>E27 · 2700K · matte glaze<br>TOL ±0.5mm</p>
</div>
</div>
</article>
</section>@import "tailwindcss";
@theme {
--color-tch28-bg: #e9ebee;
--color-tch28-bg: oklch(0.93 0.004 250);
--color-tch28-paper: #fdfdfb;
--color-tch28-paper: oklch(0.99 0.003 95);
--color-tch28-edge: #d4d8de;
--color-tch28-edge: oklch(0.87 0.006 250);
--color-tch28-ink: #1a2533;
--color-tch28-ink: oklch(0.25 0.02 250);
--color-tch28-mut: #5a6a7d;
--color-tch28-mut: oklch(0.5 0.03 250);
--color-tch28-blue: #0d3b8c;
--color-tch28-blue: oklch(0.36 0.16 265);
--color-tch28-bink: #cfe0ff;
--color-tch28-bink: oklch(0.89 0.05 260);
--color-tch28-spec: #aecaff;
--color-tch28-spec: oklch(0.82 0.07 260);
--color-tch28-line: #9dc0ff;
--color-tch28-line: oklch(0.79 0.09 260);
--font-tch28-mono: 'Spline Sans Mono', ui-monospace, monospace;
--font-tch28-display: 'Archivo', system-ui, sans-serif;
}
.tch-28 {
width: 100%;
min-height: 100svh;
}@import "tailwindcss";
@theme {
--color-tch28-bg: #e9ebee;
--color-tch28-bg: oklch(0.93 0.004 250);
--color-tch28-paper: #fdfdfb;
--color-tch28-paper: oklch(0.99 0.003 95);
--color-tch28-edge: #d4d8de;
--color-tch28-edge: oklch(0.87 0.006 250);
--color-tch28-ink: #1a2533;
--color-tch28-ink: oklch(0.25 0.02 250);
--color-tch28-mut: #5a6a7d;
--color-tch28-mut: oklch(0.5 0.03 250);
--color-tch28-blue: #0d3b8c;
--color-tch28-blue: oklch(0.36 0.16 265);
--color-tch28-bink: #cfe0ff;
--color-tch28-bink: oklch(0.89 0.05 260);
--color-tch28-spec: #aecaff;
--color-tch28-spec: oklch(0.82 0.07 260);
--color-tch28-line: #9dc0ff;
--color-tch28-line: oklch(0.79 0.09 260);
--font-tch28-mono: 'Spline Sans Mono', ui-monospace, monospace;
--font-tch28-display: 'Archivo', system-ui, sans-serif;
}
.tch-28 {
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-tch28-bg: #e9ebee;
--color-tch28-bg: oklch(0.93 0.004 250);
--color-tch28-paper: #fdfdfb;
--color-tch28-paper: oklch(0.99 0.003 95);
--color-tch28-edge: #d4d8de;
--color-tch28-edge: oklch(0.87 0.006 250);
--color-tch28-ink: #1a2533;
--color-tch28-ink: oklch(0.25 0.02 250);
--color-tch28-mut: #5a6a7d;
--color-tch28-mut: oklch(0.5 0.03 250);
--color-tch28-blue: #0d3b8c;
--color-tch28-blue: oklch(0.36 0.16 265);
--color-tch28-bink: #cfe0ff;
--color-tch28-bink: oklch(0.89 0.05 260);
--color-tch28-spec: #aecaff;
--color-tch28-spec: oklch(0.82 0.07 260);
--color-tch28-line: #9dc0ff;
--color-tch28-line: oklch(0.79 0.09 260);
--font-tch28-mono: 'Spline Sans Mono', ui-monospace, monospace;
--font-tch28-display: 'Archivo', system-ui, sans-serif;
}
.tch-28 {
width: 100%;
min-height: 100svh;
}@import "tailwindcss";
@theme {
--color-tch28-bg: #e9ebee;
--color-tch28-bg: oklch(0.93 0.004 250);
--color-tch28-paper: #fdfdfb;
--color-tch28-paper: oklch(0.99 0.003 95);
--color-tch28-edge: #d4d8de;
--color-tch28-edge: oklch(0.87 0.006 250);
--color-tch28-ink: #1a2533;
--color-tch28-ink: oklch(0.25 0.02 250);
--color-tch28-mut: #5a6a7d;
--color-tch28-mut: oklch(0.5 0.03 250);
--color-tch28-blue: #0d3b8c;
--color-tch28-blue: oklch(0.36 0.16 265);
--color-tch28-bink: #cfe0ff;
--color-tch28-bink: oklch(0.89 0.05 260);
--color-tch28-spec: #aecaff;
--color-tch28-spec: oklch(0.82 0.07 260);
--color-tch28-line: #9dc0ff;
--color-tch28-line: oklch(0.79 0.09 260);
--font-tch28-mono: 'Spline Sans Mono', ui-monospace, monospace;
--font-tch28-display: 'Archivo', system-ui, sans-serif;
}
.tch-28 {
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:wght@500;700&family=Spline+Sans+Mono:wght@400;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=Archivo:wght@500;700&family=Spline+Sans+Mono:wght@400;500&display=swap">What changed in the port
Which parts became utilities, which stayed CSS, and why.
circle()is the clip-path shape that animates without caveats — one radius, no vertex matching. Reach for it beforepolygon()whenever the reveal can be round.- The original used inline
style="…"for three text colours. Those becametext-tch28-mutand friends, which is the port quietly fixing a maintainability hole. - UI change from the CSS original: focusable card, wipe on
group-focus-visible:, and the dimension lines are now pseudo-elements on the drawing itself rather than absolutely positioned siblings.
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 Blueprint Reveal Card with Circular clip-path Wipe
Source: https://codefronts.com/motion/tailwind-css-card-hover-effects/tailwind-blueprint-reveal-card-clip-path-wipe/
A product card that wipes into a technical blueprint — grid paper, dimension lines, tolerances — via a circle that expands from the top-right corner. clip-path: circle() animates cleanly because only the radius changes, and that single-value interpolation is what makes the wipe smooth.
## HTML
```html
<section class="tch-28 w-full min-h-svh grid place-items-center bg-tch28-bg font-tch28-mono p-8">
<article tabindex="0" class="group relative w-[340px] h-[440px] rounded-md overflow-hidden cursor-pointer outline-none bg-tch28-paper border border-tch28-edge shadow-[0_16px_36px_rgb(30_50_80/0.15)] focus-visible:outline-2 focus-visible:outline-tch28-blue focus-visible:outline-offset-4">
<div class="absolute inset-0 z-1 p-[2.4rem] flex flex-col justify-between text-tch28-ink bg-[radial-gradient(circle_at_70%_20%,#f0f3f7,#fdfdfb_60%)] transition-opacity duration-500 group-hover:opacity-0 group-focus-visible:opacity-0">
<span class="text-[0.72rem] tracking-[0.16em] text-tch28-mut">MODEL · ARC-01</span>
<div class="size-[130px] mx-auto my-4 rounded-[50%_50%_50%_12px] bg-[linear-gradient(145deg,#2d6cdf,#16306b)] shadow-[0_14px_30px_rgb(40_80_160/0.35)]"></div>
<div>
<h2 class="font-tch28-display font-bold text-[2rem] leading-none">Arc Pendant</h2>
<p class="text-[0.82rem] leading-[1.6] text-tch28-mut mt-1.5">Hand-blown matte ceramic lamp.</p>
</div>
</div>
<div class="absolute inset-0 z-2 p-[2.4rem] flex flex-col justify-between text-tch28-bink bg-tch28-blue bg-[linear-gradient(rgb(255_255_255/0.12)_1px,transparent_1px),linear-gradient(90deg,rgb(255_255_255/0.12)_1px,transparent_1px)] bg-[length:22px_22px] [clip-path:circle(0%_at_100%_0%)] transition-[clip-path] duration-600 ease-[cubic-bezier(0.65,0,0.35,1)] group-hover:[clip-path:circle(150%_at_100%_0%)] group-focus-visible:[clip-path:circle(150%_at_100%_0%)] motion-reduce:transition-none">
<span class="text-[0.72rem] tracking-[0.16em]">DRAWING № 01 — REV C</span>
<div class="relative size-[130px] mx-auto my-4 rounded-[50%_50%_50%_12px] border-[1.5px] border-tch28-line before:content-[''] before:absolute before:-inset-x-8 before:top-1/2 before:h-px before:bg-[repeating-linear-gradient(90deg,#6f9aff_0_6px,transparent_6px_10px)] after:content-[''] after:absolute after:-inset-y-8 after:left-1/2 after:w-px after:bg-[repeating-linear-gradient(0deg,#6f9aff_0_6px,transparent_6px_10px)]"></div>
<div>
<h2 class="font-tch28-display font-bold text-[1.6rem] leading-[1.05]">Arc Pendant<br>Cross-Section</h2>
<p class="text-[0.74rem] leading-[1.7] text-tch28-spec mt-1.5">Ø 130mm · cord 1.8m<br>E27 · 2700K · matte glaze<br>TOL ±0.5mm</p>
</div>
</div>
</article>
</section>
```
## CSS
```css
@import "tailwindcss";
@theme {
--color-tch28-bg: #e9ebee;
--color-tch28-bg: oklch(0.93 0.004 250);
--color-tch28-paper: #fdfdfb;
--color-tch28-paper: oklch(0.99 0.003 95);
--color-tch28-edge: #d4d8de;
--color-tch28-edge: oklch(0.87 0.006 250);
--color-tch28-ink: #1a2533;
--color-tch28-ink: oklch(0.25 0.02 250);
--color-tch28-mut: #5a6a7d;
--color-tch28-mut: oklch(0.5 0.03 250);
--color-tch28-blue: #0d3b8c;
--color-tch28-blue: oklch(0.36 0.16 265);
--color-tch28-bink: #cfe0ff;
--color-tch28-bink: oklch(0.89 0.05 260);
--color-tch28-spec: #aecaff;
--color-tch28-spec: oklch(0.82 0.07 260);
--color-tch28-line: #9dc0ff;
--color-tch28-line: oklch(0.79 0.09 260);
--font-tch28-mono: 'Spline Sans Mono', ui-monospace, monospace;
--font-tch28-display: 'Archivo', system-ui, sans-serif;
}
.tch-28 {
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 Blueprint Reveal Card with Circular clip-path Wipe
Source: https://codefronts.com/motion/tailwind-css-card-hover-effects/tailwind-blueprint-reveal-card-clip-path-wipe/
A product card that wipes into a technical blueprint — grid paper, dimension lines, tolerances — via a circle that expands from the top-right corner. clip-path: circle() animates cleanly because only the radius changes, and that single-value interpolation is what makes the wipe smooth.
## HTML
```html
<section class="tch-28 w-full min-h-svh grid place-items-center bg-tch28-bg font-tch28-mono p-8">
<article tabindex="0" class="group relative w-[340px] h-[440px] rounded-md overflow-hidden cursor-pointer outline-none bg-tch28-paper border border-tch28-edge shadow-[0_16px_36px_rgb(30_50_80/0.15)] focus-visible:outline-2 focus-visible:outline-tch28-blue focus-visible:outline-offset-4">
<div class="absolute inset-0 z-1 p-[2.4rem] flex flex-col justify-between text-tch28-ink bg-[radial-gradient(circle_at_70%_20%,#f0f3f7,#fdfdfb_60%)] transition-opacity duration-500 group-hover:opacity-0 group-focus-visible:opacity-0">
<span class="text-[0.72rem] tracking-[0.16em] text-tch28-mut">MODEL · ARC-01</span>
<div class="size-[130px] mx-auto my-4 rounded-[50%_50%_50%_12px] bg-[linear-gradient(145deg,#2d6cdf,#16306b)] shadow-[0_14px_30px_rgb(40_80_160/0.35)]"></div>
<div>
<h2 class="font-tch28-display font-bold text-[2rem] leading-none">Arc Pendant</h2>
<p class="text-[0.82rem] leading-[1.6] text-tch28-mut mt-1.5">Hand-blown matte ceramic lamp.</p>
</div>
</div>
<div class="absolute inset-0 z-2 p-[2.4rem] flex flex-col justify-between text-tch28-bink bg-tch28-blue bg-[linear-gradient(rgb(255_255_255/0.12)_1px,transparent_1px),linear-gradient(90deg,rgb(255_255_255/0.12)_1px,transparent_1px)] bg-[length:22px_22px] [clip-path:circle(0%_at_100%_0%)] transition-[clip-path] duration-600 ease-[cubic-bezier(0.65,0,0.35,1)] group-hover:[clip-path:circle(150%_at_100%_0%)] group-focus-visible:[clip-path:circle(150%_at_100%_0%)] motion-reduce:transition-none">
<span class="text-[0.72rem] tracking-[0.16em]">DRAWING № 01 — REV C</span>
<div class="relative size-[130px] mx-auto my-4 rounded-[50%_50%_50%_12px] border-[1.5px] border-tch28-line before:content-[''] before:absolute before:-inset-x-8 before:top-1/2 before:h-px before:bg-[repeating-linear-gradient(90deg,#6f9aff_0_6px,transparent_6px_10px)] after:content-[''] after:absolute after:-inset-y-8 after:left-1/2 after:w-px after:bg-[repeating-linear-gradient(0deg,#6f9aff_0_6px,transparent_6px_10px)]"></div>
<div>
<h2 class="font-tch28-display font-bold text-[1.6rem] leading-[1.05]">Arc Pendant<br>Cross-Section</h2>
<p class="text-[0.74rem] leading-[1.7] text-tch28-spec mt-1.5">Ø 130mm · cord 1.8m<br>E27 · 2700K · matte glaze<br>TOL ±0.5mm</p>
</div>
</div>
</article>
</section>
```
## CSS
```css
@import "tailwindcss";
@theme {
--color-tch28-bg: #e9ebee;
--color-tch28-bg: oklch(0.93 0.004 250);
--color-tch28-paper: #fdfdfb;
--color-tch28-paper: oklch(0.99 0.003 95);
--color-tch28-edge: #d4d8de;
--color-tch28-edge: oklch(0.87 0.006 250);
--color-tch28-ink: #1a2533;
--color-tch28-ink: oklch(0.25 0.02 250);
--color-tch28-mut: #5a6a7d;
--color-tch28-mut: oklch(0.5 0.03 250);
--color-tch28-blue: #0d3b8c;
--color-tch28-blue: oklch(0.36 0.16 265);
--color-tch28-bink: #cfe0ff;
--color-tch28-bink: oklch(0.89 0.05 260);
--color-tch28-spec: #aecaff;
--color-tch28-spec: oklch(0.82 0.07 260);
--color-tch28-line: #9dc0ff;
--color-tch28-line: oklch(0.79 0.09 260);
--font-tch28-mono: 'Spline Sans Mono', ui-monospace, monospace;
--font-tch28-display: 'Archivo', system-ui, sans-serif;
}
.tch-28 {
width: 100%;
min-height: 100svh;
}
```How this works
A circle wipe is the cheapest animated clip. circle(0% at 100% 0%) to circle(150% at 100% 0%) changes exactly one value, so there is no vertex-count problem and no interpolation ambiguity. 150% guarantees the circle covers the far corner whatever the card's aspect ratio.
Both faces are complete cards. The product face (soft radial, rendered object, plain type) and the blueprint face (grid, outline, specs) are each full absolute inset-0 layouts. The wipe reveals the second; the first fades under it.
Annotations are gradients, not SVG. The two dashed dimension lines are repeating-linear-gradient strips on pseudo-elements, extended 30px past the object on each axis. No SVG, no stroke-dasharray, and nothing for a screen reader to announce.
Make it yours
- Wipe origin:
at 100% 0%is a corner sweep;at 50% 50%opens from the centre like an iris. - Blueprint hue:
--color-tch28-bluereads as architect; an amber variant reads as a patent drawing. - Grid pitch is the
22pxin the background size — finer grids read as engineering, coarser as sketch.
Gotchas — read before shipping
- Keep the wipe under ~600ms. A slow reveal on a card people are scanning reads as lag.
- The annotation pseudo-elements carry no text, so nothing leaks into the accessibility tree — keep it that way if you add callouts.
- Thin blueprint lines can fail 3:1 non-text contrast; these sit at full opacity on a saturated blue for that reason.
- Under
motion-reduce:cross-fade the faces instead of wiping.
Browser support
| Chrome | Safari | Firefox | Edge |
|---|---|---|---|
| 111+ | 16.4+ | 128+ | 111+ |
clip-path: circle() and gradients are universally supported; the floor is Tailwind v4's generated sheet.