@reactuses/core 4.0.6 → 4.0.8

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/README.md CHANGED
@@ -32,7 +32,7 @@ Collection of essential React Hooks Utilities.
32
32
  ```tsx harmony
33
33
  import { useToggle } from "@reactuses/core";
34
34
 
35
- const Demo = () => {
35
+ function Demo() {
36
36
  const [on, toggle] = useToggle(true);
37
37
 
38
38
  return (
@@ -43,7 +43,7 @@ const Demo = () => {
43
43
  <button onClick={() => toggle(false)}>set OFF</button>
44
44
  </div>
45
45
  );
46
- };
46
+ }
47
47
  ```
48
48
 
49
49
  Refer to [documentations](https://reactuse.com/) for more details.
@@ -56,6 +56,12 @@ Refer to [documentations](https://reactuse.com/) for more details.
56
56
 
57
57
  <hr/>
58
58
 
59
+ ## Feedback
60
+
61
+ You can submit an [issue](https://github.com/childrentime/reactuse/issues) or provide feedback on [Discord](https://discord.gg/WzDtCCFF).
62
+
63
+ <hr/>
64
+
59
65
  ## Contribute
60
66
 
61
67
  See the [**Contributing Guide**](CONTRIBUTING.md)
package/dist/index.cjs CHANGED
@@ -81,7 +81,7 @@ function useEvent(fn) {
81
81
  }, []);
82
82
  }
83
83
 
84
- const defaultOptions = {};
84
+ const defaultOptions$1 = {};
85
85
  const defaultOnError = (e) => {
86
86
  console.error(e);
87
87
  };
@@ -120,7 +120,7 @@ const StorageSerializers = {
120
120
  write: (v) => v.toISOString()
121
121
  }
122
122
  };
