playbook_ui 7.12.1 → 7.13.0.pre.alpha1

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: 76db663b65350ec3f036853f672a99eb7e62addc7f28184b1053376bbde92e1f
4
- data.tar.gz: 5c41351c08585e60804c594c118eca69121a696a36ed5d4dfe42b0e7f71a9baf
3
+ metadata.gz: dffed3e006461af113cc39ab74386183174482f0b3d8e09edcc4b949c902337c
4
+ data.tar.gz: 5649ab75ec8a4fcb3ac31bcb24b0704bd79ebbff7ad815c7311524b248486e94
5
5
  SHA512:
6
- metadata.gz: 4a32adf1b5e466f16d27c5f3ef87c85e77b5222b1c2876961f8bfeefd9293c97935c4765ea69fca85a49c66016dd9272726a64cf76e478eda7f3170393b01f15
7
- data.tar.gz: 1e1e8952f87a4eb7ac560cb98131ec96acd340296bfd504ac539cf1ab6681b4dc55b64a7fedb241fbba4474ed541b33627d2444a31463b9343c94e2f2f73f80f
6
+ metadata.gz: e97c430113baa7ac7abb804064f92a5a05711934c4dd2df9a0bde80ed2a2be2cc36ff97e1dcb8565a3198af3d692c5d347c74ac6584e9a3451d6378dcf876a20
7
+ data.tar.gz: 7e1acd754c7c84a69f706756b9b948e023685d90c9923be9f21e46f8ec9ca56cfb83b4194bf7ea1adf10a92209f40ee3bdf8444269815bff853a389d9ce18731
@@ -1,11 +1,11 @@
1
- @import "tokens/fonts";
2
- @import "pb_background/background";
3
- @import "pb_body/body";
4
- @import "pb_button/button";
1
+ @import 'tokens/fonts';
2
+ @import 'pb_background/background';
3
+ @import 'pb_body/body';
4
+ @import 'pb_button/button';
5
5
  @import 'pb_button_toolbar/button_toolbar';
6
- @import "pb_caption/caption";
7
- @import "pb_card/card";
8
- @import "pb_title/title";
6
+ @import 'pb_caption/caption';
7
+ @import 'pb_card/card';
8
+ @import 'pb_title/title';
9
9
  @import 'pb_avatar/avatar';
10
10
  @import 'pb_avatar_action_button/avatar_action_button';
11
11
  @import 'pb_badge/badge';
@@ -13,6 +13,7 @@
13
13
  @import 'pb_checkbox/checkbox';
14
14
  @import 'pb_circle_chart/circle_chart';
15
15
  @import 'pb_circle_icon_button/circle_icon_button';
16
+ @import 'pb_collapsible/collapsible';
16
17
  @import 'pb_contact/contact';
17
18
  @import 'pb_currency/currency';
18
19
  @import 'pb_dashboard_value/dashboard_value';
@@ -8,6 +8,7 @@ kits:
8
8
  - circle_icon_button
9
9
  - card
10
10
  - checkbox
11
+ - collapsible
11
12
  - charts_and_graphs:
12
13
  - bar_graph
13
14
  - circle_chart
@@ -17,6 +17,7 @@ export Card from './pb_card/_card.jsx'
17
17
  export Checkbox from './pb_checkbox/_checkbox.jsx'
18
18
  export CircleChart from './pb_circle_chart/_circle_chart.jsx'
19
19
  export CircleIconButton from './pb_circle_icon_button/_circle_icon_button.jsx'
20
+ export Collapsible from './pb_collapsible/_collapsible.jsx'
20
21
  export Contact from './pb_contact/_contact.jsx'
21
22
  export Currency from './pb_currency/_currency.jsx'
22
23
  export DashboardValue from './pb_dashboard_value/_dashboard_value.jsx'
