Item

Item renders a compact row with a title, optional subtitle, and optional start and end slots. It always uses Density’s button presentation. Subtitles render one size smaller than the Item size, clamped at 2xs.

Release notesEdited 12 minutes ago
import { Button, Item, Panel } from "density-base-ui";
import { FileText, MoreHorizontal } from "lucide-react";

export default function ItemExample() {
  return (
    <Panel>
      <Item
        as="div"
        title="Release notes"
        subtitle="Edited 12 minutes ago"
        childrenStart={<FileText aria-hidden="true" size={16} />}
        childrenEnd={
          <Button
            type="button"
            aria-label="Release notes options"
            density-emphasis="ghost"
            density-size="sm"
            square
          >
            <MoreHorizontal aria-hidden="true" size={16} />
          </Button>
        }
      />
    </Panel>
  );
}

Props

Prop Attribute Values Default
title None ReactNode Required
subtitle None ReactNode None
childrenStart None ReactNode None
childrenEnd None ReactNode None
density-emphasis data-dn-emphasis primary, secondary, outline, ghost secondary
density-size data-dn-size 2xs, xs, sm, md, lg, xl, 2xl, 3xl md
Fixed presentation data-dn-presentation button button

Emphasis

primaryItem emphasis
secondaryItem emphasis
outlineItem emphasis
ghostItem emphasis
import { Button, Item, Panel } from "density-base-ui";
import { CircleDot, MoreHorizontal } from "lucide-react";

const emphases = ["primary", "secondary", "outline", "ghost"] as const;

export default function ItemEmphasisExample() {
  return (
    <Panel style={styles.panel}>
      {emphases.map((emphasis) => (
        <Item
          as="div"
          key={emphasis}
          title={emphasis}
          subtitle="Item emphasis"
          density-emphasis={emphasis}
          childrenStart={<CircleDot aria-hidden="true" size={14} />}
          childrenEnd={
            <Button
              type="button"
              aria-label={`${emphasis} item options`}
              density-emphasis="ghost"
              density-size="sm"
              square
            >
              <MoreHorizontal aria-hidden="true" size={14} />
            </Button>
          }
        />
      ))}
    </Panel>
  );
}

const styles = {
  panel: {
    display: "grid",
    gap: "0.375rem",
  },
} as const;

Size

2xsItem size
xsItem size
smItem size
mdItem size
lgItem size
xlItem size
2xlItem size
3xlItem size
import { Button, Item, Panel } from "density-base-ui";
import { FileText, MoreHorizontal } from "lucide-react";

const sizes = ["2xs", "xs", "sm", "md", "lg", "xl", "2xl", "3xl"] as const;

export default function ItemSizeExample() {
  return (
    <Panel style={styles.panel}>
      {sizes.map((size) => (
        <Item
          as="div"
          key={size}
          title={size}
          subtitle="Item size"
          density-size={size}
          childrenStart={<FileText aria-hidden="true" size={14} />}
          childrenEnd={
            <Button
              type="button"
              aria-label={`${size} item options`}
              density-emphasis="ghost"
              density-size="sm"
              square
            >
              <MoreHorizontal aria-hidden="true" size={14} />
            </Button>
          }
        />
      ))}
    </Panel>
  );
}

const styles = {
  panel: {
    display: "grid",
    gap: "0.375rem",
  },
} as const;