@sunsama/event-calendar 0.13.1 → 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.
@@ -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.1;
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)(-1);
34
- (0, _react.useEffect)(() => {
35
- previewScale.value = zoomLevel.get();
36
- }, [zoomLevel, previewScale]);
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
- const oldZoom = zoomLevel.value;
41
- const newScale = previewScale.value * (1 + fraction * (event.scale - 1));
42
- const newZoom = Math.min(maxZoomLevel, Math.max(minZoomLevel, newScale));
43
- if (newZoom !== oldZoom) {
44
- const ratio = newZoom / oldZoom;
45
- const viewportFocalY = event.focalY - scrollY.value;
46
- const maxScrollY = newZoom * 1440 - scrollViewHeight.value;
47
- const newScrollY = Math.min(Math.max(0, maxScrollY), Math.max(0, (scrollY.value + viewportFocalY) * ratio - viewportFocalY));
48
- (0, _reactNativeReanimated.scrollTo)(scrollRef, 0, newScrollY, false);
49
- scrollY.value = newScrollY;
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","useEffect","value","pinchGesture","Gesture","Pinch","onUpdate","event","oldZoom","newScale","scale","newZoom","Math","min","max","ratio","viewportFocalY","focalY","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":[]}
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":[]}
@@ -23,17 +23,17 @@ function useAutoScroll({
23
23
  }) {
24
24
  (0, _reactNativeReanimated.useFrameCallback)(frameInfo => {
25
25
  if (!isActive.value) return;
26
- const dt = (frameInfo.timeSincePreviousFrame ?? 16) / 1000;
26
+ const dt = Math.min(frameInfo.timeSincePreviousFrame ?? 16, 64) / 1000;
27
27
  const viewportTop = scrollY.value;
28
28
  const viewportBottom = scrollY.value + scrollViewHeight.value;
29
29
  let scrollDelta = 0;
30
30
  const distFromTop = topEdgeY.value - viewportTop;
31
31
  const distFromBottom = viewportBottom - bottomEdgeY.value;
32
32
  if (distFromTop < AUTO_SCROLL_TOP_THRESHOLD && distFromTop <= distFromBottom) {
33
- const ratio = Math.max(0, 1 - distFromTop / AUTO_SCROLL_TOP_THRESHOLD);
33
+ const ratio = Math.min(1, Math.max(0, 1 - distFromTop / AUTO_SCROLL_TOP_THRESHOLD));
34
34
  scrollDelta = -ratio * AUTO_SCROLL_MAX_SPEED_PPS * dt;
35
35
  } else if (distFromBottom < AUTO_SCROLL_BOTTOM_THRESHOLD) {
36
- const ratio = Math.max(0, 1 - distFromBottom / AUTO_SCROLL_BOTTOM_THRESHOLD);
36
+ const ratio = Math.min(1, Math.max(0, 1 - distFromBottom / AUTO_SCROLL_BOTTOM_THRESHOLD));
37
37
  scrollDelta = ratio * AUTO_SCROLL_MAX_SPEED_PPS * dt;
38
38
  }
39
39
  if (scrollDelta === 0) return;
@@ -1 +1 @@
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","timeSincePreviousFrame","viewportTop","viewportBottom","scrollDelta","distFromTop","distFromBottom","ratio","Math","max","maxScrollY","newScrollY","min","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,GAAG,CAACF,SAAS,CAACG,sBAAsB,IAAI,EAAE,IAAI,IAAI;IAE1D,MAAMC,WAAW,GAAGf,OAAO,CAACY,KAAK;IACjC,MAAMI,cAAc,GAAGhB,OAAO,CAACY,KAAK,GAAGX,gBAAgB,CAACW,KAAK;IAE7D,IAAIK,WAAW,GAAG,CAAC;IAEnB,MAAMC,WAAW,GAAGf,QAAQ,CAACS,KAAK,GAAGG,WAAW;IAChD,MAAMI,cAAc,GAAGH,cAAc,GAAGZ,WAAW,CAACQ,KAAK;IAEzD,IACEM,WAAW,GAAGvB,yBAAyB,IACvCuB,WAAW,IAAIC,cAAc,EAC7B;MACA,MAAMC,KAAK,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAGJ,WAAW,GAAGvB,yBAAyB,CAAC;MACtEsB,WAAW,GAAG,CAACG,KAAK,GAAGvB,yBAAyB,GAAGgB,EAAE;IACvD,CAAC,MAAM,IAAIM,cAAc,GAAGvB,4BAA4B,EAAE;MACxD,MAAMwB,KAAK,GAAGC,IAAI,CAACC,GAAG,CACpB,CAAC,EACD,CAAC,GAAGH,cAAc,GAAGvB,4BACvB,CAAC;MACDqB,WAAW,GAAGG,KAAK,GAAGvB,yBAAyB,GAAGgB,EAAE;IACtD;IAEA,IAAII,WAAW,KAAK,CAAC,EAAE;IAEvB,MAAMM,UAAU,GAAGF,IAAI,CAACC,GAAG,CAAC,CAAC,EAAEpB,WAAW,CAACU,KAAK,GAAGX,gBAAgB,CAACW,KAAK,CAAC;IAC1E,MAAMY,UAAU,GAAGH,IAAI,CAACI,GAAG,CACzBF,UAAU,EACVF,IAAI,CAACC,GAAG,CAAC,CAAC,EAAEtB,OAAO,CAACY,KAAK,GAAGK,WAAW,CACzC,CAAC;IACD,MAAMS,WAAW,GAAGF,UAAU,GAAGxB,OAAO,CAACY,KAAK;IAE9C,IAAIS,IAAI,CAACM,GAAG,CAACD,WAAW,CAAC,GAAG,GAAG,EAAE;IAEjC,IAAAE,+BAAQ,EAAC7B,SAAS,EAAE,CAAC,EAAEyB,UAAU,EAAE,KAAK,CAAC;IACzCxB,OAAO,CAACY,KAAK,GAAGY,UAAU;IAE1B,IAAIjB,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":[]}
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, useEffect } from "react";
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.1;
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(-1);
27
- useEffect(() => {
28
- previewScale.value = zoomLevel.get();
29
- }, [zoomLevel, previewScale]);
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
- const oldZoom = zoomLevel.value;
34
- const newScale = previewScale.value * (1 + fraction * (event.scale - 1));
35
- const newZoom = Math.min(maxZoomLevel, Math.max(minZoomLevel, newScale));
36
- if (newZoom !== oldZoom) {
37
- const ratio = newZoom / oldZoom;
38
- const viewportFocalY = event.focalY - scrollY.value;
39
- const maxScrollY = newZoom * 1440 - scrollViewHeight.value;
40
- const newScrollY = Math.min(Math.max(0, maxScrollY), Math.max(0, (scrollY.value + viewportFocalY) * ratio - viewportFocalY));
41
- scrollTo(scrollRef, 0, newScrollY, false);
42
- scrollY.value = newScrollY;
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","useEffect","ConfigProvider","StyleSheet","doubleTapGesture","jsx","_jsx","fraction","ZoomProvider","children","scrollY","scrollRef","scrollViewHeight","zoomLevel","defaultZoomLevel","maxZoomLevel","minZoomLevel","maximumHour","onZoomChange","previewScale","value","get","pinchGesture","Pinch","onUpdate","event","oldZoom","newScale","scale","newZoom","Math","min","max","ratio","viewportFocalY","focalY","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":[]}
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":[]}
@@ -19,17 +19,17 @@ export default function useAutoScroll({
19
19
  }) {
20
20
  useFrameCallback(frameInfo => {
21
21
  if (!isActive.value) return;
22
- const dt = (frameInfo.timeSincePreviousFrame ?? 16) / 1000;
22
+ const dt = Math.min(frameInfo.timeSincePreviousFrame ?? 16, 64) / 1000;
23
23
  const viewportTop = scrollY.value;
24
24
  const viewportBottom = scrollY.value + scrollViewHeight.value;
25
25
  let scrollDelta = 0;
26
26
  const distFromTop = topEdgeY.value - viewportTop;
27
27
  const distFromBottom = viewportBottom - bottomEdgeY.value;
28
28
  if (distFromTop < AUTO_SCROLL_TOP_THRESHOLD && distFromTop <= distFromBottom) {
29
- const ratio = Math.max(0, 1 - distFromTop / AUTO_SCROLL_TOP_THRESHOLD);
29
+ const ratio = Math.min(1, Math.max(0, 1 - distFromTop / AUTO_SCROLL_TOP_THRESHOLD));
30
30
  scrollDelta = -ratio * AUTO_SCROLL_MAX_SPEED_PPS * dt;
31
31
  } else if (distFromBottom < AUTO_SCROLL_BOTTOM_THRESHOLD) {
32
- const ratio = Math.max(0, 1 - distFromBottom / AUTO_SCROLL_BOTTOM_THRESHOLD);
32
+ const ratio = Math.min(1, Math.max(0, 1 - distFromBottom / AUTO_SCROLL_BOTTOM_THRESHOLD));
33
33
  scrollDelta = ratio * AUTO_SCROLL_MAX_SPEED_PPS * dt;
34
34
  }
35
35
  if (scrollDelta === 0) return;
@@ -1 +1 @@
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","timeSincePreviousFrame","viewportTop","viewportBottom","scrollDelta","distFromTop","distFromBottom","ratio","Math","max","maxScrollY","newScrollY","min","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,GAAG,CAACF,SAAS,CAACG,sBAAsB,IAAI,EAAE,IAAI,IAAI;IAE1D,MAAMC,WAAW,GAAGd,OAAO,CAACW,KAAK;IACjC,MAAMI,cAAc,GAAGf,OAAO,CAACW,KAAK,GAAGV,gBAAgB,CAACU,KAAK;IAE7D,IAAIK,WAAW,GAAG,CAAC;IAEnB,MAAMC,WAAW,GAAGd,QAAQ,CAACQ,KAAK,GAAGG,WAAW;IAChD,MAAMI,cAAc,GAAGH,cAAc,GAAGX,WAAW,CAACO,KAAK;IAEzD,IACEM,WAAW,GAAGtB,yBAAyB,IACvCsB,WAAW,IAAIC,cAAc,EAC7B;MACA,MAAMC,KAAK,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAGJ,WAAW,GAAGtB,yBAAyB,CAAC;MACtEqB,WAAW,GAAG,CAACG,KAAK,GAAGtB,yBAAyB,GAAGe,EAAE;IACvD,CAAC,MAAM,IAAIM,cAAc,GAAGtB,4BAA4B,EAAE;MACxD,MAAMuB,KAAK,GAAGC,IAAI,CAACC,GAAG,CACpB,CAAC,EACD,CAAC,GAAGH,cAAc,GAAGtB,4BACvB,CAAC;MACDoB,WAAW,GAAGG,KAAK,GAAGtB,yBAAyB,GAAGe,EAAE;IACtD;IAEA,IAAII,WAAW,KAAK,CAAC,EAAE;IAEvB,MAAMM,UAAU,GAAGF,IAAI,CAACC,GAAG,CAAC,CAAC,EAAEnB,WAAW,CAACS,KAAK,GAAGV,gBAAgB,CAACU,KAAK,CAAC;IAC1E,MAAMY,UAAU,GAAGH,IAAI,CAACI,GAAG,CACzBF,UAAU,EACVF,IAAI,CAACC,GAAG,CAAC,CAAC,EAAErB,OAAO,CAACW,KAAK,GAAGK,WAAW,CACzC,CAAC;IACD,MAAMS,WAAW,GAAGF,UAAU,GAAGvB,OAAO,CAACW,KAAK;IAE9C,IAAIS,IAAI,CAACM,GAAG,CAACD,WAAW,CAAC,GAAG,GAAG,EAAE;IAEjChC,QAAQ,CAACM,SAAS,EAAE,CAAC,EAAEwB,UAAU,EAAE,KAAK,CAAC;IACzCvB,OAAO,CAACW,KAAK,GAAGY,UAAU;IAE1B,IAAIhB,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
+ {"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;AAKF,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EACnC,QAAQ,EACR,OAAO,EACP,SAAS,EACT,gBAAgB,GACjB,EAAE,iBAAiB,+BAsEnB"}
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,QAoDlB"}
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;AAKF,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EACnC,QAAQ,EACR,OAAO,EACP,SAAS,EACT,gBAAgB,GACjB,EAAE,iBAAiB,+BAsEnB"}
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,QAoDlB"}
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sunsama/event-calendar",
3
- "version": "0.13.1",
3
+ "version": "0.13.2",
4
4
  "description": "Event calendar.",
5
5
  "source": "./src/index.tsx",
6
6
  "main": "./lib/commonjs/index.js",
@@ -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, useEffect } from "react";
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.1;
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(-1);
40
-
41
- useEffect(() => {
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 oldZoom = zoomLevel.value;
50
- const newScale = previewScale.value * (1 + fraction * (event.scale - 1));
51
- const newZoom = Math.min(maxZoomLevel, Math.max(minZoomLevel, newScale));
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 !== oldZoom) {
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
- scrollTo(scrollRef, 0, newScrollY, false);
63
- scrollY.value = newScrollY;
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) {
@@ -39,7 +39,7 @@ export default function useAutoScroll({
39
39
  useFrameCallback((frameInfo) => {
40
40
  if (!isActive.value) return;
41
41
 
42
- const dt = (frameInfo.timeSincePreviousFrame ?? 16) / 1000;
42
+ const dt = Math.min(frameInfo.timeSincePreviousFrame ?? 16, 64) / 1000;
43
43
 
44
44
  const viewportTop = scrollY.value;
45
45
  const viewportBottom = scrollY.value + scrollViewHeight.value;
@@ -53,12 +53,15 @@ export default function useAutoScroll({
53
53
  distFromTop < AUTO_SCROLL_TOP_THRESHOLD &&
54
54
  distFromTop <= distFromBottom
55
55
  ) {
56
- const ratio = Math.max(0, 1 - distFromTop / AUTO_SCROLL_TOP_THRESHOLD);
56
+ const ratio = Math.min(
57
+ 1,
58
+ Math.max(0, 1 - distFromTop / AUTO_SCROLL_TOP_THRESHOLD)
59
+ );
57
60
  scrollDelta = -ratio * AUTO_SCROLL_MAX_SPEED_PPS * dt;
58
61
  } else if (distFromBottom < AUTO_SCROLL_BOTTOM_THRESHOLD) {
59
- const ratio = Math.max(
60
- 0,
61
- 1 - distFromBottom / AUTO_SCROLL_BOTTOM_THRESHOLD
62
+ const ratio = Math.min(
63
+ 1,
64
+ Math.max(0, 1 - distFromBottom / AUTO_SCROLL_BOTTOM_THRESHOLD)
62
65
  );
63
66
  scrollDelta = ratio * AUTO_SCROLL_MAX_SPEED_PPS * dt;
64
67
  }