Showcase & Documentacao

Componentes reutilizaveis com dark mode. Cada secao mostra o componente ao vivo + codigo Blade para copiar.

Como usar este kit no seu projeto Laravel

Este site que voce esta vendo e a documentacao ao vivo: todos os exemplos abaixo podem ser consultados aqui mesmo. Para usar no Laravel, baixe o repositorio e coloque os arquivos no lugar certo.

  1. Baixar: No GitHub, clique em "Code" e depois "Download ZIP", ou clone: git clone https://github.com/pvitorv/kit-components.git
  2. Onde colocar no Laravel: Copie a pasta components (que esta dentro do repo) para resources/views/components/ do seu projeto. Se o repo tiver tambem a pasta layouts, coloque em resources/views/components/layouts/.
  3. Consultar exemplos: Navegue por esta pagina (Navegacao, Cards, Formularios, Feedback, Interativo, Portfolio). Cada secao mostra o componente funcionando ao vivo e o codigo Blade correspondente para você copiar e colar no seu projeto.

Requisitos: Laravel com Tailwind e Alpine (ou Livewire, que ja inclui Alpine). O HTML desta pagina usa as mesmas classes dos componentes Blade.

Cards

5. Card x-app-card

Container com titulo, variantes visuais e padding configuravel.

Default

Variante padrao.

Glass

Efeito glass.

Flat

Sem borda.

Outline

So borda.

<x-app-card title="Titulo">Conteudo</x-app-card>
<x-app-card variant="glass" padding="lg">Glass com padding grande</x-app-card>
Props: title | variant (default, glass, flat, outline) | padding (none, sm, md, lg)

6. Glass Card x-app-glass-card

Card semitransparente dedicado. Controle de intensidade do blur.

Blur SM

Leve.

Blur XL

Pesado.

<x-app-glass-card title="Titulo" blur="lg">Conteudo</x-app-glass-card>
Props: title | blur (sm, md, lg, xl)

7. Stat Card x-app-stat-card

Card para metricas com label, valor e indicador de tendencia.

Usuarios
1.234
+12% este mes
Vendas
R$ 45k
-3% esta semana
Tarefas
89
+5 hoje
<x-app-stat-card label="Usuarios" value="1.234" trend="+12%" :trendUp="true" />
<x-app-stat-card label="Erros" value="23" trend="-5%" :trendUp="false" variant="glass" />
Props: label | value | trend | trendUp (bool) | variant (default, glass)

Formularios

8. Button x-button

Botao com 8 variantes de cor e 5 tamanhos. Compativel com wire:click e x-on:click.

Tamanhos
<x-button>Primary</x-button>
<x-button variant="danger" size="sm">Excluir</x-button>
<x-button variant="ghost" wire:click="cancelar">Cancelar</x-button>
<x-button variant="glass">Glass</x-button>
Props: variant (primary, secondary, success, danger, warning, ghost, outline, glass) | size (xs, sm, md, lg, xl)

9-15. Campos de Formulario

Input, Textarea, Select, Search, Checkbox, Radio e Toggle. Todos compativeis com wire:model.

Minimo 5 caracteres.

Opcoes
<x-app-input label="Email" type="email" placeholder="email@ex.com" hint="Dica" />
<x-app-textarea label="Bio" wire:model="bio" rows="6" />
<x-app-select label="Pais" :options="['br' => 'Brasil']" wire:model="pais" />
<x-app-search wire:model.live.debounce.300ms="busca" />
<x-app-checkbox label="Aceito os termos" wire:model="termos" />
<x-app-radio name="plano" label="Pro" value="pro" wire:model="plano" />
<x-app-toggle label="Ativar" :checked="true" />
Props comuns: label | error | hint — Todos aceitam wire:model e atributos HTML

Feedback

16. Alert x-app-alert

Alerta com icone, titulo e botao de fechar opcional.

Info
Mensagem informativa.
Sucesso
Salvo com sucesso!
Atencao! Clique no X para fechar.
Erro
Algo deu errado.
<x-app-alert variant="success" title="Sucesso">Salvo!</x-app-alert>
<x-app-alert variant="danger" :dismissible="true">Erro.</x-app-alert>
Props: variant (info, success, warning, danger) | title | dismissible (bool)

17. Badge x-app-badge

Etiqueta para status ou categorias.

Default Primary Ativo Pendente Urgente
<x-app-badge variant="success" :rounded="true">Ativo</x-app-badge>
<x-app-badge variant="danger" size="lg">Urgente</x-app-badge>
Props: variant (default, primary, success, warning, danger) | size (sm, md, lg) | rounded (bool)

