@yahoo/uds-mobile 2.17.0 → 2.18.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/bin/generateTheme.mjs +7 -2
- package/dist/bin/mobile/scripts/utils/configToRNMappings.mjs +4 -0
- package/dist/components/Popover/Popover.cjs +92 -0
- package/dist/components/Popover/Popover.d.cts +26 -0
- package/dist/components/Popover/Popover.d.cts.map +1 -0
- package/dist/components/Popover/Popover.d.ts +26 -0
- package/dist/components/Popover/Popover.d.ts.map +1 -0
- package/dist/components/Popover/Popover.js +92 -0
- package/dist/components/Popover/Popover.js.map +1 -0
- package/dist/components/Popover/PopoverContent.cjs +124 -0
- package/dist/components/Popover/PopoverContent.d.cts +15 -0
- package/dist/components/Popover/PopoverContent.d.cts.map +1 -0
- package/dist/components/Popover/PopoverContent.d.ts +15 -0
- package/dist/components/Popover/PopoverContent.d.ts.map +1 -0
- package/dist/components/Popover/PopoverContent.js +124 -0
- package/dist/components/Popover/PopoverContent.js.map +1 -0
- package/dist/components/Popover/PopoverContext.cjs +14 -0
- package/dist/components/Popover/PopoverContext.d.cts +10 -0
- package/dist/components/Popover/PopoverContext.d.cts.map +1 -0
- package/dist/components/Popover/PopoverContext.d.ts +10 -0
- package/dist/components/Popover/PopoverContext.d.ts.map +1 -0
- package/dist/components/Popover/PopoverContext.js +13 -0
- package/dist/components/Popover/PopoverContext.js.map +1 -0
- package/dist/components/Popover/PopoverDescription.cjs +23 -0
- package/dist/components/Popover/PopoverDescription.d.cts +15 -0
- package/dist/components/Popover/PopoverDescription.d.cts.map +1 -0
- package/dist/components/Popover/PopoverDescription.d.ts +15 -0
- package/dist/components/Popover/PopoverDescription.d.ts.map +1 -0
- package/dist/components/Popover/PopoverDescription.js +23 -0
- package/dist/components/Popover/PopoverDescription.js.map +1 -0
- package/dist/components/Popover/PopoverDismiss.cjs +22 -0
- package/dist/components/Popover/PopoverDismiss.d.cts +15 -0
- package/dist/components/Popover/PopoverDismiss.d.cts.map +1 -0
- package/dist/components/Popover/PopoverDismiss.d.ts +15 -0
- package/dist/components/Popover/PopoverDismiss.d.ts.map +1 -0
- package/dist/components/Popover/PopoverDismiss.js +22 -0
- package/dist/components/Popover/PopoverDismiss.js.map +1 -0
- package/dist/components/Popover/PopoverFrame.cjs +56 -0
- package/dist/components/Popover/PopoverFrame.d.cts +23 -0
- package/dist/components/Popover/PopoverFrame.d.cts.map +1 -0
- package/dist/components/Popover/PopoverFrame.d.ts +23 -0
- package/dist/components/Popover/PopoverFrame.d.ts.map +1 -0
- package/dist/components/Popover/PopoverFrame.js +55 -0
- package/dist/components/Popover/PopoverFrame.js.map +1 -0
- package/dist/components/Popover/PopoverPortalLayer.cjs +45 -0
- package/dist/components/Popover/PopoverPortalLayer.d.cts +15 -0
- package/dist/components/Popover/PopoverPortalLayer.d.cts.map +1 -0
- package/dist/components/Popover/PopoverPortalLayer.d.ts +15 -0
- package/dist/components/Popover/PopoverPortalLayer.d.ts.map +1 -0
- package/dist/components/Popover/PopoverPortalLayer.js +45 -0
- package/dist/components/Popover/PopoverPortalLayer.js.map +1 -0
- package/dist/components/Popover/PopoverSurface.cjs +228 -0
- package/dist/components/Popover/PopoverSurface.d.cts +26 -0
- package/dist/components/Popover/PopoverSurface.d.cts.map +1 -0
- package/dist/components/Popover/PopoverSurface.d.ts +26 -0
- package/dist/components/Popover/PopoverSurface.d.ts.map +1 -0
- package/dist/components/Popover/PopoverSurface.js +227 -0
- package/dist/components/Popover/PopoverSurface.js.map +1 -0
- package/dist/components/Popover/PopoverTitle.cjs +23 -0
- package/dist/components/Popover/PopoverTitle.d.cts +15 -0
- package/dist/components/Popover/PopoverTitle.d.cts.map +1 -0
- package/dist/components/Popover/PopoverTitle.d.ts +15 -0
- package/dist/components/Popover/PopoverTitle.d.ts.map +1 -0
- package/dist/components/Popover/PopoverTitle.js +23 -0
- package/dist/components/Popover/PopoverTitle.js.map +1 -0
- package/dist/components/Popover/PopoverTrigger.cjs +88 -0
- package/dist/components/Popover/PopoverTrigger.d.cts +15 -0
- package/dist/components/Popover/PopoverTrigger.d.cts.map +1 -0
- package/dist/components/Popover/PopoverTrigger.d.ts +15 -0
- package/dist/components/Popover/PopoverTrigger.d.ts.map +1 -0
- package/dist/components/Popover/PopoverTrigger.js +88 -0
- package/dist/components/Popover/PopoverTrigger.js.map +1 -0
- package/dist/components/Popover/index.cjs +14 -0
- package/dist/components/Popover/index.d.cts +9 -0
- package/dist/components/Popover/index.d.ts +9 -0
- package/dist/components/Popover/index.js +8 -0
- package/dist/components/Popover/popoverFrameGeometry.cjs +177 -0
- package/dist/components/Popover/popoverFrameGeometry.d.cts +48 -0
- package/dist/components/Popover/popoverFrameGeometry.d.cts.map +1 -0
- package/dist/components/Popover/popoverFrameGeometry.d.ts +48 -0
- package/dist/components/Popover/popoverFrameGeometry.d.ts.map +1 -0
- package/dist/components/Popover/popoverFrameGeometry.js +177 -0
- package/dist/components/Popover/popoverFrameGeometry.js.map +1 -0
- package/dist/components/Popover/popoverLayer.cjs +16 -0
- package/dist/components/Popover/popoverLayer.d.cts +8 -0
- package/dist/components/Popover/popoverLayer.d.cts.map +1 -0
- package/dist/components/Popover/popoverLayer.d.ts +8 -0
- package/dist/components/Popover/popoverLayer.d.ts.map +1 -0
- package/dist/components/Popover/popoverLayer.js +16 -0
- package/dist/components/Popover/popoverLayer.js.map +1 -0
- package/dist/components/Popover/types.cjs +1 -0
- package/dist/components/Popover/types.d.cts +170 -0
- package/dist/components/Popover/types.d.cts.map +1 -0
- package/dist/components/Popover/types.d.ts +170 -0
- package/dist/components/Popover/types.d.ts.map +1 -0
- package/dist/components/Popover/types.js +1 -0
- package/dist/components/Toast/ToastProvider.cjs +1 -1
- package/dist/components/Toast/ToastProvider.js +1 -1
- package/dist/components/internal/Overlay/index.cjs +4 -0
- package/dist/components/internal/Overlay/index.d.cts +4 -2
- package/dist/components/internal/Overlay/index.d.ts +4 -2
- package/dist/components/internal/Overlay/index.js +3 -1
- package/dist/components/internal/Overlay/types.d.cts +47 -1
- package/dist/components/internal/Overlay/types.d.cts.map +1 -1
- package/dist/components/internal/Overlay/types.d.ts +47 -1
- package/dist/components/internal/Overlay/types.d.ts.map +1 -1
- package/dist/components/internal/Overlay/useAnchoredPosition.cjs +225 -0
- package/dist/components/internal/Overlay/useAnchoredPosition.d.cts +22 -0
- package/dist/components/internal/Overlay/useAnchoredPosition.d.cts.map +1 -0
- package/dist/components/internal/Overlay/useAnchoredPosition.d.ts +22 -0
- package/dist/components/internal/Overlay/useAnchoredPosition.d.ts.map +1 -0
- package/dist/components/internal/Overlay/useAnchoredPosition.js +225 -0
- package/dist/components/internal/Overlay/useAnchoredPosition.js.map +1 -0
- package/dist/components/internal/Overlay/useOverlayDismiss.cjs +22 -0
- package/dist/components/internal/Overlay/useOverlayDismiss.d.cts +12 -0
- package/dist/components/internal/Overlay/useOverlayDismiss.d.cts.map +1 -0
- package/dist/components/internal/Overlay/useOverlayDismiss.d.ts +12 -0
- package/dist/components/internal/Overlay/useOverlayDismiss.d.ts.map +1 -0
- package/dist/components/internal/Overlay/useOverlayDismiss.js +22 -0
- package/dist/components/internal/Overlay/useOverlayDismiss.js.map +1 -0
- package/dist/jest/mocks/react-native.cjs +14 -0
- package/dist/jest/mocks/react-native.d.cts +29 -1
- package/dist/jest/mocks/react-native.d.cts.map +1 -1
- package/dist/jest/mocks/react-native.d.ts +29 -1
- package/dist/jest/mocks/react-native.d.ts.map +1 -1
- package/dist/jest/mocks/react-native.js +13 -1
- package/dist/jest/mocks/react-native.js.map +1 -1
- package/dist/jest/mocks/styles.cjs +60 -0
- package/dist/jest/mocks/styles.d.cts +5 -2
- package/dist/jest/mocks/styles.d.cts.map +1 -1
- package/dist/jest/mocks/styles.d.ts +5 -2
- package/dist/jest/mocks/styles.d.ts.map +1 -1
- package/dist/jest/mocks/styles.js +58 -1
- package/dist/jest/mocks/styles.js.map +1 -1
- package/dist/jest/setup.cjs +46 -3
- package/dist/jest/setup.d.cts.map +1 -1
- package/dist/jest/setup.d.ts.map +1 -1
- package/dist/jest/setup.js +46 -3
- package/dist/jest/setup.js.map +1 -1
- package/dist/types/dist/index.d.cts.map +1 -1
- package/dist/types/dist/index.d.ts.map +1 -1
- package/generated/styles.cjs +6 -0
- package/generated/styles.d.ts +13 -1
- package/generated/styles.mjs +6 -0
- package/generated/unistyles.d.ts +13 -0
- package/package.json +11 -1
|
@@ -414,7 +414,12 @@ function resolveValue(variable, config, colorMode, propName) {
|
|
|
414
414
|
}
|
|
415
415
|
return "transparent";
|
|
416
416
|
}
|
|
417
|
-
if (propName === "
|
|
417
|
+
if (propName === "blurBackgroundColorFallback") {
|
|
418
|
+
const fbv = preset.fallbackBlurredBackgroundValue ?? preset.finalBackgroundValue;
|
|
419
|
+
if (fbv) return `rgb(${fbv.r}, ${fbv.g}, ${fbv.b})`;
|
|
420
|
+
return "transparent";
|
|
421
|
+
}
|
|
422
|
+
if (propName === "borderColor" || propName === "stroke") {
|
|
418
423
|
const borderColorDef = preset.borderColor;
|
|
419
424
|
if (borderColorDef.type === "line") {
|
|
420
425
|
const colorDef = palette.line?.[borderColorDef.value];
|
|
@@ -434,7 +439,7 @@ function resolveValue(variable, config, colorMode, propName) {
|
|
|
434
439
|
}
|
|
435
440
|
return "transparent";
|
|
436
441
|
}
|
|
437
|
-
if (propName === "borderWidth") {
|
|
442
|
+
if (propName === "borderWidth" || propName === "strokeWidth") {
|
|
438
443
|
const borderWidthKey = preset.borderWidth;
|
|
439
444
|
return scaleConfig.borderWidth[borderWidthKey] ?? 0;
|
|
440
445
|
}
|
|
@@ -12,11 +12,13 @@ const PROPERTY_TO_RN_PROPS = {
|
|
|
12
12
|
height: ["height"],
|
|
13
13
|
width: ["width"],
|
|
14
14
|
backgroundColor: ["backgroundColor"],
|
|
15
|
+
blurBackgroundColorFallback: ["backgroundBlurFallbackColor"],
|
|
15
16
|
color: ["color"],
|
|
16
17
|
labelColor: ["color"],
|
|
17
18
|
borderColor: ["borderColor"],
|
|
18
19
|
borderWidth: ["borderWidth"],
|
|
19
20
|
borderRadius: ["borderRadius"],
|
|
21
|
+
fillOpacity: ["backgroundOpacity"],
|
|
20
22
|
iconSize: ["fontSize", "lineHeight"],
|
|
21
23
|
opacity: ["opacity"],
|
|
22
24
|
horizontalMargin: ["marginHorizontal"],
|
|
@@ -25,6 +27,8 @@ const PROPERTY_TO_RN_PROPS = {
|
|
|
25
27
|
shadow: ["boxShadow"],
|
|
26
28
|
insetShadow: ["boxShadow"],
|
|
27
29
|
bannerInnerShadow: ["boxShadow"],
|
|
30
|
+
stroke: ["borderColor"],
|
|
31
|
+
strokeWidth: ["borderWidth"],
|
|
28
32
|
textDecorationLine: ["textDecorationLine"],
|
|
29
33
|
textVariant: [
|
|
30
34
|
"fontFamily",
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/*! © 2026 Yahoo, Inc. UDS Mobile v0.0.0-development */
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
require("../../_virtual/_rolldown/runtime.cjs");
|
|
4
|
+
const require_components_internal_Overlay_useControllableState = require("../internal/Overlay/useControllableState.cjs");
|
|
5
|
+
const require_components_Popover_PopoverContext = require("./PopoverContext.cjs");
|
|
6
|
+
const require_components_Popover_popoverLayer = require("./popoverLayer.cjs");
|
|
7
|
+
let react = require("react");
|
|
8
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
9
|
+
//#region src/components/Popover/Popover.tsx
|
|
10
|
+
const DEFAULT_PLACEMENT = "bottom";
|
|
11
|
+
const DEFAULT_OFFSET = 9;
|
|
12
|
+
const DEFAULT_COLLISION_PADDING = 12;
|
|
13
|
+
/**
|
|
14
|
+
* The root popover component for React Native.
|
|
15
|
+
*
|
|
16
|
+
* Manages open state, trigger measurement, and anchored positioning for a
|
|
17
|
+
* floating surface. Use with {@link PopoverTrigger} and {@link PopoverContent}.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```tsx
|
|
21
|
+
* <Popover>
|
|
22
|
+
* <PopoverTrigger render={<Button>Open popover</Button>} />
|
|
23
|
+
* <PopoverContent>
|
|
24
|
+
* <PopoverTitle>Storage almost full</PopoverTitle>
|
|
25
|
+
* <PopoverDescription>Review large files or upgrade your plan.</PopoverDescription>
|
|
26
|
+
* </PopoverContent>
|
|
27
|
+
* </Popover>
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
const Popover = (0, react.memo)(function Popover({ children, open: openProp, defaultOpen = false, onOpenChange, onOpen, onClose, placement = DEFAULT_PLACEMENT, align, offset = DEFAULT_OFFSET, alignOffset = 0, avoidCollisions = true, collisionPadding = DEFAULT_COLLISION_PADDING, width = "content", sameWidth = false, hideArrow = false, hideDismissButton = false, dismissible = true, closeAccessibilityLabel = "Close popover", reduceMotion = false, insets, blurTarget }) {
|
|
31
|
+
const id = (0, react.useId)();
|
|
32
|
+
const triggerRef = (0, react.useRef)(null);
|
|
33
|
+
const [triggerRect, setTriggerRect] = (0, react.useState)(null);
|
|
34
|
+
const [open, setOpenState] = require_components_internal_Overlay_useControllableState.useControllableState({
|
|
35
|
+
value: openProp,
|
|
36
|
+
defaultValue: defaultOpen,
|
|
37
|
+
onChange: onOpenChange
|
|
38
|
+
});
|
|
39
|
+
const previousOpenRef = (0, react.useRef)(open);
|
|
40
|
+
const setOpen = setOpenState;
|
|
41
|
+
(0, react.useEffect)(() => {
|
|
42
|
+
if (previousOpenRef.current === open) return;
|
|
43
|
+
previousOpenRef.current = open;
|
|
44
|
+
if (open) onOpen?.();
|
|
45
|
+
else onClose?.();
|
|
46
|
+
}, [
|
|
47
|
+
onClose,
|
|
48
|
+
onOpen,
|
|
49
|
+
open
|
|
50
|
+
]);
|
|
51
|
+
(0, react.useEffect)(() => {
|
|
52
|
+
if (!open) return;
|
|
53
|
+
require_components_Popover_popoverLayer.notifyPopoverOpened(id);
|
|
54
|
+
}, [id, open]);
|
|
55
|
+
(0, react.useEffect)(() => require_components_Popover_popoverLayer.subscribeToPopoverLayer((openedId) => {
|
|
56
|
+
if (openedId !== id && open) setOpen(false);
|
|
57
|
+
}), [
|
|
58
|
+
id,
|
|
59
|
+
open,
|
|
60
|
+
setOpen
|
|
61
|
+
]);
|
|
62
|
+
const contextValue = {
|
|
63
|
+
id,
|
|
64
|
+
open,
|
|
65
|
+
setOpen,
|
|
66
|
+
triggerRef,
|
|
67
|
+
triggerRect,
|
|
68
|
+
setTriggerRect,
|
|
69
|
+
placement,
|
|
70
|
+
align,
|
|
71
|
+
offset,
|
|
72
|
+
alignOffset,
|
|
73
|
+
avoidCollisions,
|
|
74
|
+
collisionPadding,
|
|
75
|
+
width,
|
|
76
|
+
sameWidth,
|
|
77
|
+
hideArrow,
|
|
78
|
+
hideDismissButton,
|
|
79
|
+
dismissible,
|
|
80
|
+
closeAccessibilityLabel,
|
|
81
|
+
reduceMotion,
|
|
82
|
+
insets,
|
|
83
|
+
blurTarget
|
|
84
|
+
};
|
|
85
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_components_Popover_PopoverContext.PopoverContext.Provider, {
|
|
86
|
+
value: contextValue,
|
|
87
|
+
children
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
Popover.displayName = "Popover";
|
|
91
|
+
//#endregion
|
|
92
|
+
exports.Popover = Popover;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
|
|
2
|
+
import { PopoverProps } from "./types.cjs";
|
|
3
|
+
import * as _$react from "react";
|
|
4
|
+
|
|
5
|
+
//#region src/components/Popover/Popover.d.ts
|
|
6
|
+
/**
|
|
7
|
+
* The root popover component for React Native.
|
|
8
|
+
*
|
|
9
|
+
* Manages open state, trigger measurement, and anchored positioning for a
|
|
10
|
+
* floating surface. Use with {@link PopoverTrigger} and {@link PopoverContent}.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```tsx
|
|
14
|
+
* <Popover>
|
|
15
|
+
* <PopoverTrigger render={<Button>Open popover</Button>} />
|
|
16
|
+
* <PopoverContent>
|
|
17
|
+
* <PopoverTitle>Storage almost full</PopoverTitle>
|
|
18
|
+
* <PopoverDescription>Review large files or upgrade your plan.</PopoverDescription>
|
|
19
|
+
* </PopoverContent>
|
|
20
|
+
* </Popover>
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
declare const Popover: _$react.NamedExoticComponent<PopoverProps>;
|
|
24
|
+
//#endregion
|
|
25
|
+
export { Popover };
|
|
26
|
+
//# sourceMappingURL=Popover.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Popover.d.cts","names":[],"sources":["../../../src/components/Popover/Popover.tsx"],"mappings":";;;;;;;;AAMiE;;;;;;;;;;;;;;cAuB3D,OAAA,EAAO,OAAA,CAAA,oBAAA,CAAA,YAAA"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
|
|
2
|
+
import { PopoverProps } from "./types.js";
|
|
3
|
+
import * as _$react from "react";
|
|
4
|
+
|
|
5
|
+
//#region src/components/Popover/Popover.d.ts
|
|
6
|
+
/**
|
|
7
|
+
* The root popover component for React Native.
|
|
8
|
+
*
|
|
9
|
+
* Manages open state, trigger measurement, and anchored positioning for a
|
|
10
|
+
* floating surface. Use with {@link PopoverTrigger} and {@link PopoverContent}.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```tsx
|
|
14
|
+
* <Popover>
|
|
15
|
+
* <PopoverTrigger render={<Button>Open popover</Button>} />
|
|
16
|
+
* <PopoverContent>
|
|
17
|
+
* <PopoverTitle>Storage almost full</PopoverTitle>
|
|
18
|
+
* <PopoverDescription>Review large files or upgrade your plan.</PopoverDescription>
|
|
19
|
+
* </PopoverContent>
|
|
20
|
+
* </Popover>
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
declare const Popover: _$react.NamedExoticComponent<PopoverProps>;
|
|
24
|
+
//#endregion
|
|
25
|
+
export { Popover };
|
|
26
|
+
//# sourceMappingURL=Popover.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Popover.d.ts","names":[],"sources":["../../../src/components/Popover/Popover.tsx"],"mappings":";;;;;;;;AAMiE;;;;;;;;;;;;;;cAuB3D,OAAA,EAAO,OAAA,CAAA,oBAAA,CAAA,YAAA"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/*! © 2026 Yahoo, Inc. UDS Mobile v0.0.0-development */
|
|
2
|
+
import { useControllableState } from "../internal/Overlay/useControllableState.js";
|
|
3
|
+
import { PopoverContext } from "./PopoverContext.js";
|
|
4
|
+
import { notifyPopoverOpened, subscribeToPopoverLayer } from "./popoverLayer.js";
|
|
5
|
+
import { memo, useEffect, useId, useRef, useState } from "react";
|
|
6
|
+
import { jsx } from "react/jsx-runtime";
|
|
7
|
+
//#region src/components/Popover/Popover.tsx
|
|
8
|
+
const DEFAULT_PLACEMENT = "bottom";
|
|
9
|
+
const DEFAULT_OFFSET = 9;
|
|
10
|
+
const DEFAULT_COLLISION_PADDING = 12;
|
|
11
|
+
/**
|
|
12
|
+
* The root popover component for React Native.
|
|
13
|
+
*
|
|
14
|
+
* Manages open state, trigger measurement, and anchored positioning for a
|
|
15
|
+
* floating surface. Use with {@link PopoverTrigger} and {@link PopoverContent}.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```tsx
|
|
19
|
+
* <Popover>
|
|
20
|
+
* <PopoverTrigger render={<Button>Open popover</Button>} />
|
|
21
|
+
* <PopoverContent>
|
|
22
|
+
* <PopoverTitle>Storage almost full</PopoverTitle>
|
|
23
|
+
* <PopoverDescription>Review large files or upgrade your plan.</PopoverDescription>
|
|
24
|
+
* </PopoverContent>
|
|
25
|
+
* </Popover>
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
const Popover = memo(function Popover({ children, open: openProp, defaultOpen = false, onOpenChange, onOpen, onClose, placement = DEFAULT_PLACEMENT, align, offset = DEFAULT_OFFSET, alignOffset = 0, avoidCollisions = true, collisionPadding = DEFAULT_COLLISION_PADDING, width = "content", sameWidth = false, hideArrow = false, hideDismissButton = false, dismissible = true, closeAccessibilityLabel = "Close popover", reduceMotion = false, insets, blurTarget }) {
|
|
29
|
+
const id = useId();
|
|
30
|
+
const triggerRef = useRef(null);
|
|
31
|
+
const [triggerRect, setTriggerRect] = useState(null);
|
|
32
|
+
const [open, setOpenState] = useControllableState({
|
|
33
|
+
value: openProp,
|
|
34
|
+
defaultValue: defaultOpen,
|
|
35
|
+
onChange: onOpenChange
|
|
36
|
+
});
|
|
37
|
+
const previousOpenRef = useRef(open);
|
|
38
|
+
const setOpen = setOpenState;
|
|
39
|
+
useEffect(() => {
|
|
40
|
+
if (previousOpenRef.current === open) return;
|
|
41
|
+
previousOpenRef.current = open;
|
|
42
|
+
if (open) onOpen?.();
|
|
43
|
+
else onClose?.();
|
|
44
|
+
}, [
|
|
45
|
+
onClose,
|
|
46
|
+
onOpen,
|
|
47
|
+
open
|
|
48
|
+
]);
|
|
49
|
+
useEffect(() => {
|
|
50
|
+
if (!open) return;
|
|
51
|
+
notifyPopoverOpened(id);
|
|
52
|
+
}, [id, open]);
|
|
53
|
+
useEffect(() => subscribeToPopoverLayer((openedId) => {
|
|
54
|
+
if (openedId !== id && open) setOpen(false);
|
|
55
|
+
}), [
|
|
56
|
+
id,
|
|
57
|
+
open,
|
|
58
|
+
setOpen
|
|
59
|
+
]);
|
|
60
|
+
const contextValue = {
|
|
61
|
+
id,
|
|
62
|
+
open,
|
|
63
|
+
setOpen,
|
|
64
|
+
triggerRef,
|
|
65
|
+
triggerRect,
|
|
66
|
+
setTriggerRect,
|
|
67
|
+
placement,
|
|
68
|
+
align,
|
|
69
|
+
offset,
|
|
70
|
+
alignOffset,
|
|
71
|
+
avoidCollisions,
|
|
72
|
+
collisionPadding,
|
|
73
|
+
width,
|
|
74
|
+
sameWidth,
|
|
75
|
+
hideArrow,
|
|
76
|
+
hideDismissButton,
|
|
77
|
+
dismissible,
|
|
78
|
+
closeAccessibilityLabel,
|
|
79
|
+
reduceMotion,
|
|
80
|
+
insets,
|
|
81
|
+
blurTarget
|
|
82
|
+
};
|
|
83
|
+
return /* @__PURE__ */ jsx(PopoverContext.Provider, {
|
|
84
|
+
value: contextValue,
|
|
85
|
+
children
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
Popover.displayName = "Popover";
|
|
89
|
+
//#endregion
|
|
90
|
+
export { Popover };
|
|
91
|
+
|
|
92
|
+
//# sourceMappingURL=Popover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Popover.js","names":[],"sources":["../../../src/components/Popover/Popover.tsx"],"sourcesContent":["import { memo, useEffect, useId, useRef, useState } from 'react';\nimport type { View } from 'react-native';\n\nimport { useControllableState } from '../internal/Overlay';\nimport { PopoverContext } from './PopoverContext';\nimport { notifyPopoverOpened, subscribeToPopoverLayer } from './popoverLayer';\nimport type { PopoverContextValue, PopoverProps } from './types';\n\nconst DEFAULT_PLACEMENT = 'bottom';\nconst DEFAULT_OFFSET = 9;\nconst DEFAULT_COLLISION_PADDING = 12;\n\n/**\n * The root popover component for React Native.\n *\n * Manages open state, trigger measurement, and anchored positioning for a\n * floating surface. Use with {@link PopoverTrigger} and {@link PopoverContent}.\n *\n * @example\n * ```tsx\n * <Popover>\n * <PopoverTrigger render={<Button>Open popover</Button>} />\n * <PopoverContent>\n * <PopoverTitle>Storage almost full</PopoverTitle>\n * <PopoverDescription>Review large files or upgrade your plan.</PopoverDescription>\n * </PopoverContent>\n * </Popover>\n * ```\n */\nconst Popover = memo(function Popover({\n children,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n onOpen,\n onClose,\n placement = DEFAULT_PLACEMENT,\n align,\n offset = DEFAULT_OFFSET,\n alignOffset = 0,\n avoidCollisions = true,\n collisionPadding = DEFAULT_COLLISION_PADDING,\n width = 'content',\n sameWidth = false,\n hideArrow = false,\n hideDismissButton = false,\n dismissible = true,\n closeAccessibilityLabel = 'Close popover',\n reduceMotion = false,\n insets,\n blurTarget,\n}: PopoverProps) {\n const id = useId();\n const triggerRef = useRef<View | null>(null);\n const [triggerRect, setTriggerRect] = useState<PopoverContextValue['triggerRect']>(null);\n const [open, setOpenState] = useControllableState({\n value: openProp,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n });\n const previousOpenRef = useRef(open);\n const setOpen = setOpenState;\n\n useEffect(() => {\n if (previousOpenRef.current === open) {\n return;\n }\n\n previousOpenRef.current = open;\n\n if (open) {\n onOpen?.();\n } else {\n onClose?.();\n }\n }, [onClose, onOpen, open]);\n\n useEffect(() => {\n if (!open) {\n return;\n }\n\n notifyPopoverOpened(id);\n }, [id, open]);\n\n useEffect(\n () =>\n subscribeToPopoverLayer((openedId) => {\n if (openedId !== id && open) {\n setOpen(false);\n }\n }),\n [id, open, setOpen],\n );\n\n const contextValue: PopoverContextValue = {\n id,\n open,\n setOpen,\n triggerRef,\n triggerRect,\n setTriggerRect,\n placement,\n align,\n offset,\n alignOffset,\n avoidCollisions,\n collisionPadding,\n width,\n sameWidth,\n hideArrow,\n hideDismissButton,\n dismissible,\n closeAccessibilityLabel,\n reduceMotion,\n insets,\n blurTarget,\n };\n\n return <PopoverContext.Provider value={contextValue}>{children}</PopoverContext.Provider>;\n});\n\nPopover.displayName = 'Popover';\n\nexport { Popover };\n"],"mappings":";;;;;;;AAQA,MAAM,oBAAoB;AAC1B,MAAM,iBAAiB;AACvB,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;AAmBlC,MAAM,UAAU,KAAK,SAAS,QAAQ,EACpC,UACA,MAAM,UACN,cAAc,OACd,cACA,QACA,SACA,YAAY,mBACZ,OACA,SAAS,gBACT,cAAc,GACd,kBAAkB,MAClB,mBAAmB,2BACnB,QAAQ,WACR,YAAY,OACZ,YAAY,OACZ,oBAAoB,OACpB,cAAc,MACd,0BAA0B,iBAC1B,eAAe,OACf,QACA,cACe;CACf,MAAM,KAAK,OAAO;CAClB,MAAM,aAAa,OAAoB,KAAK;CAC5C,MAAM,CAAC,aAAa,kBAAkB,SAA6C,KAAK;CACxF,MAAM,CAAC,MAAM,gBAAgB,qBAAqB;EAChD,OAAO;EACP,cAAc;EACd,UAAU;EACX,CAAC;CACF,MAAM,kBAAkB,OAAO,KAAK;CACpC,MAAM,UAAU;CAEhB,gBAAgB;EACd,IAAI,gBAAgB,YAAY,MAC9B;EAGF,gBAAgB,UAAU;EAE1B,IAAI,MACF,UAAU;OAEV,WAAW;IAEZ;EAAC;EAAS;EAAQ;EAAK,CAAC;CAE3B,gBAAgB;EACd,IAAI,CAAC,MACH;EAGF,oBAAoB,GAAG;IACtB,CAAC,IAAI,KAAK,CAAC;CAEd,gBAEI,yBAAyB,aAAa;EACpC,IAAI,aAAa,MAAM,MACrB,QAAQ,MAAM;GAEhB,EACJ;EAAC;EAAI;EAAM;EAAQ,CACpB;CAED,MAAM,eAAoC;EACxC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CAED,OAAO,oBAAC,eAAe,UAAhB;EAAyB,OAAO;EAAe;EAAmC,CAAA;EACzF;AAEF,QAAQ,cAAc"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/*! © 2026 Yahoo, Inc. UDS Mobile v0.0.0-development */
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
require("../../_virtual/_rolldown/runtime.cjs");
|
|
4
|
+
const require_components_internal_Overlay_useAnchoredPosition = require("../internal/Overlay/useAnchoredPosition.cjs");
|
|
5
|
+
const require_components_Popover_PopoverContext = require("./PopoverContext.cjs");
|
|
6
|
+
const require_components_Popover_PopoverPortalLayer = require("./PopoverPortalLayer.cjs");
|
|
7
|
+
const require_components_Popover_PopoverSurface = require("./PopoverSurface.cjs");
|
|
8
|
+
let react = require("react");
|
|
9
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
10
|
+
let generated_styles = require("../../../generated/styles");
|
|
11
|
+
let react_native_reanimated = require("react-native-reanimated");
|
|
12
|
+
//#region src/components/Popover/PopoverContent.tsx
|
|
13
|
+
const ARROW_HEIGHT = 12;
|
|
14
|
+
const ARROW_WIDTH = 22;
|
|
15
|
+
const ANIMATION_DURATION = 200;
|
|
16
|
+
/**
|
|
17
|
+
* Floating content surface for {@link Popover}.
|
|
18
|
+
*
|
|
19
|
+
* Renders the anchored surface, arrow, optional dismiss button, blur/elevation
|
|
20
|
+
* background, and open/close transition in a full-window portal layer.
|
|
21
|
+
*/
|
|
22
|
+
const PopoverContent = (0, react.memo)(function PopoverContent({ children, maxWidth, maxHeight, style, onLayout, ...props }) {
|
|
23
|
+
const context = require_components_Popover_PopoverContext.usePopoverContext();
|
|
24
|
+
const { align, alignOffset, avoidCollisions, collisionPadding, dismissible, hideArrow, insets, offset, open, placement, reduceMotion, sameWidth, setOpen, triggerRect, width } = context;
|
|
25
|
+
const [contentSize, setContentSize] = (0, react.useState)({
|
|
26
|
+
width: 0,
|
|
27
|
+
height: 0
|
|
28
|
+
});
|
|
29
|
+
const [shouldRender, setShouldRender] = (0, react.useState)(open);
|
|
30
|
+
const dismiss = (0, react.useCallback)(() => setOpen(false), [setOpen]);
|
|
31
|
+
const { contentStyle, arrowStyle, anchorReady, resolvedPlacement, maxWidth: positionedMaxWidth } = require_components_internal_Overlay_useAnchoredPosition.useAnchoredPosition({
|
|
32
|
+
triggerRect,
|
|
33
|
+
contentSize,
|
|
34
|
+
placement,
|
|
35
|
+
align,
|
|
36
|
+
offset: offset + (hideArrow ? 0 : ARROW_HEIGHT),
|
|
37
|
+
alignOffset,
|
|
38
|
+
avoidCollisions,
|
|
39
|
+
collisionPadding,
|
|
40
|
+
width,
|
|
41
|
+
sameWidth,
|
|
42
|
+
insets,
|
|
43
|
+
arrowHeight: ARROW_HEIGHT,
|
|
44
|
+
arrowWidth: ARROW_WIDTH
|
|
45
|
+
});
|
|
46
|
+
const isPositionedOpen = open && anchorReady && contentSize.height > 0;
|
|
47
|
+
const animationDistance = Math.min(offset, 12);
|
|
48
|
+
const animationSide = resolvedPlacement.split("-")[0];
|
|
49
|
+
const shouldAnimateVertically = animationSide === "top" || animationSide === "bottom";
|
|
50
|
+
const animationTranslate = (animationSide === "top" || animationSide === "start" ? 1 : -1) * animationDistance;
|
|
51
|
+
const progress = (0, react_native_reanimated.useDerivedValue)(() => (0, react_native_reanimated.withTiming)(isPositionedOpen ? 1 : 0, {
|
|
52
|
+
duration: reduceMotion ? 0 : ANIMATION_DURATION,
|
|
53
|
+
easing: react_native_reanimated.Easing.out(react_native_reanimated.Easing.ease)
|
|
54
|
+
}), [isPositionedOpen, reduceMotion]);
|
|
55
|
+
const animatedStyle = (0, react_native_reanimated.useAnimatedStyle)(() => {
|
|
56
|
+
return {
|
|
57
|
+
opacity: progress.value,
|
|
58
|
+
transform: [{ scale: .97 + progress.value * .03 }, shouldAnimateVertically ? { translateY: animationTranslate * (1 - progress.value) } : { translateX: animationTranslate * (1 - progress.value) }]
|
|
59
|
+
};
|
|
60
|
+
});
|
|
61
|
+
const handleLayout = (0, react.useCallback)((event) => {
|
|
62
|
+
const { width: layoutWidth, height: layoutHeight } = event.nativeEvent.layout;
|
|
63
|
+
setContentSize({
|
|
64
|
+
width: layoutWidth,
|
|
65
|
+
height: layoutHeight
|
|
66
|
+
});
|
|
67
|
+
onLayout?.(event);
|
|
68
|
+
}, [onLayout]);
|
|
69
|
+
(0, react.useEffect)(() => {
|
|
70
|
+
if (open) {
|
|
71
|
+
setShouldRender(true);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (reduceMotion) {
|
|
75
|
+
setShouldRender(false);
|
|
76
|
+
setContentSize({
|
|
77
|
+
width: 0,
|
|
78
|
+
height: 0
|
|
79
|
+
});
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const timeout = setTimeout(() => {
|
|
83
|
+
setShouldRender(false);
|
|
84
|
+
setContentSize({
|
|
85
|
+
width: 0,
|
|
86
|
+
height: 0
|
|
87
|
+
});
|
|
88
|
+
}, ANIMATION_DURATION);
|
|
89
|
+
return () => clearTimeout(timeout);
|
|
90
|
+
}, [open, reduceMotion]);
|
|
91
|
+
generated_styles.popoverStyles.useVariants({});
|
|
92
|
+
if (!shouldRender) return null;
|
|
93
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_components_Popover_PopoverPortalLayer.PopoverPortalLayer, {
|
|
94
|
+
open,
|
|
95
|
+
dismissible,
|
|
96
|
+
onDismiss: dismiss,
|
|
97
|
+
children: (layerDismiss) => {
|
|
98
|
+
const surface = /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_components_Popover_PopoverSurface.PopoverSurface, {
|
|
99
|
+
animatedStyle,
|
|
100
|
+
arrowHeight: ARROW_HEIGHT,
|
|
101
|
+
arrowStyle,
|
|
102
|
+
arrowWidth: ARROW_WIDTH,
|
|
103
|
+
contentSize,
|
|
104
|
+
contentStyle,
|
|
105
|
+
maxHeight,
|
|
106
|
+
maxWidth,
|
|
107
|
+
onDismiss: layerDismiss,
|
|
108
|
+
onLayout: handleLayout,
|
|
109
|
+
positionedMaxWidth,
|
|
110
|
+
resolvedPlacement,
|
|
111
|
+
style,
|
|
112
|
+
...props,
|
|
113
|
+
children
|
|
114
|
+
});
|
|
115
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_components_Popover_PopoverContext.PopoverContext.Provider, {
|
|
116
|
+
value: context,
|
|
117
|
+
children: surface
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
PopoverContent.displayName = "PopoverContent";
|
|
123
|
+
//#endregion
|
|
124
|
+
exports.PopoverContent = PopoverContent;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
|
|
2
|
+
import { PopoverContentProps } from "./types.cjs";
|
|
3
|
+
import * as _$react from "react";
|
|
4
|
+
|
|
5
|
+
//#region src/components/Popover/PopoverContent.d.ts
|
|
6
|
+
/**
|
|
7
|
+
* Floating content surface for {@link Popover}.
|
|
8
|
+
*
|
|
9
|
+
* Renders the anchored surface, arrow, optional dismiss button, blur/elevation
|
|
10
|
+
* background, and open/close transition in a full-window portal layer.
|
|
11
|
+
*/
|
|
12
|
+
declare const PopoverContent: _$react.NamedExoticComponent<PopoverContentProps>;
|
|
13
|
+
//#endregion
|
|
14
|
+
export { PopoverContent };
|
|
15
|
+
//# sourceMappingURL=PopoverContent.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PopoverContent.d.cts","names":[],"sources":["../../../src/components/Popover/PopoverContent.tsx"],"mappings":";;;;;;;;AASmD;;;cAY7C,cAAA,EAAc,OAAA,CAAA,oBAAA,CAAA,mBAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
|
|
2
|
+
import { PopoverContentProps } from "./types.js";
|
|
3
|
+
import * as _$react from "react";
|
|
4
|
+
|
|
5
|
+
//#region src/components/Popover/PopoverContent.d.ts
|
|
6
|
+
/**
|
|
7
|
+
* Floating content surface for {@link Popover}.
|
|
8
|
+
*
|
|
9
|
+
* Renders the anchored surface, arrow, optional dismiss button, blur/elevation
|
|
10
|
+
* background, and open/close transition in a full-window portal layer.
|
|
11
|
+
*/
|
|
12
|
+
declare const PopoverContent: _$react.NamedExoticComponent<PopoverContentProps>;
|
|
13
|
+
//#endregion
|
|
14
|
+
export { PopoverContent };
|
|
15
|
+
//# sourceMappingURL=PopoverContent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PopoverContent.d.ts","names":[],"sources":["../../../src/components/Popover/PopoverContent.tsx"],"mappings":";;;;;;;;AASmD;;;cAY7C,cAAA,EAAc,OAAA,CAAA,oBAAA,CAAA,mBAAA"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/*! © 2026 Yahoo, Inc. UDS Mobile v0.0.0-development */
|
|
2
|
+
import { useAnchoredPosition } from "../internal/Overlay/useAnchoredPosition.js";
|
|
3
|
+
import { PopoverContext, usePopoverContext } from "./PopoverContext.js";
|
|
4
|
+
import { PopoverPortalLayer } from "./PopoverPortalLayer.js";
|
|
5
|
+
import { PopoverSurface } from "./PopoverSurface.js";
|
|
6
|
+
import { memo, useCallback, useEffect, useState } from "react";
|
|
7
|
+
import { jsx } from "react/jsx-runtime";
|
|
8
|
+
import { popoverStyles } from "../../../generated/styles";
|
|
9
|
+
import { Easing, useAnimatedStyle, useDerivedValue, withTiming } from "react-native-reanimated";
|
|
10
|
+
//#region src/components/Popover/PopoverContent.tsx
|
|
11
|
+
const ARROW_HEIGHT = 12;
|
|
12
|
+
const ARROW_WIDTH = 22;
|
|
13
|
+
const ANIMATION_DURATION = 200;
|
|
14
|
+
/**
|
|
15
|
+
* Floating content surface for {@link Popover}.
|
|
16
|
+
*
|
|
17
|
+
* Renders the anchored surface, arrow, optional dismiss button, blur/elevation
|
|
18
|
+
* background, and open/close transition in a full-window portal layer.
|
|
19
|
+
*/
|
|
20
|
+
const PopoverContent = memo(function PopoverContent({ children, maxWidth, maxHeight, style, onLayout, ...props }) {
|
|
21
|
+
const context = usePopoverContext();
|
|
22
|
+
const { align, alignOffset, avoidCollisions, collisionPadding, dismissible, hideArrow, insets, offset, open, placement, reduceMotion, sameWidth, setOpen, triggerRect, width } = context;
|
|
23
|
+
const [contentSize, setContentSize] = useState({
|
|
24
|
+
width: 0,
|
|
25
|
+
height: 0
|
|
26
|
+
});
|
|
27
|
+
const [shouldRender, setShouldRender] = useState(open);
|
|
28
|
+
const dismiss = useCallback(() => setOpen(false), [setOpen]);
|
|
29
|
+
const { contentStyle, arrowStyle, anchorReady, resolvedPlacement, maxWidth: positionedMaxWidth } = useAnchoredPosition({
|
|
30
|
+
triggerRect,
|
|
31
|
+
contentSize,
|
|
32
|
+
placement,
|
|
33
|
+
align,
|
|
34
|
+
offset: offset + (hideArrow ? 0 : ARROW_HEIGHT),
|
|
35
|
+
alignOffset,
|
|
36
|
+
avoidCollisions,
|
|
37
|
+
collisionPadding,
|
|
38
|
+
width,
|
|
39
|
+
sameWidth,
|
|
40
|
+
insets,
|
|
41
|
+
arrowHeight: ARROW_HEIGHT,
|
|
42
|
+
arrowWidth: ARROW_WIDTH
|
|
43
|
+
});
|
|
44
|
+
const isPositionedOpen = open && anchorReady && contentSize.height > 0;
|
|
45
|
+
const animationDistance = Math.min(offset, 12);
|
|
46
|
+
const animationSide = resolvedPlacement.split("-")[0];
|
|
47
|
+
const shouldAnimateVertically = animationSide === "top" || animationSide === "bottom";
|
|
48
|
+
const animationTranslate = (animationSide === "top" || animationSide === "start" ? 1 : -1) * animationDistance;
|
|
49
|
+
const progress = useDerivedValue(() => withTiming(isPositionedOpen ? 1 : 0, {
|
|
50
|
+
duration: reduceMotion ? 0 : ANIMATION_DURATION,
|
|
51
|
+
easing: Easing.out(Easing.ease)
|
|
52
|
+
}), [isPositionedOpen, reduceMotion]);
|
|
53
|
+
const animatedStyle = useAnimatedStyle(() => {
|
|
54
|
+
return {
|
|
55
|
+
opacity: progress.value,
|
|
56
|
+
transform: [{ scale: .97 + progress.value * .03 }, shouldAnimateVertically ? { translateY: animationTranslate * (1 - progress.value) } : { translateX: animationTranslate * (1 - progress.value) }]
|
|
57
|
+
};
|
|
58
|
+
});
|
|
59
|
+
const handleLayout = useCallback((event) => {
|
|
60
|
+
const { width: layoutWidth, height: layoutHeight } = event.nativeEvent.layout;
|
|
61
|
+
setContentSize({
|
|
62
|
+
width: layoutWidth,
|
|
63
|
+
height: layoutHeight
|
|
64
|
+
});
|
|
65
|
+
onLayout?.(event);
|
|
66
|
+
}, [onLayout]);
|
|
67
|
+
useEffect(() => {
|
|
68
|
+
if (open) {
|
|
69
|
+
setShouldRender(true);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
if (reduceMotion) {
|
|
73
|
+
setShouldRender(false);
|
|
74
|
+
setContentSize({
|
|
75
|
+
width: 0,
|
|
76
|
+
height: 0
|
|
77
|
+
});
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const timeout = setTimeout(() => {
|
|
81
|
+
setShouldRender(false);
|
|
82
|
+
setContentSize({
|
|
83
|
+
width: 0,
|
|
84
|
+
height: 0
|
|
85
|
+
});
|
|
86
|
+
}, ANIMATION_DURATION);
|
|
87
|
+
return () => clearTimeout(timeout);
|
|
88
|
+
}, [open, reduceMotion]);
|
|
89
|
+
popoverStyles.useVariants({});
|
|
90
|
+
if (!shouldRender) return null;
|
|
91
|
+
return /* @__PURE__ */ jsx(PopoverPortalLayer, {
|
|
92
|
+
open,
|
|
93
|
+
dismissible,
|
|
94
|
+
onDismiss: dismiss,
|
|
95
|
+
children: (layerDismiss) => {
|
|
96
|
+
const surface = /* @__PURE__ */ jsx(PopoverSurface, {
|
|
97
|
+
animatedStyle,
|
|
98
|
+
arrowHeight: ARROW_HEIGHT,
|
|
99
|
+
arrowStyle,
|
|
100
|
+
arrowWidth: ARROW_WIDTH,
|
|
101
|
+
contentSize,
|
|
102
|
+
contentStyle,
|
|
103
|
+
maxHeight,
|
|
104
|
+
maxWidth,
|
|
105
|
+
onDismiss: layerDismiss,
|
|
106
|
+
onLayout: handleLayout,
|
|
107
|
+
positionedMaxWidth,
|
|
108
|
+
resolvedPlacement,
|
|
109
|
+
style,
|
|
110
|
+
...props,
|
|
111
|
+
children
|
|
112
|
+
});
|
|
113
|
+
return /* @__PURE__ */ jsx(PopoverContext.Provider, {
|
|
114
|
+
value: context,
|
|
115
|
+
children: surface
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
PopoverContent.displayName = "PopoverContent";
|
|
121
|
+
//#endregion
|
|
122
|
+
export { PopoverContent };
|
|
123
|
+
|
|
124
|
+
//# sourceMappingURL=PopoverContent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PopoverContent.js","names":[],"sources":["../../../src/components/Popover/PopoverContent.tsx"],"sourcesContent":["import { memo, useCallback, useEffect, useState } from 'react';\nimport type { LayoutChangeEvent } from 'react-native';\nimport { Easing, useAnimatedStyle, useDerivedValue, withTiming } from 'react-native-reanimated';\n\nimport { popoverStyles } from '../../../generated/styles';\nimport { useAnchoredPosition } from '../internal/Overlay';\nimport { PopoverContext, usePopoverContext } from './PopoverContext';\nimport { PopoverPortalLayer } from './PopoverPortalLayer';\nimport { PopoverSurface } from './PopoverSurface';\nimport type { PopoverContentProps } from './types';\n\nconst ARROW_HEIGHT = 12;\nconst ARROW_WIDTH = 22;\nconst ANIMATION_DURATION = 200;\n\n/**\n * Floating content surface for {@link Popover}.\n *\n * Renders the anchored surface, arrow, optional dismiss button, blur/elevation\n * background, and open/close transition in a full-window portal layer.\n */\nconst PopoverContent = memo(function PopoverContent({\n children,\n maxWidth,\n maxHeight,\n style,\n onLayout,\n ...props\n}: PopoverContentProps) {\n const context = usePopoverContext();\n const {\n align,\n alignOffset,\n avoidCollisions,\n collisionPadding,\n dismissible,\n hideArrow,\n insets,\n offset,\n open,\n placement,\n reduceMotion,\n sameWidth,\n setOpen,\n triggerRect,\n width,\n } = context;\n const [contentSize, setContentSize] = useState({ width: 0, height: 0 });\n const [shouldRender, setShouldRender] = useState(open);\n const dismiss = useCallback(() => setOpen(false), [setOpen]);\n\n const {\n contentStyle,\n arrowStyle,\n anchorReady,\n resolvedPlacement,\n maxWidth: positionedMaxWidth,\n } = useAnchoredPosition({\n triggerRect,\n contentSize,\n placement,\n align,\n offset: offset + (hideArrow ? 0 : ARROW_HEIGHT),\n alignOffset,\n avoidCollisions,\n collisionPadding,\n width,\n sameWidth,\n insets,\n arrowHeight: ARROW_HEIGHT,\n arrowWidth: ARROW_WIDTH,\n });\n\n const isPositionedOpen = open && anchorReady && contentSize.height > 0;\n const animationDistance = Math.min(offset, 12);\n const animationSide = resolvedPlacement.split('-')[0] as 'top' | 'bottom' | 'start' | 'end';\n const shouldAnimateVertically = animationSide === 'top' || animationSide === 'bottom';\n const animationDirection = animationSide === 'top' || animationSide === 'start' ? 1 : -1;\n const animationTranslate = animationDirection * animationDistance;\n\n const progress = useDerivedValue(\n () =>\n withTiming(isPositionedOpen ? 1 : 0, {\n duration: reduceMotion ? 0 : ANIMATION_DURATION,\n easing: Easing.out(Easing.ease),\n }),\n [isPositionedOpen, reduceMotion],\n );\n\n const animatedStyle = useAnimatedStyle(() => {\n return {\n opacity: progress.value,\n transform: [\n {\n scale: 0.97 + progress.value * 0.03,\n },\n shouldAnimateVertically\n ? { translateY: animationTranslate * (1 - progress.value) }\n : { translateX: animationTranslate * (1 - progress.value) },\n ],\n };\n });\n\n const handleLayout = useCallback(\n (event: LayoutChangeEvent) => {\n const { width: layoutWidth, height: layoutHeight } = event.nativeEvent.layout;\n setContentSize({ width: layoutWidth, height: layoutHeight });\n onLayout?.(event);\n },\n [onLayout],\n );\n\n useEffect(() => {\n if (open) {\n setShouldRender(true);\n return;\n }\n\n if (reduceMotion) {\n setShouldRender(false);\n setContentSize({ width: 0, height: 0 });\n return;\n }\n\n const timeout = setTimeout(() => {\n setShouldRender(false);\n setContentSize({ width: 0, height: 0 });\n }, ANIMATION_DURATION);\n\n return () => clearTimeout(timeout);\n }, [open, reduceMotion]);\n\n popoverStyles.useVariants({});\n\n if (!shouldRender) {\n return null;\n }\n\n return (\n <PopoverPortalLayer open={open} dismissible={dismissible} onDismiss={dismiss}>\n {(layerDismiss) => {\n const surface = (\n <PopoverSurface\n animatedStyle={animatedStyle}\n arrowHeight={ARROW_HEIGHT}\n arrowStyle={arrowStyle}\n arrowWidth={ARROW_WIDTH}\n contentSize={contentSize}\n contentStyle={contentStyle}\n maxHeight={maxHeight}\n maxWidth={maxWidth}\n onDismiss={layerDismiss}\n onLayout={handleLayout}\n positionedMaxWidth={positionedMaxWidth}\n resolvedPlacement={resolvedPlacement}\n style={style}\n {...props}\n >\n {children}\n </PopoverSurface>\n );\n\n return <PopoverContext.Provider value={context}>{surface}</PopoverContext.Provider>;\n }}\n </PopoverPortalLayer>\n );\n});\n\nPopoverContent.displayName = 'PopoverContent';\n\nexport { PopoverContent };\n"],"mappings":";;;;;;;;;;AAWA,MAAM,eAAe;AACrB,MAAM,cAAc;AACpB,MAAM,qBAAqB;;;;;;;AAQ3B,MAAM,iBAAiB,KAAK,SAAS,eAAe,EAClD,UACA,UACA,WACA,OACA,UACA,GAAG,SACmB;CACtB,MAAM,UAAU,mBAAmB;CACnC,MAAM,EACJ,OACA,aACA,iBACA,kBACA,aACA,WACA,QACA,QACA,MACA,WACA,cACA,WACA,SACA,aACA,UACE;CACJ,MAAM,CAAC,aAAa,kBAAkB,SAAS;EAAE,OAAO;EAAG,QAAQ;EAAG,CAAC;CACvE,MAAM,CAAC,cAAc,mBAAmB,SAAS,KAAK;CACtD,MAAM,UAAU,kBAAkB,QAAQ,MAAM,EAAE,CAAC,QAAQ,CAAC;CAE5D,MAAM,EACJ,cACA,YACA,aACA,mBACA,UAAU,uBACR,oBAAoB;EACtB;EACA;EACA;EACA;EACA,QAAQ,UAAU,YAAY,IAAI;EAClC;EACA;EACA;EACA;EACA;EACA;EACA,aAAa;EACb,YAAY;EACb,CAAC;CAEF,MAAM,mBAAmB,QAAQ,eAAe,YAAY,SAAS;CACrE,MAAM,oBAAoB,KAAK,IAAI,QAAQ,GAAG;CAC9C,MAAM,gBAAgB,kBAAkB,MAAM,IAAI,CAAC;CACnD,MAAM,0BAA0B,kBAAkB,SAAS,kBAAkB;CAE7E,MAAM,sBADqB,kBAAkB,SAAS,kBAAkB,UAAU,IAAI,MACtC;CAEhD,MAAM,WAAW,sBAEb,WAAW,mBAAmB,IAAI,GAAG;EACnC,UAAU,eAAe,IAAI;EAC7B,QAAQ,OAAO,IAAI,OAAO,KAAK;EAChC,CAAC,EACJ,CAAC,kBAAkB,aAAa,CACjC;CAED,MAAM,gBAAgB,uBAAuB;EAC3C,OAAO;GACL,SAAS,SAAS;GAClB,WAAW,CACT,EACE,OAAO,MAAO,SAAS,QAAQ,KAChC,EACD,0BACI,EAAE,YAAY,sBAAsB,IAAI,SAAS,QAAQ,GACzD,EAAE,YAAY,sBAAsB,IAAI,SAAS,QAAQ,CAC9D;GACF;GACD;CAEF,MAAM,eAAe,aAClB,UAA6B;EAC5B,MAAM,EAAE,OAAO,aAAa,QAAQ,iBAAiB,MAAM,YAAY;EACvE,eAAe;GAAE,OAAO;GAAa,QAAQ;GAAc,CAAC;EAC5D,WAAW,MAAM;IAEnB,CAAC,SAAS,CACX;CAED,gBAAgB;EACd,IAAI,MAAM;GACR,gBAAgB,KAAK;GACrB;;EAGF,IAAI,cAAc;GAChB,gBAAgB,MAAM;GACtB,eAAe;IAAE,OAAO;IAAG,QAAQ;IAAG,CAAC;GACvC;;EAGF,MAAM,UAAU,iBAAiB;GAC/B,gBAAgB,MAAM;GACtB,eAAe;IAAE,OAAO;IAAG,QAAQ;IAAG,CAAC;KACtC,mBAAmB;EAEtB,aAAa,aAAa,QAAQ;IACjC,CAAC,MAAM,aAAa,CAAC;CAExB,cAAc,YAAY,EAAE,CAAC;CAE7B,IAAI,CAAC,cACH,OAAO;CAGT,OACE,oBAAC,oBAAD;EAA0B;EAAmB;EAAa,WAAW;aACjE,iBAAiB;GACjB,MAAM,UACJ,oBAAC,gBAAD;IACiB;IACf,aAAa;IACD;IACZ,YAAY;IACC;IACC;IACH;IACD;IACV,WAAW;IACX,UAAU;IACU;IACD;IACZ;IACP,GAAI;IAEH;IACc,CAAA;GAGnB,OAAO,oBAAC,eAAe,UAAhB;IAAyB,OAAO;cAAU;IAAkC,CAAA;;EAElE,CAAA;EAEvB;AAEF,eAAe,cAAc"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/*! © 2026 Yahoo, Inc. UDS Mobile v0.0.0-development */
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
require("../../_virtual/_rolldown/runtime.cjs");
|
|
4
|
+
let react = require("react");
|
|
5
|
+
//#region src/components/Popover/PopoverContext.tsx
|
|
6
|
+
const PopoverContext = (0, react.createContext)(null);
|
|
7
|
+
function usePopoverContext() {
|
|
8
|
+
const context = (0, react.useContext)(PopoverContext);
|
|
9
|
+
if (!context) throw new Error("Popover components must be used inside a Popover.");
|
|
10
|
+
return context;
|
|
11
|
+
}
|
|
12
|
+
//#endregion
|
|
13
|
+
exports.PopoverContext = PopoverContext;
|
|
14
|
+
exports.usePopoverContext = usePopoverContext;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
|
|
2
|
+
import { PopoverContextValue } from "./types.cjs";
|
|
3
|
+
import * as _$react from "react";
|
|
4
|
+
|
|
5
|
+
//#region src/components/Popover/PopoverContext.d.ts
|
|
6
|
+
declare const PopoverContext: _$react.Context<PopoverContextValue | null>;
|
|
7
|
+
declare function usePopoverContext(): PopoverContextValue;
|
|
8
|
+
//#endregion
|
|
9
|
+
export { PopoverContext, usePopoverContext };
|
|
10
|
+
//# sourceMappingURL=PopoverContext.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PopoverContext.d.cts","names":[],"sources":["../../../src/components/Popover/PopoverContext.tsx"],"mappings":";;;;;cAIM,cAAA,EAAc,OAAA,CAAA,OAAA,CAAA,mBAAA;AAAA,iBAEX,iBAAA,CAAA,GAAqB,mBAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
|
|
2
|
+
import { PopoverContextValue } from "./types.js";
|
|
3
|
+
import * as _$react from "react";
|
|
4
|
+
|
|
5
|
+
//#region src/components/Popover/PopoverContext.d.ts
|
|
6
|
+
declare const PopoverContext: _$react.Context<PopoverContextValue | null>;
|
|
7
|
+
declare function usePopoverContext(): PopoverContextValue;
|
|
8
|
+
//#endregion
|
|
9
|
+
export { PopoverContext, usePopoverContext };
|
|
10
|
+
//# sourceMappingURL=PopoverContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PopoverContext.d.ts","names":[],"sources":["../../../src/components/Popover/PopoverContext.tsx"],"mappings":";;;;;cAIM,cAAA,EAAc,OAAA,CAAA,OAAA,CAAA,mBAAA;AAAA,iBAEX,iBAAA,CAAA,GAAqB,mBAAA"}
|