playbook_ui 8.0.2 → 8.1.2
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/_playbook.scss +8 -7
- data/app/pb_kits/playbook/data/menu.yml +1 -0
- data/app/pb_kits/playbook/index.js +1 -0
- data/app/pb_kits/playbook/pb_card/card_header.rb +7 -7
- data/app/pb_kits/playbook/pb_collapsible/_collapsible.jsx +84 -0
- data/app/pb_kits/playbook/pb_collapsible/_collapsible.scss +15 -0
- data/app/pb_kits/playbook/pb_collapsible/child_kits/CollapsibleContent.jsx +40 -0
- data/app/pb_kits/playbook/pb_collapsible/child_kits/CollapsibleMain.jsx +59 -0
- data/app/pb_kits/playbook/pb_collapsible/collapsible.html.erb +7 -0
- data/app/pb_kits/playbook/pb_collapsible/collapsible.rb +11 -0
- data/app/pb_kits/playbook/pb_collapsible/collapsible.test.js +50 -0
- data/app/pb_kits/playbook/pb_collapsible/collapsible_content.html.erb +7 -0
- data/app/pb_kits/playbook/pb_collapsible/collapsible_content.rb +17 -0
- data/app/pb_kits/playbook/pb_collapsible/collapsible_main.html.erb +16 -0
- data/app/pb_kits/playbook/pb_collapsible/collapsible_main.rb +15 -0
- data/app/pb_kits/playbook/pb_collapsible/docs/_collapsible_default.html.erb +10 -0
- data/app/pb_kits/playbook/pb_collapsible/docs/_collapsible_default.jsx +19 -0
- data/app/pb_kits/playbook/pb_collapsible/docs/example.yml +9 -0
- data/app/pb_kits/playbook/pb_collapsible/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_collapsible/index.js +79 -0
- data/app/pb_kits/playbook/pb_date_time_stacked/_date_time_stacked.jsx +6 -2
- data/app/pb_kits/playbook/pb_date_time_stacked/date_time_stacked.html.erb +1 -1
- data/app/pb_kits/playbook/pb_docs/kit_example.rb +1 -1
- data/app/pb_kits/playbook/pb_nav/_item.jsx +2 -0
- data/app/pb_kits/playbook/pb_nav/_nav.jsx +2 -2
- data/app/pb_kits/playbook/pb_nav/item.html.erb +2 -2
- data/app/pb_kits/playbook/pb_nav/nav.html.erb +1 -1
- data/app/pb_kits/playbook/pb_progress_simple/_progress_simple.jsx +1 -1
- data/app/pb_kits/playbook/pb_progress_simple/_progress_simple.scss +5 -0
- data/app/pb_kits/playbook/pb_progress_simple/docs/_progress_simple_variants.html.erb +5 -0
- data/app/pb_kits/playbook/pb_progress_simple/docs/_progress_simple_variants.jsx +7 -0
- data/app/pb_kits/playbook/pb_progress_simple/docs/_progress_simple_variants.md +1 -1
- data/app/pb_kits/playbook/pb_progress_simple/progress_simple.rb +1 -1
- data/app/pb_kits/playbook/pb_time_stacked/_time_stacked.jsx +43 -26
- data/app/pb_kits/playbook/pb_time_stacked/_time_stacked.scss +18 -0
- data/app/pb_kits/playbook/pb_time_stacked/docs/_time_stacked_default.html.erb +18 -5
- data/app/pb_kits/playbook/pb_time_stacked/docs/_time_stacked_default.jsx +10 -5
- data/app/pb_kits/playbook/pb_time_stacked/time_stacked.html.erb +7 -3
- data/app/pb_kits/playbook/pb_time_stacked/time_stacked.rb +8 -30
- data/app/pb_kits/playbook/pb_time_stacked/time_stacked.test.js +33 -0
- data/app/pb_kits/playbook/pb_tooltip/_tooltip.scss +4 -3
- data/app/pb_kits/playbook/pb_user_badge/_user_badge.jsx +1 -1
- data/app/pb_kits/playbook/vendor.js +3 -0
- data/lib/playbook/props/base.rb +1 -1
- data/lib/playbook/version.rb +1 -1
- metadata +19 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 82316db4c1c5b40f4b5ace5be31f82c1f808e9489bf2795627cc65b6335ca86f
|
4
|
+
data.tar.gz: 2ea101e5b55338197af37e6f80b5cd716576ce6f5a59a3080776f0c27e3c0d46
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e652fa2d663a6e3d0247e6e79a1b51401288da2ef65aa998fe2edf6f9ed33ef4da0ae7694c9eb0f3531029579781e27081b8b44dbea5961f794250697c60704b
|
7
|
+
data.tar.gz: f33b57d9eda58fbb6ad6cd2f63571d0231721b0f0c1e6c03ce89b6855fd748bbed442db74152af7a1405340cb54cf77d4ffc4d69e6f59098e2828a19b806e31e
|
@@ -1,11 +1,11 @@
|
|
1
|
-
@import
|
2
|
-
@import
|
3
|
-
@import
|
4
|
-
@import
|
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
|
7
|
-
@import
|
8
|
-
@import
|
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';
|
@@ -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'
|
@@ -1,14 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Playbook
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
module PbCard
|
5
|
+
class CardHeader < Playbook::KitBase
|
6
|
+
prop :header_color, type: Playbook::Props::String,
|
7
|
+
default: "category_1"
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
end
|
9
|
+
def classname
|
10
|
+
generate_classname("pb_card_header_kit", header_color)
|
12
11
|
end
|
13
12
|
end
|
14
13
|
end
|
14
|
+
end
|
@@ -0,0 +1,84 @@
|
|
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: CollapsibleMain | CollapsibleContent | ReactNode,
|
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 CollapsibleParent = React.Children.toArray(children)
|
43
|
+
|
44
|
+
if (CollapsibleParent.length !== 2) {
|
45
|
+
throw new Error('Collapsible requires <CollapsibleMain> and <CollapsibleContent> to function properly.')
|
46
|
+
}
|
47
|
+
|
48
|
+
const Main = CollapsibleParent[0]
|
49
|
+
const Content = CollapsibleParent[1]
|
50
|
+
|
51
|
+
const { children: mainChildren, ...mainProps } = Main.props
|
52
|
+
const { children: contentChildren, ...contentProps } = Content.props
|
53
|
+
const ariaProps = buildAriaProps(aria)
|
54
|
+
const dataProps = buildDataProps(data)
|
55
|
+
const classes = classnames(
|
56
|
+
buildCss('pb_collapsible'),
|
57
|
+
className,
|
58
|
+
globalProps(props, { padding })
|
59
|
+
)
|
60
|
+
|
61
|
+
return (
|
62
|
+
<CollapsibleContext.Provider value={{ collapsed: isCollapsed, collapse }}>
|
63
|
+
<div
|
64
|
+
{...ariaProps}
|
65
|
+
{...dataProps}
|
66
|
+
className={classes}
|
67
|
+
id={id}
|
68
|
+
>
|
69
|
+
<CollapsibleMain {...mainProps}>
|
70
|
+
{mainChildren}
|
71
|
+
</CollapsibleMain>
|
72
|
+
|
73
|
+
<CollapsibleContent {...contentProps}>
|
74
|
+
{contentChildren}
|
75
|
+
</CollapsibleContent>
|
76
|
+
</div>
|
77
|
+
</CollapsibleContext.Provider>
|
78
|
+
)
|
79
|
+
}
|
80
|
+
|
81
|
+
Collapsible.Main = CollapsibleMain
|
82
|
+
Collapsible.Content = CollapsibleContent
|
83
|
+
|
84
|
+
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,50 @@
|
|
1
|
+
import React from 'react'
|
2
|
+
import { render, screen } from '../utilities/test-utils'
|
3
|
+
|
4
|
+
import Collapsible from './_collapsible'
|
5
|
+
|
6
|
+
beforeEach(() => {
|
7
|
+
// Silences error logs within the test suite.
|
8
|
+
jest.spyOn(console, 'error')
|
9
|
+
// eslint-disable-next-line
|
10
|
+
console.error.mockImplementation(() => {})
|
11
|
+
})
|
12
|
+
|
13
|
+
afterEach(() => {
|
14
|
+
// eslint-disable-next-line
|
15
|
+
console.error.mockRestore()
|
16
|
+
})
|
17
|
+
|
18
|
+
const testId = 'collapsible1',
|
19
|
+
kitClass = 'pb_collapsible'
|
20
|
+
|
21
|
+
test('throws error if incorrect # of children', () => {
|
22
|
+
expect(() => {
|
23
|
+
render(
|
24
|
+
<Collapsible />
|
25
|
+
)
|
26
|
+
}).toThrow()
|
27
|
+
})
|
28
|
+
|
29
|
+
test('returns namespaced additional_class class name', () => {
|
30
|
+
render(
|
31
|
+
<Collapsible
|
32
|
+
className="additional_class"
|
33
|
+
data={{ testid: testId }}
|
34
|
+
>
|
35
|
+
<Collapsible.Main>
|
36
|
+
<div>{'Main Section'}</div>
|
37
|
+
</Collapsible.Main>
|
38
|
+
<Collapsible.Content>
|
39
|
+
<div>
|
40
|
+
{
|
41
|
+
'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.'
|
42
|
+
}
|
43
|
+
</div>
|
44
|
+
</Collapsible.Content>
|
45
|
+
</Collapsible>
|
46
|
+
)
|
47
|
+
|
48
|
+
const kit = screen.getByTestId(testId)
|
49
|
+
expect(kit).toHaveClass(`${kitClass} additional_class`)
|
50
|
+
})
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Playbook
|
4
|
+
module PbCollapsible
|
5
|
+
class CollapsibleContent < Playbook::KitBase
|
6
|
+
def data
|
7
|
+
Hash(values[:data]).merge(
|
8
|
+
collapsible_content: true
|
9
|
+
)
|
10
|
+
end
|
11
|
+
|
12
|
+
def classname
|
13
|
+
generate_classname("pb_collapsible_content_kit", "toggle-content", padding, separator: " ")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
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
|
+
<%= content.presence %>
|
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 CollapsibleMain < Playbook::KitBase
|
6
|
+
def data
|
7
|
+
Hash(prop(:data)).merge(collapsible_main: true)
|
8
|
+
end
|
9
|
+
|
10
|
+
def classname
|
11
|
+
generate_classname("pb_collapsible_main_kit", padding, separator: " ")
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
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 @@
|
|
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
|
+
}
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
import React from 'react'
|
4
4
|
import { DateStacked, Flex, FlexItem, TimeStacked } from '../'
|
5
|
+
import { buildDataProps } from '../utilities/props'
|
5
6
|
import { globalProps } from '../utilities/globalProps.js'
|
6
7
|
|
7
8
|
type DateTimeStackedProps = {
|
@@ -12,12 +13,15 @@ type DateTimeStackedProps = {
|
|
12
13
|
}
|
13
14
|
|
14
15
|
const DateTimeStacked = (props: DateTimeStackedProps) => {
|
15
|
-
const { date, dark } = props
|
16
|
+
const { date, data = {}, dark } = props,
|
17
|
+
dataProps = buildDataProps(data)
|
18
|
+
|
16
19
|
return (
|
17
20
|
<Flex
|
18
21
|
className={globalProps(props)}
|
19
22
|
orientation="row"
|
20
23
|
vertical="center"
|
24
|
+
{...dataProps}
|
21
25
|
>
|
22
26
|
<FlexItem>
|
23
27
|
<DateStacked
|
@@ -32,8 +36,8 @@ const DateTimeStacked = (props: DateTimeStackedProps) => {
|
|
32
36
|
<TimeStacked
|
33
37
|
className="pb_date_time_stacked_kit"
|
34
38
|
dark={dark}
|
35
|
-
date={date}
|
36
39
|
tag="caption"
|
40
|
+
time={date}
|
37
41
|
/>
|
38
42
|
</FlexItem>
|
39
43
|
</Flex>
|
@@ -7,7 +7,7 @@
|
|
7
7
|
<%= pb_rails("date_stacked", props: { align: "right", date: object.date, reverse: true, size: "sm", dark: object.dark }) %>
|
8
8
|
<% end %>
|
9
9
|
<%= pb_rails("flex/flex_item") do %>
|
10
|
-
<%= pb_rails("time_stacked", props: { classname: "pb_date_time_stacked_kit",
|
10
|
+
<%= pb_rails("time_stacked", props: { classname: "pb_date_time_stacked_kit", time: object.date, tag: "caption" }) %>
|
11
11
|
<% end %>
|
12
12
|
<% end %>
|
13
13
|
<% end %>
|
@@ -75,6 +75,7 @@ const NavItem = (props: NavItemProps) => {
|
|
75
75
|
key={iconLeft}
|
76
76
|
>
|
77
77
|
<Icon
|
78
|
+
aria={{ label: iconLeft }}
|
78
79
|
className="pb_nav_list_item_icon_left"
|
79
80
|
fixedWidth
|
80
81
|
icon={iconLeft}
|
@@ -90,6 +91,7 @@ const NavItem = (props: NavItemProps) => {
|
|
90
91
|
key={iconRight}
|
91
92
|
>
|
92
93
|
<Icon
|
94
|
+
aria={{ label: iconRight }}
|
93
95
|
className="pb_nav_list_item_icon_right"
|
94
96
|
fixedWidth
|
95
97
|
icon={iconRight}
|
@@ -48,7 +48,7 @@ const Nav = (props: NavProps) => {
|
|
48
48
|
)
|
49
49
|
|
50
50
|
return (
|
51
|
-
<
|
51
|
+
<nav
|
52
52
|
{...ariaProps}
|
53
53
|
{...dataProps}
|
54
54
|
className={cardCss}
|
@@ -69,7 +69,7 @@ const Nav = (props: NavProps) => {
|
|
69
69
|
</div>
|
70
70
|
</If>
|
71
71
|
<ul>{children}</ul>
|
72
|
-
</
|
72
|
+
</nav>
|
73
73
|
)
|
74
74
|
}
|
75
75
|
|
@@ -9,13 +9,13 @@
|
|
9
9
|
<%= pb_rails("image", props: { url: object.image_url, classname: "pb_nav_img_wrapper" }) %>
|
10
10
|
<% end %>
|
11
11
|
<% if object.icon_left %>
|
12
|
-
<%= pb_rails("icon", props: { icon: object.icon_left, classname: "pb_nav_list_item_icon_left", fixed_width: true}) %>
|
12
|
+
<%= pb_rails("icon", props: { aria: { label: object.icon_left }, icon: object.icon_left, classname: "pb_nav_list_item_icon_left", fixed_width: true}) %>
|
13
13
|
<% end %>
|
14
14
|
<span class="pb_nav_list_item_text">
|
15
15
|
<%= object.text %><%= content.presence %>
|
16
16
|
</span>
|
17
17
|
<% if object.icon_right %>
|
18
|
-
<%= pb_rails("icon", props: { icon: object.icon_right, classname: "pb_nav_list_item_icon_right", fixed_width: true}) %>
|
18
|
+
<%= pb_rails("icon", props: { aria: { label: object.icon_right }, icon: object.icon_right, classname: "pb_nav_list_item_icon_right", fixed_width: true}) %>
|
19
19
|
<% end %>
|
20
20
|
<% end %>
|
21
21
|
<% end %>
|
@@ -1 +1 @@
|
|
1
|
-
Progress Simple can pass colors - primary, green and
|
1
|
+
Progress Simple can pass colors - primary, green, red, and yellow. Variants names are `default`, `positive`, `negative`, and `warning`, respectively.
|
@@ -18,7 +18,7 @@ module Playbook
|
|
18
18
|
# could this possibly be [sm, md, lg]?
|
19
19
|
prop :width, default: "100%"
|
20
20
|
prop :variant, type: Playbook::Props::Enum,
|
21
|
-
values: %w[default positive negative],
|
21
|
+
values: %w[default positive negative warning],
|
22
22
|
default: "default"
|
23
23
|
|
24
24
|
def number_value
|
@@ -4,50 +4,67 @@ import React from 'react'
|
|
4
4
|
import classnames from 'classnames'
|
5
5
|
|
6
6
|
import DateTime from '../pb_kit/dateTime.js'
|
7
|
-
import { buildCss } from '../utilities/props'
|
8
|
-
import { Body, Caption } from '../'
|
7
|
+
import { buildCss, buildDataProps } from '../utilities/props'
|
9
8
|
import { deprecatedProps, globalProps } from '../utilities/globalProps.js'
|
10
9
|
|
10
|
+
import { Body, Caption } from '../'
|
11
|
+
|
11
12
|
type TimeStackedProps = {
|
12
13
|
align?: 'left' | 'center' | 'right',
|
13
14
|
className?: string | array<string>,
|
14
15
|
dark?: boolean,
|
15
|
-
data?:
|
16
|
-
date
|
16
|
+
data?: object,
|
17
|
+
date?: string,
|
17
18
|
id?: string,
|
18
|
-
|
19
|
+
time: number | Date,
|
20
|
+
timeZone?: string,
|
19
21
|
}
|
20
22
|
|
21
|
-
const
|
22
|
-
|
23
|
-
|
23
|
+
const TimeStackedDefault = (props: TimeStackedProps) => {
|
24
|
+
if (props.date) deprecatedProps('Time Stacked', ['date']) //date prop is deprecated, use time instead
|
25
|
+
|
26
|
+
const {
|
27
|
+
align = 'left',
|
28
|
+
className,
|
29
|
+
dark,
|
30
|
+
data = {},
|
31
|
+
date,
|
32
|
+
time,
|
33
|
+
timeZone,
|
34
|
+
} = props
|
35
|
+
|
24
36
|
const classes = classnames(
|
25
37
|
buildCss('pb_time_stacked_kit', align),
|
26
38
|
globalProps(props),
|
27
|
-
className
|
39
|
+
className
|
28
40
|
)
|
41
|
+
const dataProps = buildDataProps(data)
|
29
42
|
|
30
|
-
const dateTimestamp = new DateTime({ value: date })
|
43
|
+
const dateTimestamp = new DateTime({ value: date ? date : new Date(time), zone: timeZone })
|
31
44
|
|
32
45
|
return (
|
33
|
-
<div
|
34
|
-
|
35
|
-
|
36
|
-
|
46
|
+
<div
|
47
|
+
className={classes}
|
48
|
+
{...dataProps}
|
49
|
+
>
|
50
|
+
<Body
|
51
|
+
className={classnames('pb_time_stacked', 'time-spacing')}
|
52
|
+
color="light"
|
53
|
+
dark={dark}
|
37
54
|
>
|
38
|
-
<
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
</
|
55
|
+
<time>
|
56
|
+
{dateTimestamp.toTimeWithMeridian()}
|
57
|
+
<Caption
|
58
|
+
className="pb_time_stacked"
|
59
|
+
color="light"
|
60
|
+
dark={dark}
|
61
|
+
tag="span"
|
62
|
+
text={dateTimestamp.toTimezone()}
|
63
|
+
/>
|
64
|
+
</time>
|
65
|
+
</Body>
|
49
66
|
</div>
|
50
67
|
)
|
51
68
|
}
|
52
69
|
|
53
|
-
export default
|
70
|
+
export default TimeStackedDefault
|
@@ -1,3 +1,21 @@
|
|
1
1
|
@import "../pb_title/title";
|
2
2
|
@import "../pb_caption/caption";
|
3
3
|
@import "../tokens/colors";
|
4
|
+
|
5
|
+
[class^=pb_time_stacked_kit] {
|
6
|
+
&[class*=_center] {
|
7
|
+
text-align: center;
|
8
|
+
}
|
9
|
+
|
10
|
+
&[class*=_right] {
|
11
|
+
text-align: right;
|
12
|
+
}
|
13
|
+
|
14
|
+
}
|
15
|
+
|
16
|
+
.time-spacing {
|
17
|
+
time {
|
18
|
+
display: inline-grid;
|
19
|
+
margin-bottom: $space_xs - 6px;
|
20
|
+
}
|
21
|
+
}
|
@@ -1,5 +1,18 @@
|
|
1
|
-
<%= pb_rails("time_stacked", props: {
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
1
|
+
<%= pb_rails("time_stacked", props: {
|
2
|
+
time: DateTime.now,
|
3
|
+
align: "left",
|
4
|
+
}) %>
|
5
|
+
|
6
|
+
<br>
|
7
|
+
|
8
|
+
<%= pb_rails("time_stacked", props: {
|
9
|
+
time: Time.now,
|
10
|
+
align: "center"
|
11
|
+
}) %>
|
12
|
+
|
13
|
+
<br>
|
14
|
+
|
15
|
+
<%= pb_rails("time_stacked", props: {
|
16
|
+
time: Time.now,
|
17
|
+
align: "right"
|
18
|
+
}) %>
|
@@ -5,18 +5,23 @@ const TimeStackedDefault = (props) => {
|
|
5
5
|
return (
|
6
6
|
<div>
|
7
7
|
<TimeStacked
|
8
|
+
time={new Date()}
|
9
|
+
timeZone="America/New_York"
|
8
10
|
{...props}
|
9
|
-
date={new Date()}
|
10
11
|
/>
|
12
|
+
<br />
|
11
13
|
<TimeStacked
|
12
|
-
{...props}
|
13
14
|
align="center"
|
14
|
-
|
15
|
+
time={new Date()}
|
16
|
+
timeZone="America/New_York"
|
17
|
+
{...props}
|
15
18
|
/>
|
19
|
+
<br />
|
16
20
|
<TimeStacked
|
17
|
-
{...props}
|
18
21
|
align="right"
|
19
|
-
|
22
|
+
time={new Date()}
|
23
|
+
timeZone="America/New_York"
|
24
|
+
{...props}
|
20
25
|
/>
|
21
26
|
</div>
|
22
27
|
)
|
@@ -1,8 +1,12 @@
|
|
1
1
|
<%= content_tag(:div,
|
2
|
-
align: object.align,
|
3
2
|
id: object.id,
|
4
3
|
data: object.data,
|
5
4
|
class: object.classname) do %>
|
6
|
-
|
7
|
-
|
5
|
+
|
6
|
+
<%= pb_rails("body", props: { color: "light", classname: "pb_time_stacked time-spacing" }) do %>
|
7
|
+
<time>
|
8
|
+
<%= object.format_time_string %>
|
9
|
+
<%= pb_rails("caption", props: { color: "light", tag: "span", text: object.pb_date_time.to_timezone.upcase, classname: "pb_time_stacked" }) %>
|
10
|
+
</time>
|
11
|
+
<% end %>
|
8
12
|
<% end %>
|
@@ -3,49 +3,27 @@
|
|
3
3
|
module Playbook
|
4
4
|
module PbTimeStacked
|
5
5
|
class TimeStacked < Playbook::KitBase
|
6
|
+
prop :time, required: true
|
6
7
|
prop :align, type: Playbook::Props::Enum,
|
7
8
|
values: %w[left center right],
|
8
9
|
default: "left"
|
9
|
-
prop :
|
10
|
-
default: nil
|
11
|
-
prop :dark, type: Playbook::Props::Boolean,
|
12
|
-
default: false
|
13
|
-
prop :date, type: Playbook::Props::Date, required: true
|
10
|
+
prop :timezone, default: "America/New_York"
|
14
11
|
|
15
12
|
def classname
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
def day
|
20
|
-
day = Playbook::PbKit::PbDateTime.new(date)
|
21
|
-
content_tag(:time, datetime: day.to_iso) do
|
22
|
-
day.to_day.to_s
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def month
|
27
|
-
month = Playbook::PbKit::PbDateTime.new(date)
|
28
|
-
content_tag(:time, datetime: month.to_iso) do
|
29
|
-
month.to_month.to_s
|
30
|
-
end
|
13
|
+
# convert deprecated prop values
|
14
|
+
generate_classname("pb_time_stacked_kit", align)
|
31
15
|
end
|
32
16
|
|
33
17
|
def format_time_string
|
34
|
-
"#{pb_date_time.
|
18
|
+
"#{pb_date_time.to_hour}:#{pb_date_time.to_minutes}#{pb_date_time.to_meridian}"
|
35
19
|
end
|
36
20
|
|
37
|
-
def
|
38
|
-
pb_date_time.to_timezone
|
39
|
-
end
|
40
|
-
|
41
|
-
private
|
42
|
-
|
43
|
-
def dark_class
|
44
|
-
dark ? "dark" : nil
|
21
|
+
def format_timezone_string
|
22
|
+
pb_date_time.to_timezone.to_s
|
45
23
|
end
|
46
24
|
|
47
25
|
def pb_date_time
|
48
|
-
Playbook::PbKit::PbDateTime.new(
|
26
|
+
Playbook::PbKit::PbDateTime.new(time, timezone)
|
49
27
|
end
|
50
28
|
end
|
51
29
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
import { renderKit, screen } from '../utilities/test-utils'
|
2
|
+
|
3
|
+
import TimeStacked from './_time_stacked'
|
4
|
+
|
5
|
+
/*eslint no-multiple-empty-lines: 0*/
|
6
|
+
|
7
|
+
test('returns the namespaced class', () => {
|
8
|
+
const props = {
|
9
|
+
data: { testid: 'default' },
|
10
|
+
time: new Date,
|
11
|
+
}
|
12
|
+
|
13
|
+
renderKit(TimeStacked, props)
|
14
|
+
expect(screen.getByTestId('default')).toHaveClass('pb_time_stacked_kit_left')
|
15
|
+
|
16
|
+
renderKit(TimeStacked, props, {
|
17
|
+
align: 'center',
|
18
|
+
data: { testid: 'center' },
|
19
|
+
})
|
20
|
+
expect(screen.getByTestId('center')).toHaveClass('pb_time_stacked_kit_center')
|
21
|
+
|
22
|
+
renderKit(TimeStacked, props, {
|
23
|
+
align: 'right',
|
24
|
+
data: { testid: 'right' },
|
25
|
+
})
|
26
|
+
expect(screen.getByTestId('right')).toHaveClass('pb_time_stacked_kit_right')
|
27
|
+
|
28
|
+
renderKit(TimeStacked, props, {
|
29
|
+
dark: true,
|
30
|
+
data: { testid: 'dark' },
|
31
|
+
})
|
32
|
+
expect(screen.getByTestId('dark')).toHaveClass('pb_time_stacked_kit_left dark')
|
33
|
+
})
|
@@ -46,7 +46,7 @@ $tooltip_shadow: rgba(60, 106, 172, 0.18);
|
|
46
46
|
content: " ";
|
47
47
|
position: absolute;
|
48
48
|
top: 100%;
|
49
|
-
left: 50
|
49
|
+
left: calc(50% - 10px);
|
50
50
|
border-color: $white transparent transparent transparent;
|
51
51
|
border-style: solid;
|
52
52
|
border-width: 10px;
|
@@ -95,9 +95,10 @@ $tooltip_shadow: rgba(60, 106, 172, 0.18);
|
|
95
95
|
box-shadow: -8px 0 28px 0 $tooltip_shadow;
|
96
96
|
margin: 0 0 0 $space_sm;
|
97
97
|
.arrow {
|
98
|
-
left:
|
99
|
-
|
98
|
+
left: -18px;
|
99
|
+
right: auto;
|
100
100
|
margin-bottom: 0;
|
101
|
+
top: $arrow_vertical_offset;
|
101
102
|
transform: rotate(90deg);
|
102
103
|
}
|
103
104
|
&.flipped .arrow {
|
@@ -23,7 +23,7 @@ const UserBadge = (props: UserBadgeProps) => {
|
|
23
23
|
size = 'md',
|
24
24
|
} = props
|
25
25
|
|
26
|
-
const image = require(`./badges
|
26
|
+
const image = require(`./badges/${badge}.svg`)
|
27
27
|
const ariaProps = buildAriaProps(aria)
|
28
28
|
const dataProps = buildDataProps(data)
|
29
29
|
const classes = classnames(
|
data/lib/playbook/props/base.rb
CHANGED
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: 8.
|
4
|
+
version: 8.1.2
|
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: 2021-03-
|
12
|
+
date: 2021-03-11 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: actionpack
|
@@ -663,6 +663,22 @@ files:
|
|
663
663
|
- app/pb_kits/playbook/pb_circle_icon_button/docs/_footer.md
|
664
664
|
- app/pb_kits/playbook/pb_circle_icon_button/docs/example.yml
|
665
665
|
- app/pb_kits/playbook/pb_circle_icon_button/docs/index.js
|
666
|
+
- app/pb_kits/playbook/pb_collapsible/_collapsible.jsx
|
667
|
+
- app/pb_kits/playbook/pb_collapsible/_collapsible.scss
|
668
|
+
- app/pb_kits/playbook/pb_collapsible/child_kits/CollapsibleContent.jsx
|
669
|
+
- app/pb_kits/playbook/pb_collapsible/child_kits/CollapsibleMain.jsx
|
670
|
+
- app/pb_kits/playbook/pb_collapsible/collapsible.html.erb
|
671
|
+
- app/pb_kits/playbook/pb_collapsible/collapsible.rb
|
672
|
+
- app/pb_kits/playbook/pb_collapsible/collapsible.test.js
|
673
|
+
- app/pb_kits/playbook/pb_collapsible/collapsible_content.html.erb
|
674
|
+
- app/pb_kits/playbook/pb_collapsible/collapsible_content.rb
|
675
|
+
- app/pb_kits/playbook/pb_collapsible/collapsible_main.html.erb
|
676
|
+
- app/pb_kits/playbook/pb_collapsible/collapsible_main.rb
|
677
|
+
- app/pb_kits/playbook/pb_collapsible/docs/_collapsible_default.html.erb
|
678
|
+
- app/pb_kits/playbook/pb_collapsible/docs/_collapsible_default.jsx
|
679
|
+
- app/pb_kits/playbook/pb_collapsible/docs/example.yml
|
680
|
+
- app/pb_kits/playbook/pb_collapsible/docs/index.js
|
681
|
+
- app/pb_kits/playbook/pb_collapsible/index.js
|
666
682
|
- app/pb_kits/playbook/pb_contact/_contact.jsx
|
667
683
|
- app/pb_kits/playbook/pb_contact/_contact.scss
|
668
684
|
- app/pb_kits/playbook/pb_contact/contact.html.erb
|
@@ -1807,6 +1823,7 @@ files:
|
|
1807
1823
|
- app/pb_kits/playbook/pb_time_stacked/docs/index.js
|
1808
1824
|
- app/pb_kits/playbook/pb_time_stacked/time_stacked.html.erb
|
1809
1825
|
- app/pb_kits/playbook/pb_time_stacked/time_stacked.rb
|
1826
|
+
- app/pb_kits/playbook/pb_time_stacked/time_stacked.test.js
|
1810
1827
|
- app/pb_kits/playbook/pb_timeline/_item.jsx
|
1811
1828
|
- app/pb_kits/playbook/pb_timeline/_timeline.jsx
|
1812
1829
|
- app/pb_kits/playbook/pb_timeline/_timeline.scss
|