18. Avatar x-app-avatar

Foto, iniciais ou icone generico.

A
BC
DE
FG
<x-app-avatar src="/foto.jpg" alt="Joao" size="lg" />
<x-app-avatar initials="PV" size="md" />
<x-app-avatar size="sm" />  <!-- icone generico -->
Props: src | alt | initials | size (xs, sm, md, lg, xl)

19. Spinner x-app-spinner

Indicador de carregamento. Ideal com wire:loading.

<x-app-spinner size="md" />
<div wire:loading><x-app-spinner size="sm" /></div>
Props: size (sm, md, lg, xl) | color (blue, white, gray)

20. Progress x-app-progress

Barra de progresso com label e cores.

Upload25%
Processando60%
Quase la!90%
<x-app-progress :value="65" :showLabel="true" color="green">Download</x-app-progress>
<x-app-progress :value="30" size="sm" color="red" />
Props: value | max (100) | size (sm, md, lg) | color (blue, green, red, amber, purple) | showLabel (bool)

21. Empty State x-app-empty-state

Placeholder para listas/tabelas vazias.

Sem resultados

Nenhum registro encontrado.

<x-app-empty-state title="Sem resultados" description="Tente outra busca.">
    <x-button size="sm">Limpar</x-button>
</x-app-empty-state>
Props: title | description

22. Divider x-app-divider

Separador com texto central opcional.

ou continue com
<x-app-divider />
<x-app-divider text="ou" />
Props: text (string|null)

Interativo

23. Modal x-app-modal

5 tamanhos + versao glass. Abre via $dispatch, fecha com ESC ou clique no overlay.

<div x-data>
    <x-button x-on:click="$dispatch('open-meu-modal')">Abrir</x-button>
</div>
<x-app-modal name="meu-modal" size="lg" variant="glass">
    <h3>Titulo</h3>
    <p>Conteudo.</p>
</x-app-modal>
Props: name (unico) | size (sm, md, lg, xl, full) | variant (default, glass) — Abrir: $dispatch('open-NOME') — Fechar: $dispatch('close-NOME') ou ESC

24. Dropdown x-app-dropdown

Menu suspenso. Fecha ao clicar fora.

<x-app-dropdown align="right" width="w-56">
    <x-slot:trigger><x-button>Menu</x-button></x-slot:trigger>
    <a href="#" class="block px-4 py-2 text-sm hover:bg-gray-100">Item</a>
</x-app-dropdown>
Props: align (left, right) | width — Slots: trigger, default

25. Tabs x-app-tabs

Abas com Alpine. Use x-show="tab === 'chave'" no conteudo.

Aba Geral.

Aba Seguranca.

Aba Notificacoes.

<x-app-tabs :tabs="['a' => 'Aba 1', 'b' => 'Aba 2']" active="a">
    <div x-show="tab === 'a'">Conteudo 1</div>
    <div x-show="tab === 'b'" style="display:none;">Conteudo 2</div>
</x-app-tabs>
Props: tabs (array ['chave' => 'Label']) | active — Variavel Alpine: tab

26. Accordion x-app-accordion

Painel expansivel independente.

Framework full-stack para Laravel.
Framework JS leve para interatividade.
<x-app-accordion title="Pergunta" :open="true">Resposta.</x-app-accordion>
Props: title | open (bool)

27. Tooltip x-app-tooltip

Dica ao passar o mouse. 4 posicoes.

Em cima
Embaixo
Esquerda
Direita
<x-app-tooltip text="Salvar" position="top">
    <x-button>Salvar</x-button>
</x-app-tooltip>
Props: text | position (top, bottom, left, right)

28. Toast x-app-toast

Notificacao temporaria (4s). Acionada via $dispatch.

<x-app-toast variant="success" position="top-center">Salvo!</x-app-toast>
<div x-data><x-button x-on:click="$dispatch('toast-success')">Salvar</x-button></div>
Props: variant (info, success, warning, danger) | position (top-right, top-left, bottom-right, bottom-left, top-center)

29. Table x-app-table

Tabela responsiva com zebra opcional.

Nome Email Status
AB
Ana
ana@email.com Ativo
CD
Carlos
carlos@email.com Inativo
<x-app-table :striped="true">
    <x-slot:head>
        <tr><th class="px-6 py-3">Nome</th><th class="px-6 py-3">Email</th></tr>
    </x-slot:head>
    <tr><td class="px-6 py-4">Ana</td><td class="px-6 py-4">ana@email.com</td></tr>
