App shells
Sidebars and top bars that hold a product together.
- 5 blocks
- 2 free
- 3 Pro
- Light and dark
- Responsive
Unlock 55 Pro blocks and every template
Every preview is open. With Pro you get the code, copy-paste ready, with every update for good.
A brand-coloured header that the page overlaps.
shell-stacked.tsx
"use client";
import { Bell, ChevronDown, Download } from "lucide-react";
import * as React from "react";
import { Avatar, Button, WaveinnoLogo, cn } from "@waveinno/ui";
const LINKS = ["Dashboard", "Sessions", "Passes", "Reports"];
export default function ShellStacked() {
const [active, setActive] = React.useState("Dashboard");
return (
<div className="min-h-[600px] bg-surface">
<div className="bg-[linear-gradient(135deg,var(--brand-1),var(--brand-2))] pb-32">
<header className="mx-auto flex h-16 max-w-6xl items-center gap-6 px-4 sm:px-6">
<WaveinnoLogo tone="inverse" className="h-5" />
<nav aria-label="Main" className="hidden items-center gap-1 md:flex">
{LINKS.map((l) => (
<button
key={l}
type="button"
onClick={() => setActive(l)}
className={cn("cursor-pointer rounded-[10px] px-3 py-1.5 text-[13.5px] font-medium transition-colors", active === l ? "bg-white/15 text-white" : "text-white/75 hover:bg-white/10 hover:text-white")}
>
{l}
</button>
))}
</nav>
<div className="ml-auto flex items-center gap-2">
<button type="button" aria-label="Notifications" className="grid size-9 cursor-pointer place-items-center rounded-full text-white/80 hover:bg-white/10 hover:text-white">
<Bell className="size-[18px]" />
</button>
<button type="button" className="flex cursor-pointer items-center gap-2 rounded-full py-1 pl-1 pr-2 text-white hover:bg-white/10">
<Avatar name="Karim Ahmed" size="sm" />
<ChevronDown className="size-4 text-white/70" />
</button>
</div>
</header>
<div className="mx-auto flex max-w-6xl flex-wrap items-end justify-between gap-4 border-t border-white/15 px-4 pt-8 sm:px-6">
<div>
<p className="text-[13px] text-white/70">Thursday, 1 October</p>
<h1 className="disp text-[28px] font-bold leading-9 tracking-[-0.025em] text-white">{active}</h1>
</div>
<Button variant="glass">
<Download /> Export
</Button>
</div>
</div>
<main className="mx-auto -mt-24 max-w-6xl px-4 pb-10 sm:px-6">
<div className="min-h-80 rounded-[20px] border border-border bg-raised p-6 shadow-[0_24px_50px_-30px_rgba(5,8,22,.35)]">
<div className="grid gap-4 sm:grid-cols-3">
{[0, 1, 2].map((i) => (
<div key={i} className="h-24 rounded-[14px] border border-dashed border-border2" />
))}
</div>
<div className="mt-4 h-48 rounded-[14px] border border-dashed border-border2" />
</div>
</main>
</div>
);
}An icon rail with a panel of sections beside it.
An ink sidebar, a workspace switcher and usage.