@@ -0,0 +1,9 @@
1
+ <%= content_tag(:div,
2
+ aria: object.aria,
3
+ class: object.classname,
4
+ data: object.data,
5
+ id: object.id) do %>
6
+ <% if object.children %>
7
+ <%= capture(&object.children) %>
8
+ <% end %>
9
+ <% end %>
@@ -0,0 +1,77 @@
1
+ /* @flow */
2
+
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({})
11
+
12
+ type CollapsibleProps = {
13
+ children: React.ChildrenArray<React.Element<typeof Main | Content>>,
14
+ aria?: object,
15
+ className?: string,
16
+ collapsed?: boolean,
17
+ data?: object,
18
+ id?: string,
19
+ padding?: string,
20
+ }
21
+
22
+ const useCollapsible = (initial = false) => {
23
+ const [collapsed, setCollapsed] = useState(initial)
24
+
25
+ return [
26
+ collapsed,
27
+ () => setCollapsed((t) => !t),
28
+ ]
29
+ }
30
+
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
46
+ const ariaProps = buildAriaProps(aria)
47
+ const dataProps = buildDataProps(data)
48
+ const classes = classnames(
49
+ buildCss('pb_collapsible'),
50
+ className,
51
+ globalProps(props, { padding })
52
+ )
53
+
54
+ return (
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>
71
+ )
72
+ }
73
+
74
+ Collapsible.Main = CollapsibleMain
75
+ Collapsible.Content = CollapsibleContent
76
+
77
+ export default Collapsible
@@ -0,0 +1,15 @@
1
+ [class^=pb_collapsible_kit] {
2
+ .toggle-content {
3
+ display: none;
4
+ height: 0;
5
+ padding-bottom: 0 !important;
6
+ padding-top: 0 !important;
7
+ overflow: hidden;
8
+ transition: height 300ms, padding 300ms ease-in-out;
9
+ }
10
+
11
+ .toggle-content.is-visible {
12
+ display: block;
13
+ height: auto;
14
+ }
15
+ }
@@ -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,59 @@
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
+
9
+ import { CollapsibleContext } from '../_collapsible.jsx'
10
+
11
+ type CollapsibleMainProps = {
12
+ children: array<React.ReactNode> | React.ReactNode,
13
+ className?: string,
14
+ padding?: string,
15
+ }
16
+
17
+ type IconProps = {
18
+ collapsed: boolean
19
+ }
20
+
21
+ const Icon = ({ collapsed }: IconProps) => {
22
+ const direction = collapsed ? 'down' : 'up'
23
+
24
+ return (
25
+ <div
26
+ key={direction}
27
+ style={{ verticalAlign: 'middle' }}
28
+ >
29
+ <i className={`far fa-chevron-${direction} fa-fw`} />
30
+ </div>
31
+ )
32
+ }
33
+
34
+ const CollapsibleMain = ({
35
+ children,
36
+ className,
37
+ padding = 'md',
38
+ ...props
39
+ }: CollapsibleMainProps) => {
40
+ const context = useContext(CollapsibleContext)
41
+ const mainCSS = buildCss('pb_collapsible_main_kit')
42
+ const mainSpacing = globalProps(props, { padding })
43
+
44
+ return (
45
+ <div className={classnames(mainCSS, className, mainSpacing)}>
46
+ <div onClick={() => context.collapse()}>
47
+ <Flex
48
+ spacing="between"
49
+ vertical="center"
50
+ >
51
+ <FlexItem>{children}</FlexItem>
52
+ <FlexItem><Icon collapsed={context.collapsed} /></FlexItem>
53
+ </Flex>
54
+ </div>
55
+ </div>
56
+ )
57
+ }
58
+
59
+ export default CollapsibleMain
@@ -0,0 +1,7 @@
1
+ <%= content_tag(:div,
2
+ id: object.id,
3
+ data: object.data,
4
+ class: object.classname,
5
+ aria: object.aria) do %>
6
+ <%= capture(&object.children) %>
7
+ <% end %>
@@ -0,0 +1,16 @@
1
+ <%= content_tag(:div,
2
+ id: object.id,
3
+ data: object.data,
4
+ class: object.classname,
5
+ aria: object.aria) do %>
6
+
7
+ <%= pb_rails("flex", props: {vertical: "center", spacing: "between"}) do %>
8
+ <%= pb_rails("flex/flex_item") do %>
9
+ <%= capture(&object.children) %>
10
+ <% end %>
11
+ <%= pb_rails("flex/flex_item") do %>
12
+ <i class="far fa-chevron-down"></i>
13
+ <i class="far fa-chevron-up" style="display: none"></i>
14
+ <% end %>
15
+ <% end %>
16
+ <% end %>
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module PbCollapsible
5
+ class Collapsible
6
+ include Playbook::Props
7
+
8
+ partial "pb_collapsible/collapsible"
9
+
10
+ def classname
11
+ generate_classname("pb_collapsible_kit")
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module PbCollapsible
5
+ class CollapsibleContent
6
+ include Playbook::Props
7
+
8
+ partial "pb_collapsible/child_kits/collapsible_content"
9
+
10
+ def data
11
+ Hash(values[:data]).merge(
12
+ collapsible_content: true
13
+ )
14
+ end
15
+
16
+ def classname
17
+ generate_classname("pb_collapsible_content_kit", "toggle-content", padding, separator: " ")
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module PbCollapsible
5
+ class CollapsibleMain
6
+ include Playbook::Props
7
+
8
+ partial "pb_collapsible/child_kits/collapsible_main"
9
+
10
+ def data
11
+ Hash(values[:data]).merge(
12
+ collapsible_main: true
13
+ )
14
+ end
15
+
16
+ def classname
17
+ generate_classname("pb_collapsible_main_kit", padding, separator: " ")
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,10 @@
1
+ <%= pb_rails("collapsible", props: { name: "default-example" }) do %>
2
+ <%= pb_rails("collapsible/collapsible_main", props: { padding: "md", name: "default-main" }) do %>
3
+ <%= pb_rails("body", props: { text: "Main Section"}) %>
4
+ <% end %>
5
+ <%= pb_rails("collapsible/collapsible_content", props: { padding: "md" }) do %>
6
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec iaculis, risus a fringilla luctus, sapien eros sodales ex, quis molestie est nulla non turpis. Vestibulum aliquet at ipsum eget posuere. Morbi sed laoreet erat. Sed commodo posuere lectus, at porta nulla ornare a. Suspendisse quam est, sollicitudin ut enim sit amet, commodo placerat enim. Donec laoreet metus ac mauris pellentesque mattis. Pellentesque luctus vel mauris non aliquam. Mauris hendrerit mattis porttitor. Curabitur vehicula justo non ex consectetur commodo. Quisque posuere aliquet quam. Maecenas malesuada magna mauris, ac tempor metus euismod at.
7
+ <br><br>
8
+ Cras ornare fermentum magna mollis efficitur. Sed vitae nulla vel purus ultrices mollis. Maecenas id nulla id libero faucibus feugiat quis sit amet turpis. In commodo pellentesque risus at fringilla. Integer non interdum leo, non commodo ante. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut mi augue, dignissim at orci vel, egestas aliquam mi. Proin finibus aliquet tempor. Integer cursus, ex quis gravida rhoncus, nisi elit viverra ipsum, non efficitur est ex ac tortor. Praesent vitae odio massa.
9
+ <% end %>
10
+ <% end %>
@@ -0,0 +1,19 @@
1
+ import React from 'react'
2
+ import { Collapsible } from '../..'
3
+
4
+ const CollapsibleDefault = () => (
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>
17
+ )
18
+
19
+ export default CollapsibleDefault
@@ -0,0 +1,8 @@
1
+ examples:
2
+
3
+ rails:
4
+ - collapsible_default: Light
5
+
6
+ react:
7
+ - collapsible_default: Light
8
+
@@ -0,0 +1 @@
1
+ export { default as CollapsibleDefault } from './_collapsible_default.jsx'
@@ -0,0 +1,79 @@
1
+ import PbEnhancedElement from '../pb_enhanced_element'
2
+
3
+ const MAIN_SELECTOR = '[data-collapsible-main]'
4
+ const CONTENT_SELECTOR = '[data-collapsible-content]'
5
+ const DOWN_ARROW_SELECTOR = '.fa-chevron-down'
6
+ const UP_ARROW_SELECTOR = '.fa-chevron-up'
7
+
8
+ export default class PbCollapsible extends PbEnhancedElement {
9
+ static get selector() {
10
+ return MAIN_SELECTOR
11
+ }
12
+
13
+ connect() {
14
+ this.element.addEventListener('click', () => {
15
+ this.toggleElement(this.target)
16
+ })
17
+ this.displayDownArrow()
18
+ }
19
+
20
+ get target() {
21
+ return this.element.parentNode.querySelector(CONTENT_SELECTOR)
22
+ }
23
+
24
+ showElement(elem) {
25
+ // Get the natural height of the element
26
+ const getHeight = () => {
27
+ elem.style.display = 'block'
28
+ const height = elem.scrollHeight + 'px' // Get it's height
29
+ elem.style.display = '' // Hide it again
30
+ return height
31
+ }
32
+
33
+ const height = getHeight()
34
+ elem.classList.add('is-visible')
35
+ elem.style.height = height // Update the max-height
36
+
37
+ // Once the transition is complete, remove the inline max-height so the content can scale responsively
38
+ window.setTimeout(() => {
39
+ elem.style.height = ''
40
+ }, 300)
41
+ }
42
+
43
+ hideElement(elem) {
44
+ // Give the element a height to change from
45
+ elem.style.height = elem.scrollHeight + 'px'
46
+
47
+ window.setTimeout(() => {
48
+ elem.style.height = '0'
49
+ elem.style.paddingTop = '0'
50
+ elem.style.paddingBottom = '0'
51
+ }, 1)
52
+
53
+ // When the transition is complete, hide it
54
+ window.setTimeout(() => {
55
+ elem.classList.remove('is-visible')
56
+ }, 300)
57
+ }
58
+
59
+ toggleElement(elem) {
60
+ if (elem.classList.contains('is-visible')) {
61
+ this.hideElement(elem)
62
+ this.displayDownArrow()
63
+ return
64
+ }
65
+ // Otherwise, show it
66
+ this.showElement(elem)
67
+ this.displayUpArrow()
68
+ }
69
+
70
+ displayDownArrow() {
71
+ this.element.querySelector(DOWN_ARROW_SELECTOR).style.display = 'inline-block'
72
+ this.element.querySelector(UP_ARROW_SELECTOR).style.display = 'none'
73
+ }
74
+
75
+ displayUpArrow() {
76
+ this.element.querySelector(UP_ARROW_SELECTOR).style.display = 'inline-block'
77
+ this.element.querySelector(DOWN_ARROW_SELECTOR).style.display = 'none'
78
+ }
79
+ }
@@ -12,6 +12,9 @@ window.datePickerHelper = datePickerHelper
12
12
  // Lazy image loading
