@reactuses/core 4.0.6 → 4.0.7

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/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,
@@ -3343,7 +3343,7 @@ const preventDefault$1 = (ev) => {
3343
3343
  ev.preventDefault();
3344
3344
  }
3345
3345
  };
3346
- function useLongPress(callback, { isPreventDefault = true, delay = 300 } = defaultOptions) {
3346
+ function useLongPress(callback, { isPreventDefault = true, delay = 300 } = defaultOptions$1) {
3347
3347
  const timeout = React.useRef();
3348
3348
  const target = React.useRef();
3349
3349
  const start = React.useCallback(
@@ -3529,7 +3529,7 @@ function useMediaDevices(options = {}) {
3529
3529
  return [state, ensurePermissions];
3530
3530
  }
3531
3531
 
3532
- function useTextDirection(options = defaultOptions) {
3532
+ function useTextDirection(options = defaultOptions$1) {
3533
3533
  const { selector = "html", initialValue = "ltr" } = options;
3534
3534
  const getValue = () => {
3535
3535
  var _a, _b;
@@ -3556,18 +3556,18 @@ function useTextDirection(options = defaultOptions) {
3556
3556
  }
3557
3557
 
3558
3558
  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
3559
+ screenX: Number.NaN,
3560
+ screenY: Number.NaN,
3561
+ clientX: Number.NaN,
3562
+ clientY: Number.NaN,
3563
+ pageX: Number.NaN,
3564
+ pageY: Number.NaN,
3565
+ elementX: Number.NaN,
3566
+ elementY: Number.NaN,
3567
+ elementH: Number.NaN,
3568
+ elementW: Number.NaN,
3569
+ elementPosX: Number.NaN,
3570
+ elementPosY: Number.NaN
3571
3571
  };
3572
3572
  function useMouse(target) {
3573
3573
  const [state, setState] = useRafState(initState);
@@ -3582,12 +3582,12 @@ function useMouse(target) {
3582
3582
  clientY,
3583
3583
  pageX,
3584
3584
  pageY,
3585
- elementX: NaN,
3586
- elementY: NaN,
3587
- elementH: NaN,
3588
- elementW: NaN,
3589
- elementPosX: NaN,
3590
- elementPosY: NaN
3585
+ elementX: Number.NaN,
3586
+ elementY: Number.NaN,
3587
+ elementH: Number.NaN,
3588
+ elementW: Number.NaN,
3589
+ elementPosX: Number.NaN,
3590
+ elementPosY: Number.NaN
3591
3591
  };
3592
3592
  const targetElement = getTargetElement(target);
3593
3593
  if (targetElement) {
@@ -3606,7 +3606,7 @@ function useMouse(target) {
3606
3606
  return state;
3607
3607
  }
3608
3608
 
3609
- function useFps(options = defaultOptions) {
3609
+ function useFps(options = defaultOptions$1) {
3610
3610
  var _a;
3611
3611
  const [fps, setFps] = React.useState(0);
3612
3612
  const every = (_a = options.every) != null ? _a : 10;
@@ -3629,14 +3629,14 @@ var index$2 = typeof performance === "undefined" ? useFpsMock : useFps;
3629
3629
 
3630
3630
  const initCoord = {
3631
3631
  accuracy: 0,
3632
- latitude: Infinity,
3633
- longitude: Infinity,
3632
+ latitude: Number.POSITIVE_INFINITY,
3633
+ longitude: Number.POSITIVE_INFINITY,
3634
3634
  altitude: null,
3635
3635
  altitudeAccuracy: null,
3636
3636
  heading: null,
3637
3637
  speed: null
3638
3638
  };
3639
- function useGeolocation(options = defaultOptions) {
3639
+ function useGeolocation(options = defaultOptions$1) {
3640
3640
  const {
3641
3641
  enableHighAccuracy = true,
3642
3642
  maximumAge = 3e4,
@@ -3862,7 +3862,7 @@ var screenfull$1 = {exports: {}};
3862
3862
 
3863
3863
  var screenfull = screenfull$1.exports;
3864
3864
 
3865
- function useFullscreen(target, options = defaultOptions) {
3865
+ function useFullscreen(target, options = defaultOptions$1) {
3866
3866
  const { onExit, onEnter } = options;
3867
3867
  const [state, setState] = React.useState(false);
3868
3868
  const onChange = () => {
@@ -4014,7 +4014,7 @@ function useOrientation(initialState = defaultState$1) {
4014
4014
  return [state, lockOrientation, unlockOrientation];
4015
4015
  }
4016
4016
 
4017
- function useIntersectionObserver(target, callback, options = defaultOptions) {
4017
+ function useIntersectionObserver(target, callback, options = defaultOptions$1) {
4018
4018
  const savedCallback = useLatest(callback);
4019
4019
  const observerRef = React.useRef();
4020
4020
  const element = useLatestElement(target);
@@ -4052,7 +4052,7 @@ function usePageLeave() {
4052
4052
  return isLeft;
4053
4053
  }
4054
4054
 
4055
- const getInitialState$1 = (defaultValue) => {
4055
+ const getInitialState$2 = (defaultValue) => {
4056
4056
  if (defaultValue !== void 0) {
4057
4057
  return defaultValue;
4058
4058
  }
@@ -4068,7 +4068,7 @@ const getInitialState$1 = (defaultValue) => {
4068
4068
  };
4069
4069
  function useDocumentVisibility(defaultValue) {
4070
4070
  const [visible, setVisible] = React.useState(
4071
- getInitialState$1(defaultValue)
4071
+ getInitialState$2(defaultValue)
4072
4072
  );
4073
4073
  useEventListener(
4074
4074
  "visibilitychange",
@@ -4083,7 +4083,7 @@ function useDocumentVisibility(defaultValue) {
4083
4083
  return visible;
4084
4084
  }
4085
4085
 
4086
- function useResizeObserver(target, callback, options = defaultOptions) {
4086
+ function useResizeObserver(target, callback, options = defaultOptions$1) {
4087
4087
  const savedCallback = useLatest(callback);
4088
4088
  const observerRef = React.useRef();
4089
4089
  const element = useLatestElement(target);
@@ -4168,7 +4168,7 @@ const DEFAULT_OPTIONS = {
4168
4168
  multiple: true,
4169
4169
  accept: "*"
4170
4170
  };
4171
- function useFileDialog(options = defaultOptions) {
4171
+ function useFileDialog(options = defaultOptions$1) {
4172
4172
  const [files, setFiles] = React.useState(null);
4173
4173
  const inputRef = React.useRef();
4174
4174
  const initFn = React.useCallback(() => {
@@ -4208,7 +4208,7 @@ const defaultListerOptions = {
4208
4208
  capture: false,
4209
4209
  passive: true
4210
4210
  };
4211
- function useScroll(target, options = defaultOptions) {
4211
+ function useScroll(target, options = defaultOptions$1) {
4212
4212
  const {
4213
4213
  throttle = 0,
4214
4214
  idle = 200,
@@ -4315,7 +4315,7 @@ var __async$3 = (__this, __arguments, generator) => {
4315
4315
  step((generator = generator.apply(__this, __arguments)).next());
4316
4316
  });
4317
4317
  };
4318
- function useInfiniteScroll(target, onLoadMore, options = defaultOptions) {
4318
+ function useInfiniteScroll(target, onLoadMore, options = defaultOptions$1) {
4319
4319
  var _a, _b;
4320
4320
  const savedLoadMore = useLatest(onLoadMore);
4321
4321
  const direction = (_a = options.direction) != null ? _a : "bottom";
@@ -4351,7 +4351,7 @@ const defaultEvents = [
4351
4351
  "keydown",
4352
4352
  "keyup"
4353
4353
  ];
4354
- function useKeyModifier(modifier, options = defaultOptions) {
4354
+ function useKeyModifier(modifier, options = defaultOptions$1) {
4355
4355
  const { events = defaultEvents, initial = false } = options;
4356
4356
  const [state, setState] = React.useState(initial);
4357
4357
  useMount(() => {
@@ -4376,7 +4376,7 @@ function useKeyModifier(modifier, options = defaultOptions) {
4376
4376
  }
4377
4377
 
4378
4378
  const listenerOptions$2 = { passive: true };
4379
- function useMousePressed(target, options = defaultOptions) {
4379
+ function useMousePressed(target, options = defaultOptions$1) {
4380
4380
  const { touch = true, drag = true, initialValue = false } = options;
4381
4381
  const [pressed, setPressed] = React.useState(initialValue);
4382
4382
  const [sourceType, setSourceType] = React.useState(null);
@@ -4483,7 +4483,7 @@ function useScrollLock(target, initialState = false) {
4483
4483
  return [locked, set];
4484
4484
  }
4485
4485
 
4486
- function useElementSize(target, options = defaultOptions) {
4486
+ function useElementSize(target, options = defaultOptions$1) {
4487
4487
  const { box = "content-box" } = options;
4488
4488
  const [width, setWidth] = React.useState(0);
4489
4489
  const [height, setHeight] = React.useState(0);
@@ -4723,7 +4723,7 @@ function useDraggable(target, options = {}) {
4723
4723
  return [position.x, position.y, !!pressedDelta];
4724
4724
  }
4725
4725
 
4726
- function useElementBounding(target, options = defaultOptions) {
4726
+ function useElementBounding(target, options = defaultOptions$1) {
4727
4727
  const {
4728
4728
  reset = true,
4729
4729
  windowResize = true,
@@ -4798,7 +4798,7 @@ function useElementBounding(target, options = defaultOptions) {
4798
4798
  };
4799
4799
  }
4800
4800
 
4801
- function useElementVisibility(target, options = defaultOptions) {
4801
+ function useElementVisibility(target, options = defaultOptions$1) {
4802
4802
  const [visible, setVisible] = React.useState(false);
4803
4803
  const callback = React.useCallback((entries) => {
4804
4804
  const rect = entries[0].boundingClientRect;
@@ -5134,7 +5134,7 @@ function useScrollIntoView(targetElement, {
5134
5134
  offset = 0,
5135
5135
  cancelable = true,
5136
5136
  isList = false
5137
- } = defaultOptions, scrollElement) {
5137
+ } = defaultOptions$1, scrollElement) {
5138
5138
  const frameID = React.useRef(0);
5139
5139
  const startTime = React.useRef(0);
5140
5140
  const shouldStop = React.useRef(false);
@@ -5145,48 +5145,48 @@ function useScrollIntoView(targetElement, {
5145
5145
  }
5146
5146
  };
5147
5147
  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();
5148
+ const scrollIntoView = ({
5149
+ alignment = "start"
5150
+ } = {}) => {
5151
+ var _a;
5152
+ const parent = getTargetElement(scrollElement) || getScrollParent(axis, element);
5153
+ shouldStop.current = false;
5154
+ if (frameID.current) {
5155
+ cancel();
5156
+ }
5157
+ const start = (_a = getScrollStart({ parent, axis })) != null ? _a : 0;
5158
+ const change = getRelativePosition({
5159
+ parent,
5160
+ target: element,
5161
+ axis,
5162
+ alignment,
5163
+ offset,
5164
+ isList
5165
+ }) - (parent ? 0 : start);
5166
+ const animateScroll = () => {
5167
+ if (startTime.current === 0) {
5168
+ startTime.current = performance.now();
5155
5169
  }
5156
- const start = (_a = getScrollStart({ parent, axis })) != null ? _a : 0;
5157
- const change = getRelativePosition({
5170
+ const now = performance.now();
5171
+ const elapsed = now - startTime.current;
5172
+ const t = reducedMotion || duration === 0 ? 1 : elapsed / duration;
5173
+ const distance = start + change * easing(t);
5174
+ setScrollParam({
5158
5175
  parent,
5159
- target: element,
5160
5176
  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
- );
5177
+ distance
5178
+ });
5179
+ if (!shouldStop.current && t < 1) {
5180
+ frameID.current = requestAnimationFrame(animateScroll);
5181
+ } else {
5182
+ typeof onScrollFinish === "function" && onScrollFinish();
5183
+ startTime.current = 0;
5184
+ frameID.current = 0;
5185
+ cancel();
5186
+ }
5187
+ };
5188
+ animateScroll();
5189
+ };
5190
5190
  const handleStop = () => {
5191
5191
  if (cancelable) {
5192
5192
  shouldStop.current = true;
@@ -5485,7 +5485,7 @@ function init (converter, defaultAttributes) {
5485
5485
 
5486
5486
  var api = init(defaultConverter, { path: '/' });
5487
5487
 
5488
- const getInitialState = (key, defaultValue) => {
5488
+ const getInitialState$1 = (key, defaultValue) => {
5489
5489
  if (defaultValue !== void 0) {
5490
5490
  return defaultValue;
5491
5491
  }
@@ -5499,9 +5499,9 @@ const getInitialState = (key, defaultValue) => {
5499
5499
  }
5500
5500
  return "";
5501
5501
  };
5502
- function useCookie(key, options = defaultOptions, defaultValue) {
5502
+ function useCookie(key, options = defaultOptions$1, defaultValue) {
5503
5503
  const [cookieValue, setCookieValue] = React.useState(
5504
- getInitialState(key, defaultValue)
5504
+ getInitialState$1(key, defaultValue)
5505
5505
  );
5506
5506
  React.useEffect(() => {
5507
5507
  const getStoredValue = () => {
@@ -5611,7 +5611,7 @@ const defaultState = {
5611
5611
  bottom: 0,
5612
5612
  right: 0
5613
5613
  };
5614
- function useMeasure(target, options = defaultOptions) {
5614
+ function useMeasure(target, options = defaultOptions$1) {
5615
5615
  const [rect, setRect] = React.useState(defaultState);
5616
5616
  const stop = useResizeObserver(
5617
5617
  target,
@@ -5635,6 +5635,111 @@ function useHover(target) {
5635
5635
  return hovered;
5636
5636
  }
5637
5637
 
5638
+ const defaultOptions = {
5639
+ observe: false
5640
+ };
5641
+ const getInitialState = (defaultValue) => {
5642
+ if (defaultValue !== void 0) {
5643
+ return defaultValue;
5644
+ }
5645
+ if (isBrowser) {
5646
+ return "";
5647
+ }
5648
+ if (process.env.NODE_ENV !== "production") {
5649
+ console.warn(
5650
+ "`useCssVar` When server side rendering, defaultValue should be defined to prevent a hydration mismatches."
5651
+ );
5652
+ }
5653
+ return "";
5654
+ };
5655
+ function useCssVar(prop, target, defaultValue, options = defaultOptions) {
5656
+ const { observe } = options;
5657
+ const [variable, setVariable] = React.useState(
5658
+ getInitialState(defaultValue)
5659
+ );
5660
+ const element = useLatestElement(target);
5661
+ const observerRef = React.useRef();
5662
+ const set = React.useCallback(
5663
+ (v) => {
5664
+ if (element == null ? void 0 : element.style) {
5665
+ element == null ? void 0 : element.style.setProperty(prop, v);
5666
+ setVariable(v);
5667
+ }
5668
+ },
5669
+ [element, prop]
5670
+ );
5671
+ const updateCssVar = React.useCallback(() => {
5672
+ var _a;
5673
+ if (element) {
5674
+ const value = (_a = window.getComputedStyle(element).getPropertyValue(prop)) == null ? void 0 : _a.trim();
5675
+ setVariable(value);
5676
+ }
5677
+ }, [element, prop]);
5678
+ React.useEffect(() => {
5679
+ var _a;
5680
+ if (!element) {
5681
+ return;
5682
+ }
5683
+ const value = (_a = window.getComputedStyle(element).getPropertyValue(prop)) == null ? void 0 : _a.trim();
5684
+ if (!value && defaultValue) {
5685
+ set(defaultValue);
5686
+ } else {
5687
+ updateCssVar();
5688
+ }
5689
+ if (!observe) {
5690
+ return;
5691
+ }
5692
+ observerRef.current = new MutationObserver(updateCssVar);
5693
+ observerRef.current.observe(element, {
5694
+ attributeFilter: ["style", "class"]
5695
+ });
5696
+ return () => {
5697
+ if (observerRef.current) {
5698
+ observerRef.current.disconnect();
5699
+ }
5700
+ };
5701
+ }, [observe, element, updateCssVar, set, defaultValue, prop]);
5702
+ return [variable, set];
5703
+ }
5704
+
5705
+ const topVarName = "--reactuse-safe-area-top";
5706
+ const rightVarName = "--reactuse-safe-area-right";
5707
+ const bottomVarName = "--reactuse-safe-area-bottom";
5708
+ const leftVarName = "--reactuse-safe-area-left";
5709
+ const defaultElement = () => document.documentElement;
5710
+ function useScreenSafeArea() {
5711
+ const top = React.useRef("");
5712
+ const right = React.useRef("");
5713
+ const bottom = React.useRef("");
5714
+ const left = React.useRef("");
5715
+ const forceUpdate = useUpdate();
5716
+ useCssVar(topVarName, defaultElement, "env(safe-area-inset-top, 0px)");
5717
+ useCssVar(rightVarName, defaultElement, "env(safe-area-inset-right, 0px)");
5718
+ useCssVar(bottomVarName, defaultElement, "env(safe-area-inset-bottom, 0px)");
5719
+ useCssVar(leftVarName, defaultElement, "env(safe-area-inset-left, 0px)");
5720
+ const { run: update } = useDebounceFn(() => {
5721
+ top.current = getValue(topVarName);
5722
+ right.current = getValue(rightVarName);
5723
+ bottom.current = getValue(bottomVarName);
5724
+ left.current = getValue(leftVarName);
5725
+ forceUpdate();
5726
+ });
5727
+ React.useEffect(() => {
5728
+ update();
5729
+ }, [update]);
5730
+ useEventListener("resize", update);
5731
+ return [
5732
+ top.current,
5733
+ right.current,
5734
+ bottom.current,
5735
+ left.current,
5736
+ update
5737
+ ];
5738
+ }
5739
+ function getValue(position) {
5740
+ return getComputedStyle(document.documentElement).getPropertyValue(position);
5741
+ }
5742
+
5638
5743
  exports.getHMSTime = getHMSTime;
5639
5744
  exports.useActiveElement = useActiveElement;
5640
5745
  exports.useAsyncEffect = useAsyncEffect;
@@ -5644,6 +5749,7 @@ exports.useControlled = useControlled;
5644
5749
  exports.useCookie = useCookie;
5645
5750
  exports.useCountDown = useCountDown;
5646
5751
  exports.useCounter = useCounter;
5752
+ exports.useCssVar = useCssVar;
5647
5753
  exports.useCustomCompareEffect = useCustomCompareEffect;
5648
5754
  exports.useCycleList = useCycleList;
5649
5755
  exports.useDarkMode = useDarkMode;
@@ -5702,6 +5808,7 @@ exports.useRafFn = useRafFn;
5702
5808
  exports.useRafState = useRafState;
5703
5809
  exports.useReducedMotion = useReducedMotion;
5704
5810
  exports.useResizeObserver = useResizeObserver;
5811
+ exports.useScreenSafeArea = useScreenSafeArea;
5705
5812
  exports.useScriptTag = useScriptTag;
5706
5813
  exports.useScroll = useScroll;
5707
5814
  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,
@@ -3335,7 +3335,7 @@ const preventDefault$1 = (ev) => {
3335
3335
  ev.preventDefault();
3336
3336
  }
3337
3337
  };
3338
- function useLongPress(callback, { isPreventDefault = true, delay = 300 } = defaultOptions) {
3338
+ function useLongPress(callback, { isPreventDefault = true, delay = 300 } = defaultOptions$1) {
3339
3339
  const timeout = useRef();
3340
3340
  const target = useRef();
3341
3341
  const start = useCallback(
@@ -3521,7 +3521,7 @@ function useMediaDevices(options = {}) {
3521
3521
  return [state, ensurePermissions];
3522
3522
  }
3523
3523
 
3524
- function useTextDirection(options = defaultOptions) {
3524
+ function useTextDirection(options = defaultOptions$1) {
3525
3525
  const { selector = "html", initialValue = "ltr" } = options;
3526
3526
  const getValue = () => {
3527
3527
  var _a, _b;
@@ -3548,18 +3548,18 @@ function useTextDirection(options = defaultOptions) {
3548
3548
  }
3549
3549
 
3550
3550
  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
3551
+ screenX: Number.NaN,
3552
+ screenY: Number.NaN,
3553
+ clientX: Number.NaN,
3554
+ clientY: Number.NaN,
3555
+ pageX: Number.NaN,
3556
+ pageY: Number.NaN,
3557
+ elementX: Number.NaN,
3558
+ elementY: Number.NaN,
3559
+ elementH: Number.NaN,
3560
+ elementW: Number.NaN,
3561
+ elementPosX: Number.NaN,
3562
+ elementPosY: Number.NaN
3563
3563
  };
3564
3564
  function useMouse(target) {
3565
3565
  const [state, setState] = useRafState(initState);
@@ -3574,12 +3574,12 @@ function useMouse(target) {
3574
3574
  clientY,
3575
3575
  pageX,
3576
3576
  pageY,
3577
- elementX: NaN,
3578
- elementY: NaN,
3579
- elementH: NaN,
3580
- elementW: NaN,
3581
- elementPosX: NaN,
3582
- elementPosY: NaN
3577
+ elementX: Number.NaN,
3578
+ elementY: Number.NaN,
3579
+ elementH: Number.NaN,
3580
+ elementW: Number.NaN,
3581
+ elementPosX: Number.NaN,
3582
+ elementPosY: Number.NaN
3583
3583
  };
3584
3584
  const targetElement = getTargetElement(target);
3585
3585
  if (targetElement) {
@@ -3598,7 +3598,7 @@ function useMouse(target) {
3598
3598
  return state;
3599
3599
  }
3600
3600
 
3601
- function useFps(options = defaultOptions) {
3601
+ function useFps(options = defaultOptions$1) {
3602
3602
  var _a;
3603
3603
  const [fps, setFps] = useState(0);
3604
3604
  const every = (_a = options.every) != null ? _a : 10;
@@ -3621,14 +3621,14 @@ var index$2 = typeof performance === "undefined" ? useFpsMock : useFps;
3621
3621
 
3622
3622
  const initCoord = {
3623
3623
  accuracy: 0,
3624
- latitude: Infinity,
3625
- longitude: Infinity,
3624
+ latitude: Number.POSITIVE_INFINITY,
3625
+ longitude: Number.POSITIVE_INFINITY,
3626
3626
  altitude: null,
3627
3627
  altitudeAccuracy: null,
3628
3628
  heading: null,
3629
3629
  speed: null
3630
3630
  };
3631
- function useGeolocation(options = defaultOptions) {
3631
+ function useGeolocation(options = defaultOptions$1) {
3632
3632
  const {
3633
3633
  enableHighAccuracy = true,
3634
3634
  maximumAge = 3e4,
@@ -3854,7 +3854,7 @@ var screenfull$1 = {exports: {}};
3854
3854
 
3855
3855
  var screenfull = screenfull$1.exports;
3856
3856
 
3857
- function useFullscreen(target, options = defaultOptions) {
3857
+ function useFullscreen(target, options = defaultOptions$1) {
3858
3858
  const { onExit, onEnter } = options;
3859
3859
  const [state, setState] = useState(false);
3860
3860
  const onChange = () => {
@@ -4006,7 +4006,7 @@ function useOrientation(initialState = defaultState$1) {
4006
4006
  return [state, lockOrientation, unlockOrientation];
4007
4007
  }
4008
4008
 
4009
- function useIntersectionObserver(target, callback, options = defaultOptions) {
4009
+ function useIntersectionObserver(target, callback, options = defaultOptions$1) {
4010
4010
  const savedCallback = useLatest(callback);
4011
4011
  const observerRef = useRef();
4012
4012
  const element = useLatestElement(target);
@@ -4044,7 +4044,7 @@ function usePageLeave() {
4044
4044
  return isLeft;
4045
4045
  }
4046
4046
 
4047
- const getInitialState$1 = (defaultValue) => {
4047
+ const getInitialState$2 = (defaultValue) => {
4048
4048
  if (defaultValue !== void 0) {
4049
4049
  return defaultValue;
4050
4050
  }
@@ -4060,7 +4060,7 @@ const getInitialState$1 = (defaultValue) => {
4060
4060
  };
4061
4061
  function useDocumentVisibility(defaultValue) {
4062
4062
  const [visible, setVisible] = useState(
4063
- getInitialState$1(defaultValue)
4063
+ getInitialState$2(defaultValue)
4064
4064
  );
4065
4065
  useEventListener(
4066
4066
  "visibilitychange",
@@ -4075,7 +4075,7 @@ function useDocumentVisibility(defaultValue) {
4075
4075
  return visible;
4076
4076
  }
4077
4077
 
4078
- function useResizeObserver(target, callback, options = defaultOptions) {
4078
+ function useResizeObserver(target, callback, options = defaultOptions$1) {
4079
4079
  const savedCallback = useLatest(callback);
4080
4080
  const observerRef = useRef();
4081
4081
  const element = useLatestElement(target);
@@ -4160,7 +4160,7 @@ const DEFAULT_OPTIONS = {
4160
4160
  multiple: true,
4161
4161
  accept: "*"
4162
4162
  };
4163
- function useFileDialog(options = defaultOptions) {
4163
+ function useFileDialog(options = defaultOptions$1) {
4164
4164
  const [files, setFiles] = useState(null);
4165
4165
  const inputRef = useRef();
4166
4166
  const initFn = useCallback(() => {
@@ -4200,7 +4200,7 @@ const defaultListerOptions = {
4200
4200
  capture: false,
4201
4201
  passive: true
4202
4202
  };
4203
- function useScroll(target, options = defaultOptions) {
4203
+ function useScroll(target, options = defaultOptions$1) {
4204
4204
  const {
4205
4205
  throttle = 0,
4206
4206
  idle = 200,
@@ -4307,7 +4307,7 @@ var __async$3 = (__this, __arguments, generator) => {
4307
4307
  step((generator = generator.apply(__this, __arguments)).next());
4308
4308
  });
4309
4309
  };
4310
- function useInfiniteScroll(target, onLoadMore, options = defaultOptions) {
4310
+ function useInfiniteScroll(target, onLoadMore, options = defaultOptions$1) {
4311
4311
  var _a, _b;
4312
4312
  const savedLoadMore = useLatest(onLoadMore);
4313
4313
  const direction = (_a = options.direction) != null ? _a : "bottom";
@@ -4343,7 +4343,7 @@ const defaultEvents = [
4343
4343
  "keydown",
4344
4344
  "keyup"
4345
4345
  ];
4346
- function useKeyModifier(modifier, options = defaultOptions) {
4346
+ function useKeyModifier(modifier, options = defaultOptions$1) {
4347
4347
  const { events = defaultEvents, initial = false } = options;
4348
4348
  const [state, setState] = useState(initial);
4349
4349
  useMount(() => {
@@ -4368,7 +4368,7 @@ function useKeyModifier(modifier, options = defaultOptions) {
4368
4368
  }
4369
4369
 
4370
4370
  const listenerOptions$2 = { passive: true };
4371
- function useMousePressed(target, options = defaultOptions) {
4371
+ function useMousePressed(target, options = defaultOptions$1) {
4372
4372
  const { touch = true, drag = true, initialValue = false } = options;
4373
4373
  const [pressed, setPressed] = useState(initialValue);
4374
4374
  const [sourceType, setSourceType] = useState(null);
@@ -4475,7 +4475,7 @@ function useScrollLock(target, initialState = false) {
4475
4475
  return [locked, set];
4476
4476
  }
4477
4477
 
4478
- function useElementSize(target, options = defaultOptions) {
4478
+ function useElementSize(target, options = defaultOptions$1) {
4479
4479
  const { box = "content-box" } = options;
4480
4480
  const [width, setWidth] = useState(0);
4481
4481
  const [height, setHeight] = useState(0);
@@ -4715,7 +4715,7 @@ function useDraggable(target, options = {}) {
4715
4715
  return [position.x, position.y, !!pressedDelta];
4716
4716
  }
4717
4717
 
4718
- function useElementBounding(target, options = defaultOptions) {
4718
+ function useElementBounding(target, options = defaultOptions$1) {
4719
4719
  const {
4720
4720
  reset = true,
4721
4721
  windowResize = true,
@@ -4790,7 +4790,7 @@ function useElementBounding(target, options = defaultOptions) {
4790
4790
  };
4791
4791
  }
4792
4792
 
4793
- function useElementVisibility(target, options = defaultOptions) {
4793
+ function useElementVisibility(target, options = defaultOptions$1) {
4794
4794
  const [visible, setVisible] = useState(false);
4795
4795
  const callback = useCallback((entries) => {
4796
4796
  const rect = entries[0].boundingClientRect;
@@ -5126,7 +5126,7 @@ function useScrollIntoView(targetElement, {
5126
5126
  offset = 0,
5127
5127
  cancelable = true,
5128
5128
  isList = false
5129
- } = defaultOptions, scrollElement) {
5129
+ } = defaultOptions$1, scrollElement) {
5130
5130
  const frameID = useRef(0);
5131
5131
  const startTime = useRef(0);
5132
5132
  const shouldStop = useRef(false);
@@ -5137,48 +5137,48 @@ function useScrollIntoView(targetElement, {
5137
5137
  }
5138
5138
  };
5139
5139
  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();
5140
+ const scrollIntoView = ({
5141
+ alignment = "start"
5142
+ } = {}) => {
5143
+ var _a;
5144
+ const parent = getTargetElement(scrollElement) || getScrollParent(axis, element);
5145
+ shouldStop.current = false;
5146
+ if (frameID.current) {
5147
+ cancel();
5148
+ }
5149
+ const start = (_a = getScrollStart({ parent, axis })) != null ? _a : 0;
5150
+ const change = getRelativePosition({
5151
+ parent,
5152
+ target: element,
5153
+ axis,
5154
+ alignment,
5155
+ offset,
5156
+ isList
5157
+ }) - (parent ? 0 : start);
5158
+ const animateScroll = () => {
5159
+ if (startTime.current === 0) {
5160
+ startTime.current = performance.now();
5147
5161
  }
5148
- const start = (_a = getScrollStart({ parent, axis })) != null ? _a : 0;
5149
- const change = getRelativePosition({
5162
+ const now = performance.now();
5163
+ const elapsed = now - startTime.current;
5164
+ const t = reducedMotion || duration === 0 ? 1 : elapsed / duration;
5165
+ const distance = start + change * easing(t);
5166
+ setScrollParam({
5150
5167
  parent,
5151
- target: element,
5152
5168
  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
- );
5169
+ distance
5170
+ });
5171
+ if (!shouldStop.current && t < 1) {
5172
+ frameID.current = requestAnimationFrame(animateScroll);
5173
+ } else {
5174
+ typeof onScrollFinish === "function" && onScrollFinish();
5175
+ startTime.current = 0;
5176
+ frameID.current = 0;
5177
+ cancel();
5178
+ }
5179
+ };
5180
+ animateScroll();
5181
+ };
5182
5182
  const handleStop = () => {
5183
5183
  if (cancelable) {
5184
5184
  shouldStop.current = true;
@@ -5477,7 +5477,7 @@ function init (converter, defaultAttributes) {
5477
5477
 
5478
5478
  var api = init(defaultConverter, { path: '/' });
5479
5479
 
5480
- const getInitialState = (key, defaultValue) => {
5480
+ const getInitialState$1 = (key, defaultValue) => {
5481
5481
  if (defaultValue !== void 0) {
5482
5482
  return defaultValue;
5483
5483
  }
@@ -5491,9 +5491,9 @@ const getInitialState = (key, defaultValue) => {
5491
5491
  }
5492
5492
  return "";
5493
5493
  };
5494
- function useCookie(key, options = defaultOptions, defaultValue) {
5494
+ function useCookie(key, options = defaultOptions$1, defaultValue) {
5495
5495
  const [cookieValue, setCookieValue] = useState(
5496
- getInitialState(key, defaultValue)
5496
+ getInitialState$1(key, defaultValue)
5497
5497
  );
5498
5498
  useEffect(() => {
5499
5499
  const getStoredValue = () => {
@@ -5603,7 +5603,7 @@ const defaultState = {
5603
5603
  bottom: 0,
5604
5604
  right: 0
5605
5605
  };
5606
- function useMeasure(target, options = defaultOptions) {
5606
+ function useMeasure(target, options = defaultOptions$1) {
5607
5607
  const [rect, setRect] = useState(defaultState);
5608
5608
  const stop = useResizeObserver(
5609
5609
  target,
@@ -5627,4 +5627,109 @@ function useHover(target) {
5627
5627
  return hovered;
5628
5628
  }
5629
5629
 
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 };
5630
+ const defaultOptions = {
5631
+ observe: false
5632
+ };
5633
+ const getInitialState = (defaultValue) => {
5634
+ if (defaultValue !== void 0) {
5635
+ return defaultValue;
5636
+ }
5637
+ if (isBrowser) {
5638
+ return "";
5639
+ }
5640
+ if (process.env.NODE_ENV !== "production") {
5641
+ console.warn(
5642
+ "`useCssVar` When server side rendering, defaultValue should be defined to prevent a hydration mismatches."
5643
+ );
5644
+ }
5645
+ return "";
5646
+ };
5647
+ function useCssVar(prop, target, defaultValue, options = defaultOptions) {
5648
+ const { observe } = options;
5649
+ const [variable, setVariable] = useState(
5650
+ getInitialState(defaultValue)
5651
+ );
5652
+ const element = useLatestElement(target);
5653
+ const observerRef = useRef();
5654
+ const set = useCallback(
5655
+ (v) => {
5656
+ if (element == null ? void 0 : element.style) {
5657
+ element == null ? void 0 : element.style.setProperty(prop, v);
5658
+ setVariable(v);
5659
+ }
5660
+ },
5661
+ [element, prop]
5662
+ );
5663
+ const updateCssVar = useCallback(() => {
5664
+ var _a;
5665
+ if (element) {
5666
+ const value = (_a = window.getComputedStyle(element).getPropertyValue(prop)) == null ? void 0 : _a.trim();
5667
+ setVariable(value);
5668
+ }
5669
+ }, [element, prop]);
5670
+ useEffect(() => {
5671
+ var _a;
5672
+ if (!element) {
5673
+ return;
5674
+ }
5675
+ const value = (_a = window.getComputedStyle(element).getPropertyValue(prop)) == null ? void 0 : _a.trim();
5676
+ if (!value && defaultValue) {
5677
+ set(defaultValue);
5678
+ } else {
5679
+ updateCssVar();
5680
+ }
5681
+ if (!observe) {
5682
+ return;
5683
+ }
5684
+ observerRef.current = new MutationObserver(updateCssVar);
5685
+ observerRef.current.observe(element, {
5686
+ attributeFilter: ["style", "class"]
5687
+ });
5688
+ return () => {
5689
+ if (observerRef.current) {
5690
+ observerRef.current.disconnect();
5691
+ }
5692
+ };
5693
+ }, [observe, element, updateCssVar, set, defaultValue, prop]);
5694
+ return [variable, set];
5695
+ }
5696
+
5697
+ const topVarName = "--reactuse-safe-area-top";
5698
+ const rightVarName = "--reactuse-safe-area-right";
5699
+ const bottomVarName = "--reactuse-safe-area-bottom";
5700
+ const leftVarName = "--reactuse-safe-area-left";
5701
+ const defaultElement = () => document.documentElement;
5702
+ function useScreenSafeArea() {
5703
+ const top = useRef("");
5704
+ const right = useRef("");
5705
+ const bottom = useRef("");
5706
+ const left = useRef("");
5707
+ const forceUpdate = useUpdate();
5708
+ useCssVar(topVarName, defaultElement, "env(safe-area-inset-top, 0px)");
5709
+ useCssVar(rightVarName, defaultElement, "env(safe-area-inset-right, 0px)");
5710
+ useCssVar(bottomVarName, defaultElement, "env(safe-area-inset-bottom, 0px)");
5711
+ useCssVar(leftVarName, defaultElement, "env(safe-area-inset-left, 0px)");
5712
+ const { run: update } = useDebounceFn(() => {
5713
+ top.current = getValue(topVarName);
5714
+ right.current = getValue(rightVarName);
5715
+ bottom.current = getValue(bottomVarName);
5716
+ left.current = getValue(leftVarName);
5717
+ forceUpdate();
5718
+ });
5719
+ useEffect(() => {
5720
+ update();
5721
+ }, [update]);
5722
+ useEventListener("resize", update);
5723
+ return [
5724
+ top.current,
5725
+ right.current,
5726
+ bottom.current,
5727
+ left.current,
5728
+ update
5729
+ ];
5730
+ }
5731
+ function getValue(position) {
5732
+ return getComputedStyle(document.documentElement).getPropertyValue(position);
5733
+ }
5734
+
5735
+ 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.7",
4
4
  "license": "Unlicense",
5
5
  "homepage": "https://www.reactuse.com/",
6
6
  "repository": {