@react-hive/honey-layout 10.4.1 → 10.5.0

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.
@@ -13725,6 +13725,7 @@ __webpack_require__.r(__webpack_exports__);
13725
13725
  /* harmony export */ useHoneyMediaQuery: () => (/* reexport safe */ _use_honey_media_query__WEBPACK_IMPORTED_MODULE_1__.useHoneyMediaQuery),
13726
13726
  /* harmony export */ useHoneyOnChange: () => (/* reexport safe */ _use_honey_on_change__WEBPACK_IMPORTED_MODULE_0__.useHoneyOnChange),
13727
13727
  /* harmony export */ useHoneyOverlay: () => (/* reexport safe */ _use_honey_overlay__WEBPACK_IMPORTED_MODULE_6__.useHoneyOverlay),
13728
+ /* harmony export */ useHoneyRafLoop: () => (/* reexport safe */ _use_honey_raf_loop__WEBPACK_IMPORTED_MODULE_11__.useHoneyRafLoop),
13728
13729
  /* harmony export */ useHoneyResize: () => (/* reexport safe */ _use_honey_resize__WEBPACK_IMPORTED_MODULE_7__.useHoneyResize),
13729
13730
  /* harmony export */ useHoneySyntheticScroll: () => (/* reexport safe */ _use_honey_synthetic_scroll__WEBPACK_IMPORTED_MODULE_8__.useHoneySyntheticScroll),
13730
13731
  /* harmony export */ useHoneySyntheticScrollX: () => (/* reexport safe */ _use_honey_synthetic_scroll_x__WEBPACK_IMPORTED_MODULE_9__.useHoneySyntheticScrollX),
@@ -13742,6 +13743,8 @@ __webpack_require__.r(__webpack_exports__);
13742
13743
  /* harmony import */ var _use_honey_synthetic_scroll__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./use-honey-synthetic-scroll */ "./src/hooks/use-honey-synthetic-scroll.ts");
13743
13744
  /* harmony import */ var _use_honey_synthetic_scroll_x__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./use-honey-synthetic-scroll-x */ "./src/hooks/use-honey-synthetic-scroll-x.ts");
13744
13745
  /* harmony import */ var _use_honey_synthetic_scroll_y__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./use-honey-synthetic-scroll-y */ "./src/hooks/use-honey-synthetic-scroll-y.ts");
13746
+ /* harmony import */ var _use_honey_raf_loop__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./use-honey-raf-loop */ "./src/hooks/use-honey-raf-loop.ts");
13747
+
13745
13748
 
13746
13749
 
13747
13750
 
@@ -14166,6 +14169,149 @@ const useHoneyOverlay = (targetOverlayId, { onKeyUp } = {}) => {
14166
14169
  };
14167
14170
 
14168
14171
 
