Skip to main content

Breadcrumbs

Saucebase provides a backend-driven breadcrumb system. Breadcrumbs are registered in PHP via the BreadcrumbServiceProvider and shared automatically to all Vue pages through Inertia props.

How It Works​

  1. Register breadcrumbs in BreadcrumbServiceProvider for each route
  2. Share automatically via HandleInertiaRequests middleware ($this->getBreadcrumbs())
  3. Access in Vue components via usePage().props.breadcrumbs

Registering Breadcrumbs​

Define breadcrumbs for your routes in the service provider:

app/Providers/BreadcrumbServiceProvider.php
use Diglactic\Breadcrumbs\Breadcrumbs;
use Diglactic\Breadcrumbs\Generator as BreadcrumbTrail;

// Dashboard
Breadcrumbs::for('dashboard', function (BreadcrumbTrail $trail) {
$trail->push('Dashboard', route('dashboard'));
});

// Settings > Profile
Breadcrumbs::for('settings.profile', function (BreadcrumbTrail $trail) {
$trail->parent('dashboard');
$trail->push('Settings', route('settings.index'));
$trail->push('Profile', route('settings.profile'));
});

Modules can register their own breadcrumbs in their service providers following the same pattern.

Frontend Usage​

Breadcrumbs are available as an Inertia shared prop on every page:

<script setup lang="ts">
import { Link, usePage } from '@inertiajs/vue3';

const breadcrumbs = computed(() => usePage().props.breadcrumbs ?? []);
</script>

<template>
<nav v-if="breadcrumbs.length" aria-label="Breadcrumb" class="flex items-center space-x-2 text-sm">
<template v-for="(item, index) in breadcrumbs" :key="index">
<span v-if="index > 0" class="text-gray-400">/</span>
<Link
v-if="item.url && index < breadcrumbs.length - 1"
:href="item.url"
class="text-gray-500 hover:text-gray-700"
>
{{ item.title }}
</Link>
<span v-else class="text-gray-900 font-medium" aria-current="page">
{{ item.title }}
</span>
</template>
</nav>
</template>

What's Next?​

  • Navigation — Primary site navigation system
  • Routing — Laravel and Inertia routing patterns