playbook_ui 4.17.0 → 4.18.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 +2 -1
- data/app/pb_kits/playbook/index.js +1 -0
- data/app/pb_kits/playbook/packs/examples.js +2 -0
- data/app/pb_kits/playbook/packs/samples.js +2 -0
- data/app/pb_kits/playbook/pb_avatar_action_button/_avatar_action_button.html.erb +1 -0
- data/app/pb_kits/playbook/pb_avatar_action_button/_avatar_action_button.jsx +3 -0
- data/app/pb_kits/playbook/pb_label_value/_label_value.html.erb +1 -0
- data/app/pb_kits/playbook/pb_label_value/_label_value.jsx +22 -3
- data/app/pb_kits/playbook/pb_layout/_layout.jsx +6 -4
- data/app/pb_kits/playbook/pb_logistic/_logistic.html.erb +1 -0
- data/app/pb_kits/playbook/pb_logistic/_logistic.jsx +26 -4
- data/app/pb_kits/playbook/pb_message/_message.html.erb +1 -0
- data/app/pb_kits/playbook/pb_message/_message.jsx +25 -7
- data/app/pb_kits/playbook/pb_message/docs/_message_default.jsx +1 -2
- data/app/pb_kits/playbook/pb_message/message.rb +1 -1
- data/app/pb_kits/playbook/pb_person/_person.html.erb +9 -2
- data/app/pb_kits/playbook/pb_person/_person.jsx +34 -10
- data/app/pb_kits/playbook/pb_person/docs/_person_default.html.erb +5 -1
- data/app/pb_kits/playbook/pb_person_contact/_person_contact.html.erb +1 -0
- data/app/pb_kits/playbook/pb_person_contact/_person_contact.jsx +57 -5
- data/app/pb_kits/playbook/pb_person_contact/docs/_person_contact_with_wrong_numbers.jsx +32 -0
- data/app/pb_kits/playbook/pb_person_contact/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_person_contact/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_progress_pills/_progress_pills.html.erb +1 -0
- data/app/pb_kits/playbook/pb_progress_pills/_progress_pills.jsx +29 -5
- data/app/pb_kits/playbook/pb_section_separator/_section_separator.html.erb +1 -0
- data/app/pb_kits/playbook/pb_section_separator/_section_separator.jsx +22 -13
- data/app/pb_kits/playbook/pb_section_separator/docs/_section_separator_text.jsx +3 -1
- data/app/pb_kits/playbook/pb_timeline/_item.html.erb +28 -0
- data/app/pb_kits/playbook/pb_timeline/_item.jsx +54 -0
- data/app/pb_kits/playbook/pb_timeline/_timeline.html.erb +6 -0
- data/app/pb_kits/playbook/pb_timeline/_timeline.jsx +43 -0
- data/app/pb_kits/playbook/pb_timeline/_timeline.scss +271 -0
- data/app/pb_kits/playbook/pb_timeline/docs/_description.md +3 -0
- data/app/pb_kits/playbook/pb_timeline/docs/_timeline_default.html.erb +43 -0
- data/app/pb_kits/playbook/pb_timeline/docs/_timeline_default.jsx +73 -0
- data/app/pb_kits/playbook/pb_timeline/docs/_timeline_vertical.html.erb +43 -0
- data/app/pb_kits/playbook/pb_timeline/docs/_timeline_vertical.jsx +73 -0
- data/app/pb_kits/playbook/pb_timeline/docs/_timeline_with_date.html.erb +44 -0
- data/app/pb_kits/playbook/pb_timeline/docs/_timeline_with_date.jsx +85 -0
- data/app/pb_kits/playbook/pb_timeline/docs/example.yml +13 -0
- data/app/pb_kits/playbook/pb_timeline/docs/index.js +3 -0
- data/app/pb_kits/playbook/pb_timeline/item.rb +25 -0
- data/app/pb_kits/playbook/pb_timeline/timeline.rb +27 -0
- data/app/views/playbook/samples/registration/index.html.erb +316 -0
- data/app/views/playbook/samples/registration/index.jsx +476 -0
- data/lib/playbook/version.rb +1 -1
- metadata +23 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: be9bba608156b09d59f0fce484b089d45895fbc8d8c899f002de676cbe8754fa
|
4
|
+
data.tar.gz: f356fb9ccc68b15659839bd865d9e603d7df902e4bbbbda1a219900d389a73b7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: caf7accc56bc9ad9bd611ab68315ea0386b85673a7143cfdb546aa0c15fc8f62d58ce76832fa0ffc1766f07fc1254b160709563450a3b4a1ea78d8eb5237763f
|
7
|
+
data.tar.gz: d599aeacd3127cdaaa8aca96cfe98216d75528b3ff8fe8cb4ecd0e43db8772c53097fb4039687827c8305032b4cf789ef0ca80bf091e3b980896c965f0578284
|
@@ -67,6 +67,7 @@
|
|
67
67
|
@import 'pb_text_input/text_input';
|
68
68
|
@import 'pb_textarea/textarea';
|
69
69
|
@import 'pb_time/time';
|
70
|
+
@import 'pb_timeline/timeline';
|
70
71
|
@import 'pb_time_range_inline/time_range_inline';
|
71
72
|
@import 'pb_timestamp/timestamp';
|
72
73
|
@import 'pb_title_count/title_count';
|
@@ -70,6 +70,7 @@ export TableRow from './pb_table/_table_row.jsx'
|
|
70
70
|
export Textarea from './pb_textarea/_textarea.jsx'
|
71
71
|
export TextInput from './pb_text_input/_text_input.jsx'
|
72
72
|
export Time from './pb_time/_time.jsx'
|
73
|
+
export Timeline from './pb_timeline/_timeline.jsx'
|
73
74
|
export TimeStacked from './pb_time_stacked/_time_stacked.jsx'
|
74
75
|
export Timestamp from './pb_timestamp/_timestamp.jsx'
|
75
76
|
export TimeRangeInline from './pb_time_range_inline/_time_range_inline.jsx'
|
@@ -79,6 +79,7 @@ import * as Table from 'pb_table/docs'
|
|
79
79
|
import * as Textarea from 'pb_textarea/docs'
|
80
80
|
import * as TextInput from 'pb_text_input/docs'
|
81
81
|
import * as Time from 'pb_time/docs'
|
82
|
+
import * as Timeline from 'pb_timeline/docs'
|
82
83
|
import * as TimeStacked from 'pb_time_stacked/docs'
|
83
84
|
import * as Timestamp from 'pb_timestamp/docs'
|
84
85
|
import * as TimeRangeInline from 'pb_time_range_inline/docs'
|
@@ -157,6 +158,7 @@ WebpackerReact.setup({
|
|
157
158
|
...Textarea,
|
158
159
|
...TextInput,
|
159
160
|
...Time,
|
161
|
+
...Timeline,
|
160
162
|
...TimeStacked,
|
161
163
|
...Timestamp,
|
162
164
|
...TimeRangeInline,
|
@@ -11,5 +11,7 @@ import WebpackerReact from 'webpacker-react'
|
|
11
11
|
// Generated file from kit generator.
|
12
12
|
|
13
13
|
import Dashboards from '../../../views/playbook/samples/dashboards/index.jsx'
|
14
|
+
import Registration from '../../../views/playbook/samples/registration/index.jsx'
|
14
15
|
|
15
16
|
WebpackerReact.setup({ Dashboards })
|
17
|
+
WebpackerReact.setup({ Registration })
|
@@ -15,6 +15,7 @@ type AvatarActionButtonProps = {
|
|
15
15
|
aria: Object,
|
16
16
|
className?: String,
|
17
17
|
data?: Object,
|
18
|
+
id?: String,
|
18
19
|
imageUrl?: String,
|
19
20
|
linkUrl?: String,
|
20
21
|
name?: String,
|
@@ -28,6 +29,7 @@ const AvatarActionButton = ({
|
|
28
29
|
aria = {},
|
29
30
|
className,
|
30
31
|
data = {},
|
32
|
+
id,
|
31
33
|
imageUrl,
|
32
34
|
linkUrl,
|
33
35
|
name,
|
@@ -55,6 +57,7 @@ const AvatarActionButton = ({
|
|
55
57
|
{...ariaProps}
|
56
58
|
{...dataProps}
|
57
59
|
className={classnames(css, className)}
|
60
|
+
id={id}
|
58
61
|
>
|
59
62
|
<a
|
60
63
|
href={linkUrl}
|
@@ -2,18 +2,32 @@
|
|
2
2
|
|
3
3
|
import React from 'react'
|
4
4
|
import classnames from 'classnames'
|
5
|
+
import { buildAriaProps, buildDataProps } from '../utilities/props'
|
5
6
|
import { Body, Caption } from '../'
|
6
7
|
import { spacing } from '../utilities/spacing.js'
|
7
8
|
|
8
9
|
type LabelValueProps = {
|
10
|
+
aria?: object,
|
9
11
|
className?: String,
|
12
|
+
dark?: Boolean,
|
13
|
+
data?: object,
|
14
|
+
id?: String,
|
10
15
|
label: String,
|
11
16
|
value: String,
|
12
|
-
dark?: Boolean,
|
13
17
|
}
|
14
18
|
|
15
19
|
const LabelValue = (props: LabelValueProps) => {
|
16
|
-
const {
|
20
|
+
const {
|
21
|
+
aria = {},
|
22
|
+
className,
|
23
|
+
dark = false,
|
24
|
+
data = {},
|
25
|
+
id,
|
26
|
+
label,
|
27
|
+
value } = props
|
28
|
+
|
29
|
+
const ariaProps = buildAriaProps(aria)
|
30
|
+
const dataProps = buildDataProps(data)
|
17
31
|
const themeStyle = dark === true ? '_dark' : ''
|
18
32
|
const css = classnames(
|
19
33
|
['pb_label_value_kit' + themeStyle, className],
|
@@ -21,7 +35,12 @@ const LabelValue = (props: LabelValueProps) => {
|
|
21
35
|
)
|
22
36
|
|
23
37
|
return (
|
24
|
-
<div
|
38
|
+
<div
|
39
|
+
{...ariaProps}
|
40
|
+
{...dataProps}
|
41
|
+
className={css}
|
42
|
+
id={id}
|
43
|
+
>
|
25
44
|
<Caption text={label} />
|
26
45
|
<Body text={value} />
|
27
46
|
</div>
|
@@ -33,15 +33,17 @@ type LayoutBodyProps = {
|
|
33
33
|
}
|
34
34
|
|
35
35
|
// Side component
|
36
|
-
const Side = (
|
36
|
+
const Side = (props: LayoutSideProps) => {
|
37
|
+
const { children, className } = props
|
37
38
|
return (
|
38
|
-
<div className={classnames('layout_sidebar', className)}>{children}</div>
|
39
|
+
<div className={classnames('layout_sidebar', className, spacing(props))}>{children}</div>
|
39
40
|
)
|
40
41
|
}
|
41
42
|
|
42
43
|
// Body component
|
43
|
-
const Body = (
|
44
|
-
|
44
|
+
const Body = (props: LayoutBodyProps) => {
|
45
|
+
const { children, className } = props
|
46
|
+
return <div className={classnames('layout_body', className, spacing(props))}>{children}</div>
|
45
47
|
}
|
46
48
|
|
47
49
|
// Main componenet
|
@@ -3,6 +3,7 @@
|
|
3
3
|
import React from 'react'
|
4
4
|
import classnames from 'classnames'
|
5
5
|
import DateTime from '../pb_kit/dateTime.js'
|
6
|
+
import { buildAriaProps, buildCss, buildDataProps } from '../utilities/props'
|
6
7
|
import { Body, Caption, Icon, Title } from '../'
|
7
8
|
import { spacing } from '../utilities/spacing.js'
|
8
9
|
|
@@ -14,19 +15,40 @@ const dateString = (value: DateTime) => {
|
|
14
15
|
}
|
15
16
|
|
16
17
|
type LogisticProps = {
|
18
|
+
aria?: object,
|
19
|
+
className?: String,
|
17
20
|
dark?: Boolean,
|
21
|
+
data?: object,
|
18
22
|
date: String,
|
23
|
+
id?: String,
|
19
24
|
link?: String,
|
20
|
-
projectName
|
21
|
-
projectNumber
|
25
|
+
projectName?: String,
|
26
|
+
projectNumber?: Number,
|
22
27
|
}
|
23
28
|
|
24
29
|
const Logistic = (props: LogisticProps) => {
|
25
|
-
const {
|
30
|
+
const { aria = {},
|
31
|
+
className,
|
32
|
+
dark = false,
|
33
|
+
data = {},
|
34
|
+
date,
|
35
|
+
id,
|
36
|
+
link,
|
37
|
+
projectName,
|
38
|
+
projectNumber } = props
|
39
|
+
|
40
|
+
const ariaProps = buildAriaProps(aria)
|
41
|
+
const dataProps = buildDataProps(data)
|
26
42
|
const formattedDate = new DateTime({ value: date })
|
43
|
+
const classes = classnames(buildCss('pb_logistic_kit', { dark: dark }), className, spacing(props))
|
27
44
|
|
28
45
|
return (
|
29
|
-
<div
|
46
|
+
<div
|
47
|
+
{...ariaProps}
|
48
|
+
{...dataProps}
|
49
|
+
className={classes}
|
50
|
+
id={id}
|
51
|
+
>
|
30
52
|
<Body color="light">
|
31
53
|
<Caption text="Project" />
|
32
54
|
<Icon
|
@@ -3,12 +3,17 @@
|
|
3
3
|
import React from 'react'
|
4
4
|
import { Avatar, Body, Caption } from '../'
|
5
5
|
import classnames from 'classnames'
|
6
|
+
import { buildAriaProps, buildCss, buildDataProps } from '../utilities/props'
|
6
7
|
import { spacing } from '../utilities/spacing.js'
|
7
8
|
|
8
9
|
type MessageProps = {
|
10
|
+
aria: object,
|
9
11
|
avatarName?: String,
|
10
12
|
avatarStatus?: String,
|
11
13
|
avatarUrl?: String,
|
14
|
+
className?: String,
|
15
|
+
data?: object,
|
16
|
+
id?: String,
|
12
17
|
label?: String,
|
13
18
|
message: String,
|
14
19
|
timestamp?: String,
|
@@ -16,20 +21,33 @@ type MessageProps = {
|
|
16
21
|
|
17
22
|
const Message = (props: MessageProps) => {
|
18
23
|
const {
|
19
|
-
|
20
|
-
|
21
|
-
label = '',
|
22
|
-
message = '',
|
23
|
-
timestamp = '',
|
24
|
+
aria = {},
|
25
|
+
avatarName,
|
24
26
|
avatarStatus = null,
|
27
|
+
avatarUrl,
|
28
|
+
className,
|
29
|
+
data = {},
|
30
|
+
id,
|
31
|
+
label,
|
32
|
+
message,
|
33
|
+
timestamp,
|
25
34
|
} = props
|
35
|
+
const ariaProps = buildAriaProps(aria)
|
36
|
+
const dataProps = buildDataProps(data)
|
26
37
|
const shouldDisplayAvatar = avatarUrl || avatarName
|
27
|
-
const
|
38
|
+
const baseClassName = shouldDisplayAvatar
|
28
39
|
? 'pb_message_kit_avatar'
|
29
40
|
: 'pb_message_kit'
|
30
41
|
|
42
|
+
const classes = classnames(buildCss(baseClassName), className, spacing(props))
|
43
|
+
|
31
44
|
return (
|
32
|
-
<div
|
45
|
+
<div
|
46
|
+
{...ariaProps}
|
47
|
+
{...dataProps}
|
48
|
+
className={classes}
|
49
|
+
id={id}
|
50
|
+
>
|
33
51
|
<If condition={shouldDisplayAvatar}>
|
34
52
|
<Avatar
|
35
53
|
imageUrl={avatarUrl}
|
@@ -4,7 +4,6 @@ import { Message } from '../../'
|
|
4
4
|
const MessageDefault = () => {
|
5
5
|
return (
|
6
6
|
<div>
|
7
|
-
|
8
7
|
<Message
|
9
8
|
avatarName="Mike Bishop"
|
10
9
|
avatarStatus="online"
|
@@ -31,7 +30,7 @@ const MessageDefault = () => {
|
|
31
30
|
<Message
|
32
31
|
avatarName="Lisa Thompson"
|
33
32
|
avatarUrl="https://randomuser.me/api/portraits/women/39.jpg"
|
34
|
-
message="To
|
33
|
+
message="To process your order, I will need your full name."
|
35
34
|
timestamp="4 hours ago"
|
36
35
|
/>
|
37
36
|
|
@@ -1,7 +1,14 @@
|
|
1
1
|
<%= content_tag(:div,
|
2
|
+
aria: object.aria,
|
2
3
|
id: object.id,
|
3
4
|
data: object.data,
|
4
5
|
class: object.classname) do %>
|
5
|
-
<%= pb_rails("body", props: {
|
6
|
-
|
6
|
+
<%= pb_rails("body", props: {
|
7
|
+
tag: "span",
|
8
|
+
classname: "pb_person_first",
|
9
|
+
children: -> { object.first_name
|
10
|
+
} }) %>
|
11
|
+
<%= pb_rails("title", props: {
|
12
|
+
text: object.last_name,
|
13
|
+
size: 4 }) if object.last_name %>
|
7
14
|
<% end %>
|
@@ -4,32 +4,56 @@ import React from 'react'
|
|
4
4
|
import classnames from 'classnames'
|
5
5
|
import { spacing } from '../utilities/spacing.js'
|
6
6
|
|
7
|
+
import {
|
8
|
+
buildAriaProps,
|
9
|
+
buildCss,
|
10
|
+
buildDataProps,
|
11
|
+
} from '../utilities/props'
|
12
|
+
|
7
13
|
import { Body, Title } from '../'
|
8
14
|
|
9
15
|
type PersonProps = {
|
16
|
+
aria?: object,
|
10
17
|
className?: String | Array<String>,
|
11
|
-
|
18
|
+
data?: object,
|
12
19
|
firstName: String,
|
20
|
+
id?: String,
|
13
21
|
lastName: String,
|
14
22
|
}
|
15
23
|
|
16
24
|
const Person = (props: PersonProps) => {
|
17
|
-
const {
|
25
|
+
const {
|
26
|
+
aria = {},
|
27
|
+
className,
|
28
|
+
data = {},
|
29
|
+
firstName,
|
30
|
+
id,
|
31
|
+
lastName } = props
|
32
|
+
|
33
|
+
const ariaProps = buildAriaProps(aria)
|
34
|
+
const dataProps = buildDataProps(data)
|
35
|
+
const classes = classnames(buildCss('pb_person_kit'), className, spacing(props))
|
36
|
+
|
18
37
|
return (
|
19
|
-
<div
|
38
|
+
<div
|
39
|
+
{...ariaProps}
|
40
|
+
{...dataProps}
|
41
|
+
className={classes}
|
42
|
+
id={id}
|
43
|
+
>
|
20
44
|
<Body
|
21
45
|
className="pb_person_first"
|
22
|
-
dark={dark}
|
23
46
|
tag="span"
|
24
47
|
>
|
25
48
|
{firstName}
|
26
49
|
</Body>
|
27
|
-
<
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
50
|
+
<If condition={lastName}>
|
51
|
+
<Title
|
52
|
+
className="pb_person_first"
|
53
|
+
size={4}
|
54
|
+
text={` ${lastName}`}
|
55
|
+
/>
|
56
|
+
</If>
|
33
57
|
</div>
|
34
58
|
)
|
35
59
|
}
|
@@ -2,9 +2,16 @@
|
|
2
2
|
|
3
3
|
import React from 'react'
|
4
4
|
import classnames from 'classnames'
|
5
|
+
|
6
|
+
import {
|
7
|
+
buildAriaProps,
|
8
|
+
buildCss,
|
9
|
+
buildDataProps,
|
10
|
+
} from '../utilities/props'
|
11
|
+
|
5
12
|
import { spacing } from '../utilities/spacing.js'
|
6
13
|
|
7
|
-
import { Contact, Person } from '../'
|
14
|
+
import { Caption, Contact, Person } from '../'
|
8
15
|
|
9
16
|
type ContactItem = {
|
10
17
|
contactType: String,
|
@@ -13,30 +20,75 @@ type ContactItem = {
|
|
13
20
|
}
|
14
21
|
|
15
22
|
type PersonContactProps = {
|
23
|
+
aria?: object,
|
16
24
|
className?: String | Array<String>,
|
17
25
|
dark?: Boolean,
|
26
|
+
data?: object,
|
18
27
|
firstName: String,
|
28
|
+
id?: String,
|
19
29
|
lastName: String,
|
20
30
|
contacts?: Array<ContactItem>,
|
21
31
|
}
|
22
32
|
|
23
33
|
const PersonContact = (props: PersonContactProps) => {
|
24
|
-
const {
|
34
|
+
const {
|
35
|
+
aria = {},
|
36
|
+
className,
|
37
|
+
contacts = [],
|
38
|
+
data = {},
|
39
|
+
firstName,
|
40
|
+
id,
|
41
|
+
lastName,
|
42
|
+
} = props
|
43
|
+
|
44
|
+
const ariaProps = buildAriaProps(aria)
|
45
|
+
const dataProps = buildDataProps(data)
|
46
|
+
const classes = classnames(buildCss('pb_person_contact_kit'), className, spacing(props))
|
47
|
+
|
48
|
+
const wrongContacts = () => (
|
49
|
+
contacts.filter((contactObject) => (
|
50
|
+
contactObject.contactType === 'wrong-phone'
|
51
|
+
))
|
52
|
+
)
|
53
|
+
|
54
|
+
const validContacts = () => (
|
55
|
+
contacts.filter((contactObject) => (
|
56
|
+
contactObject.contactType !== 'wrong-phone'
|
57
|
+
))
|
58
|
+
)
|
25
59
|
|
26
60
|
return (
|
27
|
-
<div
|
61
|
+
<div
|
62
|
+
{...ariaProps}
|
63
|
+
{...dataProps}
|
64
|
+
className={classes}
|
65
|
+
id={id}
|
66
|
+
>
|
28
67
|
<Person
|
29
68
|
firstName={firstName}
|
30
69
|
lastName={lastName}
|
31
70
|
/>
|
32
|
-
{
|
71
|
+
{validContacts().map((contactObject, index) => (
|
33
72
|
<Contact
|
34
73
|
contactDetail={contactObject.contactDetail}
|
35
74
|
contactType={contactObject.contactType}
|
36
75
|
contactValue={contactObject.contactValue}
|
37
76
|
key={index}
|
38
77
|
/>
|
39
|
-
|
78
|
+
))}
|
79
|
+
{wrongContacts().map((contactObject, index) => (
|
80
|
+
<>
|
81
|
+
<Caption
|
82
|
+
className="wrong_numbers"
|
83
|
+
text="wrong number"
|
84
|
+
/>
|
85
|
+
<Contact
|
86
|
+
contactType={contactObject.contactType}
|
87
|
+
contactValue={contactObject.contactValue}
|
88
|
+
key={index}
|
89
|
+
/>
|
90
|
+
</>
|
91
|
+
))}
|
40
92
|
</div>
|
41
93
|
)
|
42
94
|
}
|