Formulário: do cadastro simples à venda com itens.
A tela abaixo é o Cadastro de venda do app de exemplo, publicado no Teste Online. É o mesmo cadastro que alimenta a listagem e o PDF da página de Listagem. Tem cliente escolhido do banco, data, total calculado e os itens da venda.
Um cadastro de venda com os itens na mesma tela
O formulário abre num painel lateral, dividido em seções e em duas colunas. O cliente vem de uma lista do banco e a data tem máscara. O Valor Total não se digita: é a soma dos itens da venda. Tudo isso fica declarado assim:
<mad-form submit="onSave"><mad-form-section title="Cadastro de venda" icon="file-text"><mad-form-grid :cols="2"><mad-dbcombo-field name="cliente_id" label="Cliente" model="Pessoa"display="{nome}" order-by="nome" :required="true" /><mad-date-field name="data_venda" label="Data da Venda" :required="true" /><mad-money-field name="valor_total" label="Valor Total" prefix="R$" :readonly="true" /></mad-form-grid></mad-form-section>...</mad-form> 
Painel, janela, página inteira ou embaixo da linha
O mesmo formulário pode abrir de quatro jeitos. No controller, uma linha escolhe entre painel lateral (DRAWER, como acima), janela central (MODAL) ou página inteira (INTERNAL). Na listagem, o atributo row no botão de editar abre o formulário logo embaixo da linha. Você edita rápido e não perde a tabela de vista.
{{-- no controller do form: como ele abre --}}protected static string $wrapper = self::DRAWER; {{-- painel lateral --}}protected static string $wrapper = self::MODAL; {{-- diálogo central --}}protected static string $wrapper = self::INTERNAL; {{-- página inteira --}}{{-- na listagem: o MESMO form, anexado embaixo da linha --}}<mad-nav icon="pencil" label="Editar"navigate="VendaForm::onEdit({id})" row /> 

Os itens da venda são gravados junto com ela
O bloco de itens (<mad-detail-form>) deixa você adicionar, editar e remover os itens na mesma tela. Ao salvar, o formulário acerta os itens sozinho: inclui os novos, atualiza os editados e apaga os removidos. Para campos calculados, como o nome do produto e o total de cada item, o controller tem dois pontos de entrada (onLoadDetail e onSaveDetail).
<mad-detail-form name="dfVendaItem" model="VendaItem"foreign-key="venda_id" mode="drawer" addable removable editable><mad-detail-fields><mad-form-grid :cols="2"><mad-dbcombo-field name="produto_id" model="Produto" display="{nome}" :required="true" /><mad-numeric-field name="quantidade" :decimals="2" :required="true" /><mad-money-field name="valor_unitario" prefix="R$" :required="true" /><mad-money-field name="valor_total" prefix="R$" :readonly="true" /></mad-form-grid></mad-detail-fields><mad-columns><mad-col field="produto_nome" label="Produto" /><mad-col field="valor_total" label="Valor Total" right money="R$" total="sum" /></mad-columns></mad-detail-form> 
O erro aparece no campo, sem perder o que você digitou
As regras de validação ficam no model (Venda::rules()). Ao salvar, o servidor confere os dados e a mensagem volta no próprio campo. A página não recarrega e nada do que foi digitado se perde.

Listas do banco com busca, cascata e cadastro rápido
Um campo ligado a outra tabela vira uma lista com busca (dbcombo). Para listas grandes, a busca vai ao servidor enquanto você digita (dbunique-search), e também há uma janela de pesquisa com colunas (seek). Uma lista pode depender de outra, como cidade e estado. Se o registro não existe, o cadastro rápido cria na hora, sem sair do formulário:
{{-- Cascata declarativa --}}<mad-dbcombo-field name="estado_id" model="Estado" display="nome" /><mad-dbcombo-field name="cidade_id" model="Cidade" display="nome"depends-on="estado_id" />{{-- Não achou? Cadastro rápido inline, sem sair do form --}}<mad-dbcombo-field name="cliente_id" model="Pessoa" display="nome"no-results-quick-register-action="ClienteForm::quickRegister" /> 
Campos que já chegam com máscara e formato
Moeda com prefixo e casas decimais, número no formato brasileiro, data com calendário, data e hora, CEP, cor, contador. São mais de 40 tipos de campo, e o assistente escolhe o certo a partir do tipo da coluna.

E mais
Crie a conta, monte uma tela, baixe o projeto.
Sem demo agendada e sem call de descoberta. Se o Laravel que sair não passar na revisão do seu time, você perdeu uma tarde.
- Crie a contaBeta aberto, sem cartão.
- Monte uma telaNo visual, no código ou pedindo à IA.
- Baixe o .zipUm projeto Laravel que roda onde você quiser.