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.

Overview
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