@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 CHANGED
@@ -628,7 +628,12 @@ export declare interface CheckboxProps {
628
628
  /**
629
629
  * @public
630
630
  */
631
- export declare type ClickOutsideListener = (event: MouseEvent | TouchEvent) => void
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 | TouchEvent) => void
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: () => (HTMLElement | HTMLElement[] | null)[],
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: (HTMLElement | HTMLElement[] | null)[],
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 -- do not use
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 ClickOutsideListener = (event: MouseEvent | TouchEvent) => void
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 | TouchEvent) => void
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: () => (HTMLElement | HTMLElement[] | null)[],
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: (HTMLElement | HTMLElement[] | null)[],
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 -- do not use
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) || boundaryElement && !boundaryElement.contains(target))
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), document.addEventListener("touchstart", handleEvent), () => {
149
- document.removeEventListener("mousedown", handleEvent), document.removeEventListener("touchstart", 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
- useCallback(
5108
- (event) => {
5109
- if (!isTopLayer || !onClickOutside) return;
5110
- const target = event.target;
5111
- target && !isTargetWithinScope(boundaryElement, portalElement, target) || onClickOutside();
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());