Chandra

 view release on metacpan or  search on metacpan

examples/form_example.pl  view on Meta::CPAN

$form->submit('Save Settings');

# ---- Change handlers ----

$form->on_change(sub {
    my ($field, $value) = @_;
    print "[Perl] Changed: $field => $value\n";
});

$form->on_change('theme', sub {
    my ($value) = @_;
    print "[Perl] Theme switched to: $value\n";
    my $bg = $value eq 'dark' ? '#1e1e1e' : '#ffffff';
    my $fg = $value eq 'dark' ? '#d4d4d4' : '#333333';
    $app->dispatch_eval(qq{
        document.body.style.background = '$bg';
        document.body.style.color      = '$fg';
    });
});

# ---- CSS ----

my $css = <<'CSS';
<style>
  * { box-sizing: border-box; }
  body {
    font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
    margin: 0; padding: 24px;
    background: #1e1e1e; color: #d4d4d4;
    transition: background 0.3s, color 0.3s;
  }
  h1 { font-size: 20px; margin: 0 0 16px; }
  .chandra-form { max-width: 460px; }
  .chandra-field { margin-bottom: 14px; }
  .chandra-label {
    display: block; margin-bottom: 4px;
    font-size: 13px; font-weight: 600;
  }
  input[type="text"], input[type="email"], input[type="password"],
  input[type="number"], select, textarea {
    width: 100%; padding: 8px 10px;
    font-size: 14px; border: 1px solid #555;
    border-radius: 4px; background: #2d2d2d; color: #d4d4d4;
  }
  input[type="range"] { width: 100%; }
  .chandra-field-checkbox, .chandra-radio-option {
    display: flex; align-items: center; gap: 8px;
    font-size: 14px;
  }
  .chandra-radio-option { margin: 4px 0; }
  fieldset.chandra-group {
    border: 1px solid #444; border-radius: 6px;
    padding: 12px 14px; margin: 16px 0;
  }
  fieldset.chandra-group legend {
    font-size: 14px; font-weight: 600; padding: 0 6px;
  }
  .chandra-submit {
    padding: 10px 28px; font-size: 14px; font-weight: 600;
    background: #0078d4; color: #fff; border: none;
    border-radius: 4px; cursor: pointer; margin-top: 8px;
  }
  .chandra-submit:hover { background: #106ebe; }
  .chandra-error {
    display: block; font-size: 12px; color: #f44;
    min-height: 16px; margin-top: 2px;
  }
  #result {
    display: none; margin-top: 12px; padding: 10px;
    background: #1b5e20; border-radius: 4px;
    font-size: 14px; text-align: center;
  }
</style>
CSS

# ---- Render and launch ----

my $html = $css
    . "<h1>Settings</h1>"
    . $form->render
    . '<div id="result"></div>';

$app->set_content($html);

# Attach form to app - binds bridge events and injects two-way binding JS
$form->attach($app);

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



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