Skip to main content

src/spruce@block.erl

-module(spruce@block).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/spruce/block.gleam").
-export([new/0, foreground/2, background/2, padding/5, margin/5, width/2, height/2, align/3, border/2, border_colors/5, border_sides/5, render/3]).
-export_type([block/0, sides/0]).

-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.

?MODULEDOC(" Block styling for multiline terminal text.\n").

-opaque block() :: {block,
        gleam@option:option(spruce@style:color()),
        gleam@option:option(spruce@style:color()),
        integer(),
        integer(),
        integer(),
        integer(),
        integer(),
        integer(),
        integer(),
        integer(),
        gleam@option:option(integer()),
        gleam@option:option(integer()),
        spruce@layout:pos(),
        spruce@layout:pos(),
        gleam@option:option(spruce@box:border()),
        spruce@style:color(),
        spruce@style:color(),
        spruce@style:color(),
        spruce@style:color(),
        boolean(),
        boolean(),
        boolean(),
        boolean()}.

-type sides() :: {sides, boolean(), boolean(), boolean(), boolean()}.

-file("src/spruce/block.gleam", 49).
?DOC(" Build block options with no styling, padding, margin, or border.\n").
-spec new() -> block().
new() ->
    {block,
        none,
        none,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        none,
        none,
        start,
        start,
        none,
        cyan,
        cyan,
        cyan,
        cyan,
        true,
        true,
        true,
        true}.

-file("src/spruce/block.gleam", 78).
?DOC(" Set the foreground color applied to content lines.\n").
-spec foreground(block(), spruce@style:color()) -> block().
foreground(Block, Color) ->
    {block,
        {some, Color},
        erlang:element(3, Block),
        erlang:element(4, Block),
        erlang:element(5, Block),
        erlang:element(6, Block),
        erlang:element(7, Block),
        erlang:element(8, Block),
        erlang:element(9, Block),
        erlang:element(10, Block),
        erlang:element(11, Block),
        erlang:element(12, Block),
        erlang:element(13, Block),
        erlang:element(14, Block),
        erlang:element(15, Block),
        erlang:element(16, Block),
        erlang:element(17, Block),
        erlang:element(18, Block),
        erlang:element(19, Block),
        erlang:element(20, Block),
        erlang:element(21, Block),
        erlang:element(22, Block),
        erlang:element(23, Block),
        erlang:element(24, Block)}.

-file("src/spruce/block.gleam", 83).
?DOC(" Set the background color applied to content lines.\n").
-spec background(block(), spruce@style:color()) -> block().
background(Block, Color) ->
    {block,
        erlang:element(2, Block),
        {some, Color},
        erlang:element(4, Block),
        erlang:element(5, Block),
        erlang:element(6, Block),
        erlang:element(7, Block),
        erlang:element(8, Block),
        erlang:element(9, Block),
        erlang:element(10, Block),
        erlang:element(11, Block),
        erlang:element(12, Block),
        erlang:element(13, Block),
        erlang:element(14, Block),
        erlang:element(15, Block),
        erlang:element(16, Block),
        erlang:element(17, Block),
        erlang:element(18, Block),
        erlang:element(19, Block),
        erlang:element(20, Block),
        erlang:element(21, Block),
        erlang:element(22, Block),
        erlang:element(23, Block),
        erlang:element(24, Block)}.

-file("src/spruce/block.gleam", 568).
-spec non_negative(integer()) -> integer().
non_negative(Value) ->
    gleam@int:max(0, Value).

-file("src/spruce/block.gleam", 88).
?DOC(" Set inner padding as top, right, bottom, left cell counts.\n").
-spec padding(block(), integer(), integer(), integer(), integer()) -> block().
padding(Block, Top, Right, Bottom, Left) ->
    {block,
        erlang:element(2, Block),
        erlang:element(3, Block),
        non_negative(Top),
        non_negative(Right),
        non_negative(Bottom),
        non_negative(Left),
        erlang:element(8, Block),
        erlang:element(9, Block),
        erlang:element(10, Block),
        erlang:element(11, Block),
        erlang:element(12, Block),
        erlang:element(13, Block),
        erlang:element(14, Block),
        erlang:element(15, Block),
        erlang:element(16, Block),
        erlang:element(17, Block),
        erlang:element(18, Block),
        erlang:element(19, Block),
        erlang:element(20, Block),
        erlang:element(21, Block),
        erlang:element(22, Block),
        erlang:element(23, Block),
        erlang:element(24, Block)}.

