# Filter Header Row Policy

## Purpose

`Create filter` must treat the selected worksheet range as the table being filtered.
The first row of that range is the table header row.  Filter dropdown buttons are
therefore rendered inside the header cells such as `商品`, `価格`, `数量`, `金額`.

## Why this matters

Column letters such as `A`, `B`, `C` are grid chrome, not worksheet data.  Showing
filter buttons on every column header made it look like the whole visible grid or
an unrelated active column such as `K` was being filtered.  This was especially
confusing when the user selected a product list but the popup title showed
`Filter K`.

## Behavior

- Multi-cell selection: the selected range becomes the filter range.
- First row of the selected range: rendered as filter header cells.
- Filter dropdowns: shown only for columns inside the selected filter range.
- Criteria application: preserves the existing filter range and only stores
  criteria for columns inside that range.
- Single-cell selection: the model attempts to expand to the contiguous current
  region around the active cell, then falls back to the used range.

## Implementation notes

- `NativeGridModel.enableFilter(range)` owns filter range normalization.
- `NativeGridModel.setFilterCriteria(col, criteria)` no longer resets the range
  when applying a criterion.
- `NativeGridRenderer.isFilterHeaderCell(filter, row, col)` decides where to draw
  the dropdown button.
- The renderer deliberately keeps filter controls out of `.ng-col-header` so Host
  and user operations can distinguish worksheet content from grid chrome.
