Form: from a simple record to a sale with line items.
The screen below is the Sale record from the sample app, published on the Online Test. It is the same record that feeds the list view and the PDF on the List view page. It has a customer picked from the database, a date, a calculated total and the sale's line items.
A sale record with its line items on the same screen
The form opens in a side panel, split into sections and two columns. The customer comes from a database list and the date has a mask. The Total isn't typed: it is the sum of the sale's items. All of that is declared like this:
<mad-form submit="onSave"><mad-form-section title="Sale record" icon="file-text"><mad-form-grid :cols="2"><mad-dbcombo-field name="cliente_id" label="Customer" model="Pessoa"display="{nome}" order-by="nome" :required="true" /><mad-date-field name="data_venda" label="Sale date" :required="true" /><mad-money-field name="valor_total" label="Total" prefix="$" :readonly="true" /></mad-form-grid></mad-form-section>...</mad-form> 
Panel, window, full page or under the row
The same form can open four ways. In the controller, one line chooses between a side panel (DRAWER, as above), a centered window (MODAL) or a full page (INTERNAL). In the list view, the row attribute on the edit button opens the form right under the row. You edit quickly and never lose sight of the table.
{{-- in the form controller: how it opens --}}protected static string $wrapper = self::DRAWER; {{-- side panel --}}protected static string $wrapper = self::MODAL; {{-- centered dialog --}}protected static string $wrapper = self::INTERNAL; {{-- full page --}}{{-- in the list view: the SAME form, attached under the row --}}<mad-nav icon="pencil" label="Edit"navigate="VendaForm::onEdit({id})" row /> 

The sale's items are saved together with it
The items block (<mad-detail-form>) lets you add, edit and remove items on the same screen. On save, the form reconciles the items on its own: it inserts the new ones, updates the edited ones and deletes the removed ones. For calculated fields, such as the product name and each item's total, the controller has two entry points (onLoadDetail and 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="Product" /><mad-col field="valor_total" label="Total" right money="$" total="sum" /></mad-columns></mad-detail-form> 
The error shows on the field, without losing what you typed
The validation rules live in the model (Venda::rules()). On save, the server checks the data and the message comes back on the field itself. The page doesn't reload and nothing you typed is lost.

Database lists with search, cascade and quick add
A field linked to another table becomes a searchable list (dbcombo). For large lists, the search goes to the server as you type (dbunique-search), and there is also a lookup window with columns (seek). One list can depend on another, like city and state. If the record doesn't exist, the quick add creates it on the spot, without leaving the form:
{{-- Declarative cascade --}}<mad-dbcombo-field name="estado_id" model="Estado" display="nome" /><mad-dbcombo-field name="cidade_id" model="Cidade" display="nome"depends-on="estado_id" />{{-- Not found? Quick inline record, without leaving the form --}}<mad-dbcombo-field name="cliente_id" model="Pessoa" display="nome"no-results-quick-register-action="ClienteForm::quickRegister" /> 
Fields that arrive with masks and formats built in
Currency with a prefix and decimal places, numbers in your locale's format, dates with a calendar, date and time, postal code, color, counter. That is more than 40 field types, and the wizard picks the right one from the column type.

And more
Create an account, build a screen, download the project.
No scheduled demo, no discovery call. If the Laravel that comes out doesn’t pass your team’s review, you lost an afternoon.
- Create an accountOpen beta, no credit card.
- Build a screenVisually, in code, or by asking the AI.
- Download the .zipA Laravel project that runs wherever you want.