-file("src/spruce/block.gleam", 105).
?DOC(" Set outer margin as top, right, bottom, left cell counts.\n").
-spec margin(block(), integer(), integer(), integer(), integer()) -> block().
margin(Block, Top, Right, Bottom, Left) ->
    {block,
        erlang:element(2, Block),
        erlang:element(3, Block),
        erlang:element(4, Block),
        erlang:element(5, Block),
        erlang:element(6, Block),
        erlang:element(7, Block),
        non_negative(Top),
        non_negative(Right),
        non_negative(Bottom),
        non_negative(Left),
        erlang:element(12, Block),
        erlang:element(13, Block),
        erlang:element(14, Block),
        erlang:element(15, Block),
        erlang:element(16, Block),
        erlang:element(17, Block),
        erlang:element(18, Block),
        erlang:element(19, Block),
        erlang:element(20, Block),
        erlang:element(21, Block),
        erlang:element(22, Block),
        erlang:element(23, Block),
        erlang:element(24, Block)}.

-file("src/spruce/block.gleam", 122).
?DOC(" Constrain content to a visual width and wrap with `spruce/align.wrap`.\n").
-spec width(block(), integer()) -> block().
width(Block, Width) ->
    {block,
        erlang:element(2, Block),
        erlang:element(3, Block),
        erlang:element(4, Block),
        erlang:element(5, Block),
        erlang:element(6, Block),
        erlang:element(7, Block),
        erlang:element(8, Block),
        erlang:element(9, Block),
        erlang:element(10, Block),
        erlang:element(11, Block),
        {some, non_negative(Width)},
        erlang:element(13, Block),
        erlang:element(14, Block),
        erlang:element(15, Block),
        erlang:element(16, Block),
        erlang:element(17, Block),
        erlang:element(18, Block),
        erlang:element(19, Block),
        erlang:element(20, Block),
        erlang:element(21, Block),
        erlang:element(22, Block),
        erlang:element(23, Block),
        erlang:element(24, Block)}.

-file("src/spruce/block.gleam", 129).
?DOC(
    " Constrain content to a line count.\n"
    " Short content is padded with blank lines using vertical alignment; tall\n"
    " content is truncated from the bottom after wrapping.\n"
).
-spec height(block(), integer()) -> block().
height(Block, Height) ->
    {block,
        erlang:element(2, Block),
        erlang:element(3, Block),
        erlang:element(4, Block),
        erlang:element(5, Block),
        erlang:element(6, Block),
        erlang:element(7, Block),
        erlang:element(8, Block),
        erlang:element(9, Block),
        erlang:element(10, Block),
        erlang:element(11, Block),
        erlang:element(12, Block),
        {some, non_negative(Height)},
        erlang:element(14, Block),
        erlang:element(15, Block),
        erlang:element(16, Block),
        erlang:element(17, Block),
        erlang:element(18, Block),
        erlang:element(19, Block),
        erlang:element(20, Block),
        erlang:element(21, Block),
        erlang:element(22, Block),
        erlang:element(23, Block),
        erlang:element(24, Block)}.

-file("src/spruce/block.gleam", 134).
?DOC(" Align content horizontally within width and vertically within height.\n").
-spec align(block(), spruce@layout:pos(), spruce@layout:pos()) -> block().
align(Block, Horizontal, Vertical) ->
    {block,
        erlang:element(2, Block),
        erlang:element(3, Block),
        erlang:element(4, Block),
        erlang:element(5, Block),
        erlang:element(6, Block),
        erlang:element(7, Block),
        erlang:element(8, Block),
        erlang:element(9, Block),
        erlang:element(10, Block),
        erlang:element(11, Block),
        erlang:element(12, Block),
        erlang:element(13, Block),
        Horizontal,
        Vertical,
        erlang:element(16, Block),
        erlang:element(17, Block),
        erlang:element(18, Block),
        erlang:element(19, Block),
        erlang:element(20, Block),
        erlang:element(21, Block),
        erlang:element(22, Block),
        erlang:element(23, Block),
        erlang:element(24, Block)}.

