Skip to content

BreadCrumb Component Code

Dependencies

This component requires:

  • Vue 3 with Composition API
  • Optional: i18n library if using translation keys

Full Component Code

vue
<script setup>
import { useRouter } from "vue-router";

const router = useRouter();

const props = defineProps({
  items: {
    type: Array,
    default: () => [],
  },
  separator: {
    type: String,
    default: "/",
  },
  gap: {
    type: String,
    default: "0.5rem",
  },
});

const handleClick = (item) => {
  if (!item.disabled && item.to) {
    router.push(item.to);
  }
};
</script>

<template>
  <div class="breadcrumb-container" :style="{ gap: gap }">
    <div
      v-for="(item, index) in items"
      :key="index"
      class="breadcrumb-item"
      :style="{ gap: gap }"
    >
      <span
        class="label"
        :class="{ disabled: item.disabled }"
        @click="handleClick(item)"
      >
        {{ item.label }}
      </span>
      <slot v-if="index < items.length - 1" name="separator">
        <span class="breadcrumb-separator">{{ separator }}</span>
      </slot>
    </div>
  </div>
</template>

<style lang="scss" scoped>
.breadcrumb-container {
  display: flex;
  align-items: center;
  width: 100%;

  .breadcrumb-item {
    display: flex;
    align-items: center;

    .label {
      cursor: pointer;
      transition: color 0.3s ease;
      font-size: 0.875rem;
      font-weight: 500;
      user-select: none;

      &.disabled {
        cursor: default;
        color: #888;
        opacity: 0.8;
        pointer-events: none;
      }

      &:not(.disabled):hover {
        color: #000;
      }
    }

    .breadcrumb-separator {
      margin: 0 0.25rem;
      color: #999;
    }
  }
}
</style>