@fileverse-dev/fortune-react 1.2.51 → 1.2.52

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -12,6 +12,7 @@ export var useSmoothScroll = function useSmoothScroll(scrollContainerRef) {
12
12
  return window.devicePixelRatio || 1;
13
13
  };
14
14
  }
15
+ console.log("handleScroll called 6.2");
15
16
  var queuedXPixels = 0;
16
17
  var queuedYPixels = 0;
17
18
  var animationFrameId = 0;
@@ -39,13 +40,11 @@ export var useSmoothScroll = function useSmoothScroll(scrollContainerRef) {
39
40
  setContext(function (ctx) {
40
41
  removeEditingComment(ctx, refs.globalCache);
41
42
  });
42
- var functionDetailsElement = document.getElementById("function-details");
43
- var formulaSearchElement = document.getElementById("luckysheet-formula-search-c-p");
44
- var isPointerOverFunctionDetails = functionDetailsElement === null || functionDetailsElement === void 0 ? void 0 : functionDetailsElement.matches(":hover");
45
- var isPointerOverFormulaSearch = formulaSearchElement === null || formulaSearchElement === void 0 ? void 0 : formulaSearchElement.matches(":hover");
46
43
  var isPointerInSearchDialog = !!((_b = (_a = refs === null || refs === void 0 ? void 0 : refs.globalCache) === null || _a === void 0 ? void 0 : _a.searchDialog) === null || _b === void 0 ? void 0 : _b.mouseEnter);
47
44
  var hasFilterContextMenuOpen = context.filterContextMenu != null;
48
- if (functionDetailsElement && isPointerOverFunctionDetails || formulaSearchElement && isPointerOverFormulaSearch || isPointerInSearchDialog || hasFilterContextMenuOpen) {
45
+ var functionDetailAvailable = event.target.closest('.luckysheet-formula-help-content');
46
+ var formulaSearchAvailable = event.target.closest('.luckysheet-formula-search-c-p');
47
+ if (isPointerInSearchDialog || hasFilterContextMenuOpen || !!functionDetailAvailable || !!formulaSearchAvailable) {
49
48
  return;
50
49
  }
51
50
  event.preventDefault();
@@ -69,38 +68,104 @@ export var useSmoothScroll = function useSmoothScroll(scrollContainerRef) {
69
68
  var gestureStartClientY = 0;
70
69
  var lastPointerClientX = 0;
71
70
  var lastPointerClientY = 0;
71
+ var lastMoveTime = 0;
72
+ var velocityX = 0;
73
+ var velocityY = 0;
74
+ var momentumAnimationId = 0;
75
+ var scrollDirection = "none";
72
76
  var PAN_DISTANCE_THRESHOLD_PX = 8;
77
+ var FRICTION = 0.95;
78
+ var MIN_VELOCITY = 0.5;
79
+ var VELOCITY_MULTIPLIER = 2.6;
80
+ var DIRECTION_LOCK_THRESHOLD = 1.5;
81
+ function stopMomentum() {
82
+ if (momentumAnimationId) {
83
+ cancelAnimationFrame(momentumAnimationId);
84
+ momentumAnimationId = 0;
85
+ }
86
+ velocityX = 0;
87
+ velocityY = 0;
88
+ }
89
+ function applyMomentum() {
90
+ if (Math.abs(velocityX) < MIN_VELOCITY && Math.abs(velocityY) < MIN_VELOCITY) {
91
+ stopMomentum();
92
+ return;
93
+ }
94
+ var scale = getPixelScale();
95
+ var momentumX = -velocityX * scale;
96
+ var momentumY = -velocityY * scale;
97
+ if (scrollDirection === "vertical") {
98
+ momentumX = 0;
99
+ } else if (scrollDirection === "horizontal") {
100
+ momentumY = 0;
101
+ }
102
+ scrollHandler(momentumX, momentumY);
103
+ velocityX *= FRICTION;
104
+ velocityY *= FRICTION;
105
+ momentumAnimationId = requestAnimationFrame(applyMomentum);
106
+ }
73
107
  function onPointerDown(pointerEvent) {
74
108
  if (pointerEvent.pointerType !== "touch" && pointerEvent.pointerType !== "pen") return;
109
+ stopMomentum();
75
110
  isScrolling = false;
111
+ scrollDirection = "none";
76
112
  gestureStartClientX = pointerEvent.clientX;
77
113
  lastPointerClientX = pointerEvent.clientX;
78
114
  gestureStartClientY = pointerEvent.clientY;
79
115
  lastPointerClientY = pointerEvent.clientY;
116
+ lastMoveTime = performance.now();
117
+ velocityX = 0;
118
+ velocityY = 0;
80
119
  containerEl.setPointerCapture(pointerEvent.pointerId);
81
120
  }
82
121
  function onPointerMove(pointerEvent) {
83
122
  if (pointerEvent.pointerType !== "touch" && pointerEvent.pointerType !== "pen") return;
123
+ var currentTime = performance.now();
124
+ var deltaTime = Math.max(1, currentTime - lastMoveTime);
84
125
  var deltaXSinceLastMove = pointerEvent.clientX - lastPointerClientX;
85
126
  var deltaYSinceLastMove = pointerEvent.clientY - lastPointerClientY;
127
+ velocityX = deltaXSinceLastMove / deltaTime * 16;
128
+ velocityY = deltaYSinceLastMove / deltaTime * 16;
86
129
  lastPointerClientX = pointerEvent.clientX;
87
130
  lastPointerClientY = pointerEvent.clientY;
131
+ lastMoveTime = currentTime;
88
132
  if (!isScrolling) {
89
133
  var totalXFromGestureStart = lastPointerClientX - gestureStartClientX;
90
134
  var totalYFromGestureStart = lastPointerClientY - gestureStartClientY;
91
135
  if (totalXFromGestureStart * totalXFromGestureStart + totalYFromGestureStart * totalYFromGestureStart < PAN_DISTANCE_THRESHOLD_PX * PAN_DISTANCE_THRESHOLD_PX) {
92
136
  return;
93
137
  }
138
+ var absX = Math.abs(totalXFromGestureStart);
139
+ var absY = Math.abs(totalYFromGestureStart);
140
+ if (absX > absY * DIRECTION_LOCK_THRESHOLD) {
141
+ scrollDirection = "horizontal";
142
+ } else if (absY > absX * DIRECTION_LOCK_THRESHOLD) {
143
+ scrollDirection = "vertical";
144
+ } else {
145
+ scrollDirection = "none";
146
+ }
94
147
  isScrolling = true;
95
148
  }
96
149
  pointerEvent.preventDefault();
97
150
  var scale = getPixelScale();
98
- scrollHandler(-deltaXSinceLastMove * scale, -deltaYSinceLastMove * scale);
151
+ var scrollX = -deltaXSinceLastMove * scale * VELOCITY_MULTIPLIER;
152
+ var scrollY = -deltaYSinceLastMove * scale * VELOCITY_MULTIPLIER;
153
+ if (scrollDirection === "vertical") {
154
+ scrollX = 0;
155
+ } else if (scrollDirection === "horizontal") {
156
+ scrollY = 0;
157
+ }
158
+ scrollHandler(scrollX, scrollY);
99
159
  }
100
160
  function onPointerUp(e) {
101
161
  try {
102
162
  containerEl.releasePointerCapture(e.pointerId);
103
163
  } catch (_a) {}
164
+ if (isScrolling) {
165
+ if (Math.abs(velocityX) > MIN_VELOCITY || Math.abs(velocityY) > MIN_VELOCITY) {
166
+ momentumAnimationId = requestAnimationFrame(applyMomentum);
167
+ }
168
+ }
104
169
  isScrolling = false;
105
170
  }
106
171
  containerEl.addEventListener("pointerdown", onPointerDown, {
@@ -112,6 +177,7 @@ export var useSmoothScroll = function useSmoothScroll(scrollContainerRef) {
112
177
  containerEl.addEventListener("pointerup", onPointerUp);
113
178
  containerEl.addEventListener("pointercancel", onPointerUp);
114
179
  return function () {
180
+ stopMomentum();
115
181
  containerEl.removeEventListener("pointerdown", onPointerDown);
116
182
  containerEl.removeEventListener("pointermove", onPointerMove);
117
183
  containerEl.removeEventListener("pointerup", onPointerUp);
@@ -19,6 +19,7 @@ var useSmoothScroll = exports.useSmoothScroll = function useSmoothScroll(scrollC
19
19
  return window.devicePixelRatio || 1;
20
20
  };
21
21
  }
22
+ console.log("handleScroll called 6.2");
22
23
  var queuedXPixels = 0;
23
24
  var queuedYPixels = 0;
24
25
  var animationFrameId = 0;
@@ -46,13 +47,11 @@ var useSmoothScroll = exports.useSmoothScroll = function useSmoothScroll(scrollC
46
47
  setContext(function (ctx) {
47
48
  (0, _fortuneCore.removeEditingComment)(ctx, refs.globalCache);
48
49
  });
49
- var functionDetailsElement = document.getElementById("function-details");
50
- var formulaSearchElement = document.getElementById("luckysheet-formula-search-c-p");
51
- var isPointerOverFunctionDetails = functionDetailsElement === null || functionDetailsElement === void 0 ? void 0 : functionDetailsElement.matches(":hover");
52
- var isPointerOverFormulaSearch = formulaSearchElement === null || formulaSearchElement === void 0 ? void 0 : formulaSearchElement.matches(":hover");
53
50
  var isPointerInSearchDialog = !!((_b = (_a = refs === null || refs === void 0 ? void 0 : refs.globalCache) === null || _a === void 0 ? void 0 : _a.searchDialog) === null || _b === void 0 ? void 0 : _b.mouseEnter);
54
51
  var hasFilterContextMenuOpen = context.filterContextMenu != null;
55
- if (functionDetailsElement && isPointerOverFunctionDetails || formulaSearchElement && isPointerOverFormulaSearch || isPointerInSearchDialog || hasFilterContextMenuOpen) {
52
+ var functionDetailAvailable = event.target.closest('.luckysheet-formula-help-content');
53
+ var formulaSearchAvailable = event.target.closest('.luckysheet-formula-search-c-p');
54
+ if (isPointerInSearchDialog || hasFilterContextMenuOpen || !!functionDetailAvailable || !!formulaSearchAvailable) {
56
55
  return;
57
56
  }
58
57
  event.preventDefault();
@@ -76,38 +75,104 @@ var useSmoothScroll = exports.useSmoothScroll = function useSmoothScroll(scrollC
76
75
  var gestureStartClientY = 0;
77
76
  var lastPointerClientX = 0;
78
77
  var lastPointerClientY = 0;
78
+ var lastMoveTime = 0;
79
+ var velocityX = 0;
80
+ var velocityY = 0;
81
+ var momentumAnimationId = 0;
82
+ var scrollDirection = "none";
79
83
  var PAN_DISTANCE_THRESHOLD_PX = 8;
84
+ var FRICTION = 0.95;
85
+ var MIN_VELOCITY = 0.5;
86
+ var VELOCITY_MULTIPLIER = 2.6;
87
+ var DIRECTION_LOCK_THRESHOLD = 1.5;
88
+ function stopMomentum() {
89
+ if (momentumAnimationId) {
90
+ cancelAnimationFrame(momentumAnimationId);
91
+ momentumAnimationId = 0;
92
+ }
93
+ velocityX = 0;
94
+ velocityY = 0;
95
+ }
96
+ function applyMomentum() {
97
+ if (Math.abs(velocityX) < MIN_VELOCITY && Math.abs(velocityY) < MIN_VELOCITY) {
98
+ stopMomentum();
99
+ return;
100
+ }
101
+ var scale = getPixelScale();
102
+ var momentumX = -velocityX * scale;
103
+ var momentumY = -velocityY * scale;
104
+ if (scrollDirection === "vertical") {
105
+ momentumX = 0;
106
+ } else if (scrollDirection === "horizontal") {
107
+ momentumY = 0;
108
+ }
109
+ scrollHandler(momentumX, momentumY);
110
+ velocityX *= FRICTION;
111
+ velocityY *= FRICTION;
112
+ momentumAnimationId = requestAnimationFrame(applyMomentum);
113
+ }
80
114
  function onPointerDown(pointerEvent) {
81
115
  if (pointerEvent.pointerType !== "touch" && pointerEvent.pointerType !== "pen") return;
116
+ stopMomentum();
82
117
  isScrolling = false;
118
+ scrollDirection = "none";
83
119
  gestureStartClientX = pointerEvent.clientX;
84
120
  lastPointerClientX = pointerEvent.clientX;
85
121
  gestureStartClientY = pointerEvent.clientY;
86
122
  lastPointerClientY = pointerEvent.clientY;
123
+ lastMoveTime = performance.now();
124
+ velocityX = 0;
125
+ velocityY = 0;
87
126
  containerEl.setPointerCapture(pointerEvent.pointerId);
88
127
  }
89
128
  function onPointerMove(pointerEvent) {
90
129
  if (pointerEvent.pointerType !== "touch" && pointerEvent.pointerType !== "pen") return;
130
+ var currentTime = performance.now();
131
+ var deltaTime = Math.max(1, currentTime - lastMoveTime);
91
132
  var deltaXSinceLastMove = pointerEvent.clientX - lastPointerClientX;
92
133
  var deltaYSinceLastMove = pointerEvent.clientY - lastPointerClientY;
134
+ velocityX = deltaXSinceLastMove / deltaTime * 16;
135
+ velocityY = deltaYSinceLastMove / deltaTime * 16;
93
136
  lastPointerClientX = pointerEvent.clientX;
94
137
  lastPointerClientY = pointerEvent.clientY;
138
+ lastMoveTime = currentTime;
95
139
  if (!isScrolling) {
96
140
  var totalXFromGestureStart = lastPointerClientX - gestureStartClientX;
97
141
  var totalYFromGestureStart = lastPointerClientY - gestureStartClientY;
98
142
  if (totalXFromGestureStart * totalXFromGestureStart + totalYFromGestureStart * totalYFromGestureStart < PAN_DISTANCE_THRESHOLD_PX * PAN_DISTANCE_THRESHOLD_PX) {
99
143
  return;
100
144
  }
145
+ var absX = Math.abs(totalXFromGestureStart);
146
+ var absY = Math.abs(totalYFromGestureStart);
147
+ if (absX > absY * DIRECTION_LOCK_THRESHOLD) {
148
+ scrollDirection = "horizontal";
149
+ } else if (absY > absX * DIRECTION_LOCK_THRESHOLD) {
150
+ scrollDirection = "vertical";
151
+ } else {
152
+ scrollDirection = "none";
153
+ }
101
154
  isScrolling = true;
102
155
  }
103
156
  pointerEvent.preventDefault();
104
157
  var scale = getPixelScale();
105
- scrollHandler(-deltaXSinceLastMove * scale, -deltaYSinceLastMove * scale);
158
+ var scrollX = -deltaXSinceLastMove * scale * VELOCITY_MULTIPLIER;
159
+ var scrollY = -deltaYSinceLastMove * scale * VELOCITY_MULTIPLIER;
160
+ if (scrollDirection === "vertical") {
161
+ scrollX = 0;
162
+ } else if (scrollDirection === "horizontal") {
163
+ scrollY = 0;
164
+ }
165
+ scrollHandler(scrollX, scrollY);
106
166
  }
107
167
  function onPointerUp(e) {
108
168
  try {
109
169
  containerEl.releasePointerCapture(e.pointerId);
110
170
  } catch (_a) {}
171
+ if (isScrolling) {
172
+ if (Math.abs(velocityX) > MIN_VELOCITY || Math.abs(velocityY) > MIN_VELOCITY) {
173
+ momentumAnimationId = requestAnimationFrame(applyMomentum);
174
+ }
175
+ }
111
176
  isScrolling = false;
112
177
  }
113
178
  containerEl.addEventListener("pointerdown", onPointerDown, {
@@ -119,6 +184,7 @@ var useSmoothScroll = exports.useSmoothScroll = function useSmoothScroll(scrollC
119
184
  containerEl.addEventListener("pointerup", onPointerUp);
120
185
  containerEl.addEventListener("pointercancel", onPointerUp);
121
186
  return function () {
187
+ stopMomentum();
122
188
  containerEl.removeEventListener("pointerdown", onPointerDown);
123
189
  containerEl.removeEventListener("pointermove", onPointerMove);
124
190
  containerEl.removeEventListener("pointerup", onPointerUp);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fileverse-dev/fortune-react",
3
- "version": "1.2.51",
3
+ "version": "1.2.52",
4
4
  "main": "lib/index.js",
5
5
  "types": "lib/index.d.ts",
6
6
  "module": "es/index.js",
@@ -16,7 +16,7 @@
16
16
  "tsc": "tsc"
17
17
  },
18
18
  "dependencies": {
19
- "@fileverse-dev/fortune-core": "1.2.51",
19
+ "@fileverse-dev/fortune-core": "1.2.52",
20
20
  "@fileverse/ui": "^4.1.7-patch-40",
21
21
  "@tippyjs/react": "^4.2.6",
22
22
  "@types/regenerator-runtime": "^0.13.6",