123
- const getInitialState$3 = (key, defaultValue, storage, serializer, onError) => {
123
+ const getInitialState$4 = (key, defaultValue, storage, serializer, onError) => {
124
124
  if (defaultValue !== void 0) {
125
125
  return defaultValue;
126
126
  }
@@ -141,7 +141,7 @@ const getInitialState$3 = (key, defaultValue, storage, serializer, onError) => {
141
141
  }
142
142
  return null;
143
143
  };
144
- function useStorage(key, defaultValue, getStorage = () => isBrowser ? sessionStorage : void 0, options = defaultOptions) {
144
+ function useStorage(key, defaultValue, getStorage = () => isBrowser ? sessionStorage : void 0, options = defaultOptions$1) {
145
145
  let storage;
146
146
  const { onError = defaultOnError, csrData } = options;
147
147
  try {
@@ -155,7 +155,7 @@ function useStorage(key, defaultValue, getStorage = () => isBrowser ? sessionSto
155
155
  return (_a = options.serializer) != null ? _a : StorageSerializers[type];
156
156
  }, [options.serializer, type]);
157
157
  const [state, setState] = React.useState(
158
- getInitialState$3(key, defaultValue, storage, serializer, onError)
158
+ getInitialState$4(key, defaultValue, storage, serializer, onError)
159
159
  );
160
160
  React.useEffect(() => {
161
161
  const data = csrData ? isFunction$1(csrData) ? csrData() : csrData : defaultValue;
@@ -192,7 +192,7 @@ function useStorage(key, defaultValue, getStorage = () => isBrowser ? sessionSto
192
192
  return [state, updateState];
193
193
  }
194
194
 
195
- function useLocalStorage(key, defaultValue, options = defaultOptions) {
195
+ function useLocalStorage(key, defaultValue, options = defaultOptions$1) {
196
196
  return useStorage(
197
197
  key,
198
198
  defaultValue,
@@ -201,7 +201,7 @@ function useLocalStorage(key, defaultValue, options = defaultOptions) {
201
201
  );
202
202
  }
203
203
 
204
- function useSessionStorage(key, defaultValue, options = defaultOptions) {
204
+ function useSessionStorage(key, defaultValue, options = defaultOptions$1) {
205
205
  return useStorage(
206
206
  key,
207
207
  defaultValue,
@@ -215,7 +215,7 @@ function useToggle(initialValue) {
215
215
  return React.useReducer(toggleReducer, initialValue);
216
216
  }
217
217
 
218
- function useInterval(callback, delay, options = defaultOptions) {
218
+ function useInterval(callback, delay, options = defaultOptions$1) {
219
219
  const immediate = options.immediate;
220
220
  const savedCallback = useLatest(callback);
221
221
  React.useEffect(() => {
@@ -279,7 +279,7 @@ function useDarkMode(options) {
279
279
  return [dark, () => setDark((dark2) => !dark2), setDark];
280
280
  }
281
281
 
282
- const getInitialState$2 = (query, defaultState) => {
282
+ const getInitialState$3 = (query, defaultState) => {
283
283
  if (defaultState !== void 0) {
284
284
  return defaultState;
285
285
  }
@@ -294,7 +294,7 @@ const getInitialState$2 = (query, defaultState) => {
294
294
  return false;
295
295
  };
296
296
  function useMediaQuery(query, defaultState) {
297
- const [state, setState] = React.useState(getInitialState$2(query, defaultState));
297
+ const [state, setState] = React.useState(getInitialState$3(query, defaultState));
298
298
  React.useEffect(() => {
299
299
  var _a;
300
300
  let mounted = true;
@@ -785,7 +785,7 @@ function baseIsNative(value) {
785
785
  * @param {string} key The key of the property to get.
786
786
  * @returns {*} Returns the property value.
787
787
  */
788
- function getValue(object, key) {
788
+ function getValue$1(object, key) {
789
789
  return object == null ? undefined : object[key];
790
790
  }
791
791
 
@@ -798,7 +798,7 @@ function getValue(object, key) {
798
798
  * @returns {*} Returns the function if it's native, else `undefined`.
799
799
  */
800
800
  function getNative(object, key) {
801
- var value = getValue(object, key);
801
+ var value = getValue$1(object, key);
802
802
  return baseIsNative(value) ? value : undefined;
803
803
  }
804
804
 
@@ -2873,7 +2873,7 @@ function useUpdate() {
2873
2873
  return update;
2874
2874
  }
2875
2875
 
2876
- function useTimeoutFn(cb, interval, options = defaultOptions) {
2876
+ function useTimeoutFn(cb, interval, options = defaultOptions$1) {
2877
2877
  const { immediate = true } = options;
2878
2878
  const [pending, setPending] = React.useState(false);
2879
2879
  const savedCallback = useLatest(cb);
@@ -2963,7 +2963,7 @@ function useLatestElement(target, defaultElement) {
2963
2963
  return latestElement;
2964
2964
  }
2965
2965
 
2966
- function useEventListener(eventName, handler, element, options = defaultOptions) {
2966
+ function useEventListener(eventName, handler, element, options = defaultOptions$1) {
2967
2967
  const savedHandler = useLatest(handler);
2968
2968
  const targetElement = useLatestElement(element, defaultWindow);
2969
2969
  React.useEffect(() => {
@@ -3120,7 +3120,7 @@ function useFavicon(href, baseUrl = "", rel = "icon") {
3120
3120
  }, [baseUrl, href, rel]);
3121
3121
  }
3122
3122
 
3123
- function useMutationObserver(callback, target, options = defaultOptions) {
3123
+ function useMutationObserver(callback, target, options = defaultOptions$1) {
3124
3124
  const callbackRef = useLatest(callback);
3125
3125
  const observerRef = React.useRef();
3126
3126
  const element = useLatestElement(target);
@@ -3189,7 +3189,7 @@ function useTitle(title) {
3189
3189
  }, [title]);
3190
3190
  }
3191
3191
 
3192
- function useScriptTag(src, onLoaded = noop, options = defaultOptions) {
3192
+ function useScriptTag(src, onLoaded = noop, options = defaultOptions$1) {
3193
3193
  const {
3194
3194
  immediate = true,
3195
3195
  manual = false,
@@ -3306,6 +3306,7 @@ function useScriptTag(src, onLoaded = noop, options = defaultOptions) {
3306
3306
  function usePermission(permissionDesc) {
3307
3307
  const [state, setState] = React.useState("");
3308
3308
  React.useEffect(() => {
3309
+ var _a;
3309
3310
  const desc = typeof permissionDesc === "string" ? { name: permissionDesc } : permissionDesc;
3310
3311
  let mounted = true;
3311
3312
  let permissionStatus = null;
@@ -3314,11 +3315,11 @@ function usePermission(permissionDesc) {
3314
3315
  return;
3315
3316
  }
3316
3317
  setState(() => {
3317
- var _a;
3318
- return (_a = permissionStatus == null ? void 0 : permissionStatus.state) != null ? _a : "";
3318
+ var _a2;
3319
+ return (_a2 = permissionStatus == null ? void 0 : permissionStatus.state) != null ? _a2 : "";
3319
3320
  });
3320
3321
  };
3321
- navigator.permissions.query(desc).then((status) => {
3322
+ (_a = navigator.permissions) == null ? void 0 : _a.query(desc).then((status) => {
3322
3323
  permissionStatus = status;
3323
3324
  on(permissionStatus, "change", onChange);
3324
3325
  onChange();
@@ -3343,7 +3344,7 @@ const preventDefault$1 = (ev) => {
3343
3344
  ev.preventDefault();
3344
3345
  }
3345
3346
  };
3346
- function useLongPress(callback, { isPreventDefault = true, delay = 300 } = defaultOptions) {
3347
+ function useLongPress(callback, { isPreventDefault = true, delay = 300 } = defaultOptions$1) {
3347
3348
  const timeout = React.useRef();
3348
3349
  const target = React.useRef();
3349
3350
  const start = React.useCallback(
@@ -3529,7 +3530,7 @@ function useMediaDevices(options = {}) {
3529
3530
  return [state, ensurePermissions];
3530
3531
  }
3531
3532
 
3532
- function useTextDirection(options = defaultOptions) {
3533
+ function useTextDirection(options = defaultOptions$1) {
3533
3534
  const { selector = "html", initialValue = "ltr" } = options;
3534
3535
  const getValue = () => {
3535
3536
  var _a, _b;
@@ -3556,18 +3557,18 @@ function useTextDirection(options = defaultOptions) {
3556
3557
  }
3557
3558
 
3558
3559
  const initState = {
3559
- screenX: NaN,
3560
- screenY: NaN,
3561
- clientX: NaN,
3562
- clientY: NaN,
3563
- pageX: NaN,
3564
- pageY: NaN,
3565
- elementX: NaN,
3566
- elementY: NaN,
3567
- elementH: NaN,
3568
- elementW: NaN,
3569
- elementPosX: NaN,
3570
- elementPosY: NaN
3560
+ screenX: Number.NaN,
3561
+ screenY: Number.NaN,
3562
+ clientX: Number.NaN,
3563
+ clientY: Number.NaN,
3564
+ pageX: Number.NaN,
3565
+ pageY: Number.NaN,
3566
+ elementX: Number.NaN,
3567
+ elementY: Number.NaN,
3568
+ elementH: Number.NaN,
3569
+ elementW: Number.NaN,
3570
+ elementPosX: Number.NaN,
3571
+ elementPosY: Number.NaN
3571
3572
  };
3572
3573
  function useMouse(target) {
3573
3574
  const [state, setState] = useRafState(initState);
@@ -3582,12 +3583,12 @@ function useMouse(target) {
3582
3583
  clientY,
3583
3584
  pageX,
3584
3585
  pageY,
3585
- elementX: NaN,
3586
- elementY: NaN,
3587
- elementH: NaN,
3588
- elementW: NaN,
3589
- elementPosX: NaN,
3590
- elementPosY: NaN
3586
+ elementX: Number.NaN,
3587
+ elementY: Number.NaN,
3588
+ elementH: Number.NaN,
3589
+ elementW: Number.NaN,
3590
+ elementPosX: Number.NaN,
3591
+ elementPosY: Number.NaN
3591
3592
  };
3592
3593
  const targetElement = getTargetElement(target);
3593
3594
  if (targetElement) {
@@ -3606,7 +3607,7 @@ function useMouse(target) {
3606
3607
  return state;
3607
3608
  }
3608
3609
 
3609
- function useFps(options = defaultOptions) {
3610
+ function useFps(options = defaultOptions$1) {
3610
3611
  var _a;
3611
3612
  const [fps, setFps] = React.useState(0);
3612
3613
  const every = (_a = options.every) != null ? _a : 10;
@@ -3629,14 +3630,14 @@ var index$2 = typeof performance === "undefined" ? useFpsMock : useFps;
3629
3630
 
3630
3631
  const initCoord = {
3631
3632
  accuracy: 0,
3632
- latitude: Infinity,
3633
- longitude: Infinity,
3633
+ latitude: Number.POSITIVE_INFINITY,
3634
+ longitude: Number.POSITIVE_INFINITY,
3634
3635
  altitude: null,
3635
3636
  altitudeAccuracy: null,
3636
3637
  heading: null,
3637
3638
  speed: null
3638
3639
  };
3639
- function useGeolocation(options = defaultOptions) {
3640
+ function useGeolocation(options = defaultOptions$1) {
3640
3641
  const {
3641
3642
  enableHighAccuracy = true,
3642
3643
  maximumAge = 3e4,
@@ -3862,7 +3863,7 @@ var screenfull$1 = {exports: {}};
3862
3863
 
3863
3864
  var screenfull = screenfull$1.exports;
3864
3865
 
3865
- function useFullscreen(target, options = defaultOptions) {
3866
+ function useFullscreen(target, options = defaultOptions$1) {
3866
3867
  const { onExit, onEnter } = options;
3867
3868
  const [state, setState] = React.useState(false);
3868
3869
  const onChange = () => {
@@ -4014,7 +4015,7 @@ function useOrientation(initialState = defaultState$1) {
4014
4015
  return [state, lockOrientation, unlockOrientation];
4015
4016
  }
4016
4017
 
4017
- function useIntersectionObserver(target, callback, options = defaultOptions) {
4018
+ function useIntersectionObserver(target, callback, options = defaultOptions$1) {
4018
4019
  const savedCallback = useLatest(callback);
4019
4020
  const observerRef = React.useRef();
4020
4021
  const element = useLatestElement(target);
@@ -4052,7 +4053,7 @@ function usePageLeave() {
4052
4053
  return isLeft;
4053
4054
  }
4054
4055
 
4055
- const getInitialState$1 = (defaultValue) => {
4056
+ const getInitialState$2 = (defaultValue) => {
4056
4057
  if (defaultValue !== void 0) {
4057
4058
  return defaultValue;
4058
4059
  }
@@ -4068,7 +4069,7 @@ const getInitialState$1 = (defaultValue) => {
4068
4069
  };
4069
4070
  function useDocumentVisibility(defaultValue) {
4070
4071
  const [visible, setVisible] = React.useState(
4071
- getInitialState$1(defaultValue)
4072
+ getInitialState$2(defaultValue)
4072
4073
  );
4073
4074
  useEventListener(
4074
4075
  "visibilitychange",
@@ -4083,7 +4084,7 @@ function useDocumentVisibility(defaultValue) {
4083
4084
  return visible;
4084
4085
  }
4085
4086
 
4086
- function useResizeObserver(target, callback, options = defaultOptions) {
4087
+ function useResizeObserver(target, callback, options = defaultOptions$1) {
4087
4088
  const savedCallback = useLatest(callback);
4088
4089
  const observerRef = React.useRef();
4089
4090
  const element = useLatestElement(target);
@@ -4168,7 +4169,7 @@ const DEFAULT_OPTIONS = {
4168
4169
  multiple: true,
4169
4170
  accept: "*"
4170
4171
  };
4171
- function useFileDialog(options = defaultOptions) {
4172
+ function useFileDialog(options = defaultOptions$1) {
4172
4173
  const [files, setFiles] = React.useState(null);
4173
4174
  const inputRef = React.useRef();
4174
4175
  const initFn = React.useCallback(() => {
@@ -4208,7 +4209,7 @@ const defaultListerOptions = {
4208
4209
  capture: false,
4209
4210
  passive: true
4210
4211
  };
4211
- function useScroll(target, options = defaultOptions) {
4212
+ function useScroll(target, options = defaultOptions$1) {
4212
4213
  const {
4213
4214
  throttle = 0,
4214
4215
  idle = 200,
@@ -4315,7 +4316,7 @@ var __async$3 = (__this, __arguments, generator) => {
4315
4316
  step((generator = generator.apply(__this, __arguments)).next());
4316
4317
  });
4317
4318
  };
4318
- function useInfiniteScroll(target, onLoadMore, options = defaultOptions) {
4319
+ function useInfiniteScroll(target, onLoadMore, options = defaultOptions$1) {
4319
4320
  var _a, _b;
4320
4321
  const savedLoadMore = useLatest(onLoadMore);
4321
4322
  const direction = (_a = options.direction) != null ? _a : "bottom";
@@ -4351,7 +4352,7 @@ const defaultEvents = [
4351
4352
  "keydown",
4352
4353
  "keyup"
4353
4354
  ];
4354
- function useKeyModifier(modifier, options = defaultOptions) {
4355
+ function useKeyModifier(modifier, options = defaultOptions$1) {
4355
4356
  const { events = defaultEvents, initial = false } = options;
4356
4357
  const [state, setState] = React.useState(initial);
4357
4358
  useMount(() => {
@@ -4376,7 +4377,7 @@ function useKeyModifier(modifier, options = defaultOptions) {
4376
4377
  }
4377
4378
 
4378
4379
  const listenerOptions$2 = { passive: true };
4379
- function useMousePressed(target, options = defaultOptions) {
4380
+ function useMousePressed(target, options = defaultOptions$1) {
4380
4381
  const { touch = true, drag = true, initialValue = false } = options;
4381
4382
  const [pressed, setPressed] = React.useState(initialValue);
4382
4383
  const [sourceType, setSourceType] = React.useState(null);
@@ -4483,7 +4484,7 @@ function useScrollLock(target, initialState = false) {
4483
4484
  return [locked, set];
4484
4485
  }
4485
4486
 
4486
- function useElementSize(target, options = defaultOptions) {
4487
+ function useElementSize(target, options = defaultOptions$1) {
4487
4488
  const { box = "content-box" } = options;
4488
4489
  const [width, setWidth] = React.useState(0);
4489
4490
  const [height, setHeight] = React.useState(0);
@@ -4723,7 +4724,7 @@ function useDraggable(target, options = {}) {
4723
4724
  return [position.x, position.y, !!pressedDelta];
4724
4725
  }
4725
4726
 
4726
- function useElementBounding(target, options = defaultOptions) {
4727
+ function useElementBounding(target, options = defaultOptions$1) {
4727
4728
  const {
4728
4729
  reset = true,
4729
4730
  windowResize = true,
@@ -4798,7 +4799,7 @@ function useElementBounding(target, options = defaultOptions) {
4798
4799
  };
4799
4800
  }
4800
4801
 
4801
- function useElementVisibility(target, options = defaultOptions) {
4802
+ function useElementVisibility(target, options = defaultOptions$1) {
4802
4803
  const [visible, setVisible] = React.useState(false);
4803
4804
  const callback = React.useCallback((entries) => {
4804
4805
  const rect = entries[0].boundingClientRect;
@@ -5134,7 +5135,7 @@ function useScrollIntoView(targetElement, {
5134
5135
  offset = 0,
5135
5136
  cancelable = true,
5136
5137
  isList = false
5137
- } = defaultOptions, scrollElement) {
5138
+ } = defaultOptions$1, scrollElement) {
5138
5139
  const frameID = React.useRef(0);
5139
5140
  const startTime = React.useRef(0);
5140
5141
  const shouldStop = React.useRef(false);
@@ -5145,48 +5146,48 @@ function useScrollIntoView(targetElement, {
5145
5146
  }
5146
5147
  };
5147
5148
  const element = useLatestElement(targetElement);
5148
- const scrollIntoView = useEvent(
5149
- ({ alignment = "start" } = {}) => {
5150
- var _a;
5151
- const parent = getTargetElement(scrollElement) || getScrollParent(axis, element);
5152
- shouldStop.current = false;
5153
- if (frameID.current) {
5154
- cancel();
5149
+ const scrollIntoView = ({
5150
+ alignment = "start"
5151
+ } = {}) => {
5152
+ var _a;
5153
+ const parent = getTargetElement(scrollElement) || getScrollParent(axis, element);
5154
+ shouldStop.current = false;
5155
+ if (frameID.current) {
5156
+ cancel();
5157
+ }
5158
+ const start = (_a = getScrollStart({ parent, axis })) != null ? _a : 0;
5159
+ const change = getRelativePosition({
5160
+ parent,
5161
+ target: element,
5162
+ axis,
5163
+ alignment,
5164
+ offset,
5165
+ isList
5166
+ }) - (parent ? 0 : start);
5167
+ const animateScroll = () => {
5168
+ if (startTime.current === 0) {
5169
+ startTime.current = performance.now();
5155
5170
  }
5156
- const start = (_a = getScrollStart({ parent, axis })) != null ? _a : 0;
5157
- const change = getRelativePosition({
5171
+ const now = performance.now();
5172
+ const elapsed = now - startTime.current;
5173
+ const t = reducedMotion || duration === 0 ? 1 : elapsed / duration;
5174
+ const distance = start + change * easing(t);
5175
+ setScrollParam({
5158
5176
  parent,
5159
- target: element,
5160
5177
  axis,
5161
- alignment,
5162
- offset,
5163
- isList
5164
- }) - (parent ? 0 : start);
5165
- const animateScroll = () => {
5166
- if (startTime.current === 0) {
5167
- startTime.current = performance.now();
5168
- }
5169
- const now = performance.now();
5170
- const elapsed = now - startTime.current;
5171
- const t = reducedMotion || duration === 0 ? 1 : elapsed / duration;
5172
- const distance = start + change * easing(t);
5173
- setScrollParam({
5174
- parent,
5175
- axis,
5176
- distance
5177
- });
5178
- if (!shouldStop.current && t < 1) {
5179
- frameID.current = requestAnimationFrame(animateScroll);
5180
- } else {
5181
- typeof onScrollFinish === "function" && onScrollFinish();
5182
- startTime.current = 0;
5183
- frameID.current = 0;
5184
- cancel();
5185
- }
5186
- };
5187
- animateScroll();
5188
- }
5189
- );
5178
+ distance
5179
+ });
5180
+ if (!shouldStop.current && t < 1) {
5181
+ frameID.current = requestAnimationFrame(animateScroll);
5182
+ } else {
5183
+ typeof onScrollFinish === "function" && onScrollFinish();
5184
+ startTime.current = 0;
5185
+ frameID.current = 0;
5186
+ cancel();
5187
+ }
5188
+ };
5189
+ animateScroll();
5190
+ };
5190
5191
  const handleStop = () => {
5191
5192
  if (cancelable) {
5192
5193
  shouldStop.current = true;
@@ -5485,7 +5486,7 @@ function init (converter, defaultAttributes) {
5485
5486
 
5486
5487
  var api = init(defaultConverter, { path: '/' });
5487
5488
 
5488
- const getInitialState = (key, defaultValue) => {
5489
+ const getInitialState$1 = (key, defaultValue) => {
5489
5490
  if (defaultValue !== void 0) {
5490
5491
  return defaultValue;
5491
5492
  }
@@ -5499,9 +5500,9 @@ const getInitialState = (key, defaultValue) => {
5499
5500
  }
5500
5501
  return "";
5501
5502
  };
5502
- function useCookie(key, options = defaultOptions, defaultValue) {
5503
+ function useCookie(key, options = defaultOptions$1, defaultValue) {
5503
5504
  const [cookieValue, setCookieValue] = React.useState(
5504
- getInitialState(key, defaultValue)
5505
+ getInitialState$1(key, defaultValue)
5505
5506
  );
5506
5507
  React.useEffect(() => {
5507
5508
  const getStoredValue = () => {
@@ -5611,7 +5612,7 @@ const defaultState = {
5611
5612
  bottom: 0,
5612
5613
  right: 0
5613
5614
  };
5614
- function useMeasure(target, options = defaultOptions) {
5615
+ function useMeasure(target, options = defaultOptions$1) {
5615
5616
  const [rect, setRect] = React.useState(defaultState);
5616
5617
  const stop = useResizeObserver(
5617
5618
  target,
@@ -5635,6 +5636,111 @@ function useHover(target) {
5635
5636
  return hovered;
5636
5637
  }
5637
5638
 
5639
+ const defaultOptions = {
5640
+ observe: false
5641
+ };
5642
+ const getInitialState = (defaultValue) => {
5643
+ if (defaultValue !== void 0) {
5644
+ return defaultValue;
5645
+ }
5646
+ if (isBrowser) {
5647
+ return "";
5648
+ }
5649
+ if (process.env.NODE_ENV !== "production") {
5650
+ console.warn(
5651
+ "`useCssVar` When server side rendering, defaultValue should be defined to prevent a hydration mismatches."
5652
+ );
5653
+ }
5654
+ return "";
5655
+ };
5656
+ function useCssVar(prop, target, defaultValue, options = defaultOptions) {
5657
+ const { observe } = options;
5658
+ const [variable, setVariable] = React.useState(
5659
+ getInitialState(defaultValue)
5660
+ );
5661
+ const element = useLatestElement(target);
5662
+ const observerRef = React.useRef();
5663
+ const set = React.useCallback(
5664
+ (v) => {
5665
+ if (element == null ? void 0 : element.style) {
5666
+ element == null ? void 0 : element.style.setProperty(prop, v);
5667
+ setVariable(v);
5668
+ }
5669
+ },
5670
+ [element, prop]
5671
+ );
5672
+ const updateCssVar = React.useCallback(() => {
5673
+ var _a;
5674
+ if (element) {
5675
+ const value = (_a = window.getComputedStyle(element).getPropertyValue(prop)) == null ? void 0 : _a.trim();
5676
+ setVariable(value);
5677
+ }
5678
+ }, [element, prop]);
5679
+ React.useEffect(() => {
5680
+ var _a;
5681
+ if (!element) {
5682
+ return;
5683
+ }
5684
+ const value = (_a = window.getComputedStyle(element).getPropertyValue(prop)) == null ? void 0 : _a.trim();
5685
+ if (!value && defaultValue) {
5686
+ set(defaultValue);
5687
+ } else {
5688
+ updateCssVar();
5689
+ }
5690
+ if (!observe) {
5691
+ return;
5692
+ }
5693
+ observerRef.current = new MutationObserver(updateCssVar);
5694
+ observerRef.current.observe(element, {
5695
+ attributeFilter: ["style", "class"]
5696
+ });
5697
+ return () => {
5698
+ if (observerRef.current) {
5699
+ observerRef.current.disconnect();
5700
+ }
5701
+ };
5702
+ }, [observe, element, updateCssVar, set, defaultValue, prop]);
5703
+ return [variable, set];
5704
+ }
5705
+
5706
+ const topVarName = "--reactuse-safe-area-top";
5707
+ const rightVarName = "--reactuse-safe-area-right";
5708
+ const bottomVarName = "--reactuse-safe-area-bottom";
5709
+ const leftVarName = "--reactuse-safe-area-left";
5710
+ const defaultElement = () => document.documentElement;
5711
+ function useScreenSafeArea() {
5712
+ const top = React.useRef("");
5713
+ const right = React.useRef("");
5714
+ const bottom = React.useRef("");
5715
+ const left = React.useRef("");
5716
+ const forceUpdate = useUpdate();
5717
+ useCssVar(topVarName, defaultElement, "env(safe-area-inset-top, 0px)");
5718
+ useCssVar(rightVarName, defaultElement, "env(safe-area-inset-right, 0px)");
5719
+ useCssVar(bottomVarName, defaultElement, "env(safe-area-inset-bottom, 0px)");
5720
+ useCssVar(leftVarName, defaultElement, "env(safe-area-inset-left, 0px)");
5721
+ const { run: update } = useDebounceFn(() => {
5722
+ top.current = getValue(topVarName);
5723
+ right.current = getValue(rightVarName);
5724
+ bottom.current = getValue(bottomVarName);
5725
+ left.current = getValue(leftVarName);
5726
+ forceUpdate();
5727
+ });
5728
+ React.useEffect(() => {
5729
+ update();
5730
+ }, [update]);
5731
+ useEventListener("resize", update);
5732
+ return [
5733
+ top.current,
5734
+ right.current,
5735
+ bottom.current,
5736
+ left.current,
5737
+ update
5738
+ ];
5739
+ }
5740
+ function getValue(position) {
5741
+ return getComputedStyle(document.documentElement).getPropertyValue(position);
5742
+ }
5743
+
5638
5744
  exports.getHMSTime = getHMSTime;
5639
5745
  exports.useActiveElement = useActiveElement;
5640
5746
  exports.useAsyncEffect = useAsyncEffect;
@@ -5644,6 +5750,7 @@ exports.useControlled = useControlled;
5644
5750
  exports.useCookie = useCookie;
5645
5751
  exports.useCountDown = useCountDown;
5646
5752
  exports.useCounter = useCounter;
5753
+ exports.useCssVar = useCssVar;
5647
5754
  exports.useCustomCompareEffect = useCustomCompareEffect;
5648
5755
  exports.useCycleList = useCycleList;
5649
5756
  exports.useDarkMode = useDarkMode;
@@ -5702,6 +5809,7 @@ exports.useRafFn = useRafFn;
5702
5809
  exports.useRafState = useRafState;
5703
5810
  exports.useReducedMotion = useReducedMotion;
5704
5811
  exports.useResizeObserver = useResizeObserver;
5812
+ exports.useScreenSafeArea = useScreenSafeArea;
5705
5813
  exports.useScriptTag = useScriptTag;
5706
5814
  exports.useScroll = useScroll;
5707
5815
  exports.useScrollIntoView = useScrollIntoView;
package/dist/index.d.ts CHANGED
@@ -807,7 +807,7 @@ interface ScrollIntoViewParams {
807
807
  isList?: boolean;
808
808
  }
809
809
  declare function useScrollIntoView(targetElement: BasicTarget<HTMLElement>, { duration, axis, onScrollFinish, easing, offset, cancelable, isList, }?: ScrollIntoViewParams, scrollElement?: BasicTarget<HTMLElement>): {
810
- scrollIntoView: ({ alignment }?: ScrollIntoViewAnimation) => void;
810
+ scrollIntoView: ({ alignment, }?: ScrollIntoViewAnimation) => void;
811
811
  cancel: () => void;
812
812
  };
813
813
 
@@ -854,4 +854,15 @@ declare function useMeasure(target: BasicTarget, options?: ResizeObserverOptions
854
854
 
855
855
  declare function useHover<T extends HTMLElement = HTMLDivElement>(target: BasicTarget<T>): boolean;
856
856
 
857
- export { ColorScheme, Contrast, CursorState, EyeDropperOpenReturnType, GeneralPermissionDescriptor, IDisposable, IEvent, IEventOnce, IListener, INetworkInformation, IState, IUseNetworkState, KeyModifier, MousePressedOptions, MouseSourceType, OrientationState, RafLoopReturns, ScrollIntoViewAnimation, ScrollIntoViewParams, Status, Target, UseCookieState, UseDarkOptions, UseDraggableOptions, UseElementBoundingOptions, UseEventEmitterReturn, UseEyeDropperReturn, UseFileDialogOptions, UseFpsOptions, UseFullScreenOptions, UseInfiniteScrollOptions, UseLongPressOptions, UseMeasureRect, UseMediaDeviceOptions, UseModifierOptions, UseScriptTagOptions, UseScrollOptions, UseStickyParams, UseTextDirectionOptions, UseTextDirectionValue, UseTimeoutFnOptions, UseVirtualListItem, UseVirtualListOptions, UseVirtualListReturn, UseWindowScrollState, WindowSize, getHMSTime, useActiveElement, useAsyncEffect, useClickOutside, useClipBorad as useClipboard, useControlled, useCookie, useCountDown, useCounter, useCustomCompareEffect, useCycleList, useDarkMode, useDebounce, useDebounceFn, useDeepCompareEffect, useDocumentVisibility, useDoubleClick, useDraggable, useDropZone, useElementBounding, useElementSize, useElementVisibility, useEvent, useEventEmitter, useEventListener, useEyeDropper, useFavicon, useFileDialog, useFirstMountState, useFocus, _default$2 as useFps, useFullscreen, useGeolocation, useHover, useIdle, useInfiniteScroll, useIntersectionObserver, useInterval, useIsomorphicLayoutEffect, useKeyModifier, useLatest, useLocalStorage, useLongPress, useMeasure, useMediaDevices, useMediaQuery, useMount, useMountedState, useMouse, useMousePressed, useMutationObserver, useNetwork, useObjectUrl, _default$1 as useOnceEffect, _default as useOnceLayoutEffect, useOnline, useOrientation, usePageLeave, usePermission, usePreferredColorScheme, usePreferredContrast, usePreferredDark, usePrevious, useRafFn, useRafState, useReducedMotion, useResizeObserver, useScriptTag, useScroll, useScrollIntoView, useScrollLock, useSessionStorage, useSetState, useSticky, useSupported, useTextDirection, useTextSelection, useThrottle, useThrottleFn, useTimeout, useTimeoutFn, useTitle, useToggle, useUnmount, useUpdate, _default$4 as useUpdateEffect, _default$3 as useUpdateLayoutEffect, useVirtualList, useWindowScroll, useWindowSize, useWindowsFocus };
857
+ declare function useScreenSafeArea(): readonly [string, string, string, string, lodash.DebouncedFunc<() => void>];
858
+
859
+ interface UseCssVarOptions {
860
+ /**
861
+ * Use MutationObserver to monitor variable changes
862
+ * @default false
863
+ */
864
+ observe?: boolean;
865
+ }
866
+ declare function useCssVar<T extends HTMLElement = HTMLElement>(prop: string, target: BasicTarget<T>, defaultValue?: string, options?: UseCssVarOptions): readonly [string, (v: string) => void];
867
+
868
+ export { ColorScheme, Contrast, CursorState, EyeDropperOpenReturnType, GeneralPermissionDescriptor, IDisposable, IEvent, IEventOnce, IListener, INetworkInformation, IState, IUseNetworkState, KeyModifier, MousePressedOptions, MouseSourceType, OrientationState, RafLoopReturns, ScrollIntoViewAnimation, ScrollIntoViewParams, Status, Target, UseCookieState, UseCssVarOptions, UseDarkOptions, UseDraggableOptions, UseElementBoundingOptions, UseEventEmitterReturn, UseEyeDropperReturn, UseFileDialogOptions, UseFpsOptions, UseFullScreenOptions, UseInfiniteScrollOptions, UseLongPressOptions, UseMeasureRect, UseMediaDeviceOptions, UseModifierOptions, UseScriptTagOptions, UseScrollOptions, UseStickyParams, UseTextDirectionOptions, UseTextDirectionValue, UseTimeoutFnOptions, UseVirtualListItem, UseVirtualListOptions, UseVirtualListReturn, UseWindowScrollState, WindowSize, getHMSTime, useActiveElement, useAsyncEffect, useClickOutside, useClipBorad as useClipboard, useControlled, useCookie, useCountDown, useCounter, useCssVar, useCustomCompareEffect, useCycleList, useDarkMode, useDebounce, useDebounceFn, useDeepCompareEffect, useDocumentVisibility, useDoubleClick, useDraggable, useDropZone, useElementBounding, useElementSize, useElementVisibility, useEvent, useEventEmitter, useEventListener, useEyeDropper, useFavicon, useFileDialog, useFirstMountState, useFocus, _default$2 as useFps, useFullscreen, useGeolocation, useHover, useIdle, useInfiniteScroll, useIntersectionObserver, useInterval, useIsomorphicLayoutEffect, useKeyModifier, useLatest, useLocalStorage, useLongPress, useMeasure, useMediaDevices, useMediaQuery, useMount, useMountedState, useMouse, useMousePressed, useMutationObserver, useNetwork, useObjectUrl, _default$1 as useOnceEffect, _default as useOnceLayoutEffect, useOnline, useOrientation, usePageLeave, usePermission, usePreferredColorScheme, usePreferredContrast, usePreferredDark, usePrevious, useRafFn, useRafState, useReducedMotion, useResizeObserver, useScreenSafeArea, useScriptTag, useScroll, useScrollIntoView, useScrollLock, useSessionStorage, useSetState, useSticky, useSupported, useTextDirection, useTextSelection, useThrottle, useThrottleFn, useTimeout, useTimeoutFn, useTitle, useToggle, useUnmount, useUpdate, _default$4 as useUpdateEffect, _default$3 as useUpdateLayoutEffect, useVirtualList, useWindowScroll, useWindowSize, useWindowsFocus };
package/dist/index.mjs CHANGED
@@ -73,7 +73,7 @@ function useEvent(fn) {
73
73
  }, []);
74
74
  }
75
75
 
76
- const defaultOptions = {};
76
+ const defaultOptions$1 = {};
77
77
  const defaultOnError = (e) => {
78
78
  console.error(e);
79
79
  };
@@ -112,7 +112,7 @@ const StorageSerializers = {
112
112
  write: (v) => v.toISOString()
113
113
  }
114
114
  };
115
- const getInitialState$3 = (key, defaultValue, storage, serializer, onError) => {
115
+ const getInitialState$4 = (key, defaultValue, storage, serializer, onError) => {
116
116
  if (defaultValue !== void 0) {
117
117
  return defaultValue;
118
118
  }
@@ -133,7 +133,7 @@ const getInitialState$3 = (key, defaultValue, storage, serializer, onError) => {
133
133
  }
134
134
  return null;
135
135
  };
136
- function useStorage(key, defaultValue, getStorage = () => isBrowser ? sessionStorage : void 0, options = defaultOptions) {
136
+ function useStorage(key, defaultValue, getStorage = () => isBrowser ? sessionStorage : void 0, options = defaultOptions$1) {
137
137
  let storage;
138
138
  const { onError = defaultOnError, csrData } = options;
139
139
  try {
@@ -147,7 +147,7 @@ function useStorage(key, defaultValue, getStorage = () => isBrowser ? sessionSto
147
147
  return (_a = options.serializer) != null ? _a : StorageSerializers[type];
148
148
  }, [options.serializer, type]);
149
149
  const [state, setState] = useState(
150
- getInitialState$3(key, defaultValue, storage, serializer, onError)
150
+ getInitialState$4(key, defaultValue, storage, serializer, onError)
151
151
  );
152
152
  useEffect(() => {
153
153
  const data = csrData ? isFunction$1(csrData) ? csrData() : csrData : defaultValue;
@@ -184,7 +184,7 @@ function useStorage(key, defaultValue, getStorage = () => isBrowser ? sessionSto
184
184
  return [state, updateState];
185
185
  }
186
186
 
187
- function useLocalStorage(key, defaultValue, options = defaultOptions) {
187
+ function useLocalStorage(key, defaultValue, options = defaultOptions$1) {
188
188
  return useStorage(
189
189
  key,
190
190
  defaultValue,
@@ -193,7 +193,7 @@ function useLocalStorage(key, defaultValue, options = defaultOptions) {
193
193
  );
194
194
  }
195
195
 
196
- function useSessionStorage(key, defaultValue, options = defaultOptions) {
196
+ function useSessionStorage(key, defaultValue, options = defaultOptions$1) {
197
197
  return useStorage(
198
198
  key,
199
199
  defaultValue,
@@ -207,7 +207,7 @@ function useToggle(initialValue) {
207
207
  return useReducer(toggleReducer, initialValue);
208
208
  }
209
209
 
210
- function useInterval(callback, delay, options = defaultOptions) {
210
+ function useInterval(callback, delay, options = defaultOptions$1) {
211
211
  const immediate = options.immediate;
212
212
  const savedCallback = useLatest(callback);
213
213
  useEffect(() => {
@@ -271,7 +271,7 @@ function useDarkMode(options) {
271
271
  return [dark, () => setDark((dark2) => !dark2), setDark];
272
272
  }
273
273
 
274
- const getInitialState$2 = (query, defaultState) => {
274
+ const getInitialState$3 = (query, defaultState) => {
275
275
  if (defaultState !== void 0) {
276
276
  return defaultState;
277
277
  }
@@ -286,7 +286,7 @@ const getInitialState$2 = (query, defaultState) => {
286
286
  return false;
287
287
  };
288
288
  function useMediaQuery(query, defaultState) {
289
- const [state, setState] = useState(getInitialState$2(query, defaultState));
289
+ const [state, setState] = useState(getInitialState$3(query, defaultState));
290
290
  useEffect(() => {
291
291
  var _a;
292
292
  let mounted = true;
@@ -777,7 +777,7 @@ function baseIsNative(value) {
777
777
  * @param {string} key The key of the property to get.
778
778
  * @returns {*} Returns the property value.
779
779
  */
780
- function getValue(object, key) {
780
+ function getValue$1(object, key) {
781
781
  return object == null ? undefined : object[key];
782
782
  }
783
783
 
@@ -790,7 +790,7 @@ function getValue(object, key) {
790
790
  * @returns {*} Returns the function if it's native, else `undefined`.
791
791
  */
792
792
  function getNative(object, key) {
793
- var value = getValue(object, key);
793
+ var value = getValue$1(object, key);
794
794
  return baseIsNative(value) ? value : undefined;
795
795
  }
796
796
 
@@ -2865,7 +2865,7 @@ function useUpdate() {
2865
2865
  return update;
2866
2866
  }
2867
2867
 
2868
- function useTimeoutFn(cb, interval, options = defaultOptions) {
2868
+ function useTimeoutFn(cb, interval, options = defaultOptions$1) {
2869
2869
  const { immediate = true } = options;
2870
2870
  const [pending, setPending] = useState(false);
2871
2871
  const savedCallback = useLatest(cb);
@@ -2955,7 +2955,7 @@ function useLatestElement(target, defaultElement) {
2955
2955
  return latestElement;
2956
2956
  }
2957
2957
 
2958
- function useEventListener(eventName, handler, element, options = defaultOptions) {
2958
+ function useEventListener(eventName, handler, element, options = defaultOptions$1) {
2959
2959
  const savedHandler = useLatest(handler);
2960
2960
  const targetElement = useLatestElement(element, defaultWindow);
2961
2961
  useEffect(() => {
@@ -3112,7 +3112,7 @@ function useFavicon(href, baseUrl = "", rel = "icon") {
3112
3112
  }, [baseUrl, href, rel]);
3113
3113
  }
3114
3114
 
3115
- function useMutationObserver(callback, target, options = defaultOptions) {
3115
+ function useMutationObserver(callback, target, options = defaultOptions$1) {
3116
3116
  const callbackRef = useLatest(callback);
3117
3117
  const observerRef = useRef();
3118
3118
  const element = useLatestElement(target);
@@ -3181,7 +3181,7 @@ function useTitle(title) {
3181
3181
  }, [title]);
3182
3182
  }
3183
3183
 
3184
- function useScriptTag(src, onLoaded = noop, options = defaultOptions) {
3184
+ function useScriptTag(src, onLoaded = noop, options = defaultOptions$1) {
3185
3185
  const {
3186
3186
  immediate = true,
3187
3187
  manual = false,
@@ -3298,6 +3298,7 @@ function useScriptTag(src, onLoaded = noop, options = defaultOptions) {
3298
3298
  function usePermission(permissionDesc) {
3299
3299
  const [state, setState] = useState("");
3300
3300
  useEffect(() => {
3301
+ var _a;
3301
3302
  const desc = typeof permissionDesc === "string" ? { name: permissionDesc } : permissionDesc;
3302
3303
  let mounted = true;
3303
3304
  let permissionStatus = null;
@@ -3306,11 +3307,11 @@ function usePermission(permissionDesc) {
3306
3307
  return;
3307
3308
  }
3308
3309
  setState(() => {
3309
- var _a;
3310
- return (_a = permissionStatus == null ? void 0 : permissionStatus.state) != null ? _a : "";
3310
+ var _a2;
3311
+ return (_a2 = permissionStatus == null ? void 0 : permissionStatus.state) != null ? _a2 : "";
3311
3312
  });
3312
3313
  };
3313
- navigator.permissions.query(desc).then((status) => {
3314
+ (_a = navigator.permissions) == null ? void 0 : _a.query(desc).then((status) => {
3314
3315
  permissionStatus = status;
3315
3316
  on(permissionStatus, "change", onChange);
3316
3317
  onChange();
@@ -3335,7 +3336,7 @@ const preventDefault$1 = (ev) => {
3335
3336
  ev.preventDefault();
3336
3337
  }
3337
3338
  };
3338
- function useLongPress(callback, { isPreventDefault = true, delay = 300 } = defaultOptions) {
3339
+ function useLongPress(callback, { isPreventDefault = true, delay = 300 } = defaultOptions$1) {
3339
3340
  const timeout = useRef();
3340
3341
  const target = useRef();
3341
3342
  const start = useCallback(
@@ -3521,7 +3522,7 @@ function useMediaDevices(options = {}) {
3521
3522
  return [state, ensurePermissions];
3522
3523
  }
3523
3524
 
3524
- function useTextDirection(options = defaultOptions) {
3525
+ function useTextDirection(options = defaultOptions$1) {
3525
3526
  const { selector = "html", initialValue = "ltr" } = options;
3526
3527
  const getValue = () => {
3527
3528
  var _a, _b;
@@ -3548,18 +3549,18 @@ function useTextDirection(options = defaultOptions) {
3548
3549
  }
3549
3550
 
3550
3551
  const initState = {
3551
- screenX: NaN,
3552
- screenY: NaN,
3553
- clientX: NaN,
3554
- clientY: NaN,
3555
- pageX: NaN,
3556
- pageY: NaN,
3557
- elementX: NaN,
3558
- elementY: NaN,
3559
- elementH: NaN,
3560
- elementW: NaN,
3561
- elementPosX: NaN,
3562
- elementPosY: NaN
3552
+ screenX: Number.NaN,
3553
+ screenY: Number.NaN,
3554
+ clientX: Number.NaN,
3555
+ clientY: Number.NaN,
3556
+ pageX: Number.NaN,
3557
+ pageY: Number.NaN,
3558
+ elementX: Number.NaN,
3559
+ elementY: Number.NaN,
3560
+ elementH: Number.NaN,
3561
+ elementW: Number.NaN,
3562
+ elementPosX: Number.NaN,
3563
+ elementPosY: Number.NaN
3563
3564
  };
3564
3565
  function useMouse(target) {
3565
3566
  const [state, setState] = useRafState(initState);
@@ -3574,12 +3575,12 @@ function useMouse(target) {
3574
3575
  clientY,
3575
3576
  pageX,
3576
3577
  pageY,
3577
- elementX: NaN,
3578
- elementY: NaN,
3579
- elementH: NaN,
3580
- elementW: NaN,
3581
- elementPosX: NaN,
3582
- elementPosY: NaN
3578
+ elementX: Number.NaN,
3579
+ elementY: Number.NaN,
3580
+ elementH: Number.NaN,
3581
+ elementW: Number.NaN,
3582
+ elementPosX: Number.NaN,
3583
+ elementPosY: Number.NaN
3583
3584
  };
3584
3585
  const targetElement = getTargetElement(target);
3585
3586
  if (targetElement) {
@@ -3598,7 +3599,7 @@ function useMouse(target) {
3598
3599
  return state;
3599
3600
  }
3600
3601
 
3601
- function useFps(options = defaultOptions) {
3602
+ function useFps(options = defaultOptions$1) {
3602
3603
  var _a;
3603
3604
  const [fps, setFps] = useState(0);
3604
3605
  const every = (_a = options.every) != null ? _a : 10;
@@ -3621,14 +3622,14 @@ var index$2 = typeof performance === "undefined" ? useFpsMock : useFps;
3621
3622
 
3622
3623
  const initCoord = {
3623
3624
  accuracy: 0,
3624
- latitude: Infinity,
3625
- longitude: Infinity,
3625
+ latitude: Number.POSITIVE_INFINITY,
3626
+ longitude: Number.POSITIVE_INFINITY,
3626
3627
  altitude: null,
3627
3628
  altitudeAccuracy: null,
3628
3629
  heading: null,
3629
3630
  speed: null
3630
3631
  };
3631
- function useGeolocation(options = defaultOptions) {
3632
+ function useGeolocation(options = defaultOptions$1) {
3632
3633
  const {
3633
3634
  enableHighAccuracy = true,
3634
3635
  maximumAge = 3e4,
@@ -3854,7 +3855,7 @@ var screenfull$1 = {exports: {}};
3854
3855
 
3855
3856
  var screenfull = screenfull$1.exports;
3856
3857
 
3857
- function useFullscreen(target, options = defaultOptions) {
3858
+ function useFullscreen(target, options = defaultOptions$1) {
3858
3859
  const { onExit, onEnter } = options;
3859
3860
  const [state, setState] = useState(false);
3860
3861
  const onChange = () => {
@@ -4006,7 +4007,7 @@ function useOrientation(initialState = defaultState$1) {
4006
4007
  return [state, lockOrientation, unlockOrientation];
4007
4008
  }
4008
4009
 
4009
- function useIntersectionObserver(target, callback, options = defaultOptions) {
4010
+ function useIntersectionObserver(target, callback, options = defaultOptions$1) {
4010
4011
  const savedCallback = useLatest(callback);
4011
4012
  const observerRef = useRef();
4012
4013
  const element = useLatestElement(target);
@@ -4044,7 +4045,7 @@ function usePageLeave() {
4044
4045
  return isLeft;
4045
4046
  }
4046
4047
 
4047
- const getInitialState$1 = (defaultValue) => {
4048
+ const getInitialState$2 = (defaultValue) => {
4048
4049
  if (defaultValue !== void 0) {
4049
4050
  return defaultValue;
4050
4051
  }
@@ -4060,7 +4061,7 @@ const getInitialState$1 = (defaultValue) => {
4060
4061
  };
4061
4062
  function useDocumentVisibility(defaultValue) {
4062
4063
  const [visible, setVisible] = useState(
4063
- getInitialState$1(defaultValue)
4064
+ getInitialState$2(defaultValue)
4064
4065
  );
4065
4066
  useEventListener(
4066
4067
  "visibilitychange",
@@ -4075,7 +4076,7 @@ function useDocumentVisibility(defaultValue) {
4075
4076
  return visible;
4076
4077
  }
4077
4078
 
4078
- function useResizeObserver(target, callback, options = defaultOptions) {
4079
+ function useResizeObserver(target, callback, options = defaultOptions$1) {
4079
4080
  const savedCallback = useLatest(callback);
4080
4081
  const observerRef = useRef();
4081
4082
  const element = useLatestElement(target);
@@ -4160,7 +4161,7 @@ const DEFAULT_OPTIONS = {
4160
4161
  multiple: true,
4161
4162
  accept: "*"
4162
4163
  };
4163
- function useFileDialog(options = defaultOptions) {
4164
+ function useFileDialog(options = defaultOptions$1) {
4164
4165
  const [files, setFiles] = useState(null);
4165
4166
  const inputRef = useRef();
4166
4167
  const initFn = useCallback(() => {
@@ -4200,7 +4201,7 @@ const defaultListerOptions = {
4200
4201
  capture: false,
4201
4202
  passive: true
4202
4203
  };
4203
- function useScroll(target, options = defaultOptions) {
4204
+ function useScroll(target, options = defaultOptions$1) {
4204
4205
  const {
4205
4206
  throttle = 0,
4206
4207
  idle = 200,
@@ -4307,7 +4308,7 @@ var __async$3 = (__this, __arguments, generator) => {
4307
4308
  step((generator = generator.apply(__this, __arguments)).next());
4308
4309
  });
4309
4310
  };
4310
- function useInfiniteScroll(target, onLoadMore, options = defaultOptions) {
4311
+ function useInfiniteScroll(target, onLoadMore, options = defaultOptions$1) {
4311
4312
  var _a, _b;
4312
4313
  const savedLoadMore = useLatest(onLoadMore);
4313
4314
  const direction = (_a = options.direction) != null ? _a : "bottom";
@@ -4343,7 +4344,7 @@ const defaultEvents = [
4343
4344
  "keydown",
4344
4345
  "keyup"
4345
4346
  ];
4346
- function useKeyModifier(modifier, options = defaultOptions) {
4347
+ function useKeyModifier(modifier, options = defaultOptions$1) {
4347
4348
  const { events = defaultEvents, initial = false } = options;
4348
4349
  const [state, setState] = useState(initial);
4349
4350
  useMount(() => {
@@ -4368,7 +4369,7 @@ function useKeyModifier(modifier, options = defaultOptions) {
4368
4369
  }
4369
4370
 
4370
4371
  const listenerOptions$2 = { passive: true };
4371
- function useMousePressed(target, options = defaultOptions) {
4372
+ function useMousePressed(target, options = defaultOptions$1) {
4372
4373
  const { touch = true, drag = true, initialValue = false } = options;
4373
4374
  const [pressed, setPressed] = useState(initialValue);
4374
4375
  const [sourceType, setSourceType] = useState(null);
@@ -4475,7 +4476,7 @@ function useScrollLock(target, initialState = false) {
4475
4476
  return [locked, set];
4476
4477
  }
4477
4478
 
4478
- function useElementSize(target, options = defaultOptions) {
4479
+ function useElementSize(target, options = defaultOptions$1) {
4479
4480
  const { box = "content-box" } = options;
4480
4481
  const [width, setWidth] = useState(0);
4481
4482
  const [height, setHeight] = useState(0);
@@ -4715,7 +4716,7 @@ function useDraggable(target, options = {}) {
4715
4716
  return [position.x, position.y, !!pressedDelta];
4716
4717
  }
4717
4718
 
4718
- function useElementBounding(target, options = defaultOptions) {
4719
+ function useElementBounding(target, options = defaultOptions$1) {
4719
4720
  const {
4720
4721
  reset = true,
4721
4722
  windowResize = true,
@@ -4790,7 +4791,7 @@ function useElementBounding(target, options = defaultOptions) {
4790
4791
  };
4791
4792
  }
4792
4793
 
4793
- function useElementVisibility(target, options = defaultOptions) {
4794
+ function useElementVisibility(target, options = defaultOptions$1) {
4794
4795
  const [visible, setVisible] = useState(false);
4795
4796
  const callback = useCallback((entries) => {
4796
4797
  const rect = entries[0].boundingClientRect;
@@ -5126,7 +5127,7 @@ function useScrollIntoView(targetElement, {
5126
5127
  offset = 0,
5127
5128
  cancelable = true,
5128
5129
  isList = false
5129
- } = defaultOptions, scrollElement) {
5130
+ } = defaultOptions$1, scrollElement) {
5130
5131
  const frameID = useRef(0);
5131
5132
  const startTime = useRef(0);
5132
5133
  const shouldStop = useRef(false);
@@ -5137,48 +5138,48 @@ function useScrollIntoView(targetElement, {
5137
5138
  }
5138
5139
  };
5139
5140
  const element = useLatestElement(targetElement);
5140
- const scrollIntoView = useEvent(
5141
- ({ alignment = "start" } = {}) => {
5142
- var _a;
5143
- const parent = getTargetElement(scrollElement) || getScrollParent(axis, element);
5144
- shouldStop.current = false;
5145
- if (frameID.current) {
5146
- cancel();
5141
+ const scrollIntoView = ({
5142
+ alignment = "start"
5143
+ } = {}) => {
5144
+ var _a;
5145
+ const parent = getTargetElement(scrollElement) || getScrollParent(axis, element);
5146
+ shouldStop.current = false;
5147
+ if (frameID.current) {
5148
+ cancel();
5149
+ }
5150
+ const start = (_a = getScrollStart({ parent, axis })) != null ? _a : 0;
5151
+ const change = getRelativePosition({
5152
+ parent,
5153
+ target: element,
5154
+ axis,
5155
+ alignment,
5156
+ offset,
5157
+ isList
5158
+ }) - (parent ? 0 : start);
5159
+ const animateScroll = () => {
5160
+ if (startTime.current === 0) {
5161
+ startTime.current = performance.now();
5147
5162
  }
5148
- const start = (_a = getScrollStart({ parent, axis })) != null ? _a : 0;
5149
- const change = getRelativePosition({
5163
+ const now = performance.now();
5164
+ const elapsed = now - startTime.current;
5165
+ const t = reducedMotion || duration === 0 ? 1 : elapsed / duration;
5166
+ const distance = start + change * easing(t);
5167
+ setScrollParam({
5150
5168
  parent,
5151
- target: element,
5152
5169
  axis,
5153
- alignment,
5154
- offset,
5155
- isList
5156
- }) - (parent ? 0 : start);
5157
- const animateScroll = () => {
5158
- if (startTime.current === 0) {
5159
- startTime.current = performance.now();
5160
- }
5161
- const now = performance.now();
5162
- const elapsed = now - startTime.current;
5163
- const t = reducedMotion || duration === 0 ? 1 : elapsed / duration;
5164
- const distance = start + change * easing(t);
5165
- setScrollParam({
5166
- parent,
5167
- axis,
5168
- distance
5169
- });
5170
- if (!shouldStop.current && t < 1) {
5171
- frameID.current = requestAnimationFrame(animateScroll);
5172
- } else {
5173
- typeof onScrollFinish === "function" && onScrollFinish();
5174
- startTime.current = 0;
5175
- frameID.current = 0;
5176
- cancel();
5177
- }
5178
- };
5179
- animateScroll();
5180
- }
5181
- );
5170
+ distance
5171
+ });
5172
+ if (!shouldStop.current && t < 1) {
5173
+ frameID.current = requestAnimationFrame(animateScroll);
5174
+ } else {
5175
+ typeof onScrollFinish === "function" && onScrollFinish();
5176
+ startTime.current = 0;
5177
+ frameID.current = 0;
5178
+ cancel();
5179
+ }
5180
+ };
5181
+ animateScroll();
5182
+ };
5182
5183
  const handleStop = () => {
5183
5184
  if (cancelable) {
5184
5185
  shouldStop.current = true;
@@ -5477,7 +5478,7 @@ function init (converter, defaultAttributes) {
5477
5478
 
5478
5479
  var api = init(defaultConverter, { path: '/' });
5479
5480
 
5480
- const getInitialState = (key, defaultValue) => {
5481
+ const getInitialState$1 = (key, defaultValue) => {
5481
5482
  if (defaultValue !== void 0) {
5482
5483
  return defaultValue;
5483
5484
  }
@@ -5491,9 +5492,9 @@ const getInitialState = (key, defaultValue) => {
5491
5492
  }
5492
5493
  return "";
5493
5494
  };
5494
- function useCookie(key, options = defaultOptions, defaultValue) {
5495
+ function useCookie(key, options = defaultOptions$1, defaultValue) {
5495
5496
  const [cookieValue, setCookieValue] = useState(
5496
- getInitialState(key, defaultValue)
5497
+ getInitialState$1(key, defaultValue)
5497
5498
  );
5498
5499
  useEffect(() => {
5499
5500
  const getStoredValue = () => {
@@ -5603,7 +5604,7 @@ const defaultState = {
5603
5604
  bottom: 0,
5604
5605
  right: 0
5605
5606
  };
5606
- function useMeasure(target, options = defaultOptions) {
5607
+ function useMeasure(target, options = defaultOptions$1) {
5607
5608
  const [rect, setRect] = useState(defaultState);
5608
5609
  const stop = useResizeObserver(
5609
5610
  target,
@@ -5627,4 +5628,109 @@ function useHover(target) {
5627
5628
  return hovered;
5628
5629
  }
5629
5630
 
5630
- export { getHMSTime, useActiveElement, useAsyncEffect, useClickOutside, useClipBorad as useClipboard, useControlled, useCookie, useCountDown, useCounter, useCustomCompareEffect, useCycleList, useDarkMode, useDebounce, useDebounceFn, useDeepCompareEffect, useDocumentVisibility, useDoubleClick, useDraggable, useDropZone, useElementBounding, useElementSize, useElementVisibility, useEvent, useEventEmitter, useEventListener, useEyeDropper, useFavicon, useFileDialog, useFirstMountState, useFocus, index$2 as useFps, useFullscreen, useGeolocation, useHover, useIdle, useInfiniteScroll, useIntersectionObserver, useInterval, useIsomorphicLayoutEffect, useKeyModifier, useLatest, useLocalStorage, useLongPress, useMeasure, useMediaDevices, useMediaQuery, useMount, useMountedState, useMouse, useMousePressed, useMutationObserver, useNetwork, useObjectUrl, index$1 as useOnceEffect, index as useOnceLayoutEffect, useOnline, useOrientation, usePageLeave, usePermission, usePreferredColorScheme, usePreferredContrast, usePreferredDark, usePrevious, useRafFn, useRafState, useReducedMotion, useResizeObserver, useScriptTag, useScroll, useScrollIntoView, useScrollLock, useSessionStorage, useSetState, useSticky, useSupported, useTextDirection, useTextSelection, useThrottle, useThrottleFn, useTimeout, useTimeoutFn, useTitle, useToggle, useUnmount, useUpdate, useUpdateEffect, index$3 as useUpdateLayoutEffect, useVirtualList, useWindowScroll, useWindowSize, useWindowsFocus };
5631
+ const defaultOptions = {
5632
+ observe: false
5633
+ };
5634
+ const getInitialState = (defaultValue) => {
5635
+ if (defaultValue !== void 0) {
5636
+ return defaultValue;
5637
+ }
5638
+ if (isBrowser) {
5639
+ return "";
5640
+ }
5641
+ if (process.env.NODE_ENV !== "production") {
5642
+ console.warn(
5643
+ "`useCssVar` When server side rendering, defaultValue should be defined to prevent a hydration mismatches."
5644
+ );
5645
+ }
5646
+ return "";
5647
+ };
5648
+ function useCssVar(prop, target, defaultValue, options = defaultOptions) {
5649
+ const { observe } = options;
5650
+ const [variable, setVariable] = useState(
5651
+ getInitialState(defaultValue)
5652
+ );
5653
+ const element = useLatestElement(target);
5654
+ const observerRef = useRef();
5655
+ const set = useCallback(
5656
+ (v) => {
5657
+ if (element == null ? void 0 : element.style) {
5658
+ element == null ? void 0 : element.style.setProperty(prop, v);
5659
+ setVariable(v);
5660
+ }
5661
+ },
5662
+ [element, prop]
5663
+ );
5664
+ const updateCssVar = useCallback(() => {
5665
+ var _a;
5666
+ if (element) {
5667
+ const value = (_a = window.getComputedStyle(element).getPropertyValue(prop)) == null ? void 0 : _a.trim();
5668
+ setVariable(value);
5669
+ }
5670
+ }, [element, prop]);
5671
+ useEffect(() => {
5672
+ var _a;
5673
+ if (!element) {
5674
+ return;
5675
+ }
5676
+ const value = (_a = window.getComputedStyle(element).getPropertyValue(prop)) == null ? void 0 : _a.trim();
5677
+ if (!value && defaultValue) {
5678
+ set(defaultValue);
5679
+ } else {
5680
+ updateCssVar();
5681
+ }
5682
+ if (!observe) {
5683
+ return;
5684
+ }
5685
+ observerRef.current = new MutationObserver(updateCssVar);
5686
+ observerRef.current.observe(element, {
5687
+ attributeFilter: ["style", "class"]
5688
+ });
5689
+ return () => {
5690
+ if (observerRef.current) {
5691
+ observerRef.current.disconnect();
5692
+ }
5693
+ };
5694
+ }, [observe, element, updateCssVar, set, defaultValue, prop]);
5695
+ return [variable, set];
5696
+ }
5697
+
5698
+ const topVarName = "--reactuse-safe-area-top";
5699
+ const rightVarName = "--reactuse-safe-area-right";
5700
+ const bottomVarName = "--reactuse-safe-area-bottom";
5701
+ const leftVarName = "--reactuse-safe-area-left";
5702
+ const defaultElement = () => document.documentElement;
5703
+ function useScreenSafeArea() {
5704
+ const top = useRef("");
5705
+ const right = useRef("");
5706
+ const bottom = useRef("");
5707
+ const left = useRef("");
5708
+ const forceUpdate = useUpdate();
5709
+ useCssVar(topVarName, defaultElement, "env(safe-area-inset-top, 0px)");
5710
+ useCssVar(rightVarName, defaultElement, "env(safe-area-inset-right, 0px)");
5711
+ useCssVar(bottomVarName, defaultElement, "env(safe-area-inset-bottom, 0px)");
5712
+ useCssVar(leftVarName, defaultElement, "env(safe-area-inset-left, 0px)");
5713
+ const { run: update } = useDebounceFn(() => {
5714
+ top.current = getValue(topVarName);
5715
+ right.current = getValue(rightVarName);
5716
+ bottom.current = getValue(bottomVarName);
5717
+ left.current = getValue(leftVarName);
5718
+ forceUpdate();
5719
+ });
5720
+ useEffect(() => {
5721
+ update();
5722
+ }, [update]);
5723
+ useEventListener("resize", update);
5724
+ return [
5725
+ top.current,
5726
+ right.current,
5727
+ bottom.current,
5728
+ left.current,
5729
+ update
5730
+ ];
5731
+ }
5732
+ function getValue(position) {
5733
+ return getComputedStyle(document.documentElement).getPropertyValue(position);
5734
+ }
5735
+
5736
+ export { getHMSTime, useActiveElement, useAsyncEffect, useClickOutside, useClipBorad as useClipboard, useControlled, useCookie, useCountDown, useCounter, useCssVar, useCustomCompareEffect, useCycleList, useDarkMode, useDebounce, useDebounceFn, useDeepCompareEffect, useDocumentVisibility, useDoubleClick, useDraggable, useDropZone, useElementBounding, useElementSize, useElementVisibility, useEvent, useEventEmitter, useEventListener, useEyeDropper, useFavicon, useFileDialog, useFirstMountState, useFocus, index$2 as useFps, useFullscreen, useGeolocation, useHover, useIdle, useInfiniteScroll, useIntersectionObserver, useInterval, useIsomorphicLayoutEffect, useKeyModifier, useLatest, useLocalStorage, useLongPress, useMeasure, useMediaDevices, useMediaQuery, useMount, useMountedState, useMouse, useMousePressed, useMutationObserver, useNetwork, useObjectUrl, index$1 as useOnceEffect, index as useOnceLayoutEffect, useOnline, useOrientation, usePageLeave, usePermission, usePreferredColorScheme, usePreferredContrast, usePreferredDark, usePrevious, useRafFn, useRafState, useReducedMotion, useResizeObserver, useScreenSafeArea, useScriptTag, useScroll, useScrollIntoView, useScrollLock, useSessionStorage, useSetState, useSticky, useSupported, useTextDirection, useTextSelection, useThrottle, useThrottleFn, useTimeout, useTimeoutFn, useTitle, useToggle, useUnmount, useUpdate, useUpdateEffect, index$3 as useUpdateLayoutEffect, useVirtualList, useWindowScroll, useWindowSize, useWindowsFocus };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reactuses/core",
3
- "version": "4.0.6",
3
+ "version": "4.0.8",
4
4
  "license": "Unlicense",
5
5
  "homepage": "https://www.reactuse.com/",
6
6
  "repository": {
@@ -57,6 +57,9 @@
57
57
  "screenfull": "^5.0.0"
58
58
  },
59
59
  "devDependencies": {
60
+ "@types/js-cookie": "^3.0.3",
61
+ "@types/lodash": "^4.14.184",
62
+ "@types/lodash-es": "^4.17.7",
60
63
  "@jsdevtools/version-bump-prompt": "^6.1.0",
61
64
  "@rollup/plugin-commonjs": "^22.0.2",
62
65
  "@rollup/plugin-json": "^4.1.0",