Analytics - v1.0.0-beta1

Stats Cards

The Stats Cards component displays key analytics metrics in a card grid format with optional comparison to the previous period.

Basic Usage

<livewire:artisanpack-analytics::stats-cards />

Properties

Property Type Default Description
dateRangePreset ?string 'last7days' Date range preset
siteId ?int null Site ID for multi-tenant
showComparison bool true Show comparison percentages
visibleStats array See below Which stats to display

Default Visible Stats

['pageviews', 'visitors', 'sessions', 'bounce_rate']

Usage Examples

With Comparison Disabled

<livewire:artisanpack-analytics::stats-cards
    :show-comparison="false"
/>

Custom Stats Selection

<livewire:artisanpack-analytics::stats-cards
    :visible-stats="['visitors', 'sessions', 'avg_session_duration']"
/>

With Date Range

<livewire:artisanpack-analytics::stats-cards
    date-range-preset="thisMonth"
/>

Available Stats

Key Label Format Description
pageviews Page Views Number Total page views
visitors Visitors Number Unique visitors
sessions Sessions Number Total sessions
bounce_rate Bounce Rate Percentage Single-page sessions
avg_session_duration Avg. Session Duration Duration Average time on site
pages_per_session Pages / Session Decimal Average pages viewed
realtime_visitors Active Now Number Current active visitors

Stats Data Structure

$this->stats = [
    'pageviews' => 1234,
    'visitors' => 567,
    'sessions' => 890,
    'bounce_rate' => 45.5,
    'avg_session_duration' => 180, // seconds
    'pages_per_session' => 2.3,
    'comparison' => [
        'pageviews' => [
            'value' => 1100,    // Previous period value
            'change' => 12.2,   // Percentage change
        ],
        'visitors' => [
            'value' => 500,
            'change' => 13.4,
        ],
        // ...
    ],
];

Methods

loadStats()

Refresh the statistics data:

$this->loadStats();

refreshData()

Called when refresh-analytics-widgets event is dispatched:

// Automatically listens for this event
$this->dispatch('refresh-analytics-widgets');

formatStatValue()

Format a stat value for display:

$this->formatStatValue(1234, 'number');     // "1,234"
$this->formatStatValue(45.5, 'percentage'); // "45.5%"
$this->formatStatValue(180, 'duration');    // "3m 0s"
$this->formatStatValue(2.3, 'decimal');     // "2.3"

Customization

Publishing Views

php artisan vendor:publish --tag=analytics-views

Edit resources/views/vendor/artisanpack-analytics/livewire/widgets/stats-cards.blade.php.

Custom Card Layout

Example custom view structure:

<div class="grid grid-cols-2 md:grid-cols-4 gap-4">
    @foreach ($visibleStats as $statKey)
        @php
            $config = $this->getStatCardsConfig()[$statKey] ?? null;
            if (!$config) continue;
            $value = $stats[$config['key']] ?? 0;
            $comparison = $stats['comparison'][$config['key']] ?? null;
        @endphp

        <div class="card bg-base-100 shadow">
            <div class="card-body">
                <h3 class="text-sm text-gray-500">{{ $config['label'] }}</h3>
                <p class="text-2xl font-bold">
                    {{ $this->formatStatValue($value, $config['format']) }}
                </p>
                @if ($showComparison && $comparison)
                    <span class="{{ $comparison['change'] >= 0 ? 'text-success' : 'text-error' }}">
                        {{ $comparison['change'] > 0 ? '+' : '' }}{{ $comparison['change'] }}%
                    </span>
                @endif
            </div>
        </div>
    @endforeach
</div>

Events

Listens For

Event Action
refresh-analytics-widgets Calls refreshData()

Integration Examples

In a Custom Dashboard

<div class="space-y-6">
    {{-- Stats at the top --}}
    <livewire:artisanpack-analytics::stats-cards
        :visible-stats="['visitors', 'pageviews', 'bounce_rate']"
    />

    {{-- Chart below --}}
    <livewire:artisanpack-analytics::visitors-chart />
</div>

With Custom Refresh Button

<div>
    <button
        wire:click="$dispatch('refresh-analytics-widgets')"
        class="btn btn-primary"
    >
        Refresh Stats
    </button>

    <livewire:artisanpack-analytics::stats-cards />
</div>