66 lines
1.7 KiB
TypeScript
66 lines
1.7 KiB
TypeScript
import clsx from 'clsx'
|
|
import { useEffect } from 'react'
|
|
import { BottomNavBar } from './nav/nav-bar'
|
|
import Sidebar from './nav/sidebar'
|
|
import { initPreviews } from 'link-summoner'
|
|
import { ReactNode } from 'react'
|
|
import { Toaster } from 'react-hot-toast'
|
|
|
|
export function Page(props: {
|
|
margin?: boolean
|
|
assertUser?: 'signed-in' | 'signed-out'
|
|
rightSidebar?: ReactNode
|
|
suspend?: boolean
|
|
children?: ReactNode
|
|
}) {
|
|
const { margin, assertUser, children, rightSidebar, suspend } = props
|
|
|
|
if (typeof document !== 'undefined') {
|
|
// Seems to be undefined; because of https://i.imgur.com/4bMQ8rA.png ?
|
|
console.log(initPreviews)
|
|
}
|
|
|
|
return (
|
|
<>
|
|
<div
|
|
className={clsx(
|
|
'mx-auto w-full pb-14 lg:grid lg:grid-cols-12 lg:gap-8 lg:pt-6 xl:max-w-7xl',
|
|
margin && 'px-4'
|
|
)}
|
|
style={suspend ? visuallyHiddenStyle : undefined}
|
|
>
|
|
<Toaster />
|
|
<Sidebar className="sticky top-4 hidden divide-gray-300 self-start pl-2 lg:col-span-2 lg:block" />
|
|
<main
|
|
className={clsx(
|
|
'lg:col-span-8',
|
|
rightSidebar ? 'xl:col-span-7' : 'xl:col-span-8'
|
|
)}
|
|
>
|
|
{children}
|
|
|
|
{/* If right sidebar is hidden, place its content at the bottom of the page. */}
|
|
<div className="mt-4 block xl:hidden">{rightSidebar}</div>
|
|
</main>
|
|
<aside className="hidden xl:col-span-3 xl:block">
|
|
<div className="sticky top-4 space-y-4">{rightSidebar}</div>
|
|
</aside>
|
|
</div>
|
|
|
|
<BottomNavBar />
|
|
</>
|
|
)
|
|
}
|
|
|
|
const visuallyHiddenStyle = {
|
|
clip: 'rect(0 0 0 0)',
|
|
clipPath: 'inset(50%)',
|
|
height: 1,
|
|
margin: -1,
|
|
overflow: 'hidden',
|
|
padding: 0,
|
|
position: 'absolute',
|
|
width: 1,
|
|
whiteSpace: 'nowrap',
|
|
} as const
|