diff --git a/Changes b/Changes index 9383d42..2c9bb99 100644 --- a/Changes +++ b/Changes @@ -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 diff --git a/META6.json b/META6.json index 456be76..6dc0dfa 100644 --- a/META6.json +++ b/META6.json @@ -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", diff --git a/bin/29-mailform.raku b/bin/29-mailform.raku new file mode 100755 index 0000000..5b43b54 --- /dev/null +++ b/bin/29-mailform.raku @@ -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; diff --git a/bin/30-signup.raku b/bin/30-signup.raku new file mode 100755 index 0000000..c9de1c4 --- /dev/null +++ b/bin/30-signup.raku @@ -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) is required; + has Str $.nick; + has Str $.email is validated(%va) 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;