@dxos/react-hooks 0.8.4-main.e098934 → 0.8.4-main.e8ec1fe

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