Docs›Componentes (Admin)›mad-form-* (layout)
Componentes (Admin)

mad-form-* (layout)

form, form-section, form-grid, form-stack, form-actions, separator.

Componentes de estrutura para organizar campos dentro de <mad-form>. Combinam-se livremente para montar qualquer formulário.

Hierarquia típica

<mad-form submit="onSave">
    <mad-form-section title="..." icon="...">         {{-- bloco semântico --}}
        <mad-form-grid :cols="2">                      {{-- campos lado a lado --}}
            <mad-input-field ... />
            <mad-input-field ... />
        </mad-form-grid>

        <mad-form-stack>                               {{-- campos empilhados --}}
            <mad-textarea-field ... />
        </mad-form-stack>
    </mad-form-section>

    <mad-separator />                                  {{-- divisor visual --}}

    <mad-form-section title="..." icon="...">
        ...
    </mad-form-section>

    <mad-form-actions>                                 {{-- botões --}}
        <mad-btn type="submit" variant="primary" icon="save">Salvar</mad-btn>
    </mad-form-actions>
</mad-form>

<mad-form> — wrapper

Prop Tipo Default Descrição
submit string '' Método PHP chamado no submit (ex: onSave)
id string '' ID do form
class string '' Classes CSS extras
attrs string '' Atributos HTML extras no <form>

<mad-form-section> — bloco com título

Bloco semântico com header (ícone + título + linha divisória).

Prop Tipo Default Descrição
title string '' Título da seção
subtitle string null Subtítulo (menor, cinza)
icon string null Ícone Lucide
class string '' Classes CSS extras na <section>
style string '' Estilo inline extra na <section>
<mad-form-section title="Dados pessoais" icon="user">
    <mad-form-grid :cols="2">
        <mad-input-field name="nome" label="Nome" required />
        <mad-input-field name="email" label="Email" />
    </mad-form-grid>
</mad-form-section>

<mad-form-section title="Endereço" subtitle="Endereço de entrega" icon="map-pin">
    ...
</mad-form-section>

<mad-form-grid> — grid de colunas

Distribui campos em colunas iguais via CSS grid. Responsivo.

Prop Tipo Default Descrição
cols int 2 Colunas: 1 a 6 (ignorado quando template é definido)
gap int 4 Espaçamento (indice): 0=0px, 1=4px, 2=8px, 3=12px, 4=16px, 5=20px, 6=24px, 8=32px
template string null grid-template-columns CSS customizado — sobrescreve cols
class string '' Classes CSS extras
style string '' Estilo inline extra
<mad-form-grid :cols="2">
    <mad-input-field name="nome" label="Nome" />
    <mad-input-field name="email" label="Email" />
</mad-form-grid>

<mad-form-grid :cols="3">
    <mad-input-field name="cidade" label="Cidade" />
    <mad-dbcombo-field name="estado_id" label="Estado" model="Estado" display="nome" />
    <mad-input-field name="cep" label="CEP" />
</mad-form-grid>

Múltiplos grids na mesma seção

<mad-form-section title="Produto" icon="package">
    <mad-form-grid :cols="2">
        <mad-input-field name="nome" label="Nome" required />
        <mad-input-field name="cod_barras" label="Cod. Barras" />
    </mad-form-grid>
    <mad-form-grid :cols="3">
        <mad-numeric-field name="valor" label="Valor" prefix="R$" />
        <mad-numeric-field name="peso" label="Peso (kg)" />
        <mad-input-field name="unidade" label="Unidade" />
    </mad-form-grid>
</mad-form-section>

Grid com template customizado

Quando as colunas não devem ter a mesma largura, template sobrescreve cols com um grid-template-columns CSS literal.

<mad-form-grid template="120px 1fr 80px">
    <mad-input-field name="codigo" label="Código" />
    <mad-input-field name="nome" label="Nome" />
    <mad-input-field name="qtd" label="Qtd." />
</mad-form-grid>

<mad-form-grid-item> — item com largura customizada (span)

Filho opcional de <mad-form-grid> para um campo ocupar mais de uma coluna (grid-column: span N), sem precisar quebrar em outro grid.

Prop Tipo Default Descrição
span int 1 Quantidade de colunas que o item ocupa
class string '' Classes CSS extras
<mad-form-grid :cols="3">
    <mad-form-grid-item :span="2">
        <mad-input-field name="nome" label="Nome" required />
    </mad-form-grid-item>
    <mad-input-field name="cod_barras" label="Cod. Barras" />
</mad-form-grid>

<mad-form-stack> — campos empilhados

Flex column com gap. Equivalente a <mad-form-grid :cols="1"> mas semanticamente indica lista vertical, não grid.

Prop Tipo Default Descrição
gap int 4 Espaçamento (mesmos índices de <mad-form-grid>: 0=0px … 6=24px, 8=32px)
class string '' Classes CSS extras
<mad-form-stack>
    <mad-input-field name="titulo" label="Título" required />
    <mad-textarea-field name="descricao" label="Descrição" />
    <mad-html-editor-field name="conteudo" label="Conteúdo" />
