import React from 'react' import { useTerminalSize } from '../../hooks/useTerminalSize.js' import { stringWidth } from '../../ink/stringWidth.js' import { Ansi, Text } from '../../ink.js' import type { Theme } from '../../utils/theme.js' type DividerProps = { /** * Width of the divider in characters. * Defaults to terminal width. */ width?: number /** * Theme color for the divider. * If not provided, dimColor is used. */ color?: keyof Theme /** * Character to use for the divider line. * @default '─' */ char?: string /** * Padding to subtract from the width (e.g., for indentation). * @default 0 */ padding?: number /** * Title shown in the middle of the divider. * May contain ANSI codes (e.g., chalk-styled text). * * @example * // ─────────── Title ─────────── * */ title?: string } /** * A horizontal divider line. * * @example * // Full-width dimmed divider * * * @example * // Colored divider * * * @example * // Fixed width * * * @example * // Full width minus padding (for indented content) * * * @example * // With centered title * */ export function Divider({ width, color, char = '─', padding = 0, title, }: DividerProps): React.ReactNode { const { columns: terminalWidth } = useTerminalSize() const effectiveWidth = Math.max(0, (width ?? terminalWidth) - padding) if (title) { const titleWidth = stringWidth(title) + 2 // +2 for spaces around title const sideWidth = Math.max(0, effectiveWidth - titleWidth) const leftWidth = Math.floor(sideWidth / 2) const rightWidth = sideWidth - leftWidth return ( {char.repeat(leftWidth)}{' '} {title} {' '} {char.repeat(rightWidth)} ) } return ( {char.repeat(effectiveWidth)} ) }