Newer
Older
vmk-ui-kit / src / js / components / breadcrumbs.js
/**
 * Breadcrumbs browser helper.
 */

const VALID_MODIFIERS = ["inverted", "sm", "lg"];

function itemHtml(label, { href = "", active = false, hover = false } = {}) {
  const tag = href ? "a" : "span";
  const attrs = href ? `href="${href}"` : "";
  const classes = active ? "is-active" : hover ? "is-hover" : "";
  return `<li class="breadcrumb-item ${classes}"><${tag} ${attrs}>${label}</${tag}></li>`;
}

function separatorHtml(char = "/") {
  return `<li class="breadcrumb-separator" aria-hidden="true">${char}</li>`;
}

function collapseHtml() {
  return `<li class="breadcrumb-item"><button type="button" class="breadcrumb-collapse">...</button></li>`;
}

function listHtml(items, { modifier = "", separator = "/", collapsed = false } = {}) {
  const modifierClass = VALID_MODIFIERS.includes(modifier) ? `breadcrumb-${modifier}` : "";
  const parts = [];
  items.forEach((item, index) => {
    const isLast = index === items.length - 1;
    if (collapsed && index > 0 && !isLast && items.length > 4 && index === 1) {
      parts.push(collapseHtml());
      parts.push(separatorHtml(separator));
      return;
    }
    if (collapsed && index > 0 && !isLast && items.length > 4) return;
    parts.push(itemHtml(item.label, { href: item.href, active: isLast, hover: item.hover }));
    if (!isLast) parts.push(separatorHtml(separator));
  });

  return `<nav aria-label="Breadcrumb"><ol class="breadcrumb ${modifierClass}">${parts.join("")}</ol></nav>`;
}

function html(options = {}) {
  const { items = [], modifier = "", separator = "/", collapsed = false } = options;
  return listHtml(items, { modifier, separator, collapsed });
}

function create(options = {}) {
  const { items = [], modifier = "", separator = "/", collapsed = false } = options;
  const wrapper = document.createElement("div");
  wrapper.innerHTML = listHtml(items, { modifier, separator, collapsed });
  return wrapper.firstElementChild;
}

const Breadcrumbs = { html, create, itemHtml, separatorHtml };

export default Breadcrumbs;
export { html, create, itemHtml, separatorHtml };