{"version":3,"file":"collapse.vue2.cjs","sources":["../../../components/collapse/collapse.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n  computed,\n  nextTick,\n  onMounted,\n  provide,\n  reactive,\n  ref,\n  toRef,\n  watch,\n  watchEffect,\n} from 'vue'\n\nimport { emitEvent, useNameHelper, useProps } from '@vexip-ui/config'\nimport { useModifier } from '@vexip-ui/hooks'\nimport { debounceMinor, isNull, removeArrayItem } from '@vexip-ui/utils'\nimport { collapseProps } from './props'\nimport { COLLAPSE_STATE } from './symbol'\n\nimport type { CollapseArrowType, PanelState } from './symbol'\n\ndefineOptions({ name: 'Collapse' })\n\nconst _props = defineProps(collapseProps)\nconst props = useProps('collapse', _props, {\n  expanded: {\n    default: null,\n    static: true,\n  },\n  card: false,\n  accordion: false,\n  arrowType: {\n    default: 'right' as CollapseArrowType,\n    validator: (value: CollapseArrowType) => ['right', 'left', 'none'].includes(value),\n  },\n  ghost: false,\n})\n\nconst emit = defineEmits(['update:expanded'])\n\nconst nh = useNameHelper('collapse')\nconst panelStates = reactive(new Set<PanelState>())\nconst currentExpanded = ref<(string | number)[]>([])\n\nconst { target: wrapper } = useModifier({\n  passive: false,\n  onKeyDown: (event, modifier) => {\n    if (modifier.left || modifier.right) {\n      if (!wrapper.value || ![...panelStates].find(({ tab }) => tab === event.target)) return\n\n      const tabs = Array.from(wrapper.value.querySelectorAll(nh.cbe('header'))) as HTMLElement[]\n\n      if (tabs.length < 1) return\n\n      event.preventDefault()\n      event.stopPropagation()\n\n      const index = document.activeElement\n        ? tabs.findIndex(panel => panel === document.activeElement)\n        : -1\n\n      if (~index) {\n        const target = tabs[(index + (modifier.left ? -1 : 1) + tabs.length) % tabs.length]\n\n        target?.focus()\n      }\n    } else if (modifier.escape) {\n      event.preventDefault()\n      event.stopPropagation()\n\n      clearExpanded()\n    }\n  },\n})\n\nconst className = computed(() => {\n  return [\n    nh.b(),\n    nh.bs('vars'),\n    nh.bm(`arrow-${props.arrowType}`),\n    {\n      [nh.bm('inherit')]: props.inherit,\n      [nh.bm('card')]: props.card,\n      [nh.bm('ghost')]: !props.card && props.ghost,\n    },\n  ]\n})\n\nconst refreshLabels = debounceMinor(() => {\n  Array.from(panelStates.values()).forEach((item, index) => {\n    if (isNull(item.label)) {\n      item.label = index + 1\n    }\n  })\n\n  if (panelStates.size) {\n    for (const panel of panelStates) {\n      if (currentExpanded.value.includes(panel.label)) {\n        panel.expanded = true\n      } else if (panel.expanded) {\n        expandPanel(panel.label, true)\n      }\n    }\n  }\n})\n\nprovide(\n  COLLAPSE_STATE,\n  reactive({\n    arrowType: toRef(props, 'arrowType'),\n    registerPanel,\n    unregisterPanel,\n    expandPanel,\n    refreshLabels,\n  }),\n)\n\nwatchEffect(() => {\n  const rawExpanded = props.expanded\n  const expanded =\n    props.accordion && Array.isArray(rawExpanded)\n      ? rawExpanded[0]\n      : rawExpanded || rawExpanded === 0\n        ? rawExpanded\n        : []\n\n  currentExpanded.value = Array.isArray(expanded) ? Array.from(expanded) : [expanded]\n})\n\nonMounted(() => {\n  nextTick(updateItemExpanded)\n\n  watch(currentExpanded, (prev, next) => {\n    if (!isSameExpanded(prev, next)) {\n      updateItemExpanded()\n    }\n  })\n})\n\ndefineExpose({ currentExpanded, wrapper })\n\nfunction registerPanel(panel: PanelState) {\n  panelStates.add(panel)\n\n  refreshLabels()\n}\n\nfunction unregisterPanel(panel: PanelState) {\n  panelStates.delete(panel)\n  expandPanel(panel.label, false)\n  refreshLabels()\n}\n\nfunction isSameExpanded(prev: (string | number)[], next: (string | number)[]) {\n  const prevSet = new Set(prev)\n\n  if (prevSet.size !== new Set(next).size) return false\n\n  return next.every(item => prevSet.has(item))\n}\n\nfunction expandPanel(label: string | number, expanded: boolean) {\n  if (!label && label !== 0) return\n\n  if (props.accordion) {\n    currentExpanded.value = expanded ? [label] : []\n  } else {\n    if (expanded) {\n      currentExpanded.value.push(label)\n    } else {\n      removeArrayItem(currentExpanded.value, label)\n    }\n  }\n\n  emitChangeEvent()\n  updateItemExpanded()\n}\n\nfunction clearExpanded() {\n  if (!currentExpanded.value.length) return\n\n  currentExpanded.value = []\n\n  emitChangeEvent()\n  updateItemExpanded()\n}\n\nfunction emitChangeEvent() {\n  emit('update:expanded', currentExpanded.value)\n  emitEvent(props.onChange, currentExpanded.value)\n}\n\nfunction updateItemExpanded() {\n  panelStates.forEach(panel => {\n    panel.setExpanded(currentExpanded.value.includes(panel.label))\n  })\n}\n</script>\n\n<template>\n  <div\n    ref=\"wrapper\"\n    :class=\"className\"\n    role=\"tablist\"\n    tabindex=\"-1\"\n  >\n    <slot></slot>\n  </div>\n</template>\n"],"names":["_props","__props","props","useProps","value","emit","__emit","nh","useNameHelper","panelStates","reactive","currentExpanded","ref","wrapper","useModifier","event","modifier","tab","tabs","index","panel","target","clearExpanded","className","computed","refreshLabels","debounceMinor","item","isNull","expandPanel","provide","COLLAPSE_STATE","toRef","registerPanel","unregisterPanel","watchEffect","rawExpanded","expanded","onMounted","nextTick","updateItemExpanded","watch","prev","next","isSameExpanded","__expose","prevSet","label","removeArrayItem","emitChangeEvent","emitEvent","_createElementBlock","_renderSlot","_ctx"],"mappings":"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"}