import React from 'react'; import { useTerminalSize } from '../hooks/useTerminalSize.js'; import { stringWidth } from '../core/stringWidth.js'; import { Ansi, Text } from '../index.js'; import type { Theme } from './theme-types.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)} ); }