playbook_ui 12.35.0 → 12.36.0.pre.alpha.PLAY942collapsiblenav21035
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/pb_kits/playbook/index.js +2 -1
- data/app/pb_kits/playbook/pb_collapsible/_collapsible.tsx +15 -13
- data/app/pb_kits/playbook/pb_collapsible/child_kits/CollapsibleMain.tsx +24 -8
- data/app/pb_kits/playbook/pb_collapsible/collapsible_main.html.erb +1 -1
- data/app/pb_kits/playbook/pb_collapsible/docs/_collapsible_icons.jsx +15 -4
- data/app/pb_kits/playbook/pb_collapsible/docs/example.yml +2 -2
- data/app/pb_kits/playbook/pb_collapsible/useCollapsible.tsx +14 -0
- data/app/pb_kits/playbook/pb_dialog/dialogHelper.js +7 -3
- data/app/pb_kits/playbook/pb_nav/_collapsible_nav.scss +22 -1
- data/app/pb_kits/playbook/pb_nav/_item.tsx +26 -2
- data/app/pb_kits/playbook/pb_nav/docs/_collapsible_nav.jsx +59 -79
- data/app/pb_kits/playbook/pb_nav/docs/_collapsible_nav_custom_icons.jsx +4 -6
- data/app/pb_kits/playbook/pb_nav/docs/example.yml +2 -2
- data/app/pb_kits/playbook/pb_nav/item.rb +5 -1
- data/app/pb_kits/playbook/pb_popover/_popover.tsx +14 -6
- data/app/pb_kits/playbook/pb_popover/docs/_popover_close.jsx +2 -0
- data/app/pb_kits/playbook/pb_popover/index.ts +5 -2
- data/dist/playbook-rails.js +7 -7
- data/lib/playbook/version.rb +2 -2
- metadata +8 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6db34cdefea717b8e05435f34ffeca2768916aafc09c5fc75fe585cf29eeed83
|
4
|
+
data.tar.gz: '079ed7c7c64c2c7ee0825b84398cb909e08d08badd9cab8fb16870c4391210f0'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 96a3770480378c8930a578bf3c021aebcce6cf4dd8f45b9c6de753bfa67768334db24beede7c1f24d64b522cb4607c174bd7b120a4c24eada9d71c68427d70d0
|
7
|
+
data.tar.gz: 3708ce113f29d42deeaea57d6e166676fe51d9e9618a1d11383e82a2bf8658497b62dadd111ba2a2332ca5edf69f56cab283639da997399c07b3be04cda70093
|
@@ -129,4 +129,5 @@ export { default as PbTypeahead } from './pb_typeahead'
|
|
129
129
|
export { default as dialogHelper } from './pb_dialog/dialogHelper'
|
130
130
|
|
131
131
|
//Theming
|
132
|
-
export {default as mapTheme} from './pb_map/pbMapTheme'
|
132
|
+
export {default as mapTheme} from './pb_map/pbMapTheme'
|
133
|
+
export {default as useCollapsible} from './pb_collapsible/useCollapsible'
|
@@ -1,5 +1,6 @@
|
|
1
|
-
import React, {
|
1
|
+
import React, { useEffect } from 'react'
|
2
2
|
import classnames from 'classnames'
|
3
|
+
import useCollapsible from './useCollapsible'
|
3
4
|
|
4
5
|
import { globalProps } from '../utilities/globalProps'
|
5
6
|
import { buildAriaProps, buildCss, buildDataProps } from '../utilities/props'
|
@@ -16,20 +17,15 @@ type CollapsibleProps = {
|
|
16
17
|
className?: string,
|
17
18
|
collapsed?: boolean,
|
18
19
|
data?: object,
|
19
|
-
icon?: string | string[]
|
20
|
+
icon?: string | string[],
|
20
21
|
iconColor?: 'default' | 'light' | 'lighter' | 'link' | 'error' | 'success',
|
21
|
-
iconSize?: IconSizes
|
22
|
+
iconSize?: IconSizes,
|
23
|
+
iconClick?: ()=> void,
|
24
|
+
onClick?: ()=> void,
|
22
25
|
id?: string,
|
23
26
|
}
|
24
27
|
|
25
|
-
const useCollapsible = (initial = false) => {
|
26
|
-
const [collapsed, setCollapsed] = useState(initial)
|
27
28
|
|
28
|
-
return [
|
29
|
-
collapsed,
|
30
|
-
() => setCollapsed((t) => !t),
|
31
|
-
]
|
32
|
-
}
|
33
29
|
|
34
30
|
const Collapsible = ({
|
35
31
|
aria = {},
|
@@ -40,10 +36,17 @@ const Collapsible = ({
|
|
40
36
|
icon,
|
41
37
|
iconColor = 'default',
|
42
38
|
iconSize,
|
39
|
+
iconClick,
|
40
|
+
onClick,
|
43
41
|
id,
|
44
42
|
...props
|
45
43
|
}: CollapsibleProps) => {
|
46
|
-
const [isCollapsed,
|
44
|
+
const [isCollapsed, toggle, setIsCollapsed] = useCollapsible(collapsed)
|
45
|
+
|
46
|
+
useEffect(()=> {
|
47
|
+
setIsCollapsed(collapsed)
|
48
|
+
},[collapsed])
|
49
|
+
|
47
50
|
const CollapsibleParent = React.Children.toArray(children) as JSX.Element[]
|
48
51
|
|
49
52
|
if (CollapsibleParent.length !== 2) {
|
@@ -62,9 +65,8 @@ const Collapsible = ({
|
|
62
65
|
globalProps(props),
|
63
66
|
className
|
64
67
|
)
|
65
|
-
|
66
68
|
return (
|
67
|
-
<CollapsibleContext.Provider value={{ collapsed: isCollapsed,
|
69
|
+
<CollapsibleContext.Provider value={{ collapsed: isCollapsed, toggle, icon, iconSize, iconColor, iconClick, onClick }}>
|
68
70
|
<div
|
69
71
|
{...ariaProps}
|
70
72
|
{...dataProps}
|
@@ -33,7 +33,7 @@ type CollapsibleMainProps = {
|
|
33
33
|
children: React.ReactNode[] | React.ReactNode,
|
34
34
|
className?: string,
|
35
35
|
cursor?: string,
|
36
|
-
|
36
|
+
onClick?: ()=> void
|
37
37
|
}
|
38
38
|
type IconColors = "default" | "light" | "lighter" | "link" | "error" | "success"
|
39
39
|
|
@@ -42,9 +42,10 @@ type IconProps = {
|
|
42
42
|
icon?: string[] | string
|
43
43
|
iconColor?: IconColors
|
44
44
|
iconSize?: IconSizes
|
45
|
+
iconClick?: ()=> void
|
45
46
|
}
|
46
47
|
|
47
|
-
const ToggleIcon = ({ collapsed, icon, iconSize, iconColor }: IconProps) => {
|
48
|
+
const ToggleIcon = ({ collapsed, icon, iconSize, iconColor, iconClick }: IconProps) => {
|
48
49
|
const color = colorMap[iconColor]
|
49
50
|
|
50
51
|
const showIcon = (icon: string |string[]) => {
|
@@ -54,6 +55,13 @@ const ToggleIcon = ({ collapsed, icon, iconSize, iconColor }: IconProps) => {
|
|
54
55
|
return icon
|
55
56
|
}
|
56
57
|
|
58
|
+
const handleIconClick = (e:any) => {
|
59
|
+
if (iconClick) {
|
60
|
+
e.stopPropagation();
|
61
|
+
iconClick()
|
62
|
+
}
|
63
|
+
}
|
64
|
+
|
57
65
|
return (
|
58
66
|
<>
|
59
67
|
{collapsed ? (
|
@@ -61,6 +69,7 @@ const ToggleIcon = ({ collapsed, icon, iconSize, iconColor }: IconProps) => {
|
|
61
69
|
className="icon_wrapper"
|
62
70
|
key={icon ? showIcon(icon)[0] : "chevron-down"}
|
63
71
|
style={{ verticalAlign: "middle", color: color }}
|
72
|
+
onClick={(e)=> handleIconClick(e)}
|
64
73
|
>
|
65
74
|
<Icon icon={icon ? showIcon(icon)[0] : "chevron-down"} size={iconSize} />
|
66
75
|
</div>
|
@@ -69,6 +78,7 @@ const ToggleIcon = ({ collapsed, icon, iconSize, iconColor }: IconProps) => {
|
|
69
78
|
className="icon_wrapper"
|
70
79
|
key={icon ? showIcon(icon)[1] : "chevron-up"}
|
71
80
|
style={{ verticalAlign: "middle", color: color }}
|
81
|
+
onClick={(e)=> handleIconClick(e)}
|
72
82
|
>
|
73
83
|
<Icon icon={icon ? showIcon(icon)[1] : "chevron-up"} size={iconSize} />
|
74
84
|
</div>
|
@@ -83,13 +93,18 @@ const CollapsibleMain = ({
|
|
83
93
|
cursor = 'pointer',
|
84
94
|
...props
|
85
95
|
}: CollapsibleMainProps): React.ReactElement=> {
|
86
|
-
const
|
96
|
+
const {collapsed, toggle, icon, iconSize, iconColor, iconClick, onClick}: any = useContext(CollapsibleContext)
|
87
97
|
const mainCSS = buildCss('pb_collapsible_main_kit')
|
88
98
|
const mainSpacing = globalProps(props, { cursor })
|
89
99
|
|
100
|
+
const handleCollapsibleClick = (e:any) => {
|
101
|
+
toggle();
|
102
|
+
onClick && onClick(e)
|
103
|
+
}
|
104
|
+
|
90
105
|
return (
|
91
106
|
<div className={classnames(mainCSS, className, mainSpacing)}>
|
92
|
-
<div onClick={
|
107
|
+
<div onClick={(e)=>handleCollapsibleClick(e)}>
|
93
108
|
<Flex
|
94
109
|
spacing="between"
|
95
110
|
vertical="center"
|
@@ -97,10 +112,11 @@ const CollapsibleMain = ({
|
|
97
112
|
<FlexItem>{children}</FlexItem>
|
98
113
|
<FlexItem>
|
99
114
|
<ToggleIcon
|
100
|
-
collapsed={
|
101
|
-
iconColor={
|
102
|
-
iconSize={
|
103
|
-
icon={
|
115
|
+
collapsed={collapsed as () => void}
|
116
|
+
iconColor={iconColor as IconColors}
|
117
|
+
iconSize={iconSize as IconSizes}
|
118
|
+
icon={icon as string[] | string}
|
119
|
+
iconClick={iconClick}
|
104
120
|
/>
|
105
121
|
</FlexItem>
|
106
122
|
</Flex>
|
@@ -9,7 +9,7 @@
|
|
9
9
|
<%= content.presence %>
|
10
10
|
<% end %>
|
11
11
|
<%= pb_rails("flex/flex_item") do %>
|
12
|
-
<div style="color: <%= object.icon_color %>">
|
12
|
+
<div style="color: <%= object.icon_color %>" class="icon_wrapper" >
|
13
13
|
<% if object.icon.present? %>
|
14
14
|
<%= pb_rails("icon", props: { icon: object.show_icon(object.icon)[0], id:"collapsible_open_icon", size: object.size }) %>
|
15
15
|
<%= pb_rails("icon", props: { icon: object.show_icon(object.icon)[1], id:"collapsible_close_icon", size: object.size }) %>
|
@@ -1,8 +1,17 @@
|
|
1
1
|
import React from 'react'
|
2
|
-
import { Collapsible } from '../..'
|
2
|
+
import { Collapsible, useCollapsible, Button } from '../..'
|
3
3
|
|
4
|
-
const CollapsibleIcons = () =>
|
5
|
-
|
4
|
+
const CollapsibleIcons = () => {
|
5
|
+
const [isCollapsed, setIsCollapsed] = useCollapsible(true)
|
6
|
+
|
7
|
+
return (
|
8
|
+
<>
|
9
|
+
<Button onClick={()=> setIsCollapsed(!isCollapsed)}>
|
10
|
+
{isCollapsed ? "Expand" : "Collapse"}
|
11
|
+
</Button>
|
12
|
+
<Collapsible collapsed={isCollapsed}
|
13
|
+
icon={['plus','minus']}
|
14
|
+
>
|
6
15
|
<Collapsible.Main>
|
7
16
|
<div>{'Main Section'}</div>
|
8
17
|
</Collapsible.Main>
|
@@ -14,6 +23,8 @@ const CollapsibleIcons = () => (
|
|
14
23
|
</div>
|
15
24
|
</Collapsible.Content>
|
16
25
|
</Collapsible>
|
17
|
-
|
26
|
+
</>
|
27
|
+
)
|
28
|
+
}
|
18
29
|
|
19
30
|
export default CollapsibleIcons
|
@@ -4,10 +4,10 @@ examples:
|
|
4
4
|
- collapsible_default: Default
|
5
5
|
- collapsible_size: Size
|
6
6
|
- collapsible_color: Color
|
7
|
-
|
7
|
+
- collapsible_icons: Custom Icons
|
8
8
|
|
9
9
|
react:
|
10
10
|
- collapsible_default: Default
|
11
11
|
- collapsible_size: Size
|
12
12
|
- collapsible_color: Color
|
13
|
-
|
13
|
+
- collapsible_icons: Custom Icons
|
@@ -0,0 +1,14 @@
|
|
1
|
+
import {useState} from 'react';
|
2
|
+
|
3
|
+
const useCollapsible = (initial= true) => {
|
4
|
+
const [collapsed, setCollapsed] = useState(initial)
|
5
|
+
|
6
|
+
const toggle = () => setCollapsed((prev) => !prev)
|
7
|
+
return [
|
8
|
+
collapsed,
|
9
|
+
toggle,
|
10
|
+
setCollapsed as any,
|
11
|
+
]
|
12
|
+
}
|
13
|
+
|
14
|
+
export default useCollapsible
|
@@ -21,13 +21,17 @@ const dialogHelper = () => {
|
|
21
21
|
|
22
22
|
// Close dialog box on outside click
|
23
23
|
dialogs.forEach((dialogElement) => {
|
24
|
-
dialogElement.addEventListener("
|
24
|
+
dialogElement.addEventListener("mousedown", (event) => {
|
25
25
|
const dialogParentDataset = dialogElement.parentElement.dataset
|
26
26
|
if (dialogParentDataset.overlayClick === "overlay_close") return
|
27
27
|
|
28
|
-
const
|
28
|
+
const dialogModal = event.target.getBoundingClientRect()
|
29
|
+
const clickedOutsideDialogModal = event.clientX < dialogModal.left ||
|
30
|
+
event.clientX > dialogModal.right ||
|
31
|
+
event.clientY < dialogModal.top ||
|
32
|
+
event.clientY > dialogModal.bottom
|
29
33
|
|
30
|
-
if (
|
34
|
+
if (clickedOutsideDialogModal) {
|
31
35
|
dialogElement.close()
|
32
36
|
event.stopPropagation()
|
33
37
|
}
|
@@ -1,6 +1,27 @@
|
|
1
|
+
@import "../tokens/spacing";
|
2
|
+
@import "../tokens/colors";
|
3
|
+
@import "../tokens/border_radius";
|
4
|
+
|
1
5
|
[class^="pb_nav_list"] {
|
6
|
+
.pb_collapsible_nav_item {
|
2
7
|
.pb_collapsible_main_kit,
|
3
|
-
.pb_collapsible_content_kit
|
8
|
+
.pb_collapsible_content_kit,
|
9
|
+
.pb_collapsible_kit {
|
4
10
|
padding: 0 !important;
|
5
11
|
}
|
12
|
+
|
13
|
+
.icon_wrapper {
|
14
|
+
border-radius: $border_radius_rounded;
|
15
|
+
width: 19px;
|
16
|
+
height: 19px;
|
17
|
+
display:flex;
|
18
|
+
align-items: center;
|
19
|
+
justify-content: center;
|
20
|
+
margin-right: $space_xs;
|
21
|
+
&:hover {
|
22
|
+
background-color: rgba($primary_action, $opacity_3);
|
23
|
+
|
24
|
+
}
|
25
|
+
}
|
26
|
+
}
|
6
27
|
}
|
@@ -14,15 +14,19 @@ type NavItemProps = {
|
|
14
14
|
children?: React.ReactNode[] | React.ReactNode,
|
15
15
|
className?: string,
|
16
16
|
collapsible?: boolean,
|
17
|
+
collapsibleClick?: () => void,
|
17
18
|
data?: object,
|
18
19
|
iconLeft?: string,
|
19
20
|
iconRight?: string | string[],
|
21
|
+
iconRightClick?: () => void,
|
22
|
+
iconLeftClick?: () => void,
|
20
23
|
id?: string,
|
21
24
|
imageUrl?: string,
|
22
25
|
link?: string,
|
23
26
|
onClick?: React.MouseEventHandler<HTMLElement>,
|
24
27
|
target?: '_blank' | '_self' | '_parent' | '_top',
|
25
28
|
text: string,
|
29
|
+
toggleCollapsed?: any
|
26
30
|
} & GlobalProps
|
27
31
|
|
28
32
|
const NavItem = (props: NavItemProps) => {
|
@@ -32,22 +36,34 @@ const NavItem = (props: NavItemProps) => {
|
|
32
36
|
children,
|
33
37
|
className,
|
34
38
|
collapsible,
|
39
|
+
collapsibleClick,
|
35
40
|
data = {},
|
36
41
|
iconLeft,
|
37
42
|
iconRight,
|
43
|
+
iconRightClick,
|
44
|
+
iconLeftClick,
|
38
45
|
id,
|
39
46
|
imageUrl,
|
40
47
|
link,
|
41
48
|
onClick = () => { },
|
42
49
|
target = '_self',
|
43
50
|
text = '',
|
51
|
+
toggleCollapsed
|
44
52
|
} = props
|
45
53
|
|
46
54
|
const Tag = link ? 'a' : 'div'
|
47
55
|
const activeClass = active === true ? 'active' : ''
|
48
56
|
const ariaProps = buildAriaProps(aria)
|
49
57
|
const dataProps = buildDataProps(data)
|
50
|
-
const classes = classnames(buildCss('pb_nav_list_kit_item', activeClass), globalProps(props), className)
|
58
|
+
const classes = classnames(buildCss('pb_nav_list_kit_item', activeClass), collapsible ? 'pb_collapsible_nav_item' : '', globalProps(props), className)
|
59
|
+
|
60
|
+
|
61
|
+
const handleIconClick = (e:any) => {
|
62
|
+
if (iconLeftClick) {
|
63
|
+
e.stopPropagation();
|
64
|
+
iconLeftClick()
|
65
|
+
}
|
66
|
+
}
|
51
67
|
|
52
68
|
return (
|
53
69
|
<li
|
@@ -58,7 +74,13 @@ const NavItem = (props: NavItemProps) => {
|
|
58
74
|
>
|
59
75
|
{
|
60
76
|
collapsible ? (
|
61
|
-
<Collapsible icon={iconRight ? iconRight : ['plus','minus']}
|
77
|
+
<Collapsible icon={iconRight ? iconRight : ['plus','minus']}
|
78
|
+
iconSize="xs"
|
79
|
+
id={id}
|
80
|
+
collapsed={toggleCollapsed}
|
81
|
+
iconClick={iconRightClick}
|
82
|
+
onClick={collapsibleClick}
|
83
|
+
>
|
62
84
|
<Collapsible.Main>
|
63
85
|
<Tag
|
64
86
|
className="pb_nav_list_item_link"
|
@@ -70,6 +92,7 @@ const NavItem = (props: NavItemProps) => {
|
|
70
92
|
<div
|
71
93
|
className="pb_nav_list_item_icon_section"
|
72
94
|
key={imageUrl}
|
95
|
+
onClick={(e)=>handleIconClick(e)}
|
73
96
|
>
|
74
97
|
<Image
|
75
98
|
className="pb_nav_img_wrapper"
|
@@ -82,6 +105,7 @@ const NavItem = (props: NavItemProps) => {
|
|
82
105
|
<div
|
83
106
|
className="pb_nav_list_item_icon_section"
|
84
107
|
key={iconLeft}
|
108
|
+
onClick={(e)=>handleIconClick(e)}
|
85
109
|
>
|
86
110
|
<Icon
|
87
111
|
className="pb_nav_list_item_icon_left"
|
@@ -1,83 +1,63 @@
|
|
1
|
-
import React from "react"
|
2
|
-
|
3
|
-
import Nav from "../_nav";
|
4
|
-
import NavItem from "../_item";
|
1
|
+
import React from "react"
|
2
|
+
import { Nav, NavItem, useCollapsible } from "../.."
|
5
3
|
|
6
4
|
const CollapsibleNav = (props) => {
|
5
|
+
const navItems = ["Overview", "Albums", "Similar Artists"]
|
6
|
+
// eslint-disable-next-line react-hooks/rules-of-hooks
|
7
|
+
const collapsibles = navItems.map(() => useCollapsible(true))
|
8
|
+
|
9
|
+
const handleMainClick = (index) => {
|
10
|
+
collapsibles.forEach(([, , setCollapsed], idx) => {
|
11
|
+
if (idx === index) {
|
12
|
+
setCollapsed(false)
|
13
|
+
} else {
|
14
|
+
setCollapsed(true)
|
15
|
+
}
|
16
|
+
})
|
17
|
+
}
|
18
|
+
|
19
|
+
|
20
|
+
const handleIconRightClick = (index) => {
|
21
|
+
const [isCollapsed, setCollapsed] = collapsibles[index]
|
22
|
+
setCollapsed(!isCollapsed)
|
23
|
+
}
|
24
|
+
|
7
25
|
return (
|
8
|
-
|
9
|
-
<
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
/>
|
45
|
-
<NavItem
|
46
|
-
link="#"
|
47
|
-
text="Food"
|
48
|
-
{...props}
|
49
|
-
/>
|
50
|
-
<NavItem
|
51
|
-
link="#"
|
52
|
-
text="Style"
|
53
|
-
{...props}
|
54
|
-
/>
|
55
|
-
</NavItem>
|
56
|
-
<NavItem
|
57
|
-
collapsible
|
58
|
-
iconLeft="city"
|
59
|
-
link="#"
|
60
|
-
text="Similar Artists"
|
61
|
-
{...props}
|
62
|
-
>
|
63
|
-
<NavItem
|
64
|
-
link="#"
|
65
|
-
text="City"
|
66
|
-
{...props}
|
67
|
-
/>
|
68
|
-
<NavItem
|
69
|
-
link="#"
|
70
|
-
text="People"
|
71
|
-
{...props}
|
72
|
-
/>
|
73
|
-
<NavItem
|
74
|
-
link="#"
|
75
|
-
text="Business"
|
76
|
-
{...props}
|
77
|
-
/>
|
78
|
-
</NavItem>
|
79
|
-
</Nav>
|
80
|
-
);
|
81
|
-
};
|
26
|
+
<>
|
27
|
+
<Nav variant='subtle'>
|
28
|
+
{navItems.map((text, index) => {
|
29
|
+
const [collapsed] = collapsibles[index]
|
30
|
+
return (
|
31
|
+
<NavItem
|
32
|
+
collapsible
|
33
|
+
collapsibleClick={() => handleMainClick(index)}
|
34
|
+
iconLeft="chevron-down"
|
35
|
+
iconRightClick={() => handleIconRightClick(index)}
|
36
|
+
id={`collapsible-nav-item-${index + 1}`}
|
37
|
+
key={index}
|
38
|
+
link="#"
|
39
|
+
text={text}
|
40
|
+
toggleCollapsed={collapsed}
|
41
|
+
{...props}
|
42
|
+
>
|
43
|
+
<NavItem link="#"
|
44
|
+
text="City"
|
45
|
+
{...props}
|
46
|
+
/>
|
47
|
+
<NavItem link="#"
|
48
|
+
text="People"
|
49
|
+
{...props}
|
50
|
+
/>
|
51
|
+
<NavItem link="#"
|
52
|
+
text="Business"
|
53
|
+
{...props}
|
54
|
+
/>
|
55
|
+
</NavItem>
|
56
|
+
);
|
57
|
+
})}
|
58
|
+
</Nav>
|
59
|
+
</>
|
60
|
+
)
|
61
|
+
}
|
82
62
|
|
83
|
-
export default CollapsibleNav
|
63
|
+
export default CollapsibleNav
|
@@ -1,7 +1,5 @@
|
|
1
1
|
import React from "react";
|
2
|
-
|
3
|
-
import Nav from "../_nav";
|
4
|
-
import NavItem from "../_item";
|
2
|
+
import { Nav, NavItem } from '../..'
|
5
3
|
|
6
4
|
const CollapsibleNavCustomIcons = (props) => {
|
7
5
|
return (
|
@@ -9,7 +7,7 @@ const CollapsibleNavCustomIcons = (props) => {
|
|
9
7
|
<NavItem
|
10
8
|
collapsible
|
11
9
|
iconLeft="city"
|
12
|
-
iconRight={["
|
10
|
+
iconRight={["plus", "minus"]}
|
13
11
|
link="#"
|
14
12
|
text="Overview"
|
15
13
|
{...props}
|
@@ -34,7 +32,7 @@ const CollapsibleNavCustomIcons = (props) => {
|
|
34
32
|
active
|
35
33
|
collapsible
|
36
34
|
iconLeft="theater-masks"
|
37
|
-
iconRight={["
|
35
|
+
iconRight={["plus", "minus"]}
|
38
36
|
link="#"
|
39
37
|
text="Albums"
|
40
38
|
{...props}
|
@@ -58,7 +56,7 @@ const CollapsibleNavCustomIcons = (props) => {
|
|
58
56
|
<NavItem
|
59
57
|
collapsible
|
60
58
|
iconLeft="city"
|
61
|
-
iconRight={["
|
59
|
+
iconRight={["plus", "minus"]}
|
62
60
|
link="#"
|
63
61
|
text="Similar Artists"
|
64
62
|
{...props}
|
@@ -25,8 +25,8 @@ examples:
|
|
25
25
|
- borderless_nav: No Borders
|
26
26
|
- subtle_nav: Subtle Variant
|
27
27
|
- subtle_with_icons_nav: Subtle With Icons
|
28
|
-
|
29
|
-
|
28
|
+
- collapsible_nav: Subtle With Collapsible
|
29
|
+
- collapsible_nav_custom_icons: Subtle With Collapsible (No custom toggling)
|
30
30
|
- subtle_no_highlight_nav: Subtle No Highlight
|
31
31
|
- bold_vertical_nav: Bold Variant
|
32
32
|
- horizontal_nav: Horizontal Nav
|
@@ -14,7 +14,11 @@ module Playbook
|
|
14
14
|
values: %w[_blank _self _parent _top],
|
15
15
|
default: "_self"
|
16
16
|
def classname
|
17
|
-
|
17
|
+
if collapsible
|
18
|
+
"pb_collapsible_nav_item #{generate_classname('pb_nav_list_kit_item', active_class)}"
|
19
|
+
else
|
20
|
+
generate_classname("pb_nav_list_kit_item", active_class)
|
21
|
+
end
|
18
22
|
end
|
19
23
|
|
20
24
|
def tag
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import React, { useEffect } from "react";
|
1
|
+
import React, { useEffect, useState } from "react";
|
2
2
|
import ReactDOM from "react-dom";
|
3
3
|
import {
|
4
4
|
Popper,
|
@@ -17,6 +17,7 @@ import {
|
|
17
17
|
|
18
18
|
import classnames from "classnames";
|
19
19
|
import { globalProps, GlobalProps } from "../utilities/globalProps";
|
20
|
+
import _uniqueId from 'lodash/uniqueId';
|
20
21
|
|
21
22
|
type PbPopoverProps = {
|
22
23
|
aria?: { [key: string]: string };
|
@@ -72,6 +73,7 @@ const Popover = (props: PbPopoverProps) => {
|
|
72
73
|
maxWidth,
|
73
74
|
minHeight,
|
74
75
|
minWidth,
|
76
|
+
targetId,
|
75
77
|
} = props;
|
76
78
|
|
77
79
|
const popoverSpacing =
|
@@ -123,6 +125,7 @@ const Popover = (props: PbPopoverProps) => {
|
|
123
125
|
popoverSpacing,
|
124
126
|
overflowHandling
|
125
127
|
)}
|
128
|
+
id={targetId}
|
126
129
|
style={widthHeightStyles()}
|
127
130
|
>
|
128
131
|
{children}
|
@@ -136,6 +139,7 @@ const Popover = (props: PbPopoverProps) => {
|
|
136
139
|
};
|
137
140
|
|
138
141
|
const PbReactPopover = (props: PbPopoverProps) => {
|
142
|
+
const [targetId] = useState(_uniqueId('id-'))
|
139
143
|
const {
|
140
144
|
className,
|
141
145
|
children,
|
@@ -163,25 +167,27 @@ const PbReactPopover = (props: PbPopoverProps) => {
|
|
163
167
|
"click",
|
164
168
|
({ target }) => {
|
165
169
|
const targetIsPopover =
|
166
|
-
(target as HTMLElement).closest("
|
170
|
+
(target as HTMLElement).closest("#" + targetId) !==
|
167
171
|
null;
|
168
172
|
const targetIsReference =
|
169
|
-
(target as HTMLElement).closest("
|
173
|
+
(target as HTMLElement).closest("#reference-" + targetId) !==
|
170
174
|
null;
|
171
175
|
|
172
176
|
switch (closeOnClick) {
|
173
177
|
case "outside":
|
174
|
-
if (!targetIsPopover
|
178
|
+
if (!targetIsPopover && !targetIsReference) {
|
175
179
|
shouldClosePopover(true);
|
176
180
|
}
|
177
181
|
break;
|
178
182
|
case "inside":
|
179
|
-
if (targetIsPopover
|
183
|
+
if (targetIsPopover) {
|
180
184
|
shouldClosePopover(true);
|
181
185
|
}
|
182
186
|
break;
|
183
187
|
case "any":
|
184
|
-
|
188
|
+
if (targetIsPopover || !targetIsPopover && !targetIsReference) {
|
189
|
+
shouldClosePopover(true);
|
190
|
+
}
|
185
191
|
break;
|
186
192
|
}
|
187
193
|
},
|
@@ -200,6 +206,7 @@ const PbReactPopover = (props: PbPopoverProps) => {
|
|
200
206
|
offset={offset}
|
201
207
|
placement={placement}
|
202
208
|
referenceElement={referenceElement}
|
209
|
+
targetId={targetId}
|
203
210
|
zIndex={zIndex}
|
204
211
|
{...props}
|
205
212
|
>
|
@@ -214,6 +221,7 @@ const PbReactPopover = (props: PbPopoverProps) => {
|
|
214
221
|
<PopperReference>
|
215
222
|
{({ ref }) => (
|
216
223
|
<span
|
224
|
+
id={"reference-" + targetId}
|
217
225
|
className="pb_popover_reference_wrapper"
|
218
226
|
ref={ref}>
|
219
227
|
<reference.type {...reference.props} />
|