-file("src/spruce/block.gleam", 143).
?DOC(" Draw a border around the padded block.\n").
-spec border(block(), spruce@box:border()) -> block().
border(Block, Border) ->
    {block,
        erlang:element(2, Block),
        erlang:element(3, Block),
        erlang:element(4, Block),
        erlang:element(5, Block),
        erlang:element(6, Block),
        erlang:element(7, Block),
        erlang:element(8, Block),
        erlang:element(9, Block),
        erlang:element(10, Block),
        erlang:element(11, Block),
        erlang:element(12, Block),
        erlang:element(13, Block),
        erlang:element(14, Block),
        erlang:element(15, Block),
        {some, Border},
        erlang:element(17, Block),
        erlang:element(18, Block),
        erlang:element(19, Block),
        erlang:element(20, Block),
        erlang:element(21, Block),
        erlang:element(22, Block),
        erlang:element(23, Block),
        erlang:element(24, Block)}.

-file("src/spruce/block.gleam", 148).
?DOC(" Set top, right, bottom, and left border colors independently.\n").
-spec border_colors(
    block(),
    spruce@style:color(),
    spruce@style:color(),
    spruce@style:color(),
    spruce@style:color()
) -> block().
border_colors(Block, Top, Right, Bottom, Left) ->
    {block,
        erlang:element(2, Block),
        erlang:element(3, Block),
        erlang:element(4, Block),
        erlang:element(5, Block),
        erlang:element(6, Block),
        erlang:element(7, Block),
        erlang:element(8, Block),
        erlang:element(9, Block),
        erlang:element(10, Block),
        erlang:element(11, Block),
        erlang:element(12, Block),
        erlang:element(13, Block),
        erlang:element(14, Block),
        erlang:element(15, Block),
        erlang:element(16, Block),
        Top,
        Right,
        Bottom,
        Left,
        erlang:element(21, Block),
        erlang:element(22, Block),
        erlang:element(23, Block),
        erlang:element(24, Block)}.

-file("src/spruce/block.gleam", 165).
?DOC(" Set top, right, bottom, and left border visibility independently.\n").
-spec border_sides(block(), boolean(), boolean(), boolean(), boolean()) -> block().
border_sides(Block, Top, Right, Bottom, Left) ->
    {block,
        erlang:element(2, Block),
        erlang:element(3, Block),
        erlang:element(4, Block),
        erlang:element(5, Block),
        erlang:element(6, Block),
        erlang:element(7, Block),
        erlang:element(8, Block),
        erlang:element(9, Block),
        erlang:element(10, Block),
        erlang:element(11, Block),
        erlang:element(12, Block),
        erlang:element(13, Block),
        erlang:element(14, Block),
        erlang:element(15, Block),
        erlang:element(16, Block),
        erlang:element(17, Block),
        erlang:element(18, Block),
        erlang:element(19, Block),
        erlang:element(20, Block),
        Top,
        Right,
        Bottom,
        Left}.

-file("src/spruce/block.gleam", 557).
-spec repeat_line_loop(binary(), integer(), list(binary())) -> list(binary()).
repeat_line_loop(Line, Count, Acc) ->
    case Count of
        0 ->
            Acc;

        _ ->
            repeat_line_loop(Line, Count - 1, [Line | Acc])
    end.

-file("src/spruce/block.gleam", 553).
-spec repeat_line(binary(), integer()) -> list(binary()).
repeat_line(Line, Count) ->
    repeat_line_loop(Line, non_negative(Count), []).