</x-app-table>
Props: striped (bool) — Slots: head, default (tbody rows)

30. Todo List Alpine (estatico)

Na versao Laravel e um componente Livewire. Aqui: Alpine.js (mesmo comportamento).

<!-- Laravel: <livewire:todo-list /> -->
<!-- Estatico: use Alpine (x-data, x-for, x-model) como acima -->

Footer x-app-footer

Rodape com 3 variantes. Veja o exemplo ao vivo no final desta pagina.

<x-app-footer variant="glass">
    <span>&copy; 2026 Meu App</span>
    <span>Feito com Laravel</span>
</x-app-footer>
Props: variant (default, glass, dark)

Componentes do portfolio

Padroes usados em portfolio com mini CMS: layout admin, card de projeto, secao de contato e formulario de perfil.

31. Layout Admin x-layouts.admin

Navbar para area administrativa: links Projetos, Perfil, Ver site e botao Sair (logout). Use em todas as paginas do admin.

<x-layouts.admin title="Projetos – Admin">
    <main class="max-w-5xl mx-auto px-4 py-8">
        <!-- conteudo da pagina admin -->
    </main>
</x-layouts.admin>
O layout inclui navbar com Projetos, Perfil, Ver site e formulario POST para logout. Coloque resources/views/components/layouts/admin.blade.php.

32. Card de projeto portfolio

Card com miniatura (imagem do projeto), titulo, descricao, botao "Ver projeto" (abre em nova aba) e botao opcional "GitHub".

Nome do projeto

Descricao breve do projeto. Pode ter varias linhas.

<x-app-card variant="glass" padding="none" class="overflow-hidden flex flex-col h-full">
    <a href="{{ $project->url }}" target="_blank" rel="noopener noreferrer" class="block aspect-video">
        <img src="{{ $project->thumbnail_display_url }}" alt="{{ $project->display_name }}" class="w-full h-full object-cover" />
    </a>
    <div class="p-5">
        <h3>{{ $project->display_name }}</h3>
        <p>{{ $project->description }}</p>
        <a href="{{ $project->url }}" target="_blank" rel="noopener noreferrer">Ver projeto</a>
        @if($project->github_url)<a href="{{ $project->github_url }}" target="_blank">GitHub</a>@endif
    </div>
</x-app-card>

33. Secao Contato (rodape) contato

Bloco de contato: titulo, dados (e-mail, telefone, localizacao, LinkedIn, GitHub) e formulario (nome, e-mail, mensagem). Ideal no rodape com id="contato".

Contato

Entre em contato por e-mail ou use o formulario.

E-mail
contato@email.com
LinkedIn
Perfil
<footer id="contato">
    <section class="... backdrop-blur-md ...">
        <h2>Contato</h2>
        <div class="grid md:grid-cols-2 gap-10">
            <div><!-- dados do perfil: email, phone, location, linkedin, github --></div>
            <form action="{{ route('contact.store') }}" method="POST">
                @csrf
                <x-app-input name="name" label="Seu nome" />
                <x-app-input name="email" type="email" label="Seu e-mail" />
                <x-app-textarea name="message" label="Mensagem" />
                <x-button type="submit">Enviar</x-button>
            </form>
        </div>
    </section>
</footer>

34. Formulario de perfil (admin) perfil

Formulario para editar perfil do usuario: foto (upload), nome, e-mail, titulo, bio (curriculo), telefone, localizacao, LinkedIn, GitHub e alterar senha (opcional). Usado em /admin/profile.

<form action="{{ route('admin.profile.update') }}" method="POST" enctype="multipart/form-data">
    @csrf
    @method('PUT')
    <x-app-input name="name" label="Nome" :value="$user->name" />
    <x-app-input name="email" type="email" :value="$user->email" />
    <input type="file" name="photo" accept="image/*" />
    <x-app-input name="title" label="Titulo / Cargo" :value="$user->title" />
    <x-app-textarea name="bio" label="Sobre voce">{{ $user->bio }}</x-app-textarea>
    <x-app-input name="phone" label="Telefone" :value="$user->phone" />
    <x-app-input name="linkedin_url" label="LinkedIn" type="url" :value="$user->linkedin_url" />
    <x-app-input name="github_url" label="GitHub" type="url" :value="$user->github_url" />
    <x-button type="submit">Salvar perfil</x-button>
</form>