use-tab-nav-touch.js 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
  2. require("../../../../_virtual/_rolldown/runtime.js");
  3. const require_position = require("../../../../utils/dom/position.js");
  4. let lodash_unified = require("lodash-unified");
  5. let vue = require("vue");
  6. //#region ../../packages/components/tabs/src/composables/use-tab-nav-touch.ts
  7. const TOUCH_SCROLL_THRESHOLD = 5;
  8. const useTabNavTouch = ({ scrollable, navOffset, navSize, navContainerSize, isHorizontal }) => {
  9. const isTouchScrolling = (0, vue.ref)(false);
  10. const maxOffset = (0, vue.computed)(() => Math.max(navSize.value - navContainerSize.value, 0));
  11. let touchState;
  12. let isMainAxisTouch;
  13. const handleTouchStart = (event) => {
  14. if (!scrollable.value || event.touches.length !== 1) return;
  15. const { clientX, clientY } = require_position.getClientXY(event);
  16. touchState = {
  17. startX: clientX,
  18. startY: clientY,
  19. startOffset: navOffset.value
  20. };
  21. isMainAxisTouch = void 0;
  22. };
  23. const handleTouchMove = (event) => {
  24. if (!touchState || !scrollable.value) return;
  25. if (event.touches.length !== 1) {
  26. handleTouchEnd();
  27. return;
  28. }
  29. const { clientX, clientY } = require_position.getClientXY(event);
  30. const deltaX = touchState.startX - clientX;
  31. const deltaY = touchState.startY - clientY;
  32. const mainAxisDelta = isHorizontal.value ? deltaX : deltaY;
  33. const crossAxisDelta = isHorizontal.value ? deltaY : deltaX;
  34. const mainAxisDistance = Math.abs(mainAxisDelta);
  35. const crossAxisDistance = Math.abs(crossAxisDelta);
  36. if ((0, lodash_unified.isUndefined)(isMainAxisTouch)) {
  37. if (Math.max(mainAxisDistance, crossAxisDistance) <= TOUCH_SCROLL_THRESHOLD) return;
  38. isMainAxisTouch = mainAxisDistance > crossAxisDistance;
  39. }
  40. if (!isMainAxisTouch) return;
  41. const nextOffset = (0, lodash_unified.clamp)(touchState.startOffset + mainAxisDelta, 0, maxOffset.value);
  42. if (maxOffset.value <= 0 || nextOffset === navOffset.value || !event.cancelable) return;
  43. event.preventDefault();
  44. isTouchScrolling.value = true;
  45. navOffset.value = nextOffset;
  46. };
  47. const handleTouchEnd = () => {
  48. touchState = void 0;
  49. isMainAxisTouch = void 0;
  50. isTouchScrolling.value = false;
  51. };
  52. return {
  53. isTouchScrolling,
  54. handleTouchStart,
  55. handleTouchMove,
  56. handleTouchEnd
  57. };
  58. };
  59. //#endregion
  60. exports.useTabNavTouch = useTabNavTouch;
  61. //# sourceMappingURL=use-tab-nav-touch.js.map