Files
headlessui/playgrounds/react/pages/suspense/portal.tsx
T
Robin Malfait a73007388f Ensure playgrounds work + switch to npm workspaces (#2907)
* bump Next in playground

* convert legacy Link after Next.js bump

* update yarn.lock

* switch to npm workspaces

* move `packages/playground-*` to `playgrounds/*`

* use `npm` instead of `yarn`

* sync package-lock.json

* use node 20 for insiders releases
2024-01-03 14:26:12 +01:00

73 lines
2.7 KiB
TypeScript

'use client'
import { Portal } from '@headlessui/react'
import { lazy, Suspense } from 'react'
function MyComponent({ children }: { children(message: string): JSX.Element }) {
return <>{children('test')}</>
}
let MyComponentLazy = lazy(async () => {
await new Promise((resolve) => setTimeout(resolve, 4000))
return { default: MyComponent }
})
export default function Index() {
return (
<div>
<h1 className="p-8 text-3xl font-bold">Suspense + Portals</h1>
<Portal>
<div className="absolute right-48 top-24 z-10 flex h-32 w-32 flex-col items-center justify-center rounded border border-black/5 bg-white bg-clip-padding p-px shadow">
<div className="w-full rounded-t-sm bg-gray-100 p-1 text-center text-gray-700">
Instant
</div>
<div className="flex w-full flex-1 items-center justify-center text-3xl font-bold text-gray-400">
1
</div>
</div>
</Portal>
<Portal>
<div className="absolute right-8 top-24 z-10 flex h-32 w-32 flex-col items-center justify-center rounded border border-black/5 bg-white bg-clip-padding p-px shadow">
<div className="w-full rounded-t-sm bg-gray-100 p-1 text-center text-gray-700">
Instant
</div>
<div className="flex w-full flex-1 items-center justify-center text-3xl font-bold text-gray-400">
2
</div>
</div>
</Portal>
<Suspense fallback={<span>Loading ...</span>}>
<MyComponentLazy>
{(env) => (
<div>
<Portal>
<div className="absolute right-48 top-64 z-10 flex h-32 w-32 flex-col items-center justify-center rounded border border-black/5 bg-white bg-clip-padding p-px shadow">
<div className="w-full rounded-t-sm bg-gray-100 p-1 text-center text-gray-700">
Suspense
</div>
<div className="flex w-full flex-1 items-center justify-center text-3xl font-bold text-gray-400">
{env} 1
</div>
</div>
</Portal>
<Portal>
<div className="absolute right-8 top-64 z-10 flex h-32 w-32 flex-col items-center justify-center rounded border border-black/5 bg-white bg-clip-padding p-px shadow">
<div className="w-full rounded-t-sm bg-gray-100 p-1 text-center text-gray-700">
Suspense
</div>
<div className="flex w-full flex-1 items-center justify-center text-3xl font-bold text-gray-400">
{env} 2
</div>
</div>
</Portal>
</div>
)}
</MyComponentLazy>
</Suspense>
</div>
)
}