14172
+ /***/ },
14173
+
14174
+ /***/ "./src/hooks/use-honey-raf-loop.ts"
14175
+ /*!*****************************************!*\
14176
+ !*** ./src/hooks/use-honey-raf-loop.ts ***!
14177
+ \*****************************************/
14178
+ (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
14179
+
14180
+ "use strict";
14181
+ __webpack_require__.r(__webpack_exports__);
14182
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
14183
+ /* harmony export */ useHoneyRafLoop: () => (/* binding */ useHoneyRafLoop)
14184
+ /* harmony export */ });
14185
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
14186
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
14187
+
14188
+ /**
14189
+ * A hook for running a controlled `requestAnimationFrame` loop.
14190
+ *
14191
+ * Features:
14192
+ * - Explicit RAF lifecycle control (`start` / `stop`)
14193
+ * - Delta time (`dt`) calculation with frame clamping
14194
+ * - Automatic cleanup on unmounting
14195
+ * - Conservative handling of tab visibility changes (mobile-safe)
14196
+ * - Safe error handling (stops loop on exception)
14197
+ *
14198
+ * Visibility behavior:
14199
+ * - The RAF loop is always stopped when the document becomes hidden
14200
+ * - Automatic resume is disabled by default and must be explicitly enabled
14201
+ *
14202
+ * This hook is designed for gesture handling, inertia, physics simulations,
14203
+ * and animation loops that must not trigger React re-renders on every frame.
14204
+ *
14205
+ * @param callback - Function invoked on each animation frame.
14206
+ * @param options - Optional configuration for the RAF loop.
14207
+ *
14208
+ * @returns Control helpers and RAF loop state.
14209
+ *
14210
+ * @example
14211
+ * ```ts
14212
+ * // Gesture-driven inertia (recommended usage)
14213
+ * // The RAF loop stops itself when motion decays.
14214
+ *
14215
+ * const velocityRef = useRef({ x: 12, y: 4 });
14216
+ *
14217
+ * const onFrame = useCallback<HoneyRafCallback>(
14218
+ * (dtMs, { stop }) => {
14219
+ * velocityRef.current.x *= 0.94;
14220
+ * velocityRef.current.y *= 0.94;
14221
+ *
14222
+ * setPosition(p => ({
14223
+ * x: p.x + velocityRef.current.x,
14224
+ * y: p.y + velocityRef.current.y,
14225
+ * }));
14226
+ *
14227
+ * if (
14228
+ * Math.abs(velocityRef.current.x) < 0.1 &&
14229
+ * Math.abs(velocityRef.current.y) < 0.1
14230
+ * ) {
14231
+ * stop(); // terminate RAF loop
14232
+ * }
14233
+ * },
14234
+ * [],
14235
+ * );
14236
+ *
14237
+ * useHoneyRafLoop(onFrame);
14238
+ * ```
14239
+ */
14240
+ const useHoneyRafLoop = (callback, { autoStart = false, resumeOnVisibility = false, maxDeltaMs = 32, // ~30fps clamp
14241
+ onError, } = {}) => {
14242
+ const rafIdRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);
14243
+ const lastTimeRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);
14244
+ const callbackRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(callback);
14245
+ // Always keep the latest callback without restarting RAF
14246
+ callbackRef.current = callback;
14247
+ const [isRafLoopRunning, setIsRafLoopRunning] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
14248
+ const loop = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(time => {
14249
+ if (lastTimeRef.current === null) {
14250
+ lastTimeRef.current = time;
14251
+ }
14252
+ let dt = time - lastTimeRef.current;
14253
+ lastTimeRef.current = time;
14254
+ // Clamp delta (prevents jumps after background tab / lag)
14255
+ if (dt > maxDeltaMs) {
14256
+ dt = maxDeltaMs;
14257
+ }
14258
+ try {
14259
+ callbackRef.current(dt, {
14260
+ stop: stopRafLoop,
14261
+ });
14262
+ rafIdRef.current = requestAnimationFrame(loop);
14263
+ }
14264
+ catch (e) {
14265
+ stopRafLoop();
14266
+ onError?.(e);
14267
+ }
14268
+ }, [maxDeltaMs, onError]);
14269
+ const startRafLoop = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {
14270
+ if (rafIdRef.current !== null) {
14271
+ return;
14272
+ }
14273
+ lastTimeRef.current = null;
14274
+ setIsRafLoopRunning(true);
14275
+ rafIdRef.current = requestAnimationFrame(loop);
14276
+ }, [loop]);
14277
+ const stopRafLoop = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {
14278
+ if (rafIdRef.current === null) {
14279
+ return;
14280
+ }
14281
+ cancelAnimationFrame(rafIdRef.current);
14282
+ rafIdRef.current = null;
14283
+ lastTimeRef.current = null;
14284
+ setIsRafLoopRunning(false);
14285
+ }, []);
14286
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
14287
+ if (autoStart) {
14288
+ startRafLoop();
14289
+ }
14290
+ return stopRafLoop;
14291
+ }, [autoStart, startRafLoop, stopRafLoop]);
14292
+ // Pause when a tab is hidden (important for mobile)
14293
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
14294
+ const onVisibilityChange = () => {
14295
+ if (document.hidden) {
14296
+ stopRafLoop();
14297
+ }
14298
+ else if (resumeOnVisibility && autoStart) {
14299
+ startRafLoop();
14300
+ }
14301
+ };
14302
+ document.addEventListener('visibilitychange', onVisibilityChange);
14303
+ return () => {
14304
+ document.removeEventListener('visibilitychange', onVisibilityChange);
14305
+ };
14306
+ }, [autoStart, resumeOnVisibility, startRafLoop, stopRafLoop]);
14307
+ return {
14308
+ startRafLoop,
14309
+ stopRafLoop,
14310
+ isRafLoopRunning,
14311
+ };
14312
+ };
14313
+
14314
+
14169
14315
  /***/ },
14170
14316
 
14171
14317
  /***/ "./src/hooks/use-honey-resize.ts"
@@ -15260,6 +15406,7 @@ __webpack_require__.r(__webpack_exports__);
15260
15406
  /* harmony export */ useHoneyOverlay: () => (/* reexport safe */ _hooks__WEBPACK_IMPORTED_MODULE_5__.useHoneyOverlay),
15261
15407
  /* harmony export */ useHoneyPopup: () => (/* reexport safe */ _components__WEBPACK_IMPORTED_MODULE_3__.useHoneyPopup),
15262
15408
  /* harmony export */ useHoneyPopupContext: () => (/* reexport safe */ _components__WEBPACK_IMPORTED_MODULE_3__.useHoneyPopupContext),
15409
+ /* harmony export */ useHoneyRafLoop: () => (/* reexport safe */ _hooks__WEBPACK_IMPORTED_MODULE_5__.useHoneyRafLoop),
15263
15410
  /* harmony export */ useHoneyResize: () => (/* reexport safe */ _hooks__WEBPACK_IMPORTED_MODULE_5__.useHoneyResize),
15264
15411
  /* harmony export */ useHoneySyntheticScroll: () => (/* reexport safe */ _hooks__WEBPACK_IMPORTED_MODULE_5__.useHoneySyntheticScroll),
15265
15412
  /* harmony export */ useHoneySyntheticScrollX: () => (/* reexport safe */ _hooks__WEBPACK_IMPORTED_MODULE_5__.useHoneySyntheticScrollX),