Building a whole Tailwind app, not just this component?
You just browsed 18 Tailwind css forms. Untitled UI Pro unlocks 5,000+ components and sections and 250+ page examples for React, styled with Tailwind CSS v4. One licence is a one-time $349 with lifetime updates; teams start at $999.
The CSS collection's contact form, rebuilt one-for-one in Tailwind v4 utilities: a textarea that grows with [field-sizing:content], a circular counter ring driven by a registered @property that shifts from calm to amber to red as the limit approaches, threshold-only screen-reader announcements, topic chips built from real radios with peer-checked:, and user-invalid: errors that wait until the user has actually left a field.
The CSS collection's sign-up screen, ported one-for-one to Tailwind v4: a frosted card on a slow-drifting aurora, a four-segment strength meter keyed to one data-score attribute, a requirements checklist whose ticks draw themselves in, an aria-pressed show/hide toggle, live confirm-password matching and a length-first scorer in line with NIST SP 800-63B.
The CSS collection's two-column checkout, ported one-for-one to Tailwind v4: it collapses with a container query (not a viewport query), shows a live 3D card preview that mirrors what you type and flips to the CVC on focus, detects the card brand and re-tints the card, switches Card / Wallet / Bank panels with pure group-has-[…]:, and recomputes an order summary with quantity steppers and a working promo code.
The CSS collection's address form, ported one-for-one to Tailwind v4: correct autocomplete tokens so browsers fill every field in one tap, an ARIA 1.2 combobox that suggests full addresses with the match highlighted, a map header whose pin hops when an address is chosen, country-aware ZIP / Postcode / Postal code labels and patterns for all five Tier-1 markets, and delivery-speed cards with live arrival dates.
The CSS collection's newsletter form, ported one-for-one to Tailwind v4: it adapts to whatever slot it's dropped into using v4's built-in container queries, morphing from a full-width stack to a split row to a single fused pill. Drag the frame's corner to watch it reflow live — a readout names the current layout — with type that scales in cqi, topic chips, and a neo-brutalist offset shadow.
The CSS collection's help-desk ticket form, ported one-for-one to Tailwind v4: a focused dark developer-tool look, priority as a colour-coded segmented control (Urgent reveals an on-call warning), category, environment and subject fields, a description with markdown hints, and a drag-and-drop zone that is a real <input type="file" multiple> underneath — with per-file progress, image thumbnails, size and count limits, remove buttons and a ⌘↵ shortcut.
Newsletter
Enjoying these demos? Get new ones by email.
A short email when a new collection ships. Unsubscribe any time.
The CSS collection's Net Promoter Score survey, ported one-for-one to Tailwind v4 — and the survey logic is still zero JavaScript (the only script is the theme toggle). Eleven real radios are tinted along an oklch() red-amber-green ramp from one --h hue per label; choosing a score reveals a different follow-up for detractors, passives and promoters with group-has-[.is-d:checked]/root:grid, a progress bar fills, a band label appears, and a checkbox-driven thank-you bursts in.
The CSS collection's careers application, ported one-for-one to Tailwind v4: a photo job header, three calm steps — About you, Résumé, Final questions — with a step indicator that is a real ordered list carrying aria-current="step", per-step native validation, a résumé drop zone limited to PDF/DOC/DOCX under 5 MB that turns into a file card via group-has-[input:valid]/rs:, work-authorisation radio cards and a review summary before submit.
The CSS collection's account-settings panel, ported one-for-one to Tailwind v4: an avatar you can replace (instant local preview via URL.createObjectURL), zoom with a slider and remove; a username field with a fused app.loop.so/@ prefix and a live availability check; a bio counter; accessible role="switch" toggles on a linear() spring; and a dirty-state save bar that springs up from the card edge only when something has actually changed.
The CSS collection's fine-dining booking widget, ported one-for-one to Tailwind v4: candle-lit black and gold, a party-size stepper, a horizontally scrolling date strip of radios with snap-x snap-mandatory, a time grid where fully booked slots are genuinely disabled and struck through, seating cards with photography that wake from greyscale when chosen, an occasion selector, and a live sentence summary — “Table for 4 · Fri 9 Oct · 8:00 pm · Terrace”.
The CSS collection's nonprofit donation form, ported one-for-one to Tailwind v4: a photo cause panel with an animated campaign bar, a one-time/monthly toggle whose pill slides on has-[[value=monthly]:checked]:before:translate-x-full, four presets paired with concrete impact lines (and their own monthly set), an "Other" amount that auto-selects as you type, an optional fee-cover with the exact extra, a tribute reveal, and a button that always states the total.
The CSS collection's three-step lead-gen quote, ported one-for-one to Tailwind v4: big icon radio cards for Auto, Home, Life or Renters, a details step whose questions change with that choice via group-has-[[value=home]:checked]/root:grid (inapplicable fields disabled), a styled coverage-level slider, a segmented progress bar keyed to data-step, and a sticky estimate panel whose monthly range tweens as you go.
The CSS collection's invitation-style RSVP, ported one-for-one to Tailwind v4: a gold-foil names headline (animated bg-clip-text), accept / maybe / decline as large radio cards, a guest stepper that clones a named row with meal choice from a <template> and lets it fade in with starting:, dietary chips, a song request, and a decline path that swaps everything for a note to the couple via group-has-[[value=no]:checked]/root:.
The CSS collection's self-serve returns portal, ported one-for-one to Tailwind v4: order items as checkbox cards with product photos, each expanding to ask its own quantity and reason (group-has-[.tf-14__pick:checked]/it:grid); a final-sale item that is genuinely disabled and says why; refund to card or store credit with a 10% bonus; drop-off or courier return; a dark live summary; and a QR return label on confirm.
Newsletter
Enjoying these demos? Get new ones by email.
A short email when a new collection ships. Unsubscribe any time.
The CSS collection's new-patient intake, ported one-for-one to Tailwind v4 and still accessibility-first: Atkinson Hyperlegible type at 17px, numbered sections that tick themselves off, a live completion meter, a 0–10 pain slider that names the level in words and shifts from green to red, allergy and insurance follow-ups revealed with group-has-[[value=yes]:checked]/q:grid, a consent box unlocked by an IntersectionObserver once read to the end, and a typed signature on a ruled pad.
The CSS collection's pre-qualification calculator, ported one-for-one to Tailwind v4: linked slider + number inputs for home price and down payment, loan-term and credit-band segmented controls, income and debts — and a live results panel with a house photo, a conic-gradient() donut whose slices animate through three registered @property percentages, a DTI gauge with 36% and 43% markers, a colour-coded verdict and key facts.
The CSS collection's consultation request, ported one-for-one to Tailwind v4: an attorney profile in deep green and brass beside a calm editorial form — practice-area cards with a drawn check, an urgent-deadline switch that reveals a court date via group-has-checked/u:grid, an opposing-party field for conflict checks, a word-counted summary, contact-time chips and the no-attorney-client-relationship acknowledgement.
The CSS collection's B2B ‘Book a demo’, ported one-for-one to Tailwind v4: a dark mesh-gradient stage with a faint grid, a pitch column with a gradient headline, value points, a customer quote and logo row, and a frosted form card — work-email validation that nudges Gmail/Outlook users and auto-fills the company, a team-size segmented control, interest chips, and a scheduler for the next five business days in the visitor's own time zone.
FAQ
Frequently asked questions
How do I make a textarea grow with its content in Tailwind without JavaScript?
The contact form (demo 01) grows its comment box with the CSS field-sizing: content property — no scroll-height JavaScript, no rows juggling. In Tailwind v4 you apply it as an arbitrary utility, [field-sizing:content], on the <textarea>. The element then sizes itself to the wrapped text and reflows on every keystroke. Pair it with a min-h-24 so an empty field still has a comfortable tap target, and a max-h-64 plus overflow-auto so a pasted essay scrolls instead of pushing the submit button off-screen. The common bug is forgetting the min height: an empty field-sizing textarea collapses to a single line and reads as broken. Support is modern Chromium and Firefox; Safari falls back to the fixed rows value, which degrades cleanly rather than breaking the layout.
How do I add a live character counter to a textarea accessibly?
Demo 01 pairs the auto-growing textarea with a live character count. That part is JavaScript: an input listener reads the field's value.length and writes it into a counter node. Bind to input, notkeyup, so paste, autofill and drag-drop all update the count — keyup misses every one of those. For accessibility, don't signal the limit with colour alone, since screen-reader users can't see it: put the counter in an aria-live region set to polite so it announces as the user types, and phrase it as '12 characters left'. If you enforce a hard cap, set maxlength on the <textarea> itself so the browser blocks overflow even when your script hasn't loaded. Announce only when the remaining count crosses a threshold, not on every keystroke, or the live region turns into constant noise that drowns out everything else on the page.
Is the password strength meter pure CSS, or does it need JavaScript?
The registration form (demo 02) scores password strength in JavaScript, because real checks — length, character classes, rejecting common passwords — are logic a stylesheet can't run. The script scores the value and sets a width and colour on a meter bar. Render that bar with a native <meter> or <progress> element rather than a bare <div>, or at least add role and aria-valuenow, so assistive tech announces 'strength: strong' instead of nothing. The usual bug is treating the meter as validation: a green bar is advisory, so never gate submit on it alone — enforce your real floor with minlength and server-side rules. Run the check on input and keep it cheap; don't ship a 10,000-entry common-password dictionary to the client just to colour a bar. The meter guides the user, your backend decides what's actually acceptable.
How do I make a form switch from inline to stacked based on its container, not the viewport?
Demos 03 and 05 adapt to the width of their slot, not the browser window, using container queries. You mark the wrapper as a query container — in Tailwind v4 that is the @container utility — then style children with container variants like @md:flex-row. The newsletter form (demo 05) lays its input and button side by side when the column is wide and stacks them when it's narrow, so the same markup works in a footer, a sidebar and a hero without media queries. The common bug is forgetting to declare the container: an @md: variant with no @container ancestor silently never matches, and the form looks like it ignores your breakpoints entirely. Remember the query measures the container's width, so a form dropped into a 400px sidebar stays stacked even on a 4K monitor — which is exactly the behaviour you want from a reusable component.
How do I build a multi-step form without a framework?
The job application (demo 08) and insurance quote (demo 12) are multi-step wizards driven by CSS state, not a framework. A set of hidden radio inputs — one per step — acts as the state machine: :checked combined with the sibling selector reveals the matching panel and hides the others, and the step controls are <label> elements pointing at those radios. No router, no component library. The accessibility catch: hiding a panel with hidden or display:none correctly pulls it out of the tab order, but if you only fade it with opacity the fields stay focusable and keyboard users tab into an invisible step. Give each step a heading and move focus to it on advance. When not to use it: skip this pattern when steps must validate server-side before proceeding, or when progress has to survive a reload — at that point a real state container earns its weight.
What autocomplete values should I put on an address and checkout form?
The shipping form (demo 04) ships the correct autocomplete tokens so browsers and password managers fill it in one tap. Use the granular address tokens — address-line1, address-line2, postal-code, country-name — plus name, email and tel on the matching inputs. The single most common bug is a blanket autocomplete='on' or a mismatched token: the browser then offers nothing, or drops the city into the street field. Each token must sit on the input whose type and label agree with it. For a billing address on the same page as shipping, prefix with a section token like shipping or billing so the two forms don't fight over the same saved values. This isn't cosmetic — correct autofill is one of the largest real conversion wins on any checkout, and it costs one attribute per field.
How do I keep a range slider and a number input in sync?
The mortgage calculator (demo 16) links a range slider and a number input to the same value — drag the slider and the number updates, type a figure and the thumb moves. That two-way binding is a small script: an input listener on each control writes the other's value and recomputes the estimate. Bind both to input, not change, so the figure tracks live during a drag instead of jumping only on release. Keep the number field as the real labelled control and give the bare slider an aria-label, because dragging a range is hard for motor-impaired and screen-reader users — the number input is their path in. Watch the clamp bug: validate the typed number against the slider's min and max before echoing it back, or a user types 9,999,999, the thumb pins silently to the end, and your math quietly uses the raw figure instead.
How do I style valid and invalid fields without JavaScript?
Several forms here colour fields with the native CSS pseudo-classes :valid, :invalid, :required and :placeholder-shown — in Tailwind v4 those are the valid:, invalid: and required: variants. The browser evaluates them from the input's type, required and pattern, so an email field turns red the moment the value isn't a valid address, with no script. The classic bug is an angry red border on an empty field the user hasn't touched yet: guard it with :not(:placeholder-shown), or a :user-invalid variant where supported, so errors appear only after input. Never signal the error with colour alone — pair it with an icon or a text message tied to the field via aria-describedby, and keep the real gate on the server, because client-side validation is a convenience for the user, not a security boundary.