11import React , {
22 FC ,
3+ FocusEvent ,
34 ComponentType ,
45 HTMLAttributes ,
56 ReactElement ,
@@ -11,12 +12,15 @@ import React, {
1112 useRef ,
1213 useState ,
1314 useEffect ,
15+ useCallback ,
1416} from 'react' ;
1517import classnames from 'classnames' ;
1618import { registerStyle } from './util' ;
1719import { DropdownButton , DropdownButtonProps } from './DropdownButton' ;
1820import { useControlledValue , useEventCallback } from './hooks' ;
1921import { Bivariant } from './typeUtils' ;
22+ import { Button } from './Button' ;
23+ import { Popover } from './Popover' ;
2024
2125/**
2226 *
@@ -95,6 +99,37 @@ const TabMenu: FC<TabMenuProps> = (props) => {
9599 ) ;
96100} ;
97101
102+ /**
103+ *
104+ */
105+ const TooltipContent = ( props : { children : ReactNode ; icon : string } ) => {
106+ const { children, icon } = props ;
107+ const [ isHideTooltip , setIsHideTooltip ] = useState ( true ) ;
108+ const popoverRef = useRef < HTMLDivElement > ( null ) ;
109+ const tooltipToggle = useCallback ( ( ) => {
110+ setIsHideTooltip ( ( hidden ) => ! hidden ) ;
111+ } , [ ] ) ;
112+ const onBlur = useCallback ( ( e : FocusEvent < HTMLElement > ) => {
113+ if ( ! popoverRef . current ?. contains ( e . relatedTarget ) ) {
114+ setIsHideTooltip ( true ) ;
115+ }
116+ } , [ ] ) ;
117+ return (
118+ < span className = 'slds-dropdown-trigger react-slds-tooltip-content' >
119+ < Button type = 'icon' icon = { icon } onClick = { tooltipToggle } onBlur = { onBlur } />
120+ < Popover
121+ ref = { popoverRef }
122+ hidden = { isHideTooltip }
123+ tabIndex = { - 1 }
124+ onBlur = { onBlur }
125+ tooltip
126+ >
127+ { children }
128+ </ Popover >
129+ </ span >
130+ ) ;
131+ } ;
132+
98133/**
99134 *
100135 */
@@ -113,6 +148,7 @@ export type TabItemRendererProps = {
113148 ( eventKey : TabKey , e : React . KeyboardEvent < HTMLAnchorElement > ) => void
114149 > ;
115150 tooltip ?: ReactNode ;
151+ tooltipIcon ?: string ;
116152} ;
117153
118154const DefaultTabItemRenderer : FC < { children ?: ReactNode } > = ( props ) => {
@@ -137,7 +173,14 @@ export type TabItemProps<RendererProps extends TabItemRendererProps> = {
137173const TabItem = < RendererProps extends TabItemRendererProps > (
138174 props : TabItemProps < RendererProps >
139175) => {
140- const { title, eventKey, menu, menuIcon, tooltip } = props ;
176+ const {
177+ title,
178+ eventKey,
179+ menu,
180+ menuIcon,
181+ tooltip,
182+ tooltipIcon = 'info' ,
183+ } = props ;
141184 const { type, activeTabRef } = useContext ( TabsContext ) ;
142185 const activeKey = useContext ( TabsActiveKeyContext ) ;
143186 const { onTabClick, onTabKeyDown } = useContext ( TabsHandlersContext ) ;
@@ -194,9 +237,7 @@ const TabItem = <RendererProps extends TabItemRendererProps>(
194237 { title }
195238 </ a >
196239 { tooltip ? (
197- < span className = 'slds-dropdown-trigger react-slds-tooltip-content' >
198- { tooltip }
199- </ span >
240+ < TooltipContent icon = { tooltipIcon } > { tooltip } </ TooltipContent >
200241 ) : null }
201242 { menuItems ? (
202243 < TabMenu icon = { menuIcon } { ...menuProps } >
@@ -293,7 +334,6 @@ function useInitComponentStyle() {
293334 '.react-slds-tooltip-content' ,
294335 '{ position: absolute; top: 0.6rem; right: 2.25rem; }' ,
295336 ] ,
296- [ '.slds-popover_tooltip' , '{ left: -1rem !important; }' ] ,
297337 [
298338 '.react-slds-tab-menu button' ,
299339 '{ height: 2.5rem; line-height: 2rem; width: 2rem; visibility: hidden; justify-content: center }' ,
0 commit comments