-file("src/spruce/block.gleam", 530).
-spec find_max_width(list(binary()), integer()) -> integer().
find_max_width(Lines, Min_width) ->
    _pipe = Lines,
    _pipe@1 = gleam@list:map(_pipe, fun spruce@align:visual_length/1),
    gleam@list:fold(_pipe@1, Min_width, fun gleam@int:max/2).

-file("src/spruce/block.gleam", 498).
-spec apply_margin(
    list(binary()),
    binary(),
    integer(),
    integer(),
    integer(),
    integer()
) -> list(binary()).
apply_margin(Lines, Prefix, Top, Right, Bottom, Left) ->
    Line_width = find_max_width(Lines, 0),
    Blank = gleam@string:repeat(<<" "/utf8>>, (Left + Line_width) + Right),
    Top_rows = repeat_line(<<Prefix/binary, Blank/binary>>, Top),
    Body = gleam@list:map(
        Lines,
        fun(Line) ->
            <<<<<<Prefix/binary,
                        (gleam@string:repeat(<<" "/utf8>>, Left))/binary>>/binary,
                    (spruce@align:pad_right(Line, Line_width))/binary>>/binary,
                (gleam@string:repeat(<<" "/utf8>>, Right))/binary>>
        end
    ),
    _pipe = Top_rows,
    _pipe@1 = lists:append(_pipe, Body),
    lists:append(_pipe@1, repeat_line(<<Prefix/binary, Blank/binary>>, Bottom)).

-file("src/spruce/block.gleam", 414).
-spec corner(boolean(), boolean(), binary()) -> binary().
corner(Horizontal, Vertical, Char) ->
    gleam@bool:guard(
        Horizontal andalso (Vertical =:= false),
        <<""/utf8>>,
        fun() -> Char end
    ).

-file("src/spruce/block.gleam", 383).
-spec render_bottom(
    integer(),
    sides(),
    spruce@box:border_chars(),
    fun((binary()) -> binary())
) -> binary().
render_bottom(Inner_width, Sides, Chars, Paint_bottom) ->
    <<<<(Paint_bottom(
                corner(
                    erlang:element(4, Sides),
                    erlang:element(5, Sides),
                    erlang:element(8, Chars)
                )
            ))/binary,
            (Paint_bottom(
                gleam@string:repeat(erlang:element(7, Chars), Inner_width)
            ))/binary>>/binary,
        (Paint_bottom(
            corner(
                erlang:element(4, Sides),
                erlang:element(3, Sides),
                erlang:element(6, Chars)
            )
        ))/binary>>.

-file("src/spruce/block.gleam", 360).
-spec add_bottom(
    list(binary()),
    sides(),
    integer(),
    spruce@box:border_chars(),
    fun((binary()) -> binary())
) -> list(binary()).
add_bottom(Lines, Sides, Inner_width, Chars, Paint_bottom) ->
    gleam@bool:guard(
        erlang:element(4, Sides) =:= false,
        Lines,
        fun() ->
            lists:append(
                Lines,
                [render_bottom(Inner_width, Sides, Chars, Paint_bottom)]
            )
        end
    ).

-file("src/spruce/block.gleam", 372).
-spec render_top(
    integer(),
    sides(),
    spruce@box:border_chars(),
    fun((binary()) -> binary())
) -> binary().
render_top(Inner_width, Sides, Chars, Paint_top) ->
    <<<<(Paint_top(
                corner(
                    erlang:element(2, Sides),
                    erlang:element(5, Sides),
                    erlang:element(2, Chars)
                )
            ))/binary,
            (Paint_top(
                gleam@string:repeat(erlang:element(3, Chars), Inner_width)
            ))/binary>>/binary,
        (Paint_top(
            corner(
                erlang:element(2, Sides),
                erlang:element(3, Sides),
                erlang:element(4, Chars)
            )
        ))/binary>>.

-file("src/spruce/block.gleam", 348).
-spec add_top(
    list(binary()),
    sides(),
    integer(),
    spruce@box:border_chars(),
    fun((binary()) -> binary())
) -> list(binary()).
add_top(Lines, Sides, Inner_width, Chars, Paint_top) ->
    gleam@bool:guard(
        erlang:element(2, Sides) =:= false,
        Lines,
        fun() -> [render_top(Inner_width, Sides, Chars, Paint_top) | Lines] end
    ).

