jbilcke-hf's picture
jbilcke-hf HF staff
working on the portal
48c7837
raw
history blame
2.24 kB
import { ReactNode } from "react"
import Image from "next/image"
import { DeviceFrameset } from "react-device-frameset"
import "react-device-frameset/styles/marvel-devices.min.css"
import { useOrientation } from "@/lib/hooks"
import { cn } from "@/lib/utils"
import HFLogo from "../../app/hf-logo.svg"
export function DeviceFrame({ children, companion, showFrame = false }: {
children?: ReactNode
companion?: ReactNode
showFrame?: boolean
}) {
const { isLandscape, isPortrait } = useOrientation()
if (!showFrame) {
return children
}
return (
<div className={cn(`
-mt-8 md:mt-0
transition-all duration-200 ease-in-out
`,
isLandscape
? `scale-[0.9] md:scale-[0.75] lg:scale-[0.9] xl:scale-[1.0] 2xl:scale-[1.1]`
: `scale-[0.8] md:scale-[0.9] lg:scale-[1.1]`
)}>
<DeviceFrameset
device="Nexus 5"
// color="black"
landscape={isLandscape}
// note 1: videos are generated in 1024x576 or 576x1024
// so we need to keep the same ratio here
// note 2: width and height are fixed, if width always stays 512
// that's because the landscape={} parameter will do the switch for us
width={288}
height={512}
>
<div className="
flex flex-col items-center justify-center
w-full h-full
bg-black text-white
">
{children}
</div>
<div className={cn(`
fixed
flex flex-row items-center justify-center
bg-transparent
font-sans
-mb-0
`,
isLandscape ? 'h-4' : 'h-14'
)}
style={{ width: isPortrait ? 288 : 512 }}>
<span className="text-stone-100/50 text-4xs"
style={{ textShadow: "rgb(0 0 0 / 80%) 0px 0px 2px" }}>
Powered by
</span>
<span className="ml-1 mr-0.5">
<Image src={HFLogo} alt="Hugging Face" width={14} height={13} />
</span>
<span className="text-stone-100/80 text-3xs font-semibold"
style={{ textShadow: "rgb(0 0 0 / 80%) 0px 0px 2px" }}>Hugging Face</span>
</div>
</DeviceFrameset>
{companion}
</div>
)
}