app-ui / overlays / drawers
07a Wide User Profile Example
07a-wide-user-profile-example.jsx
'use client'
import { useState } from 'react'
import { Dialog, DialogPanel, DialogTitle, Menu, MenuButton, MenuItem, MenuItems } from '@headlessui/react'
import { XMarkIcon } from '@heroicons/react/24/outline'
import { EllipsisVerticalIcon } from '@heroicons/react/20/solid'
export default function Example() {
const [open, setOpen] = useState(true)
return (
<div>
<button
onClick={() => setOpen(true)}
className="rounded-md bg-gray-950/5 px-2.5 py-1.5 text-sm font-semibold text-gray-900 hover:bg-gray-950/10 dark:bg-white/10 dark:text-white dark:inset-ring dark:inset-ring-white/5 dark:hover:bg-white/20"
>
Open drawer
</button>
<Dialog open={open} onClose={setOpen} className="relative z-10">
<div className="fixed inset-0" />
<div className="fixed inset-0 overflow-hidden">
<div className="absolute inset-0 overflow-hidden">
<div className="pointer-events-none fixed inset-y-0 right-0 flex max-w-full pl-10 sm:pl-16">
<DialogPanel
transition
className="pointer-events-auto w-screen max-w-2xl transform transition duration-500 ease-in-out data-closed:translate-x-full sm:duration-700"
>
<div className="relative flex h-full flex-col overflow-y-auto bg-white shadow-xl dark:bg-gray-800 dark:after:absolute dark:after:inset-y-0 dark:after:left-0 dark:after:w-px dark:after:bg-white/10">
<div className="px-4 py-6 sm:px-6">
<div className="flex items-start justify-between">
<DialogTitle className="text-base font-semibold text-gray-900 dark:text-white">
Profile
</DialogTitle>
<div className="ml-3 flex h-7 items-center">
<button
type="button"
onClick={() => setOpen(false)}
className="relative rounded-md text-gray-400 hover:text-gray-500 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600 dark:hover:text-white dark:focus-visible:outline-indigo-500"
>
<span className="absolute -inset-2.5" />
<span className="sr-only">Close panel</span>
<XMarkIcon aria-hidden="true" className="size-6" />
</button>
</div>
</div>
</div>
{/* Main */}
<div className="divide-y divide-gray-200 dark:divide-white/10">
<div className="pb-6">
<div className="h-24 bg-indigo-700 sm:h-20 lg:h-28 dark:bg-indigo-600" />
<div className="-mt-12 flow-root px-4 sm:-mt-8 sm:flex sm:items-end sm:px-6 lg:-mt-16">
<div>
<div className="-m-1 flex">
<div className="inline-flex overflow-hidden rounded-lg border-4 border-white dark:border-gray-800">
<img
alt=""
src="https://images.unsplash.com/photo-1501031170107-cfd33f0cbdcc?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=256&h=256&q=80"
className="size-24 shrink-0 bg-gray-100 outline -outline-offset-1 outline-black/5 sm:size-40 lg:size-48 dark:bg-gray-800 dark:outline-white/10"
/>
</div>
</div>
</div>
<div className="mt-6 sm:ml-6 sm:flex-1">
<div>
<div className="flex items-center">
<h3 className="text-xl font-bold text-gray-900 sm:text-2xl dark:text-white">
Ashley Porter
</h3>
<span className="ml-2.5 inline-block size-2 shrink-0 rounded-full bg-green-400">
<span className="sr-only">Online</span>
</span>
</div>
<p className="text-sm text-gray-500 dark:text-gray-400">@ashleyporter</p>
</div>
<div className="mt-5 flex flex-wrap space-y-3 sm:space-y-0 sm:space-x-3">
<button
type="button"
className="inline-flex w-full shrink-0 items-center 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 sm:flex-1 dark:bg-indigo-500 dark:shadow-none dark:hover:bg-indigo-400 dark:focus-visible:outline-indigo-500"
>
Message
</button>
<button
type="button"
className="inline-flex w-full flex-1 items-center justify-center 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-gray-100 dark:shadow-none dark:inset-ring-white/5 dark:hover:bg-white/20"
>
Call
</button>
<div className="ml-3 inline-flex sm:ml-0">
<Menu as="div" className="relative inline-block text-left">
<MenuButton className="relative inline-flex items-center rounded-md bg-white p-2 text-gray-400 shadow-xs inset-ring inset-ring-gray-300 hover:bg-gray-50 dark:bg-white/10 dark:text-gray-100 dark:shadow-none dark:inset-ring-white/5 dark:hover:bg-white/20">
<span className="absolute -inset-1" />
<span className="sr-only">Open options menu</span>
<EllipsisVerticalIcon aria-hidden="true" className="size-5" />
</MenuButton>
<MenuItems
transition
className="absolute right-0 z-10 mt-2 w-48 origin-top-right rounded-md bg-white shadow-lg outline-1 outline-black/5 transition data-closed:scale-95 data-closed:transform data-closed:opacity-0 data-enter:duration-100 data-enter:ease-out data-leave:duration-75 data-leave:ease-in dark:bg-gray-800 dark:-outline-offset-1 dark:outline-white/10"
>
<div className="py-1">
<MenuItem>
<a
href="#"
className="block px-4 py-2 text-sm text-gray-700 data-focus:bg-gray-100 data-focus:text-gray-900 data-focus:outline-hidden dark:text-gray-300 dark:data-focus:bg-white/5 dark:data-focus:text-white"
>
View profile
</a>
</MenuItem>
<MenuItem>
<a
href="#"
className="block px-4 py-2 text-sm text-gray-700 data-focus:bg-gray-100 data-focus:text-gray-900 data-focus:outline-hidden dark:text-gray-300 dark:data-focus:bg-white/5 dark:data-focus:text-white"
>
Copy profile link
</a>
</MenuItem>
</div>
</MenuItems>
</Menu>
</div>
</div>
</div>
</div>
</div>
<div className="px-4 py-5 sm:px-0 sm:py-0">
<dl className="space-y-8 sm:space-y-0 sm:divide-y sm:divide-gray-200 dark:sm:divide-white/10">
<div className="sm:flex sm:px-6 sm:py-5">
<dt className="text-sm font-medium text-gray-500 sm:w-40 sm:shrink-0 lg:w-48 dark:text-gray-400">
Bio
</dt>
<dd className="mt-1 text-sm text-gray-900 sm:col-span-2 sm:mt-0 sm:ml-6 dark:text-white">
<p>
Enim feugiat ut ipsum, neque ut. Tristique mi id elementum praesent. Gravida in tempus
feugiat netus enim aliquet a, quam scelerisque. Dictumst in convallis nec in bibendum
aenean arcu.
</p>
</dd>
</div>
<div className="sm:flex sm:px-6 sm:py-5">
<dt className="text-sm font-medium text-gray-500 sm:w-40 sm:shrink-0 lg:w-48 dark:text-gray-400">
Location
</dt>
<dd className="mt-1 text-sm text-gray-900 sm:col-span-2 sm:mt-0 sm:ml-6 dark:text-white">
New York, NY, USA
</dd>
</div>
<div className="sm:flex sm:px-6 sm:py-5">
<dt className="text-sm font-medium text-gray-500 sm:w-40 sm:shrink-0 lg:w-48 dark:text-gray-400">
Website
</dt>
<dd className="mt-1 text-sm text-gray-900 sm:col-span-2 sm:mt-0 sm:ml-6 dark:text-white">
ashleyporter.com
</dd>
</div>
<div className="sm:flex sm:px-6 sm:py-5">
<dt className="text-sm font-medium text-gray-500 sm:w-40 sm:shrink-0 lg:w-48 dark:text-gray-400">
Birthday
</dt>
<dd className="mt-1 text-sm text-gray-900 sm:col-span-2 sm:mt-0 sm:ml-6 dark:text-white">
<time dateTime="1982-06-23">June 23, 1982</time>
</dd>
</div>
</dl>
</div>
</div>
</div>
</DialogPanel>
</div>
</div>
</div>
</Dialog>
</div>
)
}