-file("src/spruce/block.gleam", 404).
-spec side_right(
    sides(),
    spruce@box:border_chars(),
    fun((binary()) -> binary())
) -> binary().
side_right(Sides, Chars, Paint_right) ->
    gleam@bool:guard(
        erlang:element(3, Sides) =:= false,
        <<""/utf8>>,
        fun() -> Paint_right(erlang:element(5, Chars)) end
    ).

-file("src/spruce/block.gleam", 394).
-spec side_left(sides(), spruce@box:border_chars(), fun((binary()) -> binary())) -> binary().
side_left(Sides, Chars, Paint_left) ->
    gleam@bool:guard(
        erlang:element(5, Sides) =:= false,
        <<""/utf8>>,
        fun() -> Paint_left(erlang:element(9, Chars)) end
    ).

-file("src/spruce/block.gleam", 334).
-spec add_vertical_sides(
    list(binary()),
    sides(),
    spruce@box:border_chars(),
    fun((binary()) -> binary()),
    fun((binary()) -> binary())
) -> list(binary()).
add_vertical_sides(Lines, Sides, Chars, Paint_left, Paint_right) ->
    gleam@list:map(
        Lines,
        fun(Line) ->
            <<<<(side_left(Sides, Chars, Paint_left))/binary, Line/binary>>/binary,
                (side_right(Sides, Chars, Paint_right))/binary>>
        end
    ).

-file("src/spruce/block.gleam", 420).
-spec border_painter(spruce:spruce(), spruce@style:color()) -> fun((binary()) -> binary()).
border_painter(Sp, Color) ->
    Border_style = begin
        _pipe = spruce@style:new(),
        spruce@style:fg(_pipe, Color)
    end,
    fun(Text) -> spruce@style:render(Sp, Border_style, Text) end.

-file("src/spruce/block.gleam", 426).
-spec border_chars(spruce@box:border()) -> spruce@box:border_chars().
border_chars(Border) ->
    case Border of
        normal ->
            {border_chars,
                <<"┌"/utf8>>,
                <<"─"/utf8>>,
                <<"┐"/utf8>>,
                <<"│"/utf8>>,
                <<"┘"/utf8>>,
                <<"─"/utf8>>,
                <<"└"/utf8>>,
                <<"│"/utf8>>};

        rounded ->
            {border_chars,
                <<"╭"/utf8>>,
                <<"─"/utf8>>,
                <<"╮"/utf8>>,
                <<"│"/utf8>>,
                <<"╯"/utf8>>,
                <<"─"/utf8>>,
                <<"╰"/utf8>>,
                <<"│"/utf8>>};

        thick ->
            {border_chars,
                <<"┏"/utf8>>,
                <<"━"/utf8>>,
                <<"┓"/utf8>>,
                <<"┃"/utf8>>,
                <<"┛"/utf8>>,
                <<"━"/utf8>>,
                <<"┗"/utf8>>,
                <<"┃"/utf8>>};

        double ->
            {border_chars,
                <<"╔"/utf8>>,
                <<"═"/utf8>>,
                <<"╗"/utf8>>,
                <<"║"/utf8>>,
                <<"╝"/utf8>>,
                <<"═"/utf8>>,
                <<"╚"/utf8>>,
                <<"║"/utf8>>};

        block ->
            {border_chars,
                <<"█"/utf8>>,
                <<"█"/utf8>>,
                <<"█"/utf8>>,
                <<"█"/utf8>>,
                <<"█"/utf8>>,
                <<"█"/utf8>>,
                <<"█"/utf8>>,
                <<"█"/utf8>>};

        hidden ->
            {border_chars,
                <<""/utf8>>,
                <<""/utf8>>,
                <<""/utf8>>,
                <<""/utf8>>,
                <<""/utf8>>,
                <<""/utf8>>,
                <<""/utf8>>,
                <<""/utf8>>};

        {custom, Chars} ->
            Chars
    end.

