@sunsama/event-calendar 0.13.0 → 0.13.2
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.
- package/lib/commonjs/components/zoom-provider.js +21 -18
- package/lib/commonjs/components/zoom-provider.js.map +1 -1
- package/lib/commonjs/hooks/use-auto-scroll.js +7 -6
- package/lib/commonjs/hooks/use-auto-scroll.js.map +1 -1
- package/lib/module/components/zoom-provider.js +22 -19
- package/lib/module/components/zoom-provider.js.map +1 -1
- package/lib/module/hooks/use-auto-scroll.js +7 -6
- package/lib/module/hooks/use-auto-scroll.js.map +1 -1
- package/lib/typescript/commonjs/components/zoom-provider.d.ts.map +1 -1
- package/lib/typescript/commonjs/hooks/use-auto-scroll.d.ts.map +1 -1
- package/lib/typescript/module/components/zoom-provider.d.ts.map +1 -1
- package/lib/typescript/module/hooks/use-auto-scroll.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/zoom-provider.tsx +24 -22
- package/src/hooks/use-auto-scroll.ts +13 -8
|
@@ -15,7 +15,9 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
|
|
|
15
15
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
16
16
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
17
17
|
// This fraction determines how quickly zoom grows
|
|
18
|
-
const fraction = 0.
|
|
18
|
+
const fraction = 0.5;
|
|
19
|
+
// Minimum zoom change to commit — reduces cascading layout recalculations
|
|
20
|
+
const ZOOM_STEP = 0.005;
|
|
19
21
|
function ZoomProvider({
|
|
20
22
|
children,
|
|
21
23
|
scrollY,
|
|
@@ -30,26 +32,27 @@ function ZoomProvider({
|
|
|
30
32
|
maximumHour,
|
|
31
33
|
onZoomChange
|
|
32
34
|
} = (0, _react.useContext)(_globals.ConfigProvider);
|
|
33
|
-
const previewScale = (0, _reactNativeReanimated.useSharedValue)(
|
|
34
|
-
(0,
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
const pinchGesture = _reactNativeGestureHandler.Gesture.Pinch().onUpdate(event => {
|
|
35
|
+
const previewScale = (0, _reactNativeReanimated.useSharedValue)(zoomLevel.get());
|
|
36
|
+
const focalTime = (0, _reactNativeReanimated.useSharedValue)(0);
|
|
37
|
+
const screenFocalY = (0, _reactNativeReanimated.useSharedValue)(0);
|
|
38
|
+
const pinchGesture = _reactNativeGestureHandler.Gesture.Pinch().onStart(event => {
|
|
38
39
|
"worklet";
|
|
39
40
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
41
|
+
previewScale.value = zoomLevel.value;
|
|
42
|
+
focalTime.value = event.focalY / zoomLevel.value;
|
|
43
|
+
screenFocalY.value = event.focalY - scrollY.value;
|
|
44
|
+
}).onUpdate(event => {
|
|
45
|
+
"worklet";
|
|
46
|
+
|
|
47
|
+
const rawScale = previewScale.value * (1 + fraction * (event.scale - 1));
|
|
48
|
+
const clamped = Math.min(maxZoomLevel, Math.max(minZoomLevel, rawScale));
|
|
49
|
+
const newZoom = Math.round(clamped / ZOOM_STEP) * ZOOM_STEP;
|
|
50
|
+
if (newZoom === zoomLevel.value) return;
|
|
51
|
+
const maxScrollY = newZoom * 1440 - scrollViewHeight.value;
|
|
52
|
+
const newScrollY = Math.min(Math.max(0, maxScrollY), Math.max(0, focalTime.value * newZoom - screenFocalY.value));
|
|
53
|
+
(0, _reactNativeReanimated.scrollTo)(scrollRef, 0, newScrollY, false);
|
|
54
|
+
scrollY.value = newScrollY;
|
|
51
55
|
zoomLevel.value = newZoom;
|
|
52
|
-
previewScale.value = newZoom;
|
|
53
56
|
}).onEnd(() => {
|
|
54
57
|
if (onZoomChange) {
|
|
55
58
|
(0, _reactNativeReanimated.runOnJS)(onZoomChange)(zoomLevel.value);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNativeReanimated","_interopRequireWildcard","require","_reactNativeGestureHandler","_react","_globals","_reactNative","_doubleTapResetZoomGesture","_interopRequireDefault","_jsxRuntime","e","__esModule","default","_getRequireWildcardCache","WeakMap","r","t","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","fraction","ZoomProvider","children","scrollY","scrollRef","scrollViewHeight","zoomLevel","defaultZoomLevel","maxZoomLevel","minZoomLevel","maximumHour","onZoomChange","useContext","ConfigProvider","previewScale","useSharedValue","
|
|
1
|
+
{"version":3,"names":["_reactNativeReanimated","_interopRequireWildcard","require","_reactNativeGestureHandler","_react","_globals","_reactNative","_doubleTapResetZoomGesture","_interopRequireDefault","_jsxRuntime","e","__esModule","default","_getRequireWildcardCache","WeakMap","r","t","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","fraction","ZOOM_STEP","ZoomProvider","children","scrollY","scrollRef","scrollViewHeight","zoomLevel","defaultZoomLevel","maxZoomLevel","minZoomLevel","maximumHour","onZoomChange","useContext","ConfigProvider","previewScale","useSharedValue","focalTime","screenFocalY","pinchGesture","Gesture","Pinch","onStart","event","value","focalY","onUpdate","rawScale","scale","clamped","Math","min","max","newZoom","round","maxScrollY","newScrollY","scrollTo","onEnd","runOnJS","useAnimatedReaction","zoom","combinedGesture","Simultaneous","doubleTapGesture","jsx","GestureDetector","gesture","View","style","styles","container","StyleSheet","create","flex"],"sourceRoot":"../../../src","sources":["components/zoom-provider.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -7,7 +7,7 @@ exports.default = useAutoScroll;
|
|
|
7
7
|
var _reactNativeReanimated = require("react-native-reanimated");
|
|
8
8
|
const AUTO_SCROLL_TOP_THRESHOLD = 80;
|
|
9
9
|
const AUTO_SCROLL_BOTTOM_THRESHOLD = 150;
|
|
10
|
-
const
|
|
10
|
+
const AUTO_SCROLL_MAX_SPEED_PPS = 480;
|
|
11
11
|
function useAutoScroll({
|
|
12
12
|
scrollRef,
|
|
13
13
|
scrollY,
|
|
@@ -21,19 +21,20 @@ function useAutoScroll({
|
|
|
21
21
|
heightValue,
|
|
22
22
|
invertHeight
|
|
23
23
|
}) {
|
|
24
|
-
(0, _reactNativeReanimated.useFrameCallback)(
|
|
24
|
+
(0, _reactNativeReanimated.useFrameCallback)(frameInfo => {
|
|
25
25
|
if (!isActive.value) return;
|
|
26
|
+
const dt = Math.min(frameInfo.timeSincePreviousFrame ?? 16, 64) / 1000;
|
|
26
27
|
const viewportTop = scrollY.value;
|
|
27
28
|
const viewportBottom = scrollY.value + scrollViewHeight.value;
|
|
28
29
|
let scrollDelta = 0;
|
|
29
30
|
const distFromTop = topEdgeY.value - viewportTop;
|
|
30
31
|
const distFromBottom = viewportBottom - bottomEdgeY.value;
|
|
31
32
|
if (distFromTop < AUTO_SCROLL_TOP_THRESHOLD && distFromTop <= distFromBottom) {
|
|
32
|
-
const ratio = Math.max(0, 1 - distFromTop / AUTO_SCROLL_TOP_THRESHOLD);
|
|
33
|
-
scrollDelta = -ratio *
|
|
33
|
+
const ratio = Math.min(1, Math.max(0, 1 - distFromTop / AUTO_SCROLL_TOP_THRESHOLD));
|
|
34
|
+
scrollDelta = -ratio * AUTO_SCROLL_MAX_SPEED_PPS * dt;
|
|
34
35
|
} else if (distFromBottom < AUTO_SCROLL_BOTTOM_THRESHOLD) {
|
|
35
|
-
const ratio = Math.max(0, 1 - distFromBottom / AUTO_SCROLL_BOTTOM_THRESHOLD);
|
|
36
|
-
scrollDelta = ratio *
|
|
36
|
+
const ratio = Math.min(1, Math.max(0, 1 - distFromBottom / AUTO_SCROLL_BOTTOM_THRESHOLD));
|
|
37
|
+
scrollDelta = ratio * AUTO_SCROLL_MAX_SPEED_PPS * dt;
|
|
37
38
|
}
|
|
38
39
|
if (scrollDelta === 0) return;
|
|
39
40
|
const maxScrollY = Math.max(0, maximumHour.value - scrollViewHeight.value);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNativeReanimated","require","AUTO_SCROLL_TOP_THRESHOLD","AUTO_SCROLL_BOTTOM_THRESHOLD","
|
|
1
|
+
{"version":3,"names":["_reactNativeReanimated","require","AUTO_SCROLL_TOP_THRESHOLD","AUTO_SCROLL_BOTTOM_THRESHOLD","AUTO_SCROLL_MAX_SPEED_PPS","useAutoScroll","scrollRef","scrollY","scrollViewHeight","maximumHour","topEdgeY","bottomEdgeY","isActive","autoScrollOffset","positionY","heightValue","invertHeight","useFrameCallback","frameInfo","value","dt","Math","min","timeSincePreviousFrame","viewportTop","viewportBottom","scrollDelta","distFromTop","distFromBottom","ratio","max","maxScrollY","newScrollY","actualDelta","abs","scrollTo"],"sourceRoot":"../../../src","sources":["hooks/use-auto-scroll.ts"],"mappings":";;;;;;AAAA,IAAAA,sBAAA,GAAAC,OAAA;AAOA,MAAMC,yBAAyB,GAAG,EAAE;AACpC,MAAMC,4BAA4B,GAAG,GAAG;AACxC,MAAMC,yBAAyB,GAAG,GAAG;AAgBtB,SAASC,aAAaA,CAAC;EACpCC,SAAS;EACTC,OAAO;EACPC,gBAAgB;EAChBC,WAAW;EACXC,QAAQ;EACRC,WAAW;EACXC,QAAQ;EACRC,gBAAgB;EAChBC,SAAS;EACTC,WAAW;EACXC;AACgB,CAAC,EAAE;EACnB,IAAAC,uCAAgB,EAAEC,SAAS,IAAK;IAC9B,IAAI,CAACN,QAAQ,CAACO,KAAK,EAAE;IAErB,MAAMC,EAAE,GAAGC,IAAI,CAACC,GAAG,CAACJ,SAAS,CAACK,sBAAsB,IAAI,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI;IAEtE,MAAMC,WAAW,GAAGjB,OAAO,CAACY,KAAK;IACjC,MAAMM,cAAc,GAAGlB,OAAO,CAACY,KAAK,GAAGX,gBAAgB,CAACW,KAAK;IAE7D,IAAIO,WAAW,GAAG,CAAC;IAEnB,MAAMC,WAAW,GAAGjB,QAAQ,CAACS,KAAK,GAAGK,WAAW;IAChD,MAAMI,cAAc,GAAGH,cAAc,GAAGd,WAAW,CAACQ,KAAK;IAEzD,IACEQ,WAAW,GAAGzB,yBAAyB,IACvCyB,WAAW,IAAIC,cAAc,EAC7B;MACA,MAAMC,KAAK,GAAGR,IAAI,CAACC,GAAG,CACpB,CAAC,EACDD,IAAI,CAACS,GAAG,CAAC,CAAC,EAAE,CAAC,GAAGH,WAAW,GAAGzB,yBAAyB,CACzD,CAAC;MACDwB,WAAW,GAAG,CAACG,KAAK,GAAGzB,yBAAyB,GAAGgB,EAAE;IACvD,CAAC,MAAM,IAAIQ,cAAc,GAAGzB,4BAA4B,EAAE;MACxD,MAAM0B,KAAK,GAAGR,IAAI,CAACC,GAAG,CACpB,CAAC,EACDD,IAAI,CAACS,GAAG,CAAC,CAAC,EAAE,CAAC,GAAGF,cAAc,GAAGzB,4BAA4B,CAC/D,CAAC;MACDuB,WAAW,GAAGG,KAAK,GAAGzB,yBAAyB,GAAGgB,EAAE;IACtD;IAEA,IAAIM,WAAW,KAAK,CAAC,EAAE;IAEvB,MAAMK,UAAU,GAAGV,IAAI,CAACS,GAAG,CAAC,CAAC,EAAErB,WAAW,CAACU,KAAK,GAAGX,gBAAgB,CAACW,KAAK,CAAC;IAC1E,MAAMa,UAAU,GAAGX,IAAI,CAACC,GAAG,CACzBS,UAAU,EACVV,IAAI,CAACS,GAAG,CAAC,CAAC,EAAEvB,OAAO,CAACY,KAAK,GAAGO,WAAW,CACzC,CAAC;IACD,MAAMO,WAAW,GAAGD,UAAU,GAAGzB,OAAO,CAACY,KAAK;IAE9C,IAAIE,IAAI,CAACa,GAAG,CAACD,WAAW,CAAC,GAAG,GAAG,EAAE;IAEjC,IAAAE,+BAAQ,EAAC7B,SAAS,EAAE,CAAC,EAAE0B,UAAU,EAAE,KAAK,CAAC;IACzCzB,OAAO,CAACY,KAAK,GAAGa,UAAU;IAE1B,IAAIlB,SAAS,EAAE;MACbA,SAAS,CAACK,KAAK,IAAIc,WAAW;IAChC;IACA,IAAIpB,gBAAgB,EAAE;MACpBA,gBAAgB,CAACM,KAAK,IAAIc,WAAW;IACvC;IACA,IAAIlB,WAAW,EAAE;MACfA,WAAW,CAACI,KAAK,IAAIH,YAAY,GAAG,CAACiB,WAAW,GAAGA,WAAW;IAChE;EACF,CAAC,CAAC;AACJ","ignoreList":[]}
|
|
@@ -2,13 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
import Animated, { runOnJS, scrollTo, useAnimatedReaction, useSharedValue } from "react-native-reanimated";
|
|
4
4
|
import { Gesture, GestureDetector } from "react-native-gesture-handler";
|
|
5
|
-
import { useContext
|
|
5
|
+
import { useContext } from "react";
|
|
6
6
|
import { ConfigProvider } from "../utils/globals.js";
|
|
7
7
|
import { StyleSheet } from "react-native";
|
|
8
8
|
import doubleTapGesture from "../utils/double-tap-reset-zoom-gesture.js";
|
|
9
9
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
10
10
|
// This fraction determines how quickly zoom grows
|
|
11
|
-
const fraction = 0.
|
|
11
|
+
const fraction = 0.5;
|
|
12
|
+
// Minimum zoom change to commit — reduces cascading layout recalculations
|
|
13
|
+
const ZOOM_STEP = 0.005;
|
|
12
14
|
export default function ZoomProvider({
|
|
13
15
|
children,
|
|
14
16
|
scrollY,
|
|
@@ -23,26 +25,27 @@ export default function ZoomProvider({
|
|
|
23
25
|
maximumHour,
|
|
24
26
|
onZoomChange
|
|
25
27
|
} = useContext(ConfigProvider);
|
|
26
|
-
const previewScale = useSharedValue(
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
const pinchGesture = Gesture.Pinch().onUpdate(event => {
|
|
28
|
+
const previewScale = useSharedValue(zoomLevel.get());
|
|
29
|
+
const focalTime = useSharedValue(0);
|
|
30
|
+
const screenFocalY = useSharedValue(0);
|
|
31
|
+
const pinchGesture = Gesture.Pinch().onStart(event => {
|
|
31
32
|
"worklet";
|
|
32
33
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
34
|
+
previewScale.value = zoomLevel.value;
|
|
35
|
+
focalTime.value = event.focalY / zoomLevel.value;
|
|
36
|
+
screenFocalY.value = event.focalY - scrollY.value;
|
|
37
|
+
}).onUpdate(event => {
|
|
38
|
+
"worklet";
|
|
39
|
+
|
|
40
|
+
const rawScale = previewScale.value * (1 + fraction * (event.scale - 1));
|
|
41
|
+
const clamped = Math.min(maxZoomLevel, Math.max(minZoomLevel, rawScale));
|
|
42
|
+
const newZoom = Math.round(clamped / ZOOM_STEP) * ZOOM_STEP;
|
|
43
|
+
if (newZoom === zoomLevel.value) return;
|
|
44
|
+
const maxScrollY = newZoom * 1440 - scrollViewHeight.value;
|
|
45
|
+
const newScrollY = Math.min(Math.max(0, maxScrollY), Math.max(0, focalTime.value * newZoom - screenFocalY.value));
|
|
46
|
+
scrollTo(scrollRef, 0, newScrollY, false);
|
|
47
|
+
scrollY.value = newScrollY;
|
|
44
48
|
zoomLevel.value = newZoom;
|
|
45
|
-
previewScale.value = newZoom;
|
|
46
49
|
}).onEnd(() => {
|
|
47
50
|
if (onZoomChange) {
|
|
48
51
|
runOnJS(onZoomChange)(zoomLevel.value);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Animated","runOnJS","scrollTo","useAnimatedReaction","useSharedValue","Gesture","GestureDetector","useContext","
|
|
1
|
+
{"version":3,"names":["Animated","runOnJS","scrollTo","useAnimatedReaction","useSharedValue","Gesture","GestureDetector","useContext","ConfigProvider","StyleSheet","doubleTapGesture","jsx","_jsx","fraction","ZOOM_STEP","ZoomProvider","children","scrollY","scrollRef","scrollViewHeight","zoomLevel","defaultZoomLevel","maxZoomLevel","minZoomLevel","maximumHour","onZoomChange","previewScale","get","focalTime","screenFocalY","pinchGesture","Pinch","onStart","event","value","focalY","onUpdate","rawScale","scale","clamped","Math","min","max","newZoom","round","maxScrollY","newScrollY","onEnd","zoom","combinedGesture","Simultaneous","gesture","View","style","styles","container","create","flex"],"sourceRoot":"../../../src","sources":["components/zoom-provider.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import { scrollTo, useFrameCallback } from "react-native-reanimated";
|
|
4
4
|
const AUTO_SCROLL_TOP_THRESHOLD = 80;
|
|
5
5
|
const AUTO_SCROLL_BOTTOM_THRESHOLD = 150;
|
|
6
|
-
const
|
|
6
|
+
const AUTO_SCROLL_MAX_SPEED_PPS = 480;
|
|
7
7
|
export default function useAutoScroll({
|
|
8
8
|
scrollRef,
|
|
9
9
|
scrollY,
|
|
@@ -17,19 +17,20 @@ export default function useAutoScroll({
|
|
|
17
17
|
heightValue,
|
|
18
18
|
invertHeight
|
|
19
19
|
}) {
|
|
20
|
-
useFrameCallback(
|
|
20
|
+
useFrameCallback(frameInfo => {
|
|
21
21
|
if (!isActive.value) return;
|
|
22
|
+
const dt = Math.min(frameInfo.timeSincePreviousFrame ?? 16, 64) / 1000;
|
|
22
23
|
const viewportTop = scrollY.value;
|
|
23
24
|
const viewportBottom = scrollY.value + scrollViewHeight.value;
|
|
24
25
|
let scrollDelta = 0;
|
|
25
26
|
const distFromTop = topEdgeY.value - viewportTop;
|
|
26
27
|
const distFromBottom = viewportBottom - bottomEdgeY.value;
|
|
27
28
|
if (distFromTop < AUTO_SCROLL_TOP_THRESHOLD && distFromTop <= distFromBottom) {
|
|
28
|
-
const ratio = Math.max(0, 1 - distFromTop / AUTO_SCROLL_TOP_THRESHOLD);
|
|
29
|
-
scrollDelta = -ratio *
|
|
29
|
+
const ratio = Math.min(1, Math.max(0, 1 - distFromTop / AUTO_SCROLL_TOP_THRESHOLD));
|
|
30
|
+
scrollDelta = -ratio * AUTO_SCROLL_MAX_SPEED_PPS * dt;
|
|
30
31
|
} else if (distFromBottom < AUTO_SCROLL_BOTTOM_THRESHOLD) {
|
|
31
|
-
const ratio = Math.max(0, 1 - distFromBottom / AUTO_SCROLL_BOTTOM_THRESHOLD);
|
|
32
|
-
scrollDelta = ratio *
|
|
32
|
+
const ratio = Math.min(1, Math.max(0, 1 - distFromBottom / AUTO_SCROLL_BOTTOM_THRESHOLD));
|
|
33
|
+
scrollDelta = ratio * AUTO_SCROLL_MAX_SPEED_PPS * dt;
|
|
33
34
|
}
|
|
34
35
|
if (scrollDelta === 0) return;
|
|
35
36
|
const maxScrollY = Math.max(0, maximumHour.value - scrollViewHeight.value);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["scrollTo","useFrameCallback","AUTO_SCROLL_TOP_THRESHOLD","AUTO_SCROLL_BOTTOM_THRESHOLD","
|
|
1
|
+
{"version":3,"names":["scrollTo","useFrameCallback","AUTO_SCROLL_TOP_THRESHOLD","AUTO_SCROLL_BOTTOM_THRESHOLD","AUTO_SCROLL_MAX_SPEED_PPS","useAutoScroll","scrollRef","scrollY","scrollViewHeight","maximumHour","topEdgeY","bottomEdgeY","isActive","autoScrollOffset","positionY","heightValue","invertHeight","frameInfo","value","dt","Math","min","timeSincePreviousFrame","viewportTop","viewportBottom","scrollDelta","distFromTop","distFromBottom","ratio","max","maxScrollY","newScrollY","actualDelta","abs"],"sourceRoot":"../../../src","sources":["hooks/use-auto-scroll.ts"],"mappings":";;AAAA,SAGEA,QAAQ,EACRC,gBAAgB,QACX,yBAAyB;AAEhC,MAAMC,yBAAyB,GAAG,EAAE;AACpC,MAAMC,4BAA4B,GAAG,GAAG;AACxC,MAAMC,yBAAyB,GAAG,GAAG;AAgBrC,eAAe,SAASC,aAAaA,CAAC;EACpCC,SAAS;EACTC,OAAO;EACPC,gBAAgB;EAChBC,WAAW;EACXC,QAAQ;EACRC,WAAW;EACXC,QAAQ;EACRC,gBAAgB;EAChBC,SAAS;EACTC,WAAW;EACXC;AACgB,CAAC,EAAE;EACnBf,gBAAgB,CAAEgB,SAAS,IAAK;IAC9B,IAAI,CAACL,QAAQ,CAACM,KAAK,EAAE;IAErB,MAAMC,EAAE,GAAGC,IAAI,CAACC,GAAG,CAACJ,SAAS,CAACK,sBAAsB,IAAI,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI;IAEtE,MAAMC,WAAW,GAAGhB,OAAO,CAACW,KAAK;IACjC,MAAMM,cAAc,GAAGjB,OAAO,CAACW,KAAK,GAAGV,gBAAgB,CAACU,KAAK;IAE7D,IAAIO,WAAW,GAAG,CAAC;IAEnB,MAAMC,WAAW,GAAGhB,QAAQ,CAACQ,KAAK,GAAGK,WAAW;IAChD,MAAMI,cAAc,GAAGH,cAAc,GAAGb,WAAW,CAACO,KAAK;IAEzD,IACEQ,WAAW,GAAGxB,yBAAyB,IACvCwB,WAAW,IAAIC,cAAc,EAC7B;MACA,MAAMC,KAAK,GAAGR,IAAI,CAACC,GAAG,CACpB,CAAC,EACDD,IAAI,CAACS,GAAG,CAAC,CAAC,EAAE,CAAC,GAAGH,WAAW,GAAGxB,yBAAyB,CACzD,CAAC;MACDuB,WAAW,GAAG,CAACG,KAAK,GAAGxB,yBAAyB,GAAGe,EAAE;IACvD,CAAC,MAAM,IAAIQ,cAAc,GAAGxB,4BAA4B,EAAE;MACxD,MAAMyB,KAAK,GAAGR,IAAI,CAACC,GAAG,CACpB,CAAC,EACDD,IAAI,CAACS,GAAG,CAAC,CAAC,EAAE,CAAC,GAAGF,cAAc,GAAGxB,4BAA4B,CAC/D,CAAC;MACDsB,WAAW,GAAGG,KAAK,GAAGxB,yBAAyB,GAAGe,EAAE;IACtD;IAEA,IAAIM,WAAW,KAAK,CAAC,EAAE;IAEvB,MAAMK,UAAU,GAAGV,IAAI,CAACS,GAAG,CAAC,CAAC,EAAEpB,WAAW,CAACS,KAAK,GAAGV,gBAAgB,CAACU,KAAK,CAAC;IAC1E,MAAMa,UAAU,GAAGX,IAAI,CAACC,GAAG,CACzBS,UAAU,EACVV,IAAI,CAACS,GAAG,CAAC,CAAC,EAAEtB,OAAO,CAACW,KAAK,GAAGO,WAAW,CACzC,CAAC;IACD,MAAMO,WAAW,GAAGD,UAAU,GAAGxB,OAAO,CAACW,KAAK;IAE9C,IAAIE,IAAI,CAACa,GAAG,CAACD,WAAW,CAAC,GAAG,GAAG,EAAE;IAEjChC,QAAQ,CAACM,SAAS,EAAE,CAAC,EAAEyB,UAAU,EAAE,KAAK,CAAC;IACzCxB,OAAO,CAACW,KAAK,GAAGa,UAAU;IAE1B,IAAIjB,SAAS,EAAE;MACbA,SAAS,CAACI,KAAK,IAAIc,WAAW;IAChC;IACA,IAAInB,gBAAgB,EAAE;MACpBA,gBAAgB,CAACK,KAAK,IAAIc,WAAW;IACvC;IACA,IAAIjB,WAAW,EAAE;MACfA,WAAW,CAACG,KAAK,IAAIF,YAAY,GAAG,CAACgB,WAAW,GAAGA,WAAW;IAChE;EACF,CAAC,CAAC;AACJ","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zoom-provider.d.ts","sourceRoot":"","sources":["../../../../src/components/zoom-provider.tsx"],"names":[],"mappings":"AAAA,OAAO,QAAQ,EAAE,EACf,KAAK,WAAW,EAChB,KAAK,WAAW,EAKjB,MAAM,yBAAyB,CAAC;AAOjC,KAAK,iBAAiB,GAAG;IACvB,QAAQ,EAAE,GAAG,CAAC;IACd,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7B,SAAS,EAAE,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC5C,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACvC,CAAC;
|
|
1
|
+
{"version":3,"file":"zoom-provider.d.ts","sourceRoot":"","sources":["../../../../src/components/zoom-provider.tsx"],"names":[],"mappings":"AAAA,OAAO,QAAQ,EAAE,EACf,KAAK,WAAW,EAChB,KAAK,WAAW,EAKjB,MAAM,yBAAyB,CAAC;AAOjC,KAAK,iBAAiB,GAAG;IACvB,QAAQ,EAAE,GAAG,CAAC;IACd,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7B,SAAS,EAAE,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC5C,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACvC,CAAC;AAOF,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EACnC,QAAQ,EACR,OAAO,EACP,SAAS,EACT,gBAAgB,GACjB,EAAE,iBAAiB,+BAsEnB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-auto-scroll.d.ts","sourceRoot":"","sources":["../../../../src/hooks/use-auto-scroll.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,EAAE,EACf,KAAK,WAAW,EAChB,KAAK,WAAW,EAGjB,MAAM,yBAAyB,CAAC;AAMjC,KAAK,gBAAgB,GAAG;IACtB,SAAS,EAAE,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC5C,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7B,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACtC,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9B,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAC/B,gBAAgB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACvC,SAAS,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAChC,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EACpC,SAAS,EACT,OAAO,EACP,gBAAgB,EAChB,WAAW,EACX,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,gBAAgB,EAChB,SAAS,EACT,WAAW,EACX,YAAY,GACb,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"use-auto-scroll.d.ts","sourceRoot":"","sources":["../../../../src/hooks/use-auto-scroll.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,EAAE,EACf,KAAK,WAAW,EAChB,KAAK,WAAW,EAGjB,MAAM,yBAAyB,CAAC;AAMjC,KAAK,gBAAgB,GAAG;IACtB,SAAS,EAAE,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC5C,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7B,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACtC,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9B,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAC/B,gBAAgB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACvC,SAAS,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAChC,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EACpC,SAAS,EACT,OAAO,EACP,gBAAgB,EAChB,WAAW,EACX,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,gBAAgB,EAChB,SAAS,EACT,WAAW,EACX,YAAY,GACb,EAAE,gBAAgB,QAuDlB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zoom-provider.d.ts","sourceRoot":"","sources":["../../../../src/components/zoom-provider.tsx"],"names":[],"mappings":"AAAA,OAAO,QAAQ,EAAE,EACf,KAAK,WAAW,EAChB,KAAK,WAAW,EAKjB,MAAM,yBAAyB,CAAC;AAOjC,KAAK,iBAAiB,GAAG;IACvB,QAAQ,EAAE,GAAG,CAAC;IACd,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7B,SAAS,EAAE,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC5C,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACvC,CAAC;
|
|
1
|
+
{"version":3,"file":"zoom-provider.d.ts","sourceRoot":"","sources":["../../../../src/components/zoom-provider.tsx"],"names":[],"mappings":"AAAA,OAAO,QAAQ,EAAE,EACf,KAAK,WAAW,EAChB,KAAK,WAAW,EAKjB,MAAM,yBAAyB,CAAC;AAOjC,KAAK,iBAAiB,GAAG;IACvB,QAAQ,EAAE,GAAG,CAAC;IACd,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7B,SAAS,EAAE,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC5C,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACvC,CAAC;AAOF,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EACnC,QAAQ,EACR,OAAO,EACP,SAAS,EACT,gBAAgB,GACjB,EAAE,iBAAiB,+BAsEnB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-auto-scroll.d.ts","sourceRoot":"","sources":["../../../../src/hooks/use-auto-scroll.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,EAAE,EACf,KAAK,WAAW,EAChB,KAAK,WAAW,EAGjB,MAAM,yBAAyB,CAAC;AAMjC,KAAK,gBAAgB,GAAG;IACtB,SAAS,EAAE,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC5C,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7B,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACtC,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9B,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAC/B,gBAAgB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACvC,SAAS,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAChC,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EACpC,SAAS,EACT,OAAO,EACP,gBAAgB,EAChB,WAAW,EACX,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,gBAAgB,EAChB,SAAS,EACT,WAAW,EACX,YAAY,GACb,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"use-auto-scroll.d.ts","sourceRoot":"","sources":["../../../../src/hooks/use-auto-scroll.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,EAAE,EACf,KAAK,WAAW,EAChB,KAAK,WAAW,EAGjB,MAAM,yBAAyB,CAAC;AAMjC,KAAK,gBAAgB,GAAG;IACtB,SAAS,EAAE,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC5C,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7B,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACtC,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9B,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAC/B,gBAAgB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACvC,SAAS,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAChC,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EACpC,SAAS,EACT,OAAO,EACP,gBAAgB,EAChB,WAAW,EACX,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,gBAAgB,EAChB,SAAS,EACT,WAAW,EACX,YAAY,GACb,EAAE,gBAAgB,QAuDlB"}
|
package/package.json
CHANGED
|
@@ -7,7 +7,7 @@ import Animated, {
|
|
|
7
7
|
useSharedValue,
|
|
8
8
|
} from "react-native-reanimated";
|
|
9
9
|
import { Gesture, GestureDetector } from "react-native-gesture-handler";
|
|
10
|
-
import { useContext
|
|
10
|
+
import { useContext } from "react";
|
|
11
11
|
import { ConfigProvider } from "../utils/globals";
|
|
12
12
|
import { StyleSheet } from "react-native";
|
|
13
13
|
import doubleTapGesture from "../utils/double-tap-reset-zoom-gesture";
|
|
@@ -20,7 +20,9 @@ type ZoomProviderProps = {
|
|
|
20
20
|
};
|
|
21
21
|
|
|
22
22
|
// This fraction determines how quickly zoom grows
|
|
23
|
-
const fraction = 0.
|
|
23
|
+
const fraction = 0.5;
|
|
24
|
+
// Minimum zoom change to commit — reduces cascading layout recalculations
|
|
25
|
+
const ZOOM_STEP = 0.005;
|
|
24
26
|
|
|
25
27
|
export default function ZoomProvider({
|
|
26
28
|
children,
|
|
@@ -36,35 +38,35 @@ export default function ZoomProvider({
|
|
|
36
38
|
maximumHour,
|
|
37
39
|
onZoomChange,
|
|
38
40
|
} = useContext(ConfigProvider);
|
|
39
|
-
const previewScale = useSharedValue(
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
previewScale.value = zoomLevel.get();
|
|
43
|
-
}, [zoomLevel, previewScale]);
|
|
41
|
+
const previewScale = useSharedValue(zoomLevel.get());
|
|
42
|
+
const focalTime = useSharedValue(0);
|
|
43
|
+
const screenFocalY = useSharedValue(0);
|
|
44
44
|
|
|
45
45
|
const pinchGesture = Gesture.Pinch()
|
|
46
|
+
.onStart((event) => {
|
|
47
|
+
"worklet";
|
|
48
|
+
previewScale.value = zoomLevel.value;
|
|
49
|
+
focalTime.value = event.focalY / zoomLevel.value;
|
|
50
|
+
screenFocalY.value = event.focalY - scrollY.value;
|
|
51
|
+
})
|
|
46
52
|
.onUpdate((event) => {
|
|
47
53
|
"worklet";
|
|
48
54
|
|
|
49
|
-
const
|
|
50
|
-
const
|
|
51
|
-
const newZoom = Math.
|
|
55
|
+
const rawScale = previewScale.value * (1 + fraction * (event.scale - 1));
|
|
56
|
+
const clamped = Math.min(maxZoomLevel, Math.max(minZoomLevel, rawScale));
|
|
57
|
+
const newZoom = Math.round(clamped / ZOOM_STEP) * ZOOM_STEP;
|
|
52
58
|
|
|
53
|
-
if (newZoom
|
|
54
|
-
const ratio = newZoom / oldZoom;
|
|
55
|
-
const viewportFocalY = event.focalY - scrollY.value;
|
|
56
|
-
const maxScrollY = newZoom * 1440 - scrollViewHeight.value;
|
|
57
|
-
const newScrollY = Math.min(
|
|
58
|
-
Math.max(0, maxScrollY),
|
|
59
|
-
Math.max(0, (scrollY.value + viewportFocalY) * ratio - viewportFocalY)
|
|
60
|
-
);
|
|
59
|
+
if (newZoom === zoomLevel.value) return;
|
|
61
60
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
61
|
+
const maxScrollY = newZoom * 1440 - scrollViewHeight.value;
|
|
62
|
+
const newScrollY = Math.min(
|
|
63
|
+
Math.max(0, maxScrollY),
|
|
64
|
+
Math.max(0, focalTime.value * newZoom - screenFocalY.value)
|
|
65
|
+
);
|
|
65
66
|
|
|
67
|
+
scrollTo(scrollRef, 0, newScrollY, false);
|
|
68
|
+
scrollY.value = newScrollY;
|
|
66
69
|
zoomLevel.value = newZoom;
|
|
67
|
-
previewScale.value = newZoom;
|
|
68
70
|
})
|
|
69
71
|
.onEnd(() => {
|
|
70
72
|
if (onZoomChange) {
|
|
@@ -7,7 +7,7 @@ import Animated, {
|
|
|
7
7
|
|
|
8
8
|
const AUTO_SCROLL_TOP_THRESHOLD = 80;
|
|
9
9
|
const AUTO_SCROLL_BOTTOM_THRESHOLD = 150;
|
|
10
|
-
const
|
|
10
|
+
const AUTO_SCROLL_MAX_SPEED_PPS = 480;
|
|
11
11
|
|
|
12
12
|
type AutoScrollParams = {
|
|
13
13
|
scrollRef: AnimatedRef<Animated.ScrollView>;
|
|
@@ -36,9 +36,11 @@ export default function useAutoScroll({
|
|
|
36
36
|
heightValue,
|
|
37
37
|
invertHeight,
|
|
38
38
|
}: AutoScrollParams) {
|
|
39
|
-
useFrameCallback(() => {
|
|
39
|
+
useFrameCallback((frameInfo) => {
|
|
40
40
|
if (!isActive.value) return;
|
|
41
41
|
|
|
42
|
+
const dt = Math.min(frameInfo.timeSincePreviousFrame ?? 16, 64) / 1000;
|
|
43
|
+
|
|
42
44
|
const viewportTop = scrollY.value;
|
|
43
45
|
const viewportBottom = scrollY.value + scrollViewHeight.value;
|
|
44
46
|
|
|
@@ -51,14 +53,17 @@ export default function useAutoScroll({
|
|
|
51
53
|
distFromTop < AUTO_SCROLL_TOP_THRESHOLD &&
|
|
52
54
|
distFromTop <= distFromBottom
|
|
53
55
|
) {
|
|
54
|
-
const ratio = Math.
|
|
55
|
-
|
|
56
|
+
const ratio = Math.min(
|
|
57
|
+
1,
|
|
58
|
+
Math.max(0, 1 - distFromTop / AUTO_SCROLL_TOP_THRESHOLD)
|
|
59
|
+
);
|
|
60
|
+
scrollDelta = -ratio * AUTO_SCROLL_MAX_SPEED_PPS * dt;
|
|
56
61
|
} else if (distFromBottom < AUTO_SCROLL_BOTTOM_THRESHOLD) {
|
|
57
|
-
const ratio = Math.
|
|
58
|
-
|
|
59
|
-
1 - distFromBottom / AUTO_SCROLL_BOTTOM_THRESHOLD
|
|
62
|
+
const ratio = Math.min(
|
|
63
|
+
1,
|
|
64
|
+
Math.max(0, 1 - distFromBottom / AUTO_SCROLL_BOTTOM_THRESHOLD)
|
|
60
65
|
);
|
|
61
|
-
scrollDelta = ratio *
|
|
66
|
+
scrollDelta = ratio * AUTO_SCROLL_MAX_SPEED_PPS * dt;
|
|
62
67
|
}
|
|
63
68
|
|
|
64
69
|
if (scrollDelta === 0) return;
|