PHPackages                             gallardev/minimalist - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Admin Panels](/categories/admin)
4. /
5. gallardev/minimalist

ActiveLibrary[Admin Panels](/categories/admin)

gallardev/minimalist
====================

Minimalist — declarative monochrome admin panel for Laravel with Livewire and Tailwind

v0.12.1(1mo ago)01↑2900%MITPHPPHP ^8.2

Since Jun 19Pushed 1mo agoCompare

[ Source](https://github.com/gallardev98-blip/minimalist-panel)[ Packagist](https://packagist.org/packages/gallardev/minimalist)[ RSS](/packages/gallardev-minimalist/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependencies (6)Versions (10)Used By (0)

Panel (`mylaraveltools/panel`)
==============================

[](#panel-mylaraveltoolspanel)

[![Packagist Version](https://camo.githubusercontent.com/765fd4dc91fe3b53d183097f9eb9f009ec9f80256a1bbe31b9c1f346e2ce608e/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f6d796c61726176656c746f6f6c732f70616e656c)](https://packagist.org/packages/mylaraveltools/panel)[![Packagist Downloads](https://camo.githubusercontent.com/4b7a3407bad00bfd6a9ab56fed042590a4625aac63da54b59b38f93b94ac6fdc/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f6d796c61726176656c746f6f6c732f70616e656c)](https://packagist.org/packages/mylaraveltools/panel)[![License: MIT](https://camo.githubusercontent.com/08cef40a9105b6526ca22088bc514fbfdbc9aac1ddbf8d4e6c750e3a88a44dca/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d626c75652e737667)](LICENSE)

Panel de administración declarativo y monocromático para **Laravel**. API de **Resources** al estilo Filament/Nova, con **Livewire 3**, **Tailwind CSS**, auth integrada, permisos Spatie, import/export y navegación SPA.

Parte del ecosistema **[My Laravel Tools](https://packagist.org/packages/mylaraveltools/)** (junto con `mylaraveltools/alertas`).

```
composer require mylaraveltools/panel
```

> **Migración:** si usabas `mylaraveltools/minimalist`, sustituye por `mylaraveltools/panel`. El namespace PHP sigue siendo `MyLaravelTools\Panel` — no cambia tu código.

---

Tabla de contenidos
-------------------

[](#tabla-de-contenidos)

1. [Requisitos](#requisitos)
2. [Instalación paso a paso](#instalaci%C3%B3n-paso-a-paso)
3. [Tu primer CRUD en 5 minutos](#tu-primer-crud-en-5-minutos)
4. [Configuración (`config/panel.php`)](#configuraci%C3%B3n-configpanelphp)
5. [Autenticación y perfil](#autenticaci%C3%B3n-y-perfil)
6. [Permisos (Spatie) y suplantación](#permisos-spatie-y-suplantaci%C3%B3n)
7. [Navegación y páginas custom](#navegaci%C3%B3n-y-p%C3%A1ginas-custom)
8. [Importar y exportar datos](#importar-y-exportar-datos)
9. [Dashboard y widgets](#dashboard-y-widgets)
10. [Relaciones entre modelos](#relaciones-entre-modelos)
11. [Tema, layout y SPA](#tema-layout-y-spa)
12. [Comandos Artisan](#comandos-artisan)
13. [Personalizar vistas](#personalizar-vistas)
14. [Solución de problemas](#soluci%C3%B3n-de-problemas)
15. [Proyecto demo](#proyecto-demo)
16. [Desarrollo y tests](#desarrollo-y-tests)
17. [Roadmap](#roadmap)
18. [Licencia](#licencia)

---

Requisitos
----------

[](#requisitos)

RequisitoVersiónPHP8.2+Laravel11, 12 o 13Livewire3.5+Tailwind CSS3+ en la app hostOpcionales: `spatie/laravel-permission`, `mylaraveltools/alertas`.

---

Instalación paso a paso
-----------------------

[](#instalación-paso-a-paso)

### Paso 1 — Composer

[](#paso-1--composer)

```
composer require mylaraveltools/panel
```

**Desarrollo local** (path repository):

```
{
  "repositories": [
    { "type": "path", "url": "../minimalist-panel-library" }
  ],
  "require": {
    "mylaraveltools/panel": "@dev"
  }
}
```

### Paso 2 — Instalar el panel

[](#paso-2--instalar-el-panel)

```
php artisan panel:install
```

Esto publica `config/panel.php`, registra rutas en `/admin` y prepara Livewire.

### Paso 3 — Tailwind

[](#paso-3--tailwind)

En `tailwind.config.js` incluye las vistas del paquete y activa modo oscuro por clase:

```
export default {
  darkMode: 'class',
  content: [
    './resources/views/**/*.blade.php',
    './vendor/mylaraveltools/panel/resources/views/**/*.blade.php',
  ],
};
```

### Paso 4 — Alpine + Livewire

[](#paso-4--alpine--livewire)

En `resources/js/app.js`, **no importes Alpine en rutas del panel** (`/admin/*`). Livewire lo gestiona:

```
const panelPath = '/admin';

if (!window.location.pathname.startsWith(panelPath)) {
  import('alpinejs').then(({ default: Alpine }) => {
    window.Alpine = Alpine;
    Alpine.start();
  });
}
```

> Importar Alpine en `/admin/login` rompe `wire:submit` (el formulario no envía nada).

### Paso 5 — Compilar y probar

[](#paso-5--compilar-y-probar)

```
npm run build
php artisan serve
```

Abre `http://127.0.0.1:8000/admin` — verás login/registro si `auth.enabled` es `true`.

**APP\_URL** debe coincidir con host y puerto (`http://127.0.0.1:8000`).

---

Tu primer CRUD en 5 minutos
---------------------------

[](#tu-primer-crud-en-5-minutos)

### 1. Crear el Resource

[](#1-crear-el-resource)

```
php artisan panel:make-resource Product --model=Product
```

### 2. Definir formulario y tabla

[](#2-definir-formulario-y-tabla)

```
// app/Panel/Resources/ProductResource.php
final class ProductResource extends Resource
{
    protected static string $model = Product::class;
    protected static ?string $label = 'Productos';
    protected static ?string $icon = 'package';

    public static function form(): array
    {
        return [
            TextField::make('name')->label('Nombre')->required(),
            NumberField::make('price')->label('Precio')->min(0),
        ];
    }

    public static function table(): array
    {
        return [
            TextColumn::make('name')->label('Nombre')->searchable()->sortable(),
            TextColumn::make('price')->label('Precio')->sortable(),
        ];
    }
}
```

### 3. Listo

[](#3-listo)

Auto-discovery en `app/Panel/Resources/` (configurable). URL: `/admin/resources/products` (slug = kebab del modelo; puedes fijarlo con `protected static ?string $slug = 'productos';`).

---

Configuración (`config/panel.php`)
----------------------------------

[](#configuración-configpanelphp)

Toda la configuración vive en este archivo (compatible con `config:cache`). No hace falta `.env`, aunque puedes usarlo si prefieres.

ClaveDescripciónDefault`path`Prefijo URL`admin``guard`Guard de auth`web``brand.name`Nombre en sidebar`Panel``brand.logo`URL del logo (`null` = icono)`null``per_page`Registros por página`15``forms_in_modal`Crear/editar en modal`true``discovery`Auto-discovery Resources`enabled``pages`Auto-discovery Pages`enabled``permissions`Spatie/Gate`disabled``navigation`Menú lateral (`null` = auto)`null``widgets`Dashboard`[]``import`Import CSV/Excel`enabled` + `preview` + `guided_summary``forms`Modal: validación inline, borrador, focover [UX del listado](#ux-del-listado)`performance`Debounces, skeleton, caché filtros, cursorver [AGENTS.md](AGENTS.md#gu%C3%ADa-ux-del-listado)`layout.index`Filas clicables, columnas, vista rápida, bulkver [UX del listado](#ux-del-listado)`impersonation`Suplantar usuarios`disabled``theme.preset`Preset visual (`minimal`, `corporate`, `contrast`, `ocean`)`minimal``extensions`Vistas custom de campos/columnas y widgets`[]``version`Texto en sidebar (`null` = paquete)`null`### Tema monocromático

[](#tema-monocromático)

```
'theme' => [
    'default' => 'dark',
    'font' => 'Plus Jakarta Sans',
    'colors' => [
        'primary' => '#000000',
        'primary_dark' => '#ffffff',
        'accent' => '#525252',
        'success' => '#16a34a',
        'danger' => '#dc2626',
        'warning' => '#ca8a04',
    ],
    'light' => [ /* bg, surface, card, border, heading, text, muted… */ ],
    'dark' => [ /* … */ ],
],
```

Variables CSS: `--panel-primary`, `--panel-bg`, etc. Toggle claro/oscuro en el footer del sidebar (persiste en `localStorage`).

### UX del listado

[](#ux-del-listado)

Listados (`ResourceIndex`) con filtros en URL, carga optimista, selección masiva y atajos de teclado. Guía completa para agentes y desarrolladores: **[AGENTS.md — Guía UX del listado](AGENTS.md#gu%C3%ADa-ux-del-listado)**.

Resumen de `config/panel.php`:

ÁreaClaves principalesDefaultFiltros`layout.filters.mode`, `default_open`, `remember_state``collapsible`Tabla`layout.index.clickable_rows`, `mobile_cards`, `column_toggle`, `quick_view``true`Bulk`layout.index.bulk_preview`, `bulk_select_all_max`preview on, máx. 500Rendimiento UX`performance.skeleton_delay_ms`, `search_debounce_ms`50 ms / 200 msRendimiento DB`performance.eager_load_columns`, `filter_options_cache``true`Formulario modal`forms.validate_inline`, `draft_autosave`, `focus_on_open``true`Atajos: `/` o `Ctrl+F` → buscador; `↑`/`↓` + `Enter` → filas; `Shift+clic` → vista rápida.

Auditoría: `php artisan panel:audit-rendimiento` (N+1 e índices sugeridos).

### Multi-panel (varios paneles en la misma app)

[](#multi-panel-varios-paneles-en-la-misma-app)

```
// config/panel.php
'default' => 'admin',
'panels' => [
    'admin' => require __DIR__.'/panel-admin.php',
    'cliente' => require __DIR__.'/panel-cliente.php',
],
```

- Sin `panels` (o vacío): un panel, rutas `panel.*` (comportamiento actual).
- Con 2+ paneles: rutas `panel.admin.dashboard`, `panel.cliente.login`, etc.
- Helper: `panel_route('dashboard')` — usa el panel del request actual.
- Stub ejemplo: `stubs/multi/panel-cliente.stub.php`

### Presets de tema

[](#presets-de-tema)

```
'theme' => [
    'preset' => 'corporate',  // minimal | corporate | contrast | ocean
    'colors' => [
        'primary' => '#ff0000',  // sobrescribe solo el preset
    ],
],
```

### Extensibilidad (campos, columnas, widgets)

[](#extensibilidad-campos-columnas-widgets)

**Por config** (`config/panel.php` → `extensions`):

```
'extensions' => [
    'field_views' => ['rating' => 'panel-custom.fields.rating'],
    'column_views' => ['rating' => 'panel-custom.columns.rating'],
    'widgets' => [],
],
```

**Por código** (`AppServiceProvider::boot`):

```
use MyLaravelTools\Panel\Facades\PanelExtensions;

PanelExtensions::registrarVistaCampo('rating', 'panel-custom.fields.rating');
PanelExtensions::registrarWidget(StatWidget::make('Total', fn () => Model::count()));
```

**Campo custom en un Resource:**

```
CustomField::make('payload')
    ->type('json-editor')
    ->view('panel-custom.fields.json-editor')
    ->label('Datos JSON'),
```

**Campos integrados nuevos:** `ColorField`, `DateTimeField`, `KeyValueField` (pares clave/valor → JSON).

**Actualizar vistas publicadas:**

```
php artisan panel:upgrade-views --dry-run
php artisan panel:upgrade-views --force
```

**Actualizar config tras `composer update`:**

```
php artisan panel:upgrade-config --dry-run
php artisan panel:upgrade-config
php artisan panel:doctor
```

Fusiona claves nuevas del paquete en `config/panel.php` (crea backup `.bak`). `panel:doctor` avisa si faltan claves respecto a la versión instalada.

### Layout y apariencia

[](#layout-y-apariencia)

```
'layout' => [
    'density' => 'compact',           // comfortable | compact
    'content_width' => 'boxed',       // full | boxed
    'sidebar_collapsible' => true,
    'show_breadcrumbs' => true,
    'footer_links' => [
        ['label' => 'Ayuda', 'route' => 'panel.dashboard'],
        ['label' => 'Web', 'url' => 'https://ejemplo.com', 'external' => true],
    ],
],

'brand' => [
    'name' => 'Mi Panel',
    'logo' => '/img/logo.svg',
    'logo_height' => '2.5rem',
    'favicon' => '/favicon.ico',
    'tagline' => 'Gestiona tu negocio',
],

'auth_ui' => [
    'layout' => 'split',              // centered | split
    'image' => '/img/auth-side.jpg',
    'background' => 'linear-gradient(135deg, #0f172a, #1e3a5f)',
    'show_tagline' => true,
],

'customization' => [
    'css' => '.panel-sidebar { border-right-width: 2px; }',
    'head_view' => 'panel-custom.head',
],
```

**RepeaterField** — filas con varias columnas (JSON):

```
RepeaterField::make('lineas')
    ->columns(['concepto' => 'Concepto', 'importe' => 'Importe'])
    ->minRows(1)
    ->maxRows(10),
```

### Máxima personalización (v0.24)

[](#máxima-personalización-v024)

**Modos de layout** — `sidebar` (por defecto), `topbar` o `dual` (barra superior + lateral):

```
'layout' => [
    'mode' => 'sidebar',              // sidebar | topbar | dual
    'sidebar_position' => 'left',     // left | right
    'table_striped' => true,
    'table_compact' => false,
    'global_search' => true,
    'per_page_options' => [15, 25, 50, 100],
],
```

**Slots Blade** — inyecta vistas en puntos del layout sin publicar todo el paquete:

```
'slots' => [
    'sidebar.before' => 'mi-app.panel.slots.aviso',
    'main.after' => 'mi-app.panel.slots.analytics',
    'topbar.end' => 'mi-app.panel.slots.acciones',
],
```

Slots disponibles: `sidebar.before`, `sidebar.after`, `main.before`, `main.after`, `topbar.start`, `topbar.end`, `footer.before`.

También vía código en `AppServiceProvider`:

```
use MyLaravelTools\Panel\Support\PanelExtensions;

PanelExtensions::registrarSlot('main.before', 'mi-app.panel.banner');
```

**Import upsert** — actualiza registros existentes en lugar de fallar:

```
'import' => [
    'upsert' => true,
    'upsert_key' => 'email',          // global; el Resource puede sobreescribir
],
```

```
// En tu Resource
public static function importUpsertKey(): ?string
{
    return 'sku';
}
```

**Hooks en Resources:**

```
public static function navigationBadge(): ?string
{
    return (string) static::model()::where('is_active', false)->count();
}

public static function hiddenFromNavigation(): bool
{
    return ! auth()->user()?->can('view settings');
}

public static function perPageOptions(): array
{
    return [10, 25, 50];
}
```

**Presets de tema propios** — archivo PHP que devuelve un array de presets:

```
'theme' => [
    'preset' => 'mi-marca',
    'presets_file' => config_path('panel-theme-presets.php'),
],
```

**Instalación con demo:**

```
php artisan panel:install --demo
```

---

Autenticación y perfil
----------------------

[](#autenticación-y-perfil)

Auth integrada en `/admin/login` y `/admin/register` (tabla `users` de Laravel):

```
'auth' => [
    'enabled' => true,
    'register' => true,
    'register_role' => 'viewer',      // Spatie, opcional
    'password_reset' => true,
    'email_verification' => false,    // requiere MustVerifyEmail
],
```

- Auth externa (Breeze/Fortify): `'enabled' => false`, `'login_route' => 'login'`.
- Tras login: **recarga completa** al dashboard (sin loader SPA). Botón «Entrando» con puntos animados solo durante el POST.
- Recuperar contraseña: `/admin/forgot-password`.
- Perfil: `/admin/profile` — `'profile.enabled' => true`.

---

Permisos (Spatie) y suplantación
--------------------------------

[](#permisos-spatie-y-suplantación)

### Spatie Laravel Permission

[](#spatie-laravel-permission)

```
composer require spatie/laravel-permission
```

```
'permissions' => [
    'enabled' => true,
    'panel_access' => 'access panel',
    'resources' => true,              // RoleResource + PermissionResource
    'manage_permission' => 'manage users',
],
```

- `RolesField` / `RolesColumn` en usuarios.
- `PermissionsField` / `PermissionsColumn` en roles.
- En Pages: `protected static ?string $permission = 'view reports'`.
- Policies: `php artisan panel:make-policy Product` → extiende `ResourcePolicy` (deny-by-default).

### Suplantación de usuario

[](#suplantación-de-usuario)

Navega el panel **como otro usuario** (permisos, menú y policies reales):

```
'impersonation' => [
    'enabled' => true,
    'permission' => 'impersonate users',
    'exclude_ids' => [],
    'banner' => true,
],
```

1. En el resource del modelo `User`, menú ⋮ → **Entrar como**.
2. Aparece una tarjeta en el **sidebar** (encima del perfil) con botón **Salir**.
3. Requiere permiso Spatie/Gate. No puedes suplantarte a ti mismo.

---

Navegación y páginas custom
---------------------------

[](#navegación-y-páginas-custom)

### Menú con grupos

[](#menú-con-grupos)

```
// config/panel.php
'navigation' => require __DIR__.'/panel-navigation.php',
```

```
return [
    ['resource' => ProductResource::class],
    ['page' => SettingsPage::class],
    [
        'type' => 'group',
        'label' => 'Catálogo',
        'icon' => 'package',
        'children' => [
            ['resource' => ProductResource::class],
            ['resource' => CategoryResource::class],
        ],
    ],
];
```

- Búsqueda global: **Cmd/Ctrl+K**.
- No uses `route()` al cargar el config; usa la clave `'route' => 'panel.dashboard'`.

### Páginas custom (no CRUD)

[](#páginas-custom-no-crud)

```
php artisan panel:make-page Settings
```

```
final class SettingsPage extends Page
{
    protected static ?string $label = 'General';
    protected static ?string $slug = 'settings-general';

    public static function view(): string
    {
        return 'panel.pages.settings-general';
    }
}
```

Ruta: `/admin/pages/{slug}`. Vista con ``.

---

Importar y exportar datos
-------------------------

[](#importar-y-exportar-datos)

### Export

[](#export)

Botones **CSV**, **XLSX** y **PDF** en listados. Con filas seleccionadas, exporta solo la selección.

### Import (con vista previa)

[](#import-con-vista-previa)

```
'import' => [
    'enabled' => true,
    'preview' => true,
    'upsert' => true,
    'upsert_key' => null,
],
```

1. Botón **Importar** en el listado (permiso `create`).
2. Sube `.csv`, `.txt`, `.xlsx`, `.xls`.
3. Revisa filas válidas/errores → confirma.
4. Con `upsert` activo: crea nuevos y actualiza existentes según `importUpsertKey()` del Resource.

Personaliza columnas con `Field::importable(false)` o `Resource::import()`.

---

Dashboard y widgets
-------------------

[](#dashboard-y-widgets)

```
'widgets' => [
    ResourceCountWidget::make(ProductResource::class),
    StatWidget::make('Activos', fn () => Product::where('is_active', true)->count())
        ->icon('check-circle'),
    ChartWidget::make('Ventas', 'bar', fn () => [
        'labels' => ['Ene', 'Feb'],
        'values' => [12, 19],
    ])->themeColors(),
    ViewWidget::make('Custom', 'panel.widgets.mi-vista', fn () => ['total' => 100])
        ->columnSpan(2),
],
```

Tipos ChartWidget: `bar`, `line`, `pie`, `doughnut`, `progression`. Gráficos reactivos al tema y SPA.

---

Relaciones entre modelos
------------------------

[](#relaciones-entre-modelos)

Desde la vista **Ver** del registro padre:

```
public static function relations(): array
{
    return [
        RelationManager::make('products', ProductResource::class),
        RelationManager::hasOne('profile', ProfileResource::class),
        RelationManager::belongsToMany('tags', TagResource::class),
        RelationManager::morphMany('reviews', ReviewResource::class),
        RelationManager::morphToMany('tags', TagResource::class),
    ];
}
```

---

Tema, layout y SPA
------------------

[](#tema-layout-y-spa)

- **Sin header global** — cada vista usa `` (título + breadcrumbs).
- **Sidebar footer:** perfil, idioma, tema, versión, logout.
- **SPA:** `wire:navigate`, loader con porcentaje `0%`–`100%`, sidebar persistente.
- **Livewire:** mantén `navigate.show_progress_bar => true` en `config/livewire.php` (la barra NProgress se oculta vía CSS del panel).

### Fields y Columns

[](#fields-y-columns)

**Fields:** `TextField`, `EmailField`, `PasswordField`, `TextareaField`, `BooleanField`, `SelectField`, `BelongsToField`, `NumberField`, `DateField`, `DateTimeField`, `ColorField`, `KeyValueField`, `CustomField`, `FileField`, `ImageField`, `RichTextField`, `RolesField`, `PermissionsField`.

**Columns:** `TextColumn`, `BooleanColumn`, `DateTimeColumn`, `BadgeColumn`, `ColorColumn`, `BelongsToColumn`, `ImageColumn`, `RolesColumn`, `PermissionsColumn`.

**Filtros:** `SelectFilter`, `BooleanFilter`, `DateRangeFilter`, `MultiSelectFilter`.

**Formularios:** `Section::make()`, `Tab::make()`, soft deletes, bulk actions, RowAction.

---

Comandos Artisan
----------------

[](#comandos-artisan)

ComandoDescripción`php artisan panel:install`Instalar panel`php artisan panel:install --demo`Instalar + navigation stub y PostResource ejemplo`php artisan panel:install --starter`Kit completo: demo + modelo Post + migración + widget dashboard`php artisan panel:install --saas`Kit SaaS: tenant + extensiones + vistas + widget`php artisan panel:install --multi`Multi-panel: `panel-admin.php`, `panel-cliente.php` y raíz `panels``php artisan panel:scaffold Name --policy --widget=resource-count`Resource + policy + widget en un paso`php artisan panel:make-resource Name`Crear Resource`php artisan panel:make-page Name`Crear página custom`php artisan panel:make-policy Name`Crear Policy`php artisan panel:make-widget Name --type=chart`Crear clase widget para el dashboard`php artisan panel:doctor`Diagnosticar instalación del panel`php artisan panel:audit-rendimiento`Auditar N+1 e índices sugeridos en resources`php artisan panel:upgrade-config`Fusionar config con claves nuevas del paquete`php artisan panel:upgrade-views`Actualizar vistas publicadas`php artisan vendor:publish --tag=panel-config`Publicar config`php artisan vendor:publish --tag=panel-views`Publicar vistas Blade`php artisan vendor:publish --tag=panel-documentation`Copiar `documentation/panel/` al proyecto### Documentación interactiva (playground)

[](#documentación-interactiva-playground)

Ruta pública **`/playground`** (sin login) — `documentation.enabled` y `documentation.path`:

- Panel **FAKE** a pantalla completa + controles laterales
- Catálogo de todas las opciones de `config/panel.php`
- Vista previa en vivo (layout, marca, tema…)
- Markdown: `documentation/panel/README.md`

---

Personalizar vistas
-------------------

[](#personalizar-vistas)

Si publicas vistas en `resources/views/vendor/panel/`, **sobreescriben** las del paquete.

Tras actualizar el paquete:

```
php artisan vendor:publish --tag=panel-views --force
php artisan view:clear
```

Si no publicas vistas, Laravel usa las del vendor directamente (recomendado hasta que edites Blade).

---

Solución de problemas
---------------------

[](#solución-de-problemas)

ProblemaSoluciónLogin no envía el formularioNo importes Alpine en rutas `/admin/*``Alpine is not defined``show_progress_bar => true` en `config/livewire.php`Estilos rotosIncluye vistas del paquete en `tailwind.config.js` y `npm run build`Feature nueva no apareceRepublica vistas con `--force` o borra `resources/views/vendor/panel/`404 en `/admin/resources/users`El slug por defecto es `user` (singular); define `$slug = 'users'`«Entrar como» no visiblePermiso `impersonate users` + `php artisan db:seed` con ese permisoRedirecciones raras en login`APP_URL` con host y puerto correctos---

Proyecto demo
-------------

[](#proyecto-demo)

Carpeta `panel-demo/` con catálogo, ventas, Spatie, gráficos, import y suplantación.

**Demo online:** despliega con [panel-demo/DEPLOY.md](../panel-demo/DEPLOY.md) y `render.yaml` (Render.com). Playground público en `/playground`.

```
cd panel-demo
composer install && npm install && npm run build
php artisan migrate:fresh --seed
php artisan serve
```

UsuarioEmailPasswordAdmin`admin@panel.test``password`Editor`editor@panel.test``password`Ver `panel-demo/README.md` para rutas y features de prueba.

---

Desarrollo y tests
------------------

[](#desarrollo-y-tests)

```
cd minimalist-panel-library
composer test
```

- Contexto para agentes/IA: [AGENTS.md](AGENTS.md)
- Publicar en Packagist: [PUBLISHING.md](PUBLISHING.md) — `composer release:check` antes de etiquetar
- Historial: [CHANGELOG.md](CHANGELOG.md)

---

Roadmap
-------

[](#roadmap)

- CRUD, SPA, Excel/PDF, búsqueda global, i18n, tests, CI
- RowAction, modales, skeletons, filtros avanzados
- Forms en modal, tabs, export PDF
- Policies, páginas custom, permisos Spatie
- Auth integrada, reset password, perfil
- Import con preview, ChartWidget, ViewWidget, email verify
- Auth UX (v0.20), suplantación de usuario (v0.21)
- Packagist — `mylaraveltools/panel`
- Extensibilidad — presets tema, PanelExtensions, campos custom (v0.22)
- Layout — densidad, boxed, sidebar colapsable, auth split, RepeaterField (v0.23)
- Máxima personalización — topbar/dual, slots, upsert, tablas, presets propios (v0.24)
- Playground público, gráficos interactivos, `panel:doctor`, `panel:make-widget` (v0.25)
- Layout móvil pulido — `mobile-bar`, drawer, modos sidebar/topbar/dual (v0.26)
- Starter kit — `panel:install --starter`, `panel:scaffold` (v0.27)
- Playground ampliado — auth interactivo, ViewWidget, slots visuales (v0.27)
- Multi-panel — `panels` + `panel_route()` + contexto por request (v0.28)
- Instalador multi — `panel:install --multi` + doctor multi-panel + slots playground (v0.29)
- Playground import/permisos + shell layout topbar/dual (v0.30)
- Guía extensiones + smoke CI panel-demo (v0.31)
- Kit SaaS — `panel:install --saas` (v0.32)
- Upgrade config + smoke ampliado — `panel:upgrade-config` (v0.33)
- Doctor config + install tests + playground panel-demo (v0.34)
- panel-demo auth unificada + smoke import/suplantación (v0.35)
- Playground RelationManager + multi-panel (v0.36)
- Publicación Packagist + demo online (PUBLISHING, DEPLOY, render.yaml) (v0.37.0)
- Loader SPA — watchdog, Escape y `panelSpaLoader.ocultar()` (v0.38.0)
- Páginas de error con tema — 403, 404, 419, 422, 429, 500, 503; diseño alineado con el panel e iconos `x-panel::icon` (v0.40.1)
- UX listados — estado vacío contextual, limpiar búsqueda, cabecera sticky, focus-visible, Escape en confirmación (v0.41.0)
- Formularios modernos — bordes redondeados, pestañas pill, secciones y file upload (v0.42.0)
- Filtros colapsables en listados — panel plegable, badge activos, grid ordenado (v0.43.0)
- UX listados v2 — chips, contador, export compacto, atajos `/` y `Ctrl+F` (v0.46.0)
- Tabla sticky, filas clicables, tarjetas móvil, filtros inteligentes (v0.47.0)
- Rendimiento percibido — `PanelRendimiento`, skeleton 50 ms, loader SPA 120 ms (v0.48.0)
- Capa 1 listados — barra bulk fija, copiar enlace, teclado ↑↓+Enter, RelationPanel alineado (v0.49.0)
- Capa 2 listados — columnas ocultables, vista rápida, presets filtros, selección global (v0.50.0)
- Capa 3 listados — formulario inline/borrador, import guiado, preview bulk (v0.51.0)
- Capa 4 rendimiento — `PanelConsultas`, caché opciones, cursor opcional, `panel:audit-rendimiento` (v0.52.0)
- Capa 5 DX — roadmap actualizado, guía UX del listado en AGENTS (v0.53.0)

---

Licencia
--------

[](#licencia)

MIT — [Alberto Gallardo Morales](mailto:gallardev.98@gmail.com)

###  Health Score

37

—

LowBetter than 81% of packages

Maintenance92

Actively maintained with recent releases

Popularity2

Limited adoption so far

Community2

Small or concentrated contributor base

Maturity42

Maturing project, gaining track record

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~0 days

Total

9

Last Release

45d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/a103f400886d72d37704ff55520cf743da84b047aa0d4dc2802f30cb9309dd7b?d=identicon)[Gallardev98](/maintainers/Gallardev98)

---

Tags

laravellivewiretailwindadminpanelminimalistmonochrome

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/gallardev-minimalist/health.svg)

```
[![Health](https://phpackages.com/badges/gallardev-minimalist/health.svg)](https://phpackages.com/packages/gallardev-minimalist)
```

###  Alternatives

[craftcms/cms

Craft CMS

3.6k3.7M3.3k](/packages/craftcms-cms)[tomshaw/electricgrid

A feature-rich Livewire package designed for projects that require dynamic, interactive data tables.

119.8k](/packages/tomshaw-electricgrid)[yajra/laravel-datatables-export

Laravel DataTables Queued Export Plugin.

362.3M4](/packages/yajra-laravel-datatables-export)[2lenet/crudit-bundle

The easy like Crud'it Bundle.

1617.3k14](/packages/2lenet-crudit-bundle)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
