@dxos/react-hooks 0.8.4-main.5ea62a8 → 0.8.4-main.66e292d

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 (47) hide show
  1. package/dist/lib/browser/index.mjs +120 -124
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node-esm/index.mjs +120 -124
  5. package/dist/lib/node-esm/index.mjs.map +4 -4
  6. package/dist/lib/node-esm/meta.json +1 -1
  7. package/dist/types/src/index.d.ts +2 -2
  8. package/dist/types/src/index.d.ts.map +1 -1
  9. package/dist/types/src/useControlledState.d.ts +2 -2
  10. package/dist/types/src/useControlledState.d.ts.map +1 -1
  11. package/dist/types/src/useDebugDeps.d.ts +1 -1
  12. package/dist/types/src/useDebugDeps.d.ts.map +1 -1
  13. package/dist/types/src/useDynamicRef.d.ts +3 -3
  14. package/dist/types/src/useDynamicRef.d.ts.map +1 -1
  15. package/dist/types/src/useForwardedRef.d.ts +23 -3
  16. package/dist/types/src/useForwardedRef.d.ts.map +1 -1
  17. package/dist/types/src/useIsFocused.d.ts +1 -1
  18. package/dist/types/src/useIsFocused.d.ts.map +1 -1
  19. package/dist/types/src/useMediaQuery.d.ts +1 -1
  20. package/dist/types/src/useMediaQuery.d.ts.map +1 -1
  21. package/dist/types/src/useMulticastObservable.test.d.ts.map +1 -1
  22. package/dist/types/src/useSignals.d.ts.map +1 -1
  23. package/dist/types/src/useTransitions.d.ts +2 -1
  24. package/dist/types/src/useTransitions.d.ts.map +1 -1
  25. package/dist/types/src/useViewportResize.d.ts +3 -0
  26. package/dist/types/src/useViewportResize.d.ts.map +1 -0
  27. package/dist/types/tsconfig.tsbuildinfo +1 -1
  28. package/package.json +11 -9
  29. package/src/index.ts +3 -2
  30. package/src/useControlledState.ts +22 -12
  31. package/src/useDebugDeps.ts +2 -2
  32. package/src/useDynamicRef.ts +5 -6
  33. package/src/useForwardedRef.ts +48 -13
  34. package/src/useIsFocused.ts +1 -1
  35. package/src/useMediaQuery.ts +8 -9
  36. package/src/{useMulticastObservable.test.tsx → useMulticastObservable.test.ts} +1 -3
  37. package/src/useSignals.ts +1 -2
  38. package/src/useTransitions.ts +3 -1
  39. package/src/{useResize.ts → useViewportResize.ts} +1 -1
  40. package/dist/types/src/useAsyncEffect.stories.d.ts +0 -9
  41. package/dist/types/src/useAsyncEffect.stories.d.ts.map +0 -1
  42. package/dist/types/src/useResize.d.ts +0 -3
  43. package/dist/types/src/useResize.d.ts.map +0 -1
  44. package/dist/types/src/useTrackProps.d.ts +0 -5
  45. package/dist/types/src/useTrackProps.d.ts.map +0 -1
  46. package/src/useAsyncEffect.stories.tsx +0 -34
  47. package/src/useTrackProps.ts +0 -40