</mad-form-stack>

Container flex para botões de ação.

Prop Tipo Default Descrição
align string left left | right | center
class string '' Classes CSS extras
style string '' Estilo inline extra
<mad-form-actions>
    <mad-btn type="submit" variant="primary" icon="save">Salvar</mad-btn>
</mad-form-actions>

<mad-form-actions>
    <mad-btn type="submit" variant="primary" icon="search">Buscar</mad-btn>
    <mad-btn variant="ghost" icon="x-circle" mad:click="onLimpar">Limpar</mad-btn>
</mad-form-actions>

<mad-form-actions align="right">
    <mad-btn variant="ghost" close-drawer>Cancelar</mad-btn>
    <mad-btn type="submit" variant="primary" icon="save">Salvar</mad-btn>
</mad-form-actions>

<mad-separator> — divisor

Prop Tipo Default Descrição
label string '' Texto central (divisor com label)
vertical bool false Separador vertical (só aplica quando label está vazio)
class string '' Classes CSS extras
<mad-separator />
<mad-separator label="ou" />

Exemplos

CRUD simples (drawer)

<mad-form submit="onSave">
    <mad-form-section title="Dados da unidade" icon="building-2">
        <mad-form-grid :cols="1">
            <mad-input-field name="name" label="Nome" required />
        </mad-form-grid>
    </mad-form-section>

    <mad-separator />

    <mad-form-actions>
        <mad-btn variant="primary" type="submit" icon="save">Salvar</mad-btn>
    </mad-form-actions>
</mad-form>

CRUD com múltiplas seções

<mad-form submit="onSave">
    <mad-form-section title="Dados pessoais" icon="user">
        <mad-form-grid :cols="2">
            <mad-input-field name="nome" label="Nome" required />
            <mad-input-field name="login" label="Login" required />
        </mad-form-grid>
        <mad-form-grid :cols="2">
            <mad-input-field name="email" label="Email" />
            <mad-switch-field name="ativo" label="Ativo" />
        </mad-form-grid>
    </mad-form-section>

    <mad-separator />

    <mad-form-section title="Acesso" icon="lock">
        <mad-form-grid :cols="2">
            <mad-input-field name="password" label="Senha" type="password" />
            <mad-input-field name="repassword" label="Confirmar" type="password" />
        </mad-form-grid>
    </mad-form-section>

    <mad-separator />

    <mad-form-actions>
        <mad-btn variant="primary" type="submit" icon="save">Salvar</mad-btn>
    </mad-form-actions>
</mad-form>

Form com imagem + campos

<mad-form submit="onSave">
    <mad-form-section title="Foto" icon="image">
        <mad-image-field name="foto" label="Foto do produto"
            storage="disk" folder="uploads/fotos"
            crop aspect-ratio="4:3" />
    </mad-form-section>

    <mad-separator />

    <mad-form-section title="Dados" icon="package">
        <mad-form-grid :cols="2">
            <mad-input-field name="nome" label="Nome" required />
            <mad-numeric-field name="valor" label="Valor" prefix="R$" />
        </mad-form-grid>
        <mad-form-grid :cols="1">
            <mad-textarea-field name="descricao" label="Descrição" />
        </mad-form-grid>
    </mad-form-section>

    <mad-separator />

    <mad-form-actions>
        <mad-btn variant="primary" type="submit" icon="save">Salvar</mad-btn>
    </mad-form-actions>
</mad-form>

Quando usar o que

Preciso... Usar
Agrupar campos com título <mad-form-section>
Campos lado a lado <mad-form-grid :cols="N">
Campos empilhados 100% largura <mad-form-stack> ou <mad-form-grid :cols="1">
Divisor entre seções <mad-separator />
Botões de ação <mad-form-actions>
Mudar colunas no meio da seção Dois <mad-form-grid> consecutivos
Um campo ocupar mais de uma coluna dentro do mesmo grid <mad-form-grid-item :span="N">
Colunas com larguras diferentes (não uniformes) <mad-form-grid template="...">

NUNCA fazer

{{-- ERRADO: div com style inline para botões --}}
<div style="display:flex;gap:8px;margin-top:16px;">
    <mad-btn type="submit">Salvar</mad-btn>
</div>

{{-- CERTO --}}
<mad-form-actions>
    <mad-btn type="submit">Salvar</mad-btn>
</mad-form-actions>

{{-- ERRADO: div com style inline para grid --}}
<div style="display:grid;grid-template-columns:1fr 1fr;gap:16px;">
    <mad-input-field ... />
</div>

{{-- CERTO --}}
<mad-form-grid :cols="2">
    <mad-input-field ... />
</mad-form-grid>

{{-- ERRADO: <hr> para separar --}}
<hr style="margin:16px 0;">

{{-- CERTO --}}
<mad-separator />

{{-- ERRADO: form nativo --}}
<form data-mad-submit="onSave">...</form>

{{-- CERTO --}}
<mad-form submit="onSave">...</mad-form>