playbook_ui 7.3.0.pre.alpha10 → 7.4.0.pre.alpha2
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/pb_collapsible/_collapsible.html.erb +1 -1
- data/app/pb_kits/playbook/pb_collapsible/_collapsible.jsx +50 -110
- data/app/pb_kits/playbook/pb_collapsible/_collapsible.scss +1 -1
- data/app/pb_kits/playbook/pb_collapsible/child_kits/CollapsibleContent.jsx +40 -0
- data/app/pb_kits/playbook/pb_collapsible/child_kits/CollapsibleMain.jsx +58 -0
- data/app/pb_kits/playbook/pb_collapsible/docs/_collapsible_dark.html.erb +1 -1
- data/app/pb_kits/playbook/pb_collapsible/docs/_collapsible_default.html.erb +1 -1
- data/app/pb_kits/playbook/pb_collapsible/docs/_collapsible_default.jsx +12 -10
- data/app/pb_kits/playbook/pb_collapsible/index.js +2 -2
- data/lib/playbook/version.rb +1 -1
- metadata +4 -3
- data/app/pb_kits/playbook/pb_collapsible/useToggler.js +0 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fc2cc41654667d4db62667450bd430b73beb0746bff14266498b5f99ec5909a3
|
4
|
+
data.tar.gz: 89ec1b4304d12c8101ee5b61637e5ef22a8d3295e041633873a7a42892ddef56
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a5cba0cc9c3b7e04462251f81c75326a04a89960efe3dcbf8d811f1f28c2858bab565bdf53c11cb78ab3c86a95e6f78de41577ac3309d607f5021afd8ddcb90b
|
7
|
+
data.tar.gz: 77bc046395a15e34958c54a2951862870e69a36413535d4ae53c0437857b91145eb7a2770c45026c0d0ef6b7c7fe0b427924edc931fff8f9770a05319984b726
|
@@ -1,137 +1,77 @@
|
|
1
1
|
/* @flow */
|
2
2
|
|
3
|
-
import classnames from
|
4
|
-
import {
|
5
|
-
import {
|
6
|
-
import
|
7
|
-
import
|
8
|
-
import
|
9
|
-
|
3
|
+
import classnames from 'classnames'
|
4
|
+
import React, { useState } from 'react'
|
5
|
+
import { globalProps } from '../utilities/globalProps.js'
|
6
|
+
import { buildAriaProps, buildCss, buildDataProps } from '../utilities/props'
|
7
|
+
import CollapsibleContent from './child_kits/CollapsibleContent'
|
8
|
+
import CollapsibleMain from './child_kits/CollapsibleMain'
|
9
|
+
|
10
|
+
export const CollapsibleContext = React.createContext({})
|
10
11
|
|
11
12
|
type CollapsibleProps = {
|
12
13
|
children: React.ChildrenArray<React.Element<typeof Main | Content>>,
|
13
14
|
aria?: object,
|
14
15
|
className?: string,
|
16
|
+
collapsed?: boolean,
|
15
17
|
data?: object,
|
16
18
|
id?: string,
|
17
|
-
}
|
18
|
-
|
19
|
-
type CollapsibleMainProps = {
|
20
|
-
children: array<React.ReactNode> | React.ReactNode,
|
21
|
-
className?: string,
|
22
|
-
padding?: string,
|
23
|
-
}
|
24
|
-
|
25
|
-
type CollapsibleContentProps = {
|
26
|
-
children: array<React.ReactNode> | React.ReactNode | string,
|
27
|
-
className?: string,
|
28
19
|
padding?: string,
|
29
20
|
}
|
30
21
|
|
31
|
-
const
|
32
|
-
const
|
33
|
-
const mainCSS = buildCss("pb_collapsible_main_kit")
|
34
|
-
const mainSpacing = globalProps(props, { padding })
|
35
|
-
|
36
|
-
return (
|
37
|
-
<div className={classnames(mainCSS, className, mainSpacing)}>
|
38
|
-
{children}
|
39
|
-
</div>
|
40
|
-
)
|
41
|
-
}
|
42
|
-
|
43
|
-
const MainType = (<Main />).type
|
44
|
-
|
45
|
-
|
46
|
-
const Content = (props: CollapsibleContentProps) => {
|
47
|
-
const { children, className, padding = "md" } = props
|
48
|
-
const contentCSS = buildCss("pb_collapsible_content_kit")
|
49
|
-
const contentSpacing = globalProps(props, { padding })
|
22
|
+
const useCollapsible = (initial = false) => {
|
23
|
+
const [collapsed, setCollapsed] = useState(initial)
|
50
24
|
|
51
|
-
return
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
)
|
25
|
+
return [
|
26
|
+
collapsed,
|
27
|
+
() => setCollapsed((t) => !t),
|
28
|
+
]
|
56
29
|
}
|
57
30
|
|
58
|
-
const Collapsible = (
|
59
|
-
|
60
|
-
|
31
|
+
const Collapsible = ({
|
32
|
+
aria = {},
|
33
|
+
className,
|
34
|
+
children = [],
|
35
|
+
collapsed = true,
|
36
|
+
data = {},
|
37
|
+
id,
|
38
|
+
padding = 'md',
|
39
|
+
...props
|
40
|
+
}: CollapsibleProps) => {
|
41
|
+
const [isCollapsed, collapse] = useCollapsible(collapsed)
|
42
|
+
const Main = React.Children.toArray(children).find((child) => child.type === CollapsibleMain)
|
43
|
+
const Content = React.Children.toArray(children).find((child) => child.type === CollapsibleContent)
|
44
|
+
const { children: mainChildren, ...mainProps } = Main.props
|
45
|
+
const { children: contentChildren, ...contentProps } = Content.props
|
61
46
|
const ariaProps = buildAriaProps(aria)
|
62
47
|
const dataProps = buildDataProps(data)
|
63
48
|
const classes = classnames(
|
64
|
-
buildCss(
|
49
|
+
buildCss('pb_collapsible'),
|
65
50
|
className,
|
66
|
-
globalProps(props)
|
51
|
+
globalProps(props, { padding })
|
67
52
|
)
|
68
53
|
|
69
|
-
const [height, setHeight] = useState(0)
|
70
|
-
const toggleExpand = () => {
|
71
|
-
setHeight(height === 0 ? "auto" : 0)
|
72
|
-
}
|
73
|
-
|
74
|
-
const collapsibleChildren =
|
75
|
-
typeof children === "object" && children.length ? children : [children]
|
76
|
-
|
77
|
-
console.log("CollapsibleChildren:", collapsibleChildren)
|
78
|
-
|
79
|
-
const subComponentTags = (tagName) => {
|
80
|
-
console.log("TagName:", tagName)
|
81
|
-
return collapsibleChildren
|
82
|
-
.filter((c) => get(c, "type.name") === tagName)
|
83
|
-
.map((child, i) => {
|
84
|
-
console.log("the child:", child)
|
85
|
-
return React.cloneElement(child, {
|
86
|
-
key: `${tagName.toLowerCase()}-${i}`,
|
87
|
-
})
|
88
|
-
})
|
89
|
-
}
|
90
|
-
|
91
|
-
const renderChevron = (height) => {
|
92
|
-
const direction = height === 0 ? "down" : "up"
|
93
|
-
|
94
|
-
return (
|
95
|
-
<div key={direction} style={{ verticalAlign: "middle" }}>
|
96
|
-
<i className={`far fa-2x fa-chevron-${direction} fa-fw`} />
|
97
|
-
</div>
|
98
|
-
)
|
99
|
-
}
|
100
|
-
|
101
|
-
const renderMain = () => {
|
102
|
-
const mainTags = subComponentTags("Main")
|
103
|
-
|
104
|
-
return (
|
105
|
-
<div onClick={toggleExpand}>
|
106
|
-
<Flex spacing='between' vertical='center'>
|
107
|
-
<FlexItem>{mainTags}</FlexItem>
|
108
|
-
<FlexItem>{renderChevron(height)}</FlexItem>
|
109
|
-
</Flex>
|
110
|
-
</div>
|
111
|
-
)
|
112
|
-
}
|
113
|
-
|
114
|
-
const renderContent = () => {
|
115
|
-
const nonMainChildren = collapsibleChildren.filter(
|
116
|
-
(child) => child.type !== MainType
|
117
|
-
)
|
118
|
-
console.log("NonMainChildren:", nonMainChildren)
|
119
|
-
return (
|
120
|
-
<AnimateHeight duration={500} height={height} id='bottom-section'>
|
121
|
-
{nonMainChildren}
|
122
|
-
</AnimateHeight>
|
123
|
-
)
|
124
|
-
}
|
125
|
-
|
126
54
|
return (
|
127
|
-
<
|
128
|
-
|
129
|
-
|
130
|
-
|
55
|
+
<CollapsibleContext.Provider value={{ collapsed: isCollapsed, collapse }}>
|
56
|
+
<div
|
57
|
+
{...ariaProps}
|
58
|
+
{...dataProps}
|
59
|
+
className={classes}
|
60
|
+
id={id}
|
61
|
+
>
|
62
|
+
<CollapsibleMain {...mainProps}>
|
63
|
+
{mainChildren}
|
64
|
+
</CollapsibleMain>
|
65
|
+
|
66
|
+
<CollapsibleContent {...contentProps}>
|
67
|
+
{contentChildren}
|
68
|
+
</CollapsibleContent>
|
69
|
+
</div>
|
70
|
+
</CollapsibleContext.Provider>
|
131
71
|
)
|
132
72
|
}
|
133
73
|
|
134
|
-
Collapsible.Main =
|
135
|
-
Collapsible.Content =
|
74
|
+
Collapsible.Main = CollapsibleMain
|
75
|
+
Collapsible.Content = CollapsibleContent
|
136
76
|
|
137
77
|
export default Collapsible
|
@@ -0,0 +1,40 @@
|
|
1
|
+
/* @flow */
|
2
|
+
|
3
|
+
import classnames from 'classnames'
|
4
|
+
import React, { useContext } from 'react'
|
5
|
+
import AnimateHeight from 'react-animate-height'
|
6
|
+
import { buildCss } from '../../utilities/props'
|
7
|
+
import { globalProps } from '../../utilities/globalProps.js'
|
8
|
+
|
9
|
+
import { CollapsibleContext } from '../_collapsible.jsx'
|
10
|
+
|
11
|
+
type CollapsibleContentProps = {
|
12
|
+
children: array<React.ReactNode> | React.ReactNode | string,
|
13
|
+
className?: string,
|
14
|
+
padding?: string,
|
15
|
+
}
|
16
|
+
|
17
|
+
const CollapsibleContent = ({
|
18
|
+
children,
|
19
|
+
className,
|
20
|
+
padding = 'md',
|
21
|
+
...props
|
22
|
+
}: CollapsibleContentProps) => {
|
23
|
+
const context = useContext(CollapsibleContext)
|
24
|
+
const contentCSS = buildCss('pb_collapsible_content_kit')
|
25
|
+
const contentSpacing = globalProps(props, { padding })
|
26
|
+
|
27
|
+
return (
|
28
|
+
<div className={classnames(contentCSS, className, contentSpacing)}>
|
29
|
+
<AnimateHeight
|
30
|
+
duration={300}
|
31
|
+
height={context.collapsed ? 0 : 'auto'}
|
32
|
+
id="bottom-section"
|
33
|
+
>
|
34
|
+
{children}
|
35
|
+
</AnimateHeight>
|
36
|
+
</div>
|
37
|
+
)
|
38
|
+
}
|
39
|
+
|
40
|
+
export default CollapsibleContent
|
@@ -0,0 +1,58 @@
|
|
1
|
+
/* @flow */
|
2
|
+
|
3
|
+
import classnames from 'classnames'
|
4
|
+
import { Flex, FlexItem } from '../../'
|
5
|
+
import React, { useContext } from 'react'
|
6
|
+
import { buildCss } from '../../utilities/props'
|
7
|
+
import { globalProps } from '../../utilities/globalProps.js'
|
8
|
+
import { CollapsibleContext } from '../_collapsible.jsx'
|
9
|
+
|
10
|
+
type CollapsibleMainProps = {
|
11
|
+
children: array<React.ReactNode> | React.ReactNode,
|
12
|
+
className?: string,
|
13
|
+
padding?: string,
|
14
|
+
}
|
15
|
+
|
16
|
+
type IconProps = {
|
17
|
+
collapsed: boolean
|
18
|
+
}
|
19
|
+
|
20
|
+
const Icon = ({ collapsed }: IconProps) => {
|
21
|
+
const direction = collapsed ? 'down' : 'up'
|
22
|
+
|
23
|
+
return (
|
24
|
+
<div
|
25
|
+
key={direction}
|
26
|
+
style={{ verticalAlign: 'middle' }}
|
27
|
+
>
|
28
|
+
<i className={`far fa-chevron-${direction} fa-fw`} />
|
29
|
+
</div>
|
30
|
+
)
|
31
|
+
}
|
32
|
+
|
33
|
+
const CollapsibleMain = ({
|
34
|
+
children,
|
35
|
+
className,
|
36
|
+
padding = 'md',
|
37
|
+
...props
|
38
|
+
}: CollapsibleMainProps) => {
|
39
|
+
const context = useContext(CollapsibleContext)
|
40
|
+
const mainCSS = buildCss('pb_collapsible_main_kit')
|
41
|
+
const mainSpacing = globalProps(props, { padding })
|
42
|
+
|
43
|
+
return (
|
44
|
+
<div className={classnames(mainCSS, className, mainSpacing)}>
|
45
|
+
<div onClick={() => context.collapse()}>
|
46
|
+
<Flex
|
47
|
+
spacing="between"
|
48
|
+
vertical="center"
|
49
|
+
>
|
50
|
+
<FlexItem>{children}</FlexItem>
|
51
|
+
<FlexItem><Icon collapsed={context.collapsed} /></FlexItem>
|
52
|
+
</Flex>
|
53
|
+
</div>
|
54
|
+
</div>
|
55
|
+
)
|
56
|
+
}
|
57
|
+
|
58
|
+
export default CollapsibleMain
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<%= pb_rails("collapsible", props: { dark: true }) do %>
|
2
|
-
<%= pb_rails("collapsible/collapsible_main", props: { padding: "
|
2
|
+
<%= pb_rails("collapsible/collapsible_main", props: { padding: "md", name: "dark-example" }) do %>
|
3
3
|
<%= pb_rails("body", props: { text: "Main Section", dark: true}) %>
|
4
4
|
<% end %>
|
5
5
|
<%= pb_rails("collapsible/collapsible_content", props: { padding: "md" }) do %>
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<%= pb_rails("collapsible", props: { name: "default-example" }) do %>
|
2
|
-
<%= pb_rails("collapsible/collapsible_main", props: { padding: "
|
2
|
+
<%= pb_rails("collapsible/collapsible_main", props: { padding: "md", name: "default-main" }) do %>
|
3
3
|
<%= pb_rails("body", props: { text: "Main Section"}) %>
|
4
4
|
<% end %>
|
5
5
|
<%= pb_rails("collapsible/collapsible_content", props: { padding: "md" }) do %>
|
@@ -2,16 +2,18 @@ import React from 'react'
|
|
2
2
|
import { Collapsible } from '../..'
|
3
3
|
|
4
4
|
const CollapsibleDefault = () => (
|
5
|
-
<
|
6
|
-
<Collapsible>
|
7
|
-
<
|
8
|
-
|
9
|
-
|
10
|
-
<
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
5
|
+
<Collapsible>
|
6
|
+
<Collapsible.Main>
|
7
|
+
<div>{'Main Section'}</div>
|
8
|
+
</Collapsible.Main>
|
9
|
+
<Collapsible.Content>
|
10
|
+
<div>
|
11
|
+
{
|
12
|
+
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. In vel erat sed purus hendrerit viverra. Duis et vestibulum metus. Sed consequat ut ante non vehicula. Etiam nunc massa, pharetra vel quam id, posuere rhoncus quam. Quisque imperdiet arcu enim, nec aliquet justo auctor eget. Curabitur in metus nec nunc rhoncus faucibus vitae ac elit. Nulla facilisi. Vestibulum quis pretium nulla. Nulla ut accumsan velit. Duis varius urna sed sem tempor, sit amet fermentum nibh auctor. Praesent lorem arcu, egestas non ante quis, placerat pellentesque lectus.Vestibulum lacinia ipsum quis venenatis tristique. Vivamus suscipit, libero eu fringilla egestas, orci urna commodo arcu, vel gravida turpis ipsum molestie nibh. Donec cursus eu ante sagittis ultrices. Phasellus id sagittis risus. Mauris dapibus neque faucibus, tempor ligula vel, cursus ante. Donec faucibus gravida porta. Nullam egestas est quis aliquam feugiat. Sed eget metus diam. Cras eget placerat libero.'
|
13
|
+
}
|
14
|
+
</div>
|
15
|
+
</Collapsible.Content>
|
16
|
+
</Collapsible>
|
15
17
|
)
|
16
18
|
|
17
19
|
export default CollapsibleDefault
|
@@ -38,7 +38,7 @@ export default class PbCollapsible extends PbEnhancedElement {
|
|
38
38
|
// Once the transition is complete, remove the inline max-height so the content can scale responsively
|
39
39
|
window.setTimeout(() => {
|
40
40
|
elem.style.height = ''
|
41
|
-
},
|
41
|
+
}, 300)
|
42
42
|
}
|
43
43
|
// Hide an element
|
44
44
|
hide(elem) {
|
@@ -54,7 +54,7 @@ export default class PbCollapsible extends PbEnhancedElement {
|
|
54
54
|
// When the transition is complete, hide it
|
55
55
|
window.setTimeout(() => {
|
56
56
|
elem.classList.remove('is-visible')
|
57
|
-
},
|
57
|
+
}, 300)
|
58
58
|
}
|
59
59
|
|
60
60
|
// Toggle element visibility
|
data/lib/playbook/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: playbook_ui
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 7.
|
4
|
+
version: 7.4.0.pre.alpha2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Power UX
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2020-10-
|
12
|
+
date: 2020-10-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: actionpack
|
@@ -628,6 +628,8 @@ files:
|
|
628
628
|
- app/pb_kits/playbook/pb_collapsible/_collapsible.html.erb
|
629
629
|
- app/pb_kits/playbook/pb_collapsible/_collapsible.jsx
|
630
630
|
- app/pb_kits/playbook/pb_collapsible/_collapsible.scss
|
631
|
+
- app/pb_kits/playbook/pb_collapsible/child_kits/CollapsibleContent.jsx
|
632
|
+
- app/pb_kits/playbook/pb_collapsible/child_kits/CollapsibleMain.jsx
|
631
633
|
- app/pb_kits/playbook/pb_collapsible/child_kits/_collapsible_content.html.erb
|
632
634
|
- app/pb_kits/playbook/pb_collapsible/child_kits/_collapsible_main.html.erb
|
633
635
|
- app/pb_kits/playbook/pb_collapsible/collapsible.rb
|
@@ -640,7 +642,6 @@ files:
|
|
640
642
|
- app/pb_kits/playbook/pb_collapsible/docs/example.yml
|
641
643
|
- app/pb_kits/playbook/pb_collapsible/docs/index.js
|
642
644
|
- app/pb_kits/playbook/pb_collapsible/index.js
|
643
|
-
- app/pb_kits/playbook/pb_collapsible/useToggler.js
|
644
645
|
- app/pb_kits/playbook/pb_contact/_contact.html.erb
|
645
646
|
- app/pb_kits/playbook/pb_contact/_contact.jsx
|
646
647
|
- app/pb_kits/playbook/pb_contact/_contact.scss
|