Skip to content
This repository was archived by the owner on Jun 20, 2022. It is now read-only.

Commit 2e49c75

Browse files
committed
fix: minor fixes for Tooltip & Popover
1 parent da2238f commit 2e49c75

File tree

6 files changed

+81
-35
lines changed

6 files changed

+81
-35
lines changed

docs/components/Popover.mdx

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,23 @@ Add a `<Popover />` in a component and it will automatically be displayed. Popov
4343
of={PropDesc({
4444
children: PropDesc.node,
4545
onHide: PropDesc.func,
46-
placement: PropDesc.oneOf(['top', 'right', 'bottom', 'left']),
46+
placement: PropDesc.oneOf([
47+
'auto',
48+
'auto-start',
49+
'auto-end',
50+
'top',
51+
'top-start',
52+
'top-end',
53+
'right',
54+
'right-start',
55+
'right-end',
56+
'bottom',
57+
'bottom-start',
58+
'bottom-end',
59+
'left',
60+
'left-start',
61+
'left-end',
62+
]).defaultTo('auto'),
4763
visible: PropDesc.bool,
4864
hideOnClickOutside: PropDesc.bool.defaultTo(true),
4965
...getSystemPropDesc(Popover),

docs/components/Tooltip.mdx

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,23 @@ Add a `<Tooltip />` in a component and it will automatically be displayed. It is
3232
<PropsTable
3333
of={PropDesc({
3434
children: PropDesc.node,
35-
placement: PropDesc.oneOf(['top', 'right', 'bottom', 'left']),
35+
placement: PropDesc.oneOf([
36+
'auto',
37+
'auto-start',
38+
'auto-end',
39+
'top',
40+
'top-start',
41+
'top-end',
42+
'right',
43+
'right-start',
44+
'right-end',
45+
'bottom',
46+
'bottom-start',
47+
'bottom-end',
48+
'left',
49+
'left-start',
50+
'left-end',
51+
]).defaultTo('auto'),
3652
...getSystemPropDesc(Tooltip),
3753
})}
3854
/>

packages/shared/core/Popover.js

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { css } from './styled-engine'
44
import createComponent from './createComponent'
55
import Portal from './Portal'
66
import useRandomId from './hooks/useRandomId'
7-
import usePopper from './hooks/usePopper'
7+
import usePopper, { placements } from './hooks/usePopper'
88
import useSetAttribute from './hooks/useSetAttribute'
99
import useAsyncRef from './hooks/useAsyncRef'
1010
import useClickOutside from './hooks/useClickOutside'
@@ -14,15 +14,15 @@ function PopoverComponent({
1414
children,
1515
visible,
1616
id: idProp,
17-
placement = 'top',
18-
forwardedRef,
19-
as: As = 'div',
17+
placement = 'auto',
18+
ref,
19+
Component,
2020
hideOnClickOutside = true,
2121
onHide,
2222
...props
2323
}) {
2424
const parentRef = useRef()
25-
const [popoverRef, handlePopoverRef] = useAsyncRef(undefined, forwardedRef)
25+
const [popoverRef, handlePopoverRef] = useAsyncRef(undefined, ref)
2626
const randomId = useRandomId('tooltip')
2727
const id = idProp || randomId
2828

@@ -38,23 +38,24 @@ function PopoverComponent({
3838
<>
3939
<ParentElement ref={parentRef} />
4040
<Portal>
41-
<As
41+
<Component
4242
ref={handlePopoverRef}
4343
id={id}
4444
aria-hidden={!visible}
4545
role="group"
4646
{...props}
4747
>
4848
{children}
49-
</As>
49+
</Component>
5050
</Portal>
5151
</>
5252
)
5353
}
5454

5555
const Popover = createComponent(() => ({
5656
name: 'popover',
57-
InnerComponent: PopoverComponent,
57+
render: PopoverComponent,
58+
defaultComponent: 'div',
5859
style: () => css`
5960
&[aria-hidden='true'] {
6061
pointer-events: none;
@@ -64,7 +65,7 @@ const Popover = createComponent(() => ({
6465
propTypes: {
6566
children: PropTypes.node,
6667
onHide: PropTypes.func,
67-
placement: PropTypes.oneOf(['top', 'right', 'bottom', 'left']),
68+
placement: PropTypes.oneOf(placements),
6869
visible: PropTypes.bool,
6970
},
7071
}))

packages/shared/core/Tooltip.js

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { css } from './styled-engine'
55
import createComponent from './createComponent'
66
import Portal from './Portal'
77
import useRandomId from './hooks/useRandomId'
8-
import usePopper from './hooks/usePopper'
8+
import usePopper, { placements } from './hooks/usePopper'
99
import useAsyncRef from './hooks/useAsyncRef'
1010
import useEventListener from './hooks/useEventListener'
1111
import useSetAttribute from './hooks/useSetAttribute'
@@ -15,13 +15,13 @@ function TooltipComponent({
1515
children,
1616
id: idProp,
1717
placement = 'top',
18-
forwardedRef,
19-
as: As = 'div',
18+
ref,
19+
Component,
2020
...props
2121
}) {
2222
const parentRef = useRef()
2323
const [visible, setVisible] = useState(false)
24-
const [tooltipRef, handleTooltipRef] = useAsyncRef(undefined, forwardedRef)
24+
const [tooltipRef, handleTooltipRef] = useAsyncRef(undefined, ref)
2525
const randomId = useRandomId('tooltip')
2626
const id = idProp || randomId
2727

@@ -39,24 +39,24 @@ function TooltipComponent({
3939
<>
4040
<ParentElement ref={parentRef} />
4141
<Portal>
42-
<As
42+
<Component
4343
ref={handleTooltipRef}
4444
id={id}
4545
aria-hidden={!visible}
4646
role="tooltip"
4747
{...props}
4848
>
4949
{children}
50-
</As>
50+
</Component>
5151
</Portal>
5252
</>
5353
)
5454
}
5555

5656
const Tooltip = createComponent(() => ({
5757
name: 'tooltip',
58-
defaultComponent: null,
59-
InnerComponent: TooltipComponent,
58+
defaultComponent: 'div',
59+
render: TooltipComponent,
6060
style: p => css`
6161
&[aria-hidden='true'] {
6262
pointer-events: none;
@@ -73,7 +73,7 @@ const Tooltip = createComponent(() => ({
7373
`,
7474
propTypes: {
7575
children: PropTypes.node,
76-
placement: PropTypes.oneOf(['top', 'right', 'bottom', 'left']),
76+
placement: PropTypes.oneOf(placements),
7777
},
7878
}))
7979

packages/shared/core/createComponent.js

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -39,22 +39,17 @@ function createComponent(getConfig) {
3939
const baseClassName = `sui-${name}`
4040
const InnerComponent =
4141
InnerComponentFromConfig ||
42-
class Component extends React.Component {
43-
render() {
44-
const { className, as, forwardedRef, ...props } = this.props
45-
const Component = as || defaultComponent
42+
function Component({ className, as, forwardedRef, ...props }) {
43+
const Component = as || defaultComponent
4644

47-
const renderProps = {
48-
ref: forwardedRef,
49-
Component,
50-
className: className
51-
? `${baseClassName} ${className}`
52-
: baseClassName,
53-
...omit(props, omittedProps),
54-
}
55-
56-
return render(renderProps)
45+
const renderProps = {
46+
ref: forwardedRef,
47+
Component,
48+
className: className ? `${baseClassName} ${className}` : baseClassName,
49+
...omit(props, omittedProps),
5750
}
51+
52+
return render(renderProps)
5853
}
5954

6055
InnerComponent.displayName = `sui-${name}`

packages/shared/core/hooks/usePopper.js

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import PopperJs from 'popper.js'
44
export default function usePopper(
55
containerRef,
66
elementRef,
7-
{ placement = 'top' } = {},
7+
{ placement = 'auto' } = {},
88
) {
99
useEffect(() => {
1010
const container = containerRef.current
@@ -16,3 +16,21 @@ export default function usePopper(
1616
return () => popper.destroy()
1717
}, [containerRef, elementRef, placement])
1818
}
19+
20+
export const placements = [
21+
'auto',
22+
'auto-start',
23+
'auto-end',
24+
'top',
25+
'top-start',
26+
'top-end',
27+
'right',
28+
'right-start',
29+
'right-end',
30+
'bottom',
31+
'bottom-start',
32+
'bottom-end',
33+
'left',
34+
'left-start',
35+
'left-end',
36+
]

0 commit comments

Comments
 (0)