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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ffacb9bd2fec12c5de6322d01b9acd45f3b18818f68d0155eb224f964cec579a
4
- data.tar.gz: 629da81bbd27bddd718eb38bc0824e4e2754edb85972942e982e8c79b815a984
3
+ metadata.gz: fc2cc41654667d4db62667450bd430b73beb0746bff14266498b5f99ec5909a3
4
+ data.tar.gz: 89ec1b4304d12c8101ee5b61637e5ef22a8d3295e041633873a7a42892ddef56
5
5
  SHA512:
6
- metadata.gz: b4d4257240173e0c2e3ff7c4f810ef6f9cf90c45b1ed8ebe1d10af991c06e6e1f1cbcb8184933d5d6dbd74459e1ca0391e996d01d67e2e083aad61813e9f42dd
7
- data.tar.gz: 2e78709ffe438edfdd8282f4111d918fa9a25835cee7af2d41fa87fd15ecf778e675f24b691d6585ccb1866c9df105031a44ca6886563a1edbacb470eaf749cd
6
+ metadata.gz: a5cba0cc9c3b7e04462251f81c75326a04a89960efe3dcbf8d811f1f28c2858bab565bdf53c11cb78ab3c86a95e6f78de41577ac3309d607f5021afd8ddcb90b
7
+ data.tar.gz: 77bc046395a15e34958c54a2951862870e69a36413535d4ae53c0437857b91145eb7a2770c45026c0d0ef6b7c7fe0b427924edc931fff8f9770a05319984b726
@@ -1,4 +1,4 @@
1
- <%= content_tag(:div,
1
+ <%= content_tag(:div,
2
2
  aria: object.aria,
3
3
  class: object.classname,
4
4
  data: object.data,
@@ -1,137 +1,77 @@
1
1
  /* @flow */
2
2
 
3
- import classnames from "classnames"
4
- import { get } from "lodash"
5
- import { Flex, FlexItem } from "../"
6
- import React, { useState } from "react"
7
- import AnimateHeight from "react-animate-height"
8
- import { buildAriaProps, buildCss, buildDataProps } from "../utilities/props"
9
- import { globalProps } from "../utilities/globalProps.js"
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 Main = (props: CollapsibleMainProps) => {
32
- const { children, className, padding = "sm" } = props
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
- <div className={classnames(contentCSS, className, contentSpacing)}>
53
- {children}
54
- </div>
55
- )
25
+ return [
26
+ collapsed,
27
+ () => setCollapsed((t) => !t),
28
+ ]
56
29
  }
57
30
 
58
- const Collapsible = (props: CollapsibleProps) => {
59
- const { aria = {}, className, children = [], data = {}, id } = props
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("pb_collapsible"),
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
- <div {...ariaProps} {...dataProps} className={classes} id={id}>
128
- {renderMain()}
129
- {renderContent()}
130
- </div>
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 = Main
135
- Collapsible.Content = Content
74
+ Collapsible.Main = CollapsibleMain
75
+ Collapsible.Content = CollapsibleContent
136
76
 
137
77
  export default Collapsible
@@ -7,7 +7,7 @@
7
7
  padding-bottom: 0 !important;
8
8
  padding-top: 0 !important;
9
9
  overflow: hidden;
10
- transition: height 500ms, padding 500ms ease-in-out;
10
+ transition: height 300ms, padding 300ms ease-in-out;
11
11
  }
12
12
 
13
13
  .toggle-content.is-visible {
@@ -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: "sm", name: "dark-example" }) do %>
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: "sm", name: "default-main" }) do %>
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
- <div>
6
- <Collapsible>
7
- <Collapsible.Main>
8
- <div>{'Main Section'}</div>
9
- </Collapsible.Main>
10
- <Collapsible.Content>
11
- <div>{'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.'}</div>
12
- </Collapsible.Content>
13
- </Collapsible>
14
- </div>
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
- }, 500)
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
- }, 500)
57
+ }, 300)
58
58
  }
59
59
 
60
60
  // Toggle element visibility
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Playbook
3
- VERSION = "7.3.0.pre.alpha10"
3
+ VERSION = "7.4.0.pre.alpha2"
4
4
  end
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.3.0.pre.alpha10
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-22 00:00:00.000000000 Z
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
@@ -1,10 +0,0 @@
1
- /* @flow */
2
-
3
- import { useState } from "react"
4
-
5
- export const useToggler = (startValue: boolean = false) => {
6
- const [show, toggle] = useState(startValue)
7
- const toggler = () => toggle(!show)
8
-
9
- return [show, toggler]
10
- }