indrahulu / laravel-components
Reusable Laravel components
v1.0.1
2026-03-28 15:35 UTC
Requires
- php: ^8.2
- illuminate/database: ^12.0
- illuminate/support: ^12.0
- illuminate/view: ^12.0
Requires (Dev)
- orchestra/testbench: ^10.0
- phpunit/phpunit: ^11.0
Suggests
- blade-ui-kit/blade-icons: Required in host app when using components that render <x-icon>, such as select.
This package is auto-updated.
Last update: 2026-03-28 15:36:09 UTC
README
Reusable Laravel components package.
Quick Start (90 Seconds)
- Publish package assets:
php artisan vendor:publish --tag=laravel-components-config php artisan vendor:publish --tag=laravel-components-views php artisan vendor:publish --tag=laravel-components-assets php artisan vendor:publish --tag=laravel-components-theme php artisan vendor:publish --tag=laravel-components-safelist php artisan vendor:publish --tag=laravel-components-layouts
- Setup Tailwind integration automatically:
php artisan laravel-components:setup-tailwind
- Build frontend assets:
npm run build
- Verify integration:
php artisan laravel-components:doctor
Component Tag
Use namespaced component tags:
<x-comp::input name="email" label="Email" type="email" />
Reusable Utilities
This package also provides reusable services/traits:
Indrahulu\LaravelComponents\Services\ExceptionServiceIndrahulu\LaravelComponents\Services\IndexQueryServiceIndrahulu\LaravelComponents\Concerns\HasEnumOptionsIndrahulu\LaravelComponents\Concerns\PreservesIndexState
Example service injection:
use Indrahulu\LaravelComponents\Services\IndexQueryService; public function index(Request $request, IndexQueryService $indexQueryService): View { $rowsPerPage = $indexQueryService->resolveRowsPerPage($request->query('rows')); // ... }
Example enum trait:
use Indrahulu\LaravelComponents\Concerns\HasEnumOptions; enum UserRole: string { use HasEnumOptions; }
Example index state trait:
use Indrahulu\LaravelComponents\Concerns\PreservesIndexState; class UserController extends Controller { use PreservesIndexState; }
Documentation
- Development Guide:
GUIDES.md - Docs Index:
docs/index.md - Input:
docs/components/input.md - Button:
docs/components/button.md - Badge:
docs/components/badge.md - Card:
docs/components/card.md - Checkbox:
docs/components/checkbox.md - Link:
docs/components/link.md - Modal:
docs/components/modal.md - Table Filter:
docs/components/table-filter.md - Table Index:
docs/components/table-index.md - Textarea:
docs/components/textarea.md - Select:
docs/components/select.md - Select Remote:
docs/components/select-remote.md - Spinner:
docs/components/spinner.md - Theme Contract:
docs/theming/theme-contract.md - Layout Practical Guide:
docs/layouts/default-customization.md - Layout Full Reference:
docs/layouts/default-reference.md - Exception Service:
docs/utilities/exception-service.md - Index Query Service:
docs/utilities/index-query-service.md - Has Enum Options:
docs/utilities/has-enum-options.md - Preserves Index State:
docs/utilities/preserves-index-state.md
Prerequisites
- AlpineJS should be available in host app for interactive components.
- Axios should be available globally as
window.axiosfor remote components. - Host app should provide
<x-icon>(for example viablade-ui-kit/blade-iconsand the icon set used by the project). IndexQueryServiceuses Eloquent query builder (illuminate/database).
Theming
- Active theme is resolved from
config('laravel-components.theme.active'). - Theme keys are read from
config('laravel-components.themes.{theme}.tokens|components|behavior'). - Full schema and host-contract details are documented in
docs/theming/theme-contract.md.
Behavior Configuration
IndexQueryService::resolveRowsPerPage() reads:
laravel-components.utilities.index.rows_per_page.optionslaravel-components.utilities.index.rows_per_page.default
Example:
'utilities' => [ 'index' => [ 'rows_per_page' => [ 'options' => [10, 25, 50, 100], 'default' => 25, ], ], ],
Command Helpers
php artisan laravel-components:setup-tailwind- Injects required
@importand@sourcelines into host CSS entry file.
- Injects required
php artisan laravel-components:doctor- Checks config/theme/safelist/app.css integration and reports
OK/WARN/FAIL.
- Checks config/theme/safelist/app.css integration and reports
php artisan laravel-components:generate-safelist- Regenerates safelist entries from active theme config.
Agent Skill
Publish skill template:
php artisan vendor:publish --tag=laravel-components-skill
Published file:
docs/vendor/laravel-components/skills/laravel-components-development/SKILL.md
Install to Codex skills directory:
- Create target folder:
~/.codex/skills/laravel-components-development - Copy published
SKILL.mdinto that folder.
Skill reference is doc-driven and points to:
docs/index.mddocs/components/*docs/theming/theme-contract.mddocs/layouts/*docs/utilities/*docs/skills/installation.md
Publish Assets
php artisan vendor:publish --tag=laravel-components-config php artisan vendor:publish --tag=laravel-components-views php artisan vendor:publish --tag=laravel-components-assets php artisan vendor:publish --tag=laravel-components-theme php artisan vendor:publish --tag=laravel-components-safelist php artisan vendor:publish --tag=laravel-components-layouts php artisan vendor:publish --tag=laravel-components-skill php artisan vendor:publish --tag=laravel-components-docs
Starter Layout
Publish starter layout:
php artisan vendor:publish --tag=laravel-components-layouts
Published file:
resources/views/layout/default.blade.php
Then use in pages:
@extends('layout.default')
Customization guides:
docs/layouts/default-customization.mddocs/layouts/default-reference.md
Tailwind Source and Safelist (Host App)
In host app resources/css/app.css:
@import './vendor/laravel-components-theme.css'; @source '../../vendor/indrahulu/laravel-components/resources/views/**/*.blade.php'; @source './safelist/laravel-components.txt';
For local path/submodule usage, point @source to local package views path instead of vendor/....
Troubleshooting
- Components render but look unstyled:
- Ensure
@import './vendor/laravel-components-theme.css';exists inresources/css/app.css. - Ensure
@sourcelines for package views and safelist exist inresources/css/app.css. - Ensure published files exist:
resources/css/vendor/laravel-components-theme.cssresources/css/safelist/laravel-components.txt
- Re-run
npm run build(ornpm run devfor local development). - Run
php artisan laravel-components:doctorand follow warnings.
- Ensure