playbook_ui 12.30.1 → 12.31.0.pre.alpha.PLAY814removemomentjs933
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 +2 -0
- data/app/pb_kits/playbook/pb_badge/_badge.scss +5 -0
- data/app/pb_kits/playbook/pb_badge/_badge.tsx +1 -1
- data/app/pb_kits/playbook/pb_badge/badge.rb +1 -1
- data/app/pb_kits/playbook/pb_badge/badge.test.js +13 -0
- data/app/pb_kits/playbook/pb_badge/docs/_badge_notification.html.erb +12 -0
- data/app/pb_kits/playbook/pb_badge/docs/_badge_notification.jsx +25 -0
- data/app/pb_kits/playbook/pb_badge/docs/example.yml +2 -1
- data/app/pb_kits/playbook/pb_badge/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_button/docs/_button_hover.jsx +40 -0
- data/app/pb_kits/playbook/pb_button/docs/example.yml +1 -0
- data/app/pb_kits/playbook/pb_button/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_date/_date.tsx +7 -8
- data/app/pb_kits/playbook/pb_date_range_inline/_date_range_inline.tsx +45 -31
- data/app/pb_kits/playbook/pb_date_range_stacked/_date_range_stacked.tsx +5 -3
- data/app/pb_kits/playbook/pb_date_stacked/_date_stacked.tsx +24 -21
- data/app/pb_kits/playbook/pb_date_time/_date_time.tsx +1 -1
- data/app/pb_kits/playbook/pb_date_time/dateTime.test.js +1 -1
- data/app/pb_kits/playbook/pb_date_time_stacked/_date_time_stacked.tsx +2 -2
- data/app/pb_kits/playbook/pb_date_time_stacked/date_time_stacked.test.js +1 -1
- data/app/pb_kits/playbook/pb_date_year_stacked/_date_year_stacked.tsx +6 -8
- data/app/pb_kits/playbook/pb_kit/dateTime.ts +139 -67
- data/app/pb_kits/playbook/pb_label_value/_label_value.tsx +52 -31
- data/app/pb_kits/playbook/pb_message/_message.tsx +25 -25
- data/app/pb_kits/playbook/pb_message/docs/_message_default.jsx +33 -45
- data/app/pb_kits/playbook/pb_message/docs/_message_hover.jsx +41 -0
- data/app/pb_kits/playbook/pb_message/docs/example.yml +1 -0
- data/app/pb_kits/playbook/pb_message/docs/index.js +2 -0
- data/app/pb_kits/playbook/pb_multi_level_select/_helper_functions.tsx +4 -1
- data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.tsx +8 -3
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids.html.erb +76 -0
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids.jsx +88 -0
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids.md +5 -0
- data/app/pb_kits/playbook/pb_multi_level_select/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_multi_level_select/docs/index.js +2 -1
- data/app/pb_kits/playbook/pb_multi_level_select/multi_level_select.rb +3 -0
- data/app/pb_kits/playbook/pb_section_separator/_section_separator.scss +7 -0
- data/app/pb_kits/playbook/pb_section_separator/_section_separator.tsx +12 -7
- data/app/pb_kits/playbook/pb_section_separator/docs/_section_separator_children.html.erb +14 -0
- data/app/pb_kits/playbook/pb_section_separator/docs/_section_separator_children.jsx +30 -0
- data/app/pb_kits/playbook/pb_section_separator/docs/_section_separator_children.md +3 -0
- data/app/pb_kits/playbook/pb_section_separator/docs/_section_separator_dashed.html.erb +1 -0
- data/app/pb_kits/playbook/pb_section_separator/docs/_section_separator_dashed.jsx +13 -0
- data/app/pb_kits/playbook/pb_section_separator/docs/_section_separator_text.html.erb +1 -1
- data/app/pb_kits/playbook/pb_section_separator/docs/_section_separator_text.jsx +1 -1
- data/app/pb_kits/playbook/pb_section_separator/docs/example.yml +6 -3
- data/app/pb_kits/playbook/pb_section_separator/docs/index.js +2 -0
- data/app/pb_kits/playbook/pb_section_separator/section_separator.html.erb +4 -2
- data/app/pb_kits/playbook/pb_section_separator/section_separator.rb +4 -1
- data/app/pb_kits/playbook/pb_time/_time.tsx +9 -11
- data/app/pb_kits/playbook/pb_time_range_inline/_time_range_inline.tsx +46 -49
- data/app/pb_kits/playbook/pb_time_stacked/_time_stacked.tsx +4 -6
- data/app/pb_kits/playbook/pb_timestamp/_timestamp.tsx +13 -12
- data/app/pb_kits/playbook/pb_title/_title.scss +18 -0
- data/app/pb_kits/playbook/pb_title/_title.tsx +20 -2
- data/app/pb_kits/playbook/pb_title/docs/_title_responsive.html.erb +1 -0
- data/app/pb_kits/playbook/pb_title/docs/_title_responsive.jsx +16 -0
- data/app/pb_kits/playbook/pb_title/docs/_title_responsive.md +1 -0
- data/app/pb_kits/playbook/pb_title/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_title/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_title/title.rb +21 -4
- data/app/pb_kits/playbook/pb_title/title.test.js +42 -29
- data/app/pb_kits/playbook/pb_weekday_stacked/_weekday_stacked.tsx +8 -11
- data/app/pb_kits/playbook/tokens/_scale.scss +9 -0
- data/app/pb_kits/playbook/tokens/exports/_scale.scss +13 -0
- data/app/pb_kits/playbook/utilities/_border_radius.scss +31 -0
- data/app/pb_kits/playbook/utilities/_colors.scss +3 -0
- data/app/pb_kits/playbook/utilities/_hover.scss +47 -0
- data/app/pb_kits/playbook/utilities/globalProps.ts +22 -2
- data/dist/playbook-rails.js +7 -7
- data/lib/playbook/version.rb +2 -2
- metadata +26 -8
- data/app/pb_kits/playbook/pb_logistic/_logistic.jsx +0 -120
@@ -1,9 +1,9 @@
|
|
1
1
|
import React from 'react'
|
2
2
|
import classnames from 'classnames'
|
3
3
|
|
4
|
-
import DateTime from '../pb_kit/dateTime'
|
5
4
|
import { globalProps, GlobalProps } from '../utilities/globalProps'
|
6
5
|
import { buildAriaProps, buildDataProps } from '../utilities/props'
|
6
|
+
import DateTime from '../pb_kit/dateTime';
|
7
7
|
|
8
8
|
import Body from '../pb_body/_body'
|
9
9
|
import Caption from '../pb_caption/_caption'
|
@@ -19,23 +19,20 @@ type TimeRangeInlineProps = {
|
|
19
19
|
dark?: boolean,
|
20
20
|
icon?: boolean,
|
21
21
|
timezone?: boolean,
|
22
|
-
startTime:
|
23
|
-
endTime:
|
22
|
+
startTime: Date,
|
23
|
+
endTime: Date,
|
24
24
|
} & GlobalProps
|
25
25
|
|
26
|
-
const timezoneString = (dateValue:
|
27
|
-
|
28
|
-
return `${date.convertToTimezone()}`
|
26
|
+
const timezoneString = (dateValue: Date) => {
|
27
|
+
return `${DateTime.toTimeZone(dateValue)}`
|
29
28
|
}
|
30
29
|
|
31
|
-
const dateTimestamp = (dateValue:
|
32
|
-
|
33
|
-
return `${date.toHour()}:${date.toMinute()}${date.toMeridian()}`
|
30
|
+
const dateTimestamp = (dateValue: Date) => {
|
31
|
+
return `${DateTime.toHour(dateValue)}:${DateTime.toMinute(dateValue)}${DateTime.toMeridiem(dateValue)}`
|
34
32
|
}
|
35
33
|
|
36
|
-
const dateTimeIso = (dateValue:
|
37
|
-
|
38
|
-
return date.toIso()
|
34
|
+
const dateTimeIso = (dateValue: Date) => {
|
35
|
+
return DateTime.toIso(dateValue)
|
39
36
|
}
|
40
37
|
|
41
38
|
const TimeRangeInline = (props: TimeRangeInlineProps) => {
|
@@ -59,10 +56,10 @@ const TimeRangeInline = (props: TimeRangeInlineProps) => {
|
|
59
56
|
const separator = (
|
60
57
|
<Body color="light">
|
61
58
|
<Icon
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
59
|
+
className="pb_time_range_inline_arrow"
|
60
|
+
dark={dark}
|
61
|
+
fixedWidth
|
62
|
+
icon="long-arrow-right"
|
66
63
|
/>
|
67
64
|
</Body>
|
68
65
|
)
|
@@ -71,16 +68,16 @@ const TimeRangeInline = (props: TimeRangeInlineProps) => {
|
|
71
68
|
return (
|
72
69
|
icon &&
|
73
70
|
<Body
|
74
|
-
|
75
|
-
|
71
|
+
color="light"
|
72
|
+
tag="span"
|
76
73
|
>
|
77
74
|
<Icon
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
75
|
+
className="pb_time_range_inline_icon"
|
76
|
+
dark={dark}
|
77
|
+
fixedWidth
|
78
|
+
icon="clock"
|
79
|
+
size={size}
|
80
|
+
tag="span"
|
84
81
|
/>
|
85
82
|
</Body>
|
86
83
|
)
|
@@ -88,17 +85,17 @@ const TimeRangeInline = (props: TimeRangeInlineProps) => {
|
|
88
85
|
|
89
86
|
return (
|
90
87
|
<div
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
88
|
+
{...ariaProps}
|
89
|
+
{...dataProps}
|
90
|
+
className={classnames('pb_time_range_inline_kit_' + alignment, globalProps(props), className)}
|
91
|
+
id={id}
|
95
92
|
>
|
96
93
|
<div className="pb_time_range_inline_wrapper">
|
97
94
|
{size == 'xs' &&
|
98
95
|
<>
|
99
96
|
<Caption
|
100
|
-
|
101
|
-
|
97
|
+
dark={dark}
|
98
|
+
tag="span"
|
102
99
|
>
|
103
100
|
{iconContent()}
|
104
101
|
<time dateTime={dateTimeIso(startTime)}>
|
@@ -108,15 +105,15 @@ const TimeRangeInline = (props: TimeRangeInlineProps) => {
|
|
108
105
|
</time>
|
109
106
|
</Caption>
|
110
107
|
<Caption
|
111
|
-
|
112
|
-
|
113
|
-
|
108
|
+
className="pb_time_range_inline_arrow"
|
109
|
+
dark={dark}
|
110
|
+
tag="span"
|
114
111
|
>
|
115
112
|
{separator}
|
116
113
|
</Caption>
|
117
114
|
<Caption
|
118
|
-
|
119
|
-
|
115
|
+
dark={dark}
|
116
|
+
tag="span"
|
120
117
|
>
|
121
118
|
<time dateTime={dateTimeIso(endTime)}>
|
122
119
|
{` ${dateTimestamp(
|
@@ -126,9 +123,9 @@ const TimeRangeInline = (props: TimeRangeInlineProps) => {
|
|
126
123
|
</Caption>
|
127
124
|
{timezone &&
|
128
125
|
<Caption
|
129
|
-
|
130
|
-
|
131
|
-
|
126
|
+
className="pb_time_range_inline_timezone"
|
127
|
+
dark={dark}
|
128
|
+
tag="span"
|
132
129
|
>
|
133
130
|
{timezoneString(endTime)}
|
134
131
|
</Caption>
|
@@ -138,8 +135,8 @@ const TimeRangeInline = (props: TimeRangeInlineProps) => {
|
|
138
135
|
{size == 'sm' &&
|
139
136
|
<>
|
140
137
|
<Body
|
141
|
-
|
142
|
-
|
138
|
+
dark={dark}
|
139
|
+
tag="span"
|
143
140
|
>
|
144
141
|
{iconContent()}
|
145
142
|
<time dateTime={dateTimeIso(startTime)}>
|
@@ -149,15 +146,15 @@ const TimeRangeInline = (props: TimeRangeInlineProps) => {
|
|
149
146
|
</time>
|
150
147
|
</Body>
|
151
148
|
<Body
|
152
|
-
|
153
|
-
|
154
|
-
|
149
|
+
className="pb_time_range_inline_arrow"
|
150
|
+
dark={dark}
|
151
|
+
tag="span"
|
155
152
|
>
|
156
153
|
{separator}
|
157
154
|
</Body>
|
158
155
|
<Body
|
159
|
-
|
160
|
-
|
156
|
+
dark={dark}
|
157
|
+
tag="span"
|
161
158
|
>
|
162
159
|
<time dateTime={dateTimeIso(endTime)}>
|
163
160
|
{` ${dateTimestamp(
|
@@ -167,10 +164,10 @@ const TimeRangeInline = (props: TimeRangeInlineProps) => {
|
|
167
164
|
</Body>
|
168
165
|
{timezone &&
|
169
166
|
<Body
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
167
|
+
className="pb_time_range_inline_timezone"
|
168
|
+
color="light"
|
169
|
+
dark={dark}
|
170
|
+
tag="span"
|
174
171
|
>
|
175
172
|
{timezoneString(endTime)}
|
176
173
|
</Body>
|
@@ -1,9 +1,9 @@
|
|
1
1
|
import React from 'react'
|
2
2
|
import classnames from 'classnames'
|
3
3
|
|
4
|
-
import DateTime from '../pb_kit/dateTime'
|
5
4
|
import { buildCss, buildDataProps } from '../utilities/props'
|
6
5
|
import { deprecatedProps, globalProps } from '../utilities/globalProps'
|
6
|
+
import DateTime from '../pb_kit/dateTime';
|
7
7
|
|
8
8
|
import Body from '../pb_body/_body'
|
9
9
|
import Caption from '../pb_caption/_caption'
|
@@ -13,7 +13,7 @@ type TimeStackedProps = {
|
|
13
13
|
className?: string | string[],
|
14
14
|
dark?: boolean,
|
15
15
|
data?: { [key: string]: string },
|
16
|
-
date?:
|
16
|
+
date?: Date,
|
17
17
|
id?: string,
|
18
18
|
time?: number | Date,
|
19
19
|
timeZone?: string,
|
@@ -39,8 +39,6 @@ const TimeStackedDefault = (props: TimeStackedProps): React.ReactElement => {
|
|
39
39
|
)
|
40
40
|
const dataProps = buildDataProps(data)
|
41
41
|
|
42
|
-
const dateTimestamp = new DateTime({ value: date ? date : new Date(time), zone: timeZone })
|
43
|
-
|
44
42
|
return (
|
45
43
|
<div
|
46
44
|
className={classes}
|
@@ -52,13 +50,13 @@ const TimeStackedDefault = (props: TimeStackedProps): React.ReactElement => {
|
|
52
50
|
dark={dark}
|
53
51
|
>
|
54
52
|
<time>
|
55
|
-
{
|
53
|
+
{DateTime.toTimeWithMeridiem(date ? date : new Date(time), timeZone)}
|
56
54
|
<Caption
|
57
55
|
className="pb_time_stacked"
|
58
56
|
color="light"
|
59
57
|
dark={dark}
|
60
58
|
tag="span"
|
61
|
-
text={
|
59
|
+
text={DateTime.toTimeZone(date ? date : new Date(time), timeZone)}
|
62
60
|
/>
|
63
61
|
</time>
|
64
62
|
</Body>
|
@@ -1,9 +1,10 @@
|
|
1
1
|
import React from 'react'
|
2
2
|
import classnames from 'classnames'
|
3
3
|
|
4
|
-
import DateTime from '../pb_kit/dateTime'
|
5
4
|
import { buildAriaProps, buildCss, buildDataProps } from '../utilities/props'
|
6
5
|
import { globalProps } from '../utilities/globalProps'
|
6
|
+
import DateTime from '../pb_kit/dateTime';
|
7
|
+
|
7
8
|
|
8
9
|
import Caption from '../pb_caption/_caption'
|
9
10
|
|
@@ -14,7 +15,7 @@ type TimestampProps = {
|
|
14
15
|
dark?: boolean,
|
15
16
|
data?: string,
|
16
17
|
text: string,
|
17
|
-
timestamp: string,
|
18
|
+
timestamp: Date | string,
|
18
19
|
timezone: string,
|
19
20
|
id?: string,
|
20
21
|
showDate?: boolean,
|
@@ -32,8 +33,8 @@ const Timestamp = (props: TimestampProps): React.ReactElement => {
|
|
32
33
|
dark = false,
|
33
34
|
data = {},
|
34
35
|
text,
|
35
|
-
timestamp,
|
36
36
|
timezone,
|
37
|
+
timestamp,
|
37
38
|
showDate = true,
|
38
39
|
showUser = false,
|
39
40
|
hideUpdated = false,
|
@@ -52,27 +53,27 @@ const Timestamp = (props: TimestampProps): React.ReactElement => {
|
|
52
53
|
className
|
53
54
|
)
|
54
55
|
|
56
|
+
const timeStamp = new Date(timestamp)
|
55
57
|
const currentYear = new Date().getFullYear().toString()
|
56
|
-
const
|
57
|
-
const dateDisplay = `${dateTimestamp.toMonth()} ${dateTimestamp.toDay()}`
|
58
|
+
const dateDisplay = `${DateTime.toMonth(timeStamp, timezone)} ${DateTime.toDay(timeStamp, timezone)}`
|
58
59
|
const shouldShowUser = showUser == true && text.length > 0
|
59
60
|
const shouldShowTimezone = showTimezone == true && timezone.length > 0
|
60
61
|
const updatedText = hideUpdated ? "" : "Last updated"
|
61
62
|
const userDisplay = shouldShowUser ? ` by ${text}` : ''
|
62
63
|
|
63
|
-
let timeDisplay = `${
|
64
|
+
let timeDisplay = `${DateTime.toHour(timeStamp, timezone)}:${DateTime.toMinute(timeStamp, timezone)}${DateTime.toMeridiem(timeStamp, timezone)}`
|
64
65
|
|
65
66
|
const fullTimeDisplay = () => {
|
66
67
|
if (shouldShowTimezone) {
|
67
|
-
timeDisplay = `${timeDisplay} ${
|
68
|
+
timeDisplay = `${timeDisplay} ${DateTime.toTimeZone(timeStamp, timezone)}`
|
68
69
|
}
|
69
70
|
return timeDisplay
|
70
71
|
}
|
71
72
|
|
72
73
|
const fullDateDisplay = () => {
|
73
|
-
let fullDisplay = `${
|
74
|
-
if (
|
75
|
-
fullDisplay = `${fullDisplay}, ${
|
74
|
+
let fullDisplay = `${DateTime.toMonth(timeStamp, timezone)} ${DateTime.toDay(timeStamp, timezone)}`
|
75
|
+
if (DateTime.toYear(timeStamp, timezone).toString() !== currentYear) {
|
76
|
+
fullDisplay = `${fullDisplay}, ${DateTime.toYear(timeStamp, timezone)}`
|
76
77
|
}
|
77
78
|
return `${fullDisplay} ${' \u00b7 '} ${fullTimeDisplay()}`
|
78
79
|
}
|
@@ -82,7 +83,7 @@ const Timestamp = (props: TimestampProps): React.ReactElement => {
|
|
82
83
|
}
|
83
84
|
|
84
85
|
const formatElapsedString = () => {
|
85
|
-
return `${updatedText} ${userDisplay} ${
|
86
|
+
return `${updatedText} ${userDisplay} ${DateTime.fromNow(timeStamp)}`
|
86
87
|
}
|
87
88
|
|
88
89
|
const captionText = () => {
|
@@ -92,7 +93,7 @@ const Timestamp = (props: TimestampProps): React.ReactElement => {
|
|
92
93
|
case 'elapsed':
|
93
94
|
return formatElapsedString()
|
94
95
|
default:
|
95
|
-
return showDate ?
|
96
|
+
return showDate ? timeStamp ? fullDateDisplay() : text : fullTimeDisplay()
|
96
97
|
}
|
97
98
|
}
|
98
99
|
|
@@ -1,5 +1,6 @@
|
|
1
1
|
@import "../tokens/titles";
|
2
2
|
@import "../tokens/colors";
|
3
|
+
@import "../tokens/screen_sizes";
|
3
4
|
@import './title_mixin';
|
4
5
|
|
5
6
|
[class^=pb_title_kit]{
|
@@ -33,4 +34,21 @@
|
|
33
34
|
&[class*=_thin] {
|
34
35
|
@include pb_title_thin;
|
35
36
|
}
|
37
|
+
|
38
|
+
@each $size, $size_value in $breakpoints_grid {
|
39
|
+
@each $title_size_value in [1, 2, 3, 4] {
|
40
|
+
$min_size: map-get($size_value, "min");
|
41
|
+
$max_size: map-get($size_value, "max");
|
42
|
+
&[class*=_#{$size}_#{$title_size_value}] {
|
43
|
+
@include break_on($min_size, $max_size) {
|
44
|
+
@if $title_size_value == 1 { @include pb_title_1; }
|
45
|
+
@else if $title_size_value == 2 { @include pb_title_2; }
|
46
|
+
@else if $title_size_value == 3 { @include pb_title_3; }
|
47
|
+
@else if $title_size_value == 4 { @include pb_title_4; }
|
48
|
+
@include title_colors;
|
49
|
+
@if $title_size_value != 4 { @include pb_title_bold; }
|
50
|
+
}
|
51
|
+
}
|
52
|
+
}
|
53
|
+
}
|
36
54
|
}
|
@@ -3,6 +3,9 @@ import classnames from 'classnames'
|
|
3
3
|
import { buildAriaProps, buildCss, buildDataProps } from '../utilities/props'
|
4
4
|
import { deprecatedProps, GlobalProps, globalProps } from '../utilities/globalProps'
|
5
5
|
|
6
|
+
type SizeType = 1 | 2 | 3 | 4 | "1" | "2" | "3" | "4"
|
7
|
+
type SizeResponsiveType = {[key: string]: SizeType}
|
8
|
+
|
6
9
|
type TitleProps = {
|
7
10
|
aria?: {[key: string]: string},
|
8
11
|
bold?: boolean,
|
@@ -11,7 +14,7 @@ type TitleProps = {
|
|
11
14
|
color?: "default" | "light" | "lighter" | "success" | "error" | "link",
|
12
15
|
data?: {[key: string]: string},
|
13
16
|
id?: string,
|
14
|
-
size?:
|
17
|
+
size?: SizeType | SizeResponsiveType,
|
15
18
|
tag?: "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "div" | "span",
|
16
19
|
text?: string,
|
17
20
|
variant?: null | "link",
|
@@ -36,9 +39,24 @@ const Title = (props: TitleProps): React.ReactElement => {
|
|
36
39
|
const ariaProps: {[key: string]: string | number} = buildAriaProps(aria)
|
37
40
|
const dataProps: {[key: string]: string | number} = buildDataProps(data)
|
38
41
|
const getBold = bold ? '' : 'thin'
|
42
|
+
const isSizeNumberOrString = typeof size === "number" || typeof size === "string"
|
43
|
+
|
44
|
+
const buildResponsiveSizeCss = () => {
|
45
|
+
let css = ''
|
46
|
+
|
47
|
+
if (!isSizeNumberOrString) {
|
48
|
+
Object.entries(size).forEach((sizeObj) => {
|
49
|
+
css += `pb_title_kit_${sizeObj[0]}_${sizeObj[1]} `
|
50
|
+
})
|
51
|
+
}
|
52
|
+
|
53
|
+
return css.trim()
|
54
|
+
}
|
55
|
+
|
39
56
|
const classes = classnames(
|
40
|
-
buildCss('pb_title_kit', `size_${size}
|
57
|
+
buildCss('pb_title_kit', isSizeNumberOrString ? `size_${size}` : "", variant, color, getBold),
|
41
58
|
globalProps(props),
|
59
|
+
buildResponsiveSizeCss(),
|
42
60
|
className
|
43
61
|
)
|
44
62
|
const Tag: React.ReactElement | any = `${tag}`
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= pb_rails("title", props: { text: "Responsive Title", tag: "h1", size: {xs: 3, sm: 2, md: 1} }) %>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
import React from 'react'
|
2
|
+
import Title from '../_title'
|
3
|
+
|
4
|
+
const TitleResponsive = (props) => {
|
5
|
+
return (
|
6
|
+
<>
|
7
|
+
<Title
|
8
|
+
size={{xs: "3", sm: "2", md: "1"}}
|
9
|
+
text="Responsive Title"
|
10
|
+
{...props}
|
11
|
+
/>
|
12
|
+
</>
|
13
|
+
)
|
14
|
+
}
|
15
|
+
|
16
|
+
export default TitleResponsive
|
@@ -0,0 +1 @@
|
|
1
|
+
The `size` prop supports responsive sizes. To use them, pass an object to the size prop containing your size values relative to responsive break points (show code below). To test this here, resize your browser window to responsively change this Title's size.
|
@@ -3,8 +3,10 @@ examples:
|
|
3
3
|
- title_default: Default UI
|
4
4
|
- title_light_weight: Light Weight UI
|
5
5
|
- title_colors: Colors
|
6
|
+
- title_responsive: Responsive
|
6
7
|
|
7
8
|
react:
|
8
9
|
- title_default: Default UI
|
9
10
|
- title_light_weight: Light Weight UI
|
10
11
|
- title_colors: Colors
|
12
|
+
- title_responsive: Responsive
|
@@ -6,9 +6,7 @@ module Playbook
|
|
6
6
|
prop :color, type: Playbook::Props::Enum,
|
7
7
|
values: [nil, "default", "light", "lighter", "success", "error", "link"],
|
8
8
|
default: nil
|
9
|
-
prop :size,
|
10
|
-
values: [1, 2, 3, 4],
|
11
|
-
default: 3
|
9
|
+
prop :size, default: 3
|
12
10
|
prop :tag, type: Playbook::Props::Enum,
|
13
11
|
values: %w[h1 h2 h3 h4 h5 h6 p div span],
|
14
12
|
default: "h3"
|
@@ -20,12 +18,31 @@ module Playbook
|
|
20
18
|
prop :bold, type: Playbook::Props::Boolean, default: true
|
21
19
|
|
22
20
|
def classname
|
23
|
-
|
21
|
+
if is_size_responsive
|
22
|
+
generate_classname("pb_title_kit", variant, color, is_bold) + generate_responsive_size_classname
|
23
|
+
else
|
24
|
+
generate_classname("pb_title_kit", size, variant, color, is_bold)
|
25
|
+
end
|
24
26
|
end
|
25
27
|
|
26
28
|
def is_bold
|
27
29
|
bold ? nil : "thin"
|
28
30
|
end
|
31
|
+
|
32
|
+
def is_size_responsive
|
33
|
+
try(:size).is_a?(::Hash)
|
34
|
+
end
|
35
|
+
|
36
|
+
def generate_responsive_size_classname
|
37
|
+
css = ""
|
38
|
+
if is_size_responsive
|
39
|
+
size.each do |key, value|
|
40
|
+
css += " pb_title_kit_#{key}_#{value}"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
css unless css.blank?
|
45
|
+
end
|
29
46
|
end
|
30
47
|
end
|
31
48
|
end
|
@@ -4,39 +4,52 @@ import { render, screen } from '../utilities/test-utils'
|
|
4
4
|
import Title from './_title'
|
5
5
|
|
6
6
|
test('returns namespaced class name', () => {
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
7
|
+
render(
|
8
|
+
<Title
|
9
|
+
data={{ testid: 'primary-test' }}
|
10
|
+
text="Test colors"
|
11
|
+
/>
|
12
|
+
)
|
13
|
+
|
14
|
+
const kit = screen.getByTestId('primary-test')
|
15
|
+
expect(kit).toHaveClass('pb_title_kit_size_3')
|
16
16
|
})
|
17
17
|
|
18
18
|
test('with thin font weight', () => {
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
19
|
+
render(
|
20
|
+
<Title
|
21
|
+
bold={false}
|
22
|
+
data={{ testid: 'primary-test' }}
|
23
|
+
text="Test thin font weight"
|
24
|
+
/>
|
25
|
+
)
|
26
|
+
|
27
|
+
const kit = screen.getByTestId('primary-test')
|
28
|
+
expect(kit).toHaveClass('pb_title_kit_size_3_thin')
|
29
29
|
})
|
30
30
|
|
31
31
|
test('with colors', () => {
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
32
|
+
render(
|
33
|
+
<Title
|
34
|
+
color="success"
|
35
|
+
data={{ testid: 'primary-test' }}
|
36
|
+
text="Test colors"
|
37
|
+
/>
|
38
|
+
)
|
39
|
+
|
40
|
+
const kit = screen.getByTestId('primary-test')
|
41
|
+
expect(kit).toHaveClass('pb_title_kit_size_3_success')
|
42
|
+
})
|
43
|
+
|
44
|
+
test('with responsive title', () => {
|
45
|
+
render(
|
46
|
+
<Title
|
47
|
+
data={{ testid: 'primary-test' }}
|
48
|
+
size={{ xs: "3", sm: "2", md: "1" }}
|
49
|
+
text="Responsive Title"
|
50
|
+
/>
|
51
|
+
)
|
52
|
+
|
53
|
+
const kit = screen.getByTestId('primary-test')
|
54
|
+
expect(kit).toHaveClass('pb_title_kit pb_title_kit_xs_3 pb_title_kit_sm_2 pb_title_kit_md_1')
|
42
55
|
})
|
@@ -7,8 +7,7 @@ import { buildAriaProps, buildCss, buildDataProps } from '../utilities/props'
|
|
7
7
|
|
8
8
|
import Caption from '../pb_caption/_caption'
|
9
9
|
import Title from '../pb_title/_title'
|
10
|
-
|
11
|
-
import DateTime from '../pb_kit/dateTime'
|
10
|
+
import DateTime from '../pb_kit/dateTime';
|
12
11
|
|
13
12
|
type WeekdayStackedProps = {
|
14
13
|
align?: "left" | "center" | "right",
|
@@ -22,22 +21,20 @@ type WeekdayStackedProps = {
|
|
22
21
|
compact?: boolean,
|
23
22
|
}
|
24
23
|
|
25
|
-
const getDayOfWeek = (value: Date
|
26
|
-
const dateTime = new DateTime({ value })
|
24
|
+
const getDayOfWeek = (value: Date, compact: boolean) => {
|
27
25
|
if (compact) {
|
28
|
-
return
|
26
|
+
return DateTime.toDayAbbr(value)
|
29
27
|
} else {
|
30
|
-
return
|
28
|
+
return DateTime.toWeekday(value)
|
31
29
|
}
|
32
30
|
}
|
33
31
|
|
34
|
-
const getFormattedDate = (value: Date
|
35
|
-
const dateTime = new DateTime({ value })
|
32
|
+
const getFormattedDate = (value: Date, variant: "day_only" | "month_day" | "expanded") => {
|
36
33
|
if (variant === 'day_only') {
|
37
|
-
return
|
34
|
+
return DateTime.toDay(value).toString()
|
38
35
|
} else {
|
39
|
-
const format = variant === 'expanded' ? '
|
40
|
-
return
|
36
|
+
const format = variant === 'expanded' ? 'expanded' : 'month_day'
|
37
|
+
return DateTime.toCustomFormat(value, format)
|
41
38
|
}
|
42
39
|
}
|
43
40
|
|
@@ -0,0 +1,31 @@
|
|
1
|
+
@import "../tokens/exports/border_radius";
|
2
|
+
|
3
|
+
$transition-speed: 0.2s;
|
4
|
+
|
5
|
+
.border_radius {
|
6
|
+
@mixin border-example {
|
7
|
+
transition: background-color $transition-speed ease, height $transition-speed ease;
|
8
|
+
}
|
9
|
+
|
10
|
+
&_rounded {
|
11
|
+
border-radius: $border_radius_rounded;
|
12
|
+
}
|
13
|
+
&_xl {
|
14
|
+
border-radius: $border_radius_xl;
|
15
|
+
}
|
16
|
+
&_lg {
|
17
|
+
border-radius: $border_radius_lg;
|
18
|
+
}
|
19
|
+
&_md {
|
20
|
+
border-radius: $border_radius_md;
|
21
|
+
}
|
22
|
+
&_sm {
|
23
|
+
border-radius: $border_radius_sm;
|
24
|
+
}
|
25
|
+
&_xs {
|
26
|
+
border-radius: $border_radius_xs;
|
27
|
+
}
|
28
|
+
&_none {
|
29
|
+
border-radius: $border_radius_none;
|
30
|
+
}
|
31
|
+
}
|
@@ -1,5 +1,7 @@
|
|
1
1
|
// Color Helper Utilities
|
2
2
|
|
3
|
+
$transition-speed: 0.2s;
|
4
|
+
|
3
5
|
@function shade($color, $percentage) {
|
4
6
|
@return mix($charcoal, $color, $percentage);
|
5
7
|
}
|
@@ -27,6 +29,7 @@
|
|
27
29
|
}
|
28
30
|
}
|
29
31
|
|
32
|
+
|
30
33
|
@mixin text-color($colors-list) {
|
31
34
|
@each $name, $color in $colors-list {
|
32
35
|
.#{$name} {
|