react-native-molecules 0.5.0-beta.17 → 0.5.0-beta.19

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.
@@ -171,6 +171,7 @@ const datePickerModalEditStylesDefault = StyleSheet.create(theme => ({
171
171
  const datePickerPopoverHeaderStylesDefault = StyleSheet.create(theme => ({
172
172
  buttonContainer: {
173
173
  height: 46,
174
+ gap: theme.spacings['2'],
174
175
  // width: '50%',
175
176
  flexDirection: 'row',
176
177
  alignItems: 'center',
@@ -96,7 +96,7 @@ function HeaderItem({
96
96
  <Icon
97
97
  onPress={handlePressDropDown}
98
98
  name={selecting && type === pickerType ? 'menu-up' : 'menu-down'}
99
- size={16}
99
+ size={18}
100
100
  />
101
101
  )}
102
102
  </View>
@@ -9,6 +9,7 @@ export type Props = Omit<PopoverProps, 'setIsOpen' | 'onClose' | 'children'> & {
9
9
  closeOnSelect?: boolean;
10
10
  onClose: () => void;
11
11
  children: ReactElement | ReactElement[];
12
+ backdropStyles?: ViewStyle;
12
13
  };
13
14
 
14
15
  const emptyObj = {} as ViewStyle;
@@ -37,25 +38,9 @@ const Menu = ({
37
38
  [closeOnSelect, onClose],
38
39
  );
39
40
 
40
- // const { menuItemsLength } = useMemo(
41
- // () => ({
42
- // menuItemsLength:
43
- // Children.map(children, child => child)?.filter(
44
- // child => (child.type as FC)?.displayName === 'MenuItem',
45
- // )?.length || 0,
46
- // }),
47
- // [children],
48
- // );
49
- //
50
- // console.log({ menuItemsLength });
51
-
52
41
  return (
53
- <Popover
54
- isOpen={isOpen}
55
- onClose={onClose}
56
- backdropStyles={backdropStyle}
57
- style={style}
58
- {...rest}>
42
+ <Popover isOpen={isOpen} onClose={onClose} style={style} {...rest}>
43
+ <Popover.Overlay style={backdropStyle} />
59
44
  <MenuContext.Provider value={contextValue}>{children}</MenuContext.Provider>
60
45
  </Popover>
61
46
  );
@@ -1,18 +1,37 @@
1
- import { Fragment, memo, useCallback, useEffect, useLayoutEffect, useMemo, useRef } from 'react';
2
- import { Pressable, View } from 'react-native';
1
+ import {
2
+ cloneElement,
3
+ Fragment,
4
+ memo,
5
+ type ReactElement,
6
+ type ReactNode,
7
+ type Ref,
8
+ useContext,
9
+ useMemo,
10
+ useRef,
11
+ } from 'react';
12
+ import { Pressable, type PressableProps, type StyleProp, View, type ViewStyle } from 'react-native';
3
13
  import { ScopedTheme, UnistylesRuntime } from 'react-native-unistyles';
4
14
 
15
+ import { mergeRefs } from '../../utils';
5
16
  import { Portal } from '../Portal';
6
17
  import {
7
18
  DEFAULT_ARROW_SIZE,
8
- popoverDefaultStyles,
19
+ PopoverContext,
20
+ PopoverPanelContext,
21
+ type PopoverPanelContextValue,
9
22
  type PopoverProps,
10
23
  useArrowStyles,
11
24
  usePopover,
12
25
  } from './common';
26
+ import { createPopoverRoot } from './PopoverRoot';
27
+ import { usePlatformMeasure } from './usePlatformMeasure';
13
28
  import { popoverStyles } from './utils';
14
29
 
15
- const Popover = ({
30
+ type PopoverPanelProps = PopoverProps & {
31
+ overlay?: ReactNode;
32
+ };
33
+
34
+ const PopoverPanel = ({
16
35
  triggerRef,
17
36
  children,
18
37
  isOpen,
@@ -20,17 +39,15 @@ const Popover = ({
20
39
  position = 'bottom',
21
40
  align = 'center',
22
41
  style,
23
- showArrow = false,
24
- arrowSize = DEFAULT_ARROW_SIZE,
25
42
  inverted = false,
26
43
  // @ts-ignore
27
44
  dataSet,
28
- withBackdropDismiss = false,
29
45
  offset = 8,
30
- backdropStyles,
46
+ horizontalOffset = 0,
31
47
  triggerDimensions,
48
+ overlay,
32
49
  ...rest
33
- }: PopoverProps) => {
50
+ }: PopoverPanelProps) => {
34
51
  const {
35
52
  popoverLayoutRef,
36
53
  targetLayoutRef,
@@ -38,111 +55,31 @@ const Popover = ({
38
55
  calculatedPosition,
39
56
  calculateAndSetPosition,
40
57
  handlePopoverLayout,
41
- } = usePopover({
42
- isOpen,
43
- position,
44
- align,
45
- showArrow,
46
- arrowSize,
47
- offset,
48
- });
58
+ } = usePopover({ isOpen, position, align, offset, horizontalOffset });
49
59
 
50
60
  const popoverRef = useRef<View>(null);
51
61
 
52
- const measureTarget = useCallback(() => {
53
- if (triggerRef.current) {
54
- triggerRef.current.measureInWindow(
55
- (x: number, y: number, width: number, height: number) => {
56
- if (width !== 0 || height !== 0) {
57
- const newLayout = { x, y, width, height };
58
- const changed =
59
- !targetLayoutRef.current ||
60
- targetLayoutRef.current.x !== newLayout.x ||
61
- targetLayoutRef.current.y !== newLayout.y ||
62
- targetLayoutRef.current.width !== newLayout.width ||
63
- targetLayoutRef.current.height !== newLayout.height;
64
-
65
- if (changed) {
66
- targetLayoutRef.current = newLayout;
67
- calculateAndSetPosition();
68
- }
69
- } else {
70
- targetLayoutRef.current = null;
71
- calculateAndSetPosition();
72
- }
73
- },
74
- );
75
- } else {
76
- targetLayoutRef.current = null;
77
- calculateAndSetPosition();
78
- }
79
- }, [triggerRef, calculateAndSetPosition, targetLayoutRef]);
80
-
81
- useLayoutEffect(() => {
82
- if (isOpen) {
83
- const timeoutId = setTimeout(measureTarget, 0);
84
- return () => clearTimeout(timeoutId);
85
- }
86
- return;
87
- }, [isOpen, measureTarget, triggerDimensions]);
88
-
89
- useLayoutEffect(() => {
90
- if (!isOpen) return;
91
- const handleResize = () => {
92
- if (triggerRef.current && isOpen) {
93
- window.requestAnimationFrame(measureTarget);
94
- }
95
- };
96
- window.addEventListener('resize', handleResize);
97
- window.addEventListener('scroll', handleResize, true);
98
- return () => {
99
- window.removeEventListener('resize', handleResize);
100
- window.removeEventListener('scroll', handleResize, true);
101
- };
102
- }, [isOpen, measureTarget, triggerRef]);
103
-
104
- useEffect(() => {
105
- if (!isOpen || !onClose || withBackdropDismiss) return;
106
- const handleClickOutside = (event: MouseEvent) => {
107
- const popoverElement = popoverRef.current as any as HTMLElement;
108
- const targetElement = triggerRef.current as any as HTMLElement;
109
- if (
110
- popoverElement &&
111
- !popoverElement.contains(event.target as Node) &&
112
- targetElement &&
113
- !targetElement.contains(event.target as Node)
114
- ) {
115
- onClose();
116
- }
117
- };
118
- document.addEventListener('mousedown', handleClickOutside, { capture: true });
119
- return () => {
120
- document.removeEventListener('mousedown', handleClickOutside, { capture: true });
121
- };
122
- }, [isOpen, onClose, popoverRef, triggerRef, withBackdropDismiss]);
123
-
124
- const arrowStyles = useArrowStyles({
125
- showArrow,
126
- arrowSize,
127
- style,
62
+ const { popoverStyle } = usePlatformMeasure({
63
+ triggerRef,
64
+ isOpen,
65
+ onClose,
128
66
  calculatedPosition,
67
+ calculateAndSetPosition,
129
68
  targetLayoutRef,
130
- popoverLayoutRef,
131
- actualPositionRef,
69
+ popoverRef,
70
+ triggerDimensions,
132
71
  });
133
72
 
134
- const popoverStyle = useMemo(() => {
135
- if (!calculatedPosition) return popoverDefaultStyles;
136
-
137
- const scrollX = window.scrollX ?? window.pageXOffset ?? 0;
138
- const scrollY = window.scrollY ?? window.pageYOffset ?? 0;
139
-
140
- return {
141
- ...calculatedPosition,
142
- left: (calculatedPosition.left as number) + scrollX,
143
- top: (calculatedPosition.top as number) + scrollY,
144
- };
145
- }, [calculatedPosition]);
73
+ const panelContextValue = useMemo<PopoverPanelContextValue>(
74
+ () => ({
75
+ calculatedPosition,
76
+ targetLayoutRef,
77
+ popoverLayoutRef,
78
+ actualPositionRef,
79
+ containerStyle: style,
80
+ }),
81
+ [calculatedPosition, targetLayoutRef, popoverLayoutRef, actualPositionRef, style],
82
+ );
146
83
 
147
84
  const Wrapper = inverted ? ScopedTheme : Fragment;
148
85
  const WrapperProps = inverted
@@ -155,22 +92,84 @@ const Popover = ({
155
92
 
156
93
  return (
157
94
  <Portal>
158
- <Wrapper {...(WrapperProps as any)}>
159
- {withBackdropDismiss && (
160
- <Pressable style={[popoverStyles.backdrop, backdropStyles]} onPress={onClose} />
161
- )}
162
- <View
163
- onLayout={handlePopoverLayout}
164
- style={[popoverStyles.popoverContainer, style, popoverStyle]}
165
- {...{ dataSet }}
166
- {...rest}
167
- ref={popoverRef}>
168
- {children}
169
- {showArrow && popoverStyle.opacity === 1 && <View style={arrowStyles} />}
170
- </View>
171
- </Wrapper>
95
+ <PopoverPanelContext value={panelContextValue}>
96
+ <Wrapper {...(WrapperProps as any)}>
97
+ {overlay}
98
+ <View
99
+ onLayout={handlePopoverLayout}
100
+ style={[popoverStyles.popoverContainer, style, popoverStyle]}
101
+ {...{ dataSet }}
102
+ {...rest}
103
+ ref={popoverRef}>
104
+ {children}
105
+ </View>
106
+ </Wrapper>
107
+ </PopoverPanelContext>
172
108
  </Portal>
173
109
  );
174
110
  };
175
111
 
176
- export default memo(Popover);
112
+ type PopoverTriggerProps = {
113
+ children: ReactElement;
114
+ ref?: Ref<any>;
115
+ triggerRef?: Ref<any>;
116
+ };
117
+
118
+ export const PopoverTrigger = memo(
119
+ ({ children, ref: refProp, triggerRef: triggerRefProp }: PopoverTriggerProps) => {
120
+ const { triggerRef } = useContext(PopoverContext);
121
+ const mergedRef = useMemo(
122
+ () => mergeRefs([triggerRef, refProp, triggerRefProp]),
123
+ [triggerRef, refProp, triggerRefProp],
124
+ );
125
+ return cloneElement(children as ReactElement<{ ref?: unknown }>, { ref: mergedRef });
126
+ },
127
+ );
128
+ PopoverTrigger.displayName = 'Popover_Trigger';
129
+
130
+ export const PopoverContent = memo(({ children }: { children?: ReactNode }) => <>{children}</>);
131
+ PopoverContent.displayName = 'Popover_Content';
132
+
133
+ export const PopoverOverlay = memo(({ style, onPress, ...rest }: PressableProps) => {
134
+ const { isOpen, onClose } = useContext(PopoverContext);
135
+ if (!isOpen) return null;
136
+ return (
137
+ <Pressable
138
+ {...rest}
139
+ onPress={onPress ?? onClose}
140
+ style={[popoverStyles.overlay, style as StyleProp<ViewStyle>]}
141
+ />
142
+ );
143
+ });
144
+ PopoverOverlay.displayName = 'Popover_Overlay';
145
+
146
+ type PopoverArrowProps = {
147
+ size?: number;
148
+ style?: StyleProp<ViewStyle>;
149
+ };
150
+
151
+ export const PopoverArrow = memo(({ size = DEFAULT_ARROW_SIZE, style }: PopoverArrowProps) => {
152
+ const {
153
+ calculatedPosition,
154
+ targetLayoutRef,
155
+ popoverLayoutRef,
156
+ actualPositionRef,
157
+ containerStyle,
158
+ } = useContext(PopoverPanelContext);
159
+
160
+ const arrowStyles = useArrowStyles({
161
+ arrowSize: size,
162
+ containerStyle,
163
+ calculatedPosition,
164
+ targetLayoutRef,
165
+ popoverLayoutRef,
166
+ actualPositionRef,
167
+ });
168
+
169
+ if (!arrowStyles || Object.keys(arrowStyles).length === 0) return null;
170
+ return <View style={[arrowStyles, style]} />;
171
+ });
172
+
173
+ PopoverArrow.displayName = 'Popover_Arrow';
174
+
175
+ export default memo(createPopoverRoot(PopoverPanel));
@@ -0,0 +1,74 @@
1
+ import {
2
+ type ComponentType,
3
+ memo,
4
+ type ReactElement,
5
+ type ReactNode,
6
+ useMemo,
7
+ useRef,
8
+ } from 'react';
9
+ import { type View } from 'react-native';
10
+
11
+ import { extractSubcomponents } from '../../utils/extractSubcomponents';
12
+ import { PopoverContext, type PopoverProps } from './common';
13
+
14
+ type PopoverPanelInternalProps = PopoverProps & { overlay?: ReactNode };
15
+
16
+ export const createPopoverRoot = (PopoverPanel: ComponentType<PopoverPanelInternalProps>) => {
17
+ const PopoverRoot = ({
18
+ triggerRef: triggerRefProp,
19
+ isOpen,
20
+ onClose,
21
+ children,
22
+ ...rest
23
+ }: PopoverProps) => {
24
+ const internalTriggerRef = useRef<View>(null);
25
+
26
+ const {
27
+ Popover_Trigger,
28
+ Popover_Content,
29
+ Popover_Overlay,
30
+ rest: restChildren,
31
+ } = extractSubcomponents({
32
+ children,
33
+ allowedChildren: [
34
+ { name: 'Popover_Trigger', allowMultiple: false },
35
+ { name: 'Popover_Content', allowMultiple: false },
36
+ { name: 'Popover_Overlay', allowMultiple: false },
37
+ ] as const,
38
+ includeRest: true,
39
+ });
40
+
41
+ const hasTrigger = Popover_Trigger.length > 0;
42
+ const resolvedTriggerRef = triggerRefProp ?? (hasTrigger ? internalTriggerRef : undefined);
43
+
44
+ const panelContent =
45
+ Popover_Content.length > 0
46
+ ? (Popover_Content[0] as ReactElement<{ children?: ReactNode }>).props.children
47
+ : restChildren;
48
+
49
+ const contextValue = useMemo(
50
+ () => ({
51
+ triggerRef: resolvedTriggerRef ?? internalTriggerRef,
52
+ isOpen,
53
+ onClose,
54
+ }),
55
+ [resolvedTriggerRef, isOpen, onClose],
56
+ );
57
+
58
+ return (
59
+ <PopoverContext value={contextValue}>
60
+ {hasTrigger && Popover_Trigger[0]}
61
+ <PopoverPanel
62
+ triggerRef={resolvedTriggerRef}
63
+ isOpen={isOpen}
64
+ onClose={onClose}
65
+ overlay={Popover_Overlay[0]}
66
+ {...rest}>
67
+ {panelContent}
68
+ </PopoverPanel>
69
+ </PopoverContext>
70
+ );
71
+ };
72
+
73
+ return memo(PopoverRoot);
74
+ };
@@ -1,4 +1,5 @@
1
1
  import type { ReactNode, RefObject } from 'react';
2
+ import { createContext } from 'react';
2
3
  import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
3
4
  import type { LayoutRectangle, StyleProp, View, ViewStyle } from 'react-native';
4
5
  import { Dimensions, StyleSheet } from 'react-native';
@@ -15,10 +16,36 @@ export const popoverDefaultStyles = {
15
16
  opacity: 0,
16
17
  };
17
18
 
19
+ export type PopoverContextValue = {
20
+ triggerRef: RefObject<View | any>;
21
+ isOpen: boolean;
22
+ onClose?: () => void;
23
+ };
24
+
25
+ export const PopoverContext = createContext<PopoverContextValue>({
26
+ isOpen: false,
27
+ triggerRef: { current: null },
28
+ });
29
+
30
+ export type PopoverPanelContextValue = {
31
+ calculatedPosition: ViewStyle | null;
32
+ targetLayoutRef: RefObject<LayoutRectangle | null>;
33
+ popoverLayoutRef: RefObject<LayoutRectangle | null>;
34
+ actualPositionRef: RefObject<Position | undefined>;
35
+ containerStyle?: StyleProp<ViewStyle>;
36
+ };
37
+
38
+ export const PopoverPanelContext = createContext<PopoverPanelContextValue>({
39
+ calculatedPosition: null,
40
+ targetLayoutRef: { current: null },
41
+ popoverLayoutRef: { current: null },
42
+ actualPositionRef: { current: undefined },
43
+ });
44
+
18
45
  export type PopoverProps = {
19
46
  inverted?: boolean;
20
47
  /** Reference to the element the popover should anchor to */
21
- triggerRef: RefObject<View | any>; // Allow different ref types
48
+ triggerRef?: RefObject<View | any>;
22
49
  /** Content to display inside the popover */
23
50
  children: ReactNode;
24
51
  /** Whether the popover is visible */
@@ -31,13 +58,10 @@ export type PopoverProps = {
31
58
  align?: Align;
32
59
  /** Optional style for the popover container */
33
60
  style?: StyleProp<ViewStyle>;
34
- /** Show arrow pointing to the target */
35
- showArrow?: boolean;
36
- /** Size of the arrow */
37
- arrowSize?: number;
38
- withBackdropDismiss?: boolean;
61
+ /** Gap between the popover and the trigger along the main axis */
39
62
  offset?: number;
40
- backdropStyles?: StyleProp<ViewStyle>;
63
+ /** Additional horizontal shift applied to the popover (positive = right) */
64
+ horizontalOffset?: number;
41
65
  /** Optional trigger dimensions to trigger re-measurement when changed */
42
66
  triggerDimensions?: { width: number; height: number } | null;
43
67
  };
@@ -165,13 +189,12 @@ export const adjustPositionForBoundaries = (
165
189
  // --- Arrow Style Hook ---
166
190
 
167
191
  interface UseArrowStylesProps {
168
- showArrow?: boolean;
169
192
  arrowSize: number;
170
- style?: StyleProp<ViewStyle>;
193
+ containerStyle?: StyleProp<ViewStyle>;
171
194
  calculatedPosition: ViewStyle | null;
172
195
  targetLayoutRef: RefObject<LayoutRectangle | null>;
173
196
  popoverLayoutRef: RefObject<LayoutRectangle | null>;
174
- actualPositionRef: RefObject<Position | undefined>; // Use Position type
197
+ actualPositionRef: RefObject<Position | undefined>;
175
198
  }
176
199
 
177
200
  // Define a base style for the popover container to extract default background
@@ -183,9 +206,8 @@ const basePopoverStyle = StyleSheet.create({
183
206
  });
184
207
 
185
208
  export const useArrowStyles = ({
186
- showArrow,
187
209
  arrowSize,
188
- style,
210
+ containerStyle,
189
211
  calculatedPosition,
190
212
  targetLayoutRef,
191
213
  popoverLayoutRef,
@@ -193,7 +215,6 @@ export const useArrowStyles = ({
193
215
  }: UseArrowStylesProps): ViewStyle => {
194
216
  return useMemo(() => {
195
217
  if (
196
- !showArrow ||
197
218
  !targetLayoutRef.current ||
198
219
  !popoverLayoutRef.current ||
199
220
  !calculatedPosition ||
@@ -213,7 +234,7 @@ export const useArrowStyles = ({
213
234
  } = targetLayoutRef.current;
214
235
 
215
236
  const arrowHalfSize = arrowSize / 2;
216
- const popoverStyleFlat = StyleSheet.flatten(style || {});
237
+ const popoverStyleFlat = StyleSheet.flatten(containerStyle || {});
217
238
  const containerStyleFlat = StyleSheet.flatten(basePopoverStyle.container);
218
239
 
219
240
  const backgroundColor =
@@ -320,14 +341,11 @@ export const useArrowStyles = ({
320
341
  default:
321
342
  return {};
322
343
  }
323
- // Use refs directly in dependency array for useMemo
324
- // React checks ref.current internally when deciding memoization
325
344
  }, [
326
- showArrow,
327
345
  arrowSize,
328
- style, // Include style for potential background/zIndex changes
346
+ containerStyle,
329
347
  calculatedPosition,
330
- targetLayoutRef, // Dependency on the ref objects
348
+ targetLayoutRef,
331
349
  popoverLayoutRef,
332
350
  actualPositionRef,
333
351
  ]);
@@ -339,18 +357,16 @@ interface UsePopoverProps {
339
357
  isOpen: boolean;
340
358
  position: Position | undefined;
341
359
  align: Align | undefined;
342
- showArrow: boolean | undefined;
343
- arrowSize: number;
344
360
  offset?: number;
361
+ horizontalOffset?: number;
345
362
  }
346
363
 
347
364
  export const usePopover = ({
348
365
  isOpen,
349
366
  position = 'bottom',
350
367
  align = 'center',
351
- showArrow = true,
352
- arrowSize = DEFAULT_ARROW_SIZE,
353
368
  offset = 0,
369
+ horizontalOffset = 0,
354
370
  }: UsePopoverProps) => {
355
371
  const popoverLayoutRef = useRef<LayoutRectangle | null>(null);
356
372
  const targetLayoutRef = useRef<LayoutRectangle | null>(null);
@@ -359,22 +375,20 @@ export const usePopover = ({
359
375
 
360
376
  const calculateAndSetPosition = useCallback(() => {
361
377
  if (!targetLayoutRef.current || !popoverLayoutRef.current) {
362
- setCalculatedPosition(popoverDefaultStyles); // Hide if layouts are not ready
378
+ setCalculatedPosition(popoverDefaultStyles);
363
379
  return;
364
380
  }
365
381
 
366
382
  const { width: screenWidth, height: screenHeight } = Dimensions.get('window');
367
- const effectiveArrowSize = showArrow ? arrowSize : 0;
368
383
 
369
384
  let { top: initialTop, left: initialLeft } = getInitialPosition(
370
385
  position,
371
386
  align,
372
387
  targetLayoutRef.current,
373
388
  popoverLayoutRef.current,
374
- effectiveArrowSize,
389
+ 0,
375
390
  );
376
391
 
377
- // Apply offset based on the initial intended position
378
392
  switch (position) {
379
393
  case 'top':
380
394
  initialTop -= offset;
@@ -390,18 +404,20 @@ export const usePopover = ({
390
404
  break;
391
405
  }
392
406
 
407
+ initialLeft += horizontalOffset;
408
+
393
409
  const { finalTop, finalLeft, finalPosition } = adjustPositionForBoundaries(
394
- position, // Pass initial intended position for boundary check logic
395
- initialTop, // Pass offset-adjusted top
396
- initialLeft, // Pass offset-adjusted left
410
+ position,
411
+ initialTop,
412
+ initialLeft,
397
413
  targetLayoutRef.current,
398
414
  popoverLayoutRef.current,
399
415
  screenHeight,
400
416
  screenWidth,
401
- effectiveArrowSize,
417
+ 0,
402
418
  );
403
419
 
404
- actualPositionRef.current = finalPosition; // Store the actual position after adjustments
420
+ actualPositionRef.current = finalPosition;
405
421
 
406
422
  setCalculatedPosition({
407
423
  position: 'absolute',
@@ -409,7 +425,7 @@ export const usePopover = ({
409
425
  left: finalLeft,
410
426
  opacity: 1,
411
427
  });
412
- }, [position, align, showArrow, arrowSize, offset]); // Add offset to dependency array
428
+ }, [position, align, offset, horizontalOffset]);
413
429
 
414
430
  const handlePopoverLayout = useCallback(
415
431
  (event: { nativeEvent: { layout: LayoutRectangle } }) => {
@@ -435,7 +451,7 @@ export const usePopover = ({
435
451
  calculateAndSetPosition();
436
452
  }
437
453
  // This effect specifically handles prop changes
438
- }, [isOpen, position, align, arrowSize, showArrow, calculateAndSetPosition]);
454
+ }, [isOpen, position, align, calculateAndSetPosition]);
439
455
 
440
456
  // Effect to reset layout refs when popover is closed
441
457
  useEffect(() => {
@@ -1,2 +1,19 @@
1
+ import { getRegisteredComponentWithFallback } from '../../core';
2
+ import PopoverDefault, {
3
+ PopoverArrow,
4
+ PopoverContent,
5
+ PopoverOverlay,
6
+ PopoverTrigger,
7
+ } from './Popover';
8
+
9
+ const PopoverBase = getRegisteredComponentWithFallback('Popover', PopoverDefault);
10
+
11
+ export const Popover = Object.assign(PopoverBase, {
12
+ Trigger: PopoverTrigger,
13
+ Content: PopoverContent,
14
+ Arrow: PopoverArrow,
15
+ Overlay: PopoverOverlay,
16
+ });
17
+
1
18
  export type { Align, PopoverProps, Position } from './common';
2
- export { default as Popover } from './Popover';
19
+ export { PopoverContext, PopoverPanelContext } from './common';