PageTabs
PageTabs is a native button wrapper for document-style page tab strips. Use it for editor buffers, terminal pages, and other tab rows that navigate between pages without owning panels.
import { PageTabs, Panel } from "density-base-ui";
import { X } from "lucide-react";
const items = [
{ id: "overview", label: "Overview" },
{ id: "roadmap", label: "Roadmap" },
{ id: "activity", label: "Activity" },
{ id: "disabled", label: "Archived", disabled: true },
];
export default function PageTabsExample() {
return (
<Panel>
<style>{`
.page-tabs-example-close {
opacity: 0;
transition: opacity 120ms ease;
}
[role="tab"]:hover .page-tabs-example-close,
[role="tab"]:focus-visible .page-tabs-example-close {
opacity: 1;
}
`}</style>
<PageTabs
aria-label="Project pages"
activeId="overview"
items={items}
renderTab={(item, state) => (
<span style={styles.tabContent}>
<span style={styles.tabLabel}>{item.label}</span>
{!state.disabled ? (
<X
aria-hidden="true"
className="page-tabs-example-close"
size={12}
strokeWidth={1.75}
style={styles.closeIcon}
/>
) : null}
</span>
)}
/>
<section style={styles.page}>Overview</section>
</Panel>
);
}
const styles = {
tabContent: {
display: "inline-grid",
gridTemplateColumns: "minmax(0, 1fr) auto",
alignItems: "center",
gap: "0.25rem",
width: "100%",
minWidth: 0,
},
tabLabel: {
overflow: "hidden",
textOverflow: "ellipsis",
whiteSpace: "nowrap",
},
closeIcon: {
marginInlineEnd: "-0.25rem",
},
page: {
minHeight: "5rem",
padding: "1rem",
},
} as const;Props
| Prop | Attribute | Values | Default |
|---|---|---|---|
items |
None | { id, label, disabled? }[] |
Required |
activeId |
None | string |
Required |
onActiveIdChange |
None | (id) => void |
None |
renderTab |
None | (item, state) => ReactNode |
None |
density-level |
data-dn-level |
1, 2, 3, 4, 5, 6, 7 |
3 |
density-size |
data-dn-size |
2xs, xs, sm, md, lg, xl, 2xl, 3xl |
md |
| Other native div props | Mixed | HTMLAttributes<HTMLDivElement> |
None |