{"version":3,"file":"wheel.vue2.mjs","sources":["../../../components/wheel/wheel.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { Icon } from '@/components/icon/'\nimport { Renderer } from '@/components/renderer'\nimport { Scroll } from '@/components/scroll'\nimport { useFieldStore } from '@/components/form'\n\nimport { computed, nextTick, provide, ref, watch } from 'vue'\n\nimport WheelItem from './wheel-item.vue'\nimport { createStateProp, emitEvent, useIcons, useNameHelper, useProps } from '@vexip-ui/config'\nimport { useDisplay, useModifier, useRtl } from '@vexip-ui/hooks'\nimport { USE_TOUCH, boundRange, debounce, debounceMinor, toFalse } from '@vexip-ui/utils'\nimport { wheelProps } from './props'\nimport { WHEEL_STATE } from './symbol'\n\nimport type { ItemState, WheelOption, WheelSlots } from './symbol'\n\ndefineOptions({ name: 'Wheel' })\n\nconst { idFor, labelId, state, disabled, loading, validateField, getFieldValue, setFieldValue } =\n  useFieldStore<string | number>(() => wrapper.value?.focus())\n\nconst _props = defineProps(wheelProps)\nconst props = useProps('wheel', _props, {\n  state: createStateProp(state),\n  horizontal: false,\n  value: {\n    default: () => getFieldValue(),\n    static: true\n  },\n  candidate: {\n    default: 2,\n    validator: value => [0, 1, 2, 3].includes(value)\n  },\n  arrow: false,\n  pointer: USE_TOUCH,\n  options: {\n    default: () => [],\n    static: true\n  },\n  insertEmpty: false,\n  disabled: () => disabled.value,\n  loading: () => loading.value,\n  loadingLock: false,\n  disabledItem: {\n    default: toFalse,\n    isFunc: true\n  },\n  noTransition: false,\n  selectable: false,\n  slots: () => ({})\n})\n\nconst emit = defineEmits(['update:value'])\n\ndefineSlots<WheelSlots>()\n\nconst nh = useNameHelper('wheel')\nconst icons = useIcons()\n\nconst items = ref(new Set<ItemState>())\nconst currentActive = ref(0)\nconst wrapperWidth = ref(0)\nconst wrapperHeight = ref(0)\nconst targetWidth = ref(0)\nconst targetHeight = ref(0)\nconst horizontalPadding = ref(0)\nconst verticalPadding = ref(0)\nconst isInit = ref(false)\n\nconst { isRtl } = useRtl()\n\nconst wrapper = useDisplay(displayInit)\nconst scroll = ref<InstanceType<typeof Scroll>>()\n\nuseModifier({\n  target: wrapper,\n  passive: false,\n  onKeyDown: (event, modifier) => {\n    if (modifier.up || modifier.down) {\n      event.preventDefault()\n      modifier.up ? handlePrev() : handleNext()\n    }\n  }\n})\n\nconst normalizedOptions = computed<WheelOption[]>(() => {\n  const options = props.options.map(option => {\n    if (typeof option === 'object') {\n      const { value, label, disabled = false } = option\n\n      return {\n        value,\n        label: label || String(value),\n        disabled,\n        meta: option\n      }\n    }\n\n    return { value: option, label: String(option), disabled: false, meta: option }\n  })\n\n  if (props.insertEmpty) {\n    options.unshift({\n      value: '',\n      label: typeof props.insertEmpty === 'string' ? props.insertEmpty : '-',\n      disabled: false,\n      meta: ''\n    })\n  }\n\n  return options\n})\nconst itemList = computed(() => {\n  return Array.from(items.value)\n})\nconst readonly = computed(() => props.loading && props.loadingLock)\nconst className = computed(() => {\n  return [\n    nh.b(),\n    nh.bs('vars'),\n    nh.bm(props.horizontal ? 'horizontal' : 'vertical'),\n    {\n      [nh.bm('inherit')]: props.inherit,\n      [nh.bm(props.state)]: props.state !== 'default',\n      [nh.bm('disabled')]: props.disabled,\n      [nh.bm('readonly')]: readonly.value,\n      [nh.bm('loading')]: props.loading\n    }\n  ]\n})\nconst listStyle = computed(() => {\n  if (props.horizontal) {\n    return {\n      paddingRight: `${horizontalPadding.value}px`,\n      paddingLeft: `${horizontalPadding.value}px`\n    }\n  }\n\n  return {\n    paddingTop: `${verticalPadding.value}px`,\n    paddingBottom: `${verticalPadding.value}px`\n  }\n})\nconst maskStyle = computed(() => {\n  if (props.horizontal) {\n    return {\n      width: horizontalPadding.value ? `${horizontalPadding.value}px` : undefined\n    }\n  }\n\n  return {\n    height: verticalPadding.value ? `${verticalPadding.value}px` : undefined\n  }\n})\nconst borderStyle = computed(() => {\n  const style: Record<string, string> = {\n    inset: props.horizontal\n      ? `0 ${horizontalPadding.value - 1}px`\n      : `${verticalPadding.value - 1}px 0`\n  }\n\n  if (props.horizontal) {\n    style.borderTop = '0'\n    style.borderBottom = '0'\n  } else {\n    style.borderRight = '0'\n    style.borderLeft = '0'\n  }\n\n  return style\n})\nconst prevDisabled = computed(() => {\n  return (\n    props.disabled ||\n    !itemList.value.slice(0, currentActive.value).some(item => !isItemDisabled(item))\n  )\n})\nconst nextDisabled = computed(() => {\n  return (\n    props.disabled ||\n    currentActive.value >= itemList.value.length - 1 ||\n    !itemList.value\n      .slice(currentActive.value + 1, itemList.value.length)\n      .some(item => !isItemDisabled(item))\n  )\n})\nconst prevIcon = computed(() =>\n  props.horizontal\n    ? isRtl.value\n      ? icons.value.angleRight\n      : icons.value.angleLeft\n    : icons.value.angleUp\n)\nconst nextIcon = computed(() =>\n  props.horizontal\n    ? isRtl.value\n      ? icons.value.angleLeft\n      : icons.value.angleRight\n    : icons.value.angleDown\n)\n\nprovide(WHEEL_STATE, { increaseItem, decreaseItem })\n\nconst updateActive = debounceMinor(() => {\n  const active = Math.max(\n    itemList.value.findIndex(item => item.value === props.value),\n    0\n  )\n\n  setActive(findEnabledActive(active))\n})\n\nconst computeSize = debounceMinor(() => {\n  nextTick(() => {\n    const horizontal = props.horizontal\n\n    itemList.value.forEach(item => {\n      if (item && item.el) {\n        targetWidth.value = Math.max(targetWidth.value, item.el.offsetWidth)\n        targetHeight.value = Math.max(targetHeight.value, item.el.offsetHeight)\n      }\n    })\n\n    const candidate = props.candidate\n    const showCount = 2 * candidate + 1\n\n    wrapperWidth.value = showCount * targetWidth.value\n    wrapperHeight.value = showCount * targetHeight.value\n\n    horizontalPadding.value = candidate * targetWidth.value\n    verticalPadding.value = candidate * targetHeight.value\n\n    items.value.forEach(item => {\n      if (horizontal) {\n        item.width = targetWidth.value\n      } else {\n        item.height = targetHeight.value\n      }\n    })\n\n    setTimeout(() => {\n      scroll.value?.refresh()\n    }, 0)\n  })\n})\n\nconst refreshScroll = debounce(() => {\n  if (scroll.value) {\n    let targetXScroll = 0\n    let targetYScroll = 0\n\n    if (props.horizontal) {\n      targetXScroll = currentActive.value * targetWidth.value\n    } else {\n      targetYScroll = currentActive.value * targetHeight.value\n    }\n\n    nextTick(() => {\n      scroll.value?.scrollTo(targetXScroll, targetYScroll)\n    })\n  }\n}, 20)\n\nwatch(\n  () => props.value,\n  () => {\n    updateActive()\n    refreshScroll()\n  },\n  { immediate: true }\n)\nwatch(() => props.horizontal, computeSize)\nwatch(() => props.candidate, computeSize)\n\ndefineExpose({\n  idFor,\n  currentActive,\n  isInit,\n  targetWidth,\n  targetHeight,\n  wrapperWidth,\n  wrapperHeight,\n  itemList,\n  wrapper,\n  scroll,\n  refreshScroll,\n  focus: (options?: FocusOptions) => wrapper.value?.focus(options),\n  blur: () => wrapper.value?.blur()\n})\n\nfunction isItemDisabled(item: ItemState) {\n  return item.disabled || props.disabledItem(item.value, item.meta)\n}\n\nfunction setActive(active: number) {\n  if (currentActive.value === active) return\n\n  currentActive.value = active\n\n  const item = itemList.value[active]\n  const value = item?.value\n\n  refreshScroll()\n  emit('update:value', value)\n  setFieldValue(value)\n  emitEvent(props.onChange, value, item?.meta)\n  validateField()\n}\n\nfunction queryEnabledActive(active: number, step: number) {\n  step = step / Math.abs(step)\n\n  while (itemList.value[active].disabled) {\n    active += step\n\n    if (active < 0 || active >= itemList.value.length) break\n  }\n\n  return active\n}\n\nfunction findEnabledActive(active: number, sign = 1) {\n  if (itemList.value[active] && isItemDisabled(itemList.value[active])) {\n    active = queryEnabledActive(active, 1 * sign)\n\n    if (sign > 0 ? active >= itemList.value.length : active < 0) {\n      active = queryEnabledActive(boundRange(active, 0, itemList.value.length - 1), -1 * sign)\n\n      // 全禁用\n      if (sign > 0 ? active < 0 : active >= itemList.value.length) active = 0\n    }\n  }\n\n  return active\n}\n\nfunction increaseItem(item: ItemState) {\n  items.value.add(item)\n  computeSize()\n  updateActive()\n}\n\nfunction decreaseItem(item: ItemState) {\n  items.value.delete(item)\n  computeSize()\n  updateActive()\n}\n\nfunction displayInit() {\n  computeSize()\n  scroll.value?.refresh()\n\n  nextTick(() => {\n    isInit.value = true\n\n    updateActive()\n    refreshScroll()\n  })\n}\n\nfunction beforeScroll({ signX, signY }: { signX: number, signY: number }) {\n  if (props.disabled || readonly.value) return false\n\n  const sign = props.horizontal ? signX : signY\n\n  return !((sign < 0 && prevDisabled.value) || (sign > 0 && nextDisabled.value))\n}\n\nfunction handleScrollEnd({ clientX, clientY }: { clientX: number, clientY: number }) {\n  const aboutActive = props.horizontal ? clientX / targetWidth.value : clientY / targetHeight.value\n  const active = Math.round(aboutActive)\n\n  if (active !== currentActive.value) {\n    setActive(findEnabledActive(active, active > aboutActive ? 1 : -1))\n  } else {\n    refreshScroll()\n  }\n}\n\nfunction handleWheel({\n  sign,\n  clientX,\n  clientY\n}: {\n  clientX: number,\n  clientY: number,\n  sign: 1 | -1\n}) {\n  const active = props.horizontal\n    ? Math.round(clientX / targetWidth.value)\n    : Math.round(clientY / targetHeight.value)\n\n  setActive(findEnabledActive(active, sign))\n}\n\nfunction handlePrev() {\n  if (!prevDisabled.value) {\n    setActive(findEnabledActive(currentActive.value - 1, -1))\n\n    const item = itemList.value[currentActive.value]\n\n    emitEvent(props.onPrev, item?.value, item?.meta)\n  }\n}\n\nfunction handleNext() {\n  if (!nextDisabled.value) {\n    setActive(findEnabledActive(currentActive.value + 1, 1))\n\n    const item = itemList.value[currentActive.value]\n\n    emitEvent(props.onNext, item?.value, item?.meta)\n  }\n}\n\nfunction handleItemClick(option: WheelOption, index: number) {\n  if (props.selectable && !isItemDisabled(itemList.value[index])) {\n    setActive(index)\n  }\n\n  emitEvent(props.onItemClick, option.value, option.meta)\n}\n</script>\n\n<template>\n  <div\n    :id=\"idFor\"\n    ref=\"wrapper\"\n    :class=\"className\"\n    tabindex=\"0\"\n    role=\"group\"\n    :aria-labelledby=\"labelId\"\n  >\n    <div\n      v-if=\"props.arrow\"\n      ref=\"prevArrow\"\n      :class=\"[\n        nh.be('arrow'),\n        nh.bem('arrow', 'prev'),\n        prevDisabled ? nh.bem('arrow', 'disabled') : ''\n      ]\"\n      aria-hidden\n      @click=\"handlePrev\"\n    >\n      <Icon v-bind=\"prevIcon\"></Icon>\n    </div>\n    <div :class=\"nh.be('scroll')\" role=\"none\">\n      <Scroll\n        ref=\"scroll\"\n        inherit\n        :scroll-x=\"props.horizontal ? targetWidth * currentActive : 0\"\n        :scroll-y=\"props.horizontal ? 0 : targetHeight * currentActive\"\n        :width=\"props.horizontal ? wrapperWidth : '100%'\"\n        :height=\"props.horizontal ? '100%' : wrapperHeight\"\n        :pointer=\"props.pointer\"\n        :mode=\"props.horizontal ? 'horizontal' : 'vertical'\"\n        :delta-x=\"targetWidth\"\n        :delta-y=\"targetHeight\"\n        :on-before-scroll=\"beforeScroll\"\n        :no-transition=\"props.noTransition\"\n        @wheel=\"handleWheel\"\n        @scroll-end=\"handleScrollEnd\"\n      >\n        <ul ref=\"list\" :class=\"nh.be('list')\" :style=\"listStyle\">\n          <template v-if=\"isInit\">\n            <WheelItem\n              v-for=\"(option, index) in normalizedOptions\"\n              :key=\"index\"\n              :value=\"option.value\"\n              :disabled=\"option.disabled || props.disabledItem(option.value, option)\"\n              :active=\"currentActive === index\"\n              :meta=\"option.meta\"\n              @click=\"handleItemClick(option, index)\"\n            >\n              <slot :option=\"option\" :index=\"index\">\n                <Renderer :renderer=\"props.slots.default\" :data=\"{ option, index }\">\n                  {{ option.label }}\n                </Renderer>\n              </slot>\n            </WheelItem>\n          </template>\n        </ul>\n      </Scroll>\n      <template v-if=\"props.candidate\">\n        <div :class=\"[nh.be('mask'), nh.bem('mask', 'top')]\" :style=\"maskStyle\"></div>\n        <div :class=\"[nh.be('mask'), nh.bem('mask', 'bottom')]\" :style=\"maskStyle\"></div>\n      </template>\n      <div\n        :class=\"{\n          [nh.be('border')]: true,\n          [nh.bem('border', 'active')]: props.loading,\n          [nh.bem('border', 'vertical')]: props.horizontal\n        }\"\n        :style=\"borderStyle\"\n      ></div>\n    </div>\n    <div\n      v-if=\"props.arrow\"\n      ref=\"nextArrow\"\n      :class=\"[\n        nh.be('arrow'),\n        nh.bem('arrow', 'next'),\n        nextDisabled ? nh.bem('arrow', 'disabled') : ''\n      ]\"\n      aria-hidden\n      @click=\"handleNext\"\n    >\n      <Icon v-bind=\"nextIcon\"></Icon>\n    </div>\n  </div>\n</template>\n"],"names":["idFor","labelId","state","disabled","loading","validateField","getFieldValue","setFieldValue","useFieldStore","_a","wrapper","props","useProps","__props","createStateProp","value","USE_TOUCH","toFalse","emit","__emit","nh","useNameHelper","icons","useIcons","items","ref","currentActive","wrapperWidth","wrapperHeight","targetWidth","targetHeight","horizontalPadding","verticalPadding","isInit","isRtl","useRtl","useDisplay","displayInit","scroll","useModifier","event","modifier","handlePrev","handleNext","normalizedOptions","computed","options","option","label","itemList","readonly","className","listStyle","maskStyle","borderStyle","style","prevDisabled","item","isItemDisabled","nextDisabled","prevIcon","nextIcon","provide","WHEEL_STATE","increaseItem","decreaseItem","updateActive","debounceMinor","active","setActive","findEnabledActive","computeSize","nextTick","horizontal","candidate","showCount","refreshScroll","debounce","targetXScroll","targetYScroll","watch","__expose","emitEvent","queryEnabledActive","step","sign","boundRange","beforeScroll","signX","signY","handleScrollEnd","clientX","clientY","aboutActive","handleWheel","handleItemClick","index"],"mappings":"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"}