@@ -17,6 +17,7 @@ export interface DTriggerRenderProps {
1717 onFocus ?: React . FocusEventHandler < HTMLElement > ;
1818 onBlur ?: React . FocusEventHandler < HTMLElement > ;
1919 onClick ?: React . MouseEventHandler < HTMLElement > ;
20+ [ key : `data-${string } popup-trigger`] : string ;
2021}
2122
2223export interface DPopupRef {
@@ -40,8 +41,11 @@ export interface DPopupProps extends React.HTMLAttributes<HTMLDivElement> {
4041 dDestroy ?: boolean ;
4142 dMouseEnterDelay ?: number ;
4243 dMouseLeaveDelay ?: number ;
43- dCustomPopup ?: ( popupEl : HTMLElement , triggerEl : HTMLElement ) => { top : number ; left : number ; stateList : DTransitionStateList } ;
44- onTrigger ?: ( visible : boolean ) => void ;
44+ dCustomPopup ?: (
45+ popupEl : HTMLElement ,
46+ triggerEl : HTMLElement
47+ ) => { top : number ; left : number ; stateList : DTransitionStateList ; arrowPosition ?: React . CSSProperties } ;
48+ onVisibleChange ?: ( visible : boolean ) => void ;
4549 afterVisibleChange ?: ( visible : boolean ) => void ;
4650}
4751
@@ -62,7 +66,7 @@ export const DPopup = React.forwardRef<DPopupRef, DPopupProps>((props, ref) => {
6266 dMouseEnterDelay = 150 ,
6367 dMouseLeaveDelay = 200 ,
6468 dCustomPopup,
65- onTrigger ,
69+ onVisibleChange ,
6670 afterVisibleChange,
6771 className,
6872 children,
@@ -89,10 +93,11 @@ export const DPopup = React.forwardRef<DPopupRef, DPopupProps>((props, ref) => {
8993
9094 const asyncCapture = useAsync ( ) ;
9195 const [ popupPositionStyle , setPopupPositionStyle ] = useImmer < React . CSSProperties > ( { } ) ;
96+ const [ arrowPosition , setArrowStyle ] = useImmer < React . CSSProperties | undefined > ( undefined ) ;
9297 const [ zIndex , setZIndex ] = useImmer ( 1000 ) ;
9398 const id = useId ( ) ;
9499
95- const [ visible , changeVisible ] = useTwoWayBinding ( false , dVisible , onTrigger ) ;
100+ const [ visible , changeVisible ] = useTwoWayBinding ( false , dVisible , onVisibleChange ) ;
96101
97102 const [ autoPlacement , setAutoPlacement ] = useImmer < DPlacement > ( dPlacement ) ;
98103
@@ -219,7 +224,8 @@ export const DPopup = React.forwardRef<DPopupRef, DPopupProps>((props, ref) => {
219224 'leave-to' : { transform : 'scale(0)' , opacity : '0' , transition : 'transform 0.1s ease-in, opacity 0.1s ease-in' , transformOrigin } ,
220225 } ;
221226 } else {
222- const { top, left, stateList } = dCustomPopup ( popupEl , triggerRef . current ) ;
227+ const { top, left, stateList, arrowPosition } = dCustomPopup ( popupEl , triggerRef . current ) ;
228+ setArrowStyle ( arrowPosition ) ;
223229 setPopupPositionStyle ( {
224230 position : fixed ? 'fixed' : 'absolute' ,
225231 top,
@@ -237,6 +243,7 @@ export const DPopup = React.forwardRef<DPopupRef, DPopupProps>((props, ref) => {
237243 dDistance ,
238244 dPlacement ,
239245 popupEl ,
246+ setArrowStyle ,
240247 setAutoPlacement ,
241248 setPopupPositionStyle ,
242249 triggerRef ,
@@ -433,7 +440,7 @@ export const DPopup = React.forwardRef<DPopupRef, DPopupProps>((props, ref) => {
433440 ) ;
434441
435442 const triggerRenderProps = useMemo < DTriggerRenderProps > ( ( ) => {
436- const _triggerRenderProps : DTriggerRenderProps = { [ `data-${ dPrefix } popup-trigger` ] : id } ;
443+ const _triggerRenderProps : DTriggerRenderProps = { [ `data-${ dPrefix } popup-trigger` ] : String ( id ) } ;
437444 if ( dTrigger === 'hover' ) {
438445 _triggerRenderProps . onMouseEnter = ( ) => {
439446 dataRef . current . clearTid && dataRef . current . clearTid ( ) ;
@@ -506,7 +513,14 @@ export const DPopup = React.forwardRef<DPopupRef, DPopupProps>((props, ref) => {
506513 onBlur = { handleBlur }
507514 onClick = { handleClick }
508515 >
509- { dArrow && < div className = { `${ dPrefix } popup__arrow` } > </ div > }
516+ { dArrow && (
517+ < div
518+ className = { getClassName ( `${ dPrefix } popup__arrow` , {
519+ 'is-custom' : arrowPosition ,
520+ } ) }
521+ style = { arrowPosition }
522+ > </ div >
523+ ) }
510524 { dPopupContent }
511525 </ div > ,
512526 containerRef . current
0 commit comments