16 / 30
All 30 in 30 Tailwind CSS Login Forms
- 01Tailwind Split-Screen Brand Hero Login Form
- 02Tailwind Multi-Tenant Workspace Account Switcher
- 03Tailwind Floating Label Login Form with peer Variants
- 04Tailwind Web3 Wallet Connect Login Grid
- 05Tailwind Minimalist Fintech Login Card with Layered Shadow
- 06Tailwind OAuth Social Login Form with Brand SVG Buttons
- 07Tailwind Passwordless Magic Link Login with data-state Machine
- 08Tailwind Aurora Glow Login Card with Drifting Blur Blobs
- 09Tailwind Neon Synthwave Arcade Login Form
- 10Tailwind Sliding Login and Sign Up Panel with peer-checked
- 11Tailwind 3D Flip Login Card with Password Reset Back Face
- 12Tailwind Terminal CLI Prompt Login Form
- 13Tailwind Floating Pill Login Widget Docked Over App Content
- 14Tailwind Gradient Border Login Card with background-clip
- 15Tailwind Slide-Over Side Panel Login without JavaScript
- 16Tailwind Social-First Sign Up with Brand-Compliant Buttons
- 17Tailwind Animated Mascot Login that Covers Its Eyes
- 18Tailwind Accessible Compact Login Modal with Scale-In
- 19Tailwind Glassmorphism Login Card with backdrop-filter
- 20Tailwind Multi-Step Login Wizard with Radio-Driven Track
- 21Tailwind Animated Conic Gradient Border Login Card
- 22Tailwind Secure Vault Login with user-invalid Error State
- 23Tailwind Neo-Brutalist Login Form with Hard Offset Shadow
- 24Tailwind Show Hide Password Toggle with aria-pressed
- 25Tailwind OTP Code Input Grid with Auto-Advance
- 26Tailwind Password Strength Meter with data-score Variants
- 27Tailwind Numeric PIN Pad Login for Kiosks and POS
- 28Tailwind Inline Form Validation with user-valid and user-invalid
- 29Tailwind Particle Constellation Login over Canvas
- 30Tailwind Biometric Face ID Prompt with Pulse Ripples
Tailwind Social-First Sign Up with Brand-Compliant Buttons
Consumer-mobile onboarding that leads with big, brand-compliant social blocks — Apple, Google, Facebook — stacked full-width for one-tap entry, with the email path pushed politely below. The port is mostly a lesson in what not to tokenise: provider colours are contractual, so they stay literal hex in the class list.
Untitled UI Pro: 5,000+ React + Tailwind CSS v4 components · from $349 one-time
Untitled UI React · Affiliate link
The code
<section class="tlf-16 w-full min-h-svh grid place-items-center bg-tlf16-stage font-tlf16-sans p-6">
<div class="w-[min(380px,100%)] p-9 text-center bg-white border border-tlf16-edge rounded-[20px] shadow-[0_22px_50px_-38px_oklch(0.25_0.03_280/0.5)]">
<div aria-hidden="true" class="mb-2 text-[34px] text-tlf16-acc">✳</div>
<h1 class="text-2xl font-extrabold tracking-tight text-tlf16-ink">Join Frame</h1>
<p class="mt-1.5 mb-6 text-sm text-tlf16-mut">Create your account in one tap.</p>
<div class="flex flex-col gap-3">
<button type="button" class="flex items-center justify-center gap-3 h-13 rounded-xl cursor-pointer border border-transparent bg-black text-white text-[15px] font-semibold transition-[filter,scale] duration-150 hover:brightness-150 active:scale-[0.986] focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-tlf16-ring motion-reduce:transition-none motion-reduce:active:scale-100">
<svg viewBox="0 0 24 24" aria-hidden="true" class="size-5 flex-none"><path fill="currentColor" d="M16.4 12.6c0-2.3 1.9-3.4 2-3.5-1.1-1.6-2.8-1.8-3.4-1.8-1.4-.1-2.8.9-3.5.9s-1.8-.8-3-.8c-1.5 0-3 .9-3.8 2.3-1.6 2.8-.4 7 1.2 9.3.8 1.1 1.7 2.4 2.9 2.3 1.2 0 1.6-.7 3-.7s1.8.7 3 .7 2-1 2.8-2.1c.9-1.3 1.2-2.5 1.3-2.6-.1 0-2.5-1-2.5-3.7zM14.2 5.6c.6-.8 1-1.9.9-3-.9 0-2 .6-2.7 1.4-.6.7-1.1 1.8-.9 2.9 1 0 2-.5 2.7-1.3z"></path></svg>
Continue with Apple
</button>
<button type="button" class="flex items-center justify-center gap-3 h-13 rounded-xl cursor-pointer bg-white border border-tlf16-googleedge text-tlf16-googleink text-[15px] font-semibold transition-[background-color,scale] duration-150 hover:bg-tlf16-hover active:scale-[0.986] focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-tlf16-ring motion-reduce:transition-none motion-reduce:active:scale-100">
<svg viewBox="0 0 24 24" aria-hidden="true" class="size-5 flex-none"><path fill="#4285F4" d="M23 12.3c0-.8-.1-1.6-.2-2.3H12v4.5h6.2a5.3 5.3 0 0 1-2.3 3.5v2.9h3.7C21.8 19 23 15.9 23 12.3z"></path><path fill="#34A853" d="M12 24c3.1 0 5.7-1 7.6-2.8l-3.7-2.9c-1 .7-2.4 1.1-3.9 1.1-3 0-5.5-2-6.4-4.7H1.7v3A12 12 0 0 0 12 24z"></path><path fill="#FBBC05" d="M5.6 14.7a7.2 7.2 0 0 1 0-4.6v-3H1.7a12 12 0 0 0 0 10.6l3.9-3z"></path><path fill="#EA4335" d="M12 4.8c1.7 0 3.2.6 4.4 1.7l3.3-3.3A12 12 0 0 0 1.7 6.4l3.9 3C6.5 6.8 9 4.8 12 4.8z"></path></svg>
Continue with Google
</button>
<button type="button" class="flex items-center justify-center gap-3 h-13 rounded-xl cursor-pointer border border-transparent bg-[#1877F2] text-white text-[15px] font-semibold transition-[filter,scale] duration-150 hover:brightness-105 active:scale-[0.986] focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-tlf16-ring motion-reduce:transition-none motion-reduce:active:scale-100">
<svg viewBox="0 0 24 24" aria-hidden="true" class="size-5 flex-none"><path fill="currentColor" d="M24 12a12 12 0 1 0-13.9 11.9v-8.4H7v-3.5h3.1V9.4c0-3 1.8-4.7 4.5-4.7 1.3 0 2.7.2 2.7.2v3h-1.5c-1.5 0-2 .9-2 1.9v2.2h3.4l-.5 3.5h-2.9v8.4A12 12 0 0 0 24 12z"></path></svg>
Continue with Facebook
</button>
</div>
<a href="#" class="inline-grid place-items-center min-h-11 mt-4 text-[13.5px] font-medium text-tlf16-mut no-underline hover:text-tlf16-ink hover:underline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-tlf16-ring">or sign up with email</a>
</div>
</section><section class="tlf-16 w-full min-h-svh grid place-items-center bg-tlf16-stage font-tlf16-sans p-6">
<div class="w-[min(380px,100%)] p-9 text-center bg-white border border-tlf16-edge rounded-[20px] shadow-[0_22px_50px_-38px_oklch(0.25_0.03_280/0.5)]">
<div aria-hidden="true" class="mb-2 text-[34px] text-tlf16-acc">✳</div>
<h1 class="text-2xl font-extrabold tracking-tight text-tlf16-ink">Join Frame</h1>
<p class="mt-1.5 mb-6 text-sm text-tlf16-mut">Create your account in one tap.</p>
<div class="flex flex-col gap-3">
<button type="button" class="flex items-center justify-center gap-3 h-13 rounded-xl cursor-pointer border border-transparent bg-black text-white text-[15px] font-semibold transition-[filter,scale] duration-150 hover:brightness-150 active:scale-[0.986] focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-tlf16-ring motion-reduce:transition-none motion-reduce:active:scale-100">
<svg viewBox="0 0 24 24" aria-hidden="true" class="size-5 flex-none"><path fill="currentColor" d="M16.4 12.6c0-2.3 1.9-3.4 2-3.5-1.1-1.6-2.8-1.8-3.4-1.8-1.4-.1-2.8.9-3.5.9s-1.8-.8-3-.8c-1.5 0-3 .9-3.8 2.3-1.6 2.8-.4 7 1.2 9.3.8 1.1 1.7 2.4 2.9 2.3 1.2 0 1.6-.7 3-.7s1.8.7 3 .7 2-1 2.8-2.1c.9-1.3 1.2-2.5 1.3-2.6-.1 0-2.5-1-2.5-3.7zM14.2 5.6c.6-.8 1-1.9.9-3-.9 0-2 .6-2.7 1.4-.6.7-1.1 1.8-.9 2.9 1 0 2-.5 2.7-1.3z"></path></svg>
Continue with Apple
</button>
<button type="button" class="flex items-center justify-center gap-3 h-13 rounded-xl cursor-pointer bg-white border border-tlf16-googleedge text-tlf16-googleink text-[15px] font-semibold transition-[background-color,scale] duration-150 hover:bg-tlf16-hover active:scale-[0.986] focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-tlf16-ring motion-reduce:transition-none motion-reduce:active:scale-100">
<svg viewBox="0 0 24 24" aria-hidden="true" class="size-5 flex-none"><path fill="#4285F4" d="M23 12.3c0-.8-.1-1.6-.2-2.3H12v4.5h6.2a5.3 5.3 0 0 1-2.3 3.5v2.9h3.7C21.8 19 23 15.9 23 12.3z"></path><path fill="#34A853" d="M12 24c3.1 0 5.7-1 7.6-2.8l-3.7-2.9c-1 .7-2.4 1.1-3.9 1.1-3 0-5.5-2-6.4-4.7H1.7v3A12 12 0 0 0 12 24z"></path><path fill="#FBBC05" d="M5.6 14.7a7.2 7.2 0 0 1 0-4.6v-3H1.7a12 12 0 0 0 0 10.6l3.9-3z"></path><path fill="#EA4335" d="M12 4.8c1.7 0 3.2.6 4.4 1.7l3.3-3.3A12 12 0 0 0 1.7 6.4l3.9 3C6.5 6.8 9 4.8 12 4.8z"></path></svg>
Continue with Google
</button>
<button type="button" class="flex items-center justify-center gap-3 h-13 rounded-xl cursor-pointer border border-transparent bg-[#1877F2] text-white text-[15px] font-semibold transition-[filter,scale] duration-150 hover:brightness-105 active:scale-[0.986] focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-tlf16-ring motion-reduce:transition-none motion-reduce:active:scale-100">
<svg viewBox="0 0 24 24" aria-hidden="true" class="size-5 flex-none"><path fill="currentColor" d="M24 12a12 12 0 1 0-13.9 11.9v-8.4H7v-3.5h3.1V9.4c0-3 1.8-4.7 4.5-4.7 1.3 0 2.7.2 2.7.2v3h-1.5c-1.5 0-2 .9-2 1.9v2.2h3.4l-.5 3.5h-2.9v8.4A12 12 0 0 0 24 12z"></path></svg>
Continue with Facebook
</button>
</div>
<a href="#" class="inline-grid place-items-center min-h-11 mt-4 text-[13.5px] font-medium text-tlf16-mut no-underline hover:text-tlf16-ink hover:underline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-tlf16-ring">or sign up with email</a>
</div>
</section>@import "tailwindcss";
@theme {
--color-tlf16-stage: #f4f4f7;
--color-tlf16-stage: oklch(0.96 0.004 285);
--color-tlf16-edge: #eaeaef;
--color-tlf16-edge: oklch(0.93 0.004 285);
--color-tlf16-hover: #f6f7fa;
--color-tlf16-hover: oklch(0.975 0.004 285);
--color-tlf16-ink: #16171f;
--color-tlf16-ink: oklch(0.22 0.012 285);
--color-tlf16-mut: #64667a;
--color-tlf16-mut: oklch(0.5 0.02 285);
--color-tlf16-acc: #6a4ee0;
--color-tlf16-acc: oklch(0.52 0.2 285);
--color-tlf16-ring: #8f7cf0;
--color-tlf16-ring: oklch(0.52 0.2 285 / 0.6);
--color-tlf16-googleedge: #dadce0;
--color-tlf16-googleink: #3c4043;
--font-tlf16-sans: 'Manrope', system-ui, sans-serif;
}
.tlf-16 {
width: 100%;
min-height: 100svh;
}@import "tailwindcss";
@theme {
--color-tlf16-stage: #f4f4f7;
--color-tlf16-stage: oklch(0.96 0.004 285);
--color-tlf16-edge: #eaeaef;
--color-tlf16-edge: oklch(0.93 0.004 285);
--color-tlf16-hover: #f6f7fa;
--color-tlf16-hover: oklch(0.975 0.004 285);
--color-tlf16-ink: #16171f;
--color-tlf16-ink: oklch(0.22 0.012 285);
--color-tlf16-mut: #64667a;
--color-tlf16-mut: oklch(0.5 0.02 285);
--color-tlf16-acc: #6a4ee0;
--color-tlf16-acc: oklch(0.52 0.2 285);
--color-tlf16-ring: #8f7cf0;
--color-tlf16-ring: oklch(0.52 0.2 285 / 0.6);
--color-tlf16-googleedge: #dadce0;
--color-tlf16-googleink: #3c4043;
--font-tlf16-sans: 'Manrope', system-ui, sans-serif;
}
.tlf-16 {
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-tlf16-stage: #f4f4f7;
--color-tlf16-stage: oklch(0.96 0.004 285);
--color-tlf16-edge: #eaeaef;
--color-tlf16-edge: oklch(0.93 0.004 285);
--color-tlf16-hover: #f6f7fa;
--color-tlf16-hover: oklch(0.975 0.004 285);
--color-tlf16-ink: #16171f;
--color-tlf16-ink: oklch(0.22 0.012 285);
--color-tlf16-mut: #64667a;
--color-tlf16-mut: oklch(0.5 0.02 285);
--color-tlf16-acc: #6a4ee0;
--color-tlf16-acc: oklch(0.52 0.2 285);
--color-tlf16-ring: #8f7cf0;
--color-tlf16-ring: oklch(0.52 0.2 285 / 0.6);
--color-tlf16-googleedge: #dadce0;
--color-tlf16-googleink: #3c4043;
--font-tlf16-sans: 'Manrope', system-ui, sans-serif;
}
.tlf-16 {
width: 100%;
min-height: 100svh;
}@import "tailwindcss";
@theme {
--color-tlf16-stage: #f4f4f7;
--color-tlf16-stage: oklch(0.96 0.004 285);
--color-tlf16-edge: #eaeaef;
--color-tlf16-edge: oklch(0.93 0.004 285);
--color-tlf16-hover: #f6f7fa;
--color-tlf16-hover: oklch(0.975 0.004 285);
--color-tlf16-ink: #16171f;
--color-tlf16-ink: oklch(0.22 0.012 285);
--color-tlf16-mut: #64667a;
--color-tlf16-mut: oklch(0.5 0.02 285);
--color-tlf16-acc: #6a4ee0;
--color-tlf16-acc: oklch(0.52 0.2 285);
--color-tlf16-ring: #8f7cf0;
--color-tlf16-ring: oklch(0.52 0.2 285 / 0.6);
--color-tlf16-googleedge: #dadce0;
--color-tlf16-googleink: #3c4043;
--font-tlf16-sans: 'Manrope', system-ui, sans-serif;
}
.tlf-16 {
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=Manrope:wght@400;500;600;700;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=Manrope:wght@400;500;600;700;800&display=swap">What changed in the port
Which parts became utilities, which stayed CSS, and why.
- Two provider colours (
--color-tlf16-googleedge,--color-tlf16-googleink) do sit in@theme, and the distinction is deliberate: those are Google's specified neutral values for its light button, reused on two properties, whereas Facebook's single fill is used once and stays inline. hover:brightness-150on the black button is the only way to brighten pure black with a filter — a 1.15 multiplier does nothing to#000, which the CSS original got wrong.- The email link became
inline-grid place-items-center min-h-11so a text link still presents a thumb-sized target on the screen where that matters most. - UI change from the CSS original: Manrope replaces the system stack, the subtitle grey lifted from
#767889tooklch(0.5 0.02 285), the Apple hover actually works now, and the email link gained a 44px target.
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 Social-First Sign Up with Brand-Compliant Buttons
Source: https://codefronts.com/components/tailwind-css-login-forms/tailwind-social-first-sign-up-brand-buttons/
Consumer-mobile onboarding that leads with big, brand-compliant social blocks — Apple, Google, Facebook — stacked full-width for one-tap entry, with the email path pushed politely below. The port is mostly a lesson in what not to tokenise: provider colours are contractual, so they stay literal hex in the class list.
## HTML
```html
<section class="tlf-16 w-full min-h-svh grid place-items-center bg-tlf16-stage font-tlf16-sans p-6">
<div class="w-[min(380px,100%)] p-9 text-center bg-white border border-tlf16-edge rounded-[20px] shadow-[0_22px_50px_-38px_oklch(0.25_0.03_280/0.5)]">
<div aria-hidden="true" class="mb-2 text-[34px] text-tlf16-acc">✳</div>
<h1 class="text-2xl font-extrabold tracking-tight text-tlf16-ink">Join Frame</h1>
<p class="mt-1.5 mb-6 text-sm text-tlf16-mut">Create your account in one tap.</p>
<div class="flex flex-col gap-3">
<button type="button" class="flex items-center justify-center gap-3 h-13 rounded-xl cursor-pointer border border-transparent bg-black text-white text-[15px] font-semibold transition-[filter,scale] duration-150 hover:brightness-150 active:scale-[0.986] focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-tlf16-ring motion-reduce:transition-none motion-reduce:active:scale-100">
<svg viewBox="0 0 24 24" aria-hidden="true" class="size-5 flex-none"><path fill="currentColor" d="M16.4 12.6c0-2.3 1.9-3.4 2-3.5-1.1-1.6-2.8-1.8-3.4-1.8-1.4-.1-2.8.9-3.5.9s-1.8-.8-3-.8c-1.5 0-3 .9-3.8 2.3-1.6 2.8-.4 7 1.2 9.3.8 1.1 1.7 2.4 2.9 2.3 1.2 0 1.6-.7 3-.7s1.8.7 3 .7 2-1 2.8-2.1c.9-1.3 1.2-2.5 1.3-2.6-.1 0-2.5-1-2.5-3.7zM14.2 5.6c.6-.8 1-1.9.9-3-.9 0-2 .6-2.7 1.4-.6.7-1.1 1.8-.9 2.9 1 0 2-.5 2.7-1.3z"></path></svg>
Continue with Apple
</button>
<button type="button" class="flex items-center justify-center gap-3 h-13 rounded-xl cursor-pointer bg-white border border-tlf16-googleedge text-tlf16-googleink text-[15px] font-semibold transition-[background-color,scale] duration-150 hover:bg-tlf16-hover active:scale-[0.986] focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-tlf16-ring motion-reduce:transition-none motion-reduce:active:scale-100">
<svg viewBox="0 0 24 24" aria-hidden="true" class="size-5 flex-none"><path fill="#4285F4" d="M23 12.3c0-.8-.1-1.6-.2-2.3H12v4.5h6.2a5.3 5.3 0 0 1-2.3 3.5v2.9h3.7C21.8 19 23 15.9 23 12.3z"></path><path fill="#34A853" d="M12 24c3.1 0 5.7-1 7.6-2.8l-3.7-2.9c-1 .7-2.4 1.1-3.9 1.1-3 0-5.5-2-6.4-4.7H1.7v3A12 12 0 0 0 12 24z"></path><path fill="#FBBC05" d="M5.6 14.7a7.2 7.2 0 0 1 0-4.6v-3H1.7a12 12 0 0 0 0 10.6l3.9-3z"></path><path fill="#EA4335" d="M12 4.8c1.7 0 3.2.6 4.4 1.7l3.3-3.3A12 12 0 0 0 1.7 6.4l3.9 3C6.5 6.8 9 4.8 12 4.8z"></path></svg>
Continue with Google
</button>
<button type="button" class="flex items-center justify-center gap-3 h-13 rounded-xl cursor-pointer border border-transparent bg-[#1877F2] text-white text-[15px] font-semibold transition-[filter,scale] duration-150 hover:brightness-105 active:scale-[0.986] focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-tlf16-ring motion-reduce:transition-none motion-reduce:active:scale-100">
<svg viewBox="0 0 24 24" aria-hidden="true" class="size-5 flex-none"><path fill="currentColor" d="M24 12a12 12 0 1 0-13.9 11.9v-8.4H7v-3.5h3.1V9.4c0-3 1.8-4.7 4.5-4.7 1.3 0 2.7.2 2.7.2v3h-1.5c-1.5 0-2 .9-2 1.9v2.2h3.4l-.5 3.5h-2.9v8.4A12 12 0 0 0 24 12z"></path></svg>
Continue with Facebook
</button>
</div>
<a href="#" class="inline-grid place-items-center min-h-11 mt-4 text-[13.5px] font-medium text-tlf16-mut no-underline hover:text-tlf16-ink hover:underline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-tlf16-ring">or sign up with email</a>
</div>
</section>
```
## CSS
```css
@import "tailwindcss";
@theme {
--color-tlf16-stage: #f4f4f7;
--color-tlf16-stage: oklch(0.96 0.004 285);
--color-tlf16-edge: #eaeaef;
--color-tlf16-edge: oklch(0.93 0.004 285);
--color-tlf16-hover: #f6f7fa;
--color-tlf16-hover: oklch(0.975 0.004 285);
--color-tlf16-ink: #16171f;
--color-tlf16-ink: oklch(0.22 0.012 285);
--color-tlf16-mut: #64667a;
--color-tlf16-mut: oklch(0.5 0.02 285);
--color-tlf16-acc: #6a4ee0;
--color-tlf16-acc: oklch(0.52 0.2 285);
--color-tlf16-ring: #8f7cf0;
--color-tlf16-ring: oklch(0.52 0.2 285 / 0.6);
--color-tlf16-googleedge: #dadce0;
--color-tlf16-googleink: #3c4043;
--font-tlf16-sans: 'Manrope', system-ui, sans-serif;
}
.tlf-16 {
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 Social-First Sign Up with Brand-Compliant Buttons
Source: https://codefronts.com/components/tailwind-css-login-forms/tailwind-social-first-sign-up-brand-buttons/
Consumer-mobile onboarding that leads with big, brand-compliant social blocks — Apple, Google, Facebook — stacked full-width for one-tap entry, with the email path pushed politely below. The port is mostly a lesson in what not to tokenise: provider colours are contractual, so they stay literal hex in the class list.
## HTML
```html
<section class="tlf-16 w-full min-h-svh grid place-items-center bg-tlf16-stage font-tlf16-sans p-6">
<div class="w-[min(380px,100%)] p-9 text-center bg-white border border-tlf16-edge rounded-[20px] shadow-[0_22px_50px_-38px_oklch(0.25_0.03_280/0.5)]">
<div aria-hidden="true" class="mb-2 text-[34px] text-tlf16-acc">✳</div>
<h1 class="text-2xl font-extrabold tracking-tight text-tlf16-ink">Join Frame</h1>
<p class="mt-1.5 mb-6 text-sm text-tlf16-mut">Create your account in one tap.</p>
<div class="flex flex-col gap-3">
<button type="button" class="flex items-center justify-center gap-3 h-13 rounded-xl cursor-pointer border border-transparent bg-black text-white text-[15px] font-semibold transition-[filter,scale] duration-150 hover:brightness-150 active:scale-[0.986] focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-tlf16-ring motion-reduce:transition-none motion-reduce:active:scale-100">
<svg viewBox="0 0 24 24" aria-hidden="true" class="size-5 flex-none"><path fill="currentColor" d="M16.4 12.6c0-2.3 1.9-3.4 2-3.5-1.1-1.6-2.8-1.8-3.4-1.8-1.4-.1-2.8.9-3.5.9s-1.8-.8-3-.8c-1.5 0-3 .9-3.8 2.3-1.6 2.8-.4 7 1.2 9.3.8 1.1 1.7 2.4 2.9 2.3 1.2 0 1.6-.7 3-.7s1.8.7 3 .7 2-1 2.8-2.1c.9-1.3 1.2-2.5 1.3-2.6-.1 0-2.5-1-2.5-3.7zM14.2 5.6c.6-.8 1-1.9.9-3-.9 0-2 .6-2.7 1.4-.6.7-1.1 1.8-.9 2.9 1 0 2-.5 2.7-1.3z"></path></svg>
Continue with Apple
</button>
<button type="button" class="flex items-center justify-center gap-3 h-13 rounded-xl cursor-pointer bg-white border border-tlf16-googleedge text-tlf16-googleink text-[15px] font-semibold transition-[background-color,scale] duration-150 hover:bg-tlf16-hover active:scale-[0.986] focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-tlf16-ring motion-reduce:transition-none motion-reduce:active:scale-100">
<svg viewBox="0 0 24 24" aria-hidden="true" class="size-5 flex-none"><path fill="#4285F4" d="M23 12.3c0-.8-.1-1.6-.2-2.3H12v4.5h6.2a5.3 5.3 0 0 1-2.3 3.5v2.9h3.7C21.8 19 23 15.9 23 12.3z"></path><path fill="#34A853" d="M12 24c3.1 0 5.7-1 7.6-2.8l-3.7-2.9c-1 .7-2.4 1.1-3.9 1.1-3 0-5.5-2-6.4-4.7H1.7v3A12 12 0 0 0 12 24z"></path><path fill="#FBBC05" d="M5.6 14.7a7.2 7.2 0 0 1 0-4.6v-3H1.7a12 12 0 0 0 0 10.6l3.9-3z"></path><path fill="#EA4335" d="M12 4.8c1.7 0 3.2.6 4.4 1.7l3.3-3.3A12 12 0 0 0 1.7 6.4l3.9 3C6.5 6.8 9 4.8 12 4.8z"></path></svg>
Continue with Google
</button>
<button type="button" class="flex items-center justify-center gap-3 h-13 rounded-xl cursor-pointer border border-transparent bg-[#1877F2] text-white text-[15px] font-semibold transition-[filter,scale] duration-150 hover:brightness-105 active:scale-[0.986] focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-tlf16-ring motion-reduce:transition-none motion-reduce:active:scale-100">
<svg viewBox="0 0 24 24" aria-hidden="true" class="size-5 flex-none"><path fill="currentColor" d="M24 12a12 12 0 1 0-13.9 11.9v-8.4H7v-3.5h3.1V9.4c0-3 1.8-4.7 4.5-4.7 1.3 0 2.7.2 2.7.2v3h-1.5c-1.5 0-2 .9-2 1.9v2.2h3.4l-.5 3.5h-2.9v8.4A12 12 0 0 0 24 12z"></path></svg>
Continue with Facebook
</button>
</div>
<a href="#" class="inline-grid place-items-center min-h-11 mt-4 text-[13.5px] font-medium text-tlf16-mut no-underline hover:text-tlf16-ink hover:underline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-tlf16-ring">or sign up with email</a>
</div>
</section>
```
## CSS
```css
@import "tailwindcss";
@theme {
--color-tlf16-stage: #f4f4f7;
--color-tlf16-stage: oklch(0.96 0.004 285);
--color-tlf16-edge: #eaeaef;
--color-tlf16-edge: oklch(0.93 0.004 285);
--color-tlf16-hover: #f6f7fa;
--color-tlf16-hover: oklch(0.975 0.004 285);
--color-tlf16-ink: #16171f;
--color-tlf16-ink: oklch(0.22 0.012 285);
--color-tlf16-mut: #64667a;
--color-tlf16-mut: oklch(0.5 0.02 285);
--color-tlf16-acc: #6a4ee0;
--color-tlf16-acc: oklch(0.52 0.2 285);
--color-tlf16-ring: #8f7cf0;
--color-tlf16-ring: oklch(0.52 0.2 285 / 0.6);
--color-tlf16-googleedge: #dadce0;
--color-tlf16-googleink: #3c4043;
--font-tlf16-sans: 'Manrope', system-ui, sans-serif;
}
.tlf-16 {
width: 100%;
min-height: 100svh;
}
```How this works
Brand colours are not design tokens. Apple black, Google white-with-border, Facebook #1877F2 are prescribed by each provider's guidelines. Putting them in @theme would invite a future retheme to break a contractual requirement, so they stay inline and obvious.
One ring colour for three fills. A per-button focus ring derived from each brand colour would be invisible on at least one of them; a single neutral indigo ring at outline-offset-2 reads against black, white and blue, which is why the original chose that too.
The light button needs a border. Google's white fill would vanish on the white card without border border-tlf16-edge — the most commonly missed line in social-login stacks.
Make it yours
- Reorder or add providers; the flex column self-spaces.
- Tap size: all three buttons share
h-13. - Promote email to a full button if your audience skews enterprise.
- Card radius and shadow are one utility each if you want it flatter.
Gotchas — read before shipping
- Keep tap targets at 44px minimum — 52px here, because this is a thumb-first screen.
- Use each provider's exact wording (“Continue with Apple”), fill and mark proportions; brand review does check.
- Give white or light buttons a visible border, or they disappear against a white surface.
Browser support
| Chrome | Safari | Firefox | Edge |
|---|---|---|---|
| 111+ | 16.4+ | 128+ | 111+ |
Flex stacks, inline SVG and :focus-visible are universally supported; the floor is Tailwind v4's generated sheet.