13
13
  import 'lazysizes'
14
14
 
15
+ import PbCollapsible from './pb_collapsible'
16
+ PbCollapsible.start()
17
+
15
18
  import PbPopover from './pb_popover'
16
19
  PbPopover.start()
17
20
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Playbook
4
- VERSION = "7.12.1"
4
+ VERSION = "7.13.0.pre.alpha1"
5
5
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: playbook_ui
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.12.1
4
+ version: 7.13.0.pre.alpha1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Power UX
8
8
  - Power Devs
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2021-01-08 00:00:00.000000000 Z
12
+ date: 2021-01-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: actionpack
@@ -648,6 +648,21 @@ files:
648
648
  - app/pb_kits/playbook/pb_circle_icon_button/docs/_footer.md
649
649
  - app/pb_kits/playbook/pb_circle_icon_button/docs/example.yml
650
650
  - app/pb_kits/playbook/pb_circle_icon_button/docs/index.js
651
+ - app/pb_kits/playbook/pb_collapsible/_collapsible.html.erb
652
+ - app/pb_kits/playbook/pb_collapsible/_collapsible.jsx
653
+ - app/pb_kits/playbook/pb_collapsible/_collapsible.scss
654
+ - app/pb_kits/playbook/pb_collapsible/child_kits/CollapsibleContent.jsx
655
+ - app/pb_kits/playbook/pb_collapsible/child_kits/CollapsibleMain.jsx
656
+ - app/pb_kits/playbook/pb_collapsible/child_kits/_collapsible_content.html.erb
657
+ - app/pb_kits/playbook/pb_collapsible/child_kits/_collapsible_main.html.erb
658
+ - app/pb_kits/playbook/pb_collapsible/collapsible.rb
659
+ - app/pb_kits/playbook/pb_collapsible/collapsible_content.rb
660
+ - app/pb_kits/playbook/pb_collapsible/collapsible_main.rb
661
+ - app/pb_kits/playbook/pb_collapsible/docs/_collapsible_default.html.erb
662
+ - app/pb_kits/playbook/pb_collapsible/docs/_collapsible_default.jsx
663
+ - app/pb_kits/playbook/pb_collapsible/docs/example.yml
664
+ - app/pb_kits/playbook/pb_collapsible/docs/index.js
665
+ - app/pb_kits/playbook/pb_collapsible/index.js
651
666
  - app/pb_kits/playbook/pb_contact/_contact.html.erb
652
667
  - app/pb_kits/playbook/pb_contact/_contact.jsx
653
668
  - app/pb_kits/playbook/pb_contact/_contact.scss
@@ -2025,7 +2040,7 @@ homepage: http://playbook.powerapp.cloud
2025
2040
  licenses:
2026
2041
  - MIT
2027
2042
  metadata: {}
2028
- post_install_message:
2043
+ post_install_message:
2029
2044
  rdoc_options: []
2030
2045
  require_paths:
2031
2046
  - lib
@@ -2036,13 +2051,13 @@ required_ruby_version: !ruby/object:Gem::Requirement
2036
2051
  version: '0'
2037
2052
  required_rubygems_version: !ruby/object:Gem::Requirement
2038
2053
  requirements:
2039
- - - ">="
2054
+ - - ">"
2040
2055
  - !ruby/object:Gem::Version
2041
- version: '0'
2056
+ version: 1.3.1
2042
2057
  requirements: []
2043
- rubyforge_project:
2058
+ rubyforge_project:
2044
2059
  rubygems_version: 2.7.3
2045
- signing_key:
2060
+ signing_key:
2046
2061
  specification_version: 4
2047
2062
  summary: Playbook Design System
2048
2063
  test_files: []