@react-native-aria/overlays 0.3.3 → 0.3.4

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.
@@ -34,16 +34,27 @@ function PortalProvider(props) {
34
34
  };
35
35
 
36
36
  const updateOverlayItem = (id, node) => {
37
- setItems(prev => prev.map(item => {
38
- if (item.id === id) {
39
- return {
40
- id,
37
+ setItems(prev => {
38
+ const overlayItem = prev.find(item => item.id == id);
39
+
40
+ if (!overlayItem) {
41
+ return prev.concat([{
42
+ id: id,
41
43
  node
42
- };
44
+ }]);
45
+ } else {
46
+ return prev.map(item => {
47
+ if (item.id === id) {
48
+ return {
49
+ id,
50
+ node
51
+ };
52
+ }
53
+
54
+ return item;
55
+ });
43
56
  }
44
-
45
- return item;
46
- }));
57
+ });
47
58
  };
48
59
 
49
60
  const removeOverlayItem = id => {
@@ -1 +1 @@
1
- {"version":3,"sources":["Portal.tsx"],"names":["PortalContext","React","createContext","globalOverlayCounter","PortalProvider","props","items","setItems","useState","setOverlayItem","element","overlayId","prev","concat","id","node","updateOverlayItem","map","item","removeOverlayItem","newItems","filter","isSSR","children","OverlayView","style","StyleSheet","absoluteFill","OverlayProvider","OverlayContainer","context","usePortalProvider","useRef","undefined","current","display","useContext"],"mappings":"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","sourcesContent":["import React, { useEffect } from 'react';\nimport type { ReactNode } from 'react';\nimport { StyleSheet, View, ViewProps } from 'react-native';\n\ntype OverlayItem = {\n id: number;\n node: ReactNode;\n};\n\ninterface PortalContext {\n items: Array<OverlayItem>;\n setOverlayItem: (node: ReactNode) => number;\n removeOverlayItem: (id: number) => void;\n updateOverlayItem: (id: number, node: ReactNode) => void;\n isSSR?: boolean;\n}\n\ninterface ModalProviderProps extends ViewProps {\n children: ReactNode;\n provider?: boolean;\n}\n\nconst PortalContext = React.createContext<PortalContext | null>(null);\n\nlet globalOverlayCounter = 0;\n\nexport function PortalProvider(props: {\n children: ReactNode;\n isSSR?: boolean;\n}) {\n const [items, setItems] = React.useState<Array<OverlayItem>>([]);\n\n const setOverlayItem = (element: ReactNode) => {\n const overlayId = ++globalOverlayCounter;\n setItems((prev) => prev.concat([{ id: overlayId, node: element }]));\n return overlayId;\n };\n\n const updateOverlayItem = (id: number, node: ReactNode) => {\n setItems((prev) =>\n prev.map((item) => {\n if (item.id === id) {\n return { id, node };\n }\n return item;\n })\n );\n };\n\n const removeOverlayItem = (id: number) => {\n setItems((prev) => {\n const newItems = prev.filter((item) => item.id !== id);\n return newItems;\n });\n };\n\n return (\n <PortalContext.Provider\n value={{\n items,\n setOverlayItem,\n removeOverlayItem,\n updateOverlayItem,\n isSSR: props?.isSSR,\n }}\n >\n {props.children}\n\n {/* Render Overlays */}\n {items.map((item) => {\n return <React.Fragment key={item.id}>{item.node}</React.Fragment>;\n })}\n </PortalContext.Provider>\n );\n}\n\nfunction OverlayView({ style, ...props }: ModalProviderProps) {\n return (\n <View\n pointerEvents=\"box-none\"\n style={[StyleSheet.absoluteFill, style]}\n collapsable={false}\n {...props}\n />\n );\n}\n\nexport const OverlayProvider = PortalProvider;\n\nexport function OverlayContainer(props: ModalProviderProps) {\n const context = usePortalProvider();\n const overlayId = React.useRef<number | undefined>(undefined);\n const element = <OverlayView {...props} />;\n\n useEffect(\n () => {\n // Mount\n if (overlayId.current === undefined) {\n overlayId.current = context?.setOverlayItem(element);\n }\n // Update\n else {\n if (overlayId.current) {\n context?.updateOverlayItem(overlayId.current, element);\n }\n }\n },\n // To re-render the child\n [props]\n );\n\n // Unmount\n useEffect(() => {\n return () => {\n if (overlayId.current) {\n context?.removeOverlayItem(overlayId.current);\n }\n };\n }, []);\n\n // Rendering elements for SSR\n if (context?.isSSR && !overlayId.current) {\n return <View style={{ display: 'none' }}>{element}</View>;\n }\n return null;\n}\n\nfunction usePortalProvider() {\n const context = React.useContext(PortalContext);\n return context;\n}\n"]}
1
+ {"version":3,"sources":["Portal.tsx"],"names":["PortalContext","React","createContext","globalOverlayCounter","PortalProvider","props","items","setItems","useState","setOverlayItem","element","overlayId","prev","concat","id","node","updateOverlayItem","overlayItem","find","item","map","removeOverlayItem","newItems","filter","isSSR","children","OverlayView","style","StyleSheet","absoluteFill","OverlayProvider","OverlayContainer","context","usePortalProvider","useRef","undefined","current","display","useContext"],"mappings":";;;;;;;;;AAAA;;AAEA;;;;;;;;AAoBA,MAAMA,aAAa,gBAAGC,eAAMC,aAAN,CAA0C,IAA1C,CAAtB;;AAEA,IAAIC,oBAAoB,GAAG,CAA3B;;AAEO,SAASC,cAAT,CAAwBC,KAAxB,EAGJ;AACD,QAAM,CAACC,KAAD,EAAQC,QAAR,IAAoBN,eAAMO,QAAN,CAAmC,EAAnC,CAA1B;;AAEA,QAAMC,cAAc,GAAIC,OAAD,IAAwB;AAC7C,UAAMC,SAAS,GAAG,EAAER,oBAApB;AACAI,IAAAA,QAAQ,CAAEK,IAAD,IAAUA,IAAI,CAACC,MAAL,CAAY,CAAC;AAAEC,MAAAA,EAAE,EAAEH,SAAN;AAAiBI,MAAAA,IAAI,EAAEL;AAAvB,KAAD,CAAZ,CAAX,CAAR;AACA,WAAOC,SAAP;AACD,GAJD;;AAMA,QAAMK,iBAAiB,GAAG,CAACF,EAAD,EAAaC,IAAb,KAAiC;AACzDR,IAAAA,QAAQ,CAAEK,IAAD,IAAU;AACjB,YAAMK,WAAW,GAAGL,IAAI,CAACM,IAAL,CAAWC,IAAD,IAAUA,IAAI,CAACL,EAAL,IAAWA,EAA/B,CAApB;;AACA,UAAI,CAACG,WAAL,EAAkB;AAChB,eAAOL,IAAI,CAACC,MAAL,CAAY,CAAC;AAAEC,UAAAA,EAAE,EAAEA,EAAN;AAAUC,UAAAA;AAAV,SAAD,CAAZ,CAAP;AACD,OAFD,MAEO;AACL,eAAOH,IAAI,CAACQ,GAAL,CAAUD,IAAD,IAAU;AACxB,cAAIA,IAAI,CAACL,EAAL,KAAYA,EAAhB,EAAoB;AAClB,mBAAO;AAAEA,cAAAA,EAAF;AAAMC,cAAAA;AAAN,aAAP;AACD;;AAED,iBAAOI,IAAP;AACD,SANM,CAAP;AAOD;AACF,KAbO,CAAR;AAcD,GAfD;;AAiBA,QAAME,iBAAiB,GAAIP,EAAD,IAAgB;AACxCP,IAAAA,QAAQ,CAAEK,IAAD,IAAU;AACjB,YAAMU,QAAQ,GAAGV,IAAI,CAACW,MAAL,CAAaJ,IAAD,IAAUA,IAAI,CAACL,EAAL,KAAYA,EAAlC,CAAjB;AACA,aAAOQ,QAAP;AACD,KAHO,CAAR;AAID,GALD;;AAOA,sBACE,6BAAC,aAAD,CAAe,QAAf;AACE,IAAA,KAAK,EAAE;AACLhB,MAAAA,KADK;AAELG,MAAAA,cAFK;AAGLY,MAAAA,iBAHK;AAILL,MAAAA,iBAJK;AAKLQ,MAAAA,KAAK,EAAEnB,KAAF,aAAEA,KAAF,uBAAEA,KAAK,CAAEmB;AALT;AADT,KASGnB,KAAK,CAACoB,QATT,EAYGnB,KAAK,CAACc,GAAN,CAAWD,IAAD,IAAU;AACnB,wBAAO,6BAAC,cAAD,CAAO,QAAP;AAAgB,MAAA,GAAG,EAAEA,IAAI,CAACL;AAA1B,OAA+BK,IAAI,CAACJ,IAApC,CAAP;AACD,GAFA,CAZH,CADF;AAkBD;;AAED,SAASW,WAAT,CAAqB;AAAEC,EAAAA,KAAF;AAAS,KAAGtB;AAAZ,CAArB,EAA8D;AAC5D,sBACE,6BAAC,iBAAD;AACE,IAAA,aAAa,EAAC,UADhB;AAEE,IAAA,KAAK,EAAE,CAACuB,wBAAWC,YAAZ,EAA0BF,KAA1B,CAFT;AAGE,IAAA,WAAW,EAAE;AAHf,KAIMtB,KAJN,EADF;AAQD;;AAEM,MAAMyB,eAAe,GAAG1B,cAAxB;;;AAEA,SAAS2B,gBAAT,CAA0B1B,KAA1B,EAAqD;AAC1D,QAAM2B,OAAO,GAAGC,iBAAiB,EAAjC;;AACA,QAAMtB,SAAS,GAAGV,eAAMiC,MAAN,CAAiCC,SAAjC,CAAlB;;AACA,QAAMzB,OAAO,gBAAG,6BAAC,WAAD,EAAiBL,KAAjB,CAAhB;;AAEA,wBACE,MAAM;AACJ;AACA,QAAIM,SAAS,CAACyB,OAAV,KAAsBD,SAA1B,EAAqC;AACnCxB,MAAAA,SAAS,CAACyB,OAAV,GAAoBJ,OAApB,aAAoBA,OAApB,uBAAoBA,OAAO,CAAEvB,cAAT,CAAwBC,OAAxB,CAApB;AACD,KAFD,CAGA;AAHA,SAIK;AACH,YAAIC,SAAS,CAACyB,OAAd,EAAuB;AACrBJ,UAAAA,OAAO,SAAP,IAAAA,OAAO,WAAP,YAAAA,OAAO,CAAEhB,iBAAT,CAA2BL,SAAS,CAACyB,OAArC,EAA8C1B,OAA9C;AACD;AACF;AACF,GAZH,EAaE;AACA,GAACL,KAAD,CAdF,EAL0D,CAsB1D;;AACA,wBAAU,MAAM;AACd,WAAO,MAAM;AACX,UAAIM,SAAS,CAACyB,OAAd,EAAuB;AACrBJ,QAAAA,OAAO,SAAP,IAAAA,OAAO,WAAP,YAAAA,OAAO,CAAEX,iBAAT,CAA2BV,SAAS,CAACyB,OAArC;AACD;AACF,KAJD;AAKD,GAND,EAMG,EANH,EAvB0D,CA+B1D;;AACA,MAAIJ,OAAO,SAAP,IAAAA,OAAO,WAAP,IAAAA,OAAO,CAAER,KAAT,IAAkB,CAACb,SAAS,CAACyB,OAAjC,EAA0C;AACxC,wBAAO,6BAAC,iBAAD;AAAM,MAAA,KAAK,EAAE;AAAEC,QAAAA,OAAO,EAAE;AAAX;AAAb,OAAmC3B,OAAnC,CAAP;AACD;;AACD,SAAO,IAAP;AACD;;AAED,SAASuB,iBAAT,GAA6B;AAC3B,QAAMD,OAAO,GAAG/B,eAAMqC,UAAN,CAAiBtC,aAAjB,CAAhB;;AACA,SAAOgC,OAAP;AACD","sourcesContent":["import React, { useEffect } from 'react';\nimport type { ReactNode } from 'react';\nimport { StyleSheet, View, ViewProps } from 'react-native';\n\ntype OverlayItem = {\n id: number;\n node: ReactNode;\n};\n\ninterface PortalContext {\n items: Array<OverlayItem>;\n setOverlayItem: (node: ReactNode) => number;\n removeOverlayItem: (id: number) => void;\n updateOverlayItem: (id: number, node: ReactNode) => void;\n isSSR?: boolean;\n}\n\ninterface ModalProviderProps extends ViewProps {\n children: ReactNode;\n provider?: boolean;\n}\n\nconst PortalContext = React.createContext<PortalContext | null>(null);\n\nlet globalOverlayCounter = 0;\n\nexport function PortalProvider(props: {\n children: ReactNode;\n isSSR?: boolean;\n}) {\n const [items, setItems] = React.useState<Array<OverlayItem>>([]);\n\n const setOverlayItem = (element: ReactNode) => {\n const overlayId = ++globalOverlayCounter;\n setItems((prev) => prev.concat([{ id: overlayId, node: element }]));\n return overlayId;\n };\n\n const updateOverlayItem = (id: number, node: ReactNode) => {\n setItems((prev) => {\n const overlayItem = prev.find((item) => item.id == id);\n if (!overlayItem) {\n return prev.concat([{ id: id, node }]);\n } else {\n return prev.map((item) => {\n if (item.id === id) {\n return { id, node };\n }\n\n return item;\n });\n }\n });\n };\n\n const removeOverlayItem = (id: number) => {\n setItems((prev) => {\n const newItems = prev.filter((item) => item.id !== id);\n return newItems;\n });\n };\n\n return (\n <PortalContext.Provider\n value={{\n items,\n setOverlayItem,\n removeOverlayItem,\n updateOverlayItem,\n isSSR: props?.isSSR,\n }}\n >\n {props.children}\n\n {/* Render Overlays */}\n {items.map((item) => {\n return <React.Fragment key={item.id}>{item.node}</React.Fragment>;\n })}\n </PortalContext.Provider>\n );\n}\n\nfunction OverlayView({ style, ...props }: ModalProviderProps) {\n return (\n <View\n pointerEvents=\"box-none\"\n style={[StyleSheet.absoluteFill, style]}\n collapsable={false}\n {...props}\n />\n );\n}\n\nexport const OverlayProvider = PortalProvider;\n\nexport function OverlayContainer(props: ModalProviderProps) {\n const context = usePortalProvider();\n const overlayId = React.useRef<number | undefined>(undefined);\n const element = <OverlayView {...props} />;\n\n useEffect(\n () => {\n // Mount\n if (overlayId.current === undefined) {\n overlayId.current = context?.setOverlayItem(element);\n }\n // Update\n else {\n if (overlayId.current) {\n context?.updateOverlayItem(overlayId.current, element);\n }\n }\n },\n // To re-render the child\n [props]\n );\n\n // Unmount\n useEffect(() => {\n return () => {\n if (overlayId.current) {\n context?.removeOverlayItem(overlayId.current);\n }\n };\n }, []);\n\n // Rendering elements for SSR\n if (context?.isSSR && !overlayId.current) {\n return <View style={{ display: 'none' }}>{element}</View>;\n }\n return null;\n}\n\nfunction usePortalProvider() {\n const context = React.useContext(PortalContext);\n return context;\n}\n"]}
@@ -13,6 +13,7 @@ var _utils = require("@react-native-aria/utils");
13
13
 
14
14
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
15
 
16
+ //@ts-ignore
16
17
  const measureOffset = ref => new Promise(resolve => {
17
18
  if (ref.current) {
18
19
  ref.current.measureInWindow((x, y, width, height) => {
@@ -1 +1 @@
1
- {"version":3,"sources":["useOverlayPosition.ts"],"names":["measureOffset","ref","Promise","resolve","current","measureInWindow","x","y","width","height","top","left","useOverlayPosition","props","targetRef","overlayRef","placement","offset","crossOffset","isOpen","shouldFlip","shouldOverlapWithTrigger","position","setPosition","React","useState","arrowOffsetLeft","undefined","arrowOffsetTop","maxHeight","rendered","setRendered","updatePosition","overlayOffset","triggerOffset","all","requestAnimationFrame","windowHeight","windowWidth","Dimensions","get","positions","calculatePosition","translateRTL","targetNode","overlayNode","scrollNode","padding","boundaryElement","useEffect","useLayoutEffect","returnProps","overlayProps","style","arrowProps","replace","opts","childOffset","isContainerPositioned","overlaySize","margins","bottom","right","scrollSize","boundaryDimensions","containerOffsetWithBoundary","calculatePositionInternal","placementInput","flip","placementInfo","parsePlacement","size","crossAxis","crossSize","crossPlacement","computePosition","normalizedOffset","space","getAvailableSpace","flippedPlacementInfo","FLIPPED_DIRECTION","flippedPosition","flippedSpace","delta","getDelta","getMaxHeight","Math","min","arrowPosition","axis","containerDimensions","containerScroll","containerHeight","AXIS_SIZE","startEdgeOffset","endEdgeOffset","max","_containerOffsetWithBoundary","_margins","_padding","_isContainerPositioned","minViablePosition","maxViablePosition","floor","AXIS","CROSS_AXIS","PARSED_PLACEMENT_CACHE","input","split"],"mappings":"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","sourcesContent":["import type { PlacementAxis } from '@react-types/overlays';\nimport React, { RefObject } from 'react';\nimport type { Axis, SizeAxis } from '@react-types/overlays';\nimport {\n //@ts-ignore\n Dimensions,\n} from 'react-native';\nimport type { Placement, PositionProps } from '@react-types/overlays';\nimport { isRTL } from '@react-native-aria/utils';\n\nconst measureOffset = (ref: RefObject<any>) =>\n new Promise<IMeasureResult>((resolve) => {\n if (ref.current) {\n ref.current.measureInWindow(\n (x: number, y: number, width: number, height: number) => {\n resolve({ top: y, left: x, width, height });\n }\n );\n }\n });\n\ninterface ParsedPlacement {\n placement: PlacementAxis;\n crossPlacement: PlacementAxis;\n axis: Axis;\n crossAxis: Axis;\n size: SizeAxis;\n crossSize: SizeAxis;\n}\ninterface AriaPositionProps extends PositionProps {\n /**\n * Element that that serves as the positioning boundary.\n * @default document.body\n */\n boundaryElement?: any;\n /**\n * The ref for the element which the overlay positions itself with respect to.\n */\n targetRef: RefObject<any>;\n /**\n * The ref for the overlay element.\n */\n overlayRef: RefObject<any>;\n /**\n * A ref for the scrollable region within the overlay.\n * @default overlayRef\n */\n scrollRef?: RefObject<any>;\n /**\n * Whether the overlay should update its position automatically.\n * @default true\n */\n shouldUpdatePosition?: boolean;\n /** Handler that is called when the overlay should close. */\n onClose?: () => void;\n /** Determines whether the overlay should overlap with the trigger */\n shouldOverlapWithTrigger?: boolean;\n}\n\ntype IMeasureResult = {\n top: number;\n left: number;\n height: number;\n width: number;\n};\n\nexport function useOverlayPosition(props: AriaPositionProps) {\n let {\n targetRef,\n overlayRef,\n placement = 'bottom' as Placement,\n offset = 0,\n crossOffset = 0,\n isOpen = true,\n shouldFlip = true,\n shouldOverlapWithTrigger = false,\n } = props;\n\n let [position, setPosition] = React.useState<PositionResult>({\n position: {},\n arrowOffsetLeft: undefined,\n arrowOffsetTop: undefined,\n maxHeight: undefined,\n placement: undefined,\n });\n\n // Layout measurement happens asynchronously in RN. This causes initial flickr. Using opacity and setting it to 1 post calculation prevents that.\n let [rendered, setRendered] = React.useState(false);\n\n let updatePosition = async () => {\n const [overlayOffset, triggerOffset] = await Promise.all([\n measureOffset(overlayRef),\n measureOffset(targetRef),\n ]);\n\n // Sometimes measure returns height/width 0. Best solution would be to use onLayout callback, but that might diverege from React Aria's useOverlayPosition API. Decide later, this works for now\n if (\n !overlayOffset.width ||\n !overlayOffset.height ||\n !triggerOffset.width ||\n !triggerOffset.height\n ) {\n requestAnimationFrame(updatePosition);\n return;\n }\n\n const { height: windowHeight, width: windowWidth } = Dimensions.get(\n 'window'\n );\n\n const positions = calculatePosition({\n placement: translateRTL(placement),\n targetNode: triggerOffset,\n overlayNode: overlayOffset,\n scrollNode: overlayOffset,\n padding: 0,\n shouldFlip,\n boundaryElement: {\n top: 0,\n left: 0,\n width: windowWidth,\n height: windowHeight,\n },\n offset,\n crossOffset,\n shouldOverlapWithTrigger,\n });\n setPosition(positions);\n setRendered(true);\n };\n React.useEffect(() => {\n return () => {\n setRendered(false);\n };\n }, []);\n\n React.useLayoutEffect(() => {\n updatePosition();\n }, [placement, isOpen, offset, shouldFlip, crossOffset, shouldOverlapWithTrigger]);\n\n const returnProps = {\n rendered,\n overlayProps: {\n style: {\n ...position.position,\n },\n },\n placement: position.placement,\n arrowProps: {\n style: {\n left: position.arrowOffsetLeft,\n top: position.arrowOffsetTop,\n },\n },\n updatePosition,\n };\n\n if (position.maxHeight !== undefined) {\n //@ts-ignore\n returnProps.overlayProps.style.maxHeight = position.maxHeight;\n }\n\n return returnProps;\n}\n\nfunction translateRTL(position: any) {\n if (isRTL()) {\n return position.replace('start', 'right').replace('end', 'left');\n }\n return position.replace('start', 'left').replace('end', 'right');\n}\n\ninterface Position {\n top?: number;\n left?: number;\n bottom?: number;\n right?: number;\n}\n\ninterface Dimensions {\n width: number;\n height: number;\n top: number;\n left: number;\n scroll: Position;\n}\n\ninterface Offset {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\nexport interface PositionResult {\n position?: Position;\n arrowOffsetLeft?: number;\n arrowOffsetTop?: number;\n maxHeight?: number;\n placement: PlacementAxis | undefined;\n}\n\nconst calculatePosition = (opts: any): PositionResult => {\n let {\n placement,\n targetNode,\n overlayNode,\n scrollNode,\n padding,\n shouldFlip,\n boundaryElement,\n offset,\n crossOffset,\n shouldOverlapWithTrigger,\n } = opts;\n\n let childOffset: Offset = targetNode;\n let isContainerPositioned = false;\n let overlaySize: Offset = overlayNode;\n let margins = { top: 0, bottom: 0, left: 0, right: 0 };\n let scrollSize = scrollNode;\n let boundaryDimensions = boundaryElement;\n\n let containerOffsetWithBoundary: Offset = overlayNode;\n\n return calculatePositionInternal(\n placement,\n childOffset,\n overlaySize,\n scrollSize,\n margins,\n padding,\n shouldFlip,\n boundaryDimensions,\n containerOffsetWithBoundary,\n offset,\n crossOffset,\n isContainerPositioned,\n shouldOverlapWithTrigger\n );\n};\n\nfunction calculatePositionInternal(\n placementInput: Placement,\n childOffset: any,\n overlaySize: Offset,\n scrollSize: Offset,\n margins: Position,\n padding: number,\n flip: boolean,\n boundaryDimensions: Dimensions,\n containerOffsetWithBoundary: Offset,\n offset: number,\n crossOffset: number,\n isContainerPositioned: boolean,\n shouldOverlapWithTrigger: boolean\n): PositionResult {\n let placementInfo = parsePlacement(placementInput);\n let { size, crossAxis, crossSize, placement, crossPlacement } = placementInfo;\n let position = computePosition(\n childOffset,\n boundaryDimensions,\n overlaySize,\n placementInfo,\n offset,\n crossOffset,\n containerOffsetWithBoundary,\n isContainerPositioned\n );\n let normalizedOffset = offset;\n let space = getAvailableSpace(\n boundaryDimensions,\n containerOffsetWithBoundary,\n childOffset,\n margins,\n padding + offset,\n placementInfo\n );\n\n if (flip && scrollSize[size] > space) {\n let flippedPlacementInfo = parsePlacement(\n `${FLIPPED_DIRECTION[placement]} ${crossPlacement}` as Placement\n );\n let flippedPosition = computePosition(\n childOffset,\n boundaryDimensions,\n overlaySize,\n flippedPlacementInfo,\n offset,\n crossOffset,\n containerOffsetWithBoundary,\n isContainerPositioned\n );\n let flippedSpace = getAvailableSpace(\n boundaryDimensions,\n containerOffsetWithBoundary,\n childOffset,\n margins,\n padding + offset,\n flippedPlacementInfo\n );\n\n // If the available space for the flipped position is greater than the original available space, flip.\n if (flippedSpace > space) {\n placementInfo = flippedPlacementInfo;\n position = flippedPosition;\n normalizedOffset = offset;\n }\n }\n\n let delta = getDelta(\n crossAxis,\n position[crossAxis],\n overlaySize[crossSize],\n boundaryDimensions,\n padding\n );\n position[crossAxis] += delta;\n\n let maxHeight = getMaxHeight(\n position,\n boundaryDimensions,\n containerOffsetWithBoundary,\n childOffset,\n margins,\n padding\n );\n\n overlaySize.height = Math.min(overlaySize.height, maxHeight);\n\n position = computePosition(\n childOffset,\n boundaryDimensions,\n overlaySize,\n placementInfo,\n normalizedOffset,\n crossOffset,\n containerOffsetWithBoundary,\n isContainerPositioned\n );\n\n delta = getDelta(\n crossAxis,\n position[crossAxis],\n overlaySize[crossSize],\n boundaryDimensions,\n padding\n );\n position[crossAxis] += delta;\n\n let arrowPosition: Position = {};\n arrowPosition[crossAxis] =\n childOffset[crossAxis] - position[crossAxis] + childOffset[crossSize] / 2;\n\n if (shouldOverlapWithTrigger) {\n position[FLIPPED_DIRECTION[placementInfo.placement]] =\n position[FLIPPED_DIRECTION[placementInfo.placement]] - childOffset[size];\n }\n\n return {\n position,\n maxHeight,\n arrowOffsetLeft: arrowPosition.left,\n arrowOffsetTop: arrowPosition.top,\n placement: placementInfo.placement,\n };\n}\n\nfunction getDelta(\n axis: Axis,\n offset: number,\n size: number,\n containerDimensions: Dimensions,\n padding: number\n) {\n //@ts-ignore\n let containerScroll = containerDimensions[axis];\n //@ts-ignore\n let containerHeight = containerDimensions[AXIS_SIZE[axis]];\n\n let startEdgeOffset = offset - padding - containerScroll;\n let endEdgeOffset = offset + padding - containerScroll + size;\n\n if (startEdgeOffset < 0) {\n return -startEdgeOffset;\n } else if (endEdgeOffset > containerHeight) {\n return Math.max(containerHeight - endEdgeOffset, -startEdgeOffset);\n } else {\n return 0;\n }\n}\n\nfunction getMaxHeight(\n position: Position,\n boundaryDimensions: Dimensions,\n _containerOffsetWithBoundary: Offset,\n childOffset: Offset,\n _margins: Position,\n _padding: number\n) {\n return position.top != null\n ? // We want the distance between the top of the overlay to the bottom of the boundary\n Math.max(\n 0,\n boundaryDimensions.height - // this is the bottom of the boundary\n position.top // this is the top of the overlay\n )\n : // We want the distance between the top of the trigger to the top of the boundary\n Math.max(\n 0,\n childOffset.top - // this is the top of the trigger\n 0 // this is the top of the boundary\n );\n}\n\nfunction computePosition(\n childOffset: any,\n boundaryDimensions: Dimensions,\n overlaySize: Offset,\n placementInfo: ParsedPlacement,\n offset: number,\n crossOffset: number,\n _containerOffsetWithBoundary: Offset,\n _isContainerPositioned: boolean\n) {\n let {\n placement,\n crossPlacement,\n axis,\n crossAxis,\n size,\n crossSize,\n } = placementInfo;\n let position: any = {};\n //@ts-ignore\n position[crossAxis] = childOffset[crossAxis];\n\n if (crossPlacement === 'center') {\n position[crossAxis] +=\n (childOffset[crossSize] - overlaySize[crossSize]) / 2;\n } else if (crossPlacement !== crossAxis) {\n position[crossAxis] += childOffset[crossSize] - overlaySize[crossSize];\n }\n\n position[crossAxis] += crossOffset;\n\n // this is button center position - the overlay size + half of the button to align bottom of overlay with button center\n let minViablePosition =\n childOffset[crossAxis] +\n childOffset[crossSize] / 2 -\n overlaySize[crossSize];\n // this is button position of center, aligns top of overlay with button center\n let maxViablePosition = childOffset[crossAxis] + childOffset[crossSize] / 2;\n\n // clamp it into the range of the min/max positions\n position[crossAxis] = Math.min(\n Math.max(minViablePosition, position[crossAxis]),\n maxViablePosition\n );\n\n // Floor these so the position isn't placed on a partial pixel, only whole pixels. Shouldn't matter if it was floored or ceiled, so chose one.\n if (placement === axis) {\n // If the container is positioned (non-static), then we use the container's actual\n // height, as `bottom` will be relative to this height. But if the container is static,\n // then it can only be the `document.body`, and `bottom` will be relative to _its_\n // container, which should be as large as boundaryDimensions.\n const containerHeight = boundaryDimensions[size];\n position[FLIPPED_DIRECTION[axis]] = Math.floor(\n containerHeight - childOffset[axis] + offset\n );\n } else {\n position[axis] = Math.floor(childOffset[axis] + childOffset[size] + offset);\n }\n\n return position;\n}\n\nfunction getAvailableSpace(\n boundaryDimensions: Dimensions,\n _containerOffsetWithBoundary: Offset,\n childOffset: any,\n _margins: Position,\n padding: number,\n placementInfo: ParsedPlacement\n) {\n let { placement, axis, size } = placementInfo;\n if (placement === axis) {\n return Math.max(0, childOffset[axis] - padding);\n }\n\n return Math.max(\n 0,\n boundaryDimensions[size] - childOffset[axis] - childOffset[size] - padding\n );\n}\n\nconst AXIS: any = {\n top: 'top',\n bottom: 'top',\n left: 'left',\n right: 'left',\n};\n\nconst FLIPPED_DIRECTION: any = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n};\n\nconst CROSS_AXIS: any = {\n top: 'left',\n left: 'top',\n};\n\nconst AXIS_SIZE: any = {\n top: 'height',\n left: 'width',\n};\n\ninterface Position {\n top?: number;\n left?: number;\n bottom?: number;\n right?: number;\n}\n\ninterface Dimensions {\n width: number;\n height: number;\n top: number;\n left: number;\n scroll: Position;\n}\n\ninterface Offset {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\nconst PARSED_PLACEMENT_CACHE: any = {};\n\nfunction parsePlacement(input: Placement): ParsedPlacement {\n if (PARSED_PLACEMENT_CACHE[input]) {\n return PARSED_PLACEMENT_CACHE[input];\n }\n\n let [placement, crossPlacement] = input.split(' ');\n let axis: Axis = AXIS[placement] || 'right';\n let crossAxis: Axis = CROSS_AXIS[axis];\n\n if (!AXIS[crossPlacement]) {\n crossPlacement = 'center';\n }\n\n let size = AXIS_SIZE[axis];\n let crossSize = AXIS_SIZE[crossAxis];\n PARSED_PLACEMENT_CACHE[input] = {\n placement,\n crossPlacement,\n axis,\n crossAxis,\n size,\n crossSize,\n };\n return PARSED_PLACEMENT_CACHE[input];\n}\n"]}
1
+ {"version":3,"sources":["useOverlayPosition.ts"],"names":["measureOffset","ref","Promise","resolve","current","measureInWindow","x","y","width","height","top","left","useOverlayPosition","props","targetRef","overlayRef","placement","offset","crossOffset","isOpen","shouldFlip","shouldOverlapWithTrigger","position","setPosition","React","useState","arrowOffsetLeft","undefined","arrowOffsetTop","maxHeight","rendered","setRendered","updatePosition","overlayOffset","triggerOffset","all","requestAnimationFrame","windowHeight","windowWidth","Dimensions","get","positions","calculatePosition","translateRTL","targetNode","overlayNode","scrollNode","padding","boundaryElement","useEffect","useLayoutEffect","returnProps","overlayProps","style","arrowProps","replace","opts","childOffset","isContainerPositioned","overlaySize","margins","bottom","right","scrollSize","boundaryDimensions","containerOffsetWithBoundary","calculatePositionInternal","placementInput","flip","placementInfo","parsePlacement","size","crossAxis","crossSize","crossPlacement","computePosition","normalizedOffset","space","getAvailableSpace","flippedPlacementInfo","FLIPPED_DIRECTION","flippedPosition","flippedSpace","delta","getDelta","getMaxHeight","Math","min","arrowPosition","axis","containerDimensions","containerScroll","containerHeight","AXIS_SIZE","startEdgeOffset","endEdgeOffset","max","_containerOffsetWithBoundary","_margins","_padding","_isContainerPositioned","minViablePosition","maxViablePosition","floor","AXIS","CROSS_AXIS","PARSED_PLACEMENT_CACHE","input","split"],"mappings":"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","sourcesContent":["import type { PlacementAxis } from '@react-types/overlays';\nimport React, { RefObject } from 'react';\nimport type { Axis, SizeAxis } from '@react-types/overlays';\nimport {\n //@ts-ignore\n Dimensions,\n} from 'react-native';\nimport type { Placement, PositionProps } from '@react-types/overlays';\n//@ts-ignore\nimport { isRTL } from '@react-native-aria/utils';\n\nconst measureOffset = (ref: RefObject<any>) =>\n new Promise<IMeasureResult>((resolve) => {\n if (ref.current) {\n ref.current.measureInWindow(\n (x: number, y: number, width: number, height: number) => {\n resolve({ top: y, left: x, width, height });\n }\n );\n }\n });\n\ninterface ParsedPlacement {\n placement: PlacementAxis;\n crossPlacement: PlacementAxis;\n axis: Axis;\n crossAxis: Axis;\n size: SizeAxis;\n crossSize: SizeAxis;\n}\ninterface AriaPositionProps extends PositionProps {\n /**\n * Element that that serves as the positioning boundary.\n * @default document.body\n */\n boundaryElement?: any;\n /**\n * The ref for the element which the overlay positions itself with respect to.\n */\n targetRef: RefObject<any>;\n /**\n * The ref for the overlay element.\n */\n overlayRef: RefObject<any>;\n /**\n * A ref for the scrollable region within the overlay.\n * @default overlayRef\n */\n scrollRef?: RefObject<any>;\n /**\n * Whether the overlay should update its position automatically.\n * @default true\n */\n shouldUpdatePosition?: boolean;\n /** Handler that is called when the overlay should close. */\n onClose?: () => void;\n /** Determines whether the overlay should overlap with the trigger */\n shouldOverlapWithTrigger?: boolean;\n}\n\ntype IMeasureResult = {\n top: number;\n left: number;\n height: number;\n width: number;\n};\n\nexport function useOverlayPosition(props: AriaPositionProps) {\n let {\n targetRef,\n overlayRef,\n placement = 'bottom' as Placement,\n offset = 0,\n crossOffset = 0,\n isOpen = true,\n shouldFlip = true,\n shouldOverlapWithTrigger = false,\n } = props;\n\n let [position, setPosition] = React.useState<PositionResult>({\n position: {},\n arrowOffsetLeft: undefined,\n arrowOffsetTop: undefined,\n maxHeight: undefined,\n placement: undefined,\n });\n\n // Layout measurement happens asynchronously in RN. This causes initial flickr. Using opacity and setting it to 1 post calculation prevents that.\n let [rendered, setRendered] = React.useState(false);\n\n let updatePosition = async () => {\n const [overlayOffset, triggerOffset] = await Promise.all([\n measureOffset(overlayRef),\n measureOffset(targetRef),\n ]);\n\n // Sometimes measure returns height/width 0. Best solution would be to use onLayout callback, but that might diverege from React Aria's useOverlayPosition API. Decide later, this works for now\n if (\n !overlayOffset.width ||\n !overlayOffset.height ||\n !triggerOffset.width ||\n !triggerOffset.height\n ) {\n requestAnimationFrame(updatePosition);\n return;\n }\n\n const { height: windowHeight, width: windowWidth } = Dimensions.get(\n 'window'\n );\n\n const positions = calculatePosition({\n placement: translateRTL(placement),\n targetNode: triggerOffset,\n overlayNode: overlayOffset,\n scrollNode: overlayOffset,\n padding: 0,\n shouldFlip,\n boundaryElement: {\n top: 0,\n left: 0,\n width: windowWidth,\n height: windowHeight,\n },\n offset,\n crossOffset,\n shouldOverlapWithTrigger,\n });\n setPosition(positions);\n setRendered(true);\n };\n React.useEffect(() => {\n return () => {\n setRendered(false);\n };\n }, []);\n\n React.useLayoutEffect(() => {\n updatePosition();\n }, [\n placement,\n isOpen,\n offset,\n shouldFlip,\n crossOffset,\n shouldOverlapWithTrigger,\n ]);\n\n const returnProps = {\n rendered,\n overlayProps: {\n style: {\n ...position.position,\n },\n },\n placement: position.placement,\n arrowProps: {\n style: {\n left: position.arrowOffsetLeft,\n top: position.arrowOffsetTop,\n },\n },\n updatePosition,\n };\n\n if (position.maxHeight !== undefined) {\n //@ts-ignore\n returnProps.overlayProps.style.maxHeight = position.maxHeight;\n }\n\n return returnProps;\n}\n\nfunction translateRTL(position: any) {\n if (isRTL()) {\n return position.replace('start', 'right').replace('end', 'left');\n }\n return position.replace('start', 'left').replace('end', 'right');\n}\n\ninterface Position {\n top?: number;\n left?: number;\n bottom?: number;\n right?: number;\n}\n\ninterface Dimensions {\n width: number;\n height: number;\n top: number;\n left: number;\n scroll: Position;\n}\n\ninterface Offset {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\nexport interface PositionResult {\n position?: Position;\n arrowOffsetLeft?: number;\n arrowOffsetTop?: number;\n maxHeight?: number;\n placement: PlacementAxis | undefined;\n}\n\nconst calculatePosition = (opts: any): PositionResult => {\n let {\n placement,\n targetNode,\n overlayNode,\n scrollNode,\n padding,\n shouldFlip,\n boundaryElement,\n offset,\n crossOffset,\n shouldOverlapWithTrigger,\n } = opts;\n\n let childOffset: Offset = targetNode;\n let isContainerPositioned = false;\n let overlaySize: Offset = overlayNode;\n let margins = { top: 0, bottom: 0, left: 0, right: 0 };\n let scrollSize = scrollNode;\n let boundaryDimensions = boundaryElement;\n\n let containerOffsetWithBoundary: Offset = overlayNode;\n\n return calculatePositionInternal(\n placement,\n childOffset,\n overlaySize,\n scrollSize,\n margins,\n padding,\n shouldFlip,\n boundaryDimensions,\n containerOffsetWithBoundary,\n offset,\n crossOffset,\n isContainerPositioned,\n shouldOverlapWithTrigger\n );\n};\n\nfunction calculatePositionInternal(\n placementInput: Placement,\n childOffset: any,\n overlaySize: Offset,\n scrollSize: Offset,\n margins: Position,\n padding: number,\n flip: boolean,\n boundaryDimensions: Dimensions,\n containerOffsetWithBoundary: Offset,\n offset: number,\n crossOffset: number,\n isContainerPositioned: boolean,\n shouldOverlapWithTrigger: boolean\n): PositionResult {\n let placementInfo = parsePlacement(placementInput);\n let { size, crossAxis, crossSize, placement, crossPlacement } = placementInfo;\n let position = computePosition(\n childOffset,\n boundaryDimensions,\n overlaySize,\n placementInfo,\n offset,\n crossOffset,\n containerOffsetWithBoundary,\n isContainerPositioned\n );\n let normalizedOffset = offset;\n let space = getAvailableSpace(\n boundaryDimensions,\n containerOffsetWithBoundary,\n childOffset,\n margins,\n padding + offset,\n placementInfo\n );\n\n if (flip && scrollSize[size] > space) {\n let flippedPlacementInfo = parsePlacement(\n `${FLIPPED_DIRECTION[placement]} ${crossPlacement}` as Placement\n );\n let flippedPosition = computePosition(\n childOffset,\n boundaryDimensions,\n overlaySize,\n flippedPlacementInfo,\n offset,\n crossOffset,\n containerOffsetWithBoundary,\n isContainerPositioned\n );\n let flippedSpace = getAvailableSpace(\n boundaryDimensions,\n containerOffsetWithBoundary,\n childOffset,\n margins,\n padding + offset,\n flippedPlacementInfo\n );\n\n // If the available space for the flipped position is greater than the original available space, flip.\n if (flippedSpace > space) {\n placementInfo = flippedPlacementInfo;\n position = flippedPosition;\n normalizedOffset = offset;\n }\n }\n\n let delta = getDelta(\n crossAxis,\n position[crossAxis],\n overlaySize[crossSize],\n boundaryDimensions,\n padding\n );\n position[crossAxis] += delta;\n\n let maxHeight = getMaxHeight(\n position,\n boundaryDimensions,\n containerOffsetWithBoundary,\n childOffset,\n margins,\n padding\n );\n\n overlaySize.height = Math.min(overlaySize.height, maxHeight);\n\n position = computePosition(\n childOffset,\n boundaryDimensions,\n overlaySize,\n placementInfo,\n normalizedOffset,\n crossOffset,\n containerOffsetWithBoundary,\n isContainerPositioned\n );\n\n delta = getDelta(\n crossAxis,\n position[crossAxis],\n overlaySize[crossSize],\n boundaryDimensions,\n padding\n );\n position[crossAxis] += delta;\n\n let arrowPosition: Position = {};\n arrowPosition[crossAxis] =\n childOffset[crossAxis] - position[crossAxis] + childOffset[crossSize] / 2;\n\n if (shouldOverlapWithTrigger) {\n position[FLIPPED_DIRECTION[placementInfo.placement]] =\n position[FLIPPED_DIRECTION[placementInfo.placement]] - childOffset[size];\n }\n\n return {\n position,\n maxHeight,\n arrowOffsetLeft: arrowPosition.left,\n arrowOffsetTop: arrowPosition.top,\n placement: placementInfo.placement,\n };\n}\n\nfunction getDelta(\n axis: Axis,\n offset: number,\n size: number,\n containerDimensions: Dimensions,\n padding: number\n) {\n //@ts-ignore\n let containerScroll = containerDimensions[axis];\n //@ts-ignore\n let containerHeight = containerDimensions[AXIS_SIZE[axis]];\n\n let startEdgeOffset = offset - padding - containerScroll;\n let endEdgeOffset = offset + padding - containerScroll + size;\n\n if (startEdgeOffset < 0) {\n return -startEdgeOffset;\n } else if (endEdgeOffset > containerHeight) {\n return Math.max(containerHeight - endEdgeOffset, -startEdgeOffset);\n } else {\n return 0;\n }\n}\n\nfunction getMaxHeight(\n position: Position,\n boundaryDimensions: Dimensions,\n _containerOffsetWithBoundary: Offset,\n childOffset: Offset,\n _margins: Position,\n _padding: number\n) {\n return position.top != null\n ? // We want the distance between the top of the overlay to the bottom of the boundary\n Math.max(\n 0,\n boundaryDimensions.height - // this is the bottom of the boundary\n position.top // this is the top of the overlay\n )\n : // We want the distance between the top of the trigger to the top of the boundary\n Math.max(\n 0,\n childOffset.top - // this is the top of the trigger\n 0 // this is the top of the boundary\n );\n}\n\nfunction computePosition(\n childOffset: any,\n boundaryDimensions: Dimensions,\n overlaySize: Offset,\n placementInfo: ParsedPlacement,\n offset: number,\n crossOffset: number,\n _containerOffsetWithBoundary: Offset,\n _isContainerPositioned: boolean\n) {\n let {\n placement,\n crossPlacement,\n axis,\n crossAxis,\n size,\n crossSize,\n } = placementInfo;\n let position: any = {};\n //@ts-ignore\n position[crossAxis] = childOffset[crossAxis];\n\n if (crossPlacement === 'center') {\n position[crossAxis] +=\n (childOffset[crossSize] - overlaySize[crossSize]) / 2;\n } else if (crossPlacement !== crossAxis) {\n position[crossAxis] += childOffset[crossSize] - overlaySize[crossSize];\n }\n\n position[crossAxis] += crossOffset;\n\n // this is button center position - the overlay size + half of the button to align bottom of overlay with button center\n let minViablePosition =\n childOffset[crossAxis] +\n childOffset[crossSize] / 2 -\n overlaySize[crossSize];\n // this is button position of center, aligns top of overlay with button center\n let maxViablePosition = childOffset[crossAxis] + childOffset[crossSize] / 2;\n\n // clamp it into the range of the min/max positions\n position[crossAxis] = Math.min(\n Math.max(minViablePosition, position[crossAxis]),\n maxViablePosition\n );\n\n // Floor these so the position isn't placed on a partial pixel, only whole pixels. Shouldn't matter if it was floored or ceiled, so chose one.\n if (placement === axis) {\n // If the container is positioned (non-static), then we use the container's actual\n // height, as `bottom` will be relative to this height. But if the container is static,\n // then it can only be the `document.body`, and `bottom` will be relative to _its_\n // container, which should be as large as boundaryDimensions.\n const containerHeight = boundaryDimensions[size];\n position[FLIPPED_DIRECTION[axis]] = Math.floor(\n containerHeight - childOffset[axis] + offset\n );\n } else {\n position[axis] = Math.floor(childOffset[axis] + childOffset[size] + offset);\n }\n\n return position;\n}\n\nfunction getAvailableSpace(\n boundaryDimensions: Dimensions,\n _containerOffsetWithBoundary: Offset,\n childOffset: any,\n _margins: Position,\n padding: number,\n placementInfo: ParsedPlacement\n) {\n let { placement, axis, size } = placementInfo;\n if (placement === axis) {\n return Math.max(0, childOffset[axis] - padding);\n }\n\n return Math.max(\n 0,\n boundaryDimensions[size] - childOffset[axis] - childOffset[size] - padding\n );\n}\n\nconst AXIS: any = {\n top: 'top',\n bottom: 'top',\n left: 'left',\n right: 'left',\n};\n\nconst FLIPPED_DIRECTION: any = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n};\n\nconst CROSS_AXIS: any = {\n top: 'left',\n left: 'top',\n};\n\nconst AXIS_SIZE: any = {\n top: 'height',\n left: 'width',\n};\n\ninterface Position {\n top?: number;\n left?: number;\n bottom?: number;\n right?: number;\n}\n\ninterface Dimensions {\n width: number;\n height: number;\n top: number;\n left: number;\n scroll: Position;\n}\n\ninterface Offset {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\nconst PARSED_PLACEMENT_CACHE: any = {};\n\nfunction parsePlacement(input: Placement): ParsedPlacement {\n if (PARSED_PLACEMENT_CACHE[input]) {\n return PARSED_PLACEMENT_CACHE[input];\n }\n\n let [placement, crossPlacement] = input.split(' ');\n let axis: Axis = AXIS[placement] || 'right';\n let crossAxis: Axis = CROSS_AXIS[axis];\n\n if (!AXIS[crossPlacement]) {\n crossPlacement = 'center';\n }\n\n let size = AXIS_SIZE[axis];\n let crossSize = AXIS_SIZE[crossAxis];\n PARSED_PLACEMENT_CACHE[input] = {\n placement,\n crossPlacement,\n axis,\n crossAxis,\n size,\n crossSize,\n };\n return PARSED_PLACEMENT_CACHE[input];\n}\n"]}
@@ -17,16 +17,27 @@ export function PortalProvider(props) {
17
17
  };
18
18
 
19
19
  const updateOverlayItem = (id, node) => {
20
- setItems(prev => prev.map(item => {
21
- if (item.id === id) {
22
- return {
23
- id,
20
+ setItems(prev => {
21
+ const overlayItem = prev.find(item => item.id == id);
22
+
23
+ if (!overlayItem) {
24
+ return prev.concat([{
25
+ id: id,
24
26
  node
25
- };
26
- }
27
+ }]);
28
+ } else {
29
+ return prev.map(item => {
30
+ if (item.id === id) {
31
+ return {
32
+ id,
33
+ node
34
+ };
35
+ }
27
36
 
28
- return item;
29
- }));
37
+ return item;
38
+ });
39
+ }
40
+ });
30
41
  };
31
42
 
32
43
  const removeOverlayItem = id => {
@@ -1 +1 @@
1
- {"version":3,"sources":["Portal.tsx"],"names":["React","useEffect","StyleSheet","View","PortalContext","createContext","globalOverlayCounter","PortalProvider","props","items","setItems","useState","setOverlayItem","element","overlayId","prev","concat","id","node","updateOverlayItem","map","item","removeOverlayItem","newItems","filter","isSSR","children","OverlayView","style","absoluteFill","OverlayProvider","OverlayContainer","context","usePortalProvider","useRef","undefined","current","display","useContext"],"mappings":"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","sourcesContent":["import React, { useEffect } from 'react';\nimport type { ReactNode } from 'react';\nimport { StyleSheet, View, ViewProps } from 'react-native';\n\ntype OverlayItem = {\n id: number;\n node: ReactNode;\n};\n\ninterface PortalContext {\n items: Array<OverlayItem>;\n setOverlayItem: (node: ReactNode) => number;\n removeOverlayItem: (id: number) => void;\n updateOverlayItem: (id: number, node: ReactNode) => void;\n isSSR?: boolean;\n}\n\ninterface ModalProviderProps extends ViewProps {\n children: ReactNode;\n provider?: boolean;\n}\n\nconst PortalContext = React.createContext<PortalContext | null>(null);\n\nlet globalOverlayCounter = 0;\n\nexport function PortalProvider(props: {\n children: ReactNode;\n isSSR?: boolean;\n}) {\n const [items, setItems] = React.useState<Array<OverlayItem>>([]);\n\n const setOverlayItem = (element: ReactNode) => {\n const overlayId = ++globalOverlayCounter;\n setItems((prev) => prev.concat([{ id: overlayId, node: element }]));\n return overlayId;\n };\n\n const updateOverlayItem = (id: number, node: ReactNode) => {\n setItems((prev) =>\n prev.map((item) => {\n if (item.id === id) {\n return { id, node };\n }\n return item;\n })\n );\n };\n\n const removeOverlayItem = (id: number) => {\n setItems((prev) => {\n const newItems = prev.filter((item) => item.id !== id);\n return newItems;\n });\n };\n\n return (\n <PortalContext.Provider\n value={{\n items,\n setOverlayItem,\n removeOverlayItem,\n updateOverlayItem,\n isSSR: props?.isSSR,\n }}\n >\n {props.children}\n\n {/* Render Overlays */}\n {items.map((item) => {\n return <React.Fragment key={item.id}>{item.node}</React.Fragment>;\n })}\n </PortalContext.Provider>\n );\n}\n\nfunction OverlayView({ style, ...props }: ModalProviderProps) {\n return (\n <View\n pointerEvents=\"box-none\"\n style={[StyleSheet.absoluteFill, style]}\n collapsable={false}\n {...props}\n />\n );\n}\n\nexport const OverlayProvider = PortalProvider;\n\nexport function OverlayContainer(props: ModalProviderProps) {\n const context = usePortalProvider();\n const overlayId = React.useRef<number | undefined>(undefined);\n const element = <OverlayView {...props} />;\n\n useEffect(\n () => {\n // Mount\n if (overlayId.current === undefined) {\n overlayId.current = context?.setOverlayItem(element);\n }\n // Update\n else {\n if (overlayId.current) {\n context?.updateOverlayItem(overlayId.current, element);\n }\n }\n },\n // To re-render the child\n [props]\n );\n\n // Unmount\n useEffect(() => {\n return () => {\n if (overlayId.current) {\n context?.removeOverlayItem(overlayId.current);\n }\n };\n }, []);\n\n // Rendering elements for SSR\n if (context?.isSSR && !overlayId.current) {\n return <View style={{ display: 'none' }}>{element}</View>;\n }\n return null;\n}\n\nfunction usePortalProvider() {\n const context = React.useContext(PortalContext);\n return context;\n}\n"]}
1
+ {"version":3,"sources":["Portal.tsx"],"names":["React","useEffect","StyleSheet","View","PortalContext","createContext","globalOverlayCounter","PortalProvider","props","items","setItems","useState","setOverlayItem","element","overlayId","prev","concat","id","node","updateOverlayItem","overlayItem","find","item","map","removeOverlayItem","newItems","filter","isSSR","children","OverlayView","style","absoluteFill","OverlayProvider","OverlayContainer","context","usePortalProvider","useRef","undefined","current","display","useContext"],"mappings":"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","sourcesContent":["import React, { useEffect } from 'react';\nimport type { ReactNode } from 'react';\nimport { StyleSheet, View, ViewProps } from 'react-native';\n\ntype OverlayItem = {\n id: number;\n node: ReactNode;\n};\n\ninterface PortalContext {\n items: Array<OverlayItem>;\n setOverlayItem: (node: ReactNode) => number;\n removeOverlayItem: (id: number) => void;\n updateOverlayItem: (id: number, node: ReactNode) => void;\n isSSR?: boolean;\n}\n\ninterface ModalProviderProps extends ViewProps {\n children: ReactNode;\n provider?: boolean;\n}\n\nconst PortalContext = React.createContext<PortalContext | null>(null);\n\nlet globalOverlayCounter = 0;\n\nexport function PortalProvider(props: {\n children: ReactNode;\n isSSR?: boolean;\n}) {\n const [items, setItems] = React.useState<Array<OverlayItem>>([]);\n\n const setOverlayItem = (element: ReactNode) => {\n const overlayId = ++globalOverlayCounter;\n setItems((prev) => prev.concat([{ id: overlayId, node: element }]));\n return overlayId;\n };\n\n const updateOverlayItem = (id: number, node: ReactNode) => {\n setItems((prev) => {\n const overlayItem = prev.find((item) => item.id == id);\n if (!overlayItem) {\n return prev.concat([{ id: id, node }]);\n } else {\n return prev.map((item) => {\n if (item.id === id) {\n return { id, node };\n }\n\n return item;\n });\n }\n });\n };\n\n const removeOverlayItem = (id: number) => {\n setItems((prev) => {\n const newItems = prev.filter((item) => item.id !== id);\n return newItems;\n });\n };\n\n return (\n <PortalContext.Provider\n value={{\n items,\n setOverlayItem,\n removeOverlayItem,\n updateOverlayItem,\n isSSR: props?.isSSR,\n }}\n >\n {props.children}\n\n {/* Render Overlays */}\n {items.map((item) => {\n return <React.Fragment key={item.id}>{item.node}</React.Fragment>;\n })}\n </PortalContext.Provider>\n );\n}\n\nfunction OverlayView({ style, ...props }: ModalProviderProps) {\n return (\n <View\n pointerEvents=\"box-none\"\n style={[StyleSheet.absoluteFill, style]}\n collapsable={false}\n {...props}\n />\n );\n}\n\nexport const OverlayProvider = PortalProvider;\n\nexport function OverlayContainer(props: ModalProviderProps) {\n const context = usePortalProvider();\n const overlayId = React.useRef<number | undefined>(undefined);\n const element = <OverlayView {...props} />;\n\n useEffect(\n () => {\n // Mount\n if (overlayId.current === undefined) {\n overlayId.current = context?.setOverlayItem(element);\n }\n // Update\n else {\n if (overlayId.current) {\n context?.updateOverlayItem(overlayId.current, element);\n }\n }\n },\n // To re-render the child\n [props]\n );\n\n // Unmount\n useEffect(() => {\n return () => {\n if (overlayId.current) {\n context?.removeOverlayItem(overlayId.current);\n }\n };\n }, []);\n\n // Rendering elements for SSR\n if (context?.isSSR && !overlayId.current) {\n return <View style={{ display: 'none' }}>{element}</View>;\n }\n return null;\n}\n\nfunction usePortalProvider() {\n const context = React.useContext(PortalContext);\n return context;\n}\n"]}
@@ -1,6 +1,7 @@
1
1
  import React from 'react';
2
2
  import { //@ts-ignore
3
3
  Dimensions } from 'react-native';
4
+ //@ts-ignore
4
5
  import { isRTL } from '@react-native-aria/utils';
5
6
 
6
7
  const measureOffset = ref => new Promise(resolve => {
@@ -1 +1 @@
1
- {"version":3,"sources":["useOverlayPosition.ts"],"names":["React","Dimensions","isRTL","measureOffset","ref","Promise","resolve","current","measureInWindow","x","y","width","height","top","left","useOverlayPosition","props","targetRef","overlayRef","placement","offset","crossOffset","isOpen","shouldFlip","shouldOverlapWithTrigger","position","setPosition","useState","arrowOffsetLeft","undefined","arrowOffsetTop","maxHeight","rendered","setRendered","updatePosition","overlayOffset","triggerOffset","all","requestAnimationFrame","windowHeight","windowWidth","get","positions","calculatePosition","translateRTL","targetNode","overlayNode","scrollNode","padding","boundaryElement","useEffect","useLayoutEffect","returnProps","overlayProps","style","arrowProps","replace","opts","childOffset","isContainerPositioned","overlaySize","margins","bottom","right","scrollSize","boundaryDimensions","containerOffsetWithBoundary","calculatePositionInternal","placementInput","flip","placementInfo","parsePlacement","size","crossAxis","crossSize","crossPlacement","computePosition","normalizedOffset","space","getAvailableSpace","flippedPlacementInfo","FLIPPED_DIRECTION","flippedPosition","flippedSpace","delta","getDelta","getMaxHeight","Math","min","arrowPosition","axis","containerDimensions","containerScroll","containerHeight","AXIS_SIZE","startEdgeOffset","endEdgeOffset","max","_containerOffsetWithBoundary","_margins","_padding","_isContainerPositioned","minViablePosition","maxViablePosition","floor","AXIS","CROSS_AXIS","PARSED_PLACEMENT_CACHE","input","split"],"mappings":"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","sourcesContent":["import type { PlacementAxis } from '@react-types/overlays';\nimport React, { RefObject } from 'react';\nimport type { Axis, SizeAxis } from '@react-types/overlays';\nimport {\n //@ts-ignore\n Dimensions,\n} from 'react-native';\nimport type { Placement, PositionProps } from '@react-types/overlays';\nimport { isRTL } from '@react-native-aria/utils';\n\nconst measureOffset = (ref: RefObject<any>) =>\n new Promise<IMeasureResult>((resolve) => {\n if (ref.current) {\n ref.current.measureInWindow(\n (x: number, y: number, width: number, height: number) => {\n resolve({ top: y, left: x, width, height });\n }\n );\n }\n });\n\ninterface ParsedPlacement {\n placement: PlacementAxis;\n crossPlacement: PlacementAxis;\n axis: Axis;\n crossAxis: Axis;\n size: SizeAxis;\n crossSize: SizeAxis;\n}\ninterface AriaPositionProps extends PositionProps {\n /**\n * Element that that serves as the positioning boundary.\n * @default document.body\n */\n boundaryElement?: any;\n /**\n * The ref for the element which the overlay positions itself with respect to.\n */\n targetRef: RefObject<any>;\n /**\n * The ref for the overlay element.\n */\n overlayRef: RefObject<any>;\n /**\n * A ref for the scrollable region within the overlay.\n * @default overlayRef\n */\n scrollRef?: RefObject<any>;\n /**\n * Whether the overlay should update its position automatically.\n * @default true\n */\n shouldUpdatePosition?: boolean;\n /** Handler that is called when the overlay should close. */\n onClose?: () => void;\n /** Determines whether the overlay should overlap with the trigger */\n shouldOverlapWithTrigger?: boolean;\n}\n\ntype IMeasureResult = {\n top: number;\n left: number;\n height: number;\n width: number;\n};\n\nexport function useOverlayPosition(props: AriaPositionProps) {\n let {\n targetRef,\n overlayRef,\n placement = 'bottom' as Placement,\n offset = 0,\n crossOffset = 0,\n isOpen = true,\n shouldFlip = true,\n shouldOverlapWithTrigger = false,\n } = props;\n\n let [position, setPosition] = React.useState<PositionResult>({\n position: {},\n arrowOffsetLeft: undefined,\n arrowOffsetTop: undefined,\n maxHeight: undefined,\n placement: undefined,\n });\n\n // Layout measurement happens asynchronously in RN. This causes initial flickr. Using opacity and setting it to 1 post calculation prevents that.\n let [rendered, setRendered] = React.useState(false);\n\n let updatePosition = async () => {\n const [overlayOffset, triggerOffset] = await Promise.all([\n measureOffset(overlayRef),\n measureOffset(targetRef),\n ]);\n\n // Sometimes measure returns height/width 0. Best solution would be to use onLayout callback, but that might diverege from React Aria's useOverlayPosition API. Decide later, this works for now\n if (\n !overlayOffset.width ||\n !overlayOffset.height ||\n !triggerOffset.width ||\n !triggerOffset.height\n ) {\n requestAnimationFrame(updatePosition);\n return;\n }\n\n const { height: windowHeight, width: windowWidth } = Dimensions.get(\n 'window'\n );\n\n const positions = calculatePosition({\n placement: translateRTL(placement),\n targetNode: triggerOffset,\n overlayNode: overlayOffset,\n scrollNode: overlayOffset,\n padding: 0,\n shouldFlip,\n boundaryElement: {\n top: 0,\n left: 0,\n width: windowWidth,\n height: windowHeight,\n },\n offset,\n crossOffset,\n shouldOverlapWithTrigger,\n });\n setPosition(positions);\n setRendered(true);\n };\n React.useEffect(() => {\n return () => {\n setRendered(false);\n };\n }, []);\n\n React.useLayoutEffect(() => {\n updatePosition();\n }, [placement, isOpen, offset, shouldFlip, crossOffset, shouldOverlapWithTrigger]);\n\n const returnProps = {\n rendered,\n overlayProps: {\n style: {\n ...position.position,\n },\n },\n placement: position.placement,\n arrowProps: {\n style: {\n left: position.arrowOffsetLeft,\n top: position.arrowOffsetTop,\n },\n },\n updatePosition,\n };\n\n if (position.maxHeight !== undefined) {\n //@ts-ignore\n returnProps.overlayProps.style.maxHeight = position.maxHeight;\n }\n\n return returnProps;\n}\n\nfunction translateRTL(position: any) {\n if (isRTL()) {\n return position.replace('start', 'right').replace('end', 'left');\n }\n return position.replace('start', 'left').replace('end', 'right');\n}\n\ninterface Position {\n top?: number;\n left?: number;\n bottom?: number;\n right?: number;\n}\n\ninterface Dimensions {\n width: number;\n height: number;\n top: number;\n left: number;\n scroll: Position;\n}\n\ninterface Offset {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\nexport interface PositionResult {\n position?: Position;\n arrowOffsetLeft?: number;\n arrowOffsetTop?: number;\n maxHeight?: number;\n placement: PlacementAxis | undefined;\n}\n\nconst calculatePosition = (opts: any): PositionResult => {\n let {\n placement,\n targetNode,\n overlayNode,\n scrollNode,\n padding,\n shouldFlip,\n boundaryElement,\n offset,\n crossOffset,\n shouldOverlapWithTrigger,\n } = opts;\n\n let childOffset: Offset = targetNode;\n let isContainerPositioned = false;\n let overlaySize: Offset = overlayNode;\n let margins = { top: 0, bottom: 0, left: 0, right: 0 };\n let scrollSize = scrollNode;\n let boundaryDimensions = boundaryElement;\n\n let containerOffsetWithBoundary: Offset = overlayNode;\n\n return calculatePositionInternal(\n placement,\n childOffset,\n overlaySize,\n scrollSize,\n margins,\n padding,\n shouldFlip,\n boundaryDimensions,\n containerOffsetWithBoundary,\n offset,\n crossOffset,\n isContainerPositioned,\n shouldOverlapWithTrigger\n );\n};\n\nfunction calculatePositionInternal(\n placementInput: Placement,\n childOffset: any,\n overlaySize: Offset,\n scrollSize: Offset,\n margins: Position,\n padding: number,\n flip: boolean,\n boundaryDimensions: Dimensions,\n containerOffsetWithBoundary: Offset,\n offset: number,\n crossOffset: number,\n isContainerPositioned: boolean,\n shouldOverlapWithTrigger: boolean\n): PositionResult {\n let placementInfo = parsePlacement(placementInput);\n let { size, crossAxis, crossSize, placement, crossPlacement } = placementInfo;\n let position = computePosition(\n childOffset,\n boundaryDimensions,\n overlaySize,\n placementInfo,\n offset,\n crossOffset,\n containerOffsetWithBoundary,\n isContainerPositioned\n );\n let normalizedOffset = offset;\n let space = getAvailableSpace(\n boundaryDimensions,\n containerOffsetWithBoundary,\n childOffset,\n margins,\n padding + offset,\n placementInfo\n );\n\n if (flip && scrollSize[size] > space) {\n let flippedPlacementInfo = parsePlacement(\n `${FLIPPED_DIRECTION[placement]} ${crossPlacement}` as Placement\n );\n let flippedPosition = computePosition(\n childOffset,\n boundaryDimensions,\n overlaySize,\n flippedPlacementInfo,\n offset,\n crossOffset,\n containerOffsetWithBoundary,\n isContainerPositioned\n );\n let flippedSpace = getAvailableSpace(\n boundaryDimensions,\n containerOffsetWithBoundary,\n childOffset,\n margins,\n padding + offset,\n flippedPlacementInfo\n );\n\n // If the available space for the flipped position is greater than the original available space, flip.\n if (flippedSpace > space) {\n placementInfo = flippedPlacementInfo;\n position = flippedPosition;\n normalizedOffset = offset;\n }\n }\n\n let delta = getDelta(\n crossAxis,\n position[crossAxis],\n overlaySize[crossSize],\n boundaryDimensions,\n padding\n );\n position[crossAxis] += delta;\n\n let maxHeight = getMaxHeight(\n position,\n boundaryDimensions,\n containerOffsetWithBoundary,\n childOffset,\n margins,\n padding\n );\n\n overlaySize.height = Math.min(overlaySize.height, maxHeight);\n\n position = computePosition(\n childOffset,\n boundaryDimensions,\n overlaySize,\n placementInfo,\n normalizedOffset,\n crossOffset,\n containerOffsetWithBoundary,\n isContainerPositioned\n );\n\n delta = getDelta(\n crossAxis,\n position[crossAxis],\n overlaySize[crossSize],\n boundaryDimensions,\n padding\n );\n position[crossAxis] += delta;\n\n let arrowPosition: Position = {};\n arrowPosition[crossAxis] =\n childOffset[crossAxis] - position[crossAxis] + childOffset[crossSize] / 2;\n\n if (shouldOverlapWithTrigger) {\n position[FLIPPED_DIRECTION[placementInfo.placement]] =\n position[FLIPPED_DIRECTION[placementInfo.placement]] - childOffset[size];\n }\n\n return {\n position,\n maxHeight,\n arrowOffsetLeft: arrowPosition.left,\n arrowOffsetTop: arrowPosition.top,\n placement: placementInfo.placement,\n };\n}\n\nfunction getDelta(\n axis: Axis,\n offset: number,\n size: number,\n containerDimensions: Dimensions,\n padding: number\n) {\n //@ts-ignore\n let containerScroll = containerDimensions[axis];\n //@ts-ignore\n let containerHeight = containerDimensions[AXIS_SIZE[axis]];\n\n let startEdgeOffset = offset - padding - containerScroll;\n let endEdgeOffset = offset + padding - containerScroll + size;\n\n if (startEdgeOffset < 0) {\n return -startEdgeOffset;\n } else if (endEdgeOffset > containerHeight) {\n return Math.max(containerHeight - endEdgeOffset, -startEdgeOffset);\n } else {\n return 0;\n }\n}\n\nfunction getMaxHeight(\n position: Position,\n boundaryDimensions: Dimensions,\n _containerOffsetWithBoundary: Offset,\n childOffset: Offset,\n _margins: Position,\n _padding: number\n) {\n return position.top != null\n ? // We want the distance between the top of the overlay to the bottom of the boundary\n Math.max(\n 0,\n boundaryDimensions.height - // this is the bottom of the boundary\n position.top // this is the top of the overlay\n )\n : // We want the distance between the top of the trigger to the top of the boundary\n Math.max(\n 0,\n childOffset.top - // this is the top of the trigger\n 0 // this is the top of the boundary\n );\n}\n\nfunction computePosition(\n childOffset: any,\n boundaryDimensions: Dimensions,\n overlaySize: Offset,\n placementInfo: ParsedPlacement,\n offset: number,\n crossOffset: number,\n _containerOffsetWithBoundary: Offset,\n _isContainerPositioned: boolean\n) {\n let {\n placement,\n crossPlacement,\n axis,\n crossAxis,\n size,\n crossSize,\n } = placementInfo;\n let position: any = {};\n //@ts-ignore\n position[crossAxis] = childOffset[crossAxis];\n\n if (crossPlacement === 'center') {\n position[crossAxis] +=\n (childOffset[crossSize] - overlaySize[crossSize]) / 2;\n } else if (crossPlacement !== crossAxis) {\n position[crossAxis] += childOffset[crossSize] - overlaySize[crossSize];\n }\n\n position[crossAxis] += crossOffset;\n\n // this is button center position - the overlay size + half of the button to align bottom of overlay with button center\n let minViablePosition =\n childOffset[crossAxis] +\n childOffset[crossSize] / 2 -\n overlaySize[crossSize];\n // this is button position of center, aligns top of overlay with button center\n let maxViablePosition = childOffset[crossAxis] + childOffset[crossSize] / 2;\n\n // clamp it into the range of the min/max positions\n position[crossAxis] = Math.min(\n Math.max(minViablePosition, position[crossAxis]),\n maxViablePosition\n );\n\n // Floor these so the position isn't placed on a partial pixel, only whole pixels. Shouldn't matter if it was floored or ceiled, so chose one.\n if (placement === axis) {\n // If the container is positioned (non-static), then we use the container's actual\n // height, as `bottom` will be relative to this height. But if the container is static,\n // then it can only be the `document.body`, and `bottom` will be relative to _its_\n // container, which should be as large as boundaryDimensions.\n const containerHeight = boundaryDimensions[size];\n position[FLIPPED_DIRECTION[axis]] = Math.floor(\n containerHeight - childOffset[axis] + offset\n );\n } else {\n position[axis] = Math.floor(childOffset[axis] + childOffset[size] + offset);\n }\n\n return position;\n}\n\nfunction getAvailableSpace(\n boundaryDimensions: Dimensions,\n _containerOffsetWithBoundary: Offset,\n childOffset: any,\n _margins: Position,\n padding: number,\n placementInfo: ParsedPlacement\n) {\n let { placement, axis, size } = placementInfo;\n if (placement === axis) {\n return Math.max(0, childOffset[axis] - padding);\n }\n\n return Math.max(\n 0,\n boundaryDimensions[size] - childOffset[axis] - childOffset[size] - padding\n );\n}\n\nconst AXIS: any = {\n top: 'top',\n bottom: 'top',\n left: 'left',\n right: 'left',\n};\n\nconst FLIPPED_DIRECTION: any = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n};\n\nconst CROSS_AXIS: any = {\n top: 'left',\n left: 'top',\n};\n\nconst AXIS_SIZE: any = {\n top: 'height',\n left: 'width',\n};\n\ninterface Position {\n top?: number;\n left?: number;\n bottom?: number;\n right?: number;\n}\n\ninterface Dimensions {\n width: number;\n height: number;\n top: number;\n left: number;\n scroll: Position;\n}\n\ninterface Offset {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\nconst PARSED_PLACEMENT_CACHE: any = {};\n\nfunction parsePlacement(input: Placement): ParsedPlacement {\n if (PARSED_PLACEMENT_CACHE[input]) {\n return PARSED_PLACEMENT_CACHE[input];\n }\n\n let [placement, crossPlacement] = input.split(' ');\n let axis: Axis = AXIS[placement] || 'right';\n let crossAxis: Axis = CROSS_AXIS[axis];\n\n if (!AXIS[crossPlacement]) {\n crossPlacement = 'center';\n }\n\n let size = AXIS_SIZE[axis];\n let crossSize = AXIS_SIZE[crossAxis];\n PARSED_PLACEMENT_CACHE[input] = {\n placement,\n crossPlacement,\n axis,\n crossAxis,\n size,\n crossSize,\n };\n return PARSED_PLACEMENT_CACHE[input];\n}\n"]}
1
+ {"version":3,"sources":["useOverlayPosition.ts"],"names":["React","Dimensions","isRTL","measureOffset","ref","Promise","resolve","current","measureInWindow","x","y","width","height","top","left","useOverlayPosition","props","targetRef","overlayRef","placement","offset","crossOffset","isOpen","shouldFlip","shouldOverlapWithTrigger","position","setPosition","useState","arrowOffsetLeft","undefined","arrowOffsetTop","maxHeight","rendered","setRendered","updatePosition","overlayOffset","triggerOffset","all","requestAnimationFrame","windowHeight","windowWidth","get","positions","calculatePosition","translateRTL","targetNode","overlayNode","scrollNode","padding","boundaryElement","useEffect","useLayoutEffect","returnProps","overlayProps","style","arrowProps","replace","opts","childOffset","isContainerPositioned","overlaySize","margins","bottom","right","scrollSize","boundaryDimensions","containerOffsetWithBoundary","calculatePositionInternal","placementInput","flip","placementInfo","parsePlacement","size","crossAxis","crossSize","crossPlacement","computePosition","normalizedOffset","space","getAvailableSpace","flippedPlacementInfo","FLIPPED_DIRECTION","flippedPosition","flippedSpace","delta","getDelta","getMaxHeight","Math","min","arrowPosition","axis","containerDimensions","containerScroll","containerHeight","AXIS_SIZE","startEdgeOffset","endEdgeOffset","max","_containerOffsetWithBoundary","_margins","_padding","_isContainerPositioned","minViablePosition","maxViablePosition","floor","AXIS","CROSS_AXIS","PARSED_PLACEMENT_CACHE","input","split"],"mappings":"AACA,OAAOA,KAAP,MAAiC,OAAjC;AAEA,SACE;AACAC,UAFF,QAGO,cAHP;AAKA;AACA,SAASC,KAAT,QAAsB,0BAAtB;;AAEA,MAAMC,aAAa,GAAIC,GAAD,IACpB,IAAIC,OAAJ,CAA6BC,OAAD,IAAa;AACvC,MAAIF,GAAG,CAACG,OAAR,EAAiB;AACfH,IAAAA,GAAG,CAACG,OAAJ,CAAYC,eAAZ,CACE,CAACC,CAAD,EAAYC,CAAZ,EAAuBC,KAAvB,EAAsCC,MAAtC,KAAyD;AACvDN,MAAAA,OAAO,CAAC;AAAEO,QAAAA,GAAG,EAAEH,CAAP;AAAUI,QAAAA,IAAI,EAAEL,CAAhB;AAAmBE,QAAAA,KAAnB;AAA0BC,QAAAA;AAA1B,OAAD,CAAP;AACD,KAHH;AAKD;AACF,CARD,CADF;;AAwDA,OAAO,SAASG,kBAAT,CAA4BC,KAA5B,EAAsD;AAC3D,MAAI;AACFC,IAAAA,SADE;AAEFC,IAAAA,UAFE;AAGFC,IAAAA,SAAS,GAAG,QAHV;AAIFC,IAAAA,MAAM,GAAG,CAJP;AAKFC,IAAAA,WAAW,GAAG,CALZ;AAMFC,IAAAA,MAAM,GAAG,IANP;AAOFC,IAAAA,UAAU,GAAG,IAPX;AAQFC,IAAAA,wBAAwB,GAAG;AARzB,MASAR,KATJ;AAWA,MAAI,CAACS,QAAD,EAAWC,WAAX,IAA0B1B,KAAK,CAAC2B,QAAN,CAA+B;AAC3DF,IAAAA,QAAQ,EAAE,EADiD;AAE3DG,IAAAA,eAAe,EAAEC,SAF0C;AAG3DC,IAAAA,cAAc,EAAED,SAH2C;AAI3DE,IAAAA,SAAS,EAAEF,SAJgD;AAK3DV,IAAAA,SAAS,EAAEU;AALgD,GAA/B,CAA9B,CAZ2D,CAoB3D;;AACA,MAAI,CAACG,QAAD,EAAWC,WAAX,IAA0BjC,KAAK,CAAC2B,QAAN,CAAe,KAAf,CAA9B;;AAEA,MAAIO,cAAc,GAAG,YAAY;AAC/B,UAAM,CAACC,aAAD,EAAgBC,aAAhB,IAAiC,MAAM/B,OAAO,CAACgC,GAAR,CAAY,CACvDlC,aAAa,CAACe,UAAD,CAD0C,EAEvDf,aAAa,CAACc,SAAD,CAF0C,CAAZ,CAA7C,CAD+B,CAM/B;;AACA,QACE,CAACkB,aAAa,CAACxB,KAAf,IACA,CAACwB,aAAa,CAACvB,MADf,IAEA,CAACwB,aAAa,CAACzB,KAFf,IAGA,CAACyB,aAAa,CAACxB,MAJjB,EAKE;AACA0B,MAAAA,qBAAqB,CAACJ,cAAD,CAArB;AACA;AACD;;AAED,UAAM;AAAEtB,MAAAA,MAAM,EAAE2B,YAAV;AAAwB5B,MAAAA,KAAK,EAAE6B;AAA/B,QAA+CvC,UAAU,CAACwC,GAAX,CACnD,QADmD,CAArD;AAIA,UAAMC,SAAS,GAAGC,iBAAiB,CAAC;AAClCxB,MAAAA,SAAS,EAAEyB,YAAY,CAACzB,SAAD,CADW;AAElC0B,MAAAA,UAAU,EAAET,aAFsB;AAGlCU,MAAAA,WAAW,EAAEX,aAHqB;AAIlCY,MAAAA,UAAU,EAAEZ,aAJsB;AAKlCa,MAAAA,OAAO,EAAE,CALyB;AAMlCzB,MAAAA,UANkC;AAOlC0B,MAAAA,eAAe,EAAE;AACfpC,QAAAA,GAAG,EAAE,CADU;AAEfC,QAAAA,IAAI,EAAE,CAFS;AAGfH,QAAAA,KAAK,EAAE6B,WAHQ;AAIf5B,QAAAA,MAAM,EAAE2B;AAJO,OAPiB;AAalCnB,MAAAA,MAbkC;AAclCC,MAAAA,WAdkC;AAelCG,MAAAA;AAfkC,KAAD,CAAnC;AAiBAE,IAAAA,WAAW,CAACgB,SAAD,CAAX;AACAT,IAAAA,WAAW,CAAC,IAAD,CAAX;AACD,GAxCD;;AAyCAjC,EAAAA,KAAK,CAACkD,SAAN,CAAgB,MAAM;AACpB,WAAO,MAAM;AACXjB,MAAAA,WAAW,CAAC,KAAD,CAAX;AACD,KAFD;AAGD,GAJD,EAIG,EAJH;AAMAjC,EAAAA,KAAK,CAACmD,eAAN,CAAsB,MAAM;AAC1BjB,IAAAA,cAAc;AACf,GAFD,EAEG,CACDf,SADC,EAEDG,MAFC,EAGDF,MAHC,EAIDG,UAJC,EAKDF,WALC,EAMDG,wBANC,CAFH;AAWA,QAAM4B,WAAW,GAAG;AAClBpB,IAAAA,QADkB;AAElBqB,IAAAA,YAAY,EAAE;AACZC,MAAAA,KAAK,EAAE,EACL,GAAG7B,QAAQ,CAACA;AADP;AADK,KAFI;AAOlBN,IAAAA,SAAS,EAAEM,QAAQ,CAACN,SAPF;AAQlBoC,IAAAA,UAAU,EAAE;AACVD,MAAAA,KAAK,EAAE;AACLxC,QAAAA,IAAI,EAAEW,QAAQ,CAACG,eADV;AAELf,QAAAA,GAAG,EAAEY,QAAQ,CAACK;AAFT;AADG,KARM;AAclBI,IAAAA;AAdkB,GAApB;;AAiBA,MAAIT,QAAQ,CAACM,SAAT,KAAuBF,SAA3B,EAAsC;AACpC;AACAuB,IAAAA,WAAW,CAACC,YAAZ,CAAyBC,KAAzB,CAA+BvB,SAA/B,GAA2CN,QAAQ,CAACM,SAApD;AACD;;AAED,SAAOqB,WAAP;AACD;;AAED,SAASR,YAAT,CAAsBnB,QAAtB,EAAqC;AACnC,MAAIvB,KAAK,EAAT,EAAa;AACX,WAAOuB,QAAQ,CAAC+B,OAAT,CAAiB,OAAjB,EAA0B,OAA1B,EAAmCA,OAAnC,CAA2C,KAA3C,EAAkD,MAAlD,CAAP;AACD;;AACD,SAAO/B,QAAQ,CAAC+B,OAAT,CAAiB,OAAjB,EAA0B,MAA1B,EAAkCA,OAAlC,CAA0C,KAA1C,EAAiD,OAAjD,CAAP;AACD;;AAgCD,MAAMb,iBAAiB,GAAIc,IAAD,IAA+B;AACvD,MAAI;AACFtC,IAAAA,SADE;AAEF0B,IAAAA,UAFE;AAGFC,IAAAA,WAHE;AAIFC,IAAAA,UAJE;AAKFC,IAAAA,OALE;AAMFzB,IAAAA,UANE;AAOF0B,IAAAA,eAPE;AAQF7B,IAAAA,MARE;AASFC,IAAAA,WATE;AAUFG,IAAAA;AAVE,MAWAiC,IAXJ;AAaA,MAAIC,WAAmB,GAAGb,UAA1B;AACA,MAAIc,qBAAqB,GAAG,KAA5B;AACA,MAAIC,WAAmB,GAAGd,WAA1B;AACA,MAAIe,OAAO,GAAG;AAAEhD,IAAAA,GAAG,EAAE,CAAP;AAAUiD,IAAAA,MAAM,EAAE,CAAlB;AAAqBhD,IAAAA,IAAI,EAAE,CAA3B;AAA8BiD,IAAAA,KAAK,EAAE;AAArC,GAAd;AACA,MAAIC,UAAU,GAAGjB,UAAjB;AACA,MAAIkB,kBAAkB,GAAGhB,eAAzB;AAEA,MAAIiB,2BAAmC,GAAGpB,WAA1C;AAEA,SAAOqB,yBAAyB,CAC9BhD,SAD8B,EAE9BuC,WAF8B,EAG9BE,WAH8B,EAI9BI,UAJ8B,EAK9BH,OAL8B,EAM9Bb,OAN8B,EAO9BzB,UAP8B,EAQ9B0C,kBAR8B,EAS9BC,2BAT8B,EAU9B9C,MAV8B,EAW9BC,WAX8B,EAY9BsC,qBAZ8B,EAa9BnC,wBAb8B,CAAhC;AAeD,CAtCD;;AAwCA,SAAS2C,yBAAT,CACEC,cADF,EAEEV,WAFF,EAGEE,WAHF,EAIEI,UAJF,EAKEH,OALF,EAMEb,OANF,EAOEqB,IAPF,EAQEJ,kBARF,EASEC,2BATF,EAUE9C,MAVF,EAWEC,WAXF,EAYEsC,qBAZF,EAaEnC,wBAbF,EAckB;AAChB,MAAI8C,aAAa,GAAGC,cAAc,CAACH,cAAD,CAAlC;AACA,MAAI;AAAEI,IAAAA,IAAF;AAAQC,IAAAA,SAAR;AAAmBC,IAAAA,SAAnB;AAA8BvD,IAAAA,SAA9B;AAAyCwD,IAAAA;AAAzC,MAA4DL,aAAhE;AACA,MAAI7C,QAAQ,GAAGmD,eAAe,CAC5BlB,WAD4B,EAE5BO,kBAF4B,EAG5BL,WAH4B,EAI5BU,aAJ4B,EAK5BlD,MAL4B,EAM5BC,WAN4B,EAO5B6C,2BAP4B,EAQ5BP,qBAR4B,CAA9B;AAUA,MAAIkB,gBAAgB,GAAGzD,MAAvB;AACA,MAAI0D,KAAK,GAAGC,iBAAiB,CAC3Bd,kBAD2B,EAE3BC,2BAF2B,EAG3BR,WAH2B,EAI3BG,OAJ2B,EAK3Bb,OAAO,GAAG5B,MALiB,EAM3BkD,aAN2B,CAA7B;;AASA,MAAID,IAAI,IAAIL,UAAU,CAACQ,IAAD,CAAV,GAAmBM,KAA/B,EAAsC;AACpC,QAAIE,oBAAoB,GAAGT,cAAc,CACtC,GAAEU,iBAAiB,CAAC9D,SAAD,CAAY,IAAGwD,cAAe,EADX,CAAzC;AAGA,QAAIO,eAAe,GAAGN,eAAe,CACnClB,WADmC,EAEnCO,kBAFmC,EAGnCL,WAHmC,EAInCoB,oBAJmC,EAKnC5D,MALmC,EAMnCC,WANmC,EAOnC6C,2BAPmC,EAQnCP,qBARmC,CAArC;AAUA,QAAIwB,YAAY,GAAGJ,iBAAiB,CAClCd,kBADkC,EAElCC,2BAFkC,EAGlCR,WAHkC,EAIlCG,OAJkC,EAKlCb,OAAO,GAAG5B,MALwB,EAMlC4D,oBANkC,CAApC,CAdoC,CAuBpC;;AACA,QAAIG,YAAY,GAAGL,KAAnB,EAA0B;AACxBR,MAAAA,aAAa,GAAGU,oBAAhB;AACAvD,MAAAA,QAAQ,GAAGyD,eAAX;AACAL,MAAAA,gBAAgB,GAAGzD,MAAnB;AACD;AACF;;AAED,MAAIgE,KAAK,GAAGC,QAAQ,CAClBZ,SADkB,EAElBhD,QAAQ,CAACgD,SAAD,CAFU,EAGlBb,WAAW,CAACc,SAAD,CAHO,EAIlBT,kBAJkB,EAKlBjB,OALkB,CAApB;AAOAvB,EAAAA,QAAQ,CAACgD,SAAD,CAAR,IAAuBW,KAAvB;AAEA,MAAIrD,SAAS,GAAGuD,YAAY,CAC1B7D,QAD0B,EAE1BwC,kBAF0B,EAG1BC,2BAH0B,EAI1BR,WAJ0B,EAK1BG,OAL0B,EAM1Bb,OAN0B,CAA5B;AASAY,EAAAA,WAAW,CAAChD,MAAZ,GAAqB2E,IAAI,CAACC,GAAL,CAAS5B,WAAW,CAAChD,MAArB,EAA6BmB,SAA7B,CAArB;AAEAN,EAAAA,QAAQ,GAAGmD,eAAe,CACxBlB,WADwB,EAExBO,kBAFwB,EAGxBL,WAHwB,EAIxBU,aAJwB,EAKxBO,gBALwB,EAMxBxD,WANwB,EAOxB6C,2BAPwB,EAQxBP,qBARwB,CAA1B;AAWAyB,EAAAA,KAAK,GAAGC,QAAQ,CACdZ,SADc,EAEdhD,QAAQ,CAACgD,SAAD,CAFM,EAGdb,WAAW,CAACc,SAAD,CAHG,EAIdT,kBAJc,EAKdjB,OALc,CAAhB;AAOAvB,EAAAA,QAAQ,CAACgD,SAAD,CAAR,IAAuBW,KAAvB;AAEA,MAAIK,aAAuB,GAAG,EAA9B;AACAA,EAAAA,aAAa,CAAChB,SAAD,CAAb,GACEf,WAAW,CAACe,SAAD,CAAX,GAAyBhD,QAAQ,CAACgD,SAAD,CAAjC,GAA+Cf,WAAW,CAACgB,SAAD,CAAX,GAAyB,CAD1E;;AAGA,MAAIlD,wBAAJ,EAA8B;AAC5BC,IAAAA,QAAQ,CAACwD,iBAAiB,CAACX,aAAa,CAACnD,SAAf,CAAlB,CAAR,GACEM,QAAQ,CAACwD,iBAAiB,CAACX,aAAa,CAACnD,SAAf,CAAlB,CAAR,GAAuDuC,WAAW,CAACc,IAAD,CADpE;AAED;;AAED,SAAO;AACL/C,IAAAA,QADK;AAELM,IAAAA,SAFK;AAGLH,IAAAA,eAAe,EAAE6D,aAAa,CAAC3E,IAH1B;AAILgB,IAAAA,cAAc,EAAE2D,aAAa,CAAC5E,GAJzB;AAKLM,IAAAA,SAAS,EAAEmD,aAAa,CAACnD;AALpB,GAAP;AAOD;;AAED,SAASkE,QAAT,CACEK,IADF,EAEEtE,MAFF,EAGEoD,IAHF,EAIEmB,mBAJF,EAKE3C,OALF,EAME;AACA;AACA,MAAI4C,eAAe,GAAGD,mBAAmB,CAACD,IAAD,CAAzC,CAFA,CAGA;;AACA,MAAIG,eAAe,GAAGF,mBAAmB,CAACG,SAAS,CAACJ,IAAD,CAAV,CAAzC;AAEA,MAAIK,eAAe,GAAG3E,MAAM,GAAG4B,OAAT,GAAmB4C,eAAzC;AACA,MAAII,aAAa,GAAG5E,MAAM,GAAG4B,OAAT,GAAmB4C,eAAnB,GAAqCpB,IAAzD;;AAEA,MAAIuB,eAAe,GAAG,CAAtB,EAAyB;AACvB,WAAO,CAACA,eAAR;AACD,GAFD,MAEO,IAAIC,aAAa,GAAGH,eAApB,EAAqC;AAC1C,WAAON,IAAI,CAACU,GAAL,CAASJ,eAAe,GAAGG,aAA3B,EAA0C,CAACD,eAA3C,CAAP;AACD,GAFM,MAEA;AACL,WAAO,CAAP;AACD;AACF;;AAED,SAAST,YAAT,CACE7D,QADF,EAEEwC,kBAFF,EAGEiC,4BAHF,EAIExC,WAJF,EAKEyC,QALF,EAMEC,QANF,EAOE;AACA,SAAO3E,QAAQ,CAACZ,GAAT,IAAgB,IAAhB,GACH;AACA0E,EAAAA,IAAI,CAACU,GAAL,CACE,CADF,EAEEhC,kBAAkB,CAACrD,MAAnB,GAA4B;AAC1Ba,EAAAA,QAAQ,CAACZ,GAHb,CAGiB;AAHjB,GAFG,GAOH;AACA0E,EAAAA,IAAI,CAACU,GAAL,CACE,CADF,EAEEvC,WAAW,CAAC7C,GAAZ,GAAkB;AAChB,GAHJ,CAGM;AAHN,GARJ;AAaD;;AAED,SAAS+D,eAAT,CACElB,WADF,EAEEO,kBAFF,EAGEL,WAHF,EAIEU,aAJF,EAKElD,MALF,EAMEC,WANF,EAOE6E,4BAPF,EAQEG,sBARF,EASE;AACA,MAAI;AACFlF,IAAAA,SADE;AAEFwD,IAAAA,cAFE;AAGFe,IAAAA,IAHE;AAIFjB,IAAAA,SAJE;AAKFD,IAAAA,IALE;AAMFE,IAAAA;AANE,MAOAJ,aAPJ;AAQA,MAAI7C,QAAa,GAAG,EAApB,CATA,CAUA;;AACAA,EAAAA,QAAQ,CAACgD,SAAD,CAAR,GAAsBf,WAAW,CAACe,SAAD,CAAjC;;AAEA,MAAIE,cAAc,KAAK,QAAvB,EAAiC;AAC/BlD,IAAAA,QAAQ,CAACgD,SAAD,CAAR,IACE,CAACf,WAAW,CAACgB,SAAD,CAAX,GAAyBd,WAAW,CAACc,SAAD,CAArC,IAAoD,CADtD;AAED,GAHD,MAGO,IAAIC,cAAc,KAAKF,SAAvB,EAAkC;AACvChD,IAAAA,QAAQ,CAACgD,SAAD,CAAR,IAAuBf,WAAW,CAACgB,SAAD,CAAX,GAAyBd,WAAW,CAACc,SAAD,CAA3D;AACD;;AAEDjD,EAAAA,QAAQ,CAACgD,SAAD,CAAR,IAAuBpD,WAAvB,CApBA,CAsBA;;AACA,MAAIiF,iBAAiB,GACnB5C,WAAW,CAACe,SAAD,CAAX,GACAf,WAAW,CAACgB,SAAD,CAAX,GAAyB,CADzB,GAEAd,WAAW,CAACc,SAAD,CAHb,CAvBA,CA2BA;;AACA,MAAI6B,iBAAiB,GAAG7C,WAAW,CAACe,SAAD,CAAX,GAAyBf,WAAW,CAACgB,SAAD,CAAX,GAAyB,CAA1E,CA5BA,CA8BA;;AACAjD,EAAAA,QAAQ,CAACgD,SAAD,CAAR,GAAsBc,IAAI,CAACC,GAAL,CACpBD,IAAI,CAACU,GAAL,CAASK,iBAAT,EAA4B7E,QAAQ,CAACgD,SAAD,CAApC,CADoB,EAEpB8B,iBAFoB,CAAtB,CA/BA,CAoCA;;AACA,MAAIpF,SAAS,KAAKuE,IAAlB,EAAwB;AACtB;AACA;AACA;AACA;AACA,UAAMG,eAAe,GAAG5B,kBAAkB,CAACO,IAAD,CAA1C;AACA/C,IAAAA,QAAQ,CAACwD,iBAAiB,CAACS,IAAD,CAAlB,CAAR,GAAoCH,IAAI,CAACiB,KAAL,CAClCX,eAAe,GAAGnC,WAAW,CAACgC,IAAD,CAA7B,GAAsCtE,MADJ,CAApC;AAGD,GATD,MASO;AACLK,IAAAA,QAAQ,CAACiE,IAAD,CAAR,GAAiBH,IAAI,CAACiB,KAAL,CAAW9C,WAAW,CAACgC,IAAD,CAAX,GAAoBhC,WAAW,CAACc,IAAD,CAA/B,GAAwCpD,MAAnD,CAAjB;AACD;;AAED,SAAOK,QAAP;AACD;;AAED,SAASsD,iBAAT,CACEd,kBADF,EAEEiC,4BAFF,EAGExC,WAHF,EAIEyC,QAJF,EAKEnD,OALF,EAMEsB,aANF,EAOE;AACA,MAAI;AAAEnD,IAAAA,SAAF;AAAauE,IAAAA,IAAb;AAAmBlB,IAAAA;AAAnB,MAA4BF,aAAhC;;AACA,MAAInD,SAAS,KAAKuE,IAAlB,EAAwB;AACtB,WAAOH,IAAI,CAACU,GAAL,CAAS,CAAT,EAAYvC,WAAW,CAACgC,IAAD,CAAX,GAAoB1C,OAAhC,CAAP;AACD;;AAED,SAAOuC,IAAI,CAACU,GAAL,CACL,CADK,EAELhC,kBAAkB,CAACO,IAAD,CAAlB,GAA2Bd,WAAW,CAACgC,IAAD,CAAtC,GAA+ChC,WAAW,CAACc,IAAD,CAA1D,GAAmExB,OAF9D,CAAP;AAID;;AAED,MAAMyD,IAAS,GAAG;AAChB5F,EAAAA,GAAG,EAAE,KADW;AAEhBiD,EAAAA,MAAM,EAAE,KAFQ;AAGhBhD,EAAAA,IAAI,EAAE,MAHU;AAIhBiD,EAAAA,KAAK,EAAE;AAJS,CAAlB;AAOA,MAAMkB,iBAAsB,GAAG;AAC7BpE,EAAAA,GAAG,EAAE,QADwB;AAE7BiD,EAAAA,MAAM,EAAE,KAFqB;AAG7BhD,EAAAA,IAAI,EAAE,OAHuB;AAI7BiD,EAAAA,KAAK,EAAE;AAJsB,CAA/B;AAOA,MAAM2C,UAAe,GAAG;AACtB7F,EAAAA,GAAG,EAAE,MADiB;AAEtBC,EAAAA,IAAI,EAAE;AAFgB,CAAxB;AAKA,MAAMgF,SAAc,GAAG;AACrBjF,EAAAA,GAAG,EAAE,QADgB;AAErBC,EAAAA,IAAI,EAAE;AAFe,CAAvB;AA2BA,MAAM6F,sBAA2B,GAAG,EAApC;;AAEA,SAASpC,cAAT,CAAwBqC,KAAxB,EAA2D;AACzD,MAAID,sBAAsB,CAACC,KAAD,CAA1B,EAAmC;AACjC,WAAOD,sBAAsB,CAACC,KAAD,CAA7B;AACD;;AAED,MAAI,CAACzF,SAAD,EAAYwD,cAAZ,IAA8BiC,KAAK,CAACC,KAAN,CAAY,GAAZ,CAAlC;AACA,MAAInB,IAAU,GAAGe,IAAI,CAACtF,SAAD,CAAJ,IAAmB,OAApC;AACA,MAAIsD,SAAe,GAAGiC,UAAU,CAAChB,IAAD,CAAhC;;AAEA,MAAI,CAACe,IAAI,CAAC9B,cAAD,CAAT,EAA2B;AACzBA,IAAAA,cAAc,GAAG,QAAjB;AACD;;AAED,MAAIH,IAAI,GAAGsB,SAAS,CAACJ,IAAD,CAApB;AACA,MAAIhB,SAAS,GAAGoB,SAAS,CAACrB,SAAD,CAAzB;AACAkC,EAAAA,sBAAsB,CAACC,KAAD,CAAtB,GAAgC;AAC9BzF,IAAAA,SAD8B;AAE9BwD,IAAAA,cAF8B;AAG9Be,IAAAA,IAH8B;AAI9BjB,IAAAA,SAJ8B;AAK9BD,IAAAA,IAL8B;AAM9BE,IAAAA;AAN8B,GAAhC;AAQA,SAAOiC,sBAAsB,CAACC,KAAD,CAA7B;AACD","sourcesContent":["import type { PlacementAxis } from '@react-types/overlays';\nimport React, { RefObject } from 'react';\nimport type { Axis, SizeAxis } from '@react-types/overlays';\nimport {\n //@ts-ignore\n Dimensions,\n} from 'react-native';\nimport type { Placement, PositionProps } from '@react-types/overlays';\n//@ts-ignore\nimport { isRTL } from '@react-native-aria/utils';\n\nconst measureOffset = (ref: RefObject<any>) =>\n new Promise<IMeasureResult>((resolve) => {\n if (ref.current) {\n ref.current.measureInWindow(\n (x: number, y: number, width: number, height: number) => {\n resolve({ top: y, left: x, width, height });\n }\n );\n }\n });\n\ninterface ParsedPlacement {\n placement: PlacementAxis;\n crossPlacement: PlacementAxis;\n axis: Axis;\n crossAxis: Axis;\n size: SizeAxis;\n crossSize: SizeAxis;\n}\ninterface AriaPositionProps extends PositionProps {\n /**\n * Element that that serves as the positioning boundary.\n * @default document.body\n */\n boundaryElement?: any;\n /**\n * The ref for the element which the overlay positions itself with respect to.\n */\n targetRef: RefObject<any>;\n /**\n * The ref for the overlay element.\n */\n overlayRef: RefObject<any>;\n /**\n * A ref for the scrollable region within the overlay.\n * @default overlayRef\n */\n scrollRef?: RefObject<any>;\n /**\n * Whether the overlay should update its position automatically.\n * @default true\n */\n shouldUpdatePosition?: boolean;\n /** Handler that is called when the overlay should close. */\n onClose?: () => void;\n /** Determines whether the overlay should overlap with the trigger */\n shouldOverlapWithTrigger?: boolean;\n}\n\ntype IMeasureResult = {\n top: number;\n left: number;\n height: number;\n width: number;\n};\n\nexport function useOverlayPosition(props: AriaPositionProps) {\n let {\n targetRef,\n overlayRef,\n placement = 'bottom' as Placement,\n offset = 0,\n crossOffset = 0,\n isOpen = true,\n shouldFlip = true,\n shouldOverlapWithTrigger = false,\n } = props;\n\n let [position, setPosition] = React.useState<PositionResult>({\n position: {},\n arrowOffsetLeft: undefined,\n arrowOffsetTop: undefined,\n maxHeight: undefined,\n placement: undefined,\n });\n\n // Layout measurement happens asynchronously in RN. This causes initial flickr. Using opacity and setting it to 1 post calculation prevents that.\n let [rendered, setRendered] = React.useState(false);\n\n let updatePosition = async () => {\n const [overlayOffset, triggerOffset] = await Promise.all([\n measureOffset(overlayRef),\n measureOffset(targetRef),\n ]);\n\n // Sometimes measure returns height/width 0. Best solution would be to use onLayout callback, but that might diverege from React Aria's useOverlayPosition API. Decide later, this works for now\n if (\n !overlayOffset.width ||\n !overlayOffset.height ||\n !triggerOffset.width ||\n !triggerOffset.height\n ) {\n requestAnimationFrame(updatePosition);\n return;\n }\n\n const { height: windowHeight, width: windowWidth } = Dimensions.get(\n 'window'\n );\n\n const positions = calculatePosition({\n placement: translateRTL(placement),\n targetNode: triggerOffset,\n overlayNode: overlayOffset,\n scrollNode: overlayOffset,\n padding: 0,\n shouldFlip,\n boundaryElement: {\n top: 0,\n left: 0,\n width: windowWidth,\n height: windowHeight,\n },\n offset,\n crossOffset,\n shouldOverlapWithTrigger,\n });\n setPosition(positions);\n setRendered(true);\n };\n React.useEffect(() => {\n return () => {\n setRendered(false);\n };\n }, []);\n\n React.useLayoutEffect(() => {\n updatePosition();\n }, [\n placement,\n isOpen,\n offset,\n shouldFlip,\n crossOffset,\n shouldOverlapWithTrigger,\n ]);\n\n const returnProps = {\n rendered,\n overlayProps: {\n style: {\n ...position.position,\n },\n },\n placement: position.placement,\n arrowProps: {\n style: {\n left: position.arrowOffsetLeft,\n top: position.arrowOffsetTop,\n },\n },\n updatePosition,\n };\n\n if (position.maxHeight !== undefined) {\n //@ts-ignore\n returnProps.overlayProps.style.maxHeight = position.maxHeight;\n }\n\n return returnProps;\n}\n\nfunction translateRTL(position: any) {\n if (isRTL()) {\n return position.replace('start', 'right').replace('end', 'left');\n }\n return position.replace('start', 'left').replace('end', 'right');\n}\n\ninterface Position {\n top?: number;\n left?: number;\n bottom?: number;\n right?: number;\n}\n\ninterface Dimensions {\n width: number;\n height: number;\n top: number;\n left: number;\n scroll: Position;\n}\n\ninterface Offset {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\nexport interface PositionResult {\n position?: Position;\n arrowOffsetLeft?: number;\n arrowOffsetTop?: number;\n maxHeight?: number;\n placement: PlacementAxis | undefined;\n}\n\nconst calculatePosition = (opts: any): PositionResult => {\n let {\n placement,\n targetNode,\n overlayNode,\n scrollNode,\n padding,\n shouldFlip,\n boundaryElement,\n offset,\n crossOffset,\n shouldOverlapWithTrigger,\n } = opts;\n\n let childOffset: Offset = targetNode;\n let isContainerPositioned = false;\n let overlaySize: Offset = overlayNode;\n let margins = { top: 0, bottom: 0, left: 0, right: 0 };\n let scrollSize = scrollNode;\n let boundaryDimensions = boundaryElement;\n\n let containerOffsetWithBoundary: Offset = overlayNode;\n\n return calculatePositionInternal(\n placement,\n childOffset,\n overlaySize,\n scrollSize,\n margins,\n padding,\n shouldFlip,\n boundaryDimensions,\n containerOffsetWithBoundary,\n offset,\n crossOffset,\n isContainerPositioned,\n shouldOverlapWithTrigger\n );\n};\n\nfunction calculatePositionInternal(\n placementInput: Placement,\n childOffset: any,\n overlaySize: Offset,\n scrollSize: Offset,\n margins: Position,\n padding: number,\n flip: boolean,\n boundaryDimensions: Dimensions,\n containerOffsetWithBoundary: Offset,\n offset: number,\n crossOffset: number,\n isContainerPositioned: boolean,\n shouldOverlapWithTrigger: boolean\n): PositionResult {\n let placementInfo = parsePlacement(placementInput);\n let { size, crossAxis, crossSize, placement, crossPlacement } = placementInfo;\n let position = computePosition(\n childOffset,\n boundaryDimensions,\n overlaySize,\n placementInfo,\n offset,\n crossOffset,\n containerOffsetWithBoundary,\n isContainerPositioned\n );\n let normalizedOffset = offset;\n let space = getAvailableSpace(\n boundaryDimensions,\n containerOffsetWithBoundary,\n childOffset,\n margins,\n padding + offset,\n placementInfo\n );\n\n if (flip && scrollSize[size] > space) {\n let flippedPlacementInfo = parsePlacement(\n `${FLIPPED_DIRECTION[placement]} ${crossPlacement}` as Placement\n );\n let flippedPosition = computePosition(\n childOffset,\n boundaryDimensions,\n overlaySize,\n flippedPlacementInfo,\n offset,\n crossOffset,\n containerOffsetWithBoundary,\n isContainerPositioned\n );\n let flippedSpace = getAvailableSpace(\n boundaryDimensions,\n containerOffsetWithBoundary,\n childOffset,\n margins,\n padding + offset,\n flippedPlacementInfo\n );\n\n // If the available space for the flipped position is greater than the original available space, flip.\n if (flippedSpace > space) {\n placementInfo = flippedPlacementInfo;\n position = flippedPosition;\n normalizedOffset = offset;\n }\n }\n\n let delta = getDelta(\n crossAxis,\n position[crossAxis],\n overlaySize[crossSize],\n boundaryDimensions,\n padding\n );\n position[crossAxis] += delta;\n\n let maxHeight = getMaxHeight(\n position,\n boundaryDimensions,\n containerOffsetWithBoundary,\n childOffset,\n margins,\n padding\n );\n\n overlaySize.height = Math.min(overlaySize.height, maxHeight);\n\n position = computePosition(\n childOffset,\n boundaryDimensions,\n overlaySize,\n placementInfo,\n normalizedOffset,\n crossOffset,\n containerOffsetWithBoundary,\n isContainerPositioned\n );\n\n delta = getDelta(\n crossAxis,\n position[crossAxis],\n overlaySize[crossSize],\n boundaryDimensions,\n padding\n );\n position[crossAxis] += delta;\n\n let arrowPosition: Position = {};\n arrowPosition[crossAxis] =\n childOffset[crossAxis] - position[crossAxis] + childOffset[crossSize] / 2;\n\n if (shouldOverlapWithTrigger) {\n position[FLIPPED_DIRECTION[placementInfo.placement]] =\n position[FLIPPED_DIRECTION[placementInfo.placement]] - childOffset[size];\n }\n\n return {\n position,\n maxHeight,\n arrowOffsetLeft: arrowPosition.left,\n arrowOffsetTop: arrowPosition.top,\n placement: placementInfo.placement,\n };\n}\n\nfunction getDelta(\n axis: Axis,\n offset: number,\n size: number,\n containerDimensions: Dimensions,\n padding: number\n) {\n //@ts-ignore\n let containerScroll = containerDimensions[axis];\n //@ts-ignore\n let containerHeight = containerDimensions[AXIS_SIZE[axis]];\n\n let startEdgeOffset = offset - padding - containerScroll;\n let endEdgeOffset = offset + padding - containerScroll + size;\n\n if (startEdgeOffset < 0) {\n return -startEdgeOffset;\n } else if (endEdgeOffset > containerHeight) {\n return Math.max(containerHeight - endEdgeOffset, -startEdgeOffset);\n } else {\n return 0;\n }\n}\n\nfunction getMaxHeight(\n position: Position,\n boundaryDimensions: Dimensions,\n _containerOffsetWithBoundary: Offset,\n childOffset: Offset,\n _margins: Position,\n _padding: number\n) {\n return position.top != null\n ? // We want the distance between the top of the overlay to the bottom of the boundary\n Math.max(\n 0,\n boundaryDimensions.height - // this is the bottom of the boundary\n position.top // this is the top of the overlay\n )\n : // We want the distance between the top of the trigger to the top of the boundary\n Math.max(\n 0,\n childOffset.top - // this is the top of the trigger\n 0 // this is the top of the boundary\n );\n}\n\nfunction computePosition(\n childOffset: any,\n boundaryDimensions: Dimensions,\n overlaySize: Offset,\n placementInfo: ParsedPlacement,\n offset: number,\n crossOffset: number,\n _containerOffsetWithBoundary: Offset,\n _isContainerPositioned: boolean\n) {\n let {\n placement,\n crossPlacement,\n axis,\n crossAxis,\n size,\n crossSize,\n } = placementInfo;\n let position: any = {};\n //@ts-ignore\n position[crossAxis] = childOffset[crossAxis];\n\n if (crossPlacement === 'center') {\n position[crossAxis] +=\n (childOffset[crossSize] - overlaySize[crossSize]) / 2;\n } else if (crossPlacement !== crossAxis) {\n position[crossAxis] += childOffset[crossSize] - overlaySize[crossSize];\n }\n\n position[crossAxis] += crossOffset;\n\n // this is button center position - the overlay size + half of the button to align bottom of overlay with button center\n let minViablePosition =\n childOffset[crossAxis] +\n childOffset[crossSize] / 2 -\n overlaySize[crossSize];\n // this is button position of center, aligns top of overlay with button center\n let maxViablePosition = childOffset[crossAxis] + childOffset[crossSize] / 2;\n\n // clamp it into the range of the min/max positions\n position[crossAxis] = Math.min(\n Math.max(minViablePosition, position[crossAxis]),\n maxViablePosition\n );\n\n // Floor these so the position isn't placed on a partial pixel, only whole pixels. Shouldn't matter if it was floored or ceiled, so chose one.\n if (placement === axis) {\n // If the container is positioned (non-static), then we use the container's actual\n // height, as `bottom` will be relative to this height. But if the container is static,\n // then it can only be the `document.body`, and `bottom` will be relative to _its_\n // container, which should be as large as boundaryDimensions.\n const containerHeight = boundaryDimensions[size];\n position[FLIPPED_DIRECTION[axis]] = Math.floor(\n containerHeight - childOffset[axis] + offset\n );\n } else {\n position[axis] = Math.floor(childOffset[axis] + childOffset[size] + offset);\n }\n\n return position;\n}\n\nfunction getAvailableSpace(\n boundaryDimensions: Dimensions,\n _containerOffsetWithBoundary: Offset,\n childOffset: any,\n _margins: Position,\n padding: number,\n placementInfo: ParsedPlacement\n) {\n let { placement, axis, size } = placementInfo;\n if (placement === axis) {\n return Math.max(0, childOffset[axis] - padding);\n }\n\n return Math.max(\n 0,\n boundaryDimensions[size] - childOffset[axis] - childOffset[size] - padding\n );\n}\n\nconst AXIS: any = {\n top: 'top',\n bottom: 'top',\n left: 'left',\n right: 'left',\n};\n\nconst FLIPPED_DIRECTION: any = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n};\n\nconst CROSS_AXIS: any = {\n top: 'left',\n left: 'top',\n};\n\nconst AXIS_SIZE: any = {\n top: 'height',\n left: 'width',\n};\n\ninterface Position {\n top?: number;\n left?: number;\n bottom?: number;\n right?: number;\n}\n\ninterface Dimensions {\n width: number;\n height: number;\n top: number;\n left: number;\n scroll: Position;\n}\n\ninterface Offset {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\nconst PARSED_PLACEMENT_CACHE: any = {};\n\nfunction parsePlacement(input: Placement): ParsedPlacement {\n if (PARSED_PLACEMENT_CACHE[input]) {\n return PARSED_PLACEMENT_CACHE[input];\n }\n\n let [placement, crossPlacement] = input.split(' ');\n let axis: Axis = AXIS[placement] || 'right';\n let crossAxis: Axis = CROSS_AXIS[axis];\n\n if (!AXIS[crossPlacement]) {\n crossPlacement = 'center';\n }\n\n let size = AXIS_SIZE[axis];\n let crossSize = AXIS_SIZE[crossAxis];\n PARSED_PLACEMENT_CACHE[input] = {\n placement,\n crossPlacement,\n axis,\n crossAxis,\n size,\n crossSize,\n };\n return PARSED_PLACEMENT_CACHE[input];\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-native-aria/overlays",
3
- "version": "0.3.3",
3
+ "version": "0.3.4",
4
4
  "description": "Overlay utilities. Part of react-native-aria",
5
5
  "main": "lib/commonjs/index",
6
6
  "module": "lib/module/index",
package/src/Portal.tsx CHANGED
@@ -37,14 +37,20 @@ export function PortalProvider(props: {
37
37
  };
38
38
 
39
39
  const updateOverlayItem = (id: number, node: ReactNode) => {
40
- setItems((prev) =>
41
- prev.map((item) => {
42
- if (item.id === id) {
43
- return { id, node };
44
- }
45
- return item;
46
- })
47
- );
40
+ setItems((prev) => {
41
+ const overlayItem = prev.find((item) => item.id == id);
42
+ if (!overlayItem) {
43
+ return prev.concat([{ id: id, node }]);
44
+ } else {
45
+ return prev.map((item) => {
46
+ if (item.id === id) {
47
+ return { id, node };
48
+ }
49
+
50
+ return item;
51
+ });
52
+ }
53
+ });
48
54
  };
49
55
 
50
56
  const removeOverlayItem = (id: number) => {
@@ -6,6 +6,7 @@ import {
6
6
  Dimensions,
7
7
  } from 'react-native';
8
8
  import type { Placement, PositionProps } from '@react-types/overlays';
9
+ //@ts-ignore
9
10
  import { isRTL } from '@react-native-aria/utils';
10
11
 
11
12
  const measureOffset = (ref: RefObject<any>) =>
@@ -136,7 +137,14 @@ export function useOverlayPosition(props: AriaPositionProps) {
136
137
 
137
138
  React.useLayoutEffect(() => {
138
139
  updatePosition();
139
- }, [placement, isOpen, offset, shouldFlip, crossOffset, shouldOverlapWithTrigger]);
140
+ }, [
141
+ placement,
142
+ isOpen,
143
+ offset,
144
+ shouldFlip,
145
+ crossOffset,
146
+ shouldOverlapWithTrigger,
147
+ ]);
140
148
 
141
149
  const returnProps = {
142
150
  rendered,