Skip to main content

Data display

Timeline code

Copy the implementation or inspect every file that belongs to this component unit.

resources/views/components/ui/timeline.blade.php

@props([])

@php
    /*
    | Vertical activity feed. Place one or more <x-ui.timeline.item> inside.
    |
    | Usage:
    |   <x-ui.timeline>
    |       <x-ui.timeline.item icon="check" variant="green" title="Deployed" time="2h ago">
    |           Shipped v2.1 to production.
    |       </x-ui.timeline.item>
    |   </x-ui.timeline>
    */
@endphp

<ul role="list" {{ $attributes->merge(['class' => 'space-y-0']) }}>
    {{ $slot }}
</ul>

resources/views/components/ui/timeline/item.blade.php

@props([
    'icon' => 'circle',
    'variant' => 'gray',
    'title' => null,
    'time' => null,
    'last' => false,
])

@php
    /*
    | A single event in <x-ui.timeline>. Set `last` on the final item to hide the
    | connecting line.
    |
    | variant: gray, brand, green, red, amber, blue
    |
    | Usage:
    |   <x-ui.timeline.item icon="rocket-launch" variant="brand" title="Launched" time="Mar 4">
    |       The new dashboard went live.
    |   </x-ui.timeline.item>
    */
    $variants = [
        'gray' => 'bg-gray-100 dark:bg-gray-800 text-gray-500 dark:text-gray-400',
        'brand' => 'bg-brand-50 dark:bg-brand-950/60 text-brand-600 dark:text-brand-400',
        'green' => 'bg-green-50 dark:bg-green-950/60 text-green-600 dark:text-green-400',
        'red' => 'bg-red-50 dark:bg-red-950/60 text-red-600 dark:text-red-400',
        'amber' => 'bg-amber-50 dark:bg-amber-950/60 text-amber-600 dark:text-amber-400',
        'blue' => 'bg-accent-50 dark:bg-accent-950/60 text-accent-600 dark:text-accent-400',
    ];
@endphp

<li {{ $attributes->merge(['class' => 'relative flex gap-4 pb-6 last:pb-0']) }}>
    @unless ($last)
        <span class="absolute start-4 top-9 -ms-px h-[calc(100%-1.5rem)] w-0.5 bg-gray-200 dark:bg-gray-800" aria-hidden="true"></span>
    @endunless

    <span class="relative z-10 flex h-8 w-8 shrink-0 items-center justify-center rounded-full ring-4 ring-white dark:ring-gray-900 {{ $variants[$variant] ?? $variants['gray'] }}">
        <x-ui.icon :name="$icon" weight="bold" size="sm" />
    </span>

    <div class="min-w-0 flex-1 pt-1">
        <div class="flex items-center justify-between gap-2">
            @if ($title)
                <p class="text-sm font-semibold text-gray-900 dark:text-white">{{ $title }}</p>
            @endif
            @if ($time)
                <time class="shrink-0 text-xs text-gray-400 dark:text-gray-500">{{ $time }}</time>
            @endif
        </div>
        @if (trim($slot) !== '')
            <div class="mt-0.5 text-sm text-gray-600 dark:text-gray-400">{{ $slot }}</div>
        @endif
    </div>
</li>