@sanity/ui 2.8.0 → 2.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +25 -53
- package/dist/index.d.ts +25 -53
- package/dist/index.esm.js +46 -6
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +45 -5
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +46 -6
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/core/hooks/index.ts +1 -0
- package/src/core/hooks/useClickOutside.test.tsx +0 -109
- package/src/core/hooks/useClickOutside.ts +70 -103
- package/src/core/hooks/useClickOutsideEvent.test.tsx +116 -0
- package/src/core/hooks/useClickOutsideEvent.ts +72 -0
- package/src/core/primitives/popover/__workshop__/AlignedStory.tsx +2 -2
package/dist/index.js
CHANGED
|
@@ -126,8 +126,48 @@ function useArrayProp(val, defaultVal) {
|
|
|
126
126
|
[__perf_hash__]
|
|
127
127
|
);
|
|
128
128
|
}
|
|
129
|
+
function _getElements(element, elementsArg) {
|
|
130
|
+
const ret = [element];
|
|
131
|
+
for (const el of elementsArg)
|
|
132
|
+
Array.isArray(el) ? ret.push(...el) : ret.push(el);
|
|
133
|
+
return ret.filter(Boolean);
|
|
134
|
+
}
|
|
129
135
|
function useClickOutside(listener, elementsArg = EMPTY_ARRAY, boundaryElement) {
|
|
130
|
-
const [
|
|
136
|
+
const [element, setElement] = react.useState(null), [elements, setElements] = react.useState(() => _getElements(element, elementsArg)), elementsRef = react.useRef(elements);
|
|
137
|
+
return react.useEffect(() => {
|
|
138
|
+
const prevElements = elementsRef.current, nextElements = _getElements(element, elementsArg);
|
|
139
|
+
if (prevElements.length !== nextElements.length) {
|
|
140
|
+
setElements(nextElements), elementsRef.current = nextElements;
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
for (const el of prevElements)
|
|
144
|
+
if (!nextElements.includes(el)) {
|
|
145
|
+
setElements(nextElements), elementsRef.current = nextElements;
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
for (const el of nextElements)
|
|
149
|
+
if (!prevElements.includes(el)) {
|
|
150
|
+
setElements(nextElements), elementsRef.current = nextElements;
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
}, [element, elementsArg]), react.useEffect(() => {
|
|
154
|
+
if (!listener) return;
|
|
155
|
+
const handleWindowMouseDown = (evt) => {
|
|
156
|
+
const target = evt.target;
|
|
157
|
+
if (target instanceof Node && !(boundaryElement && !boundaryElement.contains(target))) {
|
|
158
|
+
for (const el of elements)
|
|
159
|
+
if (target === el || el.contains(target))
|
|
160
|
+
return;
|
|
161
|
+
listener(evt);
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
return window.addEventListener("mousedown", handleWindowMouseDown), () => {
|
|
165
|
+
window.removeEventListener("mousedown", handleWindowMouseDown);
|
|
166
|
+
};
|
|
167
|
+
}, [boundaryElement, listener, elements]), setElement;
|
|
168
|
+
}
|
|
169
|
+
function useClickOutsideEvent(listener, elementsArg = () => EMPTY_ARRAY, boundaryElement) {
|
|
170
|
+
const onEvent = useEffectEvent.useEffectEvent((evt) => {
|
|
131
171
|
if (!listener)
|
|
132
172
|
return;
|
|
133
173
|
const target = evt.target;
|
|
@@ -136,20 +176,19 @@ function useClickOutside(listener, elementsArg = EMPTY_ARRAY, boundaryElement) {
|
|
|
136
176
|
const resolvedBoundaryElement = typeof boundaryElement == "function" ? boundaryElement() : boundaryElement;
|
|
137
177
|
if (resolvedBoundaryElement && !resolvedBoundaryElement.contains(target))
|
|
138
178
|
return;
|
|
139
|
-
const elements = (Array.isArray(elementsArg) ?
|
|
179
|
+
const elements = (Array.isArray(elementsArg) ? elementsArg : elementsArg()).flat();
|
|
140
180
|
for (const el of elements)
|
|
141
181
|
if (el && (target === el || el.contains(target)))
|
|
142
182
|
return;
|
|
143
183
|
listener(evt);
|
|
144
184
|
}), hasListener = !!listener;
|
|
145
|
-
|
|
185
|
+
react.useEffect(() => {
|
|
146
186
|
if (!hasListener) return;
|
|
147
187
|
const handleEvent = (evt) => onEvent(evt);
|
|
148
188
|
return document.addEventListener("mousedown", handleEvent), () => {
|
|
149
189
|
document.removeEventListener("mousedown", handleEvent);
|
|
150
190
|
};
|
|
151
|
-
}, [hasListener, onEvent])
|
|
152
|
-
return setLegacyElement;
|
|
191
|
+
}, [hasListener, onEvent]);
|
|
153
192
|
}
|
|
154
193
|
function useCustomValidity(ref, customValidity) {
|
|
155
194
|
react.useEffect(() => {
|
|
@@ -6835,6 +6874,7 @@ exports.studioTheme = studioTheme;
|
|
|
6835
6874
|
exports.useArrayProp = useArrayProp;
|
|
6836
6875
|
exports.useBoundaryElement = useBoundaryElement;
|
|
6837
6876
|
exports.useClickOutside = useClickOutside;
|
|
6877
|
+
exports.useClickOutsideEvent = useClickOutsideEvent;
|
|
6838
6878
|
exports.useCustomValidity = useCustomValidity;
|
|
6839
6879
|
exports.useDialog = useDialog;
|
|
6840
6880
|
exports.useElementRect = useElementRect;
|