Example — Validated form
A contact form with live validation and submit UX.
package app.brew
import org.konaframework.brew.Componentimport org.konaframework.brew.Validate
class ContactForm : Component() { @Validate("required", "email") var email = ""
@Validate("required", "min:10") var message = ""
var sent = false
fun save() { validate() // persist… sent = true reset("email", "message") }
override fun template() = """ <form wire:submit="save"> @if(sent) <p role="status">Thanks — we got your message.</p> @endif
<label> Email <input type="email" wire:model.blur="email" /> </label> @if(errors['email']) <em>{{ errors['email'][0] }}</em> @endif
<label> Message <textarea wire:model="message"></textarea> </label> @if(errors['message']) <em>{{ errors['message'][0] }}</em> @endif
<button type="submit"> <span wire:loading.remove wire:target="save">Send</span> <span wire:loading wire:target="save">Sending…</span> </button> <span wire:dirty>Unsaved changes</span> </form> """.trimIndent()}package app.brew;
import org.konaframework.brew.Component;import org.konaframework.brew.Validate;import java.util.List;import java.util.Map;
public class ContactForm extends Component { @Validate({"required", "email"}) public String email = "";
@Validate({"required", "min:10"}) public String message = "";
public boolean sent = false;
@Override public Map<String, List<String>> rules() { return Map.of( "email", List.of("required", "email"), "message", List.of("required", "min:10") ); }
public void save() { validate(); sent = true; reset("email", "message"); }
@Override public String template() { return """ <form wire:submit="save"> <input type="email" wire:model.blur="email" /> <textarea wire:model="message"></textarea> <button type="submit">Send</button> </form> """; }}Test errors
Section titled “Test errors”Brew.test(ContactForm::class.java) .set("email", "not-an-email") .call("save") .assertHasErrors("email")See Forms & validation for modifiers, form objects, and $wire.$errors.