Selkie.git | xt/snapshots/ | 43-border-image-redraw.raku


use lib 'lib';
use Selkie::Test::Snapshot;
use Selkie::Widget::Image;
use Selkie::Widget::Border;
use Selkie::BorderStyle;
use Selkie::Sizing;

# Guards the post-content edge redraw. Border paints its frame, renders
# the content, then repaints the verticals and the bottom edge to cover
# pixel bleed from an image blit. That second pass is a separate branch
# from the first: it has to reach for the same glyph table, and it has
# to put the bottom title back on top of the edge it just redrew.
#
# The interior is masked before printing. Which blitter notcurses picks
# for the image depends on the terminal it detects and the multimedia
# backend it was compiled against, so the cells the image occupies are
# not stable across machines — but the frame around them is, and the
# frame is the whole point of this scenario. Bleed that reached a frame
# cell would still show, because only columns strictly inside the
# verticals are masked.

my $img = Selkie::Widget::Image.new(sizing => Sizing.flex);
$img.set-file('t/fixtures/test-4x4.png');

my $border = Selkie::Widget::Border.new(
    title              => 'Avatar',
    bottom-title       => 'esc close',
    bottom-title-align => TitleRight,
    border-style       => BorderRounded,
    sizing             => Sizing.flex,
);
$border.set-content($img);

my @rows = render-to-string($border, rows => 6, cols => 24).lines;

my $last = @rows.end;
my @masked = @rows.kv.map(-> $i, $line {
    ($i == 0 || $i == $last)
        ?? $line                              # top / bottom edge, verbatim
        !! $line.substr(0, 1)                 # left vertical
           ~ ('.' x (($line.chars - 2) max 0))
           ~ ($line.chars > 1 ?? $line.substr(*-1) !! '')   # right vertical
});

print @masked.join("\n") ~ "\n";