10 / 25
All 25 in 25 Tailwind CSS Button Groups
- 01Tailwind Split Button with Anchor-Positioned Popover Dropdown (No JS)
- 02Tailwind Segmented Control with Motion-Path Comet Indicator
- 03Tailwind Toggle Button Group with View Transitions Morphing Highlight
- 04Tailwind Pricing Toggle — Monthly / Yearly Billing Switch (No JS)
- 05Tailwind Segmented Control with Sliding Thumb (iOS Style)
- 06Tailwind Split Button Dropdown with Native Details Menu (Save Options)
- 07Tailwind Icon Button Group Toolbar with Tooltips (Rich Text Editor)
- 08Tailwind Pill Filter Button Group with Sliding Indicator (Anchor Positioning)
- 09Tailwind Toggle Button Group for Text Alignment (Radio Inputs, Live Preview)
- 10Tailwind Web3 Connect Wallet Button Grid (Wallet Sign-In Modal)
- 11Tailwind AI Model Selector Button Group (LLM Model Picker with Badges)
- 12Tailwind Liquid Metal Segmented Control (Animated Chrome Thumb)
- 13Tailwind Tab Button Group with Subgrid Underline Indicator
- 14Tailwind Multi-Select Chip Buttons (Tag Filter Checkboxes with Count)
- 15Tailwind Animated Split Button Deploy Menu (Staggered Dropdown Reveal)
- 16Tailwind Radio Button Group with Conic Fill Animation (Export Format Picker)
- 17Tailwind Retro LED Pixel Button Group (Dot-Matrix Display Buttons)
- 18Tailwind Hold-to-Confirm Button Group with Gradient Progress (Press and Hold)
- 19Tailwind Holographic Icon Segmented Control (Grid / List View Switcher)
- 20Tailwind 3D Vertical Button Group with Hover Depth (Perspective Stack)
- 21Tailwind Floating Action Button with Radial Speed Dial Menu (No JS)
- 22Tailwind Glitch Effect Button Group (Cyberpunk RGB-Split Audio Filter)
- 23Tailwind Animated Gradient Border Pill Buttons (Rotating Conic Ring)
- 24Tailwind Button Group with Ripple Click Effect (Radar Shockwave Feedback)
- 25Tailwind Button Group with Cursor-Following Spotlight Glow (Date Range Presets)
Tailwind Web3 Connect Wallet Button Grid (Wallet Sign-In Modal)
A dark, glassy wallet picker: a responsive grid-cols-[repeat(auto-fit,minmax(9.5rem,1fr))] of wallet tiles, the recommended one wrapped in a true gradient border ([background:…_padding-box,…_border-box]) with a floating badge, and a hover that lifts the tile and reveals a connect arrow. A close button and a reassuring footer make it a complete modal.
Untitled UI Pro: 5,000+ React + Tailwind CSS v4 components · from $349 one-time
Untitled UI React · Affiliate link
The code
<section class="tbg-10 w-full min-h-svh grid place-items-center bg-tbg10-bg bg-[radial-gradient(120%_100%_at_50%_-10%,var(--color-tbg10-glow),transparent_70%)] px-5 py-14 font-tbg10-sans text-tbg10-ink" aria-label="Web3 wallet connect grid demo">
<div role="dialog" aria-labelledby="tbg10-title" class="relative w-full max-w-[29rem] rounded-3xl border border-tbg10-a1/25 bg-linear-to-b from-tbg10-panel/60 to-tbg10-tile/90 px-6 pt-7 pb-6 shadow-tbg10-modal backdrop-blur-md sm:px-7">
<button type="button" aria-label="Close" class="absolute top-4 right-4 grid size-11 cursor-pointer place-items-center rounded-full text-tbg10-mut transition hover:bg-white/8 hover:text-tbg10-ink focus-visible:outline-3 focus-visible:outline-tbg10-a2"><svg viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" aria-hidden="true"><path d="M6 6l12 12M18 6L6 18"/></svg></button>
<p class="w-fit bg-linear-90 from-tbg10-a1 to-tbg10-a2 bg-clip-text text-xs font-extrabold uppercase tracking-[0.18em] text-transparent">Connect</p>
<h3 id="tbg10-title" class="mt-1.5 mb-1.5 text-[26px] font-bold tracking-[-0.02em]">Choose a wallet</h3>
<p class="mb-6 text-sm text-tbg10-mut">Sign in to continue. We never store your keys.</p>
<div class="grid grid-cols-[repeat(auto-fit,minmax(9.5rem,1fr))] gap-3">
<button type="button" class="group relative flex cursor-pointer flex-col items-start gap-2.5 rounded-2xl border-[1.5px] border-transparent p-4 text-left transition-[translate,box-shadow] duration-200 [background:linear-gradient(var(--color-tbg10-tile),var(--color-tbg10-tile))_padding-box,linear-gradient(135deg,var(--color-tbg10-a1),var(--color-tbg10-a2))_border-box] hover:-translate-y-0.5 hover:shadow-[0_14px_30px_-14px_var(--color-tbg10-a1)] focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-tbg10-a2 motion-reduce:transition-none">
<span class="absolute -top-2.5 right-3 rounded-full bg-linear-90 from-tbg10-a1 to-tbg10-a2 px-2.5 py-1 text-[10px] font-extrabold uppercase tracking-[0.04em] text-tbg10-bg">Recommended</span>
<span aria-hidden="true" style="--l:linear-gradient(135deg,#f6851b,#e2761b)" class="grid size-10 place-items-center rounded-xl bg-(image:--l) text-lg font-extrabold text-white">M</span>
<span class="text-[15.5px] font-bold">MetaMask</span>
<span class="flex items-center gap-1.5 text-xs text-tbg10-ok"><span aria-hidden="true" class="size-1.5 rounded-full bg-tbg10-ok"></span>Detected in browser</span>
<svg class="absolute top-4 right-4 -translate-x-1 opacity-0 transition duration-200 group-hover:translate-x-0 group-hover:opacity-100 group-focus-visible:translate-x-0 group-focus-visible:opacity-100" viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg>
</button>
<button type="button" class="group relative flex cursor-pointer flex-col items-start gap-2.5 rounded-2xl border border-white/10 bg-white/4 p-4 text-left transition-[translate,border-color,background-color] duration-200 hover:-translate-y-0.5 hover:border-tbg10-a2 hover:bg-white/7 focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-tbg10-a2 motion-reduce:transition-none">
<span aria-hidden="true" style="--l:linear-gradient(135deg,#3b99fc,#1f6fe5)" class="grid size-10 place-items-center rounded-xl bg-(image:--l) text-lg font-extrabold text-white">W</span>
<span class="text-[15.5px] font-bold">WalletConnect</span>
<span class="text-xs text-tbg10-mut">Scan with mobile app</span>
<svg class="absolute top-4 right-4 -translate-x-1 opacity-0 transition duration-200 group-hover:translate-x-0 group-hover:opacity-100 group-focus-visible:translate-x-0 group-focus-visible:opacity-100" viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg>
</button>
<button type="button" class="group relative flex cursor-pointer flex-col items-start gap-2.5 rounded-2xl border border-white/10 bg-white/4 p-4 text-left transition-[translate,border-color,background-color] duration-200 hover:-translate-y-0.5 hover:border-tbg10-a2 hover:bg-white/7 focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-tbg10-a2 motion-reduce:transition-none">
<span aria-hidden="true" style="--l:linear-gradient(135deg,#2c5ff6,#0a3ecb)" class="grid size-10 place-items-center rounded-xl bg-(image:--l) text-lg font-extrabold text-white">C</span>
<span class="text-[15.5px] font-bold">Coinbase Wallet</span>
<span class="text-xs text-tbg10-mut">Extension or app</span>
<svg class="absolute top-4 right-4 -translate-x-1 opacity-0 transition duration-200 group-hover:translate-x-0 group-hover:opacity-100 group-focus-visible:translate-x-0 group-focus-visible:opacity-100" viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg>
</button>
<button type="button" class="group relative flex cursor-pointer flex-col items-start gap-2.5 rounded-2xl border border-white/10 bg-white/4 p-4 text-left transition-[translate,border-color,background-color] duration-200 hover:-translate-y-0.5 hover:border-tbg10-a2 hover:bg-white/7 focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-tbg10-a2 motion-reduce:transition-none">
<span aria-hidden="true" style="--l:linear-gradient(135deg,#4a4a4a,#141414)" class="grid size-10 place-items-center rounded-xl bg-(image:--l) text-lg font-extrabold text-white ring-1 ring-white/15">L</span>
<span class="text-[15.5px] font-bold">Ledger</span>
<span class="text-xs text-tbg10-mut">Hardware wallet</span>
<svg class="absolute top-4 right-4 -translate-x-1 opacity-0 transition duration-200 group-hover:translate-x-0 group-hover:opacity-100 group-focus-visible:translate-x-0 group-focus-visible:opacity-100" viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg>
</button>
</div>
<p class="mt-6 flex items-center justify-center gap-2 border-t border-white/8 pt-5 text-[13px] text-tbg10-mut">New to wallets? <a href="#" class="font-semibold text-tbg10-a2 underline-offset-4 hover:underline focus-visible:outline-2 focus-visible:outline-tbg10-a2">Learn how they work</a></p>
</div>
</section><section class="tbg-10 w-full min-h-svh grid place-items-center bg-tbg10-bg bg-[radial-gradient(120%_100%_at_50%_-10%,var(--color-tbg10-glow),transparent_70%)] px-5 py-14 font-tbg10-sans text-tbg10-ink" aria-label="Web3 wallet connect grid demo">
<div role="dialog" aria-labelledby="tbg10-title" class="relative w-full max-w-[29rem] rounded-3xl border border-tbg10-a1/25 bg-linear-to-b from-tbg10-panel/60 to-tbg10-tile/90 px-6 pt-7 pb-6 shadow-tbg10-modal backdrop-blur-md sm:px-7">
<button type="button" aria-label="Close" class="absolute top-4 right-4 grid size-11 cursor-pointer place-items-center rounded-full text-tbg10-mut transition hover:bg-white/8 hover:text-tbg10-ink focus-visible:outline-3 focus-visible:outline-tbg10-a2"><svg viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" aria-hidden="true"><path d="M6 6l12 12M18 6L6 18"/></svg></button>
<p class="w-fit bg-linear-90 from-tbg10-a1 to-tbg10-a2 bg-clip-text text-xs font-extrabold uppercase tracking-[0.18em] text-transparent">Connect</p>
<h3 id="tbg10-title" class="mt-1.5 mb-1.5 text-[26px] font-bold tracking-[-0.02em]">Choose a wallet</h3>
<p class="mb-6 text-sm text-tbg10-mut">Sign in to continue. We never store your keys.</p>
<div class="grid grid-cols-[repeat(auto-fit,minmax(9.5rem,1fr))] gap-3">
<button type="button" class="group relative flex cursor-pointer flex-col items-start gap-2.5 rounded-2xl border-[1.5px] border-transparent p-4 text-left transition-[translate,box-shadow] duration-200 [background:linear-gradient(var(--color-tbg10-tile),var(--color-tbg10-tile))_padding-box,linear-gradient(135deg,var(--color-tbg10-a1),var(--color-tbg10-a2))_border-box] hover:-translate-y-0.5 hover:shadow-[0_14px_30px_-14px_var(--color-tbg10-a1)] focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-tbg10-a2 motion-reduce:transition-none">
<span class="absolute -top-2.5 right-3 rounded-full bg-linear-90 from-tbg10-a1 to-tbg10-a2 px-2.5 py-1 text-[10px] font-extrabold uppercase tracking-[0.04em] text-tbg10-bg">Recommended</span>
<span aria-hidden="true" style="--l:linear-gradient(135deg,#f6851b,#e2761b)" class="grid size-10 place-items-center rounded-xl bg-(image:--l) text-lg font-extrabold text-white">M</span>
<span class="text-[15.5px] font-bold">MetaMask</span>
<span class="flex items-center gap-1.5 text-xs text-tbg10-ok"><span aria-hidden="true" class="size-1.5 rounded-full bg-tbg10-ok"></span>Detected in browser</span>
<svg class="absolute top-4 right-4 -translate-x-1 opacity-0 transition duration-200 group-hover:translate-x-0 group-hover:opacity-100 group-focus-visible:translate-x-0 group-focus-visible:opacity-100" viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg>
</button>
<button type="button" class="group relative flex cursor-pointer flex-col items-start gap-2.5 rounded-2xl border border-white/10 bg-white/4 p-4 text-left transition-[translate,border-color,background-color] duration-200 hover:-translate-y-0.5 hover:border-tbg10-a2 hover:bg-white/7 focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-tbg10-a2 motion-reduce:transition-none">
<span aria-hidden="true" style="--l:linear-gradient(135deg,#3b99fc,#1f6fe5)" class="grid size-10 place-items-center rounded-xl bg-(image:--l) text-lg font-extrabold text-white">W</span>
<span class="text-[15.5px] font-bold">WalletConnect</span>
<span class="text-xs text-tbg10-mut">Scan with mobile app</span>
<svg class="absolute top-4 right-4 -translate-x-1 opacity-0 transition duration-200 group-hover:translate-x-0 group-hover:opacity-100 group-focus-visible:translate-x-0 group-focus-visible:opacity-100" viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg>
</button>
<button type="button" class="group relative flex cursor-pointer flex-col items-start gap-2.5 rounded-2xl border border-white/10 bg-white/4 p-4 text-left transition-[translate,border-color,background-color] duration-200 hover:-translate-y-0.5 hover:border-tbg10-a2 hover:bg-white/7 focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-tbg10-a2 motion-reduce:transition-none">
<span aria-hidden="true" style="--l:linear-gradient(135deg,#2c5ff6,#0a3ecb)" class="grid size-10 place-items-center rounded-xl bg-(image:--l) text-lg font-extrabold text-white">C</span>
<span class="text-[15.5px] font-bold">Coinbase Wallet</span>
<span class="text-xs text-tbg10-mut">Extension or app</span>
<svg class="absolute top-4 right-4 -translate-x-1 opacity-0 transition duration-200 group-hover:translate-x-0 group-hover:opacity-100 group-focus-visible:translate-x-0 group-focus-visible:opacity-100" viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg>
</button>
<button type="button" class="group relative flex cursor-pointer flex-col items-start gap-2.5 rounded-2xl border border-white/10 bg-white/4 p-4 text-left transition-[translate,border-color,background-color] duration-200 hover:-translate-y-0.5 hover:border-tbg10-a2 hover:bg-white/7 focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-tbg10-a2 motion-reduce:transition-none">
<span aria-hidden="true" style="--l:linear-gradient(135deg,#4a4a4a,#141414)" class="grid size-10 place-items-center rounded-xl bg-(image:--l) text-lg font-extrabold text-white ring-1 ring-white/15">L</span>
<span class="text-[15.5px] font-bold">Ledger</span>
<span class="text-xs text-tbg10-mut">Hardware wallet</span>
<svg class="absolute top-4 right-4 -translate-x-1 opacity-0 transition duration-200 group-hover:translate-x-0 group-hover:opacity-100 group-focus-visible:translate-x-0 group-focus-visible:opacity-100" viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg>
</button>
</div>
<p class="mt-6 flex items-center justify-center gap-2 border-t border-white/8 pt-5 text-[13px] text-tbg10-mut">New to wallets? <a href="#" class="font-semibold text-tbg10-a2 underline-offset-4 hover:underline focus-visible:outline-2 focus-visible:outline-tbg10-a2">Learn how they work</a></p>
</div>
</section>@import "tailwindcss";
@theme {
--color-tbg10-bg: #0a0713;
--color-tbg10-glow: #1d1636;
--color-tbg10-panel: #281e46;
--color-tbg10-tile: #120c22;
--color-tbg10-ink: #f2eeff;
--color-tbg10-mut: #b3a9d6;
--color-tbg10-mut: oklch(0.76 0.06 290);
--color-tbg10-ok: #6fe2a6;
--color-tbg10-ok: oklch(0.83 0.14 158);
--color-tbg10-a1: #9b4dff;
--color-tbg10-a1: oklch(0.62 0.23 300);
--color-tbg10-a2: #4dd2e8;
--color-tbg10-a2: oklch(0.8 0.12 210);
--shadow-tbg10-modal: 0 40px 90px -40px rgb(90 40 220 / 0.6);
--font-tbg10-sans: 'Sora', system-ui, sans-serif;
}
/* Root rule: the full-bleed contract, restated so the stage is sized before the browser build compiles. */
.tbg-10 {
width: 100%;
min-height: 100svh;
}@import "tailwindcss";
@theme {
--color-tbg10-bg: #0a0713;
--color-tbg10-glow: #1d1636;
--color-tbg10-panel: #281e46;
--color-tbg10-tile: #120c22;
--color-tbg10-ink: #f2eeff;
--color-tbg10-mut: #b3a9d6;
--color-tbg10-mut: oklch(0.76 0.06 290);
--color-tbg10-ok: #6fe2a6;
--color-tbg10-ok: oklch(0.83 0.14 158);
--color-tbg10-a1: #9b4dff;
--color-tbg10-a1: oklch(0.62 0.23 300);
--color-tbg10-a2: #4dd2e8;
--color-tbg10-a2: oklch(0.8 0.12 210);
--shadow-tbg10-modal: 0 40px 90px -40px rgb(90 40 220 / 0.6);
--font-tbg10-sans: 'Sora', system-ui, sans-serif;
}
/* Root rule: the full-bleed contract, restated so the stage is sized before the browser build compiles. */
.tbg-10 {
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-tbg10-bg: #0a0713;
--color-tbg10-glow: #1d1636;
--color-tbg10-panel: #281e46;
--color-tbg10-tile: #120c22;
--color-tbg10-ink: #f2eeff;
--color-tbg10-mut: #b3a9d6;
--color-tbg10-mut: oklch(0.76 0.06 290);
--color-tbg10-ok: #6fe2a6;
--color-tbg10-ok: oklch(0.83 0.14 158);
--color-tbg10-a1: #9b4dff;
--color-tbg10-a1: oklch(0.62 0.23 300);
--color-tbg10-a2: #4dd2e8;
--color-tbg10-a2: oklch(0.8 0.12 210);
--shadow-tbg10-modal: 0 40px 90px -40px rgb(90 40 220 / 0.6);
--font-tbg10-sans: 'Sora', system-ui, sans-serif;
}
/* Root rule: the full-bleed contract, restated so the stage is sized before the browser build compiles. */
.tbg-10 {
width: 100%;
min-height: 100svh;
}@import "tailwindcss";
@theme {
--color-tbg10-bg: #0a0713;
--color-tbg10-glow: #1d1636;
--color-tbg10-panel: #281e46;
--color-tbg10-tile: #120c22;
--color-tbg10-ink: #f2eeff;
--color-tbg10-mut: #b3a9d6;
--color-tbg10-mut: oklch(0.76 0.06 290);
--color-tbg10-ok: #6fe2a6;
--color-tbg10-ok: oklch(0.83 0.14 158);
--color-tbg10-a1: #9b4dff;
--color-tbg10-a1: oklch(0.62 0.23 300);
--color-tbg10-a2: #4dd2e8;
--color-tbg10-a2: oklch(0.8 0.12 210);
--shadow-tbg10-modal: 0 40px 90px -40px rgb(90 40 220 / 0.6);
--font-tbg10-sans: 'Sora', system-ui, sans-serif;
}
/* Root rule: the full-bleed contract, restated so the stage is sized before the browser build compiles. */
.tbg-10 {
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=Sora:wght@400..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=Sora:wght@400..800&display=swap">What changed in the port
Which parts became utilities, which stayed CSS, and why.
- The
.btn-10__tile--recpadding-box/border-box trick moved verbatim into one arbitrary[background:…]property, andbackground:var(--l)became v4'sbg-(image:--l). -webkit-background-clip:textbecamebg-clip-text text-transparent.- UI upgrade: the modal gained a close button,
role="dialog"labelled by its heading, a hover/focus connect arrow on each tile and a help link in the footer. - UI upgrade: “Detected” is now a green status with a dot, and muted copy rose from 60% white to
oklch(0.76)(7: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: Tailwind Web3 Connect Wallet Button Grid (Wallet Sign-In Modal)
Source: https://codefronts.com/components/tailwind-css-button-groups/tailwind-web3-connect-wallet-button-grid/
A dark, glassy wallet picker: a responsive grid-cols-[repeat(auto-fit,minmax(9.5rem,1fr))] of wallet tiles, the recommended one wrapped in a true gradient border ([background:…_padding-box,…_border-box]) with a floating badge, and a hover that lifts the tile and reveals a connect arrow. A close button and a reassuring footer make it a complete modal.
## HTML
```html
<section class="tbg-10 w-full min-h-svh grid place-items-center bg-tbg10-bg bg-[radial-gradient(120%_100%_at_50%_-10%,var(--color-tbg10-glow),transparent_70%)] px-5 py-14 font-tbg10-sans text-tbg10-ink" aria-label="Web3 wallet connect grid demo">
<div role="dialog" aria-labelledby="tbg10-title" class="relative w-full max-w-[29rem] rounded-3xl border border-tbg10-a1/25 bg-linear-to-b from-tbg10-panel/60 to-tbg10-tile/90 px-6 pt-7 pb-6 shadow-tbg10-modal backdrop-blur-md sm:px-7">
<button type="button" aria-label="Close" class="absolute top-4 right-4 grid size-11 cursor-pointer place-items-center rounded-full text-tbg10-mut transition hover:bg-white/8 hover:text-tbg10-ink focus-visible:outline-3 focus-visible:outline-tbg10-a2"><svg viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" aria-hidden="true"><path d="M6 6l12 12M18 6L6 18"/></svg></button>
<p class="w-fit bg-linear-90 from-tbg10-a1 to-tbg10-a2 bg-clip-text text-xs font-extrabold uppercase tracking-[0.18em] text-transparent">Connect</p>
<h3 id="tbg10-title" class="mt-1.5 mb-1.5 text-[26px] font-bold tracking-[-0.02em]">Choose a wallet</h3>
<p class="mb-6 text-sm text-tbg10-mut">Sign in to continue. We never store your keys.</p>
<div class="grid grid-cols-[repeat(auto-fit,minmax(9.5rem,1fr))] gap-3">
<button type="button" class="group relative flex cursor-pointer flex-col items-start gap-2.5 rounded-2xl border-[1.5px] border-transparent p-4 text-left transition-[translate,box-shadow] duration-200 [background:linear-gradient(var(--color-tbg10-tile),var(--color-tbg10-tile))_padding-box,linear-gradient(135deg,var(--color-tbg10-a1),var(--color-tbg10-a2))_border-box] hover:-translate-y-0.5 hover:shadow-[0_14px_30px_-14px_var(--color-tbg10-a1)] focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-tbg10-a2 motion-reduce:transition-none">
<span class="absolute -top-2.5 right-3 rounded-full bg-linear-90 from-tbg10-a1 to-tbg10-a2 px-2.5 py-1 text-[10px] font-extrabold uppercase tracking-[0.04em] text-tbg10-bg">Recommended</span>
<span aria-hidden="true" style="--l:linear-gradient(135deg,#f6851b,#e2761b)" class="grid size-10 place-items-center rounded-xl bg-(image:--l) text-lg font-extrabold text-white">M</span>
<span class="text-[15.5px] font-bold">MetaMask</span>
<span class="flex items-center gap-1.5 text-xs text-tbg10-ok"><span aria-hidden="true" class="size-1.5 rounded-full bg-tbg10-ok"></span>Detected in browser</span>
<svg class="absolute top-4 right-4 -translate-x-1 opacity-0 transition duration-200 group-hover:translate-x-0 group-hover:opacity-100 group-focus-visible:translate-x-0 group-focus-visible:opacity-100" viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg>
</button>
<button type="button" class="group relative flex cursor-pointer flex-col items-start gap-2.5 rounded-2xl border border-white/10 bg-white/4 p-4 text-left transition-[translate,border-color,background-color] duration-200 hover:-translate-y-0.5 hover:border-tbg10-a2 hover:bg-white/7 focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-tbg10-a2 motion-reduce:transition-none">
<span aria-hidden="true" style="--l:linear-gradient(135deg,#3b99fc,#1f6fe5)" class="grid size-10 place-items-center rounded-xl bg-(image:--l) text-lg font-extrabold text-white">W</span>
<span class="text-[15.5px] font-bold">WalletConnect</span>
<span class="text-xs text-tbg10-mut">Scan with mobile app</span>
<svg class="absolute top-4 right-4 -translate-x-1 opacity-0 transition duration-200 group-hover:translate-x-0 group-hover:opacity-100 group-focus-visible:translate-x-0 group-focus-visible:opacity-100" viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg>
</button>
<button type="button" class="group relative flex cursor-pointer flex-col items-start gap-2.5 rounded-2xl border border-white/10 bg-white/4 p-4 text-left transition-[translate,border-color,background-color] duration-200 hover:-translate-y-0.5 hover:border-tbg10-a2 hover:bg-white/7 focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-tbg10-a2 motion-reduce:transition-none">
<span aria-hidden="true" style="--l:linear-gradient(135deg,#2c5ff6,#0a3ecb)" class="grid size-10 place-items-center rounded-xl bg-(image:--l) text-lg font-extrabold text-white">C</span>
<span class="text-[15.5px] font-bold">Coinbase Wallet</span>
<span class="text-xs text-tbg10-mut">Extension or app</span>
<svg class="absolute top-4 right-4 -translate-x-1 opacity-0 transition duration-200 group-hover:translate-x-0 group-hover:opacity-100 group-focus-visible:translate-x-0 group-focus-visible:opacity-100" viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg>
</button>
<button type="button" class="group relative flex cursor-pointer flex-col items-start gap-2.5 rounded-2xl border border-white/10 bg-white/4 p-4 text-left transition-[translate,border-color,background-color] duration-200 hover:-translate-y-0.5 hover:border-tbg10-a2 hover:bg-white/7 focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-tbg10-a2 motion-reduce:transition-none">
<span aria-hidden="true" style="--l:linear-gradient(135deg,#4a4a4a,#141414)" class="grid size-10 place-items-center rounded-xl bg-(image:--l) text-lg font-extrabold text-white ring-1 ring-white/15">L</span>
<span class="text-[15.5px] font-bold">Ledger</span>
<span class="text-xs text-tbg10-mut">Hardware wallet</span>
<svg class="absolute top-4 right-4 -translate-x-1 opacity-0 transition duration-200 group-hover:translate-x-0 group-hover:opacity-100 group-focus-visible:translate-x-0 group-focus-visible:opacity-100" viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg>
</button>
</div>
<p class="mt-6 flex items-center justify-center gap-2 border-t border-white/8 pt-5 text-[13px] text-tbg10-mut">New to wallets? <a href="#" class="font-semibold text-tbg10-a2 underline-offset-4 hover:underline focus-visible:outline-2 focus-visible:outline-tbg10-a2">Learn how they work</a></p>
</div>
</section>
```
## CSS
```css
@import "tailwindcss";
@theme {
--color-tbg10-bg: #0a0713;
--color-tbg10-glow: #1d1636;
--color-tbg10-panel: #281e46;
--color-tbg10-tile: #120c22;
--color-tbg10-ink: #f2eeff;
--color-tbg10-mut: #b3a9d6;
--color-tbg10-mut: oklch(0.76 0.06 290);
--color-tbg10-ok: #6fe2a6;
--color-tbg10-ok: oklch(0.83 0.14 158);
--color-tbg10-a1: #9b4dff;
--color-tbg10-a1: oklch(0.62 0.23 300);
--color-tbg10-a2: #4dd2e8;
--color-tbg10-a2: oklch(0.8 0.12 210);
--shadow-tbg10-modal: 0 40px 90px -40px rgb(90 40 220 / 0.6);
--font-tbg10-sans: 'Sora', system-ui, sans-serif;
}
/* Root rule: the full-bleed contract, restated so the stage is sized before the browser build compiles. */
.tbg-10 {
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 Web3 Connect Wallet Button Grid (Wallet Sign-In Modal)
Source: https://codefronts.com/components/tailwind-css-button-groups/tailwind-web3-connect-wallet-button-grid/
A dark, glassy wallet picker: a responsive grid-cols-[repeat(auto-fit,minmax(9.5rem,1fr))] of wallet tiles, the recommended one wrapped in a true gradient border ([background:…_padding-box,…_border-box]) with a floating badge, and a hover that lifts the tile and reveals a connect arrow. A close button and a reassuring footer make it a complete modal.
## HTML
```html
<section class="tbg-10 w-full min-h-svh grid place-items-center bg-tbg10-bg bg-[radial-gradient(120%_100%_at_50%_-10%,var(--color-tbg10-glow),transparent_70%)] px-5 py-14 font-tbg10-sans text-tbg10-ink" aria-label="Web3 wallet connect grid demo">
<div role="dialog" aria-labelledby="tbg10-title" class="relative w-full max-w-[29rem] rounded-3xl border border-tbg10-a1/25 bg-linear-to-b from-tbg10-panel/60 to-tbg10-tile/90 px-6 pt-7 pb-6 shadow-tbg10-modal backdrop-blur-md sm:px-7">
<button type="button" aria-label="Close" class="absolute top-4 right-4 grid size-11 cursor-pointer place-items-center rounded-full text-tbg10-mut transition hover:bg-white/8 hover:text-tbg10-ink focus-visible:outline-3 focus-visible:outline-tbg10-a2"><svg viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" aria-hidden="true"><path d="M6 6l12 12M18 6L6 18"/></svg></button>
<p class="w-fit bg-linear-90 from-tbg10-a1 to-tbg10-a2 bg-clip-text text-xs font-extrabold uppercase tracking-[0.18em] text-transparent">Connect</p>
<h3 id="tbg10-title" class="mt-1.5 mb-1.5 text-[26px] font-bold tracking-[-0.02em]">Choose a wallet</h3>
<p class="mb-6 text-sm text-tbg10-mut">Sign in to continue. We never store your keys.</p>
<div class="grid grid-cols-[repeat(auto-fit,minmax(9.5rem,1fr))] gap-3">
<button type="button" class="group relative flex cursor-pointer flex-col items-start gap-2.5 rounded-2xl border-[1.5px] border-transparent p-4 text-left transition-[translate,box-shadow] duration-200 [background:linear-gradient(var(--color-tbg10-tile),var(--color-tbg10-tile))_padding-box,linear-gradient(135deg,var(--color-tbg10-a1),var(--color-tbg10-a2))_border-box] hover:-translate-y-0.5 hover:shadow-[0_14px_30px_-14px_var(--color-tbg10-a1)] focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-tbg10-a2 motion-reduce:transition-none">
<span class="absolute -top-2.5 right-3 rounded-full bg-linear-90 from-tbg10-a1 to-tbg10-a2 px-2.5 py-1 text-[10px] font-extrabold uppercase tracking-[0.04em] text-tbg10-bg">Recommended</span>
<span aria-hidden="true" style="--l:linear-gradient(135deg,#f6851b,#e2761b)" class="grid size-10 place-items-center rounded-xl bg-(image:--l) text-lg font-extrabold text-white">M</span>
<span class="text-[15.5px] font-bold">MetaMask</span>
<span class="flex items-center gap-1.5 text-xs text-tbg10-ok"><span aria-hidden="true" class="size-1.5 rounded-full bg-tbg10-ok"></span>Detected in browser</span>
<svg class="absolute top-4 right-4 -translate-x-1 opacity-0 transition duration-200 group-hover:translate-x-0 group-hover:opacity-100 group-focus-visible:translate-x-0 group-focus-visible:opacity-100" viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg>
</button>
<button type="button" class="group relative flex cursor-pointer flex-col items-start gap-2.5 rounded-2xl border border-white/10 bg-white/4 p-4 text-left transition-[translate,border-color,background-color] duration-200 hover:-translate-y-0.5 hover:border-tbg10-a2 hover:bg-white/7 focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-tbg10-a2 motion-reduce:transition-none">
<span aria-hidden="true" style="--l:linear-gradient(135deg,#3b99fc,#1f6fe5)" class="grid size-10 place-items-center rounded-xl bg-(image:--l) text-lg font-extrabold text-white">W</span>
<span class="text-[15.5px] font-bold">WalletConnect</span>
<span class="text-xs text-tbg10-mut">Scan with mobile app</span>
<svg class="absolute top-4 right-4 -translate-x-1 opacity-0 transition duration-200 group-hover:translate-x-0 group-hover:opacity-100 group-focus-visible:translate-x-0 group-focus-visible:opacity-100" viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg>
</button>
<button type="button" class="group relative flex cursor-pointer flex-col items-start gap-2.5 rounded-2xl border border-white/10 bg-white/4 p-4 text-left transition-[translate,border-color,background-color] duration-200 hover:-translate-y-0.5 hover:border-tbg10-a2 hover:bg-white/7 focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-tbg10-a2 motion-reduce:transition-none">
<span aria-hidden="true" style="--l:linear-gradient(135deg,#2c5ff6,#0a3ecb)" class="grid size-10 place-items-center rounded-xl bg-(image:--l) text-lg font-extrabold text-white">C</span>
<span class="text-[15.5px] font-bold">Coinbase Wallet</span>
<span class="text-xs text-tbg10-mut">Extension or app</span>
<svg class="absolute top-4 right-4 -translate-x-1 opacity-0 transition duration-200 group-hover:translate-x-0 group-hover:opacity-100 group-focus-visible:translate-x-0 group-focus-visible:opacity-100" viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg>
</button>
<button type="button" class="group relative flex cursor-pointer flex-col items-start gap-2.5 rounded-2xl border border-white/10 bg-white/4 p-4 text-left transition-[translate,border-color,background-color] duration-200 hover:-translate-y-0.5 hover:border-tbg10-a2 hover:bg-white/7 focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-tbg10-a2 motion-reduce:transition-none">
<span aria-hidden="true" style="--l:linear-gradient(135deg,#4a4a4a,#141414)" class="grid size-10 place-items-center rounded-xl bg-(image:--l) text-lg font-extrabold text-white ring-1 ring-white/15">L</span>
<span class="text-[15.5px] font-bold">Ledger</span>
<span class="text-xs text-tbg10-mut">Hardware wallet</span>
<svg class="absolute top-4 right-4 -translate-x-1 opacity-0 transition duration-200 group-hover:translate-x-0 group-hover:opacity-100 group-focus-visible:translate-x-0 group-focus-visible:opacity-100" viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg>
</button>
</div>
<p class="mt-6 flex items-center justify-center gap-2 border-t border-white/8 pt-5 text-[13px] text-tbg10-mut">New to wallets? <a href="#" class="font-semibold text-tbg10-a2 underline-offset-4 hover:underline focus-visible:outline-2 focus-visible:outline-tbg10-a2">Learn how they work</a></p>
</div>
</section>
```
## CSS
```css
@import "tailwindcss";
@theme {
--color-tbg10-bg: #0a0713;
--color-tbg10-glow: #1d1636;
--color-tbg10-panel: #281e46;
--color-tbg10-tile: #120c22;
--color-tbg10-ink: #f2eeff;
--color-tbg10-mut: #b3a9d6;
--color-tbg10-mut: oklch(0.76 0.06 290);
--color-tbg10-ok: #6fe2a6;
--color-tbg10-ok: oklch(0.83 0.14 158);
--color-tbg10-a1: #9b4dff;
--color-tbg10-a1: oklch(0.62 0.23 300);
--color-tbg10-a2: #4dd2e8;
--color-tbg10-a2: oklch(0.8 0.12 210);
--shadow-tbg10-modal: 0 40px 90px -40px rgb(90 40 220 / 0.6);
--font-tbg10-sans: 'Sora', system-ui, sans-serif;
}
/* Root rule: the full-bleed contract, restated so the stage is sized before the browser build compiles. */
.tbg-10 {
width: 100%;
min-height: 100svh;
}
```How this works
The gradient border. Two backgrounds, one clipped to the padding box and one to the border box, with a transparent border between them:
<button class="border-[1.5px] border-transparent
[background:linear-gradient(var(--color-tbg10-tile),var(--color-tbg10-tile))_padding-box,
linear-gradient(135deg,var(--color-tbg10-a1),var(--color-tbg10-a2))_border-box]">Monogram logos are placeholders. Swap each lettered square for the wallet's official SVG at size-10; brand colours come from an inline --l variable read by bg-(image:--l).
Make it yours
- Single column list:
grid-cols-1andflex-row items-centeron tiles. - Real logos: replace the monogram span with
<img class="size-10 rounded-xl">. - Re-theme the gradient with
--color-tbg10-a1/-a2.
Gotchas — read before shipping
- Gradient borders via backgrounds can't also use a background image inside the tile — layer a child element instead.
- Wallet names and logos are trademarks; use each provider's official assets and guidelines.
backdrop-bluris expensive on large surfaces; keep it on the modal, not the page.
Browser support
| Chrome | Safari | Firefox | Edge |
|---|---|---|---|
| 111+ | 16.4+ | 128+ | 111+ |
Everything here is long-standing CSS; Tailwind v4 sets the floor.