# Row Module data flow

## What It Does
- Summary: Manages row model data and renders row DOM for the spreadsheet grid. Covers height calculation, hidden/filtered state, row-header visuals, DPR alignment, and integration with the cell renderer. See `src/workbook/base/row.ts` and `src/spreadsheet/renderer/row.ts` for implementation.

## Entry Points (UI / Core)
- UI (Renderer):
  - `RowRenderer.render(index?, isRowHeader?, preventHiddenCls?)` — create a `<tr>` with styles, classes and `aria-rowindex`.
  - `RowRenderer.refresh(index, pRow, hRow?, header?, preventHiddenCls?)` — update row cells via the `cell` service; handle frozen columns and viewport ranges.
  - `RowRenderer.destroy()` / lifecycle hooks — cleanup and respond to `deInitProperties`.
- Core (Model / Utilities):
  - `Row` class — schema for `cells`, `index`, `height`, `hidden`, `customHeight`, `format`, `isReadOnly`, `isFiltered`.
  - `getRow(sheet, rowIndex)`, `setRow(sheet, rowIndex, row)` — accessors and setters for `sheet.rows`.
  - `isHiddenRow(sheet, index)`, `isFilterHidden(sheet, index)` — boolean checks.
  - `getRowHeight(sheet, rowIndex, checkDPR?, addHidden?)`, `setRowHeight(sheet, rowIndex, height)`, `getRowsHeight(sheet, startRow, endRow, checkDPR?, addHidden?)` — height calculus and range sums.

## Core Logic Flow (ASCII)
User action or viewport/resizing
         ↓
Model update (`setRow`, `setRowHeight`) or viewport change
         ↓
Sheet data updated (`sheet.rows[...]`) + optional undo/redo record
         ↓
Renderer invoked (`RowRenderer.refresh` / `render`) for affected rows
         ↓
Row height computed via `getRowHeight` (DPR adjustment if requested)
         ↓
DOM `<tr>` created/updated with `style.height` / `lineHeight`, classes applied; cells rendered via `cellRenderer.render`
         ↓
Accessibility attributes and hidden/filtered classes applied

## Operations Handled (functions & notes)
- `Row` model: holds per-row metadata used across layers.
- `getRow(sheet, rowIndex)`: returns `sheet.rows[rowIndex]`.
- `setRow(sheet, rowIndex, row)`: ensures `sheet.rows[rowIndex]` exists and copies properties.
- `isHiddenRow` / `isFilterHidden`: read flags for hidden/filtered state.
- `getRowHeight(sheet, rowIndex, checkDPR?, addHidden?)`:
  - Returns explicit row height or falls back to `sheet.standardHeight` or `20`.
  - Hidden rows yield `0` height unless `addHidden` is `true`.
  - When `checkDPR` is `true`, adjusts fractional pixels to align with `window.devicePixelRatio`.
- `setRowHeight(sheet, rowIndex, height)`: writes `height`, creating row entry if needed.
- `getRowsHeight(...)`: sums heights across a range, swapping start/end when necessary.
- `RowRenderer.render(...)`:
  - Produces `e-header-row` for header creation; otherwise `e-row`.
  - Computes `rowHeight` and `actualRowHgt`, sets inline `style.height` and `lineHeight`.
  - Adds `aria-rowindex`.
  - For row headers: applies `e-reach-fntsize`, `e-hide-start`, `e-hide-end` for hidden-range indicators.
  - Calls `getBorderWidth()` for DPR-aware border offsets.
- `RowRenderer.refresh(...)`:
  - Renders cells for frozen and scrollable regions.
  - Uses helpers (`getCell`, `getCellAddress`, `getCellIndexes`, `skipHiddenIdx`, `isImported`, `isHiddenCol`) to decide which cells to render.
  - Calls `cellRenderer.render` with `CellRenderArgs` (`isHeightCheckNeeded`, `skipFormatCheck`, `checkCF`, etc.).
- `getBorderWidth()`: computes fractional border width for crisp layout on high-DPR displays.

## Validation & Safety
- Defensive creation: `setRow` and `setRowHeight` create missing `sheet.rows` entries to avoid undefined references.
- Hidden row handling: `getRowHeight` returns `0` when `hidden` and `addHidden` is `false` to prevent layout expansion.
- DPR correction: fractional pixel adjustments when `checkDPR` are used to avoid blurry borders/lines.
- Skip hidden columns: renderer checks `isHiddenCol` to avoid rendering off-screen/hidden cells.
- Viewport & frozen support: `refresh` uses viewport indices and frozen counts to render split regions correctly.
- Minimal mutation: `setRow` performs a shallow copy of provided properties, avoiding unexpected deep merges.

## Desired Outputs
- User-Facing:
  - Row sizing updates when user resizes or operations change the model.
  - Hidden rows collapse visually (height=0) and show row-header indicators for hidden ranges.
  - Row headers adjust for small heights (`e-reach-fntsize`) and remain accessible (`aria-rowindex`).
  - Correct rendering across frozen panes and scrollable areas.
- System-Level:
  - Model storage: `sheet.rows[index]` holds `RowModel` with `cells`, `height`, `hidden`, `isReadOnly`, `isFiltered`.
  - DOM classes: `e-header-row`, `e-row`, `e-reach-fntsize`, `e-hide-start`, `e-hide-end`.
  - Attributes/styles: each rendered `<tr>` has `aria-rowindex`, inline `style.height` and `lineHeight`.
  - Services: renderer obtains `cell` service via service locator and delegates per-cell rendering to it.
  - Events/lifecycle: renderer listens to `deInitProperties` to reset cached values; row model changes should trigger targeted refreshes.
  - Undo/Redo (recommended): mutations to row properties (height, hidden, setRow) should produce undo/redo records for revertibility.
  - Performance: use `getRowsHeight` and DPR-aware computations for layout, virtualization and to minimize reflow.
