app-ui / forms / form-layouts
Labels On Left
05-labels-on-left.jsx
import { PhotoIcon, UserCircleIcon } from '@heroicons/react/24/solid'
import { ChevronDownIcon } from '@heroicons/react/16/solid'
export default function Example() {
return (
<form>
<div className="space-y-12 sm:space-y-16">
<div>
<h2 className="text-base/7 font-semibold text-gray-900 dark:text-white">Profile</h2>
<p className="mt-1 max-w-2xl text-sm/6 text-gray-600 dark:text-gray-400">
This information will be displayed publicly so be careful what you share.
</p>
<div className="mt-10 space-y-8 border-b border-gray-900/10 pb-12 sm:space-y-0 sm:divide-y sm:divide-gray-900/10 sm:border-t sm:border-t-gray-900/10 sm:pb-0 dark:border-white/10 dark:sm:divide-white/10 dark:sm:border-t-white/10">
<div className="sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:py-6">
<label htmlFor="username" className="block text-sm/6 font-medium text-gray-900 sm:pt-1.5 dark:text-white">
Username
</label>
<div className="mt-2 sm:col-span-2 sm:mt-0">
<div className="flex items-center rounded-md bg-white pl-3 outline-1 -outline-offset-1 outline-gray-300 focus-within:outline-2 focus-within:-outline-offset-2 focus-within:outline-indigo-600 sm:max-w-md dark:bg-white/5 dark:outline-white/10 dark:focus-within:outline-indigo-500">
<div className="shrink-0 text-base text-gray-500 select-none sm:text-sm/6 dark:text-gray-400">
workcation.com/
</div>
<input
id="username"
name="username"
type="text"
placeholder="janesmith"
className="block min-w-0 grow bg-white py-1.5 pr-3 pl-1 text-base text-gray-900 placeholder:text-gray-400 focus:outline-none sm:text-sm/6 dark:bg-transparent dark:text-white dark:placeholder:text-gray-500"
/>
</div>
</div>
</div>
<div className="sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:py-6">
<label htmlFor="about" className="block text-sm/6 font-medium text-gray-900 sm:pt-1.5 dark:text-white">
About
</label>
<div className="mt-2 sm:col-span-2 sm:mt-0">
<textarea
id="about"
name="about"
rows={3}
className="block w-full rounded-md bg-white px-3 py-1.5 text-base text-gray-900 outline-1 -outline-offset-1 outline-gray-300 placeholder:text-gray-400 focus:outline-2 focus:-outline-offset-2 focus:outline-indigo-600 sm:max-w-2xl sm:text-sm/6 dark:bg-white/5 dark:text-white dark:outline-white/10 dark:placeholder:text-gray-500 dark:focus:outline-indigo-500"
defaultValue={''}
/>
<p className="mt-3 text-sm/6 text-gray-600 dark:text-gray-400">Write a few sentences about yourself.</p>
</div>
</div>
<div className="sm:grid sm:grid-cols-3 sm:items-center sm:gap-4 sm:py-6">
<label htmlFor="photo" className="block text-sm/6 font-medium text-gray-900 dark:text-white">
Photo
</label>
<div className="mt-2 sm:col-span-2 sm:mt-0">
<div className="flex items-center gap-x-3">
<UserCircleIcon aria-hidden="true" className="size-12 text-gray-300 dark:text-gray-500" />
<button
type="button"
className="rounded-md bg-white px-3 py-2 text-sm font-semibold text-gray-900 shadow-xs inset-ring inset-ring-gray-300 hover:bg-gray-50 dark:bg-white/10 dark:text-white dark:shadow-none dark:inset-ring-white/5 dark:hover:bg-white/20"
>
Change
</button>
</div>
</div>
</div>
<div className="sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:py-6">
<label
htmlFor="cover-photo"
className="block text-sm/6 font-medium text-gray-900 sm:pt-1.5 dark:text-white"
>
Cover photo
</label>
<div className="mt-2 sm:col-span-2 sm:mt-0">
<div className="flex max-w-2xl justify-center rounded-lg border border-dashed border-gray-900/25 px-6 py-10 dark:border-white/25">
<div className="text-center">
<PhotoIcon aria-hidden="true" className="mx-auto size-12 text-gray-300 dark:text-gray-600" />
<div className="mt-4 flex text-sm/6 text-gray-600 dark:text-gray-400">
<label
htmlFor="file-upload"
className="relative cursor-pointer rounded-md bg-white font-semibold text-indigo-600 focus-within:outline-2 focus-within:outline-offset-2 focus-within:outline-indigo-600 hover:text-indigo-500 dark:bg-transparent dark:text-indigo-400 dark:focus-within:outline-indigo-500 dark:hover:text-indigo-300"
>
<span>Upload a file</span>
<input id="file-upload" name="file-upload" type="file" className="sr-only" />
</label>
<p className="pl-1">or drag and drop</p>
</div>
<p className="text-xs/5 text-gray-600 dark:text-gray-400">PNG, JPG, GIF up to 10MB</p>
</div>
</div>
</div>
</div>
</div>
</div>
<div>
<h2 className="text-base/7 font-semibold text-gray-900 dark:text-white">Personal Information</h2>
<p className="mt-1 max-w-2xl text-sm/6 text-gray-600 dark:text-gray-400">
Use a permanent address where you can receive mail.
</p>
<div className="mt-10 space-y-8 border-b border-gray-900/10 pb-12 sm:space-y-0 sm:divide-y sm:divide-gray-900/10 sm:border-t sm:border-t-gray-900/10 sm:pb-0 dark:border-white/10 dark:sm:divide-white/10 dark:sm:border-t-white/10">
<div className="sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:py-6">
<label
htmlFor="first-name"
className="block text-sm/6 font-medium text-gray-900 sm:pt-1.5 dark:text-white"
>
First name
</label>
<div className="mt-2 sm:col-span-2 sm:mt-0">
<input
id="first-name"
name="first-name"
type="text"
autoComplete="given-name"
className="block w-full rounded-md bg-white px-3 py-1.5 text-base text-gray-900 outline-1 -outline-offset-1 outline-gray-300 placeholder:text-gray-400 focus:outline-2 focus:-outline-offset-2 focus:outline-indigo-600 sm:max-w-xs sm:text-sm/6 dark:bg-white/5 dark:text-white dark:outline-white/10 dark:placeholder:text-gray-500 dark:focus:outline-indigo-500"
/>
</div>
</div>
<div className="sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:py-6">
<label
htmlFor="last-name"
className="block text-sm/6 font-medium text-gray-900 sm:pt-1.5 dark:text-white"
>
Last name
</label>
<div className="mt-2 sm:col-span-2 sm:mt-0">
<input
id="last-name"
name="last-name"
type="text"
autoComplete="family-name"
className="block w-full rounded-md bg-white px-3 py-1.5 text-base text-gray-900 outline-1 -outline-offset-1 outline-gray-300 placeholder:text-gray-400 focus:outline-2 focus:-outline-offset-2 focus:outline-indigo-600 sm:max-w-xs sm:text-sm/6 dark:bg-white/5 dark:text-white dark:outline-white/10 dark:placeholder:text-gray-500 dark:focus:outline-indigo-500"
/>
</div>
</div>
<div className="sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:py-6">
<label htmlFor="email" className="block text-sm/6 font-medium text-gray-900 sm:pt-1.5 dark:text-white">
Email address
</label>
<div className="mt-2 sm:col-span-2 sm:mt-0">
<input
id="email"
name="email"
type="email"
autoComplete="email"
className="block w-full rounded-md bg-white px-3 py-1.5 text-base text-gray-900 outline-1 -outline-offset-1 outline-gray-300 placeholder:text-gray-400 focus:outline-2 focus:-outline-offset-2 focus:outline-indigo-600 sm:max-w-md sm:text-sm/6 dark:bg-white/5 dark:text-white dark:outline-white/10 dark:placeholder:text-gray-500 dark:focus:outline-indigo-500"
/>
</div>
</div>
<div className="sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:py-6">
<label htmlFor="country" className="block text-sm/6 font-medium text-gray-900 sm:pt-1.5 dark:text-white">
Country
</label>
<div className="mt-2 sm:col-span-2 sm:mt-0">
<div className="grid grid-cols-1 sm:max-w-xs">
<select
id="country"
name="country"
autoComplete="country-name"
className="col-start-1 row-start-1 w-full appearance-none rounded-md bg-white py-1.5 pr-8 pl-3 text-base text-gray-900 outline-1 -outline-offset-1 outline-gray-300 focus:outline-2 focus:-outline-offset-2 focus:outline-indigo-600 sm:text-sm/6 dark:bg-white/5 dark:text-white dark:outline-white/10 dark:*:bg-gray-800 dark:focus:outline-indigo-500"
>
<option>United States</option>
<option>Canada</option>
<option>Mexico</option>
</select>
<ChevronDownIcon
aria-hidden="true"
className="pointer-events-none col-start-1 row-start-1 mr-2 size-5 self-center justify-self-end text-gray-500 sm:size-4 dark:text-gray-400"
/>
</div>
</div>
</div>
<div className="sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:py-6">
<label
htmlFor="street-address"
className="block text-sm/6 font-medium text-gray-900 sm:pt-1.5 dark:text-white"
>
Street address
</label>
<div className="mt-2 sm:col-span-2 sm:mt-0">
<input
id="street-address"
name="street-address"
type="text"
autoComplete="street-address"
className="block w-full rounded-md bg-white px-3 py-1.5 text-base text-gray-900 outline-1 -outline-offset-1 outline-gray-300 placeholder:text-gray-400 focus:outline-2 focus:-outline-offset-2 focus:outline-indigo-600 sm:max-w-xl sm:text-sm/6 dark:bg-white/5 dark:text-white dark:outline-white/10 dark:placeholder:text-gray-500 dark:focus:outline-indigo-500"
/>
</div>
</div>
<div className="sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:py-6">
<label htmlFor="city" className="block text-sm/6 font-medium text-gray-900 sm:pt-1.5 dark:text-white">
City
</label>
<div className="mt-2 sm:col-span-2 sm:mt-0">
<input
id="city"
name="city"
type="text"
autoComplete="address-level2"
className="block w-full rounded-md bg-white px-3 py-1.5 text-base text-gray-900 outline-1 -outline-offset-1 outline-gray-300 placeholder:text-gray-400 focus:outline-2 focus:-outline-offset-2 focus:outline-indigo-600 sm:max-w-xs sm:text-sm/6 dark:bg-white/5 dark:text-white dark:outline-white/10 dark:placeholder:text-gray-500 dark:focus:outline-indigo-500"
/>
</div>
</div>
<div className="sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:py-6">
<label htmlFor="region" className="block text-sm/6 font-medium text-gray-900 sm:pt-1.5 dark:text-white">
State / Province
</label>
<div className="mt-2 sm:col-span-2 sm:mt-0">
<input
id="region"
name="region"
type="text"
autoComplete="address-level1"
className="block w-full rounded-md bg-white px-3 py-1.5 text-base text-gray-900 outline-1 -outline-offset-1 outline-gray-300 placeholder:text-gray-400 focus:outline-2 focus:-outline-offset-2 focus:outline-indigo-600 sm:max-w-xs sm:text-sm/6 dark:bg-white/5 dark:text-white dark:outline-white/10 dark:placeholder:text-gray-500 dark:focus:outline-indigo-500"
/>
</div>
</div>
<div className="sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:py-6">
<label
htmlFor="postal-code"
className="block text-sm/6 font-medium text-gray-900 sm:pt-1.5 dark:text-white"
>
ZIP / Postal code
</label>
<div className="mt-2 sm:col-span-2 sm:mt-0">
<input
id="postal-code"
name="postal-code"
type="text"
autoComplete="postal-code"
className="block w-full rounded-md bg-white px-3 py-1.5 text-base text-gray-900 outline-1 -outline-offset-1 outline-gray-300 placeholder:text-gray-400 focus:outline-2 focus:-outline-offset-2 focus:outline-indigo-600 sm:max-w-xs sm:text-sm/6 dark:bg-white/5 dark:text-white dark:outline-white/10 dark:placeholder:text-gray-500 dark:focus:outline-indigo-500"
/>
</div>
</div>
</div>
</div>
<div>
<h2 className="text-base/7 font-semibold text-gray-900 dark:text-white">Notifications</h2>
<p className="mt-1 max-w-2xl text-sm/6 text-gray-600 dark:text-gray-400">
We'll always let you know about important changes, but you pick what else you want to hear about.
</p>
<div className="mt-10 space-y-10 border-b border-gray-900/10 pb-12 sm:space-y-0 sm:divide-y sm:divide-gray-900/10 sm:border-t sm:border-t-gray-900/10 sm:pb-0 dark:border-white/10 dark:sm:divide-white/10 dark:sm:border-t-white/10">
<fieldset>
<legend className="sr-only">By email</legend>
<div className="sm:grid sm:grid-cols-3 sm:gap-4 sm:py-6">
<div aria-hidden="true" className="text-sm/6 font-semibold text-gray-900 dark:text-white">
By email
</div>
<div className="mt-4 sm:col-span-2 sm:mt-0">
<div className="max-w-lg space-y-6">
<div className="flex gap-3">
<div className="flex h-6 shrink-0 items-center">
<div className="group grid size-4 grid-cols-1">
<input
defaultChecked
id="comments"
name="comments"
type="checkbox"
aria-describedby="comments-description"
className="col-start-1 row-start-1 appearance-none rounded-sm border border-gray-300 bg-white checked:border-indigo-600 checked:bg-indigo-600 indeterminate:border-indigo-600 indeterminate:bg-indigo-600 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600 disabled:border-gray-300 disabled:bg-gray-100 disabled:checked:bg-gray-100 dark:border-white/10 dark:bg-white/5 dark:checked:border-indigo-500 dark:checked:bg-indigo-500 dark:indeterminate:border-indigo-500 dark:indeterminate:bg-indigo-500 dark:focus-visible:outline-indigo-500 dark:disabled:border-white/5 dark:disabled:bg-white/10 dark:disabled:checked:bg-white/10 forced-colors:appearance-auto"
/>
<svg
fill="none"
viewBox="0 0 14 14"
className="pointer-events-none col-start-1 row-start-1 size-3.5 self-center justify-self-center stroke-white group-has-disabled:stroke-gray-950/25 dark:group-has-disabled:stroke-white/25"
>
<path
d="M3 8L6 11L11 3.5"
strokeWidth={2}
strokeLinecap="round"
strokeLinejoin="round"
className="opacity-0 group-has-checked:opacity-100"
/>
<path
d="M3 7H11"
strokeWidth={2}
strokeLinecap="round"
strokeLinejoin="round"
className="opacity-0 group-has-indeterminate:opacity-100"
/>
</svg>
</div>
</div>
<div className="text-sm/6">
<label htmlFor="comments" className="font-medium text-gray-900 dark:text-white">
Comments
</label>
<p id="comments-description" className="text-gray-500 dark:text-gray-400">
Get notified when someones posts a comment on a posting.
</p>
</div>
</div>
<div className="flex gap-3">
<div className="flex h-6 shrink-0 items-center">
<div className="group grid size-4 grid-cols-1">
<input
id="candidates"
name="candidates"
type="checkbox"
aria-describedby="candidates-description"
className="col-start-1 row-start-1 appearance-none rounded-sm border border-gray-300 bg-white checked:border-indigo-600 checked:bg-indigo-600 indeterminate:border-indigo-600 indeterminate:bg-indigo-600 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600 disabled:border-gray-300 disabled:bg-gray-100 disabled:checked:bg-gray-100 dark:border-white/10 dark:bg-white/5 dark:checked:border-indigo-500 dark:checked:bg-indigo-500 dark:indeterminate:border-indigo-500 dark:indeterminate:bg-indigo-500 dark:focus-visible:outline-indigo-500 dark:disabled:border-white/5 dark:disabled:bg-white/10 dark:disabled:checked:bg-white/10 forced-colors:appearance-auto"
/>
<svg
fill="none"
viewBox="0 0 14 14"
className="pointer-events-none col-start-1 row-start-1 size-3.5 self-center justify-self-center stroke-white group-has-disabled:stroke-gray-950/25 dark:group-has-disabled:stroke-white/25"
>
<path
d="M3 8L6 11L11 3.5"
strokeWidth={2}
strokeLinecap="round"
strokeLinejoin="round"
className="opacity-0 group-has-checked:opacity-100"
/>
<path
d="M3 7H11"
strokeWidth={2}
strokeLinecap="round"
strokeLinejoin="round"
className="opacity-0 group-has-indeterminate:opacity-100"
/>
</svg>
</div>
</div>
<div className="text-sm/6">
<label htmlFor="candidates" className="font-medium text-gray-900 dark:text-white">
Candidates
</label>
<p id="candidates-description" className="text-gray-500 dark:text-gray-400">
Get notified when a candidate applies for a job.
</p>
</div>
</div>
<div className="flex gap-3">
<div className="flex h-6 shrink-0 items-center">
<div className="group grid size-4 grid-cols-1">
<input
id="offers"
name="offers"
type="checkbox"
aria-describedby="offers-description"
className="col-start-1 row-start-1 appearance-none rounded-sm border border-gray-300 bg-white checked:border-indigo-600 checked:bg-indigo-600 indeterminate:border-indigo-600 indeterminate:bg-indigo-600 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600 disabled:border-gray-300 disabled:bg-gray-100 disabled:checked:bg-gray-100 dark:border-white/10 dark:bg-white/5 dark:checked:border-indigo-500 dark:checked:bg-indigo-500 dark:indeterminate:border-indigo-500 dark:indeterminate:bg-indigo-500 dark:focus-visible:outline-indigo-500 dark:disabled:border-white/5 dark:disabled:bg-white/10 dark:disabled:checked:bg-white/10 forced-colors:appearance-auto"
/>
<svg
fill="none"
viewBox="0 0 14 14"
className="pointer-events-none col-start-1 row-start-1 size-3.5 self-center justify-self-center stroke-white group-has-disabled:stroke-gray-950/25 dark:group-has-disabled:stroke-white/25"
>
<path
d="M3 8L6 11L11 3.5"
strokeWidth={2}
strokeLinecap="round"
strokeLinejoin="round"
className="opacity-0 group-has-checked:opacity-100"
/>
<path
d="M3 7H11"
strokeWidth={2}
strokeLinecap="round"
strokeLinejoin="round"
className="opacity-0 group-has-indeterminate:opacity-100"
/>
</svg>
</div>
</div>
<div className="text-sm/6">
<label htmlFor="offers" className="font-medium text-gray-900 dark:text-white">
Offers
</label>
<p id="offers-description" className="text-gray-500 dark:text-gray-400">
Get notified when a candidate accepts or rejects an offer.
</p>
</div>
</div>
</div>
</div>
</div>
</fieldset>
<fieldset>
<legend className="sr-only">Push notifications</legend>
<div className="sm:grid sm:grid-cols-3 sm:items-baseline sm:gap-4 sm:py-6">
<div aria-hidden="true" className="text-sm/6 font-semibold text-gray-900 dark:text-white">
Push notifications
</div>
<div className="mt-1 sm:col-span-2 sm:mt-0">
<div className="max-w-lg">
<p className="text-sm/6 text-gray-600 dark:text-gray-400">
These are delivered via SMS to your mobile phone.
</p>
<div className="mt-6 space-y-6">
<div className="flex items-center gap-x-3">
<input
defaultChecked
id="push-everything"
name="push-notifications"
type="radio"
className="relative size-4 appearance-none rounded-full border border-gray-300 bg-white before:absolute before:inset-1 before:rounded-full before:bg-white not-checked:before:hidden checked:border-indigo-600 checked:bg-indigo-600 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600 disabled:border-gray-300 disabled:bg-gray-100 disabled:before:bg-gray-400 dark:border-white/10 dark:bg-white/5 dark:checked:border-indigo-500 dark:checked:bg-indigo-500 dark:focus-visible:outline-indigo-500 dark:disabled:border-white/5 dark:disabled:bg-white/10 dark:disabled:before:bg-white/20 forced-colors:appearance-auto forced-colors:before:hidden"
/>
<label
htmlFor="push-everything"
className="block text-sm/6 font-medium text-gray-900 dark:text-white"
>
Everything
</label>
</div>
<div className="flex items-center gap-x-3">
<input
id="push-email"
name="push-notifications"
type="radio"
className="relative size-4 appearance-none rounded-full border border-gray-300 bg-white before:absolute before:inset-1 before:rounded-full before:bg-white not-checked:before:hidden checked:border-indigo-600 checked:bg-indigo-600 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600 disabled:border-gray-300 disabled:bg-gray-100 disabled:before:bg-gray-400 dark:border-white/10 dark:bg-white/5 dark:checked:border-indigo-500 dark:checked:bg-indigo-500 dark:focus-visible:outline-indigo-500 dark:disabled:border-white/5 dark:disabled:bg-white/10 dark:disabled:before:bg-white/20 forced-colors:appearance-auto forced-colors:before:hidden"
/>
<label
htmlFor="push-email"
className="block text-sm/6 font-medium text-gray-900 dark:text-white"
>
Same as email
</label>
</div>
<div className="flex items-center gap-x-3">
<input
id="push-nothing"
name="push-notifications"
type="radio"
className="relative size-4 appearance-none rounded-full border border-gray-300 bg-white before:absolute before:inset-1 before:rounded-full before:bg-white not-checked:before:hidden checked:border-indigo-600 checked:bg-indigo-600 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600 disabled:border-gray-300 disabled:bg-gray-100 disabled:before:bg-gray-400 dark:border-white/10 dark:bg-white/5 dark:checked:border-indigo-500 dark:checked:bg-indigo-500 dark:focus-visible:outline-indigo-500 dark:disabled:border-white/5 dark:disabled:bg-white/10 dark:disabled:before:bg-white/20 forced-colors:appearance-auto forced-colors:before:hidden"
/>
<label
htmlFor="push-nothing"
className="block text-sm/6 font-medium text-gray-900 dark:text-white"
>
No push notifications
</label>
</div>
</div>
</div>
</div>
</div>
</fieldset>
</div>
</div>
</div>
<div className="mt-6 flex items-center justify-end gap-x-6">
<button type="button" className="text-sm/6 font-semibold text-gray-900 dark:text-white">
Cancel
</button>
<button
type="submit"
className="inline-flex justify-center rounded-md bg-indigo-600 px-3 py-2 text-sm font-semibold text-white shadow-xs hover:bg-indigo-500 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600 dark:bg-indigo-500 dark:shadow-none dark:hover:bg-indigo-400 dark:focus-visible:outline-indigo-500"
>
Save
</button>
</div>
</form>
)
}