Skip to content
GitHub

Reveal

Content display/hide animation

import { useState } from "react";
import { Button } from "@/components/ui/pxl/button";
import {
Card,
CardContent,
CardDescription,
CardHeader,
CardTitle,
} from "@/components/ui/pxl/card";
import { Reveal } from "@/components/ui/pxl/reveal";
import { WheelList } from "@/components/ui/pxl/wheel-list";
import { WidgetArea } from "@/components/ui/pxl/widget-area";
export default function RevealPreview() {
const [open, setOpen] = useState(false);
return (
<div className="flex flex-col gap-4">
<Button onClick={() => setOpen((v) => !v)}>
{open ? "Hide menu" : "Show menu"}
</Button>
<div className="w-widget-md aspect-square">
<Reveal
show={open}
variant="muted"
duration={1}
>
<WidgetArea size="sm">
<Card size="lg" className="size-full">
<CardHeader>
<CardTitle>Hello World!</CardTitle>
<CardDescription>Hello</CardDescription>
</CardHeader>
<CardContent>
<WheelList
align="start"
visibleCount={3}
defaultValue="ITEM"
onChange={(evt) =>
console.log(
evt.settled ? `selected ${evt.value}` : "coasting",
)
}
onSelect={(value) => console.log(value)}
>
{[
"POKÉDEX",
"POKÉMON",
"ITEM",
"TRAINER",
"SAVE",
"OPTION",
"EXIT",
].map((i) => (
<WheelList.Option key={i} value={i}>
{i}
</WheelList.Option>
))}
</WheelList>
</CardContent>
</Card>
</WidgetArea>
</Reveal>
</div>
</div>
);
}
pnpm dlx shadcn@latest add pxl-ui/registry/reveal
import { Reveal } from "@/components/ui/pxl/reveal"
<Reveal show={show} duration={seconds}>{content}</Reveal>

Use the pattern prop to change the pattern of the reveal.

import { useState } from "react";
import { Button } from "@/components/ui/pxl/button";
import { Reveal, type RevealPattern } from "@/components/ui/pxl/reveal";
import { WidgetArea } from "@/components/ui/pxl/widget-area";
export default function RetroMenuExample() {
const [open, setOpen] = useState(false);
const [pattern, setPattern] = useState<RevealPattern>("diagonal");
return (
<div className="flex flex-col gap-4 items-center">
<div className="flex flex-row gap-2 w-full">
<Button
className="flex-1"
onClick={() => {
setPattern("radial");
setOpen((v) => !v);
}}
>
{open ? "Hide radial" : "Show radial"}
</Button>
<Button
className="flex-1"
onClick={() => {
setPattern("diagonal");
setOpen((v) => !v);
}}
>
{open ? "Hide diagonal" : "Show diagonal"}
</Button>
<Button
className="flex-1"
onClick={() => {
setPattern("random");
setOpen((v) => !v);
}}
>
{open ? "Hide random" : "Show random"}
</Button>
</div>
<div className="w-widget-md aspect-square">
<Reveal
show={open}
pattern={pattern}
variant="muted"
>
<WidgetArea size="sm">
<nav className="">
<ul className="space-y-2">
<li className="cursor-pointer hover:text-yellow-300">
▸ Continue
</li>
<li className="cursor-pointer hover:text-yellow-300">
▸ Items
</li>
<li className="cursor-pointer hover:text-yellow-300">
▸ Equipment
</li>
<li className="cursor-pointer hover:text-yellow-300">
▸ Save
</li>
</ul>
</nav>
</WidgetArea>
</Reveal>
</div>
</div>
);
}

Use the variant prop to change the variant of the reveal.

import { type ComponentProps, useState } from "react";
import { Button } from "@/components/ui/pxl/button";
import { Reveal } from "@/components/ui/pxl/reveal";
import { WidgetArea } from "@/components/ui/pxl/widget-area";
export default function RetroMenuExample() {
const [open, setOpen] = useState(false);
const [variant, setVariant] =
useState<ComponentProps<typeof Reveal>["variant"]>("default");
return (
<div className="flex flex-col gap-4 items-center">
<div className="flex flex-row gap-2 w-full">
<Button
className="flex-1"
onClick={() => {
setVariant("default");
setOpen((v) => !v);
}}
>
Default (Background)
</Button>
<Button
variant="success"
className="flex-1"
onClick={() => {
setVariant("success");
setOpen((v) => !v);
}}
>
Success
</Button>
<Button
variant="danger"
className="flex-1"
onClick={() => {
setVariant("dangerForeground");
setOpen((v) => !v);
}}
>
Danger Foreground
</Button>
</div>
<div className="w-widget-md aspect-square">
<Reveal show={open} variant={variant}>
<WidgetArea size="sm">
<nav className="">
<ul className="space-y-2">
<li className="cursor-pointer hover:text-yellow-300">
▸ Continue
</li>
<li className="cursor-pointer hover:text-yellow-300">
▸ Items
</li>
<li className="cursor-pointer hover:text-yellow-300">
▸ Equipment
</li>
<li className="cursor-pointer hover:text-yellow-300">▸ Save</li>
</ul>
</nav>
</WidgetArea>
</Reveal>
</div>
</div>
);
}