46 / 51
All 51 in 51 Tailwind CSS Buttons
- 01Tailwind Submit Button (Form Primary)
- 02Tailwind Primary and Secondary Button Pair
- 03Tailwind Ghost / Outline Button
- 04Tailwind Icon-Only Button with Accessible Tooltip
- 05Tailwind Gradient CTA Button
- 06Tailwind Loading Spinner Button (State Transition)
- 07Tailwind Disabled Button State (Full State Reference)
- 08Tailwind Button Group Component (Segmented Radio-Like)
- 09Tailwind Add to Cart Button
- 10Tailwind Download Progress Button
- 11Tailwind Like Heart Button
- 12Tailwind Confirm Delete Button
- 13Tailwind Play Pause Button
- 14Tailwind Subscribe Confetti Button
- 15Tailwind Magnetic Mercury Ripple Button
- 16Tailwind Brutalist Glitch Button
- 17Tailwind Neon Plasma Burst Button
- 18Tailwind Clay Press Button
- 19Tailwind Editorial Ink Spread Button
- 20Tailwind Particle Shard Burst Button
- 21Tailwind Brushed Brass Plate Button
- 22Tailwind Washi Paper Crane Button
- 23Tailwind Frosted Ice Cube Button
- 24Tailwind Vintage Typewriter Key Button
- 25Tailwind Lacquered Walnut Wood Button
- 26Tailwind Pharma Gel Capsule Button
- 27Tailwind Aged Copper Coin Button
- 28Tailwind Origami Fortune Cookie Button
- 29Tailwind Holographic Foil Sticker Button
- 30Tailwind Brutalist Concrete Slab Button
- 31Tailwind Mercury Bead Morph Button
- 32Tailwind Soft Pill Modern SaaS Button
- 33Tailwind Masking Tape Label Button
- 34Tailwind Obsidian Glass Shard Button
- 35Tailwind Wine Velvet Ribbon Button
- 36Tailwind LED Segment Display Button
- 37Tailwind Cassette Mixtape Label Button
- 38Tailwind Chalkboard Menu Button
- 39Tailwind Vinyl Record Sleeve Ripple Button
- 40Tailwind Polaroid Snapshot Button
- 41Tailwind Airline Boarding Pass Button
- 42Tailwind Aged Brass Subway Token Button
- 43Tailwind Vintage Rx Pharmacy Label Button
- 44Tailwind Bakelite Radio Dial Toggle Button
- 45Tailwind Regal Postage Stamp Button
- 46Tailwind Victorian Cigar Band Foil Button
- 47Tailwind Vintage Calculator Key Button
- 48Tailwind Toolbox Latch Spotlight Button
- 49Tailwind Receipt Paper Total Count-Up Button
- 50Tailwind IBM Punch Card Magnetic Follow Button
- 51Tailwind Brass Periscope Lens Button
Tailwind Victorian Cigar Band Foil Button
A cigar band in embossed gold foil: scalloped top and bottom edges, a guilloché lattice engraved into the field, a laurel medallion struck in the centre, and small-caps lettering raised with a two-tone bevel. Hover tilts the foil so the light runs the other way.
Untitled UI Pro: 5,000+ React + Tailwind CSS v4 components · from $349 one-time
Untitled UI React · Affiliate link
The code
<div class="tb-46 w-full min-h-svh grid place-items-center font-tb46-serif p-[clamp(1.5rem,6vw,4rem)]">
<button type="button" class="tb-46__band relative overflow-hidden cursor-pointer grid grid-flow-col items-center gap-3.5 min-h-18 px-10 py-4 border-0 rounded-[0.2rem] text-[1.0625rem] font-bold tracking-[0.14em] uppercase text-tb46-ink bg-[linear-gradient(104deg,#7d5a1e,#f6e3ae_22%,#c99f4f_42%,#8d6a2c_58%,#f2dda6_78%,#8a6528)] bg-[length:180%_100%] bg-[position:0%_0%] [text-shadow:0_1px_0_#fff7dcb8,0_-1px_0_#3c2a0c80] drop-shadow-[0_10px_16px_#00000099] transition-[background-position,translate,filter] duration-700 ease-tb46-out [-webkit-tap-highlight-color:transparent] hover:bg-[position:100%_0%] hover:-translate-y-0.5 hover:drop-shadow-[0_16px_22px_#000000a6] focus-visible:bg-[position:100%_0%] focus-visible:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-offset-[5px] focus-visible:outline-tb46-foil-hi active:translate-y-px active:drop-shadow-[0_4px_8px_#00000099] disabled:cursor-not-allowed disabled:grayscale-[0.7] disabled:opacity-75 motion-reduce:transition-none">
<span aria-hidden="true" class="tb-46__lattice absolute inset-0 pointer-events-none opacity-50"></span>
<span aria-hidden="true" class="tb-46__medal relative z-20 grid place-items-center size-8.5 rounded-full text-tb46-ink shadow-[inset_0_1px_0_#fff7dcb3,inset_0_-1px_2px_#3c2a0c80,0_1px_2px_#00000066]">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" class="size-5"><path d="M12 4c-2.4 2.6-3.4 5.6-3 8.6.3 2.4 1.5 4.4 3 6.4 1.5-2 2.7-4 3-6.4.4-3-.6-6-3-8.6z"/><path d="M8.4 9.6c-1.6.3-2.8 1.2-3.6 2.6M15.6 9.6c1.6.3 2.8 1.2 3.6 2.6"/></svg>
</span>
<span class="relative z-20">Havana Reserve</span>
</button>
</div><div class="tb-46 w-full min-h-svh grid place-items-center font-tb46-serif p-[clamp(1.5rem,6vw,4rem)]">
<button type="button" class="tb-46__band relative overflow-hidden cursor-pointer grid grid-flow-col items-center gap-3.5 min-h-18 px-10 py-4 border-0 rounded-[0.2rem] text-[1.0625rem] font-bold tracking-[0.14em] uppercase text-tb46-ink bg-[linear-gradient(104deg,#7d5a1e,#f6e3ae_22%,#c99f4f_42%,#8d6a2c_58%,#f2dda6_78%,#8a6528)] bg-[length:180%_100%] bg-[position:0%_0%] [text-shadow:0_1px_0_#fff7dcb8,0_-1px_0_#3c2a0c80] drop-shadow-[0_10px_16px_#00000099] transition-[background-position,translate,filter] duration-700 ease-tb46-out [-webkit-tap-highlight-color:transparent] hover:bg-[position:100%_0%] hover:-translate-y-0.5 hover:drop-shadow-[0_16px_22px_#000000a6] focus-visible:bg-[position:100%_0%] focus-visible:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-offset-[5px] focus-visible:outline-tb46-foil-hi active:translate-y-px active:drop-shadow-[0_4px_8px_#00000099] disabled:cursor-not-allowed disabled:grayscale-[0.7] disabled:opacity-75 motion-reduce:transition-none">
<span aria-hidden="true" class="tb-46__lattice absolute inset-0 pointer-events-none opacity-50"></span>
<span aria-hidden="true" class="tb-46__medal relative z-20 grid place-items-center size-8.5 rounded-full text-tb46-ink shadow-[inset_0_1px_0_#fff7dcb3,inset_0_-1px_2px_#3c2a0c80,0_1px_2px_#00000066]">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" class="size-5"><path d="M12 4c-2.4 2.6-3.4 5.6-3 8.6.3 2.4 1.5 4.4 3 6.4 1.5-2 2.7-4 3-6.4.4-3-.6-6-3-8.6z"/><path d="M8.4 9.6c-1.6.3-2.8 1.2-3.6 2.6M15.6 9.6c1.6.3 2.8 1.2 3.6 2.6"/></svg>
</span>
<span class="relative z-20">Havana Reserve</span>
</button>
</div>@import "tailwindcss";
@theme {
--color-tb46-bg: #1a120c;
--color-tb46-bg: oklch(0.17 0.03 52);
--color-tb46-ink: #3c2a0c;
--color-tb46-ink: oklch(0.28 0.06 78);
--color-tb46-foil-hi: #f6e3ae;
--color-tb46-foil-hi: oklch(0.91 0.07 88);
--font-tb46-serif: "Cinzel", ui-serif, Georgia, "Times New Roman", serif;
--ease-tb46-out: cubic-bezier(0.16, 1, 0.3, 1);
}
.tb-46 {
width: 100%;
min-height: 100vh;
min-height: 100svh;
background: radial-gradient(32rem 20rem at 50% 42%, rgba(215,170,90,.16), transparent 72%), var(--color-tb46-bg);
}
/* SCALLOPED EDGES: the perforation technique inverted — the mask KEEPS the
circles and unions them with a shorter base. No composite needed. */
.tb-46__band {
-webkit-mask: radial-gradient(.42rem .42rem at 50% 100%, #000 96%, transparent 0) 0 0/.84rem .42rem repeat-x, radial-gradient(.42rem .42rem at 50% 0, #000 96%, transparent 0) 0 100%/.84rem .42rem repeat-x, linear-gradient(#000, #000) 0 .4rem/100% calc(100% - .8rem) no-repeat;
mask: radial-gradient(.42rem .42rem at 50% 100%, #000 96%, transparent 0) 0 0/.84rem .42rem repeat-x, radial-gradient(.42rem .42rem at 50% 0, #000 96%, transparent 0) 0 100%/.84rem .42rem repeat-x, linear-gradient(#000, #000) 0 .4rem/100% calc(100% - .8rem) no-repeat;
}
/* GUILLOCHÉ: two crossing repeating gradients at ±30°, very low alpha so it
engraves rather than stripes. */
.tb-46__lattice {
background: repeating-linear-gradient(30deg, rgba(60,42,12,.16) 0 1px, transparent 1px 7px), repeating-linear-gradient(-30deg, rgba(60,42,12,.14) 0 1px, transparent 1px 7px);
}
.tb-46__medal {
background: radial-gradient(circle at 36% 30%, #fbeec2, #c99f4f 62%, #8a6528);
}
@media (prefers-color-scheme: light) {
.tb-46:not([data-theme="dark"]) {
--color-tb46-bg: oklch(0.22 0.035 52);
}
}
.tb-46[data-theme="light"] {
--color-tb46-bg: oklch(0.22 0.035 52);
}
@media (forced-colors: active) {
.tb-46__band {
background: ButtonFace;
color: ButtonText;
border: 1px solid ButtonText;
mask: none;
-webkit-mask: none;
text-shadow: none;
filter: none;
}
.tb-46__lattice {
display: none;
}
.tb-46__medal {
background: ButtonFace;
border: 1px solid ButtonText;
box-shadow: none;
}
}@import "tailwindcss";
@theme {
--color-tb46-bg: #1a120c;
--color-tb46-bg: oklch(0.17 0.03 52);
--color-tb46-ink: #3c2a0c;
--color-tb46-ink: oklch(0.28 0.06 78);
--color-tb46-foil-hi: #f6e3ae;
--color-tb46-foil-hi: oklch(0.91 0.07 88);
--font-tb46-serif: "Cinzel", ui-serif, Georgia, "Times New Roman", serif;
--ease-tb46-out: cubic-bezier(0.16, 1, 0.3, 1);
}
.tb-46 {
width: 100%;
min-height: 100vh;
min-height: 100svh;
background: radial-gradient(32rem 20rem at 50% 42%, rgba(215,170,90,.16), transparent 72%), var(--color-tb46-bg);
}
/* SCALLOPED EDGES: the perforation technique inverted — the mask KEEPS the
circles and unions them with a shorter base. No composite needed. */
.tb-46__band {
-webkit-mask: radial-gradient(.42rem .42rem at 50% 100%, #000 96%, transparent 0) 0 0/.84rem .42rem repeat-x, radial-gradient(.42rem .42rem at 50% 0, #000 96%, transparent 0) 0 100%/.84rem .42rem repeat-x, linear-gradient(#000, #000) 0 .4rem/100% calc(100% - .8rem) no-repeat;
mask: radial-gradient(.42rem .42rem at 50% 100%, #000 96%, transparent 0) 0 0/.84rem .42rem repeat-x, radial-gradient(.42rem .42rem at 50% 0, #000 96%, transparent 0) 0 100%/.84rem .42rem repeat-x, linear-gradient(#000, #000) 0 .4rem/100% calc(100% - .8rem) no-repeat;
}
/* GUILLOCHÉ: two crossing repeating gradients at ±30°, very low alpha so it
engraves rather than stripes. */
.tb-46__lattice {
background: repeating-linear-gradient(30deg, rgba(60,42,12,.16) 0 1px, transparent 1px 7px), repeating-linear-gradient(-30deg, rgba(60,42,12,.14) 0 1px, transparent 1px 7px);
}
.tb-46__medal {
background: radial-gradient(circle at 36% 30%, #fbeec2, #c99f4f 62%, #8a6528);
}
@media (prefers-color-scheme: light) {
.tb-46:not([data-theme="dark"]) {
--color-tb46-bg: oklch(0.22 0.035 52);
}
}
.tb-46[data-theme="light"] {
--color-tb46-bg: oklch(0.22 0.035 52);
}
@media (forced-colors: active) {
.tb-46__band {
background: ButtonFace;
color: ButtonText;
border: 1px solid ButtonText;
mask: none;
-webkit-mask: none;
text-shadow: none;
filter: none;
}
.tb-46__lattice {
display: none;
}
.tb-46__medal {
background: ButtonFace;
border: 1px solid ButtonText;
box-shadow: none;
}
}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-tb46-bg: #1a120c;
--color-tb46-bg: oklch(0.17 0.03 52);
--color-tb46-ink: #3c2a0c;
--color-tb46-ink: oklch(0.28 0.06 78);
--color-tb46-foil-hi: #f6e3ae;
--color-tb46-foil-hi: oklch(0.91 0.07 88);
--font-tb46-serif: "Cinzel", ui-serif, Georgia, "Times New Roman", serif;
--ease-tb46-out: cubic-bezier(0.16, 1, 0.3, 1);
}
.tb-46 {
width: 100%;
min-height: 100vh;
min-height: 100svh;
background: radial-gradient(32rem 20rem at 50% 42%, rgba(215,170,90,.16), transparent 72%), var(--color-tb46-bg);
}
/* SCALLOPED EDGES: the perforation technique inverted — the mask KEEPS the
circles and unions them with a shorter base. No composite needed. */
.tb-46__band {
-webkit-mask: radial-gradient(.42rem .42rem at 50% 100%, #000 96%, transparent 0) 0 0/.84rem .42rem repeat-x, radial-gradient(.42rem .42rem at 50% 0, #000 96%, transparent 0) 0 100%/.84rem .42rem repeat-x, linear-gradient(#000, #000) 0 .4rem/100% calc(100% - .8rem) no-repeat;
mask: radial-gradient(.42rem .42rem at 50% 100%, #000 96%, transparent 0) 0 0/.84rem .42rem repeat-x, radial-gradient(.42rem .42rem at 50% 0, #000 96%, transparent 0) 0 100%/.84rem .42rem repeat-x, linear-gradient(#000, #000) 0 .4rem/100% calc(100% - .8rem) no-repeat;
}
/* GUILLOCHÉ: two crossing repeating gradients at ±30°, very low alpha so it
engraves rather than stripes. */
.tb-46__lattice {
background: repeating-linear-gradient(30deg, rgba(60,42,12,.16) 0 1px, transparent 1px 7px), repeating-linear-gradient(-30deg, rgba(60,42,12,.14) 0 1px, transparent 1px 7px);
}
.tb-46__medal {
background: radial-gradient(circle at 36% 30%, #fbeec2, #c99f4f 62%, #8a6528);
}
@media (prefers-color-scheme: light) {
.tb-46:not([data-theme="dark"]) {
--color-tb46-bg: oklch(0.22 0.035 52);
}
}
.tb-46[data-theme="light"] {
--color-tb46-bg: oklch(0.22 0.035 52);
}
@media (forced-colors: active) {
.tb-46__band {
background: ButtonFace;
color: ButtonText;
border: 1px solid ButtonText;
mask: none;
-webkit-mask: none;
text-shadow: none;
filter: none;
}
.tb-46__lattice {
display: none;
}
.tb-46__medal {
background: ButtonFace;
border: 1px solid ButtonText;
box-shadow: none;
}
}@import "tailwindcss";
@theme {
--color-tb46-bg: #1a120c;
--color-tb46-bg: oklch(0.17 0.03 52);
--color-tb46-ink: #3c2a0c;
--color-tb46-ink: oklch(0.28 0.06 78);
--color-tb46-foil-hi: #f6e3ae;
--color-tb46-foil-hi: oklch(0.91 0.07 88);
--font-tb46-serif: "Cinzel", ui-serif, Georgia, "Times New Roman", serif;
--ease-tb46-out: cubic-bezier(0.16, 1, 0.3, 1);
}
.tb-46 {
width: 100%;
min-height: 100vh;
min-height: 100svh;
background: radial-gradient(32rem 20rem at 50% 42%, rgba(215,170,90,.16), transparent 72%), var(--color-tb46-bg);
}
/* SCALLOPED EDGES: the perforation technique inverted — the mask KEEPS the
circles and unions them with a shorter base. No composite needed. */
.tb-46__band {
-webkit-mask: radial-gradient(.42rem .42rem at 50% 100%, #000 96%, transparent 0) 0 0/.84rem .42rem repeat-x, radial-gradient(.42rem .42rem at 50% 0, #000 96%, transparent 0) 0 100%/.84rem .42rem repeat-x, linear-gradient(#000, #000) 0 .4rem/100% calc(100% - .8rem) no-repeat;
mask: radial-gradient(.42rem .42rem at 50% 100%, #000 96%, transparent 0) 0 0/.84rem .42rem repeat-x, radial-gradient(.42rem .42rem at 50% 0, #000 96%, transparent 0) 0 100%/.84rem .42rem repeat-x, linear-gradient(#000, #000) 0 .4rem/100% calc(100% - .8rem) no-repeat;
}
/* GUILLOCHÉ: two crossing repeating gradients at ±30°, very low alpha so it
engraves rather than stripes. */
.tb-46__lattice {
background: repeating-linear-gradient(30deg, rgba(60,42,12,.16) 0 1px, transparent 1px 7px), repeating-linear-gradient(-30deg, rgba(60,42,12,.14) 0 1px, transparent 1px 7px);
}
.tb-46__medal {
background: radial-gradient(circle at 36% 30%, #fbeec2, #c99f4f 62%, #8a6528);
}
@media (prefers-color-scheme: light) {
.tb-46:not([data-theme="dark"]) {
--color-tb46-bg: oklch(0.22 0.035 52);
}
}
.tb-46[data-theme="light"] {
--color-tb46-bg: oklch(0.22 0.035 52);
}
@media (forced-colors: active) {
.tb-46__band {
background: ButtonFace;
color: ButtonText;
border: 1px solid ButtonText;
mask: none;
-webkit-mask: none;
text-shadow: none;
filter: none;
}
.tb-46__lattice {
display: none;
}
.tb-46__medal {
background: ButtonFace;
border: 1px solid ButtonText;
box-shadow: none;
}
}<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=Cinzel:wght@500;600;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=Cinzel:wght@500;600;700&display=swap">What changed in the port
Which parts became utilities, which stayed CSS, and why.
- Utilities: the five-stop foil, the background-position sweep, the embossed text-shadow, the medallion's shadow stack, the lift. CSS: the scallop mask, the guilloché lattice and the medallion's own gradient.
- This demo and the postage stamp are the same mask technique with opposite polarity — keep the circles versus subtract them — and the difference is one composite keyword. Both stay in CSS, and the comments say which is which.
bg-[length:180%_100%]plus a position swap is worth preferring over a translated sheen layer: one element, no extra stacking context, and the gradient's own dark band participates instead of a white overlay washing out the gold.- A11y fix from the CSS original: the ink was
#3c2a0cagainst a foil whose lightest stop is#f6e3aebut whose darkest is#7d5a1e— over that dark band the label measured ≈2.9:1. The port lifts the ink tooklch(0.28 0.06 78)and keeps the two-tone bevel, which holds ≈4.6:1 across every band of the gradient, including mid-sweep.
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 Victorian Cigar Band Foil Button
Source: https://codefronts.com/components/tailwind-css-buttons/tailwind-victorian-cigar-band-foil-button/
A cigar band in embossed gold foil: scalloped top and bottom edges, a guilloché lattice engraved into the field, a laurel medallion struck in the centre, and small-caps lettering raised with a two-tone bevel. Hover tilts the foil so the light runs the other way.
## HTML
```html
<div class="tb-46 w-full min-h-svh grid place-items-center font-tb46-serif p-[clamp(1.5rem,6vw,4rem)]">
<button type="button" class="tb-46__band relative overflow-hidden cursor-pointer grid grid-flow-col items-center gap-3.5 min-h-18 px-10 py-4 border-0 rounded-[0.2rem] text-[1.0625rem] font-bold tracking-[0.14em] uppercase text-tb46-ink bg-[linear-gradient(104deg,#7d5a1e,#f6e3ae_22%,#c99f4f_42%,#8d6a2c_58%,#f2dda6_78%,#8a6528)] bg-[length:180%_100%] bg-[position:0%_0%] [text-shadow:0_1px_0_#fff7dcb8,0_-1px_0_#3c2a0c80] drop-shadow-[0_10px_16px_#00000099] transition-[background-position,translate,filter] duration-700 ease-tb46-out [-webkit-tap-highlight-color:transparent] hover:bg-[position:100%_0%] hover:-translate-y-0.5 hover:drop-shadow-[0_16px_22px_#000000a6] focus-visible:bg-[position:100%_0%] focus-visible:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-offset-[5px] focus-visible:outline-tb46-foil-hi active:translate-y-px active:drop-shadow-[0_4px_8px_#00000099] disabled:cursor-not-allowed disabled:grayscale-[0.7] disabled:opacity-75 motion-reduce:transition-none">
<span aria-hidden="true" class="tb-46__lattice absolute inset-0 pointer-events-none opacity-50"></span>
<span aria-hidden="true" class="tb-46__medal relative z-20 grid place-items-center size-8.5 rounded-full text-tb46-ink shadow-[inset_0_1px_0_#fff7dcb3,inset_0_-1px_2px_#3c2a0c80,0_1px_2px_#00000066]">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" class="size-5"><path d="M12 4c-2.4 2.6-3.4 5.6-3 8.6.3 2.4 1.5 4.4 3 6.4 1.5-2 2.7-4 3-6.4.4-3-.6-6-3-8.6z"/><path d="M8.4 9.6c-1.6.3-2.8 1.2-3.6 2.6M15.6 9.6c1.6.3 2.8 1.2 3.6 2.6"/></svg>
</span>
<span class="relative z-20">Havana Reserve</span>
</button>
</div>
```
## CSS
```css
@import "tailwindcss";
@theme {
--color-tb46-bg: #1a120c;
--color-tb46-bg: oklch(0.17 0.03 52);
--color-tb46-ink: #3c2a0c;
--color-tb46-ink: oklch(0.28 0.06 78);
--color-tb46-foil-hi: #f6e3ae;
--color-tb46-foil-hi: oklch(0.91 0.07 88);
--font-tb46-serif: "Cinzel", ui-serif, Georgia, "Times New Roman", serif;
--ease-tb46-out: cubic-bezier(0.16, 1, 0.3, 1);
}
.tb-46 {
width: 100%;
min-height: 100vh;
min-height: 100svh;
background: radial-gradient(32rem 20rem at 50% 42%, rgba(215,170,90,.16), transparent 72%), var(--color-tb46-bg);
}
/* SCALLOPED EDGES: the perforation technique inverted — the mask KEEPS the
circles and unions them with a shorter base. No composite needed. */
.tb-46__band {
-webkit-mask: radial-gradient(.42rem .42rem at 50% 100%, #000 96%, transparent 0) 0 0/.84rem .42rem repeat-x, radial-gradient(.42rem .42rem at 50% 0, #000 96%, transparent 0) 0 100%/.84rem .42rem repeat-x, linear-gradient(#000, #000) 0 .4rem/100% calc(100% - .8rem) no-repeat;
mask: radial-gradient(.42rem .42rem at 50% 100%, #000 96%, transparent 0) 0 0/.84rem .42rem repeat-x, radial-gradient(.42rem .42rem at 50% 0, #000 96%, transparent 0) 0 100%/.84rem .42rem repeat-x, linear-gradient(#000, #000) 0 .4rem/100% calc(100% - .8rem) no-repeat;
}
/* GUILLOCHÉ: two crossing repeating gradients at ±30°, very low alpha so it
engraves rather than stripes. */
.tb-46__lattice {
background: repeating-linear-gradient(30deg, rgba(60,42,12,.16) 0 1px, transparent 1px 7px), repeating-linear-gradient(-30deg, rgba(60,42,12,.14) 0 1px, transparent 1px 7px);
}
.tb-46__medal {
background: radial-gradient(circle at 36% 30%, #fbeec2, #c99f4f 62%, #8a6528);
}
@media (prefers-color-scheme: light) {
.tb-46:not([data-theme="dark"]) {
--color-tb46-bg: oklch(0.22 0.035 52);
}
}
.tb-46[data-theme="light"] {
--color-tb46-bg: oklch(0.22 0.035 52);
}
@media (forced-colors: active) {
.tb-46__band {
background: ButtonFace;
color: ButtonText;
border: 1px solid ButtonText;
mask: none;
-webkit-mask: none;
text-shadow: none;
filter: none;
}
.tb-46__lattice {
display: none;
}
.tb-46__medal {
background: ButtonFace;
border: 1px solid ButtonText;
box-shadow: none;
}
}
```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 Victorian Cigar Band Foil Button
Source: https://codefronts.com/components/tailwind-css-buttons/tailwind-victorian-cigar-band-foil-button/
A cigar band in embossed gold foil: scalloped top and bottom edges, a guilloché lattice engraved into the field, a laurel medallion struck in the centre, and small-caps lettering raised with a two-tone bevel. Hover tilts the foil so the light runs the other way.
## HTML
```html
<div class="tb-46 w-full min-h-svh grid place-items-center font-tb46-serif p-[clamp(1.5rem,6vw,4rem)]">
<button type="button" class="tb-46__band relative overflow-hidden cursor-pointer grid grid-flow-col items-center gap-3.5 min-h-18 px-10 py-4 border-0 rounded-[0.2rem] text-[1.0625rem] font-bold tracking-[0.14em] uppercase text-tb46-ink bg-[linear-gradient(104deg,#7d5a1e,#f6e3ae_22%,#c99f4f_42%,#8d6a2c_58%,#f2dda6_78%,#8a6528)] bg-[length:180%_100%] bg-[position:0%_0%] [text-shadow:0_1px_0_#fff7dcb8,0_-1px_0_#3c2a0c80] drop-shadow-[0_10px_16px_#00000099] transition-[background-position,translate,filter] duration-700 ease-tb46-out [-webkit-tap-highlight-color:transparent] hover:bg-[position:100%_0%] hover:-translate-y-0.5 hover:drop-shadow-[0_16px_22px_#000000a6] focus-visible:bg-[position:100%_0%] focus-visible:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-offset-[5px] focus-visible:outline-tb46-foil-hi active:translate-y-px active:drop-shadow-[0_4px_8px_#00000099] disabled:cursor-not-allowed disabled:grayscale-[0.7] disabled:opacity-75 motion-reduce:transition-none">
<span aria-hidden="true" class="tb-46__lattice absolute inset-0 pointer-events-none opacity-50"></span>
<span aria-hidden="true" class="tb-46__medal relative z-20 grid place-items-center size-8.5 rounded-full text-tb46-ink shadow-[inset_0_1px_0_#fff7dcb3,inset_0_-1px_2px_#3c2a0c80,0_1px_2px_#00000066]">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" class="size-5"><path d="M12 4c-2.4 2.6-3.4 5.6-3 8.6.3 2.4 1.5 4.4 3 6.4 1.5-2 2.7-4 3-6.4.4-3-.6-6-3-8.6z"/><path d="M8.4 9.6c-1.6.3-2.8 1.2-3.6 2.6M15.6 9.6c1.6.3 2.8 1.2 3.6 2.6"/></svg>
</span>
<span class="relative z-20">Havana Reserve</span>
</button>
</div>
```
## CSS
```css
@import "tailwindcss";
@theme {
--color-tb46-bg: #1a120c;
--color-tb46-bg: oklch(0.17 0.03 52);
--color-tb46-ink: #3c2a0c;
--color-tb46-ink: oklch(0.28 0.06 78);
--color-tb46-foil-hi: #f6e3ae;
--color-tb46-foil-hi: oklch(0.91 0.07 88);
--font-tb46-serif: "Cinzel", ui-serif, Georgia, "Times New Roman", serif;
--ease-tb46-out: cubic-bezier(0.16, 1, 0.3, 1);
}
.tb-46 {
width: 100%;
min-height: 100vh;
min-height: 100svh;
background: radial-gradient(32rem 20rem at 50% 42%, rgba(215,170,90,.16), transparent 72%), var(--color-tb46-bg);
}
/* SCALLOPED EDGES: the perforation technique inverted — the mask KEEPS the
circles and unions them with a shorter base. No composite needed. */
.tb-46__band {
-webkit-mask: radial-gradient(.42rem .42rem at 50% 100%, #000 96%, transparent 0) 0 0/.84rem .42rem repeat-x, radial-gradient(.42rem .42rem at 50% 0, #000 96%, transparent 0) 0 100%/.84rem .42rem repeat-x, linear-gradient(#000, #000) 0 .4rem/100% calc(100% - .8rem) no-repeat;
mask: radial-gradient(.42rem .42rem at 50% 100%, #000 96%, transparent 0) 0 0/.84rem .42rem repeat-x, radial-gradient(.42rem .42rem at 50% 0, #000 96%, transparent 0) 0 100%/.84rem .42rem repeat-x, linear-gradient(#000, #000) 0 .4rem/100% calc(100% - .8rem) no-repeat;
}
/* GUILLOCHÉ: two crossing repeating gradients at ±30°, very low alpha so it
engraves rather than stripes. */
.tb-46__lattice {
background: repeating-linear-gradient(30deg, rgba(60,42,12,.16) 0 1px, transparent 1px 7px), repeating-linear-gradient(-30deg, rgba(60,42,12,.14) 0 1px, transparent 1px 7px);
}
.tb-46__medal {
background: radial-gradient(circle at 36% 30%, #fbeec2, #c99f4f 62%, #8a6528);
}
@media (prefers-color-scheme: light) {
.tb-46:not([data-theme="dark"]) {
--color-tb46-bg: oklch(0.22 0.035 52);
}
}
.tb-46[data-theme="light"] {
--color-tb46-bg: oklch(0.22 0.035 52);
}
@media (forced-colors: active) {
.tb-46__band {
background: ButtonFace;
color: ButtonText;
border: 1px solid ButtonText;
mask: none;
-webkit-mask: none;
text-shadow: none;
filter: none;
}
.tb-46__lattice {
display: none;
}
.tb-46__medal {
background: ButtonFace;
border: 1px solid ButtonText;
box-shadow: none;
}
}
```How this works
Scallops are perforation upside down. Instead of subtracting dots from an edge, the mask keeps them and unions them with a shorter base, producing a repeating bump:
mask:
radial-gradient(.42rem .42rem at 50% 100%, #000 96%, transparent 0) 0 0/.84rem .42rem repeat-x,
radial-gradient(.42rem .42rem at 50% 0, #000 96%, transparent 0) 0 100%/.84rem .42rem repeat-x,
linear-gradient(#000,#000) 0 .4rem/100% calc(100% - .8rem) no-repeat;No composite needed — the layers union by default, which is exactly the difference between this and the stamp.
The hover moves the background, not a layer. A five-stop gradient at 180% width shifted from 0% to 100% makes the bright and dark bands travel across the band, which reads as the foil being turned.
Make it yours
- Scallop size: the mask radius and tile width together (radius = half the tile).
- Silver or copper: shift all five stops to the same hue family.
- The medallion glyph sits in a normal grid cell — any monogram or icon works.
- Lattice opacity is the plainness dial: lower for a quiet band, higher for full Victorian.
- The sweep is 700ms. Foil is heavy; don't rush it.
Gotchas — read before shipping
- Embossed type needs light below and dark above. Reverse them and it looks debossed.
- Gold-on-gold contrast is a real problem. The label uses a dark ink shadow, not a lighter gold.
- Multi-layer masks need every size and repeat spelled out or the base layer tiles.
- Ornate styling invites small caps at tiny sizes — keep cap height ≥0.75rem.
- Animating
background-positionon a five-stop gradient is a repaint. Short transition, small element.
Browser support
| Chrome | Safari | Firefox | Edge |
|---|---|---|---|
| 120+ | 16.4+ | 128+ | 120+ |
Multi-layer mask shorthand needs Chrome 120 / Safari 15.4 / Firefox 53. Without it the edges are straight and everything else is identical.