playbook_ui 12.30.1.pre.alpha.play846responsivespacingglobalpropsneedsdefault924 → 12.31.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 +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_card/_card.scss +0 -3
- data/app/pb_kits/playbook/pb_card/_card.tsx +6 -5
- data/app/pb_kits/playbook/pb_card/card.html.erb +3 -1
- data/app/pb_kits/playbook/pb_card/card.rb +96 -0
- data/app/pb_kits/playbook/pb_card/card_body.rb +1 -93
- data/app/pb_kits/playbook/pb_collapsible/_collapsible.scss +0 -11
- data/app/pb_kits/playbook/pb_collapsible/_collapsible.tsx +3 -1
- data/app/pb_kits/playbook/pb_collapsible/child_kits/CollapsibleContent.tsx +3 -1
- data/app/pb_kits/playbook/pb_collapsible/child_kits/CollapsibleMain.tsx +3 -1
- data/app/pb_kits/playbook/pb_collapsible/docs/_collapsible_default.jsx +1 -1
- data/app/pb_kits/playbook/pb_dialog/_dialog.scss +0 -12
- data/app/pb_kits/playbook/pb_dialog/child_kits/_dialog_body.tsx +2 -2
- data/app/pb_kits/playbook/pb_dialog/child_kits/_dialog_footer.tsx +4 -1
- data/app/pb_kits/playbook/pb_dialog/child_kits/_dialog_header.tsx +2 -1
- 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_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/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 +6 -6
- data/lib/playbook/version.rb +1 -1
- metadata +25 -6
@@ -12,9 +12,12 @@ module Playbook
|
|
12
12
|
default: "horizontal"
|
13
13
|
prop :dark, type: Playbook::Props::Boolean,
|
14
14
|
default: false
|
15
|
+
prop :line_style, type: Playbook::Props::Enum,
|
16
|
+
values: %w[dashed solid],
|
17
|
+
default: "solid"
|
15
18
|
|
16
19
|
def classname
|
17
|
-
generate_classname("pb_section_separator_kit", variant, orientation)
|
20
|
+
generate_classname("pb_section_separator_kit", variant, orientation, line_style == "dashed" ? "dashed" : nil)
|
18
21
|
end
|
19
22
|
|
20
23
|
private
|
@@ -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
|
})
|
@@ -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} {
|
@@ -0,0 +1,47 @@
|
|
1
|
+
@import "../tokens/exports/scale";
|
2
|
+
|
3
|
+
@mixin hover-color-classes($colors-list) {
|
4
|
+
@each $name, $color in $colors-list {
|
5
|
+
.bg-hover-#{$name}:hover {
|
6
|
+
background-color: $color !important;
|
7
|
+
transition: background-color $transition-speed ease;
|
8
|
+
}
|
9
|
+
}
|
10
|
+
}
|
11
|
+
|
12
|
+
@mixin hover-shadow-classes($shadows-list) {
|
13
|
+
@each $name, $shadow in $shadows-list {
|
14
|
+
.hover_#{$name}:hover {
|
15
|
+
box-shadow: $shadow;
|
16
|
+
transition: box-shadow $transition-speed ease;
|
17
|
+
}
|
18
|
+
}
|
19
|
+
}
|
20
|
+
|
21
|
+
@mixin hover-scale-classes($scales-list) {
|
22
|
+
@each $name, $scale in $scales-list {
|
23
|
+
.hover_#{$name}:hover {
|
24
|
+
transform: $scale;
|
25
|
+
transition: transform $transition-speed ease;
|
26
|
+
}
|
27
|
+
}
|
28
|
+
}
|
29
|
+
|
30
|
+
|
31
|
+
@include hover-scale-classes($scales);
|
32
|
+
@include hover-shadow-classes($box_shadows);
|
33
|
+
@include hover-color-classes($product_colors);
|
34
|
+
@include hover-color-classes($status_colors);
|
35
|
+
@include hover-color-classes($data_colors);
|
36
|
+
@include hover-color-classes($shadow_colors);
|
37
|
+
@include hover-color-classes($colors);
|
38
|
+
@include hover-color-classes($interface_colors);
|
39
|
+
@include hover-color-classes($main_colors);
|
40
|
+
@include hover-color-classes($background_colors);
|
41
|
+
@include hover-color-classes($card_colors);
|
42
|
+
@include hover-color-classes($active_colors);
|
43
|
+
@include hover-color-classes($action_colors);
|
44
|
+
@include hover-color-classes($hover_colors);
|
45
|
+
@include hover-color-classes($border_colors);
|
46
|
+
@include hover-color-classes($text_colors);
|
47
|
+
@include hover-color-classes($category_colors);
|
@@ -60,6 +60,11 @@ type FlexWrap = {
|
|
60
60
|
flexWrap?: "wrap" | "nowrap" | "wrapReverse"
|
61
61
|
}
|
62
62
|
|
63
|
+
type Hover = Shadow & {
|
64
|
+
background?: string,
|
65
|
+
scale?: "sm" | "md" | "lg"
|
66
|
+
}
|
67
|
+
|
63
68
|
type JustifyContent = {
|
64
69
|
justifyContent?: Alignment & Space
|
65
70
|
}
|
@@ -125,7 +130,7 @@ export type GlobalProps = AlignContent & AlignItems & AlignSelf &
|
|
125
130
|
BorderRadius & Cursor & Dark & Display & DisplaySizes & Flex & FlexDirection &
|
126
131
|
FlexGrow & FlexShrink & FlexWrap & JustifyContent & JustifySelf &
|
127
132
|
LineHeight & Margin & MaxWidth & NumberSpacing & Order & Padding &
|
128
|
-
Position & Shadow & ZIndex
|
133
|
+
Position & Shadow & ZIndex & { hover?: string };
|
129
134
|
|
130
135
|
const getResponsivePropClasses = (prop: {[key: string]: string}, classPrefix: string) => {
|
131
136
|
const keys: string[] = Object.keys(prop)
|
@@ -137,6 +142,16 @@ const getResponsivePropClasses = (prop: {[key: string]: string}, classPrefix: st
|
|
137
142
|
|
138
143
|
// Prop categories
|
139
144
|
const PROP_CATEGORIES: {[key:string]: (props: {[key: string]: any}) => string} = {
|
145
|
+
|
146
|
+
hoverProps: ({ hover }: { hover?: Hover }) => {
|
147
|
+
let css = '';
|
148
|
+
if (!hover) return css;
|
149
|
+
css += hover.shadow ? `hover_shadow_${hover.shadow} ` : '';
|
150
|
+
css += hover.background ? `bg-hover-${hover.background } ` : '';
|
151
|
+
css += hover.scale ? `hover_scale_${hover.scale} ` : '';
|
152
|
+
return css;
|
153
|
+
},
|
154
|
+
|
140
155
|
spacingProps: ({
|
141
156
|
marginRight,
|
142
157
|
marginLeft,
|
@@ -214,7 +229,11 @@ const PROP_CATEGORIES: {[key:string]: (props: {[key: string]: any}) => string} =
|
|
214
229
|
});
|
215
230
|
return css.trim();
|
216
231
|
},
|
217
|
-
|
232
|
+
borderRadiusProps: ({ borderRadius }: BorderRadius) => {
|
233
|
+
let css = ''
|
234
|
+
css += borderRadius ? `border_radius_${borderRadius} ` : ''
|
235
|
+
return css
|
236
|
+
},
|
218
237
|
darkProps: ({ dark }: Dark) => dark ? 'dark' : '',
|
219
238
|
numberSpacingProps: ({ numberSpacing }: NumberSpacing) => {
|
220
239
|
let css = ''
|
@@ -369,6 +388,7 @@ export const globalProps = (props: GlobalProps, defaultProps: DefaultProps = {})
|
|
369
388
|
}).filter((value) => value?.length > 0).join(" ")
|
370
389
|
}
|
371
390
|
|
391
|
+
|
372
392
|
export const deprecatedProps = (kit: string, props: string[] = []): void => {
|
373
393
|
if (process.env.NODE_ENV === 'development') {
|
374
394
|
/* eslint no-console: ["error", { allow: ["warn", "error"] }] */
|