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)}
);
}