Formulario: del registro simple a la venta con ítems.
La pantalla de abajo es el Registro de venta de la app de ejemplo, publicada en la Prueba online. Es el mismo registro que alimenta el listado y el PDF de la página de Listado. Tiene cliente elegido de la base de datos, fecha, total calculado y los ítems de la venta.
Un registro de venta con los ítems en la misma pantalla
El formulario se abre en un panel lateral, dividido en secciones y en dos columnas. El cliente viene de una lista de la base de datos y la fecha tiene máscara. El Valor total no se escribe: es la suma de los ítems de la venta. Todo eso queda declarado así:
<mad-form submit="onSave"><mad-form-section title="Registro de venta" 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="Fecha de la venta" :required="true" /><mad-money-field name="valor_total" label="Valor total" prefix="$" :readonly="true" /></mad-form-grid></mad-form-section>...</mad-form> 
Panel, ventana, página completa o debajo de la fila
El mismo formulario puede abrirse de cuatro maneras. En el controller, una línea elige entre panel lateral (DRAWER, como arriba), ventana central (MODAL) o página completa (INTERNAL). En el listado, el atributo row en el botón de editar abre el formulario justo debajo de la fila. Editas rápido y no pierdes la tabla de vista.
{{-- en el controller del form: cómo se abre --}}protected static string $wrapper = self::DRAWER; {{-- panel lateral --}}protected static string $wrapper = self::MODAL; {{-- diálogo central --}}protected static string $wrapper = self::INTERNAL; {{-- página completa --}}{{-- en el listado: el MISMO form, anexado debajo de la fila --}}<mad-nav icon="pencil" label="Editar"navigate="VendaForm::onEdit({id})" row /> 

Los ítems de la venta se guardan junto con ella
El bloque de ítems (<mad-detail-form>) te deja agregar, editar y quitar los ítems en la misma pantalla. Al guardar, el formulario ajusta los ítems solo: inserta los nuevos, actualiza los editados y borra los quitados. Para campos calculados, como el nombre del producto y el total de cada ítem, el controller tiene dos puntos de entrada (onLoadDetail y 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="$" :required="true" /><mad-money-field name="valor_total" prefix="$" :readonly="true" /></mad-form-grid></mad-detail-fields><mad-columns><mad-col field="produto_nome" label="Producto" /><mad-col field="valor_total" label="Valor total" right money="$" total="sum" /></mad-columns></mad-detail-form> 
El error aparece en el campo, sin perder lo que escribiste
Las reglas de validación quedan en el model (Venda::rules()). Al guardar, el servidor revisa los datos y el mensaje vuelve en el propio campo. La página no se recarga y nada de lo que escribiste se pierde.

Listas de la base de datos con búsqueda, cascada y registro rápido
Un campo ligado a otra tabla se vuelve una lista con búsqueda (dbcombo). Para listas grandes, la búsqueda va al servidor mientras escribes (dbunique-search), y también hay una ventana de búsqueda con columnas (seek). Una lista puede depender de otra, como ciudad y estado. Si el registro no existe, el registro rápido lo crea al instante, sin salir del formulario:
{{-- Cascada 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" />{{-- ¿No lo encontró? Registro rápido inline, sin salir del form --}}<mad-dbcombo-field name="cliente_id" model="Pessoa" display="nome"no-results-quick-register-action="ClienteForm::quickRegister" /> 
Campos que ya llegan con máscara y formato
Moneda con prefijo y decimales, número con formato local, fecha con calendario, fecha y hora, código postal, color, contador. Son más de 40 tipos de campo, y el asistente elige el correcto a partir del tipo de la columna.

Y más
Crea la cuenta, arma una pantalla, descarga el proyecto.
Sin demo agendada ni llamada de descubrimiento. Si el Laravel que sale no pasa la revisión de tu equipo, perdiste una tarde.
- Crea la cuentaBeta abierta, sin tarjeta.
- Arma una pantallaEn el editor visual, en código o pidiéndoselo a la IA.
- Descarga el .zipUn proyecto Laravel que corre donde quieras.