@dnd-kit/react 0.5.1-beta-20260905201412 → 0.5.1-beta-20260912195958

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/hooks.cjs CHANGED
@@ -22,14 +22,14 @@ function useForceUpdate() {
22
22
  }
23
23
 
24
24
  // src/hooks/useSignal.ts
25
- function useSignal(signal, sync = false) {
26
- const previous = react.useRef(signal.peek());
25
+ function useSignal(signal2, sync = false) {
26
+ const previous = react.useRef(signal2.peek());
27
27
  const read = react.useRef(false);
28
28
  const forceUpdate = useForceUpdate();
29
29
  useIsomorphicLayoutEffect(
30
30
  () => state.effect(() => {
31
31
  const previousValue = previous.current;
32
- const currentValue2 = signal.value;
32
+ const currentValue2 = signal2.value;
33
33
  if (previousValue !== currentValue2) {
34
34
  previous.current = currentValue2;
35
35
  if (!read.current) return;
@@ -40,12 +40,12 @@ function useSignal(signal, sync = false) {
40
40
  }
41
41
  }
42
42
  }),
43
- [signal, sync, forceUpdate]
43
+ [signal2, sync, forceUpdate]
44
44
  );
45
45
  return {
46
46
  get value() {
47
47
  read.current = true;
48
- return signal.peek();
48
+ return signal2.peek();
49
49
  }
50
50
  };
51
51
  }
@@ -59,60 +59,79 @@ function useComputed(compute, dependencies = [], sync = false) {
59
59
  sync
60
60
  );
61
61
  }
