Chandra

 view release on metacpan or  search on metacpan

examples/element_example.pl  view on Meta::CPAN

#!/usr/bin/env perl
#
# Example: Element API - build a UI tree in Perl, render to HTML
#
# Demonstrates Chandra::Element with event handlers that call back to Perl.
#

use strict;
use warnings;
use FindBin;
use lib "$FindBin::Bin/../blib/lib", "$FindBin::Bin/../blib/arch";
use Chandra::App;
use Chandra::Element;

my @items;
my $next_id = 1;

my $app = Chandra::App->new(
    title  => 'Element Example',
    width  => 500,
    height => 450,
    debug  => 1,
);

sub build_ui {
    Chandra::Element->new({
        tag => 'div',
        id  => 'app',
        style => { 'font-family' => '-apple-system, BlinkMacSystemFont, sans-serif', padding => '20px' },
        children => [
            { tag => 'h1', data => 'Shopping List', style => 'color: #333' },
            {
                tag => 'div',
                style => { display => 'flex', gap => '8px', 'margin-bottom' => '16px' },
                children => [
                    {
                        tag         => 'input',
                        type        => 'text',
                        id          => 'new-item',
                        placeholder => 'Add item...',
                        style       => 'flex:1; padding:8px; border:1px solid #ccc; border-radius:4px; font-size:14px',
                    },
                    {
                        tag     => 'button',
                        data    => 'Add',
                        style   => 'padding:8px 20px; background:#4CAF50; color:#fff; border:none; border-radius:4px; cursor:pointer; font-size:14px',
                        onclick => sub {
                            $app->dispatch_eval(
                                "var v=document.getElementById('new-item').value;" .
                                "if(v){window.chandra.invoke('add_item',[v]).then(function(){" .
                                "document.getElementById('new-item').value='';});}"
                            );
                        },
                    },
                ],
            },
            build_list(),
        ],
    });
}

sub build_list {
    return {
        tag => 'ul',
        id  => 'item-list',
        style => 'list-style:none; padding:0',
        children => [
            map {
                my $item = $_;
                {
                    tag   => 'li',
                    id    => "item-$item->{id}",
                    style => 'display:flex; justify-content:space-between; align-items:center; padding:10px; margin:4px 0; background:#f9f9f9; border-radius:4px',
                    children => [
                        { tag => 'span', data => $item->{name}, style => 'font-size:14px' },
                        {
                            tag   => 'button',
                            data  => 'x',
                            style => 'background:#e74c3c; color:#fff; border:none; border-radius:50%; width:24px; height:24px; cursor:pointer; font-size:12px',
                            onclick => sub {
                                $app->dispatch_eval(
                                    "window.chandra.invoke('remove_item',[$item->{id}])"
                                );
                            },
                        },
                    ],
                }
            } @items
        ],
    };
}

$app->bind('add_item', sub {
    my ($name) = @_;
    push @items, { id => $next_id++, name => $name };
    print "[Perl] Added: $name\n";
    re_render();
    return 1;
});

$app->bind('remove_item', sub {
    my ($id) = @_;
    @items = grep { $_->{id} != $id } @items;
    print "[Perl] Removed item $id\n";
    re_render();
    return 1;
});

sub re_render {
    my $list = Chandra::Element->new(build_list());
    $app->update('#item-list', $list);
}

$app->set_content(build_ui());

print "Starting element example...\n";
$app->run;
print "Done.\n";

=head1 NAME

Element Example - Build a dynamic UI tree in Perl using Chandra::Element

=head1 DESCRIPTION

This example demonstrates how to use the C<Chandra::Element> module to construct a dynamic user interface in Perl. It creates a simple shopping list application where users can add and remove items. The UI is built as a tree of elements, and event ha...

=cut



( run in 0.809 second using v1.01-cache-2.11-cpan-140bd7fdf52 )