vexip-ui
Version:
A Vue 3 UI library, Highly customizability, full TypeScript, performance pretty good
1 lines • 8.7 kB
Source Map (JSON)
{"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 alive: 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 alive: toRef(props, 'alive'),\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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"}