{"version":3,"file":"picker.class.mjs","sources":["../../src/picker/picker.class.ts"],"sourcesContent":["import { preventDefault } from '../shared/dom';\nimport { usePrefixClass } from '../hooks/useClass';\nimport { PickerColumn, PickerWheelConfig } from './type';\nimport { KeysType } from '../common';\nimport { findIndexOfEnabledOption, limitNumberInRange } from './utils';\n\nconst classPrefix = usePrefixClass();\n\nexport interface PickerOptions {\n  defaultIndex?: number;\n  keys?: KeysType;\n  defaultPickerColumns?: PickerColumn;\n  el: HTMLElement | HTMLDivElement | HTMLUListElement;\n  onChange: (index: number) => void;\n  wheelConfig: Required<PickerWheelConfig>;\n}\n\nconst quartEaseOut = function (t: number, b: number, c: number, d: number) {\n  let tempT = t;\n  return -c * ((tempT = tempT / d - 1) * tempT * tempT * tempT - 1) + b;\n};\n\n/**\n * constant var\n */\nexport const DEFAULT_ITEM_HEIGHT = 40;\nconst DEFAULT_HOLDER_HEIGHT = 200;\n\n/**\n * @name picker\n * @description 阻尼参数来源iscroll5，灵感来自mui.picker\n * @param {[HTMLDivElement]} el   [picker-item的DOM元素]\n * @param {[Function]} onChange   [发生change事件时候的回调]\n * @param {[Number]} defaultIndex [picker-item开始的索引值]\n */\nclass Picker {\n  holder: HTMLElement | HTMLUListElement;\n\n  options: PickerOptions;\n\n  list: HTMLUListElement | null = null;\n\n  elementItems: HTMLLIElement[] = [];\n\n  curIndex = 0;\n\n  itemClassName = '';\n\n  itemSelectedClassName = '';\n\n  itemHeight: number = DEFAULT_ITEM_HEIGHT;\n\n  lastMoveTime = 0;\n\n  lastMoveStart = 0;\n\n  stopInertiaMove = false;\n\n  startY = 0;\n\n  isPicking = false;\n\n  offsetYOfStartBound = 0;\n\n  offsetYOfEndBound = 0;\n\n  offsetY = 0;\n\n  offsetYOfStart = 0;\n\n  offsetYOfEnd = 0;\n\n  curValue: string | null = '';\n\n  onChange: (index: number) => void;\n\n  itemGroupHeight = DEFAULT_HOLDER_HEIGHT;\n\n  indicatorOffset = 0;\n\n  pickerColumns: PickerColumn;\n\n  // wheelConfig 实例属性\n  inertiaDuration: number;\n\n  bounceDuration: number;\n\n  transitionDuration: number;\n\n  inertiaTimeThreshold: number;\n\n  inertiaDistanceThreshold: number;\n\n  boundOffset: number;\n\n  clickDistanceThreshold: number;\n\n  clickTimeThreshold: number;\n\n  // ResizeObserver 用于监听尺寸变化\n  private resizeObserver: ResizeObserver | null = null;\n\n  // 标记是否已初始化完成高度计算\n  private heightInitialized = false;\n\n  constructor(options: PickerOptions) {\n    if (!options.el) throw new Error('options el needed!');\n    this.holder = options.el;\n    this.pickerColumns = options.defaultPickerColumns;\n    this.options = options;\n    this.onChange = options.onChange;\n\n    // 直接使用传入的 wheelConfig（已由组件合并好默认值）\n    const { wheelConfig } = options;\n    this.inertiaDuration = wheelConfig.inertiaDuration;\n    this.bounceDuration = wheelConfig.bounceDuration;\n    this.transitionDuration = wheelConfig.transitionDuration;\n    this.inertiaTimeThreshold = wheelConfig.inertiaTimeThreshold;\n    this.inertiaDistanceThreshold = wheelConfig.inertiaDistanceThreshold;\n    this.boundOffset = wheelConfig.boundOffset;\n    this.clickDistanceThreshold = wheelConfig.clickDistanceThreshold;\n    this.clickTimeThreshold = wheelConfig.clickTimeThreshold;\n\n    this.init();\n  }\n\n  init(): void {\n    // 惯性滚动\n    this.initScrollParams();\n    // item 样式\n    this.setSelectedClassName();\n    // 绑定事件\n    this.bindEvent();\n    // 监听尺寸变化，适配 popup 场景和 CSS 变量动态生效\n    this.observeResize();\n  }\n\n  /**\n   * @description 使用 ResizeObserver 监听元素尺寸变化\n   */\n  observeResize(): void {\n    if (typeof ResizeObserver === 'undefined') return;\n\n    this.resizeObserver = new ResizeObserver((entries) => {\n      for (const entry of entries) {\n        const { height } = entry.contentRect;\n        // 当高度从 0 变为有效值，或高度发生变化时，重新计算\n        if (height > 0) {\n          const newItemHeight = this.getFirstItemHeight();\n          const newGroupHeight = this.holder.parentElement?.offsetHeight || DEFAULT_HOLDER_HEIGHT;\n\n          // 只有当高度有效且发生变化时才更新\n          if (\n            newItemHeight > 0 &&\n            newGroupHeight > 0 &&\n            (newItemHeight !== this.itemHeight || newGroupHeight !== this.itemGroupHeight || !this.heightInitialized)\n          ) {\n            this.heightInitialized = true;\n            this.recalculateHeights();\n            // 重新定位到当前选中项\n            this.updateIndex(this.curIndex, { isChange: false, duration: 0 });\n          }\n        }\n      }\n    });\n\n    // 同时观察 holder 和其父元素\n    this.resizeObserver.observe(this.holder);\n    if (this.holder.parentElement) {\n      this.resizeObserver.observe(this.holder.parentElement);\n    }\n  }\n\n  /**\n   * @description 获取第一个 li 元素的高度，优先使用已缓存的 elementItems\n   */\n  private getFirstItemHeight(): number {\n    const firstItem = this.elementItems[0] || this.holder.querySelector('li');\n    return firstItem?.offsetHeight || DEFAULT_ITEM_HEIGHT;\n  }\n\n  /**\n   * @description 获取所有的列表DOM元素，并重新计算高度相关参数\n   */\n  updateItems(): void {\n    this.elementItems = [...this.holder.querySelectorAll('li')];\n    // 重新获取实际高度，以支持 CSS 变量和 postcss-pxtorem 等场景\n    this.recalculateHeights();\n  }\n\n  /**\n   * @description 重新计算高度相关参数，适配 CSS 变量和 rem 转换场景\n   */\n  recalculateHeights(): void {\n    const newItemHeight = this.getFirstItemHeight();\n    const newGroupHeight = this.holder.parentElement?.offsetHeight || DEFAULT_HOLDER_HEIGHT;\n\n    // 高度发生变化时更新所有相关参数\n    if (newItemHeight !== this.itemHeight || newGroupHeight !== this.itemGroupHeight) {\n      this.itemHeight = newItemHeight;\n      this.itemGroupHeight = newGroupHeight;\n      this.indicatorOffset = this.itemGroupHeight / 2 - this.itemHeight / 2;\n    }\n\n    // 边界值需要根据当前 elementItems 数量计算，每次都更新\n    const itemLen = this.elementItems.length;\n    if (itemLen > 0) {\n      this.offsetYOfStart = this.indicatorOffset;\n      this.offsetYOfEnd = this.indicatorOffset - (itemLen - 1) * this.itemHeight;\n      this.offsetYOfStartBound = this.indicatorOffset + this.boundOffset;\n      this.offsetYOfEndBound = this.indicatorOffset - (itemLen - 1) * this.itemHeight - this.boundOffset;\n    }\n  }\n\n  /**\n   * @description 初始化滚动参数\n   */\n  initScrollParams(): void {\n    this.list = this.holder as HTMLUListElement;\n    this.elementItems = [...this.holder.querySelectorAll('li')];\n    this.itemGroupHeight = this.holder.parentElement?.offsetHeight || DEFAULT_HOLDER_HEIGHT;\n    this.itemHeight = this.getFirstItemHeight();\n    this.indicatorOffset = this.itemGroupHeight / 2 - this.itemHeight / 2;\n\n    // 设置 class 名称\n    this.itemClassName = `${classPrefix.value}-picker-item__item`;\n    this.itemSelectedClassName = `${classPrefix.value}-picker-item__item--active`;\n\n    // 处理默认选中索引\n    let curIndex = findIndexOfEnabledOption(this.pickerColumns, this.options.defaultIndex || 0, this.options.keys);\n    if (curIndex !== (this.options.defaultIndex || 0)) {\n      this.onChange(curIndex);\n    }\n\n    this.curValue = this.elementItems[curIndex]?.textContent;\n\n    // 使用 Object.defineProperty 确保 curIndex 变化时同步更新 curValue\n    Object.defineProperty(this, 'curIndex', {\n      set: (value: number) => {\n        curIndex = value;\n        this.curValue = this.elementItems[value]?.textContent;\n      },\n      get() {\n        return curIndex;\n      },\n    });\n\n    // 计算初始偏移和边界值\n    const itemLen = this.elementItems.length;\n    const startOffsetY = this.indicatorOffset - this.curIndex * this.itemHeight;\n    this.setOffsetY(startOffsetY);\n    this.offsetYOfStart = this.indicatorOffset;\n    this.offsetYOfEnd = this.indicatorOffset - (itemLen - 1) * this.itemHeight;\n    this.offsetYOfStartBound = this.indicatorOffset + this.boundOffset;\n    this.offsetYOfEndBound = this.indicatorOffset - (itemLen - 1) * this.itemHeight - this.boundOffset;\n  }\n\n  bindEvent(): void {\n    this.holder.addEventListener('touchstart', (e) => this.touchStartHandler(e as TouchEvent), false);\n    this.holder.addEventListener('touchmove', (e) => this.touchMoveHandler(e as TouchEvent), false);\n    this.holder.addEventListener('touchend', (e) => this.touchEndHandler(e as TouchEvent), false);\n    this.holder.addEventListener('touchcancel', (e) => this.touchEndHandler(e as TouchEvent), false);\n  }\n\n  touchStartHandler(event: TouchEvent): void {\n    preventDefault(event, false);\n    this.isPicking = true;\n    if (!this.holder) return;\n    if (this.list) this.list.style.transition = '';\n    this.startY = event.changedTouches[0].pageY;\n    this.offsetYOfStart = this.offsetY;\n    // 更新惯性参数\n    this.updateInertiaParams(event, true);\n  }\n\n  getCount() {\n    return this.pickerColumns.length;\n  }\n\n  getRange(thresholdA = 0, thresholdB = 3) {\n    const min = -(this.getCount() - thresholdA) * this.itemHeight;\n    const max = thresholdB * this.itemHeight;\n    return { min, max };\n  }\n\n  touchMoveHandler(event: TouchEvent): void {\n    preventDefault(event, false);\n    if (!this.isPicking || !this.holder) return;\n\n    const endY = event.changedTouches[0].pageY;\n    const dragRange = endY - this.startY;\n    this.updateInertiaParams(event, false);\n\n    const { min, max } = this.getRange(0, 5);\n    const moveOffsetY = limitNumberInRange(this.offsetYOfStart + dragRange, min, max);\n    this.setOffsetY(moveOffsetY);\n  }\n\n  touchEndHandler(event: TouchEvent): void {\n    preventDefault(event, false);\n    this.isPicking = false;\n    if (!this.holder) return;\n    const point = event.changedTouches[0];\n    const nowTime = event.timeStamp || Date.now();\n\n    const moveTime = nowTime - this.lastMoveTime;\n    const distance = point.pageY - this.lastMoveStart;\n    const absDistance = Math.abs(distance);\n\n    if (absDistance < this.clickDistanceThreshold && moveTime < this.clickTimeThreshold) {\n      // 点选操作，查找 li\n      const li = (event.target as HTMLElement).closest('li');\n      if (li && this.list?.contains(li)) {\n        const childElements = this.list.children;\n        const rawIndex = Array.from(childElements).indexOf(li);\n        const enabledIndex = findIndexOfEnabledOption(this.pickerColumns, rawIndex, this.options.keys);\n        this.updateIndex(enabledIndex, { isChange: true });\n        return;\n      }\n    }\n    // 超出一定时间不再惯性滚动\n    if (moveTime > this.inertiaTimeThreshold || absDistance < this.inertiaDistanceThreshold || !this.inertiaDuration) {\n      this.stopInertiaMove = false;\n      this.endScroll();\n      return;\n    }\n\n    const speed = Math.abs(distance / moveTime);\n    let dist = this.offsetY + (speed / 0.005) * (distance < 0 ? -1 : 1);\n    const { min, max } = this.getRange(3, 2);\n    dist = limitNumberInRange(dist, min, max);\n    if (dist === 0) {\n      this.stopInertiaMove = false;\n      this.endScroll();\n      return;\n    }\n    this.scrollDist(this.offsetY, dist, this.inertiaDuration);\n  }\n\n  /**\n   * @description 更新惯性参数\n   * @param event\n   * @param isStart\n   */\n  updateInertiaParams(event: TouchEvent, isStart: boolean): void {\n    const point = event.changedTouches[0];\n    if (isStart) {\n      this.lastMoveStart = point.pageY;\n      this.lastMoveTime = event.timeStamp || Date.now();\n    }\n    this.stopInertiaMove = true;\n  }\n\n  /**\n   * @description 根据计算的物理惯性距离滚动\n   * @param startOffsetY\n   * @param dist\n   * @param duration\n   */\n  scrollDist(startOffsetY: number, dist: number, duration: number): void {\n    this.stopInertiaMove = false;\n    let start: any = null;\n    const inertiaMove = (timestamp: number) => {\n      if (this.stopInertiaMove) {\n        return;\n      }\n      if (!start) start = timestamp;\n      const progress = timestamp - start;\n      const newOffsetY = quartEaseOut(progress, startOffsetY, dist - startOffsetY, duration);\n      this.setOffsetY(newOffsetY);\n      if (progress > duration || newOffsetY > this.offsetYOfStartBound || newOffsetY < this.offsetYOfEndBound) {\n        this.endScroll();\n      } else {\n        window.requestAnimationFrame(inertiaMove);\n      }\n    };\n    window.requestAnimationFrame(inertiaMove);\n  }\n\n  /**\n   * @description 更新picker，一般当数据变化需要ui更新的时候调用\n   */\n  update(options?: any): void {\n    this.updateItems();\n    const targetIndex = this.elementItems.findIndex((el: HTMLLIElement) => el.textContent === this.curValue);\n    const updateIndex = targetIndex === -1 ? 0 : targetIndex;\n    this.updateIndex(updateIndex, options);\n  }\n\n  /**\n   * @description 更新picker索引，数据变化时调用\n   * @param index\n   * @param duration\n   */\n  updateIndex(index: number, options?: any): void {\n    const realOptions = {\n      duration: this.transitionDuration,\n      isChange: true,\n      ...options,\n    };\n    this.curIndex = index;\n    this.setSelectedClassName();\n    const moveOffsetY = this.indicatorOffset - index * this.itemHeight;\n    if (this.list) {\n      this.list.style.transform = `translate(0,${moveOffsetY}px) translateZ(0)`;\n      this.list.style.transitionDuration = `${realOptions.duration}ms`;\n      this.list.style.transitionTimingFunction = 'ease-out';\n    }\n\n    this.offsetY = moveOffsetY;\n    this.offsetYOfStart = moveOffsetY;\n    realOptions.isChange && this.onChange(index);\n  }\n\n  /**\n   * @description 更新数据源\n   */\n  updateOptions(options: PickerColumn = []): void {\n    this.pickerColumns = options;\n  }\n\n  /**\n   * @description 获取当前索引\n   */\n  getCurIndex(): number {\n    return this.curIndex;\n  }\n\n  /**\n   * @description 设置item样式\n   */\n  setSelectedClassName(): void {\n    const regClass = new RegExp(this.itemClassName, 'i');\n    const regSelected = new RegExp(this.itemSelectedClassName, 'i');\n    this.elementItems.forEach((item, i) => {\n      const tempItem = item;\n      const itemClass = tempItem.className;\n      if (itemClass === '' || !itemClass) {\n        tempItem.className = this.itemClassName;\n      } else {\n        if (!regClass.test(itemClass)) {\n          tempItem.classList.add(this.itemClassName);\n        }\n        if (regSelected.test(itemClass)) {\n          tempItem.classList.remove(this.itemSelectedClassName);\n        }\n      }\n      if (this.curIndex === i) {\n        tempItem.classList.add(this.itemSelectedClassName);\n      }\n    });\n  }\n\n  /**\n   * 设置当前picker的滚动位移\n   * @param offsetY\n   */\n  setOffsetY(offsetY: number): void {\n    this.offsetY = offsetY;\n    if (this.list) {\n      this.list.style.transform = `translate3d(0, ${offsetY}px, 0)`;\n    }\n  }\n\n  /**\n   * @description 结束滚动时的回调\n   */\n  endScroll(): void {\n    if (this.stopInertiaMove) return;\n\n    // 设置回弹动画\n    if (this.list) {\n      this.list.style.transition = `${this.bounceDuration}ms ease-out`;\n    }\n\n    let curIndex = 0;\n    if (this.offsetY > this.offsetYOfStartBound) {\n      curIndex = 0;\n    } else if (this.offsetY < this.offsetYOfEndBound) {\n      curIndex = this.elementItems.length - 1;\n    } else {\n      curIndex = -Math.round((this.offsetY - this.indicatorOffset) / this.itemHeight);\n      curIndex = Math.max(0, Math.min(curIndex, this.elementItems.length - 1));\n    }\n\n    curIndex = findIndexOfEnabledOption(this.pickerColumns, curIndex, this.options.keys);\n\n    const offsetY = this.indicatorOffset - curIndex * this.itemHeight;\n    this.setOffsetY(offsetY);\n\n    if (curIndex !== this.curIndex) {\n      this.curIndex = curIndex;\n      this.setSelectedClassName();\n      this.onChange(this.curIndex);\n    }\n  }\n\n  destroy(): void {\n    // 清理 ResizeObserver\n    if (this.resizeObserver) {\n      this.resizeObserver.disconnect();\n      this.resizeObserver = null;\n    }\n    // @ts-ignore: TODO\n    delete this.holder;\n  }\n}\n\nexport default Picker;\n"],"names":["classPrefix","usePrefixClass","quartEaseOut","t","b","c","d","tempT","DEFAULT_ITEM_HEIGHT","DEFAULT_HOLDER_HEIGHT","Picker","options","_classCallCheck","_defineProperty","el","Error","holder","pickerColumns","defaultPickerColumns","onChange","wheelConfig","inertiaDuration","bounceDuration","transitionDuration","inertiaTimeThreshold","inertiaDistanceThreshold","boundOffset","clickDistanceThreshold","clickTimeThreshold","init","_createClass","key","value","initScrollParams","setSelectedClassName","bindEvent","observeResize","_this","ResizeObserver","resizeObserver","entries","_iterator","_createForOfIteratorHelper","_step","s","n","done","entry","height","contentRect","_this$holder$parentEl","newItemHeight","getFirstItemHeight","newGroupHeight","parentElement","offsetHeight","itemHeight","itemGroupHeight","heightInitialized","recalculateHeights","updateIndex","curIndex","isChange","duration","err","e","f","observe","firstItem","elementItems","querySelector","updateItems","querySelectorAll","_this$holder$parentEl2","indicatorOffset","itemLen","length","offsetYOfStart","offsetYOfEnd","offsetYOfStartBound","offsetYOfEndBound","_this$holder$parentEl3","_this$elementItems$cu","_this2","list","itemClassName","concat","itemSelectedClassName","findIndexOfEnabledOption","defaultIndex","keys","curValue","textContent","Object","defineProperty","set","_this2$elementItems$v","get","startOffsetY","setOffsetY","_this3","addEventListener","touchStartHandler","touchMoveHandler","touchEndHandler","event","preventDefault","isPicking","style","transition","startY","changedTouches","pageY","offsetY","updateInertiaParams","getCount","getRange","thresholdA","arguments","undefined","thresholdB","min","max","endY","dragRange","_this$getRange","moveOffsetY","limitNumberInRange","point","nowTime","timeStamp","Date","now","moveTime","lastMoveTime","distance","lastMoveStart","absDistance","Math","abs","_this$list","li","target","closest","contains","childElements","children","rawIndex","Array","from","indexOf","enabledIndex","stopInertiaMove","endScroll","speed","dist","_this$getRange2","scrollDist","isStart","_this4","start","inertiaMove","timestamp","progress","newOffsetY","window","requestAnimationFrame","update","_this5","targetIndex","findIndex","index","realOptions","_objectSpread","transform","transitionTimingFunction","updateOptions","getCurIndex","_this6","regClass","RegExp","regSelected","forEach","item","i","tempItem","itemClass","className","test","classList","add","remove","round","destroy","disconnect"],"mappings":"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"}