@dxos/react-hooks 0.8.4-main.5ea62a8 → 0.8.4-main.60689f5b1c

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.
Files changed (62) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +1 -0
  3. package/dist/lib/browser/index.mjs +200 -180
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/node-esm/index.mjs +200 -180
  7. package/dist/lib/node-esm/index.mjs.map +4 -4
  8. package/dist/lib/node-esm/meta.json +1 -1
  9. package/dist/types/src/index.d.ts +4 -3
  10. package/dist/types/src/index.d.ts.map +1 -1
  11. package/dist/types/src/useAsyncEffect.d.ts.map +1 -1
  12. package/dist/types/src/useAsyncState.d.ts.map +1 -1
  13. package/dist/types/src/useAtomState.d.ts +12 -0
  14. package/dist/types/src/useAtomState.d.ts.map +1 -0
  15. package/dist/types/src/useControlledState.d.ts +2 -2
  16. package/dist/types/src/useControlledState.d.ts.map +1 -1
  17. package/dist/types/src/useDebugDeps.d.ts +1 -1
  18. package/dist/types/src/useDebugDeps.d.ts.map +1 -1
  19. package/dist/types/src/useDefaultValue.d.ts.map +1 -1
  20. package/dist/types/src/useDefaults.d.ts.map +1 -1
  21. package/dist/types/src/useDynamicRef.d.ts +3 -3
  22. package/dist/types/src/useDynamicRef.d.ts.map +1 -1
  23. package/dist/types/src/useForwardedRef.d.ts +23 -3
  24. package/dist/types/src/useForwardedRef.d.ts.map +1 -1
  25. package/dist/types/src/useId.d.ts.map +1 -1
  26. package/dist/types/src/useIsFocused.d.ts +1 -1
  27. package/dist/types/src/useIsFocused.d.ts.map +1 -1
  28. package/dist/types/src/useMediaQuery.d.ts +1 -1
  29. package/dist/types/src/useMediaQuery.d.ts.map +1 -1
  30. package/dist/types/src/useMulticastObservable.d.ts.map +1 -1
  31. package/dist/types/src/useMulticastObservable.test.d.ts.map +1 -1
  32. package/dist/types/src/useTimeout.d.ts.map +1 -1
  33. package/dist/types/src/useTransitions.d.ts +2 -1
  34. package/dist/types/src/useTransitions.d.ts.map +1 -1
  35. package/dist/types/src/useViewportResize.d.ts +3 -0
  36. package/dist/types/src/useViewportResize.d.ts.map +1 -0
  37. package/dist/types/tsconfig.tsbuildinfo +1 -1
  38. package/package.json +19 -15
  39. package/src/index.ts +5 -3
  40. package/src/useAtomState.ts +23 -0
  41. package/src/useControlledState.ts +22 -12
  42. package/src/useDebugDeps.ts +17 -8
  43. package/src/useDynamicRef.ts +5 -6
  44. package/src/useForwardedRef.ts +50 -13
  45. package/src/useId.ts +3 -2
  46. package/src/useIsFocused.ts +2 -2
  47. package/src/useMediaQuery.ts +8 -9
  48. package/src/{useMulticastObservable.test.tsx → useMulticastObservable.test.ts} +1 -3
  49. package/src/useTransitions.ts +3 -1
  50. package/src/useViewportResize.ts +45 -0
  51. package/dist/types/src/useAsyncEffect.stories.d.ts +0 -9
  52. package/dist/types/src/useAsyncEffect.stories.d.ts.map +0 -1
  53. package/dist/types/src/useResize.d.ts +0 -3
  54. package/dist/types/src/useResize.d.ts.map +0 -1
  55. package/dist/types/src/useSignals.d.ts +0 -10
  56. package/dist/types/src/useSignals.d.ts.map +0 -1
  57. package/dist/types/src/useTrackProps.d.ts +0 -5
  58. package/dist/types/src/useTrackProps.d.ts.map +0 -1
  59. package/src/useAsyncEffect.stories.tsx +0 -34
  60. package/src/useResize.ts +0 -27
  61. package/src/useSignals.ts +0 -27
  62. package/src/useTrackProps.ts +0 -40
