playbook_ui 9.12.0.pre.text.addon → 9.12.0
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 +1 -0
- 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_bread_crumbs/_bread_crumb_item.jsx +51 -0
- data/app/pb_kits/playbook/pb_bread_crumbs/_bread_crumbs.jsx +49 -0
- data/app/pb_kits/playbook/pb_bread_crumbs/_bread_crumbs.scss +55 -0
- data/app/pb_kits/playbook/pb_bread_crumbs/bread_crumb_item.html.erb +9 -0
- data/app/pb_kits/playbook/pb_bread_crumbs/bread_crumb_item.rb +12 -0
- data/app/pb_kits/playbook/pb_bread_crumbs/bread_crumbs.html.erb +7 -0
- data/app/pb_kits/playbook/pb_bread_crumbs/bread_crumbs.rb +11 -0
- data/app/pb_kits/playbook/pb_bread_crumbs/bread_crumbs.test.js +35 -0
- data/app/pb_kits/playbook/pb_bread_crumbs/docs/_bread_crumbs_default.html.erb +17 -0
- data/app/pb_kits/playbook/pb_bread_crumbs/docs/_bread_crumbs_default.jsx +56 -0
- data/app/pb_kits/playbook/pb_bread_crumbs/docs/_description.md +1 -0
- data/app/pb_kits/playbook/pb_bread_crumbs/docs/example.yml +7 -0
- data/app/pb_kits/playbook/pb_bread_crumbs/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_date_stacked/_date_stacked.jsx +45 -11
- data/app/pb_kits/playbook/pb_date_stacked/date_stacked.html.erb +17 -6
- data/app/pb_kits/playbook/pb_date_stacked/date_stacked.rb +12 -5
- data/app/pb_kits/playbook/pb_date_stacked/docs/_date_stacked_bold.html.erb +5 -0
- data/app/pb_kits/playbook/pb_date_stacked/docs/_date_stacked_bold.jsx +38 -0
- data/app/pb_kits/playbook/pb_date_stacked/docs/example.yml +3 -1
- data/app/pb_kits/playbook/pb_date_stacked/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_date_time_stacked/_date_time_stacked.jsx +32 -16
- data/app/pb_kits/playbook/pb_date_time_stacked/_date_time_stacked.scss +23 -4
- data/app/pb_kits/playbook/pb_date_time_stacked/date_time_stacked.html.erb +12 -8
- data/app/pb_kits/playbook/pb_date_time_stacked/date_time_stacked.rb +9 -2
- data/app/pb_kits/playbook/pb_date_time_stacked/date_time_stacked.test.js +35 -0
- data/app/pb_kits/playbook/pb_date_time_stacked/docs/_date_time_stacked_default.html.erb +8 -1
- data/app/pb_kits/playbook/pb_date_time_stacked/docs/_date_time_stacked_default.jsx +19 -1
- data/app/pb_kits/playbook/pb_dialog/dialog.test.jsx +1 -1
- data/app/pb_kits/playbook/pb_flex/_flex.jsx +6 -1
- data/app/pb_kits/playbook/pb_passphrase/_passphrase.jsx +13 -11
- data/app/pb_kits/playbook/pb_passphrase/_passphrase.scss +18 -13
- data/app/pb_kits/playbook/pb_section_separator/_section_separator.jsx +7 -3
- data/app/pb_kits/playbook/pb_text_input/text_input.rb +2 -2
- data/app/pb_kits/playbook/pb_time_stacked/time_stacked.html.erb +2 -2
- data/lib/playbook/version.rb +1 -1
- metadata +20 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b1460f77a2ef88bf84e6e7388b473d73517373e9ef0d690418f318bf13eb49f6
|
4
|
+
data.tar.gz: 814d426340141a35d9286a0df82747538023dde241b7ec662c68bdfe6ef59585
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e2c7ca89a529a1b173ac9cdd097813f342024c0428bac7830a6c0fa2fedc8e2951e6f7eea46bcaadbf85d8a65d5cd53d329c9d3c13abf5b0db0b001f11610bed
|
7
|
+
data.tar.gz: 73a48d081d1f1db44d7b788816ccc4e6c02657cf7e0b3107da11d18e1889bb716810717ab0259cb6385a31dd02b90c6ff8162896998732b97c2936f7f821a85f
|
@@ -10,6 +10,7 @@ export Background from './pb_background/_background.jsx'
|
|
10
10
|
export Badge from './pb_badge/_badge.jsx'
|
11
11
|
export BarGraph from './pb_bar_graph/_bar_graph.jsx'
|
12
12
|
export Body from './pb_body/_body.jsx'
|
13
|
+
export BreadCrumbs from './pb_bread_crumbs/_bread_crumbs.jsx'
|
13
14
|
export Button from './pb_button/_button.jsx'
|
14
15
|
export ButtonToolbar from './pb_button_toolbar/_button_toolbar.jsx'
|
15
16
|
export Caption from './pb_caption/_caption.jsx'
|
@@ -0,0 +1,51 @@
|
|
1
|
+
/* @flow */
|
2
|
+
|
3
|
+
import React from 'react'
|
4
|
+
import classnames from 'classnames'
|
5
|
+
import { globalProps } from '../utilities/globalProps.js'
|
6
|
+
|
7
|
+
import {
|
8
|
+
buildAriaProps,
|
9
|
+
buildCss,
|
10
|
+
buildDataProps,
|
11
|
+
} from '../utilities/props'
|
12
|
+
|
13
|
+
type BreadCrumbItemProps = {
|
14
|
+
aria?: object,
|
15
|
+
className?: string,
|
16
|
+
data?: object,
|
17
|
+
id?: string,
|
18
|
+
component?: element
|
19
|
+
}
|
20
|
+
const BreadCrumbItem = (props: BreadCrumbItemProps) => {
|
21
|
+
const {
|
22
|
+
aria = {},
|
23
|
+
className,
|
24
|
+
data = {},
|
25
|
+
id,
|
26
|
+
component = 'a',
|
27
|
+
...rest
|
28
|
+
} = props
|
29
|
+
const ariaProps = buildAriaProps(aria)
|
30
|
+
const dataProps = buildDataProps(data)
|
31
|
+
const css = classnames(
|
32
|
+
buildCss('pb_bread_crumb_item_kit'),
|
33
|
+
globalProps(props),
|
34
|
+
className
|
35
|
+
)
|
36
|
+
const Component = component || 'span'
|
37
|
+
return (
|
38
|
+
<div
|
39
|
+
{...ariaProps}
|
40
|
+
{...dataProps}
|
41
|
+
className={css}
|
42
|
+
id={id}
|
43
|
+
>
|
44
|
+
<Component
|
45
|
+
className="pb_bread_crumb_item"
|
46
|
+
{...rest}
|
47
|
+
/>
|
48
|
+
</div>
|
49
|
+
)
|
50
|
+
}
|
51
|
+
export default BreadCrumbItem
|
@@ -0,0 +1,49 @@
|
|
1
|
+
/* @flow */
|
2
|
+
|
3
|
+
import React from 'react'
|
4
|
+
import classnames from 'classnames'
|
5
|
+
import { globalProps } from '../utilities/globalProps.js'
|
6
|
+
|
7
|
+
import {
|
8
|
+
buildAriaProps,
|
9
|
+
buildCss,
|
10
|
+
buildDataProps,
|
11
|
+
} from '../utilities/props'
|
12
|
+
|
13
|
+
type BreadCrumbsProps = {
|
14
|
+
aria?: object,
|
15
|
+
className?: string,
|
16
|
+
data?: object,
|
17
|
+
id?: string,
|
18
|
+
text?: string,
|
19
|
+
children?: node
|
20
|
+
}
|
21
|
+
const BreadCrumbs = (props: BreadCrumbsProps) => {
|
22
|
+
const {
|
23
|
+
aria = { label: 'Breadcrumb Navigation' },
|
24
|
+
className,
|
25
|
+
data = {},
|
26
|
+
id,
|
27
|
+
children,
|
28
|
+
} = props
|
29
|
+
const ariaProps = buildAriaProps(aria)
|
30
|
+
const dataProps = buildDataProps(data)
|
31
|
+
const css = classnames(
|
32
|
+
buildCss('pb_bread_crumbs_kit'),
|
33
|
+
globalProps(props),
|
34
|
+
className
|
35
|
+
)
|
36
|
+
|
37
|
+
return (
|
38
|
+
<nav
|
39
|
+
{...ariaProps}
|
40
|
+
{...dataProps}
|
41
|
+
className={css}
|
42
|
+
id={id}
|
43
|
+
>
|
44
|
+
{children}
|
45
|
+
</nav>
|
46
|
+
)
|
47
|
+
}
|
48
|
+
|
49
|
+
export default BreadCrumbs
|
@@ -0,0 +1,55 @@
|
|
1
|
+
@import "../tokens/border_radius";
|
2
|
+
@import "../tokens/colors";
|
3
|
+
@import "../tokens/opacity";
|
4
|
+
@import "../tokens/spacing";
|
5
|
+
@import "../tokens/typography";
|
6
|
+
|
7
|
+
[class^=pb_bread_crumbs_kit] {
|
8
|
+
$pb_badge_height: 18px;
|
9
|
+
|
10
|
+
display: inline-flex;
|
11
|
+
align-items: center;
|
12
|
+
justify-content: center;
|
13
|
+
border-radius: $border_rad_light;
|
14
|
+
padding: 0 $space_xs/2;
|
15
|
+
border-width: 1px;
|
16
|
+
border-style: solid;
|
17
|
+
border-color: $card_light;
|
18
|
+
|
19
|
+
svg {
|
20
|
+
margin-right: 8px;
|
21
|
+
}
|
22
|
+
.pb_bread_crumb_item {
|
23
|
+
display: flex;
|
24
|
+
flex-direction: row;
|
25
|
+
align-items: center;
|
26
|
+
|
27
|
+
}
|
28
|
+
.pb_bread_crumb_item_kit {
|
29
|
+
display: flex;
|
30
|
+
flex-direction: row;
|
31
|
+
align-items: center;
|
32
|
+
}
|
33
|
+
.pb_bread_crumb_item_kit:not(:last-child):after {
|
34
|
+
content: '/';
|
35
|
+
padding-left: 8px;
|
36
|
+
padding-right: 8px;
|
37
|
+
}
|
38
|
+
|
39
|
+
@each $color_name, $color_value in $status_colors {
|
40
|
+
&[class*=_#{$color_name}] {
|
41
|
+
background: rgba($color_value, $opacity_1);
|
42
|
+
color: map-get($status_color_text, $color_name);
|
43
|
+
}
|
44
|
+
}
|
45
|
+
|
46
|
+
&.dark {
|
47
|
+
border-width: 0;
|
48
|
+
|
49
|
+
@each $color_name, $color_value in $status_colors {
|
50
|
+
&[class*=_#{$color_name}] {
|
51
|
+
background: rgba(mix($bg_dark, $color_value, 10%), $opacity_2);
|
52
|
+
}
|
53
|
+
}
|
54
|
+
}
|
55
|
+
}
|
@@ -0,0 +1,35 @@
|
|
1
|
+
import React from 'react'
|
2
|
+
import { render, screen } from '../utilities/test-utils'
|
3
|
+
import BreadCrumbs from './_bread_crumbs'
|
4
|
+
import BreadCrumbItem from './_bread_crumb_item'
|
5
|
+
import { Icon, Title } from '../'
|
6
|
+
|
7
|
+
it('should render bread crumbs', () => {
|
8
|
+
const testId = 'breadCrumbs'
|
9
|
+
render(
|
10
|
+
<BreadCrumbs
|
11
|
+
data={{ testid: testId }}
|
12
|
+
name={name}
|
13
|
+
>
|
14
|
+
<Icon
|
15
|
+
icon="home"
|
16
|
+
size="1x"
|
17
|
+
/>
|
18
|
+
<BreadCrumbItem
|
19
|
+
dark
|
20
|
+
href="/home"
|
21
|
+
>
|
22
|
+
<Title
|
23
|
+
size="4"
|
24
|
+
tag="span"
|
25
|
+
text="Home"
|
26
|
+
/>
|
27
|
+
</BreadCrumbItem>
|
28
|
+
</BreadCrumbs>
|
29
|
+
)
|
30
|
+
const kit = screen.getByTestId(testId)
|
31
|
+
const label = screen.getByText('Home')
|
32
|
+
|
33
|
+
expect(kit).toHaveClass('pb_bread_crumbs_kit')
|
34
|
+
expect(label).toHaveTextContent('Home')
|
35
|
+
})
|
@@ -0,0 +1,17 @@
|
|
1
|
+
|
2
|
+
<div>
|
3
|
+
<%= pb_rails("bread_crumbs", props: { aria: { label: "Breadcrumb Navigation" } }) do%>
|
4
|
+
<%= pb_rails("icon", props: { icon: "home"}) %>
|
5
|
+
<%= pb_rails("bread_crumbs/bread_crumb_item", props: { link: "/" }) do %>
|
6
|
+
<%= pb_rails("title", props: { size: 4, text: "Home", tag: "span" }) %>
|
7
|
+
<%end%>
|
8
|
+
<%= pb_rails("icon", props: { icon: 'users'}) %>
|
9
|
+
<%= pb_rails("bread_crumbs/bread_crumb_item", props: { link: "/users" }) do %>
|
10
|
+
<%= pb_rails("title", props: { size: 4, text: "Users", tag: "span" }) %>
|
11
|
+
<%end%>
|
12
|
+
<%= pb_rails("icon", props: { icon: "user"}) %>
|
13
|
+
<%= pb_rails("bread_crumbs/bread_crumb_item") do %>
|
14
|
+
<%= pb_rails("title", props: { size: 4, text: "User", tag: "span" }) %>
|
15
|
+
<%end%>
|
16
|
+
<%end%>
|
17
|
+
</div>
|
@@ -0,0 +1,56 @@
|
|
1
|
+
import React from 'react'
|
2
|
+
import BreadCrumbs from '../_bread_crumbs.jsx'
|
3
|
+
import { Icon, Title } from '../../'
|
4
|
+
import BreadCrumbItem from '../_bread_crumb_item'
|
5
|
+
|
6
|
+
const Link = (props) => <BreadCrumbItem {...props} />
|
7
|
+
const BreadCrumbsDefault = (props) => {
|
8
|
+
return (
|
9
|
+
<BreadCrumbs
|
10
|
+
text="+1"
|
11
|
+
{...props}
|
12
|
+
>
|
13
|
+
<Icon
|
14
|
+
icon="home"
|
15
|
+
size="1x"
|
16
|
+
/>
|
17
|
+
<BreadCrumbItem
|
18
|
+
{...props}
|
19
|
+
href="/home"
|
20
|
+
>
|
21
|
+
<Title
|
22
|
+
size="4"
|
23
|
+
tag="span"
|
24
|
+
text="Home"
|
25
|
+
/>
|
26
|
+
</BreadCrumbItem>
|
27
|
+
<Icon
|
28
|
+
icon="users"
|
29
|
+
size="1x"
|
30
|
+
/>
|
31
|
+
<Link
|
32
|
+
{...props}
|
33
|
+
href="/users"
|
34
|
+
>
|
35
|
+
<Title
|
36
|
+
size="4"
|
37
|
+
tag="span"
|
38
|
+
text="Users"
|
39
|
+
/>
|
40
|
+
</Link>
|
41
|
+
<Icon
|
42
|
+
icon="user"
|
43
|
+
size="1x"
|
44
|
+
/>
|
45
|
+
<Link {...props}>
|
46
|
+
<Title
|
47
|
+
size="4"
|
48
|
+
tag="span"
|
49
|
+
text="User"
|
50
|
+
/>
|
51
|
+
</Link>
|
52
|
+
</BreadCrumbs>
|
53
|
+
)
|
54
|
+
}
|
55
|
+
|
56
|
+
export default BreadCrumbsDefault
|
@@ -0,0 +1 @@
|
|
1
|
+
BreadCrumbs can be used for keeping a user aware of there route location.
|
@@ -0,0 +1 @@
|
|
1
|
+
export { default as BreadCrumbsDefault } from './_bread_crumbs_default.jsx'
|
@@ -9,6 +9,7 @@ import { globalProps } from '../utilities/globalProps.js'
|
|
9
9
|
|
10
10
|
type DateStackedProps = {
|
11
11
|
align?: "left" | "center" | "right",
|
12
|
+
bold?: boolean,
|
12
13
|
className?: string | array<string>,
|
13
14
|
dark?: boolean,
|
14
15
|
data?: string,
|
@@ -26,6 +27,7 @@ const sizes = {
|
|
26
27
|
const DateStacked = (props: DateStackedProps) => {
|
27
28
|
const {
|
28
29
|
align = 'left',
|
30
|
+
bold = false,
|
29
31
|
reverse = false,
|
30
32
|
className,
|
31
33
|
dark = false,
|
@@ -46,19 +48,51 @@ const DateStacked = (props: DateStackedProps) => {
|
|
46
48
|
const inputYear = dateTimestamp.toYear().toString()
|
47
49
|
|
48
50
|
return (
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
text={dateTimestamp.
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
51
|
+
|
52
|
+
<div>
|
53
|
+
<If condition={bold == false}>
|
54
|
+
|
55
|
+
<div className={classes}>
|
56
|
+
<div className="pb_date_stacked_day_month">
|
57
|
+
<Caption text={dateTimestamp.toMonth().toUpperCase()} />
|
58
|
+
<Title
|
59
|
+
dark={dark}
|
60
|
+
size={sizes[size]}
|
61
|
+
text={dateTimestamp.toDay()}
|
62
|
+
/>
|
63
|
+
</div>
|
64
|
+
<If condition={currentYear != inputYear}>
|
65
|
+
<Caption size="xs">{inputYear}</Caption>
|
66
|
+
</If>
|
67
|
+
</div>
|
68
|
+
<Else />
|
69
|
+
<>
|
70
|
+
<div className={classes}>
|
71
|
+
<div className="pb_date_stacked_day_month">
|
72
|
+
|
73
|
+
<Title
|
74
|
+
bold
|
75
|
+
dark={dark}
|
76
|
+
size="4"
|
77
|
+
text={dateTimestamp.toMonth()}
|
78
|
+
/>
|
79
|
+
<Title
|
80
|
+
bold
|
81
|
+
dark={dark}
|
82
|
+
size="4"
|
83
|
+
text={dateTimestamp.toDay()}
|
84
|
+
/>
|
85
|
+
<If condition={currentYear != inputYear}>
|
86
|
+
<Title size="4">{inputYear}</Title>
|
87
|
+
</If>
|
88
|
+
</div>
|
89
|
+
|
90
|
+
</div>
|
91
|
+
|
92
|
+
</>
|
60
93
|
</If>
|
61
94
|
</div>
|
95
|
+
|
62
96
|
)
|
63
97
|
}
|
64
98
|
|
@@ -3,11 +3,22 @@
|
|
3
3
|
data: object.data,
|
4
4
|
class: object.classname) do %>
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
6
|
+
<% if object.bold == false %>
|
7
|
+
|
8
|
+
<div class="pb_date_stacked_day_month">
|
9
|
+
<%= pb_rails("caption", props: { text: object.month }) %>
|
10
|
+
<%= pb_rails("title", props: { text: object.day , size: object.title_size }) do %><% end %>
|
11
|
+
<%= pb_rails("caption", props: { text: object.year, size:"xs" }) %>
|
12
|
+
</div>
|
13
|
+
|
14
|
+
<% else %>
|
15
|
+
<div class="pb_date_stacked_day_month">
|
16
|
+
<%= pb_rails("title", props: { text: object.month, size: 4 }) %>
|
17
|
+
<%= pb_rails("title", props: { text: object.day, size: 4 }) do %><% end %>
|
18
|
+
<%= pb_rails("title", props: { text: object.year, size:4 }) %>
|
19
|
+
|
20
|
+
</div>
|
21
|
+
|
22
|
+
<% end %>
|
12
23
|
|
13
24
|
<% end %>
|
@@ -14,9 +14,11 @@ module Playbook
|
|
14
14
|
default: false
|
15
15
|
prop :dark, type: Playbook::Props::Boolean,
|
16
16
|
default: false
|
17
|
+
prop :bold, type: Playbook::Props::Boolean,
|
18
|
+
default: false
|
17
19
|
|
18
20
|
def classname
|
19
|
-
generate_classname("pb_date_stacked_kit", align, size, reverse_class, dark_class)
|
21
|
+
generate_classname("pb_date_stacked_kit", align, size, bold, reverse_class, dark_class)
|
20
22
|
end
|
21
23
|
|
22
24
|
def title_size
|
@@ -31,10 +33,7 @@ module Playbook
|
|
31
33
|
end
|
32
34
|
|
33
35
|
def month
|
34
|
-
|
35
|
-
content_tag(:time, datetime: month.to_iso) do
|
36
|
-
month.to_month.to_s
|
37
|
-
end
|
36
|
+
pb_date_time.to_month.capitalize
|
38
37
|
end
|
39
38
|
|
40
39
|
def year
|
@@ -47,8 +46,16 @@ module Playbook
|
|
47
46
|
end
|
48
47
|
end
|
49
48
|
|
49
|
+
def bold_class
|
50
|
+
bold ? "bold" : nil
|
51
|
+
end
|
52
|
+
|
50
53
|
private
|
51
54
|
|
55
|
+
def pb_date_time
|
56
|
+
Playbook::PbKit::PbDateTime.new(date)
|
57
|
+
end
|
58
|
+
|
52
59
|
def reverse_class
|
53
60
|
reverse ? "reverse" : nil
|
54
61
|
end
|
@@ -0,0 +1,5 @@
|
|
1
|
+
<%= pb_rails("date_stacked", props: { date: DateTime.now, align: "left", bold: true }) %>
|
2
|
+
<br>
|
3
|
+
<%= pb_rails("date_stacked", props: { date: Date.new(2018, 03, 20), align: "center", bold: true }) %>
|
4
|
+
<br>
|
5
|
+
<%= pb_rails("date_stacked", props: { date: DateTime.now, align: "right", bold: true }) %>
|
@@ -0,0 +1,38 @@
|
|
1
|
+
import React from 'react'
|
2
|
+
import DateStacked from '../_date_stacked.jsx'
|
3
|
+
|
4
|
+
const DateStackedBold = (props) => {
|
5
|
+
return (
|
6
|
+
<div>
|
7
|
+
<DateStacked
|
8
|
+
align="left"
|
9
|
+
bold
|
10
|
+
date={new Date()}
|
11
|
+
{...props}
|
12
|
+
/>
|
13
|
+
|
14
|
+
<br />
|
15
|
+
|
16
|
+
<DateStacked
|
17
|
+
align="center"
|
18
|
+
bold
|
19
|
+
date={new Date('20 Mar 2018')}
|
20
|
+
{...props}
|
21
|
+
/>
|
22
|
+
|
23
|
+
<br />
|
24
|
+
|
25
|
+
<DateStacked
|
26
|
+
align="right"
|
27
|
+
bold
|
28
|
+
date={new Date()}
|
29
|
+
{...props}
|
30
|
+
/>
|
31
|
+
|
32
|
+
<br />
|
33
|
+
|
34
|
+
</div>
|
35
|
+
)
|
36
|
+
}
|
37
|
+
|
38
|
+
export default DateStackedBold
|
@@ -6,10 +6,12 @@ examples:
|
|
6
6
|
- date_stacked_reverse: Day & Month Reverse
|
7
7
|
- date_stacked_sizes: Sizes
|
8
8
|
- date_stacked_align: Alignment
|
9
|
+
- date_stacked_bold: Bold
|
10
|
+
|
9
11
|
|
10
12
|
react:
|
11
13
|
- date_stacked_default: Default
|
12
14
|
- date_stacked_not_current_year: Not Current Year
|
13
15
|
- date_stacked_reverse: Day & Month Reverse
|
14
16
|
- date_stacked_sizes: Sizes
|
15
|
-
-
|
17
|
+
- date_stacked_bold: Bold
|
@@ -1,3 +1,4 @@
|
|
1
|
+
export { default as DateStackedBold } from './_date_stacked_bold.jsx'
|
1
2
|
export { default as DateStackedDefault } from './_date_stacked_default.jsx'
|
2
3
|
export { default as DateStackedNotCurrentYear } from './_date_stacked_not_current_year.jsx'
|
3
4
|
export { default as DateStackedReverse } from './_date_stacked_reverse.jsx'
|
@@ -1,43 +1,59 @@
|
|
1
|
+
|
1
2
|
/* @flow */
|
2
3
|
|
3
4
|
import React from 'react'
|
4
|
-
import {
|
5
|
-
import {
|
6
|
-
|
5
|
+
import { buildCss } from '../utilities/props'
|
6
|
+
import { deprecatedProps, globalProps } from '../utilities/globalProps.js'
|
7
|
+
|
8
|
+
import { DateStacked, Flex, FlexItem, SectionSeparator, TimeStacked } from '../'
|
7
9
|
|
8
10
|
type DateTimeStackedProps = {
|
9
|
-
data?: string,
|
10
11
|
id?: string,
|
11
|
-
date:
|
12
|
+
date: string,
|
13
|
+
datetime: string,
|
12
14
|
dark: boolean,
|
15
|
+
timeZone?: string,
|
13
16
|
}
|
14
17
|
|
15
18
|
const DateTimeStacked = (props: DateTimeStackedProps) => {
|
16
|
-
|
17
|
-
|
19
|
+
if (props.date) deprecatedProps('Date Time Stacked', ['date'])
|
20
|
+
|
21
|
+
const {
|
22
|
+
date,
|
23
|
+
datetime,
|
24
|
+
dark,
|
25
|
+
timeZone = 'America/New_York',
|
26
|
+
} = props
|
27
|
+
|
28
|
+
const classes = buildCss('pb_date_time_stacked_kit', globalProps(props))
|
18
29
|
|
19
30
|
return (
|
20
31
|
<Flex
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
{...dataProps}
|
32
|
+
inline="flex-container"
|
33
|
+
vertical="stretch"
|
34
|
+
{...props}
|
25
35
|
>
|
26
36
|
<FlexItem>
|
27
37
|
<DateStacked
|
28
38
|
align="right"
|
39
|
+
bold
|
29
40
|
dark={dark}
|
30
|
-
date={date}
|
31
|
-
|
32
|
-
size="sm"
|
41
|
+
date={date || datetime}
|
42
|
+
timeZone={timeZone}
|
33
43
|
/>
|
34
44
|
</FlexItem>
|
45
|
+
|
46
|
+
<SectionSeparator
|
47
|
+
className="date-time-padding"
|
48
|
+
orientation="vertical"
|
49
|
+
/>
|
35
50
|
<FlexItem>
|
36
51
|
<TimeStacked
|
37
|
-
className=
|
52
|
+
className={classes}
|
38
53
|
dark={dark}
|
54
|
+
date={date || datetime}
|
39
55
|
tag="caption"
|
40
|
-
|
56
|
+
timeZone={timeZone}
|
41
57
|
/>
|
42
58
|
</FlexItem>
|
43
59
|
</Flex>
|
@@ -1,6 +1,25 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
[class^=pb_date_time_stacked] {
|
2
|
+
|
3
|
+
[class^=padding_month] {
|
4
|
+
padding-bottom: ($space_xs + 2) !important;
|
5
|
+
}
|
6
|
+
|
7
|
+
[class^=padding_day] {
|
8
|
+
padding-bottom: ($space_xs + 2) !important;
|
9
|
+
}
|
10
|
+
|
11
|
+
&[class*=_dark] {
|
12
|
+
& > * [class^=pb_title_kit] {
|
13
|
+
color: $text_dk_default;
|
14
|
+
}
|
15
|
+
& > * [class^=pb_caption_kit] {
|
16
|
+
color: $text_dk_light;
|
17
|
+
}
|
18
|
+
}
|
3
19
|
|
4
|
-
.pb_date_time_stacked_kit {
|
5
|
-
padding-left: $space-xs;
|
6
20
|
}
|
21
|
+
.date-time-padding {
|
22
|
+
padding-right: ($space_xs / 2);
|
23
|
+
padding-left: ($space_xs / 2);
|
24
|
+
}
|
25
|
+
|
@@ -1,13 +1,17 @@
|
|
1
1
|
<%= content_tag(:div,
|
2
2
|
id: object.id,
|
3
3
|
data: object.data,
|
4
|
-
class: object.classname
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
class: object.classname,
|
5
|
+
aria: object.aria) do %>
|
6
|
+
|
7
|
+
<%= pb_rails("flex", props: {classname: "flex-container", vertical: "stretch"}) do %>
|
8
|
+
<%= pb_rails("body", props: {classname: "flex-item"}) do %>
|
9
|
+
<%= pb_rails("date_stacked", props: { date: object.date_time_value, size: "sm", align: "right", bold: true, dark: object.dark }) %>
|
8
10
|
<% end %>
|
9
|
-
<%= pb_rails("
|
10
|
-
|
11
|
+
<%= pb_rails("section_separator", props: { orientation: "vertical", classname: "date-time-padding" }) %>
|
12
|
+
<%= pb_rails("body", props: {classname: "flex-item"}) do %>
|
13
|
+
<%= pb_rails("time_stacked", props: { time: object.date_time_value, dark: object.dark, timezone: object.timezone }) %>
|
11
14
|
<% end %>
|
12
|
-
|
13
|
-
|
15
|
+
<% end %>
|
16
|
+
|
17
|
+
<% end %>
|
@@ -3,10 +3,17 @@
|
|
3
3
|
module Playbook
|
4
4
|
module PbDateTimeStacked
|
5
5
|
class DateTimeStacked < Playbook::KitBase
|
6
|
-
prop :date,
|
7
|
-
|
6
|
+
prop :date, deprecated: true
|
7
|
+
prop :date_time, type: Playbook::Props::Date,
|
8
|
+
default: ::DateTime.current
|
8
9
|
prop :dark, type: Playbook::Props::Boolean,
|
9
10
|
default: false
|
11
|
+
prop :timezone, type: Playbook::Props::String,
|
12
|
+
default: "America/New_York"
|
13
|
+
|
14
|
+
def date_time_value
|
15
|
+
date || date_time
|
16
|
+
end
|
10
17
|
end
|
11
18
|
end
|
12
19
|
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
import { ensureAccessible, renderKit } from '../utilities/test-utils'
|
2
|
+
import { DateTimeStacked } from '../'
|
3
|
+
|
4
|
+
/* eslint-disable jsx-control-statements/jsx-jcs-no-undef */
|
5
|
+
|
6
|
+
const props = {
|
7
|
+
data: { testid: 'datetimestacked' },
|
8
|
+
datetime: new Date('Wed Mar 31 2021 12:00:00 GMT-0500'),
|
9
|
+
}
|
10
|
+
|
11
|
+
test('Kit renders date time', () => {
|
12
|
+
const kit = renderKit(DateTimeStacked, props)
|
13
|
+
expect(kit).toBeInTheDocument()
|
14
|
+
})
|
15
|
+
|
16
|
+
it('Should be accessible', async () => {
|
17
|
+
ensureAccessible(DateTimeStacked, props)
|
18
|
+
})
|
19
|
+
|
20
|
+
test('renders time in default timezone', () => {
|
21
|
+
const kit = renderKit(DateTimeStacked, props)
|
22
|
+
expect(kit).toHaveTextContent(/Mar311:00pEDT/i)
|
23
|
+
})
|
24
|
+
|
25
|
+
test('renders time in timezone', () => {
|
26
|
+
props.timeZone = 'Asia/Tokyo'
|
27
|
+
const kit = renderKit(DateTimeStacked, props)
|
28
|
+
expect(kit).toHaveTextContent(/Mar312:00aJST/i)
|
29
|
+
})
|
30
|
+
|
31
|
+
test('renders time in timezone', () => {
|
32
|
+
props.timeZone = 'America/Denver'
|
33
|
+
const kit = renderKit(DateTimeStacked, props)
|
34
|
+
expect(kit).toHaveTextContent(/Mar3111:00aMDT/i)
|
35
|
+
})
|
@@ -1 +1,8 @@
|
|
1
|
-
<%= pb_rails("date_time_stacked") %>
|
1
|
+
<%= pb_rails("date_time_stacked", props: { date_time: DateTime.now }) %>
|
2
|
+
<br>
|
3
|
+
<%= pb_rails("date_time_stacked", props: { date_time: Date.new(2018, 03, 20) }) %>
|
4
|
+
<br>
|
5
|
+
<%= pb_rails("date_time_stacked", props: { date_time: DateTime.now, timezone: "Asia/Tokyo" }) %>
|
6
|
+
<br>
|
7
|
+
<%= pb_rails("date_time_stacked", props: { date_time: DateTime.now, timezone: "America/Denver" }) %>
|
8
|
+
|
@@ -4,10 +4,28 @@ import { DateTimeStacked } from '../../'
|
|
4
4
|
const DateTimeStackedDefault = (props) => (
|
5
5
|
<div>
|
6
6
|
<DateTimeStacked
|
7
|
-
|
7
|
+
datetime={new Date()}
|
8
8
|
{...props}
|
9
9
|
/>
|
10
|
+
<br />
|
11
|
+
<DateTimeStacked
|
12
|
+
datetime={new Date()}
|
13
|
+
timeZone="Asia/Tokyo"
|
14
|
+
|
15
|
+
{...props}
|
16
|
+
/>
|
17
|
+
<br />
|
18
|
+
<DateTimeStacked
|
19
|
+
datetime={new Date()}
|
20
|
+
timeZone="America/Denver"
|
21
|
+
|
22
|
+
{...props}
|
23
|
+
/>
|
24
|
+
|
10
25
|
</div>
|
11
26
|
)
|
12
27
|
|
13
28
|
export default DateTimeStackedDefault
|
29
|
+
|
30
|
+
// *Development Note* - We are reviewing this kit for a potential name change due to naming collisions when `new Date()` is used.
|
31
|
+
// To avoid this bug, please use name spacing as shown in the code examples. ie `import { Date as AliasedComponentName } from '../../'
|
@@ -2,11 +2,12 @@
|
|
2
2
|
|
3
3
|
import React from 'react'
|
4
4
|
import classnames from 'classnames'
|
5
|
-
import { buildCss } from '../utilities/props'
|
5
|
+
import { buildCss, buildDataProps } from '../utilities/props'
|
6
6
|
import { globalProps } from '../utilities/globalProps.js'
|
7
7
|
type FlexProps = {
|
8
8
|
children: array<React.ReactNode> | React.ReactNode,
|
9
9
|
className?: string,
|
10
|
+
data?: object,
|
10
11
|
horizontal?: "left" | "center" | "right" | "stretch" | "none",
|
11
12
|
justify?: "start" | "center" | "end" | "around" | "between" | "evenly" | "none",
|
12
13
|
id?: string,
|
@@ -27,6 +28,7 @@ const Flex = (props: FlexProps) => {
|
|
27
28
|
align = 'none',
|
28
29
|
children,
|
29
30
|
className,
|
31
|
+
data = {},
|
30
32
|
inline = false,
|
31
33
|
horizontal = 'left',
|
32
34
|
justify = 'none',
|
@@ -51,6 +53,8 @@ const Flex = (props: FlexProps) => {
|
|
51
53
|
const columnGapClass = columnGap !== 'none' ? `columnGap_${columnGap}` : ''
|
52
54
|
const wrapClass = wrap === true ? 'wrap' : ''
|
53
55
|
const reverseClass = reverse === true ? 'reverse' : ''
|
56
|
+
const dataProps = buildDataProps(data)
|
57
|
+
|
54
58
|
return (
|
55
59
|
<div
|
56
60
|
className={classnames(
|
@@ -70,6 +74,7 @@ const Flex = (props: FlexProps) => {
|
|
70
74
|
globalProps(props),
|
71
75
|
className
|
72
76
|
)}
|
77
|
+
{...dataProps}
|
73
78
|
>
|
74
79
|
{children}
|
75
80
|
</div>
|
@@ -7,7 +7,7 @@ import { buildAriaProps, buildCss, buildDataProps } from '../utilities/props'
|
|
7
7
|
import { globalProps } from '../utilities/globalProps.js'
|
8
8
|
import useZxcvbn from './useZxcvbn'
|
9
9
|
import useHaveIBeenPwned from './useHaveIBeenPwned'
|
10
|
-
import { Body, Caption, Flex, Icon, PbReactPopover, ProgressSimple, TextInput } from '../'
|
10
|
+
import { Body, Caption, CircleIconButton, Flex, Icon, PbReactPopover, ProgressSimple, TextInput } from '../'
|
11
11
|
|
12
12
|
type PassphraseProps = {
|
13
13
|
aria?: object,
|
@@ -69,6 +69,10 @@ const Passphrase = (props: PassphraseProps) => {
|
|
69
69
|
|
70
70
|
const [showPopover, setShowPopover] = useState(false)
|
71
71
|
const toggleShowPopover = () => setShowPopover(!showPopover)
|
72
|
+
const handleShouldClosePopover = (shouldClosePopover) => {
|
73
|
+
setShowPopover(!shouldClosePopover)
|
74
|
+
}
|
75
|
+
|
72
76
|
const [showPassphrase, setShowPassphrase] = useState(false)
|
73
77
|
const toggleShowPassphrase = () => setShowPassphrase(!showPassphrase)
|
74
78
|
|
@@ -85,7 +89,7 @@ const Passphrase = (props: PassphraseProps) => {
|
|
85
89
|
}, [strength])
|
86
90
|
|
87
91
|
const tipClass = classnames(
|
88
|
-
|
92
|
+
'passphrase-popover',
|
89
93
|
(showTipsBelow === 'always' ? null : `show-below-${showTipsBelow}`),
|
90
94
|
)
|
91
95
|
const dataProps = useMemo(
|
@@ -94,17 +98,13 @@ const Passphrase = (props: PassphraseProps) => {
|
|
94
98
|
)
|
95
99
|
|
96
100
|
const popoverReference = (
|
97
|
-
<
|
101
|
+
<CircleIconButton
|
98
102
|
className={tipClass}
|
103
|
+
dark={dark}
|
104
|
+
icon="info-circle"
|
99
105
|
onClick={toggleShowPopover}
|
100
|
-
|
101
|
-
|
102
|
-
dark={dark}
|
103
|
-
icon="info-circle"
|
104
|
-
size="xs"
|
105
|
-
variant="link"
|
106
|
-
/>
|
107
|
-
</a>
|
106
|
+
variant="link"
|
107
|
+
/>
|
108
108
|
)
|
109
109
|
|
110
110
|
return (
|
@@ -122,8 +122,10 @@ const Passphrase = (props: PassphraseProps) => {
|
|
122
122
|
/>
|
123
123
|
<If condition={tips.length > 0 && !confirmation}>
|
124
124
|
<PbReactPopover
|
125
|
+
closeOnClick="outside"
|
125
126
|
placement="right"
|
126
127
|
reference={popoverReference}
|
128
|
+
shouldClosePopover={handleShouldClosePopover}
|
127
129
|
show={showPopover}
|
128
130
|
>
|
129
131
|
<Flex
|
@@ -9,20 +9,13 @@
|
|
9
9
|
display: inline;
|
10
10
|
}
|
11
11
|
|
12
|
-
|
13
|
-
|
12
|
+
[class*=show-below-] {
|
13
|
+
display: none;
|
14
14
|
}
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
display: none;
|
20
|
-
}
|
21
|
-
@each $breakpoint_name, $breakpoint in $breakpoints {
|
22
|
-
&.show-below-#{$breakpoint_name} {
|
23
|
-
@include break_at($breakpoint) {
|
24
|
-
display: inline;
|
25
|
-
}
|
15
|
+
@each $breakpoint_name, $breakpoint in $breakpoints {
|
16
|
+
.show-below-#{$breakpoint_name} {
|
17
|
+
@include break_at($breakpoint) {
|
18
|
+
display: inline;
|
26
19
|
}
|
27
20
|
}
|
28
21
|
}
|
@@ -70,4 +63,16 @@
|
|
70
63
|
visibility: hidden;
|
71
64
|
}
|
72
65
|
}
|
66
|
+
.passphrase-popover {
|
67
|
+
position: relative;
|
68
|
+
left: -($space_xs * 1.25);
|
69
|
+
}
|
70
|
+
@-moz-document url-prefix() {
|
71
|
+
.passphrase-popover {
|
72
|
+
position: relative;
|
73
|
+
top: $space_sm;
|
74
|
+
left: -($space_xs * 1.5);
|
75
|
+
}
|
76
|
+
}
|
73
77
|
}
|
78
|
+
|
@@ -38,9 +38,13 @@ const SectionSeparator = (props: SectionSeparatorProps) => {
|
|
38
38
|
className={classes}
|
39
39
|
id={id}
|
40
40
|
>
|
41
|
-
|
42
|
-
|
43
|
-
|
41
|
+
|
42
|
+
<If condition={text}>
|
43
|
+
<span>
|
44
|
+
<Caption text={text} />
|
45
|
+
</span>
|
46
|
+
</If>
|
47
|
+
|
44
48
|
</div>
|
45
49
|
)
|
46
50
|
}
|
@@ -33,7 +33,7 @@ module Playbook
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def add_on_class
|
36
|
-
has_add_on? ?
|
36
|
+
has_add_on? ? "text_input_wrapper_add_on" : nil
|
37
37
|
end
|
38
38
|
|
39
39
|
def add_on_props
|
@@ -54,7 +54,7 @@ module Playbook
|
|
54
54
|
placeholder: placeholder,
|
55
55
|
required: required,
|
56
56
|
type: type,
|
57
|
-
value: value
|
57
|
+
value: value,
|
58
58
|
}
|
59
59
|
end
|
60
60
|
|
@@ -3,10 +3,10 @@
|
|
3
3
|
data: object.data,
|
4
4
|
class: object.classname) do %>
|
5
5
|
|
6
|
-
<%= pb_rails("body", props: { color: "light", classname: "pb_time_stacked time-spacing" }) do %>
|
6
|
+
<%= pb_rails("body", props: { color: "light", dark: object.dark, classname: "pb_time_stacked time-spacing" }) do %>
|
7
7
|
<time>
|
8
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" }) %>
|
9
|
+
<%= pb_rails("caption", props: { color: "light", tag: "span", text: object.pb_date_time.to_timezone.upcase, dark: object.dark, classname: "pb_time_stacked" }) %>
|
10
10
|
</time>
|
11
11
|
<% end %>
|
12
12
|
<% end %>
|
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: 9.12.0
|
4
|
+
version: 9.12.0
|
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-05-
|
12
|
+
date: 2021-05-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: actionpack
|
@@ -516,6 +516,19 @@ files:
|
|
516
516
|
- app/pb_kits/playbook/pb_body/docs/_footer.md
|
517
517
|
- app/pb_kits/playbook/pb_body/docs/example.yml
|
518
518
|
- app/pb_kits/playbook/pb_body/docs/index.js
|
519
|
+
- app/pb_kits/playbook/pb_bread_crumbs/_bread_crumb_item.jsx
|
520
|
+
- app/pb_kits/playbook/pb_bread_crumbs/_bread_crumbs.jsx
|
521
|
+
- app/pb_kits/playbook/pb_bread_crumbs/_bread_crumbs.scss
|
522
|
+
- app/pb_kits/playbook/pb_bread_crumbs/bread_crumb_item.html.erb
|
523
|
+
- app/pb_kits/playbook/pb_bread_crumbs/bread_crumb_item.rb
|
524
|
+
- app/pb_kits/playbook/pb_bread_crumbs/bread_crumbs.html.erb
|
525
|
+
- app/pb_kits/playbook/pb_bread_crumbs/bread_crumbs.rb
|
526
|
+
- app/pb_kits/playbook/pb_bread_crumbs/bread_crumbs.test.js
|
527
|
+
- app/pb_kits/playbook/pb_bread_crumbs/docs/_bread_crumbs_default.html.erb
|
528
|
+
- app/pb_kits/playbook/pb_bread_crumbs/docs/_bread_crumbs_default.jsx
|
529
|
+
- app/pb_kits/playbook/pb_bread_crumbs/docs/_description.md
|
530
|
+
- app/pb_kits/playbook/pb_bread_crumbs/docs/example.yml
|
531
|
+
- app/pb_kits/playbook/pb_bread_crumbs/docs/index.js
|
519
532
|
- app/pb_kits/playbook/pb_button/_button.jsx
|
520
533
|
- app/pb_kits/playbook/pb_button/_button.scss
|
521
534
|
- app/pb_kits/playbook/pb_button/_button_mixins.scss
|
@@ -809,6 +822,8 @@ files:
|
|
809
822
|
- app/pb_kits/playbook/pb_date_stacked/date_stacked.rb
|
810
823
|
- app/pb_kits/playbook/pb_date_stacked/docs/_date_stacked_align.html.erb
|
811
824
|
- app/pb_kits/playbook/pb_date_stacked/docs/_date_stacked_align.jsx
|
825
|
+
- app/pb_kits/playbook/pb_date_stacked/docs/_date_stacked_bold.html.erb
|
826
|
+
- app/pb_kits/playbook/pb_date_stacked/docs/_date_stacked_bold.jsx
|
812
827
|
- app/pb_kits/playbook/pb_date_stacked/docs/_date_stacked_default.html.erb
|
813
828
|
- app/pb_kits/playbook/pb_date_stacked/docs/_date_stacked_default.jsx
|
814
829
|
- app/pb_kits/playbook/pb_date_stacked/docs/_date_stacked_not_current_year.html.erb
|
@@ -838,6 +853,7 @@ files:
|
|
838
853
|
- app/pb_kits/playbook/pb_date_time_stacked/_date_time_stacked.scss
|
839
854
|
- app/pb_kits/playbook/pb_date_time_stacked/date_time_stacked.html.erb
|
840
855
|
- app/pb_kits/playbook/pb_date_time_stacked/date_time_stacked.rb
|
856
|
+
- app/pb_kits/playbook/pb_date_time_stacked/date_time_stacked.test.js
|
841
857
|
- app/pb_kits/playbook/pb_date_time_stacked/docs/_date_time_stacked_default.html.erb
|
842
858
|
- app/pb_kits/playbook/pb_date_time_stacked/docs/_date_time_stacked_default.jsx
|
843
859
|
- app/pb_kits/playbook/pb_date_time_stacked/docs/example.yml
|
@@ -2139,9 +2155,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
2139
2155
|
version: '0'
|
2140
2156
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
2141
2157
|
requirements:
|
2142
|
-
- - "
|
2158
|
+
- - ">="
|
2143
2159
|
- !ruby/object:Gem::Version
|
2144
|
-
version:
|
2160
|
+
version: '0'
|
2145
2161
|
requirements: []
|
2146
2162
|
rubyforge_project:
|
2147
2163
|
rubygems_version: 2.7.3
|