62
+ function useLatest(value) {
63
+ const valueRef = react.useRef(value);
64
+ useIsomorphicLayoutEffect(() => {
65
+ valueRef.current = value;
66
+ }, [value]);
67
+ return valueRef;
68
+ }
69
+
70
+ // src/hooks/useDeepSignal.ts
62
71
  function useDeepSignal(target, synchronous) {
63
- const tracked = react.useRef(/* @__PURE__ */ new Map());
64
72
  const forceUpdate = useForceUpdate();
73
+ const synchronousRef = useLatest(synchronous);
74
+ const tracker = react.useMemo(() => {
75
+ const tracked = /* @__PURE__ */ new Map();
76
+ return {
77
+ tracked,
78
+ propertyCount: state.signal(0),
79
+ active: false,
80
+ proxy: target ? new Proxy(target, {
81
+ get(target2, key) {
82
+ const value = target2[key];
83
+ if (!tracked.has(key)) tracked.set(key, value);
84
+ return value;
85
+ }
86
+ }) : target
87
+ };
88
+ }, [target]);
65
89
  useIsomorphicLayoutEffect(() => {
66
- if (!target) {
67
- tracked.current.clear();
68
- return;
69
- }
70
- return state.effect(() => {
71
- var _a;
90
+ tracker.propertyCount.value = tracker.tracked.size;
91
+ });
92
+ useIsomorphicLayoutEffect(() => {
93
+ if (!target) return;
94
+ const { tracked, propertyCount } = tracker;
95
+ tracker.active = true;
96
+ const dispose = state.effect(() => {
97
+ propertyCount.value;
72
98
  let stale = false;
73
99
  let sync = false;
74
- for (const entry of tracked.current) {
75
- const [key] = entry;
76
- const value = state.untracked(() => entry[1]);
100
+ for (const [key, value] of tracked) {
77
101
  const latestValue = target[key];
78
- if (value !== latestValue) {
102
+ if (!Object.is(value, latestValue)) {
79
103
  stale = true;
80
- tracked.current.set(key, latestValue);
81
- sync = (_a = synchronous == null ? void 0 : synchronous(key, value, latestValue)) != null ? _a : false;
104
+ tracked.set(key, latestValue);
105
+ sync = state.untracked(
106
+ () => {
107
+ var _a;
108
+ return (_a = synchronousRef.current) == null ? void 0 : _a.call(synchronousRef, key, value, latestValue);
109
+ }
110
+ ) === true || sync;
82
111
  }
83
112
  }
84
113
  if (stale) {
85
114
  if (sync) {
86
- queueMicrotask(() => reactDom.flushSync(forceUpdate));
115
+ queueMicrotask(() => {
116
+ if (tracker.active) reactDom.flushSync(forceUpdate);
117
+ });
87
118
  } else {
88
119
  forceUpdate();
89
120
  }
90
121
  }
91
122
  });
92
- }, [target]);
93
- return react.useMemo(
94
- () => target ? new Proxy(target, {
95
- get(target2, key) {
96
- const value = target2[key];
97
- tracked.current.set(key, value);
98
- return value;
99
- }
100
- }) : target,
101
- [target]
102
- );
123
+ return () => {
124
+ tracker.active = false;
125
+ dispose();
126
+ };
127
+ }, [target, tracker, forceUpdate, synchronousRef]);
128
+ return tracker.proxy;
103
129
  }
104
130
 
105
131
  // src/hooks/useImmediateEffect.ts
106
132
  function useImmediateEffect(callback, _) {
107
133
  callback();
108
134
  }
109
- function useLatest(value) {
110
- const valueRef = react.useRef(value);
111
- useIsomorphicLayoutEffect(() => {
112
- valueRef.current = value;
113
- }, [value]);
114
- return valueRef;
115
- }
116
135
  function useOnValueChange(value, onChange, effect3 = react.useEffect, compare = Object.is) {
117
136
  const tracked = react.useRef(value);
118
137
  effect3(() => {
package/hooks.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["src/hooks/useConstant.ts","src/hooks/useIsomorphicLayoutEffect.ts","src/hooks/useForceUpdate.ts","src/hooks/useSignal.ts","src/hooks/useComputed.ts","src/hooks/useDeepSignal.ts","src/hooks/useImmediateEffect.ts","src/hooks/useLatest.ts","src/hooks/useOnValueChange.ts","src/hooks/useOnElementChange.ts"],"names":["useRef","useLayoutEffect","useEffect","useState","useCallback","effect","currentValue","flushSync","useMemo","computed","untracked","target"],"mappings":"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","file":"hooks.cjs","sourcesContent":["import {type MutableRefObject, useRef} from 'react';\n\nexport function useConstant<T = any>(initializer: () => T) {\n const ref = useRef<T>(null) as MutableRefObject<T>;\n\n if (!ref.current) {\n ref.current = initializer();\n }\n\n return ref.current;\n}\n","import {useEffect, useLayoutEffect} from 'react';\n\n// https://github.com/facebook/react/blob/master/packages/shared/ExecutionEnvironment.js\nexport const canUseDOM =\n typeof window !== 'undefined' &&\n typeof window.document !== 'undefined' &&\n typeof window.document.createElement !== 'undefined';\n\n/**\n * A hook that resolves to useEffect on the server and useLayoutEffect on the client\n * @param callback {function} Callback function that is invoked when the dependencies of the hook change\n */\nexport const useIsomorphicLayoutEffect = canUseDOM\n ? useLayoutEffect\n : useEffect;\n","import {useCallback, useState} from 'react';\n\nexport function useForceUpdate() {\n const setState = useState(0)[1];\n\n return useCallback(() => {\n setState((value) => value + 1);\n }, [setState]);\n}\n","import {useRef, useState} from 'react';\nimport {flushSync} from 'react-dom';\nimport {effect, Signal} from '@dnd-kit/state';\n\nimport {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect.ts';\nimport {useForceUpdate} from './useForceUpdate.ts';\n\n/** Trigger a re-render when reading a signal. */\nexport function useSignal<T = any>(signal: Signal<T>, sync = false) {\n const previous = useRef(signal.peek());\n const read = useRef(false);\n const forceUpdate = useForceUpdate();\n\n useIsomorphicLayoutEffect(\n () =>\n effect(() => {\n const previousValue = previous.current;\n const currentValue = signal.value;\n\n if (previousValue !== currentValue) {\n previous.current = currentValue;\n\n if (!read.current) return;\n\n if (sync) {\n flushSync(forceUpdate);\n } else {\n forceUpdate();\n }\n }\n }),\n [signal, sync, forceUpdate]\n );\n\n return {\n get value() {\n read.current = true;\n\n return signal.peek();\n },\n };\n}\n","import {useMemo, useRef} from 'react';\nimport {computed} from '@dnd-kit/state';\n\nimport {useSignal} from './useSignal.ts';\n\nexport function useComputed<T = any>(\n compute: () => T,\n dependencies: any[] = [],\n sync = false\n) {\n const $compute = useRef(compute);\n $compute.current = compute;\n\n return useSignal(\n useMemo(() => computed(() => $compute.current()), dependencies),\n sync\n );\n}\n","import {useMemo, useRef} from 'react';\nimport {flushSync} from 'react-dom';\nimport {effect, untracked} from '@dnd-kit/state';\n\nimport {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect.ts';\nimport {useForceUpdate} from './useForceUpdate.ts';\n\n/** Trigger a re-render when reading signal properties of an object. */\nexport function useDeepSignal<T extends object | null | undefined>(\n target: T,\n synchronous?: (property: keyof T, oldValue: any, newValue: any) => boolean\n): T {\n const tracked = useRef(new Map<string | symbol, any>());\n const forceUpdate = useForceUpdate();\n\n useIsomorphicLayoutEffect(() => {\n if (!target) {\n tracked.current.clear();\n return;\n }\n\n return effect(() => {\n let stale = false;\n let sync = false;\n\n for (const entry of tracked.current) {\n const [key] = entry;\n const value = untracked(() => entry[1]);\n const latestValue = (target as any)[key];\n\n if (value !== latestValue) {\n stale = true;\n tracked.current.set(key, latestValue);\n sync = synchronous?.(key as keyof T, value, latestValue) ?? false;\n }\n }\n\n if (stale) {\n if (sync) {\n // Defer flushSync to a microtask to avoid calling it from within\n // a React lifecycle method (e.g. useEffect batch), which happens when\n // signal updates are triggered synchronously from a React effect\n queueMicrotask(() => flushSync(forceUpdate));\n } else {\n forceUpdate();\n }\n }\n });\n }, [target]);\n\n return useMemo(\n () =>\n target\n ? new Proxy(target, {\n get(target, key) {\n const value = (target as any)[key];\n\n tracked.current.set(key, value);\n\n return value;\n },\n })\n : target,\n [target]\n );\n}\n","import type {DependencyList, EffectCallback} from 'react';\n\nexport function useImmediateEffect(\n callback: EffectCallback,\n _?: DependencyList\n) {\n callback();\n}\n","import {useRef} from 'react';\n\nimport {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect.ts';\n\nexport function useLatest<T>(value: T) {\n const valueRef = useRef<T | undefined>(value);\n\n useIsomorphicLayoutEffect(() => {\n valueRef.current = value;\n }, [value]);\n\n return valueRef;\n}\n","import {useRef, useEffect} from 'react';\n\nexport function useOnValueChange<T>(\n value: T,\n onChange: (value: T, oldValue: T) => void,\n effect = useEffect,\n compare = Object.is\n) {\n const tracked = useRef<T>(value);\n\n effect(() => {\n const oldValue = tracked.current;\n\n if (!compare(value, oldValue)) {\n tracked.current = value;\n onChange(value, oldValue);\n }\n }, [onChange, value]);\n}\n","import {useRef} from 'react';\nimport {currentValue, type RefOrValue} from '@dnd-kit/react/utilities';\n\nimport {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect.ts';\n\nexport function useOnElementChange(\n value: RefOrValue<Element>,\n onChange: (value: Element | undefined) => void\n) {\n const previous = useRef(currentValue(value));\n\n useIsomorphicLayoutEffect(() => {\n const current = currentValue(value);\n\n if (current !== previous.current) {\n previous.current = current;\n onChange(current);\n }\n });\n}\n"]}
1
+ {"version":3,"sources":["src/hooks/useConstant.ts","src/hooks/useIsomorphicLayoutEffect.ts","src/hooks/useForceUpdate.ts","src/hooks/useSignal.ts","src/hooks/useComputed.ts","src/hooks/useLatest.ts","src/hooks/useDeepSignal.ts","src/hooks/useImmediateEffect.ts","src/hooks/useOnValueChange.ts","src/hooks/useOnElementChange.ts"],"names":["useRef","useLayoutEffect","useEffect","useState","useCallback","signal","effect","currentValue","flushSync","useMemo","computed","target","untracked"],"mappings":"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","file":"hooks.cjs","sourcesContent":["import {type MutableRefObject, useRef} from 'react';\n\nexport function useConstant<T = any>(initializer: () => T) {\n const ref = useRef<T>(null) as MutableRefObject<T>;\n\n if (!ref.current) {\n ref.current = initializer();\n }\n\n return ref.current;\n}\n","import {useEffect, useLayoutEffect} from 'react';\n\n// https://github.com/facebook/react/blob/master/packages/shared/ExecutionEnvironment.js\nexport const canUseDOM =\n typeof window !== 'undefined' &&\n typeof window.document !== 'undefined' &&\n typeof window.document.createElement !== 'undefined';\n\n/**\n * A hook that resolves to useEffect on the server and useLayoutEffect on the client\n * @param callback {function} Callback function that is invoked when the dependencies of the hook change\n */\nexport const useIsomorphicLayoutEffect = canUseDOM\n ? useLayoutEffect\n : useEffect;\n","import {useCallback, useState} from 'react';\n\nexport function useForceUpdate() {\n const setState = useState(0)[1];\n\n return useCallback(() => {\n setState((value) => value + 1);\n }, [setState]);\n}\n","import {useRef, useState} from 'react';\nimport {flushSync} from 'react-dom';\nimport {effect, Signal} from '@dnd-kit/state';\n\nimport {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect.ts';\nimport {useForceUpdate} from './useForceUpdate.ts';\n\n/** Trigger a re-render when reading a signal. */\nexport function useSignal<T = any>(signal: Signal<T>, sync = false) {\n const previous = useRef(signal.peek());\n const read = useRef(false);\n const forceUpdate = useForceUpdate();\n\n useIsomorphicLayoutEffect(\n () =>\n effect(() => {\n const previousValue = previous.current;\n const currentValue = signal.value;\n\n if (previousValue !== currentValue) {\n previous.current = currentValue;\n\n if (!read.current) return;\n\n if (sync) {\n flushSync(forceUpdate);\n } else {\n forceUpdate();\n }\n }\n }),\n [signal, sync, forceUpdate]\n );\n\n return {\n get value() {\n read.current = true;\n\n return signal.peek();\n },\n };\n}\n","import {useMemo, useRef} from 'react';\nimport {computed} from '@dnd-kit/state';\n\nimport {useSignal} from './useSignal.ts';\n\nexport function useComputed<T = any>(\n compute: () => T,\n dependencies: any[] = [],\n sync = false\n) {\n const $compute = useRef(compute);\n $compute.current = compute;\n\n return useSignal(\n useMemo(() => computed(() => $compute.current()), dependencies),\n sync\n );\n}\n","import {useRef} from 'react';\n\nimport {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect.ts';\n\nexport function useLatest<T>(value: T) {\n const valueRef = useRef<T | undefined>(value);\n\n useIsomorphicLayoutEffect(() => {\n valueRef.current = value;\n }, [value]);\n\n return valueRef;\n}\n","import {useMemo} from 'react';\nimport {flushSync} from 'react-dom';\nimport {effect, signal, untracked} from '@dnd-kit/state';\n\nimport {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect.ts';\nimport {useForceUpdate} from './useForceUpdate.ts';\nimport {useLatest} from './useLatest.ts';\n\n/** Trigger a re-render when reading signal properties of an object. */\nexport function useDeepSignal<T extends object | null | undefined>(\n target: T,\n synchronous?: (property: keyof T, oldValue: any, newValue: any) => boolean\n): T {\n const forceUpdate = useForceUpdate();\n const synchronousRef = useLatest(synchronous);\n const tracker = useMemo(() => {\n const tracked = new Map<string | symbol, any>();\n\n return {\n tracked,\n propertyCount: signal(0),\n active: false,\n proxy: target\n ? new Proxy(target, {\n get(target, key) {\n const value = (target as any)[key];\n\n // Reads must not overwrite the observer's comparison baseline.\n if (!tracked.has(key)) tracked.set(key, value);\n\n return value;\n },\n })\n : target,\n };\n }, [target]);\n\n // Publish newly read properties after commit, without notifying from render.\n // The map only grows for a given target, so its size versions the key set.\n useIsomorphicLayoutEffect(() => {\n tracker.propertyCount.value = tracker.tracked.size;\n });\n\n useIsomorphicLayoutEffect(() => {\n if (!target) return;\n\n const {tracked, propertyCount} = tracker;\n tracker.active = true;\n const dispose = effect(() => {\n // Keep the effect alive, but refresh its dependencies for late reads.\n propertyCount.value;\n\n let stale = false;\n let sync = false;\n\n for (const [key, value] of tracked) {\n const latestValue = (target as any)[key];\n\n if (!Object.is(value, latestValue)) {\n stale = true;\n tracked.set(key, latestValue);\n sync =\n untracked(() =>\n synchronousRef.current?.(key as keyof T, value, latestValue)\n ) === true || sync;\n }\n }\n\n if (stale) {\n if (sync) {\n // Signal updates can originate in a React lifecycle method.\n queueMicrotask(() => {\n if (tracker.active) flushSync(forceUpdate);\n });\n } else {\n forceUpdate();\n }\n }\n });\n\n return () => {\n tracker.active = false;\n dispose();\n };\n }, [target, tracker, forceUpdate, synchronousRef]);\n\n return tracker.proxy;\n}\n","import type {DependencyList, EffectCallback} from 'react';\n\nexport function useImmediateEffect(\n callback: EffectCallback,\n _?: DependencyList\n) {\n callback();\n}\n","import {useRef, useEffect} from 'react';\n\nexport function useOnValueChange<T>(\n value: T,\n onChange: (value: T, oldValue: T) => void,\n effect = useEffect,\n compare = Object.is\n) {\n const tracked = useRef<T>(value);\n\n effect(() => {\n const oldValue = tracked.current;\n\n if (!compare(value, oldValue)) {\n tracked.current = value;\n onChange(value, oldValue);\n }\n }, [onChange, value]);\n}\n","import {useRef} from 'react';\nimport {currentValue, type RefOrValue} from '@dnd-kit/react/utilities';\n\nimport {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect.ts';\n\nexport function useOnElementChange(\n value: RefOrValue<Element>,\n onChange: (value: Element | undefined) => void\n) {\n const previous = useRef(currentValue(value));\n\n useIsomorphicLayoutEffect(() => {\n const current = currentValue(value);\n\n if (current !== previous.current) {\n previous.current = current;\n onChange(current);\n }\n });\n}\n"]}
package/hooks.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { useLayoutEffect, useEffect, useRef, useMemo, useState, useCallback } from 'react';
2
- import { computed, effect, untracked } from '@dnd-kit/state';
2
+ import { computed, signal, effect, untracked } from '@dnd-kit/state';
3
3
  import { flushSync } from 'react-dom';
4
4
  import { currentValue } from '@dnd-kit/react/utilities';
5
5
 
@@ -20,14 +20,14 @@ function useForceUpdate() {
20
20
  }
21
21
 
22
22
  // src/hooks/useSignal.ts
23
- function useSignal(signal, sync = false) {
24
- const previous = useRef(signal.peek());
23
+ function useSignal(signal2, sync = false) {
24
+ const previous = useRef(signal2.peek());
25
25
  const read = useRef(false);
26
26
  const forceUpdate = useForceUpdate();
27
27
  useIsomorphicLayoutEffect(
28
28
  () => effect(() => {
29
29
  const previousValue = previous.current;
30
- const currentValue2 = signal.value;
30
+ const currentValue2 = signal2.value;
31
31
  if (previousValue !== currentValue2) {
32
32
  previous.current = currentValue2;
33
33
  if (!read.current) return;
@@ -38,12 +38,12 @@ function useSignal(signal, sync = false) {
38
38
  }
39
39
  }
40
40
  }),
41
- [signal, sync, forceUpdate]
41
+ [signal2, sync, forceUpdate]
42
42
  );
43
43
  return {
44
44
  get value() {
45
45
  read.current = true;
46
- return signal.peek();
46
+ return signal2.peek();
47
47
  }
48
48
  };
49
49
  }
@@ -57,60 +57,79 @@ function useComputed(compute, dependencies = [], sync = false) {
57
57
  sync
58
58
  );
59
59
  }
60
+ function useLatest(value) {
61
+ const valueRef = useRef(value);
62
+ useIsomorphicLayoutEffect(() => {
63
+ valueRef.current = value;
64
+ }, [value]);
65
+ return valueRef;
66
+ }
67
+
68
+ // src/hooks/useDeepSignal.ts
60
69
  function useDeepSignal(target, synchronous) {
61
- const tracked = useRef(/* @__PURE__ */ new Map());
62
70
  const forceUpdate = useForceUpdate();
71
+ const synchronousRef = useLatest(synchronous);
72
+ const tracker = useMemo(() => {
73
+ const tracked = /* @__PURE__ */ new Map();
74
+ return {
75
+ tracked,
76
+ propertyCount: signal(0),
77
+ active: false,
78
+ proxy: target ? new Proxy(target, {
79
+ get(target2, key) {
80
+ const value = target2[key];
81
+ if (!tracked.has(key)) tracked.set(key, value);
82
+ return value;
83
+ }
84
+ }) : target
85
+ };
86
+ }, [target]);
63
87
  useIsomorphicLayoutEffect(() => {
64
- if (!target) {
65
- tracked.current.clear();
66
- return;
67
- }
68
- return effect(() => {
69
- var _a;
88
+ tracker.propertyCount.value = tracker.tracked.size;
89
+ });
90
+ useIsomorphicLayoutEffect(() => {
91
+ if (!target) return;
92
+ const { tracked, propertyCount } = tracker;
93
+ tracker.active = true;
94
+ const dispose = effect(() => {
95
+ propertyCount.value;
70
96
  let stale = false;
71
97
  let sync = false;
72
- for (const entry of tracked.current) {
73
- const [key] = entry;
74
- const value = untracked(() => entry[1]);
98
+ for (const [key, value] of tracked) {
75
99
  const latestValue = target[key];
76
- if (value !== latestValue) {
100
+ if (!Object.is(value, latestValue)) {
77
101
  stale = true;
78
- tracked.current.set(key, latestValue);
79
- sync = (_a = synchronous == null ? void 0 : synchronous(key, value, latestValue)) != null ? _a : false;
102
+ tracked.set(key, latestValue);
103
+ sync = untracked(
104
+ () => {
105
+ var _a;
106
+ return (_a = synchronousRef.current) == null ? void 0 : _a.call(synchronousRef, key, value, latestValue);
107
+ }
108
+ ) === true || sync;
80
109
  }
81
110
  }
82
111
  if (stale) {
83
112
  if (sync) {
84
- queueMicrotask(() => flushSync(forceUpdate));
113
+ queueMicrotask(() => {
114
+ if (tracker.active) flushSync(forceUpdate);
115
+ });
85
116
  } else {
86
117
  forceUpdate();
87
118
  }
88
119
  }
89
120
  });
90
- }, [target]);
91
- return useMemo(
92
- () => target ? new Proxy(target, {
93
- get(target2, key) {
94
- const value = target2[key];
95
- tracked.current.set(key, value);
96
- return value;
97
- }
98
- }) : target,
99
- [target]
100
- );
121
+ return () => {
122
+ tracker.active = false;
123
+ dispose();
124
+ };
125
+ }, [target, tracker, forceUpdate, synchronousRef]);
126
+ return tracker.proxy;
101
127
  }
102
128
 
103
129
  // src/hooks/useImmediateEffect.ts
104
130
  function useImmediateEffect(callback, _) {
105
131
  callback();
106
132
  }
107
- function useLatest(value) {
108
- const valueRef = useRef(value);
109
- useIsomorphicLayoutEffect(() => {
110
- valueRef.current = value;
111
- }, [value]);
112
- return valueRef;
113
- }
114
133
  function useOnValueChange(value, onChange, effect3 = useEffect, compare = Object.is) {
115
134
  const tracked = useRef(value);
116
135
  effect3(() => {
package/hooks.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["src/hooks/useConstant.ts","src/hooks/useIsomorphicLayoutEffect.ts","src/hooks/useForceUpdate.ts","src/hooks/useSignal.ts","src/hooks/useComputed.ts","src/hooks/useDeepSignal.ts","src/hooks/useImmediateEffect.ts","src/hooks/useLatest.ts","src/hooks/useOnValueChange.ts","src/hooks/useOnElementChange.ts"],"names":["useRef","currentValue","effect","flushSync","useMemo","target","useEffect"],"mappings":"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","file":"hooks.js","sourcesContent":["import {type MutableRefObject, useRef} from 'react';\n\nexport function useConstant<T = any>(initializer: () => T) {\n const ref = useRef<T>(null) as MutableRefObject<T>;\n\n if (!ref.current) {\n ref.current = initializer();\n }\n\n return ref.current;\n}\n","import {useEffect, useLayoutEffect} from 'react';\n\n// https://github.com/facebook/react/blob/master/packages/shared/ExecutionEnvironment.js\nexport const canUseDOM =\n typeof window !== 'undefined' &&\n typeof window.document !== 'undefined' &&\n typeof window.document.createElement !== 'undefined';\n\n/**\n * A hook that resolves to useEffect on the server and useLayoutEffect on the client\n * @param callback {function} Callback function that is invoked when the dependencies of the hook change\n */\nexport const useIsomorphicLayoutEffect = canUseDOM\n ? useLayoutEffect\n : useEffect;\n","import {useCallback, useState} from 'react';\n\nexport function useForceUpdate() {\n const setState = useState(0)[1];\n\n return useCallback(() => {\n setState((value) => value + 1);\n }, [setState]);\n}\n","import {useRef, useState} from 'react';\nimport {flushSync} from 'react-dom';\nimport {effect, Signal} from '@dnd-kit/state';\n\nimport {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect.ts';\nimport {useForceUpdate} from './useForceUpdate.ts';\n\n/** Trigger a re-render when reading a signal. */\nexport function useSignal<T = any>(signal: Signal<T>, sync = false) {\n const previous = useRef(signal.peek());\n const read = useRef(false);\n const forceUpdate = useForceUpdate();\n\n useIsomorphicLayoutEffect(\n () =>\n effect(() => {\n const previousValue = previous.current;\n const currentValue = signal.value;\n\n if (previousValue !== currentValue) {\n previous.current = currentValue;\n\n if (!read.current) return;\n\n if (sync) {\n flushSync(forceUpdate);\n } else {\n forceUpdate();\n }\n }\n }),\n [signal, sync, forceUpdate]\n );\n\n return {\n get value() {\n read.current = true;\n\n return signal.peek();\n },\n };\n}\n","import {useMemo, useRef} from 'react';\nimport {computed} from '@dnd-kit/state';\n\nimport {useSignal} from './useSignal.ts';\n\nexport function useComputed<T = any>(\n compute: () => T,\n dependencies: any[] = [],\n sync = false\n) {\n const $compute = useRef(compute);\n $compute.current = compute;\n\n return useSignal(\n useMemo(() => computed(() => $compute.current()), dependencies),\n sync\n );\n}\n","import {useMemo, useRef} from 'react';\nimport {flushSync} from 'react-dom';\nimport {effect, untracked} from '@dnd-kit/state';\n\nimport {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect.ts';\nimport {useForceUpdate} from './useForceUpdate.ts';\n\n/** Trigger a re-render when reading signal properties of an object. */\nexport function useDeepSignal<T extends object | null | undefined>(\n target: T,\n synchronous?: (property: keyof T, oldValue: any, newValue: any) => boolean\n): T {\n const tracked = useRef(new Map<string | symbol, any>());\n const forceUpdate = useForceUpdate();\n\n useIsomorphicLayoutEffect(() => {\n if (!target) {\n tracked.current.clear();\n return;\n }\n\n return effect(() => {\n let stale = false;\n let sync = false;\n\n for (const entry of tracked.current) {\n const [key] = entry;\n const value = untracked(() => entry[1]);\n const latestValue = (target as any)[key];\n\n if (value !== latestValue) {\n stale = true;\n tracked.current.set(key, latestValue);\n sync = synchronous?.(key as keyof T, value, latestValue) ?? false;\n }\n }\n\n if (stale) {\n if (sync) {\n // Defer flushSync to a microtask to avoid calling it from within\n // a React lifecycle method (e.g. useEffect batch), which happens when\n // signal updates are triggered synchronously from a React effect\n queueMicrotask(() => flushSync(forceUpdate));\n } else {\n forceUpdate();\n }\n }\n });\n }, [target]);\n\n return useMemo(\n () =>\n target\n ? new Proxy(target, {\n get(target, key) {\n const value = (target as any)[key];\n\n tracked.current.set(key, value);\n\n return value;\n },\n })\n : target,\n [target]\n );\n}\n","import type {DependencyList, EffectCallback} from 'react';\n\nexport function useImmediateEffect(\n callback: EffectCallback,\n _?: DependencyList\n) {\n callback();\n}\n","import {useRef} from 'react';\n\nimport {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect.ts';\n\nexport function useLatest<T>(value: T) {\n const valueRef = useRef<T | undefined>(value);\n\n useIsomorphicLayoutEffect(() => {\n valueRef.current = value;\n }, [value]);\n\n return valueRef;\n}\n","import {useRef, useEffect} from 'react';\n\nexport function useOnValueChange<T>(\n value: T,\n onChange: (value: T, oldValue: T) => void,\n effect = useEffect,\n compare = Object.is\n) {\n const tracked = useRef<T>(value);\n\n effect(() => {\n const oldValue = tracked.current;\n\n if (!compare(value, oldValue)) {\n tracked.current = value;\n onChange(value, oldValue);\n }\n }, [onChange, value]);\n}\n","import {useRef} from 'react';\nimport {currentValue, type RefOrValue} from '@dnd-kit/react/utilities';\n\nimport {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect.ts';\n\nexport function useOnElementChange(\n value: RefOrValue<Element>,\n onChange: (value: Element | undefined) => void\n) {\n const previous = useRef(currentValue(value));\n\n useIsomorphicLayoutEffect(() => {\n const current = currentValue(value);\n\n if (current !== previous.current) {\n previous.current = current;\n onChange(current);\n }\n });\n}\n"]}
1
+ {"version":3,"sources":["src/hooks/useConstant.ts","src/hooks/useIsomorphicLayoutEffect.ts","src/hooks/useForceUpdate.ts","src/hooks/useSignal.ts","src/hooks/useComputed.ts","src/hooks/useLatest.ts","src/hooks/useDeepSignal.ts","src/hooks/useImmediateEffect.ts","src/hooks/useOnValueChange.ts","src/hooks/useOnElementChange.ts"],"names":["signal","useRef","currentValue","useMemo","target","effect","flushSync","useEffect"],"mappings":"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","file":"hooks.js","sourcesContent":["import {type MutableRefObject, useRef} from 'react';\n\nexport function useConstant<T = any>(initializer: () => T) {\n const ref = useRef<T>(null) as MutableRefObject<T>;\n\n if (!ref.current) {\n ref.current = initializer();\n }\n\n return ref.current;\n}\n","import {useEffect, useLayoutEffect} from 'react';\n\n// https://github.com/facebook/react/blob/master/packages/shared/ExecutionEnvironment.js\nexport const canUseDOM =\n typeof window !== 'undefined' &&\n typeof window.document !== 'undefined' &&\n typeof window.document.createElement !== 'undefined';\n\n/**\n * A hook that resolves to useEffect on the server and useLayoutEffect on the client\n * @param callback {function} Callback function that is invoked when the dependencies of the hook change\n */\nexport const useIsomorphicLayoutEffect = canUseDOM\n ? useLayoutEffect\n : useEffect;\n","import {useCallback, useState} from 'react';\n\nexport function useForceUpdate() {\n const setState = useState(0)[1];\n\n return useCallback(() => {\n setState((value) => value + 1);\n }, [setState]);\n}\n","import {useRef, useState} from 'react';\nimport {flushSync} from 'react-dom';\nimport {effect, Signal} from '@dnd-kit/state';\n\nimport {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect.ts';\nimport {useForceUpdate} from './useForceUpdate.ts';\n\n/** Trigger a re-render when reading a signal. */\nexport function useSignal<T = any>(signal: Signal<T>, sync = false) {\n const previous = useRef(signal.peek());\n const read = useRef(false);\n const forceUpdate = useForceUpdate();\n\n useIsomorphicLayoutEffect(\n () =>\n effect(() => {\n const previousValue = previous.current;\n const currentValue = signal.value;\n\n if (previousValue !== currentValue) {\n previous.current = currentValue;\n\n if (!read.current) return;\n\n if (sync) {\n flushSync(forceUpdate);\n } else {\n forceUpdate();\n }\n }\n }),\n [signal, sync, forceUpdate]\n );\n\n return {\n get value() {\n read.current = true;\n\n return signal.peek();\n },\n };\n}\n","import {useMemo, useRef} from 'react';\nimport {computed} from '@dnd-kit/state';\n\nimport {useSignal} from './useSignal.ts';\n\nexport function useComputed<T = any>(\n compute: () => T,\n dependencies: any[] = [],\n sync = false\n) {\n const $compute = useRef(compute);\n $compute.current = compute;\n\n return useSignal(\n useMemo(() => computed(() => $compute.current()), dependencies),\n sync\n );\n}\n","import {useRef} from 'react';\n\nimport {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect.ts';\n\nexport function useLatest<T>(value: T) {\n const valueRef = useRef<T | undefined>(value);\n\n useIsomorphicLayoutEffect(() => {\n valueRef.current = value;\n }, [value]);\n\n return valueRef;\n}\n","import {useMemo} from 'react';\nimport {flushSync} from 'react-dom';\nimport {effect, signal, untracked} from '@dnd-kit/state';\n\nimport {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect.ts';\nimport {useForceUpdate} from './useForceUpdate.ts';\nimport {useLatest} from './useLatest.ts';\n\n/** Trigger a re-render when reading signal properties of an object. */\nexport function useDeepSignal<T extends object | null | undefined>(\n target: T,\n synchronous?: (property: keyof T, oldValue: any, newValue: any) => boolean\n): T {\n const forceUpdate = useForceUpdate();\n const synchronousRef = useLatest(synchronous);\n const tracker = useMemo(() => {\n const tracked = new Map<string | symbol, any>();\n\n return {\n tracked,\n propertyCount: signal(0),\n active: false,\n proxy: target\n ? new Proxy(target, {\n get(target, key) {\n const value = (target as any)[key];\n\n // Reads must not overwrite the observer's comparison baseline.\n if (!tracked.has(key)) tracked.set(key, value);\n\n return value;\n },\n })\n : target,\n };\n }, [target]);\n\n // Publish newly read properties after commit, without notifying from render.\n // The map only grows for a given target, so its size versions the key set.\n useIsomorphicLayoutEffect(() => {\n tracker.propertyCount.value = tracker.tracked.size;\n });\n\n useIsomorphicLayoutEffect(() => {\n if (!target) return;\n\n const {tracked, propertyCount} = tracker;\n tracker.active = true;\n const dispose = effect(() => {\n // Keep the effect alive, but refresh its dependencies for late reads.\n propertyCount.value;\n\n let stale = false;\n let sync = false;\n\n for (const [key, value] of tracked) {\n const latestValue = (target as any)[key];\n\n if (!Object.is(value, latestValue)) {\n stale = true;\n tracked.set(key, latestValue);\n sync =\n untracked(() =>\n synchronousRef.current?.(key as keyof T, value, latestValue)\n ) === true || sync;\n }\n }\n\n if (stale) {\n if (sync) {\n // Signal updates can originate in a React lifecycle method.\n queueMicrotask(() => {\n if (tracker.active) flushSync(forceUpdate);\n });\n } else {\n forceUpdate();\n }\n }\n });\n\n return () => {\n tracker.active = false;\n dispose();\n };\n }, [target, tracker, forceUpdate, synchronousRef]);\n\n return tracker.proxy;\n}\n","import type {DependencyList, EffectCallback} from 'react';\n\nexport function useImmediateEffect(\n callback: EffectCallback,\n _?: DependencyList\n) {\n callback();\n}\n","import {useRef, useEffect} from 'react';\n\nexport function useOnValueChange<T>(\n value: T,\n onChange: (value: T, oldValue: T) => void,\n effect = useEffect,\n compare = Object.is\n) {\n const tracked = useRef<T>(value);\n\n effect(() => {\n const oldValue = tracked.current;\n\n if (!compare(value, oldValue)) {\n tracked.current = value;\n onChange(value, oldValue);\n }\n }, [onChange, value]);\n}\n","import {useRef} from 'react';\nimport {currentValue, type RefOrValue} from '@dnd-kit/react/utilities';\n\nimport {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect.ts';\n\nexport function useOnElementChange(\n value: RefOrValue<Element>,\n onChange: (value: Element | undefined) => void\n) {\n const previous = useRef(currentValue(value));\n\n useIsomorphicLayoutEffect(() => {\n const current = currentValue(value);\n\n if (current !== previous.current) {\n previous.current = current;\n onChange(current);\n }\n });\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dnd-kit/react",
3
- "version": "0.5.1-beta-20260905201412",
3
+ "version": "0.5.1-beta-20260912195958",
4
4
  "main": "./index.cjs",
5
5
  "module": "./index.js",
6
6
  "type": "module",
@@ -64,9 +64,9 @@
64
64
  "clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist"
65
65
  },
66
66
  "dependencies": {
67
- "@dnd-kit/abstract": "0.5.1-beta-20260905201412",
68
- "@dnd-kit/dom": "0.5.1-beta-20260905201412",
69
- "@dnd-kit/state": "0.5.1-beta-20260905201412",
67
+ "@dnd-kit/abstract": "0.5.1-beta-20260912195958",
68
+ "@dnd-kit/dom": "0.5.1-beta-20260912195958",
69
+ "@dnd-kit/state": "0.5.1-beta-20260912195958",
70
70
  "tslib": "^2.6.2"
71
71
  },
72
72
  "peerDependencies": {