-file("src/spruce/block.gleam", 305).
-spec apply_border(spruce:spruce(), list(binary()), block()) -> list(binary()).
apply_border(Sp, Lines, Block) ->
    case erlang:element(16, Block) of
        none ->
            Lines;

        {some, hidden} ->
            Lines;

        {some, Border} ->
            Sides = {sides,
                erlang:element(21, Block),
                erlang:element(22, Block),
                erlang:element(23, Block),
                erlang:element(24, Block)},
            Chars = border_chars(Border),
            Inner_width = find_max_width(Lines, 0),
            Rows = gleam@list:map(
                Lines,
                fun(Line) -> spruce@align:pad_right(Line, Inner_width) end
            ),
            Paint_top = border_painter(Sp, erlang:element(17, Block)),
            Paint_right = border_painter(Sp, erlang:element(18, Block)),
            Paint_bottom = border_painter(Sp, erlang:element(19, Block)),
            Paint_left = border_painter(Sp, erlang:element(20, Block)),
            _pipe = Rows,
            _pipe@1 = add_vertical_sides(
                _pipe,
                Sides,
                Chars,
                Paint_left,
                Paint_right
            ),
            _pipe@2 = add_top(_pipe@1, Sides, Inner_width, Chars, Paint_top),
            add_bottom(_pipe@2, Sides, Inner_width, Chars, Paint_bottom)
    end.

-file("src/spruce/block.gleam", 222).
-spec background_style(block()) -> spruce@style:style().
background_style(Block) ->
    case erlang:element(3, Block) of
        {some, Color} ->
            spruce@style:bg(spruce@style:new(), Color);

        none ->
            spruce@style:new()
    end.

-file("src/spruce/block.gleam", 284).
-spec apply_padding(spruce:spruce(), list(binary()), block()) -> list(binary()).
apply_padding(Sp, Lines, Block) ->
    Content_width = find_max_width(Lines, 0),
    Padded_width = (Content_width + erlang:element(7, Block)) + erlang:element(
        5,
        Block
    ),
    Blank = gleam@string:repeat(<<" "/utf8>>, Padded_width),
    Body = gleam@list:map(
        Lines,
        fun(Line) ->
            <<<<(gleam@string:repeat(<<" "/utf8>>, erlang:element(7, Block)))/binary,
                    (spruce@align:pad_right(Line, Content_width))/binary>>/binary,
                (gleam@string:repeat(<<" "/utf8>>, erlang:element(5, Block)))/binary>>
        end
    ),
    _pipe = repeat_line(Blank, erlang:element(4, Block)),
    _pipe@1 = lists:append(_pipe, Body),
    _pipe@2 = lists:append(
        _pipe@1,
        repeat_line(Blank, erlang:element(6, Block))
    ),
    gleam@list:map(
        _pipe@2,
        fun(Line@1) ->
            spruce@style:render(Sp, background_style(Block), Line@1)
        end
    ).

-file("src/spruce/block.gleam", 215).
-spec foreground_style(block()) -> spruce@style:style().
foreground_style(Block) ->
    case erlang:element(2, Block) of
        {some, Color} ->
            spruce@style:fg(spruce@style:new(), Color);

        none ->
            spruce@style:new()
    end.

-file("src/spruce/block.gleam", 273).
-spec padding_counts(integer(), spruce@layout:pos()) -> {integer(), integer()}.
padding_counts(Extra, Pos) ->
    case Pos of
        start ->
            {0, Extra};

        center ->
            Before = Extra div 2,
            {Before, Extra - Before};

        'end' ->
            {Extra, 0}
    end.

-file("src/spruce/block.gleam", 259).
-spec pad_height(list(binary()), integer(), integer(), spruce@layout:pos()) -> list(binary()).
pad_height(Lines, Width, Extra, Vertical) ->
    Blank = gleam@string:repeat(<<" "/utf8>>, Width),
    {Before, After} = padding_counts(Extra, Vertical),
    _pipe = repeat_line(Blank, Before),
    _pipe@1 = lists:append(_pipe, Lines),
    lists:append(_pipe@1, repeat_line(Blank, After)).

