terminalWidth = \max(1, $terminalWidth); } public function getTerminalWidth(): int { return $this->terminalWidth; } /** * Normalize an absolute terminal column (1-indexed) into visible column. */ public function normalizeColumn(int $absoluteColumn): int { $offset = \max(0, $absoluteColumn - 1); return ($offset % $this->terminalWidth) + 1; } /** * Get wrapped row offset for an absolute terminal column (1-indexed). */ public function rowOffsetForAbsoluteColumn(int $absoluteColumn): int { return \intdiv(\max(0, $absoluteColumn - 1), $this->terminalWidth); } /** * Count wrapped rows occupied by text with this display width. * * Zero-width text still occupies one row. */ public function rowCountForDisplayWidth(int $displayWidth): int { if ($displayWidth <= 0) { return 1; } return \intdiv($displayWidth - 1, $this->terminalWidth) + 1; } }