Installation:
composer require epessine/axis
Publish the config (if needed):
php artisan vendor:publish --provider="Epessine\Axis\AxisServiceProvider"
First Chart in a Blade View:
@use(Axis\Axis::class)
{{ Axis::line()->title('Sales Overview')->data([10, 20, 30]) }}
Livewire Integration:
use Epessine\Axis\Livewire\AxisComponent;
public function render()
{
return view('livewire.chart', [
'chart' => Axis::line()
->title('Live Data')
->data($this->fetchData())
]);
}
{{ Axis::doughnut()
->title('User Distribution')
->labels(['Active', 'Inactive'])
->data([75, 25])
->colors(['#4CAF50', '#F44336'])
}}
Fetch Data:
$users = User::selectRaw('status, count(*) as count')
->groupBy('status')
->get();
Build Chart:
$chart = Axis::bar()
->title('User Status')
->labels($users->pluck('status'))
->data($users->pluck('count'))
->options(['responsive' => true]);
Render:
@livewire('dashboard', ['chart' => $chart])
Dynamic Updates:
public function updatedChartData()
{
$this->chart = Axis::line()
->data($this->fetchUpdatedData());
}
Reactive Components:
public function render()
{
return view('livewire.chart', [
'chart' => Axis::scatter()
->title('Real-time Metrics')
->data($this->getLiveData())
->options(['animation' => true])
]);
}
$chart = Axis::area()
->title('Monthly Revenue')
->labels(Carbon::parse('first day of this year')->format('M'))
->data(Revenue::query()
->selectRaw('DATE_FORMAT(created_at, "%m") as month, SUM(amount) as total')
->groupBy('month')
->pluck('total')
);
// Global config (config/axis.php)
'defaults' => [
'theme' => 'dark',
'colors' => ['#3498db', '#e74c3c', '#2ecc71', '#9b59b6'],
],
// Per-chart override
Axis::pie()->colors(['#ff9800', '#795548']);
Livewire Hydration Issues:
->toArray() on Eloquent collections.$this->chart = Axis::line()->data($this->processData());
CSS Conflicts:
Axis::options(['maintainAspectRatio' => false]);
config/axis.php:
'styles' => [
'path' => 'css/axis-custom.css',
],
Performance with Large Datasets:
->limit(100) or chunk queries:
$chart = Axis::line()
->data(YourModel::orderBy('created_at')->limit(100)->pluck('value'));
dd(Axis::line()->data([1,2,3])->toHtml());
Custom Chart Types:
Axis::extend('myChart', function($chart) {
$chart->type = 'myChart';
$chart->options['custom'] = true;
});
// Usage: Axis::myChart()->data([...])
Asset Overrides:
// config/axis.php
'assets' => [
'js' => 'path/to/custom.js',
'css' => 'path/to/custom.css',
],
Livewire Component Customization:
// app/Http/Livewire/ExtendedAxis.php
class ExtendedAxis extends AxisComponent
{
public $extraOption = '';
public function render()
{
$this->chart->options(['extra' => $this->extraOption]);
return parent::render();
}
}
Reuse Chart Builders:
$builder = Axis::line()->title('Reusable Chart');
// Usage in multiple places:
{{ $builder->data($data1) }}
{{ $builder->data($data2) }}
Conditional Rendering:
@if($hasData)
{{ Axis::bar()->data($data) }}
@else
<p>No data available</p>
@endif
Server-Side Processing:
For large datasets, use ->remoteData() to fetch data via AJAX:
Axis::line()
->remoteData('/api/data')
->options(['remoteUpdateInterval' => 5000]);
How can I help you explore Laravel packages today?