Created
December 6, 2023 14:59
-
-
Save stinkymonkeyph/48a654220a6230b66b343c59ac64900b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"use client"; | |
import { Fragment } from 'react' | |
import { Menu, Popover, Transition } from '@headlessui/react' | |
import { | |
ChatBubbleLeftEllipsisIcon, | |
CodeBracketIcon, | |
EllipsisVerticalIcon, | |
EyeIcon, | |
FlagIcon, | |
HandThumbUpIcon, | |
MagnifyingGlassIcon, | |
PlusIcon, | |
ShareIcon, | |
StarIcon, | |
} from '@heroicons/react/20/solid' | |
import { | |
ArrowTrendingUpIcon, | |
Bars3Icon, | |
BellIcon, | |
FireIcon, | |
HomeIcon, | |
UserGroupIcon, | |
XMarkIcon, | |
} from '@heroicons/react/24/outline' | |
const user = { | |
name: 'Chelsea Hagon', | |
email: 'chelsea.hagon@example.com', | |
imageUrl: | |
'https://images.unsplash.com/photo-1550525811-e5869dd03032?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=256&h=256&q=80', | |
} | |
const navigation = [ | |
{ name: 'Home', href: '#', icon: HomeIcon, current: true }, | |
{ name: 'Popular', href: '#', icon: FireIcon, current: false }, | |
{ name: 'Communities', href: '#', icon: UserGroupIcon, current: false }, | |
{ name: 'Trending', href: '#', icon: ArrowTrendingUpIcon, current: false }, | |
] | |
const userNavigation = [ | |
{ name: 'Your Profile', href: '#' }, | |
{ name: 'Settings', href: '#' }, | |
{ name: 'Sign out', href: '#' }, | |
] | |
const communities = [ | |
{ name: 'Movies', href: '#' }, | |
{ name: 'Food', href: '#' }, | |
{ name: 'Sports', href: '#' }, | |
{ name: 'Animals', href: '#' }, | |
{ name: 'Science', href: '#' }, | |
{ name: 'Dinosaurs', href: '#' }, | |
{ name: 'Talents', href: '#' }, | |
{ name: 'Gaming', href: '#' }, | |
] | |
const tabs = [ | |
{ name: 'Recent', href: '#', current: true }, | |
{ name: 'Most Liked', href: '#', current: false }, | |
{ name: 'Most Answers', href: '#', current: false }, | |
] | |
const questions = [ | |
{ | |
id: '81614', | |
likes: '29', | |
replies: '11', | |
views: '2.7k', | |
author: { | |
name: 'Dries Vincent', | |
imageUrl: | |
'https://images.unsplash.com/photo-1506794778202-cad84cf45f1d?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=256&h=256&q=80', | |
href: '#', | |
}, | |
date: 'December 9 at 11:43 AM', | |
datetime: '2020-12-09T11:43:00', | |
href: '#', | |
title: 'What would you have done differently if you ran Jurassic Park?', | |
body: ` | |
<p>Jurassic Park was an incredible idea and a magnificent feat of engineering, but poor protocols and a disregard for human safety killed what could have otherwise been one of the best businesses of our generation.</p> | |
<p>Ultimately, I think that if you wanted to run the park successfully and keep visitors safe, the most important thing to prioritize would be…</p> | |
`, | |
}, | |
// More questions... | |
] | |
const whoToFollow = [ | |
{ | |
name: 'Leonard Krasner', | |
handle: 'leonardkrasner', | |
href: '#', | |
imageUrl: | |
'https://images.unsplash.com/photo-1519345182560-3f2917c472ef?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=256&h=256&q=80', | |
}, | |
// More people... | |
] | |
const trendingPosts = [ | |
{ | |
id: 1, | |
user: { | |
name: 'Floyd Miles', | |
imageUrl: | |
'https://images.unsplash.com/photo-1463453091185-61582044d556?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=256&h=256&q=80', | |
}, | |
body: 'What books do you have on your bookshelf just to look smarter than you actually are?', | |
comments: 291, | |
}, | |
// More posts... | |
] | |
function classNames(...classes: any[]) { | |
return classes.filter(Boolean).join(' ') | |
} | |
export default function Example() { | |
return ( | |
<> | |
{/* | |
This example requires updating your template: | |
``` | |
<html class="h-full bg-gray-100"> | |
<body class="h-full"> | |
``` | |
*/} | |
<div className="min-h-full"> | |
{/* When the mobile menu is open, add `overflow-hidden` to the `body` element to prevent double scrollbars */} | |
<Popover | |
as="header" | |
className={({ open }) => | |
classNames( | |
open ? 'fixed inset-0 z-40 overflow-y-auto' : '', | |
'bg-white shadow-sm lg:static lg:overflow-y-visible' | |
) | |
} | |
> | |
{({ open }) => ( | |
<> | |
<div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8"> | |
<div className="relative flex justify-between lg:gap-8 xl:grid xl:grid-cols-12"> | |
<div className="flex md:absolute md:inset-y-0 md:left-0 lg:static xl:col-span-2"> | |
<div className="flex flex-shrink-0 items-center"> | |
<a href="#"> | |
<img | |
className="block h-8 w-auto" | |
src="https://tailwindui.com/img/logos/mark.svg?color=rose&shade=500" | |
alt="Your Company" | |
/> | |
</a> | |
</div> | |
</div> | |
<div className="min-w-0 flex-1 md:px-8 lg:px-0 xl:col-span-6"> | |
<div className="flex items-center px-6 py-4 md:mx-auto md:max-w-3xl lg:mx-0 lg:max-w-none xl:px-0"> | |
<div className="w-full"> | |
<label htmlFor="search" className="sr-only"> | |
Search | |
</label> | |
<div className="relative"> | |
<div className="pointer-events-none absolute inset-y-0 left-0 flex items-center pl-3"> | |
<MagnifyingGlassIcon className="h-5 w-5 text-gray-400" aria-hidden="true" /> | |
</div> | |
<input | |
id="search" | |
name="search" | |
className="block w-full rounded-md border-0 bg-white py-1.5 pl-10 pr-3 ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-rose-500 sm:text-sm sm:leading-6" | |
placeholder="Search" | |
type="search" | |
/> | |
</div> | |
</div> | |
</div> | |
</div> | |
<div className="flex items-center md:absolute md:inset-y-0 md:right-0 lg:hidden"> | |
{/* Mobile menu button */} | |
<Popover.Button className="relative -mx-2 inline-flex items-center justify-center rounded-md p-2 text-gray-400 hover:bg-gray-100 hover:text-gray-500 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-rose-500"> | |
<span className="absolute -inset-0.5" /> | |
<span className="sr-only">Open menu</span> | |
{open ? ( | |
<XMarkIcon className="block h-6 w-6" aria-hidden="true" /> | |
) : ( | |
<Bars3Icon className="block h-6 w-6" aria-hidden="true" /> | |
)} | |
</Popover.Button> | |
</div> | |
<div className="hidden lg:flex lg:items-center lg:justify-end xl:col-span-4"> | |
<a href="#" className="text-sm font-medium text-gray-900 hover:underline"> | |
Go Premium | |
</a> | |
<a | |
href="#" | |
className="ml-5 flex-shrink-0 rounded-full bg-white p-1 text-gray-400 hover:text-gray-500 focus:outline-none focus:ring-2 focus:ring-rose-500 focus:ring-offset-2" | |
> | |
<span className="sr-only">View notifications</span> | |
<BellIcon className="h-6 w-6" aria-hidden="true" /> | |
</a> | |
{/* Profile dropdown */} | |
<Menu as="div" className="relative ml-5 flex-shrink-0"> | |
<div> | |
<Menu.Button className="relative flex rounded-full bg-white focus:outline-none focus:ring-2 focus:ring-rose-500 focus:ring-offset-2"> | |
<span className="absolute -inset-1.5" /> | |
<span className="sr-only">Open user menu</span> | |
<img className="h-8 w-8 rounded-full" src={user.imageUrl} alt="" /> | |
</Menu.Button> | |
</div> | |
<Transition | |
as={Fragment} | |
enter="transition ease-out duration-100" | |
enterFrom="transform opacity-0 scale-95" | |
enterTo="transform opacity-100 scale-100" | |
leave="transition ease-in duration-75" | |
leaveFrom="transform opacity-100 scale-100" | |
leaveTo="transform opacity-0 scale-95" | |
> | |
<Menu.Items className="absolute right-0 z-10 mt-2 w-48 origin-top-right rounded-md bg-white py-1 shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none"> | |
{userNavigation.map((item) => ( | |
<Menu.Item key={item.name}> | |
{({ active }) => ( | |
<a | |
href={item.href} | |
className={classNames( | |
active ? 'bg-gray-100' : '', | |
'block px-4 py-2 text-sm text-gray-700' | |
)} | |
> | |
{item.name} | |
</a> | |
)} | |
</Menu.Item> | |
))} | |
</Menu.Items> | |
</Transition> | |
</Menu> | |
<a | |
href="#" | |
className="ml-6 inline-flex items-center rounded-md bg-rose-600 px-3 py-2 text-sm font-semibold text-white shadow-sm hover:bg-rose-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-rose-600" | |
> | |
New Post | |
</a> | |
</div> | |
</div> | |
</div> | |
<Popover.Panel as="nav" className="lg:hidden" aria-label="Global"> | |
<div className="mx-auto max-w-3xl space-y-1 px-2 pb-3 pt-2 sm:px-4"> | |
{navigation.map((item) => ( | |
<a | |
key={item.name} | |
href={item.href} | |
aria-current={item.current ? 'page' : undefined} | |
className={classNames( | |
item.current ? 'bg-gray-100 text-gray-900' : 'hover:bg-gray-50', | |
'block rounded-md py-2 px-3 text-base font-medium' | |
)} | |
> | |
{item.name} | |
</a> | |
))} | |
</div> | |
<div className="border-t border-gray-200 pt-4"> | |
<div className="mx-auto flex max-w-3xl items-center px-4 sm:px-6"> | |
<div className="flex-shrink-0"> | |
<img className="h-10 w-10 rounded-full" src={user.imageUrl} alt="" /> | |
</div> | |
<div className="ml-3"> | |
<div className="text-base font-medium text-gray-800">{user.name}</div> | |
<div className="text-sm font-medium text-gray-500">{user.email}</div> | |
</div> | |
<button | |
type="button" | |
className="relative ml-auto flex-shrink-0 rounded-full bg-white p-1 text-gray-400 hover:text-gray-500 focus:outline-none focus:ring-2 focus:ring-rose-500 focus:ring-offset-2" | |
> | |
<span className="absolute -inset-1.5" /> | |
<span className="sr-only">View notifications</span> | |
<BellIcon className="h-6 w-6" aria-hidden="true" /> | |
</button> | |
</div> | |
<div className="mx-auto mt-3 max-w-3xl space-y-1 px-2 sm:px-4"> | |
{userNavigation.map((item) => ( | |
<a | |
key={item.name} | |
href={item.href} | |
className="block rounded-md px-3 py-2 text-base font-medium text-gray-500 hover:bg-gray-50 hover:text-gray-900" | |
> | |
{item.name} | |
</a> | |
))} | |
</div> | |
</div> | |
<div className="mx-auto mt-6 max-w-3xl px-4 sm:px-6"> | |
<a | |
href="#" | |
className="flex w-full items-center justify-center rounded-md border border-transparent bg-rose-600 px-4 py-2 text-base font-medium text-white shadow-sm hover:bg-rose-700" | |
> | |
New Post | |
</a> | |
<div className="mt-6 flex justify-center"> | |
<a href="#" className="text-base font-medium text-gray-900 hover:underline"> | |
Go Premium | |
</a> | |
</div> | |
</div> | |
</Popover.Panel> | |
</> | |
)} | |
</Popover> | |
<div className="py-10"> | |
<div className="mx-auto max-w-3xl sm:px-6 lg:grid lg:max-w-7xl lg:grid-cols-12 lg:gap-8 lg:px-8"> | |
<div className="hidden lg:col-span-3 lg:block xl:col-span-2"> | |
<nav aria-label="Sidebar" className="sticky top-4 divide-y divide-gray-300"> | |
<div className="space-y-1 pb-8"> | |
{navigation.map((item) => ( | |
<a | |
key={item.name} | |
href={item.href} | |
className={classNames( | |
item.current ? 'bg-gray-200 text-gray-900' : 'text-gray-700 hover:bg-gray-50', | |
'group flex items-center rounded-md px-3 py-2 text-sm font-medium' | |
)} | |
aria-current={item.current ? 'page' : undefined} | |
> | |
<item.icon | |
className={classNames( | |
item.current ? 'text-gray-500' : 'text-gray-400 group-hover:text-gray-500', | |
'-ml-1 mr-3 h-6 w-6 flex-shrink-0' | |
)} | |
aria-hidden="true" | |
/> | |
<span className="truncate">{item.name}</span> | |
</a> | |
))} | |
</div> | |
<div className="pt-10"> | |
<p className="px-3 text-sm font-medium text-gray-500" id="communities-headline"> | |
Communities | |
</p> | |
<div className="mt-3 space-y-2" aria-labelledby="communities-headline"> | |
{communities.map((community) => ( | |
<a | |
key={community.name} | |
href={community.href} | |
className="group flex items-center rounded-md px-3 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50 hover:text-gray-900" | |
> | |
<span className="truncate">{community.name}</span> | |
</a> | |
))} | |
</div> | |
</div> | |
</nav> | |
</div> | |
<main className="lg:col-span-9 xl:col-span-6"> | |
<div className="px-4 sm:px-0"> | |
<div className="sm:hidden"> | |
<label htmlFor="question-tabs" className="sr-only"> | |
Select a tab | |
</label> | |
<select | |
id="question-tabs" | |
className="block w-full rounded-md border-0 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 focus:ring-2 focus:ring-inset focus:ring-rose-500" | |
defaultValue={tabs.find((tab) => tab.current)?.name} | |
> | |
{tabs.map((tab) => ( | |
<option key={tab.name}>{tab.name}</option> | |
))} | |
</select> | |
</div> | |
<div className="hidden sm:block"> | |
<nav className="isolate flex divide-x divide-gray-200 rounded-lg shadow" aria-label="Tabs"> | |
{tabs.map((tab, tabIdx) => ( | |
<a | |
key={tab.name} | |
href={tab.href} | |
aria-current={tab.current ? 'page' : undefined} | |
className={classNames( | |
tab.current ? 'text-gray-900' : 'text-gray-500 hover:text-gray-700', | |
tabIdx === 0 ? 'rounded-l-lg' : '', | |
tabIdx === tabs.length - 1 ? 'rounded-r-lg' : '', | |
'group relative min-w-0 flex-1 overflow-hidden bg-white py-4 px-6 text-center text-sm font-medium hover:bg-gray-50 focus:z-10' | |
)} | |
> | |
<span>{tab.name}</span> | |
<span | |
aria-hidden="true" | |
className={classNames( | |
tab.current ? 'bg-rose-500' : 'bg-transparent', | |
'absolute inset-x-0 bottom-0 h-0.5' | |
)} | |
/> | |
</a> | |
))} | |
</nav> | |
</div> | |
</div> | |
<div className="mt-4 grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-3"> | |
<div className="h-full w-full bg-black">1</div> | |
<div className="h-full w-full bg-black">2</div> | |
<div className="h-full w-full bg-black">3</div> | |
<div className="h-full w-full bg-black">4</div> | |
<div className="h-full w-full bg-black">1</div> | |
<div className="h-full w-full bg-black">2</div> | |
<div className="h-full w-full bg-black">3</div> | |
<div className="h-full w-full bg-black">4</div> | |
</div> | |
</main> | |
<aside className="hidden xl:col-span-4 xl:block"> | |
<div className="sticky top-4 space-y-4"> | |
<section aria-labelledby="who-to-follow-heading"> | |
<div className="rounded-lg bg-white shadow"> | |
<div className="p-6"> | |
<h2 id="who-to-follow-heading" className="text-base font-medium text-gray-900"> | |
Who to follow | |
</h2> | |
<div className="mt-6 flow-root"> | |
<ul role="list" className="-my-4 divide-y divide-gray-200"> | |
{whoToFollow.map((user) => ( | |
<li key={user.handle} className="flex items-center space-x-3 py-4"> | |
<div className="flex-shrink-0"> | |
<img className="h-8 w-8 rounded-full" src={user.imageUrl} alt="" /> | |
</div> | |
<div className="min-w-0 flex-1"> | |
<p className="text-sm font-medium text-gray-900"> | |
<a href={user.href}>{user.name}</a> | |
</p> | |
<p className="text-sm text-gray-500"> | |
<a href={user.href}>{'@' + user.handle}</a> | |
</p> | |
</div> | |
<div className="flex-shrink-0"> | |
<button | |
type="button" | |
className="inline-flex items-center gap-x-1.5 text-sm font-semibold leading-6 text-gray-900" | |
> | |
<PlusIcon className="h-5 w-5 text-gray-400" aria-hidden="true" /> | |
Follow | |
</button> | |
</div> | |
</li> | |
))} | |
</ul> | |
</div> | |
<div className="mt-6"> | |
<a | |
href="#" | |
className="block w-full rounded-md bg-white px-3 py-2 text-center text-sm font-semibold text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 hover:bg-gray-50 focus-visible:outline-offset-0" | |
> | |
View all | |
</a> | |
</div> | |
</div> | |
</div> | |
</section> | |
<section aria-labelledby="trending-heading"> | |
<div className="rounded-lg bg-white shadow"> | |
<div className="p-6"> | |
<h2 id="trending-heading" className="text-base font-medium text-gray-900"> | |
Trending | |
</h2> | |
<div className="mt-6 flow-root"> | |
<ul role="list" className="-my-4 divide-y divide-gray-200"> | |
{trendingPosts.map((post) => ( | |
<li key={post.id} className="flex space-x-3 py-4"> | |
<div className="flex-shrink-0"> | |
<img className="h-8 w-8 rounded-full" src={post.user.imageUrl} alt={post.user.name} /> | |
</div> | |
<div className="min-w-0 flex-1"> | |
<p className="text-sm text-gray-800">{post.body}</p> | |
<div className="mt-2 flex"> | |
<span className="inline-flex items-center text-sm"> | |
<button | |
type="button" | |
className="inline-flex space-x-2 text-gray-400 hover:text-gray-500" | |
> | |
<ChatBubbleLeftEllipsisIcon className="h-5 w-5" aria-hidden="true" /> | |
<span className="font-medium text-gray-900">{post.comments}</span> | |
</button> | |
</span> | |
</div> | |
</div> | |
</li> | |
))} | |
</ul> | |
</div> | |
<div className="mt-6"> | |
<a | |
href="#" | |
className="block w-full rounded-md bg-white px-3 py-2 text-center text-sm font-semibold text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 hover:bg-gray-50 focus-visible:outline-offset-0" | |
> | |
View all | |
</a> | |
</div> | |
</div> | |
</div> | |
</section> | |
</div> | |
</aside> | |
</div> | |
</div> | |
</div> | |
</> | |
) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment