Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Changes
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
Revision history for Air::Examples

{{$NEXT}}
- add 29-mailform
- add 30-signup

0.0.25 2026-06-23T17:23:18+01:00
- add Fold to baseexamples
Expand Down
3 changes: 2 additions & 1 deletion META6.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
"Air::Plugin::Hilite",
"Air::Plugin::Asciinema",
"Air::Plugin::Wordcloud",
"Air::Plugin::Rakudoc"
"Air::Plugin::Rakudoc",
"Air::Plugin::MailForm"
],
"description": "hArc stack website examples (HTMX, Air, Red, Cro)",
"license": "Artistic-2.0",
Expand Down
25 changes: 25 additions & 0 deletions bin/29-mailform.raku
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#!/usr/bin/env raku

use Air::Functional :BASE;
use Air::Base;
use Air::Plugin::MailForm;

my $contact = Air::Plugin::ContactForm.empty;

my &index = &page.assuming(
title => 'Contact Us',
nav => nav(
widgets => [lightdark],
),
);

my $site =
site :register[$contact, LightDark.new],
index
main [
h3 'Contact Us';
$contact;
]
;

$site.serve;
60 changes: 60 additions & 0 deletions bin/30-signup.raku
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
#!/usr/bin/env raku

use Air::Functional :BASE;
use Air::Base;
use Air::Form;
use Air::Plugin::MailForm;

class SignupForm is Air::Plugin::MailForm {
has Str $.name is validated(%va<names>) is required;
has Str $.nick;
has Str $.email is validated(%va<email>) is email is required;

method do-form-attrs {
self.form-attrs: {:submit-button-text('Register Interest')}
}

method validate-form {
self.add-validation-error("Nick must be a single word")
if $!nick && $!nick.trim.contains(/ \s /);
}

method mail-message(Str $from, Str $to, Str $subject --> Str) {
qq:to/END/;
From: $from
To: $to
Subject: $subject

Name: { $.name }
Nick: { $.nick || '(not provided)' }
Email: { $.email }
END
}

method form-routes {
self.init;
self.submit: -> SignupForm $form {
self.submit-form($form)
}
}
}

my $signup = SignupForm.empty;

my &index = &page.assuming(
title => 'Sign Up',
nav => nav(
widgets => [lightdark],
),
);

my $site =
site :register[$signup, LightDark.new],
index
main [
h3 'Register Interest';
$signup;
]
;

$site.serve;
Loading