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
- Register breadcrumbs in
BreadcrumbServiceProviderfor each route - Share automatically via
HandleInertiaRequestsmiddleware ($this->getBreadcrumbs()) - 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