aether-wisp 0.4.21

A terminal UI for AI coding agents via the Agent Client Protocol (ACP)
Documentation
use tui::{BorderedTextField, Cursor, Frame, ViewContext, display_width_text, truncate_text};

const INPUT_BOX_MAX_WIDTH: usize = 56;
pub(crate) const INPUT_BOX_INDENT: u16 = 2;

pub(crate) fn input_box_width(context: &ViewContext) -> usize {
    (context.size.width as usize).saturating_sub(usize::from(INPUT_BOX_INDENT)).min(INPUT_BOX_MAX_WIDTH)
}

pub(crate) fn input_box_frame(label: &str, value: &str, placeholder: &str, context: &ViewContext) -> Frame {
    let width = input_box_width(context);
    let input_width = width.saturating_sub(4);
    let visible_value = truncate_text(value, input_width);

    let mut field = BorderedTextField::new(label, value.to_string()).placeholder(placeholder);
    field.set_width(width);

    Frame::new(field.render_field(context, false))
        .with_cursor(Cursor::visible(1, 2 + display_width_text(&visible_value)))
        .indent(INPUT_BOX_INDENT)
}