app/components/Navigation/breadcrumb.latte
{*
Breadcrumb — navigační drobečková mapa.
Parametry:
- $items (array) pole [['label' => 'Eshop', 'href' => '/eshop'], ['label' => 'Aktuální', 'href' => null], ...]
Poslední item bez href je označen jako --active.
- $homeIcon (bool) první item zobrazit jako home ikonu místo textu (default false)
- $homeHref (string) URL home linku (default '/')
- $homeLabel (string) aria-label pro home (default 'Úvod')
- $class (string|null) extra třída
*}
{var $items = $items ?? []}
{var $homeIcon = $homeIcon ?? false}
{var $homeHref = $homeHref ?? '/'}
{var $homeLabel = $homeLabel ?? 'Úvod'}
{var $class = $class ?? null}
<nav aria-label="Breadcrumb" class="breadcrumb-wrap{if $class} {$class}{/if}">
<ol class="breadcrumb">
{if $homeIcon}
<li class="breadcrumb__item">
<a href="{$homeHref}" class="breadcrumb__link breadcrumb__home" aria-label="{$homeLabel}">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<path d="M3 12 12 3l9 9"/>
<path d="M5 10v10h14V10"/>
</svg>
</a>
</li>
{/if}
{foreach $items as $item}
{var $isLast = $iterator->isLast()}
{var $hasLink = !empty($item['href']) && !$isLast}
<li class="breadcrumb__item{if $isLast} breadcrumb__item--active{/if}"
{if $isLast}aria-current="page"{/if}>
{if $hasLink}
<a href="{$item['href']}" class="breadcrumb__link">{$item['label']}</a>
{else}
<span>{$item['label']}</span>
{/if}
</li>
{/foreach}
</ol>
</nav>
resources/sass/components/_breadcrumb.scss
// ─── Configurable variables (override before @import) ──────────────────
$cgui-breadcrumb-font-size: 21px !default;
$cgui-breadcrumb-color: $cgui-color-text-gray !default;
$cgui-breadcrumb-color-active: $cgui-color-text !default;
$cgui-breadcrumb-link-color: $cgui-color-text-gray !default;
$cgui-breadcrumb-link-color-hover: $cgui-color-primary !default;
$cgui-breadcrumb-separator-color: $cgui-color-border !default;
$cgui-breadcrumb-gap: 10px !default;
$cgui-breadcrumb-padding: 16px 0 !default;
$cgui-breadcrumb-separator-content: '/' !default;
// ───────────────────────────────────────────────────────────────────────
.breadcrumb {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: $cgui-breadcrumb-gap;
padding: $cgui-breadcrumb-padding;
margin: 0;
list-style: none;
font-size: $cgui-breadcrumb-font-size;
color: $cgui-breadcrumb-color;
&__item {
display: inline-flex;
align-items: center;
gap: $cgui-breadcrumb-gap;
&:not(:last-child)::after {
content: $cgui-breadcrumb-separator-content;
color: $cgui-breadcrumb-separator-color;
margin: 0;
}
&--active {
color: $cgui-breadcrumb-color-active;
font-weight: 500;
}
}
&__link {
color: $cgui-breadcrumb-link-color;
text-decoration: none;
transition: color 0.15s;
&:hover,
&:focus {
color: $cgui-breadcrumb-link-color-hover;
text-decoration: underline;
}
}
&__home {
display: inline-flex;
align-items: center;
svg {
width: 22px;
height: 22px;
}
}
}