@@ -1 +1 @@
1
- {"inputs":{"src/useAsyncEffect.ts":{"bytes":2988,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useAsyncState.ts":{"bytes":2577,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useControlledState.ts":{"bytes":2462,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useDebugDeps.ts":{"bytes":3041,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useDefaultValue.ts":{"bytes":4033,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useDefaults.ts":{"bytes":1591,"imports":[{"path":"lodash.defaultsdeep","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useDynamicRef.ts":{"bytes":3728,"imports":[{"path":"@preact-signals/safe-react/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useFileDownload.ts":{"bytes":2671,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useForwardedRef.ts":{"bytes":2045,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useId.ts":{"bytes":2466,"imports":[{"path":"alea","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useIsFocused.ts":{"bytes":3909,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useMediaQuery.ts":{"bytes":9396,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useMulticastObservable.ts":{"bytes":2972,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useRefCallback.ts":{"bytes":1818,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useResize.ts":{"bytes":2826,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useSignals.ts":{"bytes":2923,"imports":[{"path":"@preact-signals/safe-react/tracking","kind":"import-statement","external":true},{"path":"@preact-signals/safe-react","kind":"import-statement","external":true},{"path":"@preact-signals/safe-react/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useTimeout.ts":{"bytes":3956,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useTrackProps.ts":{"bytes":3997,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"src/useTransitions.ts":{"bytes":7750,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/index.ts":{"bytes":2309,"imports":[{"path":"src/useAsyncEffect.ts","kind":"import-statement","original":"./useAsyncEffect"},{"path":"src/useAsyncState.ts","kind":"import-statement","original":"./useAsyncState"},{"path":"src/useControlledState.ts","kind":"import-statement","original":"./useControlledState"},{"path":"src/useDebugDeps.ts","kind":"import-statement","original":"./useDebugDeps"},{"path":"src/useDefaultValue.ts","kind":"import-statement","original":"./useDefaultValue"},{"path":"src/useDefaults.ts","kind":"import-statement","original":"./useDefaults"},{"path":"src/useDynamicRef.ts","kind":"import-statement","original":"./useDynamicRef"},{"path":"src/useFileDownload.ts","kind":"import-statement","original":"./useFileDownload"},{"path":"src/useForwardedRef.ts","kind":"import-statement","original":"./useForwardedRef"},{"path":"src/useId.ts","kind":"import-statement","original":"./useId"},{"path":"src/useIsFocused.ts","kind":"import-statement","original":"./useIsFocused"},{"path":"src/useMediaQuery.ts","kind":"import-statement","original":"./useMediaQuery"},{"path":"src/useMulticastObservable.ts","kind":"import-statement","original":"./useMulticastObservable"},{"path":"src/useRefCallback.ts","kind":"import-statement","original":"./useRefCallback"},{"path":"src/useResize.ts","kind":"import-statement","original":"./useResize"},{"path":"src/useSignals.ts","kind":"import-statement","original":"./useSignals"},{"path":"src/useTimeout.ts","kind":"import-statement","original":"./useTimeout"},{"path":"src/useTrackProps.ts","kind":"import-statement","original":"./useTrackProps"},{"path":"src/useTransitions.ts","kind":"import-statement","original":"./useTransitions"}],"format":"esm"}},"outputs":{"dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":33287},"dist/lib/browser/index.mjs":{"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"lodash.defaultsdeep","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@preact-signals/safe-react/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"alea","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@preact-signals/safe-react/tracking","kind":"import-statement","external":true},{"path":"@preact-signals/safe-react","kind":"import-statement","external":true},{"path":"@preact-signals/safe-react/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true}],"exports":["makeId","randomString","useAsyncEffect","useAsyncState","useControlledState","useDebugDeps","useDefaultValue","useDefaults","useDidTransition","useDynamicRef","useFileDownload","useForwardedRef","useId","useInterval","useIsFocused","useMediaQuery","useMulticastObservable","useOnTransition","useRefCallback","useResize","useSignalsEffect","useSignalsMemo","useStateWithRef","useTimeout","useTrackProps"],"entryPoint":"src/index.ts","inputs":{"src/useAsyncEffect.ts":{"bytesInOutput":405},"src/index.ts":{"bytesInOutput":0},"src/useAsyncState.ts":{"bytesInOutput":447},"src/useControlledState.ts":{"bytesInOutput":463},"src/useDebugDeps.ts":{"bytesInOutput":606},"src/useDefaultValue.ts":{"bytesInOutput":422},"src/useDefaults.ts":{"bytesInOutput":228},"src/useDynamicRef.ts":{"bytesInOutput":779},"src/useFileDownload.ts":{"bytesInOutput":416},"src/useForwardedRef.ts":{"bytesInOutput":343},"src/useId.ts":{"bytesInOutput":403},"src/useIsFocused.ts":{"bytesInOutput":833},"src/useMediaQuery.ts":{"bytesInOutput":1940},"src/useMulticastObservable.ts":{"bytesInOutput":368},"src/useRefCallback.ts":{"bytesInOutput":197},"src/useResize.ts":{"bytesInOutput":619},"src/useSignals.ts":{"bytesInOutput":664},"src/useTimeout.ts":{"bytesInOutput":946},"src/useTrackProps.ts":{"bytesInOutput":964},"src/useTransitions.ts":{"bytesInOutput":1406}},"bytes":13399}}}
1
+ {"inputs":{"src/useAsyncEffect.ts":{"bytes":2988,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useAsyncState.ts":{"bytes":2577,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useDynamicRef.ts":{"bytes":3589,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useControlledState.ts":{"bytes":3865,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"src/useDynamicRef.ts","kind":"import-statement","original":"./useDynamicRef"}],"format":"esm"},"src/useDebugDeps.ts":{"bytes":3142,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useDefaultValue.ts":{"bytes":4033,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useDefaults.ts":{"bytes":1591,"imports":[{"path":"lodash.defaultsdeep","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useFileDownload.ts":{"bytes":2671,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useForwardedRef.ts":{"bytes":6067,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useId.ts":{"bytes":2466,"imports":[{"path":"alea","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useIsFocused.ts":{"bytes":3921,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useMediaQuery.ts":{"bytes":9256,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useMulticastObservable.ts":{"bytes":2972,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useRefCallback.ts":{"bytes":1818,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useViewportResize.ts":{"bytes":2878,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useSignals.ts":{"bytes":2776,"imports":[{"path":"@preact-signals/safe-react/tracking","kind":"import-statement","external":true},{"path":"@preact-signals/safe-react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useTimeout.ts":{"bytes":3956,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useTransitions.ts":{"bytes":7863,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/index.ts":{"bytes":2454,"imports":[{"path":"src/useAsyncEffect.ts","kind":"import-statement","original":"./useAsyncEffect"},{"path":"src/useAsyncState.ts","kind":"import-statement","original":"./useAsyncState"},{"path":"src/useControlledState.ts","kind":"import-statement","original":"./useControlledState"},{"path":"src/useDebugDeps.ts","kind":"import-statement","original":"./useDebugDeps"},{"path":"src/useDefaultValue.ts","kind":"import-statement","original":"./useDefaultValue"},{"path":"src/useDefaults.ts","kind":"import-statement","original":"./useDefaults"},{"path":"src/useDynamicRef.ts","kind":"import-statement","original":"./useDynamicRef"},{"path":"src/useFileDownload.ts","kind":"import-statement","original":"./useFileDownload"},{"path":"src/useForwardedRef.ts","kind":"import-statement","original":"./useForwardedRef"},{"path":"src/useId.ts","kind":"import-statement","original":"./useId"},{"path":"src/useIsFocused.ts","kind":"import-statement","original":"./useIsFocused"},{"path":"src/useMediaQuery.ts","kind":"import-statement","original":"./useMediaQuery"},{"path":"src/useMulticastObservable.ts","kind":"import-statement","original":"./useMulticastObservable"},{"path":"src/useRefCallback.ts","kind":"import-statement","original":"./useRefCallback"},{"path":"src/useViewportResize.ts","kind":"import-statement","original":"./useViewportResize"},{"path":"src/useSignals.ts","kind":"import-statement","original":"./useSignals"},{"path":"src/useTimeout.ts","kind":"import-statement","original":"./useTimeout"},{"path":"src/useTransitions.ts","kind":"import-statement","original":"./useTransitions"},{"path":"mini-virtual-list","kind":"import-statement","external":true}],"format":"esm"}},"outputs":{"dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":34987},"dist/lib/browser/index.mjs":{"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"lodash.defaultsdeep","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"alea","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@preact-signals/safe-react/tracking","kind":"import-statement","external":true},{"path":"@preact-signals/safe-react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"mini-virtual-list","kind":"import-statement","external":true}],"exports":["makeId","mergeRefs","randomString","setRef","useAsyncEffect","useAsyncState","useControlledState","useDebugDeps","useDefaultValue","useDefaults","useDidTransition","useDynamicRef","useFileDownload","useForwardedRef","useId","useInterval","useIsFocused","useMediaQuery","useMergeRefs","useMulticastObservable","useOnTransition","useRefCallback","useScroller","useSignalsEffect","useSignalsMemo","useSize","useStateWithRef","useTimeout","useViewportResize"],"entryPoint":"src/index.ts","inputs":{"src/useAsyncEffect.ts":{"bytesInOutput":405},"src/index.ts":{"bytesInOutput":58},"src/useAsyncState.ts":{"bytesInOutput":447},"src/useControlledState.ts":{"bytesInOutput":761},"src/useDynamicRef.ts":{"bytesInOutput":727},"src/useDebugDeps.ts":{"bytesInOutput":643},"src/useDefaultValue.ts":{"bytesInOutput":422},"src/useDefaults.ts":{"bytesInOutput":228},"src/useFileDownload.ts":{"bytesInOutput":416},"src/useForwardedRef.ts":{"bytesInOutput":827},"src/useId.ts":{"bytesInOutput":403},"src/useIsFocused.ts":{"bytesInOutput":833},"src/useMediaQuery.ts":{"bytesInOutput":1941},"src/useMulticastObservable.ts":{"bytesInOutput":368},"src/useRefCallback.ts":{"bytesInOutput":197},"src/useViewportResize.ts":{"bytesInOutput":627},"src/useSignals.ts":{"bytesInOutput":613},"src/useTimeout.ts":{"bytesInOutput":946},"src/useTransitions.ts":{"bytesInOutput":1409}},"bytes":13307}}}
@@ -43,40 +43,78 @@ var useAsyncState = (cb, deps = []) => {
43
43
  };
44
44
 
45
45
  // 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);
46
+ import { useCallback as useCallback2, useEffect as useEffect4, useRef as useRef2, useState as useState3 } from "react";
47
+
48
+ // src/useDynamicRef.ts
49
+ import { useCallback, useEffect as useEffect3, useRef, useState as useState2 } from "react";
50
+ var useStateWithRef = (valueParam) => {
51
+ const [value, setValue] = useState2(valueParam);
52
+ const valueRef = useRef(valueParam);
53
+ const setter = useCallback((value2) => {
54
+ if (typeof value2 === "function") {
55
+ setValue((current) => {
56
+ valueRef.current = value2(current);
57
+ return valueRef.current;
58
+ });
59
+ } else {
60
+ valueRef.current = value2;
61
+ setValue(value2);
52
62
  }
63
+ }, []);
64
+ return [
65
+ value,
66
+ setter,
67
+ valueRef
68
+ ];
69
+ };
70
+ var useDynamicRef = (value) => {
71
+ const valueRef = useRef(value);
72
+ useEffect3(() => {
73
+ valueRef.current = value;
53
74
  }, [
54
- controlledValue,
55
- ...deps
75
+ value
56
76
  ]);
57
- useEffect3(() => {
58
- onChange?.(value);
77
+ return valueRef;
78
+ };
79
+
80
+ // src/useControlledState.ts
81
+ var useControlledState = (valueParam, onChange) => {
82
+ const [value, setControlledValue] = useState3(valueParam);
83
+ useEffect4(() => {
84
+ setControlledValue(valueParam);
59
85
  }, [
60
- value,
61
- onChange
86
+ valueParam
87
+ ]);
88
+ const onChangeRef = useRef2(onChange);
89
+ const valueRef = useDynamicRef(valueParam);
90
+ const setValue = useCallback2((nextValue) => {
91
+ const value2 = isFunction(nextValue) ? nextValue(valueRef.current) : nextValue;
92
+ setControlledValue(value2);
93
+ onChangeRef.current?.(value2);
94
+ }, [
95
+ valueRef,
96
+ onChangeRef
62
97
  ]);
63
98
  return [
64
99
  value,
65
100
  setValue
66
101
  ];
67
102
  };
103
+ function isFunction(value) {
104
+ return typeof value === "function";
105
+ }
68
106
 
69
107
  // src/useDebugDeps.ts
70
- import { useEffect as useEffect4, useRef } from "react";
71
- var useDebugDeps = (deps = []) => {
72
- const lastDeps = useRef([]);
73
- useEffect4(() => {
108
+ import { useEffect as useEffect5, useRef as useRef3 } from "react";
109
+ var useDebugDeps = (deps = [], active = true) => {
110
+ const lastDeps = useRef3([]);
111
+ useEffect5(() => {
74
112
  console.group("deps changed", {
75
113
  previous: lastDeps.current.length,
76
114
  current: deps.length
77
115
  });
78
116
  for (let i = 0; i < Math.max(lastDeps.current.length ?? 0, deps.length ?? 0); i++) {
79
- if (lastDeps.current[i] !== deps[i]) {
117
+ if (lastDeps.current[i] !== deps[i] && active) {
80
118
  console.log("changed", {
81
119
  index: i,
82
120
  previous: lastDeps.current[i],
@@ -90,11 +128,11 @@ var useDebugDeps = (deps = []) => {
90
128
  };
91
129
 
92
130
  // src/useDefaultValue.ts
93
- import { useEffect as useEffect5, useMemo, useState as useState3 } from "react";
131
+ import { useEffect as useEffect6, useMemo, useState as useState4 } from "react";
94
132
  var useDefaultValue = (reactiveValue, getDefaultValue) => {
95
133
  const stableDefaultValue = useMemo(getDefaultValue, []);
96
- const [value, setValue] = useState3(reactiveValue ?? stableDefaultValue);
97
- useEffect5(() => {
134
+ const [value, setValue] = useState4(reactiveValue ?? stableDefaultValue);
135
+ useEffect6(() => {
98
136
  setValue(reactiveValue ?? stableDefaultValue);
99
137
  }, [
100
138
  reactiveValue,
@@ -113,39 +151,6 @@ var useDefaults = (value, defaults) => {
113
151
  ]);
114
152
  };
115
153
 
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
154
  // src/useFileDownload.ts
150
155
  import { useMemo as useMemo3 } from "react";
151
156
  var useFileDownload = () => {
@@ -160,38 +165,55 @@ var useFileDownload = () => {
160
165
  };
161
166
 
162
167
  // src/useForwardedRef.ts
163
- import { useEffect as useEffect7, useRef as useRef3 } from "react";
164
- var useForwardedRef = (ref) => {
165
- const innerRef = useRef3(null);
168
+ import { useEffect as useEffect7, useMemo as useMemo4, useRef as useRef4 } from "react";
169
+ var useForwardedRef = (forwardedRef) => {
170
+ const localRef = useRef4(null);
166
171
  useEffect7(() => {
167
- if (!ref) {
168
- return;
169
- }
170
- if (typeof ref === "function") {
171
- ref(innerRef.current);
172
- } else {
173
- ref.current = innerRef.current;
172
+ setRef(forwardedRef, localRef.current);
173
+ }, [
174
+ forwardedRef
175
+ ]);
176
+ return localRef;
177
+ };
178
+ function setRef(ref, value) {
179
+ if (typeof ref === "function") {
180
+ return ref(value);
181
+ } else if (ref) {
182
+ ref.current = value;
183
+ }
184
+ }
185
+ var mergeRefs = (refs) => {
186
+ return (value) => {
187
+ const cleanups = [];
188
+ for (const ref of refs) {
189
+ const cleanup = setRef(ref, value);
190
+ cleanups.push(typeof cleanup === "function" ? cleanup : () => setRef(ref, null));
174
191
  }
175
- });
176
- return innerRef;
192
+ return () => {
193
+ for (const cleanup of cleanups) cleanup();
194
+ };
195
+ };
196
+ };
197
+ var useMergeRefs = (refs) => {
198
+ return useMemo4(() => mergeRefs(refs), refs);
177
199
  };
178
200
 
179
201
  // src/useId.ts
180
202
  import alea from "alea";
181
- import { useMemo as useMemo4 } from "react";
203
+ import { useMemo as useMemo5 } from "react";
182
204
  var Alea = alea;
183
205
  var prng = new Alea("@dxos/react-hooks");
184
206
  var randomString = (n = 4) => prng().toString(16).slice(2, n + 2);
185
- var useId = (namespace, propsId, opts) => useMemo4(() => makeId(namespace, propsId, opts), [
207
+ var useId = (namespace, propsId, opts) => useMemo5(() => makeId(namespace, propsId, opts), [
186
208
  propsId
187
209
  ]);
188
210
  var makeId = (namespace, propsId, opts) => propsId ?? `${namespace}-${randomString(opts?.n ?? 4)}`;
189
211
 
190
212
  // src/useIsFocused.ts
191
- import { useEffect as useEffect8, useRef as useRef4, useState as useState5 } from "react";
213
+ import { useEffect as useEffect8, useRef as useRef5, useState as useState5 } from "react";
192
214
  var useIsFocused = (inputRef) => {
193
215
  const [isFocused, setIsFocused] = useState5(void 0);
194
- const isFocusedRef = useRef4(isFocused);
216
+ const isFocusedRef = useRef5(isFocused);
195
217
  isFocusedRef.current = isFocused;
196
218
  useEffect8(() => {
197
219
  const input = inputRef.current;
@@ -226,7 +248,7 @@ var breakpointMediaQueries = {
226
248
  "2xl": "(min-width: 1536px)"
227
249
  };
228
250
  var useMediaQuery = (query, options = {}) => {
229
- const { ssr = true, fallback } = options;
251
+ const { ssr = false, fallback } = options;
230
252
  const queries = (Array.isArray(query) ? query : [
231
253
  query
232
254
  ]).map((query2) => query2 in breakpointMediaQueries ? breakpointMediaQueries[query2] : query2);
@@ -282,9 +304,9 @@ var useMediaQuery = (query, options = {}) => {
282
304
  };
283
305
 
284
306
  // src/useMulticastObservable.ts
285
- import { useMemo as useMemo5, useSyncExternalStore } from "react";
307
+ import { useMemo as useMemo6, useSyncExternalStore } from "react";
286
308
  var useMulticastObservable = (observable) => {
287
- const subscribeFn = useMemo5(() => (listener) => {
309
+ const subscribeFn = useMemo6(() => (listener) => {
288
310
  const subscription = observable.subscribe(listener);
289
311
  return () => subscription.unsubscribe();
290
312
  }, [
@@ -303,10 +325,10 @@ var useRefCallback = () => {
303
325
  };
304
326
  };
305
327
 
306
- // src/useResize.ts
307
- import { useLayoutEffect, useMemo as useMemo6 } from "react";
308
- var useResize = (handler, deps = [], delay = 800) => {
309
- const debouncedHandler = useMemo6(() => {
328
+ // src/useViewportResize.ts
329
+ import { useLayoutEffect, useMemo as useMemo7 } from "react";
330
+ var useViewportResize = (handler, deps = [], delay = 800) => {
331
+ const debouncedHandler = useMemo7(() => {
310
332
  let timeout;
311
333
  return (event) => {
312
334
  clearTimeout(timeout);
@@ -331,10 +353,9 @@ var useResize = (handler, deps = [], delay = 800) => {
331
353
  // src/useSignals.ts
332
354
  import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
333
355
  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";
356
+ import { useEffect as useEffect10, useMemo as useMemo8, useRef as useRef6 } from "react";
336
357
  var useSignalsEffect = (cb, deps) => {
337
- const callback = useRef5(cb);
358
+ const callback = useRef6(cb);
338
359
  callback.current = cb;
339
360
  useEffect10(() => {
340
361
  return effect(() => {
@@ -345,16 +366,16 @@ var useSignalsEffect = (cb, deps) => {
345
366
  var useSignalsMemo = (cb, deps) => {
346
367
  var _effect = _useSignals();
347
368
  try {
348
- return useMemo7(() => computed(cb), deps ?? []).value;
369
+ return useMemo8(() => computed(cb), deps ?? []).value;
349
370
  } finally {
350
371
  _effect.f();
351
372
  }
352
373
  };
353
374
 
354
375
  // src/useTimeout.ts
355
- import { useEffect as useEffect11, useRef as useRef6 } from "react";
376
+ import { useEffect as useEffect11, useRef as useRef7 } from "react";
356
377
  var useTimeout = (callback, delay = 0, deps = []) => {
357
- const callbackRef = useRef6(callback);
378
+ const callbackRef = useRef7(callback);
358
379
  useEffect11(() => {
359
380
  callbackRef.current = callback;
360
381
  }, [
@@ -372,7 +393,7 @@ var useTimeout = (callback, delay = 0, deps = []) => {
372
393
  ]);
373
394
  };
374
395
  var useInterval = (callback, delay = 0, deps = []) => {
375
- const callbackRef = useRef6(callback);
396
+ const callbackRef = useRef7(callback);
376
397
  useEffect11(() => {
377
398
  callbackRef.current = callback;
378
399
  }, [
@@ -395,49 +416,17 @@ var useInterval = (callback, delay = 0, deps = []) => {
395
416
  ]);
396
417
  };
397
418
 
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
419
  // src/useTransitions.ts
431
- import { useEffect as useEffect13, useRef as useRef8, useState as useState8 } from "react";
432
- var isFunction = (functionToCheck) => {
420
+ import { useEffect as useEffect12, useRef as useRef8, useState as useState8 } from "react";
421
+ var isFunction2 = (functionToCheck) => {
433
422
  return functionToCheck instanceof Function;
434
423
  };
435
424
  var useDidTransition = (currentValue, fromValue, toValue) => {
436
425
  const [hasTransitioned, setHasTransitioned] = useState8(false);
437
426
  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;
427
+ useEffect12(() => {
428
+ const toValueValid = isFunction2(toValue) ? toValue(currentValue) : toValue === currentValue;
429
+ const fromValueValid = isFunction2(fromValue) ? fromValue(previousValue.current) : fromValue === previousValue.current;
441
430
  if (fromValueValid && toValueValid && !hasTransitioned) {
442
431
  setHasTransitioned(true);
443
432
  } else if ((!fromValueValid || !toValueValid) && hasTransitioned) {
@@ -455,13 +444,13 @@ var useDidTransition = (currentValue, fromValue, toValue) => {
455
444
  var useOnTransition = (currentValue, fromValue, toValue, callback) => {
456
445
  const dirty = useRef8(false);
457
446
  const hasTransitioned = useDidTransition(currentValue, fromValue, toValue);
458
- useEffect13(() => {
447
+ useEffect12(() => {
459
448
  dirty.current = false;
460
449
  }, [
461
450
  currentValue,
462
451
  dirty
463
452
  ]);
464
- useEffect13(() => {
453
+ useEffect12(() => {
465
454
  if (hasTransitioned && !dirty.current) {
466
455
  callback();
467
456
  dirty.current = true;
@@ -472,9 +461,14 @@ var useOnTransition = (currentValue, fromValue, toValue, callback) => {
472
461
  callback
473
462
  ]);
474
463
  };
464
+
465
+ // src/index.ts
466
+ import { useSize, useScroller } from "mini-virtual-list";
475
467
  export {
476
468
  makeId,
469
+ mergeRefs,
477
470
  randomString,
471
+ setRef,
478
472
  useAsyncEffect,
479
473
  useAsyncState,
480
474
  useControlledState,
@@ -489,14 +483,16 @@ export {
489
483
  useInterval,
490
484
  useIsFocused,
491
485
  useMediaQuery,
486
+ useMergeRefs,
492
487
  useMulticastObservable,
493
488
  useOnTransition,
494
489
  useRefCallback,
495
- useResize,
490
+ useScroller,
496
491
  useSignalsEffect,
497
492
  useSignalsMemo,
493
+ useSize,
498
494
  useStateWithRef,
499
495
  useTimeout,
500
- useTrackProps
496
+ useViewportResize
501
497
  };
502
498
  //# sourceMappingURL=index.mjs.map