-file("src/spruce/block.gleam", 541).
-spec take_lines_loop(list(binary()), integer(), list(binary())) -> list(binary()).
take_lines_loop(Lines, Count, Acc) ->
    case {Lines, Count} of
        {_, 0} ->
            Acc;

        {[], _} ->
            Acc;

        {[Line | Rest], Count@1} ->
            take_lines_loop(Rest, Count@1 - 1, [Line | Acc])
    end.

-file("src/spruce/block.gleam", 536).
-spec take_lines(list(binary()), integer()) -> list(binary()).
take_lines(Lines, Count) ->
    _pipe = take_lines_loop(Lines, non_negative(Count), []),
    lists:reverse(_pipe).

-file("src/spruce/block.gleam", 241).
-spec fit_height(list(binary()), integer(), integer(), spruce@layout:pos()) -> list(binary()).
fit_height(Lines, Width, Height, Vertical) ->
    Current = erlang:length(Lines),
    case Height =< 0 of
        true ->
            [];

        false ->
            case Current > Height of
                true ->
                    take_lines(Lines, Height);

                false ->
                    pad_height(Lines, Width, Height - Current, Vertical)
            end
    end.

-file("src/spruce/block.gleam", 229).
-spec apply_height(
    list(binary()),
    integer(),
    gleam@option:option(integer()),
    spruce@layout:pos()
) -> list(binary()).
apply_height(Lines, Width, Height, Vertical) ->
    case Height of
        {some, Height@1} ->
            fit_height(Lines, Width, Height@1, Vertical);

        none ->
            Lines
    end.

-file("src/spruce/block.gleam", 522).
-spec pad_pos(binary(), integer(), spruce@layout:pos()) -> binary().
pad_pos(Text, Width, Pos) ->
    case Pos of
        start ->
            spruce@align:pad_right(Text, Width);

        center ->
            spruce@align:pad_center(Text, Width);

        'end' ->
            spruce@align:pad_left(Text, Width)
    end.

-file("src/spruce/block.gleam", 198).
-spec content_region(spruce:spruce(), binary(), block()) -> list(binary()).
content_region(Sp, Content, Block) ->
    Wrapped = case erlang:element(12, Block) of
        {some, Width} when Width > 0 ->
            spruce@align:wrap(Content, Width);

        _ ->
            Content
    end,
    Raw_lines = gleam@string:split(Wrapped, <<"\n"/utf8>>),
    Region_width = case erlang:element(12, Block) of
        {some, Width@1} when Width@1 > 0 ->
            Width@1;

        _ ->
            find_max_width(Raw_lines, 0)
    end,
    _pipe = Raw_lines,
    _pipe@1 = gleam@list:map(
        _pipe,
        fun(Line) -> pad_pos(Line, Region_width, erlang:element(14, Block)) end
    ),
    _pipe@2 = apply_height(
        _pipe@1,
        Region_width,
        erlang:element(13, Block),
        erlang:element(15, Block)
    ),
    gleam@list:map(
        _pipe@2,
        fun(Line@1) ->
            spruce@style:render(Sp, foreground_style(Block), Line@1)
        end
    ).

-file("src/spruce/block.gleam", 182).
?DOC(" Render `content` as one block using the given options.\n").
-spec render(spruce:spruce(), binary(), block()) -> binary().
render(Sp, Content, Block) ->
    Content_lines = content_region(Sp, Content, Block),
    Padded = apply_padding(Sp, Content_lines, Block),
    Bordered = apply_border(Sp, Padded, Block),
    _pipe = Bordered,
    _pipe@1 = apply_margin(
        _pipe,
        spruce@internal@layout:indent_prefix(Sp),
        erlang:element(8, Block),
        erlang:element(9, Block),
        erlang:element(10, Block),
        erlang:element(11, Block)
    ),
    gleam@string:join(_pipe@1, <<"\n"/utf8>>).