# DataTable settings sheet — scroll-safe layout

Use these compound components from `impact-nova/data-table` inside `DataTableSheetContent`. They enforce a single scroll owner per tab and the flex `min-h-0` chain required for fixed-height sheets.

## Canonical structure

```tsx
import {
  DataTableSheet,
  DataTableSheetContent,
  DataTableSheetHeader,
  DataTableSheetBody,
  DataTableSheetSection,
  DataTableSheetTabs,
  DataTableSheetTabsList,
  DataTableSheetTabPanel,
  DataTableColumnList,
  DataTableFormatOptions,
} from 'impact-nova/data-table';
import { TabsTrigger } from 'impact-nova/tabs';

<DataTableSheet open={sheetOpen} onOpenChange={setSheetOpen}>
  <DataTableSheetContent>
    <DataTableSheetHeader title="Table Settings" />
    <DataTableSheetBody>
      <DataTableSheetSection>
        {/* saved views — does not scroll */}
      </DataTableSheetSection>
      <DataTableSheetTabs value={tab} onValueChange={setTab} variant="line" className="px-4">
        <DataTableSheetTabsList>
          <TabsTrigger value="columns">Columns</TabsTrigger>
          <TabsTrigger value="format">Format</TabsTrigger>
        </DataTableSheetTabsList>
        <DataTableSheetTabPanel layout="list" value="columns" className="p-0 pt-2">
          <DataTableColumnList />
        </DataTableSheetTabPanel>
        <DataTableSheetTabPanel layout="scroll" value="format" className="p-4 pt-1">
          <DataTableFormatOptions />
        </DataTableSheetTabPanel>
      </DataTableSheetTabs>
    </DataTableSheetBody>
  </DataTableSheetContent>
</DataTableSheet>
```

## Component guide

| Component | When to use |
|-----------|-------------|
| `DataTableSheetBody` | **Always** — first child below `DataTableSheetHeader` |
| `DataTableSheetSection` | Saved views, filter summary, chips — fixed chrome above tabs |
| `DataTableSheetTabs` | Tabbed settings (replaces raw `Tabs` in sheet bodies) |
| `DataTableSheetTabsList` | Tab bar — stays fixed while body scrolls |
| `DataTableSheetTabPanel layout="list"` | Column/KPI/nested lists — **list scrolls**, search sticky |
| `DataTableSheetTabPanel layout="scroll"` | Format options, filter forms — **panel scrolls** |

## When to avoid

- Raw `Tabs` + manual `overflow-y-auto` / `flex-1 min-h-0` in sheet bodies — duplicates scroll owners
- `layout="scroll"` on column/KPI tabs — breaks sticky search in `NestedList`
- `layout="list"` on format/filter tabs — long options clip with no scrollbar
- Skipping `DataTableSheetBody` when tabs or saved views are present — content clips

## Rule

**One scroll owner per visible tab:** either the tab panel (`layout="scroll"`) or the nested list inside (`layout="list"`). Never both.

Storybook: `Data Display/DataTable/Sheet layout` → `CanonicalComposition`.

See also: `impact-nova://ag-grid-rules` (column settings + AG Grid integration).
