@sanity/ui 2.7.1-canary.1 → 2.8.0
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 +33 -8
- package/dist/index.d.ts +33 -8
- package/dist/index.esm.js +14 -18
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +14 -18
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +14 -18
- package/dist/index.mjs.map +1 -1
- package/package.json +36 -27
- package/src/core/components/dialog/dialog.tsx +9 -12
- package/src/core/components/menu/menu.tsx +2 -8
- package/src/core/components/menu/menuButton.tsx +1 -1
- package/src/core/components/menu/menuContext.ts +1 -1
- package/src/core/hooks/useClickOutside.test.tsx +568 -46
- package/src/core/hooks/useClickOutside.ts +43 -18
- package/src/core/primitives/popover/__workshop__/AlignedStory.tsx +9 -7
package/dist/index.d.mts
CHANGED
|
@@ -628,7 +628,12 @@ export declare interface CheckboxProps {
|
|
|
628
628
|
/**
|
|
629
629
|
* @public
|
|
630
630
|
*/
|
|
631
|
-
export declare type
|
|
631
|
+
export declare type ClickOutsideElements = (HTMLElement | null | (HTMLElement | null)[])[]
|
|
632
|
+
|
|
633
|
+
/**
|
|
634
|
+
* @public
|
|
635
|
+
*/
|
|
636
|
+
export declare type ClickOutsideListener = (event: MouseEvent) => void
|
|
632
637
|
|
|
633
638
|
/**
|
|
634
639
|
* @public
|
|
@@ -1432,7 +1437,7 @@ export declare interface MenuProps extends ResponsivePaddingProps {
|
|
|
1432
1437
|
* @deprecated Use `shouldFocus="last"` instead.
|
|
1433
1438
|
*/
|
|
1434
1439
|
focusLast?: boolean
|
|
1435
|
-
onClickOutside?: (event: MouseEvent
|
|
1440
|
+
onClickOutside?: (event: MouseEvent) => void
|
|
1436
1441
|
onEscape?: () => void
|
|
1437
1442
|
onItemClick?: () => void
|
|
1438
1443
|
onItemSelect?: (index: number) => void
|
|
@@ -2652,11 +2657,31 @@ export declare function useBoundaryElement(): BoundaryElementContextValue
|
|
|
2652
2657
|
* @public
|
|
2653
2658
|
*/
|
|
2654
2659
|
export declare function useClickOutside(
|
|
2655
|
-
listener: ClickOutsideListener,
|
|
2656
|
-
elementsArg: () =>
|
|
2657
|
-
boundaryElement?: HTMLElement | null,
|
|
2660
|
+
listener: ClickOutsideListener | false | undefined,
|
|
2661
|
+
elementsArg: () => ClickOutsideElements,
|
|
2662
|
+
boundaryElement?: () => HTMLElement | null,
|
|
2658
2663
|
): void
|
|
2659
2664
|
|
|
2665
|
+
/**
|
|
2666
|
+
* @public
|
|
2667
|
+
* @deprecated - change `useClickOutside(handler, () => [...], boundary)` to `useClickOutside(handler, () => [...], () => boundary)`
|
|
2668
|
+
*/
|
|
2669
|
+
export declare function useClickOutside(
|
|
2670
|
+
listener: ClickOutsideListener | false | undefined,
|
|
2671
|
+
elementsArg: () => ClickOutsideElements,
|
|
2672
|
+
boundaryElement: HTMLElement | null,
|
|
2673
|
+
): void
|
|
2674
|
+
|
|
2675
|
+
/**
|
|
2676
|
+
* @public
|
|
2677
|
+
* @deprecated - change `useClickOutside(handler, [...], () => boundary)` to `useClickOutside(handler, () => [...], () => boundary)`
|
|
2678
|
+
*/
|
|
2679
|
+
export declare function useClickOutside(
|
|
2680
|
+
listener: ClickOutsideListener | false | undefined,
|
|
2681
|
+
elementsArg: ClickOutsideElements,
|
|
2682
|
+
boundaryElement: () => HTMLElement | null,
|
|
2683
|
+
): UseClickOutsideSetElement
|
|
2684
|
+
|
|
2660
2685
|
/**
|
|
2661
2686
|
* @public
|
|
2662
2687
|
* @deprecated
|
|
@@ -2685,14 +2710,14 @@ export declare function useClickOutside(
|
|
|
2685
2710
|
* ```
|
|
2686
2711
|
*/
|
|
2687
2712
|
export declare function useClickOutside(
|
|
2688
|
-
listener: ClickOutsideListener,
|
|
2689
|
-
elementsArg:
|
|
2713
|
+
listener: ClickOutsideListener | false | undefined,
|
|
2714
|
+
elementsArg: ClickOutsideElements,
|
|
2690
2715
|
boundaryElement?: HTMLElement | null,
|
|
2691
2716
|
): UseClickOutsideSetElement
|
|
2692
2717
|
|
|
2693
2718
|
/**
|
|
2694
2719
|
* @public
|
|
2695
|
-
* @deprecated
|
|
2720
|
+
* @deprecated - use your own `const [element, setElement] = useState(null)` logic instead
|
|
2696
2721
|
*/
|
|
2697
2722
|
export declare type UseClickOutsideSetElement = (el: HTMLElement | null) => void
|
|
2698
2723
|
|
package/dist/index.d.ts
CHANGED
|
@@ -628,7 +628,12 @@ export declare interface CheckboxProps {
|
|
|
628
628
|
/**
|
|
629
629
|
* @public
|
|
630
630
|
*/
|
|
631
|
-
export declare type
|
|
631
|
+
export declare type ClickOutsideElements = (HTMLElement | null | (HTMLElement | null)[])[]
|
|
632
|
+
|
|
633
|
+
/**
|
|
634
|
+
* @public
|
|
635
|
+
*/
|
|
636
|
+
export declare type ClickOutsideListener = (event: MouseEvent) => void
|
|
632
637
|
|
|
633
638
|
/**
|
|
634
639
|
* @public
|
|
@@ -1432,7 +1437,7 @@ export declare interface MenuProps extends ResponsivePaddingProps {
|
|
|
1432
1437
|
* @deprecated Use `shouldFocus="last"` instead.
|
|
1433
1438
|
*/
|
|
1434
1439
|
focusLast?: boolean
|
|
1435
|
-
onClickOutside?: (event: MouseEvent
|
|
1440
|
+
onClickOutside?: (event: MouseEvent) => void
|
|
1436
1441
|
onEscape?: () => void
|
|
1437
1442
|
onItemClick?: () => void
|
|
1438
1443
|
onItemSelect?: (index: number) => void
|
|
@@ -2652,11 +2657,31 @@ export declare function useBoundaryElement(): BoundaryElementContextValue
|
|
|
2652
2657
|
* @public
|
|
2653
2658
|
*/
|
|
2654
2659
|
export declare function useClickOutside(
|
|
2655
|
-
listener: ClickOutsideListener,
|
|
2656
|
-
elementsArg: () =>
|
|
2657
|
-
boundaryElement?: HTMLElement | null,
|
|
2660
|
+
listener: ClickOutsideListener | false | undefined,
|
|
2661
|
+
elementsArg: () => ClickOutsideElements,
|
|
2662
|
+
boundaryElement?: () => HTMLElement | null,
|
|
2658
2663
|
): void
|
|
2659
2664
|
|
|
2665
|
+
/**
|
|
2666
|
+
* @public
|
|
2667
|
+
* @deprecated - change `useClickOutside(handler, () => [...], boundary)` to `useClickOutside(handler, () => [...], () => boundary)`
|
|
2668
|
+
*/
|
|
2669
|
+
export declare function useClickOutside(
|
|
2670
|
+
listener: ClickOutsideListener | false | undefined,
|
|
2671
|
+
elementsArg: () => ClickOutsideElements,
|
|
2672
|
+
boundaryElement: HTMLElement | null,
|
|
2673
|
+
): void
|
|
2674
|
+
|
|
2675
|
+
/**
|
|
2676
|
+
* @public
|
|
2677
|
+
* @deprecated - change `useClickOutside(handler, [...], () => boundary)` to `useClickOutside(handler, () => [...], () => boundary)`
|
|
2678
|
+
*/
|
|
2679
|
+
export declare function useClickOutside(
|
|
2680
|
+
listener: ClickOutsideListener | false | undefined,
|
|
2681
|
+
elementsArg: ClickOutsideElements,
|
|
2682
|
+
boundaryElement: () => HTMLElement | null,
|
|
2683
|
+
): UseClickOutsideSetElement
|
|
2684
|
+
|
|
2660
2685
|
/**
|
|
2661
2686
|
* @public
|
|
2662
2687
|
* @deprecated
|
|
@@ -2685,14 +2710,14 @@ export declare function useClickOutside(
|
|
|
2685
2710
|
* ```
|
|
2686
2711
|
*/
|
|
2687
2712
|
export declare function useClickOutside(
|
|
2688
|
-
listener: ClickOutsideListener,
|
|
2689
|
-
elementsArg:
|
|
2713
|
+
listener: ClickOutsideListener | false | undefined,
|
|
2714
|
+
elementsArg: ClickOutsideElements,
|
|
2690
2715
|
boundaryElement?: HTMLElement | null,
|
|
2691
2716
|
): UseClickOutsideSetElement
|
|
2692
2717
|
|
|
2693
2718
|
/**
|
|
2694
2719
|
* @public
|
|
2695
|
-
* @deprecated
|
|
2720
|
+
* @deprecated - use your own `const [element, setElement] = useState(null)` logic instead
|
|
2696
2721
|
*/
|
|
2697
2722
|
export declare type UseClickOutsideSetElement = (el: HTMLElement | null) => void
|
|
2698
2723
|
|
package/dist/index.esm.js
CHANGED
|
@@ -133,8 +133,13 @@ function useArrayProp(val, defaultVal) {
|
|
|
133
133
|
}
|
|
134
134
|
function useClickOutside(listener, elementsArg = EMPTY_ARRAY, boundaryElement) {
|
|
135
135
|
const [legacyElement, setLegacyElement] = useState(null), onEvent = useEffectEvent((evt) => {
|
|
136
|
+
if (!listener)
|
|
137
|
+
return;
|
|
136
138
|
const target = evt.target;
|
|
137
|
-
if (!(target instanceof Node)
|
|
139
|
+
if (!(target instanceof Node))
|
|
140
|
+
return;
|
|
141
|
+
const resolvedBoundaryElement = typeof boundaryElement == "function" ? boundaryElement() : boundaryElement;
|
|
142
|
+
if (resolvedBoundaryElement && !resolvedBoundaryElement.contains(target))
|
|
138
143
|
return;
|
|
139
144
|
const elements = (Array.isArray(elementsArg) ? [legacyElement, ...elementsArg] : elementsArg()).flat();
|
|
140
145
|
for (const el of elements)
|
|
@@ -145,8 +150,8 @@ function useClickOutside(listener, elementsArg = EMPTY_ARRAY, boundaryElement) {
|
|
|
145
150
|
if (useEffect(() => {
|
|
146
151
|
if (!hasListener) return;
|
|
147
152
|
const handleEvent = (evt) => onEvent(evt);
|
|
148
|
-
return document.addEventListener("mousedown", handleEvent),
|
|
149
|
-
document.removeEventListener("mousedown", handleEvent)
|
|
153
|
+
return document.addEventListener("mousedown", handleEvent), () => {
|
|
154
|
+
document.removeEventListener("mousedown", handleEvent);
|
|
150
155
|
};
|
|
151
156
|
}, [hasListener, onEvent]), Array.isArray(elementsArg))
|
|
152
157
|
return setLegacyElement;
|
|
@@ -5104,14 +5109,11 @@ const Root$7 = styled(Layer)(responsivePaddingStyle, dialogStyle, responsiveDial
|
|
|
5104
5109
|
[boundaryElement, isTopLayer, onClose, portalElement]
|
|
5105
5110
|
)
|
|
5106
5111
|
), useClickOutside(
|
|
5107
|
-
|
|
5108
|
-
(
|
|
5109
|
-
|
|
5110
|
-
|
|
5111
|
-
|
|
5112
|
-
},
|
|
5113
|
-
[boundaryElement, isTopLayer, onClickOutside, portalElement]
|
|
5114
|
-
),
|
|
5112
|
+
(event) => {
|
|
5113
|
+
if (!isTopLayer || !onClickOutside) return;
|
|
5114
|
+
const target = event.target;
|
|
5115
|
+
target && !isTargetWithinScope(boundaryElement, portalElement, target) || onClickOutside();
|
|
5116
|
+
},
|
|
5115
5117
|
[rootElement]
|
|
5116
5118
|
);
|
|
5117
5119
|
const setRef = useCallback((el) => {
|
|
@@ -5448,13 +5450,7 @@ const Root$5 = styled(Box)`
|
|
|
5448
5450
|
);
|
|
5449
5451
|
useEffect(() => {
|
|
5450
5452
|
onItemSelect && onItemSelect(activeIndex);
|
|
5451
|
-
}, [activeIndex, onItemSelect]), useClickOutside(
|
|
5452
|
-
useCallback(
|
|
5453
|
-
(event) => isTopLayer && onClickOutside && onClickOutside(event),
|
|
5454
|
-
[isTopLayer, onClickOutside]
|
|
5455
|
-
),
|
|
5456
|
-
[rootElement]
|
|
5457
|
-
), useGlobalKeyDown(
|
|
5453
|
+
}, [activeIndex, onItemSelect]), useClickOutside((event) => isTopLayer && onClickOutside && onClickOutside(event), [rootElement]), useGlobalKeyDown(
|
|
5458
5454
|
useCallback(
|
|
5459
5455
|
(event) => {
|
|
5460
5456
|
isTopLayer && event.key === "Escape" && (event.stopPropagation(), onEscape && onEscape());
|