@@ -1,5 +1,9 @@
1
1
  import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
2
 
3
+ // src/index.ts
4
+ import { useComposedRefs } from "@radix-ui/react-compose-refs";
5
+ import { useSize, useScroller } from "mini-virtual-list";
6
+
3
7
  // src/useAsyncEffect.ts
4
8
  import { useEffect } from "react";
5
9
  var useAsyncEffect = (cb, deps) => {
@@ -19,10 +23,28 @@ var useAsyncEffect = (cb, deps) => {
19
23
  }, deps ?? []);
20
24
  };
21
25
 
26
+ // src/useAtomState.ts
27
+ import { Atom, useAtomSet, useAtomValue } from "@effect-atom/atom-react";
28
+ import { useMemo, useState } from "react";
29
+ var useAtomState = (initialValue) => {
30
+ const [atom] = useState(() => Atom.make(initialValue));
31
+ const value = useAtomValue(atom);
32
+ const set = useAtomSet(atom);
33
+ return useMemo(() => ({
34
+ atom,
35
+ value,
36
+ set
37
+ }), [
38
+ atom,
39
+ value,
40
+ set
41
+ ]);
42
+ };
43
+
22
44
  // src/useAsyncState.ts
23
- import { useEffect as useEffect2, useState } from "react";
45
+ import { useEffect as useEffect2, useState as useState2 } from "react";
24
46
  var useAsyncState = (cb, deps = []) => {
25
- const [value, setValue] = useState();
47
+ const [value, setValue] = useState2();
26
48
  useEffect2(() => {
27
49
  let disposed = false;
28
50
  const t = setTimeout(async () => {
@@ -43,58 +65,102 @@ var useAsyncState = (cb, deps = []) => {
43
65
  };
44
66
 
45
67
  // src/useControlledState.ts
46
- import { useEffect as useEffect3, useState as useState2 } from "react";
47
- var useControlledState = (controlledValue, onChange, ...deps) => {
48
- const [value, setValue] = useState2(controlledValue);
49
- useEffect3(() => {
50
- if (controlledValue !== void 0) {
51
- setValue(controlledValue);
68
+ import { useCallback as useCallback2, useEffect as useEffect4, useRef as useRef2, useState as useState4 } from "react";
69
+
70
+ // src/useDynamicRef.ts
71
+ import { useCallback, useEffect as useEffect3, useRef, useState as useState3 } from "react";
72
+ var useStateWithRef = (valueProp) => {
73
+ const [value, setValue] = useState3(valueProp);
74
+ const valueRef = useRef(valueProp);
75
+ const setter = useCallback((value2) => {
76
+ if (typeof value2 === "function") {
77
+ setValue((current) => {
78
+ valueRef.current = value2(current);
79
+ return valueRef.current;
80
+ });
81
+ } else {
82
+ valueRef.current = value2;
83
+ setValue(value2);
52
84
  }
85
+ }, []);
86
+ return [
87
+ value,
88
+ setter,
89
+ valueRef
90
+ ];
91
+ };
92
+ var useDynamicRef = (value) => {
93
+ const valueRef = useRef(value);
94
+ useEffect3(() => {
95
+ valueRef.current = value;
53
96
  }, [
54
- controlledValue,
55
- ...deps
97
+ value
56
98
  ]);
57
- useEffect3(() => {
58
- onChange?.(value);
99
+ return valueRef;
100
+ };
101
+
102
+ // src/useControlledState.ts
103
+ var useControlledState = (valueProp, onChange) => {
104
+ const [value, setControlledValue] = useState4(valueProp);
105
+ useEffect4(() => {
106
+ setControlledValue(valueProp);
59
107
  }, [
60
- value,
61
- onChange
108
+ valueProp
109
+ ]);
110
+ const onChangeRef = useRef2(onChange);
111
+ const valueRef = useDynamicRef(valueProp);
112
+ const setValue = useCallback2((nextValue) => {
113
+ const value2 = isFunction(nextValue) ? nextValue(valueRef.current) : nextValue;
114
+ setControlledValue(value2);
115
+ onChangeRef.current?.(value2);
116
+ }, [
117
+ valueRef,
118
+ onChangeRef
62
119
  ]);
63
120
  return [
64
121
  value,
65
122
  setValue
66
123
  ];
67
124
  };
125
+ function isFunction(value) {
126
+ return typeof value === "function";
127
+ }
68
128
 
69
129
  // src/useDebugDeps.ts
70
- import { useEffect as useEffect4, useRef } from "react";
71
- var useDebugDeps = (deps = []) => {
72
- const lastDeps = useRef([]);
73
- useEffect4(() => {
74
- console.group("deps changed", {
75
- previous: lastDeps.current.length,
76
- current: deps.length
77
- });
130
+ import { useEffect as useEffect5, useRef as useRef3 } from "react";
131
+ import { log } from "@dxos/log";
132
+ var __dxlog_file = "/__w/dxos/dxos/packages/ui/react-primitives/react-hooks/src/useDebugDeps.ts";
133
+ var useDebugDeps = (deps = [], label = "useDebugDeps", active = true) => {
134
+ const lastDeps = useRef3([]);
135
+ useEffect5(() => {
136
+ if (!active) {
137
+ return;
138
+ }
139
+ const diff = {};
78
140
  for (let i = 0; i < Math.max(lastDeps.current.length ?? 0, deps.length ?? 0); i++) {
79
- if (lastDeps.current[i] !== deps[i]) {
80
- console.log("changed", {
81
- index: i,
141
+ if (lastDeps.current[i] !== deps[i] || i > lastDeps.current.length) {
142
+ diff[i] = {
82
143
  previous: lastDeps.current[i],
83
144
  current: deps[i]
84
- });
145
+ };
85
146
  }
86
147
  }
87
- console.groupEnd();
148
+ if (Object.keys(diff).length > 0) {
149
+ log.warn(`Updated: ${label} [${lastDeps.current.length}/${deps.length}]`, diff, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 24, S: void 0 });
150
+ }
88
151
  lastDeps.current = deps;
89
- }, deps);
152
+ }, [
153
+ ...deps,
154
+ active
155
+ ]);
90
156
  };
91
157
 
92
158
  // src/useDefaultValue.ts
93
- import { useEffect as useEffect5, useMemo, useState as useState3 } from "react";
159
+ import { useEffect as useEffect6, useMemo as useMemo2, useState as useState5 } from "react";
94
160
  var useDefaultValue = (reactiveValue, getDefaultValue) => {
95
- const stableDefaultValue = useMemo(getDefaultValue, []);
96
- const [value, setValue] = useState3(reactiveValue ?? stableDefaultValue);
97
- useEffect5(() => {
161
+ const stableDefaultValue = useMemo2(getDefaultValue, []);
162
+ const [value, setValue] = useState5(reactiveValue ?? stableDefaultValue);
163
+ useEffect6(() => {
98
164
  setValue(reactiveValue ?? stableDefaultValue);
99
165
  }, [
100
166
  reactiveValue,
@@ -105,51 +171,18 @@ var useDefaultValue = (reactiveValue, getDefaultValue) => {
105
171
 
106
172
  // src/useDefaults.ts
107
173
  import defaultsDeep from "lodash.defaultsdeep";
108
- import { useMemo as useMemo2 } from "react";
174
+ import { useMemo as useMemo3 } from "react";
109
175
  var useDefaults = (value, defaults) => {
110
- return useMemo2(() => defaultsDeep({}, defaults, value), [
176
+ return useMemo3(() => defaultsDeep({}, defaults, value), [
111
177
  value,
112
178
  defaults
113
179
  ]);
114
180
  };
115
181
 
116
- // src/useDynamicRef.ts
117
- import { useCallback } from "@preact-signals/safe-react/react";
118
- import { useEffect as useEffect6, useRef as useRef2, useState as useState4 } from "react";
119
- var useStateWithRef = (value$) => {
120
- const [value, setValue] = useState4(value$);
121
- const valueRef = useRef2(value$);
122
- const setter = useCallback((value2) => {
123
- if (typeof value2 === "function") {
124
- setValue((current) => {
125
- valueRef.current = value2(current);
126
- return valueRef.current;
127
- });
128
- } else {
129
- valueRef.current = value2;
130
- setValue(value2);
131
- }
132
- }, []);
133
- return [
134
- value,
135
- setter,
136
- valueRef
137
- ];
138
- };
139
- var useDynamicRef = (value) => {
140
- const valueRef = useRef2(value);
141
- useEffect6(() => {
142
- valueRef.current = value;
143
- }, [
144
- value
145
- ]);
146
- return valueRef;
147
- };
148
-
149
182
  // src/useFileDownload.ts
150
- import { useMemo as useMemo3 } from "react";
183
+ import { useMemo as useMemo4 } from "react";
151
184
  var useFileDownload = () => {
152
- return useMemo3(() => (data, filename) => {
185
+ return useMemo4(() => (data, filename) => {
153
186
  const url = typeof data === "string" ? data : URL.createObjectURL(data);
154
187
  const element = document.createElement("a");
155
188
  element.setAttribute("href", url);
@@ -160,38 +193,61 @@ var useFileDownload = () => {
160
193
  };
161
194
 
162
195
  // src/useForwardedRef.ts
163
- import { useEffect as useEffect7, useRef as useRef3 } from "react";
164
- var useForwardedRef = (ref) => {
165
- const innerRef = useRef3(null);
196
+ import { useEffect as useEffect7, useMemo as useMemo5, useRef as useRef4 } from "react";
197
+ var useForwardedRef = (forwardedRef) => {
198
+ const localRef = useRef4(null);
166
199
  useEffect7(() => {
167
- if (!ref) {
168
- return;
169
- }
170
- if (typeof ref === "function") {
171
- ref(innerRef.current);
172
- } else {
173
- ref.current = innerRef.current;
200
+ setRef(forwardedRef, localRef.current);
201
+ }, [
202
+ forwardedRef
203
+ ]);
204
+ return localRef;
205
+ };
206
+ function setRef(ref, value) {
207
+ if (typeof ref === "function") {
208
+ return ref(value);
209
+ } else if (ref) {
210
+ ref.current = value;
211
+ }
212
+ }
213
+ var mergeRefs = (refs) => {
214
+ return (value) => {
215
+ const cleanups = [];
216
+ for (const ref of refs) {
217
+ const cleanup = setRef(ref, value);
218
+ cleanups.push(typeof cleanup === "function" ? cleanup : () => setRef(ref, null));
174
219
  }
175
- });
176
- return innerRef;
220
+ return () => {
221
+ for (const cleanup of cleanups) {
222
+ cleanup();
223
+ }
224
+ };
225
+ };
226
+ };
227
+ var useMergeRefs = (refs) => {
228
+ return useMemo5(() => mergeRefs(refs), [
229
+ ...refs
230
+ ]);
177
231
  };
178
232
 
179
233
  // src/useId.ts
180
234
  import alea from "alea";
181
- import { useMemo as useMemo4 } from "react";
235
+ import { useMemo as useMemo6 } from "react";
182
236
  var Alea = alea;
183
237
  var prng = new Alea("@dxos/react-hooks");
184
238
  var randomString = (n = 4) => prng().toString(16).slice(2, n + 2);
185
- var useId = (namespace, propsId, opts) => useMemo4(() => makeId(namespace, propsId, opts), [
186
- propsId
187
- ]);
239
+ var useId = (namespace, propsId, opts) => {
240
+ return useMemo6(() => makeId(namespace, propsId, opts), [
241
+ propsId
242
+ ]);
243
+ };
188
244
  var makeId = (namespace, propsId, opts) => propsId ?? `${namespace}-${randomString(opts?.n ?? 4)}`;
189
245
 
190
246
  // src/useIsFocused.ts
191
- import { useEffect as useEffect8, useRef as useRef4, useState as useState5 } from "react";
247
+ import { useEffect as useEffect8, useRef as useRef5, useState as useState6 } from "react";
192
248
  var useIsFocused = (inputRef) => {
193
- const [isFocused, setIsFocused] = useState5(void 0);
194
- const isFocusedRef = useRef4(isFocused);
249
+ const [isFocused, setIsFocused] = useState6(void 0);
250
+ const isFocusedRef = useRef5(isFocused);
195
251
  isFocusedRef.current = isFocused;
196
252
  useEffect8(() => {
197
253
  const input = inputRef.current;
@@ -217,7 +273,7 @@ var useIsFocused = (inputRef) => {
217
273
  };
218
274
 
219
275
  // src/useMediaQuery.ts
220
- import { useEffect as useEffect9, useState as useState6 } from "react";
276
+ import { useEffect as useEffect9, useState as useState7 } from "react";
221
277
  var breakpointMediaQueries = {
222
278
  sm: "(min-width: 640px)",
223
279
  md: "(min-width: 768px)",
@@ -226,7 +282,7 @@ var breakpointMediaQueries = {
226
282
  "2xl": "(min-width: 1536px)"
227
283
  };
228
284
  var useMediaQuery = (query, options = {}) => {
229
- const { ssr = true, fallback } = options;
285
+ const { ssr = false, fallback } = options;
230
286
  const queries = (Array.isArray(query) ? query : [
231
287
  query
232
288
  ]).map((query2) => query2 in breakpointMediaQueries ? breakpointMediaQueries[query2] : query2);
@@ -234,7 +290,7 @@ var useMediaQuery = (query, options = {}) => {
234
290
  fallback
235
291
  ];
236
292
  fallbackValues = fallbackValues.filter((v) => v != null);
237
- const [value, setValue] = useState6(() => {
293
+ const [value, setValue] = useState7(() => {
238
294
  return queries.map((query2, index) => ({
239
295
  media: query2,
240
296
  matches: ssr ? !!fallbackValues[index] : document.defaultView?.matchMedia(query2).matches
@@ -282,9 +338,9 @@ var useMediaQuery = (query, options = {}) => {
282
338
  };
283
339
 
284
340
  // src/useMulticastObservable.ts
285
- import { useMemo as useMemo5, useSyncExternalStore } from "react";
341
+ import { useMemo as useMemo7, useSyncExternalStore } from "react";
286
342
  var useMulticastObservable = (observable) => {
287
- const subscribeFn = useMemo5(() => (listener) => {
343
+ const subscribeFn = useMemo7(() => (listener) => {
288
344
  const subscription = observable.subscribe(listener);
289
345
  return () => subscription.unsubscribe();
290
346
  }, [
@@ -294,73 +350,65 @@ var useMulticastObservable = (observable) => {
294
350
  };
295
351
 
296
352
  // src/useRefCallback.ts
297
- import { useState as useState7 } from "react";
353
+ import { useState as useState8 } from "react";
298
354
  var useRefCallback = () => {
299
- const [value, setValue] = useState7(null);
355
+ const [value, setValue] = useState8(null);
300
356
  return {
301
357
  refCallback: (value2) => setValue(value2),
302
358
  value
303
359
  };
304
360
  };
305
361
 
306
- // src/useResize.ts
307
- import { useLayoutEffect, useMemo as useMemo6 } from "react";
308
- var useResize = (handler, deps = [], delay = 800) => {
309
- const debouncedHandler = useMemo6(() => {
362
+ // src/useViewportResize.ts
363
+ import { useLayoutEffect, useMemo as useMemo8 } from "react";
364
+ var useViewportResize = (cb, deps = [], delay = 800) => {
365
+ const { handler: debouncedHandler, cancel } = useMemo8(() => {
310
366
  let timeout;
311
- return (event) => {
312
- clearTimeout(timeout);
313
- timeout = setTimeout(() => {
314
- handler(event);
315
- }, delay);
367
+ return {
368
+ handler: (event) => {
369
+ if (timeout !== void 0) {
370
+ clearTimeout(timeout);
371
+ }
372
+ timeout = setTimeout(() => {
373
+ timeout = void 0;
374
+ cb(event);
375
+ }, delay);
376
+ },
377
+ cancel: () => {
378
+ if (timeout !== void 0) {
379
+ clearTimeout(timeout);
380
+ timeout = void 0;
381
+ }
382
+ }
316
383
  };
317
384
  }, [
318
- handler,
385
+ cb,
319
386
  delay
320
387
  ]);
321
388
  return useLayoutEffect(() => {
322
389
  window.visualViewport?.addEventListener("resize", debouncedHandler);
323
390
  debouncedHandler();
324
- return () => window.visualViewport?.removeEventListener("resize", debouncedHandler);
391
+ return () => {
392
+ window.visualViewport?.removeEventListener("resize", debouncedHandler);
393
+ cancel();
394
+ };
325
395
  }, [
326
396
  debouncedHandler,
397
+ cancel,
327
398
  ...deps
328
399
  ]);
329
400
  };
330
401
 
331
- // src/useSignals.ts
332
- import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
333
- import { computed, effect } from "@preact-signals/safe-react";
334
- import { useRef as useRef5 } from "@preact-signals/safe-react/react";
335
- import { useEffect as useEffect10, useMemo as useMemo7 } from "react";
336
- var useSignalsEffect = (cb, deps) => {
337
- const callback = useRef5(cb);
338
- callback.current = cb;
339
- useEffect10(() => {
340
- return effect(() => {
341
- return callback.current();
342
- });
343
- }, deps ?? []);
344
- };
345
- var useSignalsMemo = (cb, deps) => {
346
- var _effect = _useSignals();
347
- try {
348
- return useMemo7(() => computed(cb), deps ?? []).value;
349
- } finally {
350
- _effect.f();
351
- }
352
- };
353
-
354
402
  // src/useTimeout.ts
355
- import { useEffect as useEffect11, useRef as useRef6 } from "react";
403
+ import { useEffect as useEffect10, useRef as useRef6 } from "react";
356
404
  var useTimeout = (callback, delay = 0, deps = []) => {
357
405
  const callbackRef = useRef6(callback);
358
- useEffect11(() => {
406
+ useEffect10(() => {
359
407
  callbackRef.current = callback;
360
408
  }, [
361
409
  callback
362
410
  ]);
363
- useEffect11(() => {
411
+ useEffect10(() => {
364
412
  if (delay == null) {
365
413
  return;
366
414
  }
@@ -373,12 +421,12 @@ var useTimeout = (callback, delay = 0, deps = []) => {
373
421
  };
374
422
  var useInterval = (callback, delay = 0, deps = []) => {
375
423
  const callbackRef = useRef6(callback);
376
- useEffect11(() => {
424
+ useEffect10(() => {
377
425
  callbackRef.current = callback;
378
426
  }, [
379
427
  callback
380
428
  ]);
381
- useEffect11(() => {
429
+ useEffect10(() => {
382
430
  if (delay == null) {
383
431
  return;
384
432
  }
@@ -395,49 +443,17 @@ var useInterval = (callback, delay = 0, deps = []) => {
395
443
  ]);
396
444
  };
397
445
 
398
- // src/useTrackProps.ts
399
- import { useEffect as useEffect12, useRef as useRef7 } from "react";
400
- import { log } from "@dxos/log";
401
- var __dxlog_file = "/__w/dxos/dxos/packages/ui/primitives/react-hooks/src/useTrackProps.ts";
402
- var useTrackProps = (props, componentName = "Component", active = true) => {
403
- const prevProps = useRef7(props);
404
- useEffect12(() => {
405
- const changes = Object.entries(props).filter(([key]) => props[key] !== prevProps.current[key]);
406
- if (changes.length > 0) {
407
- if (active) {
408
- log.info("props changed", {
409
- componentName,
410
- keys: changes.map(([key]) => key).join(","),
411
- props: Object.fromEntries(changes.map(([key]) => [
412
- key,
413
- {
414
- from: prevProps.current[key],
415
- to: props[key]
416
- }
417
- ]))
418
- }, {
419
- F: __dxlog_file,
420
- L: 22,
421
- S: void 0,
422
- C: (f, a) => f(...a)
423
- });
424
- }
425
- }
426
- prevProps.current = props;
427
- });
428
- };
429
-
430
446
  // src/useTransitions.ts
431
- import { useEffect as useEffect13, useRef as useRef8, useState as useState8 } from "react";
432
- var isFunction = (functionToCheck) => {
447
+ import { useEffect as useEffect11, useRef as useRef7, useState as useState9 } from "react";
448
+ var isFunction2 = (functionToCheck) => {
433
449
  return functionToCheck instanceof Function;
434
450
  };
435
451
  var useDidTransition = (currentValue, fromValue, toValue) => {
436
- const [hasTransitioned, setHasTransitioned] = useState8(false);
437
- const previousValue = useRef8(currentValue);
438
- useEffect13(() => {
439
- const toValueValid = isFunction(toValue) ? toValue(currentValue) : toValue === currentValue;
440
- const fromValueValid = isFunction(fromValue) ? fromValue(previousValue.current) : fromValue === previousValue.current;
452
+ const [hasTransitioned, setHasTransitioned] = useState9(false);
453
+ const previousValue = useRef7(currentValue);
454
+ useEffect11(() => {
455
+ const toValueValid = isFunction2(toValue) ? toValue(currentValue) : toValue === currentValue;
456
+ const fromValueValid = isFunction2(fromValue) ? fromValue(previousValue.current) : fromValue === previousValue.current;
441
457
  if (fromValueValid && toValueValid && !hasTransitioned) {
442
458
  setHasTransitioned(true);
443
459
  } else if ((!fromValueValid || !toValueValid) && hasTransitioned) {
@@ -453,15 +469,15 @@ var useDidTransition = (currentValue, fromValue, toValue) => {
453
469
  return hasTransitioned;
454
470
  };
455
471
  var useOnTransition = (currentValue, fromValue, toValue, callback) => {
456
- const dirty = useRef8(false);
472
+ const dirty = useRef7(false);
457
473
  const hasTransitioned = useDidTransition(currentValue, fromValue, toValue);
458
- useEffect13(() => {
474
+ useEffect11(() => {
459
475
  dirty.current = false;
460
476
  }, [
461
477
  currentValue,
462
478
  dirty
463
479
  ]);
464
- useEffect13(() => {
480
+ useEffect11(() => {
465
481
  if (hasTransitioned && !dirty.current) {
466
482
  callback();
467
483
  dirty.current = true;
@@ -474,9 +490,13 @@ var useOnTransition = (currentValue, fromValue, toValue, callback) => {
474
490
  };
475
491
  export {
476
492
  makeId,
493
+ mergeRefs,
477
494
  randomString,
495
+ setRef,
478
496
  useAsyncEffect,
479
497
  useAsyncState,
498
+ useAtomState,
499
+ useComposedRefs,
480
500
  useControlledState,
481
501
  useDebugDeps,
482
502
  useDefaultValue,
@@ -489,14 +509,14 @@ export {
489
509
  useInterval,
490
510
  useIsFocused,
491
511
  useMediaQuery,
512
+ useMergeRefs,
492
513
  useMulticastObservable,
493
514
  useOnTransition,
494
515
  useRefCallback,
495
- useResize,
496
- useSignalsEffect,
497
- useSignalsMemo,
516
+ useScroller,
517
+ useSize,
498
518
  useStateWithRef,
499
519
  useTimeout,
500
- useTrackProps
520
+ useViewportResize
501
521
  };
502
522
  //# sourceMappingURL=index.mjs.map