{"version":3,"file":"breadcrumb.vue2.mjs","sources":["../../../components/breadcrumb/breadcrumb.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { BreadcrumbItem } from '@/components/breadcrumb-item'\nimport { Renderer } from '@/components/renderer'\n\nimport { computed, provide, reactive, toRef, watch } from 'vue'\n\nimport { emitEvent, useNameHelper, useProps } from '@vexip-ui/config'\nimport { callIfFunc, debounceMinor, isNull } from '@vexip-ui/utils'\nimport { breadcrumbProps } from './props'\nimport { BREADCRUMB_STATE } from './symbol'\n\nimport type {\n  BreadcrumbItemState,\n  BreadcrumbOptions,\n  BreadcrumbSlots,\n  BreadcrumbState,\n  SelectEvent\n} from './symbol'\n\ndefineOptions({ name: 'Breadcrumb' })\n\nconst _props = defineProps(breadcrumbProps)\nconst props = useProps('breadcrumb', _props, {\n  separator: '/',\n  border: false,\n  options: {\n    default: () => [],\n    static: true\n  },\n  router: null,\n  slots: () => ({})\n})\n\nconst slots = defineSlots<BreadcrumbSlots>()\n\nconst nh = useNameHelper('breadcrumb')\nconst itemStates = new Set<BreadcrumbItemState>()\n\nconst className = computed(() => {\n  return {\n    [nh.b()]: true,\n    [nh.bs('vars')]: true,\n    [nh.bm('inherit')]: props.inherit,\n    [nh.bm('border')]: props.border\n  }\n})\nconst normalizedOptions = computed(() => {\n  if (props.router && !props.options?.length) {\n    const matched = props.router.currentRoute.value.matched\n    const options: BreadcrumbOptions[] = []\n\n    for (const route of matched) {\n      const meta = (route.meta || {}) as any\n\n      if (meta.menu === false) {\n        continue\n      }\n\n      options.push({\n        label: meta.label || route.path,\n        name: meta.name || route.name\n      })\n    }\n\n    return options\n  }\n\n  return props.options.map(option => {\n    if (typeof option === 'string') {\n      return { label: option }\n    }\n\n    return option\n  })\n})\n\nconst refreshLabels = debounceMinor(() => {\n  Array.from(itemStates).forEach((item, index) => {\n    if (isNull(item.label)) {\n      item.label = index + 1\n    }\n  })\n})\n\nconst state: BreadcrumbState = reactive({\n  separator: toRef(props, 'separator'),\n  separatorRenderer: null,\n  increaseItem,\n  decreaseItem,\n  handleSelect,\n  refreshLabels,\n  handleSeparatorClick\n})\n\nprovide(BREADCRUMB_STATE, state)\n\nwatch(\n  [() => slots.separator, () => props.slots.separator],\n  ([slotValue, propValue]) => {\n    state.separatorRenderer = slotValue\n      ? data => slotValue(data)\n      : propValue\n        ? data => propValue(data)\n        : null\n  },\n  { immediate: true }\n)\n\nfunction increaseItem(item: BreadcrumbItemState) {\n  itemStates.add(item)\n  refreshLabels()\n}\n\nfunction decreaseItem(item: BreadcrumbItemState) {\n  itemStates.delete(item)\n  refreshLabels()\n}\n\nfunction handleSelect(label: string | number) {\n  emitEvent(props.onSelect as SelectEvent, label)\n}\n\nfunction handleSeparatorClick(label: string | number) {\n  emitEvent(props.onSeparatorClick as SelectEvent, label)\n}\n</script>\n\n<template>\n  <ol :class=\"className\">\n    <slot>\n      <Renderer :renderer=\"props.slots.default\">\n        <BreadcrumbItem\n          v-for=\"(option, index) in normalizedOptions\"\n          :key=\"option.label\"\n          :label=\"option.label\"\n        >\n          <slot name=\"item\" :option=\"option\" :index=\"index\">\n            <Renderer :renderer=\"props.slots.item\" :data=\"{ option, index }\">\n              {{ option.name ? callIfFunc(option.name) : option.label }}\n            </Renderer>\n          </slot>\n        </BreadcrumbItem>\n      </Renderer>\n    </slot>\n  </ol>\n</template>\n"],"names":["props","useProps","__props","slots","_useSlots","nh","useNameHelper","itemStates","className","computed","normalizedOptions","_a","matched","options","route","meta","option","refreshLabels","debounceMinor","item","index","isNull","state","reactive","toRef","increaseItem","decreaseItem","handleSelect","handleSeparatorClick","provide","BREADCRUMB_STATE","watch","slotValue","propValue","data","label","emitEvent"],"mappings":";;;;;;;;;;;;;;AAsBM,UAAAA,IAAQC,EAAS,cADRC,GAC8B;AAAA,MAC3C,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,SAAS,MAAM,CAAC;AAAA,QAChB,QAAQ;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,MACR,OAAO,OAAO,CAAC;AAAA,IAAA,CAChB,GAEKC,IAAQC,EAAA,GAERC,IAAKC,EAAc,YAAY,GAC/BC,wBAAiB,IAAyB,GAE1CC,IAAYC,EAAS,OAClB;AAAA,MACL,CAACJ,EAAG,EAAE,CAAC,GAAG;AAAA,MACV,CAACA,EAAG,GAAG,MAAM,CAAC,GAAG;AAAA,MACjB,CAACA,EAAG,GAAG,SAAS,CAAC,GAAGL,EAAM;AAAA,MAC1B,CAACK,EAAG,GAAG,QAAQ,CAAC,GAAGL,EAAM;AAAA,IAC3B,EACD,GACKU,IAAoBD,EAAS,MAAM;;AACvC,UAAIT,EAAM,UAAU,GAACW,IAAAX,EAAM,YAAN,QAAAW,EAAe,SAAQ;AAC1C,cAAMC,IAAUZ,EAAM,OAAO,aAAa,MAAM,SAC1Ca,IAA+B,CAAC;AAEtC,mBAAWC,KAASF,GAAS;AACrB,gBAAAG,IAAQD,EAAM,QAAQ,CAAC;AAEzB,UAAAC,EAAK,SAAS,MAIlBF,EAAQ,KAAK;AAAA,YACX,OAAOE,EAAK,SAASD,EAAM;AAAA,YAC3B,MAAMC,EAAK,QAAQD,EAAM;AAAA,UAAA,CAC1B;AAAA,QAAA;AAGI,eAAAD;AAAA,MAAA;AAGF,aAAAb,EAAM,QAAQ,IAAI,CAAUgB,MAC7B,OAAOA,KAAW,WACb,EAAE,OAAOA,EAAO,IAGlBA,CACR;AAAA,IAAA,CACF,GAEKC,IAAgBC,EAAc,MAAM;AACxC,YAAM,KAAKX,CAAU,EAAE,QAAQ,CAACY,GAAMC,MAAU;AAC1C,QAAAC,EAAOF,EAAK,KAAK,MACnBA,EAAK,QAAQC,IAAQ;AAAA,MACvB,CACD;AAAA,IAAA,CACF,GAEKE,IAAyBC,EAAS;AAAA,MACtC,WAAWC,EAAMxB,GAAO,WAAW;AAAA,MACnC,mBAAmB;AAAA,MACnB,cAAAyB;AAAA,MACA,cAAAC;AAAA,MACA,cAAAC;AAAA,MACA,eAAAV;AAAA,MACA,sBAAAW;AAAA,IAAA,CACD;AAED,IAAAC,EAAQC,GAAkBR,CAAK,GAE/BS;AAAA,MACE,CAAC,MAAM5B,EAAM,WAAW,MAAMH,EAAM,MAAM,SAAS;AAAA,MACnD,CAAC,CAACgC,GAAWC,CAAS,MAAM;AACpB,QAAAX,EAAA,oBAAoBU,IACtB,CAAAE,MAAQF,EAAUE,CAAI,IACtBD,IACE,CAAAC,MAAQD,EAAUC,CAAI,IACtB;AAAA,MACR;AAAA,MACA,EAAE,WAAW,GAAK;AAAA,IACpB;AAEA,aAAST,EAAaN,GAA2B;AAC/C,MAAAZ,EAAW,IAAIY,CAAI,GACLF,EAAA;AAAA,IAAA;AAGhB,aAASS,EAAaP,GAA2B;AAC/C,MAAAZ,EAAW,OAAOY,CAAI,GACRF,EAAA;AAAA,IAAA;AAGhB,aAASU,EAAaQ,GAAwB;AAClC,MAAAC,EAAApC,EAAM,UAAyBmC,CAAK;AAAA,IAAA;AAGhD,aAASP,EAAqBO,GAAwB;AAC1C,MAAAC,EAAApC,EAAM,kBAAiCmC,CAAK;AAAA,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}