playbook_ui 13.34.1.pre.alpha.powerfontsexternal3403 → 14.0.0.pre.alpha.PLAY14113475
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/pb_advanced_table/Components/TableHeaderCell.tsx +5 -2
- data/app/pb_kits/playbook/pb_advanced_table/SubKits/TableBody.tsx +24 -20
- data/app/pb_kits/playbook/pb_advanced_table/SubKits/TableHeader.tsx +17 -12
- data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +86 -1
- data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +5 -1
- data/app/pb_kits/playbook/pb_advanced_table/advanced_table.test.jsx +30 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_responsive.jsx +67 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_responsive.md +1 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +1 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +2 -1
- data/app/pb_kits/playbook/pb_avatar/_avatar.scss +0 -30
- data/app/pb_kits/playbook/pb_avatar/_avatar.tsx +19 -1
- data/app/pb_kits/playbook/pb_avatar/avatar.rb +44 -1
- data/app/pb_kits/playbook/pb_avatar/avatar.test.js +17 -0
- data/app/pb_kits/playbook/pb_badge/_badge.scss +6 -0
- data/app/pb_kits/playbook/pb_badge/_badge.tsx +4 -2
- data/app/pb_kits/playbook/pb_badge/badge.rb +1 -1
- data/app/pb_kits/playbook/pb_badge/badge.test.js +17 -11
- data/app/pb_kits/playbook/pb_badge/docs/_badge_notification.html.erb +13 -0
- data/app/pb_kits/playbook/pb_badge/docs/_badge_notification.jsx +31 -12
- data/app/pb_kits/playbook/pb_date_picker/docs/_description.md +3 -1
- data/app/pb_kits/playbook/pb_fixed_confirmation_toast/_fixed_confirmation_toast.scss +1 -1
- data/app/pb_kits/playbook/pb_form/docs/_form_form_with.html.erb +1 -0
- data/app/pb_kits/playbook/pb_icon/_icon.tsx +3 -0
- data/app/pb_kits/playbook/pb_icon/icon.rb +2 -0
- data/app/pb_kits/playbook/pb_icon_circle/_icon_circle.tsx +2 -1
- data/app/pb_kits/playbook/pb_icon_circle/icon_circle.rb +2 -2
- data/app/pb_kits/playbook/pb_icon_stat_value/_icon_stat_value.scss +0 -11
- data/app/pb_kits/playbook/pb_icon_stat_value/_icon_stat_value.tsx +3 -2
- data/app/pb_kits/playbook/pb_icon_stat_value/docs/_icon_stat_value_color.html.erb +1 -0
- data/app/pb_kits/playbook/pb_icon_stat_value/icon_stat_value.rb +2 -2
- data/app/pb_kits/playbook/pb_icon_stat_value/icon_stat_value.test.js +5 -4
- data/app/pb_kits/playbook/pb_nav/_horizontal_nav.scss +1 -1
- data/app/pb_kits/playbook/pb_online_status/_online_status.scss +52 -5
- data/app/pb_kits/playbook/pb_online_status/_online_status.tsx +6 -1
- data/app/pb_kits/playbook/pb_online_status/docs/_online_status_no_border.html.erb +1 -0
- data/app/pb_kits/playbook/pb_online_status/docs/_online_status_no_border.jsx +14 -0
- data/app/pb_kits/playbook/pb_online_status/docs/_online_status_size.html.erb +3 -0
- data/app/pb_kits/playbook/pb_online_status/docs/_online_status_size.jsx +25 -0
- data/app/pb_kits/playbook/pb_online_status/docs/example.yml +6 -2
- data/app/pb_kits/playbook/pb_online_status/docs/index.js +2 -0
- data/app/pb_kits/playbook/pb_online_status/online_status.rb +11 -1
- data/app/pb_kits/playbook/pb_online_status/online_status.test.js +31 -0
- data/app/pb_kits/playbook/pb_overlay/docs/_overlay_toggle.html.erb +61 -0
- data/app/pb_kits/playbook/pb_overlay/docs/_overlay_toggle.jsx +70 -0
- data/app/pb_kits/playbook/pb_overlay/docs/_overlay_toggle.md +1 -0
- data/app/pb_kits/playbook/pb_overlay/docs/example.yml +4 -2
- data/app/pb_kits/playbook/pb_overlay/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_star_rating/_star_rating.scss +83 -6
- data/app/pb_kits/playbook/pb_star_rating/docs/example.yml +3 -1
- data/app/pb_kits/playbook/pb_star_rating/index.js +73 -4
- data/app/pb_kits/playbook/pb_star_rating/star_rating.html.erb +1 -1
- data/app/pb_kits/playbook/pb_star_rating/star_rating.rb +2 -2
- data/app/pb_kits/playbook/pb_star_rating/stars/utils.tsx +5 -1
- data/app/pb_kits/playbook/pb_star_rating/subcomponents/_star_rating_interactive.tsx +50 -21
- data/app/pb_kits/playbook/pb_table/_table.tsx +1 -1
- data/app/pb_kits/playbook/pb_table/index.ts +4 -4
- data/app/pb_kits/playbook/pb_table/subcomponents/_table_body.tsx +1 -1
- data/app/pb_kits/playbook/pb_table/subcomponents/_table_cell.tsx +1 -1
- data/app/pb_kits/playbook/pb_table/subcomponents/_table_head.tsx +1 -1
- data/app/pb_kits/playbook/pb_table/subcomponents/_table_header.tsx +1 -1
- data/app/pb_kits/playbook/pb_table/subcomponents/_table_row.tsx +1 -1
- data/app/pb_kits/playbook/pb_table/table.test.js +2 -0
- data/app/pb_kits/playbook/pb_text_input/_text_input.tsx +1 -1
- data/app/pb_kits/playbook/pb_text_input/docs/_text_input_default.jsx +1 -1
- data/app/pb_kits/playbook/pb_textarea/_textarea.tsx +45 -27
- data/app/pb_kits/playbook/pb_textarea/index.ts +3 -3
- data/app/pb_kits/playbook/pb_time/_time.tsx +3 -3
- data/app/pb_kits/playbook/pb_time_range_inline/_time_range_inline.tsx +1 -1
- data/app/pb_kits/playbook/pb_timeline/_item.tsx +1 -1
- data/app/pb_kits/playbook/pb_timeline/_timeline.tsx +1 -1
- data/app/pb_kits/playbook/pb_title_detail/_title_detail.tsx +10 -10
- data/app/pb_kits/playbook/pb_toggle/_toggle.tsx +1 -1
- data/app/pb_kits/playbook/pb_tooltip/_tooltip.tsx +2 -2
- data/app/pb_kits/playbook/pb_treemap_chart/_treemap_chart.tsx +1 -2
- data/app/pb_kits/playbook/pb_treemap_chart/treemapChart.test.js +2 -0
- data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +2 -2
- data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_multi_kit.html.erb +1 -1
- data/app/pb_kits/playbook/pb_typeahead/typeahead.rb +1 -0
- data/app/pb_kits/playbook/pb_user/_user.tsx +1 -1
- data/app/pb_kits/playbook/pb_user_badge/_user_badge.tsx +6 -6
- data/app/pb_kits/playbook/pb_user_badge/badges/million-dollar.tsx +236 -235
- data/app/pb_kits/playbook/pb_user_badge/badges/veteran.tsx +1 -1
- data/app/pb_kits/playbook/pb_walkthrough/_walkthrough.tsx +68 -63
- data/app/pb_kits/playbook/pb_weekday_stacked/_weekday_stacked.tsx +1 -1
- data/app/pb_kits/playbook/utilities/_positioning.scss +26 -15
- data/dist/chunks/{_typeahead-COUJ88EA.js → _typeahead-eBLGedV-.js} +2 -2
- data/dist/chunks/{_weekday_stacked-BZu4elIU.js → _weekday_stacked-Bw_5qEUW.js} +2 -2
- data/dist/chunks/lazysizes-B7xYodB-.js +1 -0
- data/dist/chunks/{lib-Bf_E03gc.js → lib-BE0Z3F7x.js} +1 -1
- data/dist/chunks/{pb_form_validation-D0dhqeN2.js → pb_form_validation-TzZQ0Flx.js} +1 -1
- data/dist/chunks/vendor.js +1 -1
- data/dist/playbook-doc.js +1 -1
- data/dist/playbook-rails-react-bindings.js +1 -1
- data/dist/playbook-rails.js +1 -1
- data/dist/playbook.css +1 -1
- data/lib/playbook/version.rb +2 -2
- metadata +17 -8
- data/app/pb_kits/playbook/pb_online_status/_online_status_mixins.scss +0 -32
- data/dist/chunks/lazysizes-DHz07jlL.js +0 -1
@@ -10,3 +10,16 @@
|
|
10
10
|
variant: "notification"
|
11
11
|
}) %>
|
12
12
|
</div>
|
13
|
+
|
14
|
+
<div>
|
15
|
+
<%= pb_rails("badge", props: {
|
16
|
+
text: "1",
|
17
|
+
variant: "notification_error",
|
18
|
+
rounded: true
|
19
|
+
}) %>
|
20
|
+
|
21
|
+
<%= pb_rails("badge", props: {
|
22
|
+
text: "4",
|
23
|
+
variant: "notification_error"
|
24
|
+
}) %>
|
25
|
+
</div>
|
@@ -4,20 +4,39 @@ import Badge from '../_badge'
|
|
4
4
|
const BadgeNotification = (props) => {
|
5
5
|
return (
|
6
6
|
<>
|
7
|
-
<
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
7
|
+
<div>
|
8
|
+
<Badge
|
9
|
+
rounded
|
10
|
+
text="1"
|
11
|
+
variant="notification"
|
12
|
+
{...props}
|
13
|
+
/>
|
13
14
|
|
14
|
-
|
15
|
+
|
15
16
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
17
|
+
<Badge
|
18
|
+
text="4"
|
19
|
+
variant="notification"
|
20
|
+
{...props}
|
21
|
+
/>
|
22
|
+
</div>
|
23
|
+
|
24
|
+
<div>
|
25
|
+
<Badge
|
26
|
+
rounded
|
27
|
+
text="1"
|
28
|
+
variant="notificationError"
|
29
|
+
{...props}
|
30
|
+
/>
|
31
|
+
|
32
|
+
|
33
|
+
|
34
|
+
<Badge
|
35
|
+
text="4"
|
36
|
+
variant="notificationError"
|
37
|
+
{...props}
|
38
|
+
/>
|
39
|
+
</div>
|
21
40
|
</>
|
22
41
|
)
|
23
42
|
}
|
@@ -6,4 +6,6 @@ Playbook's date picker is built using [flatpickr](https://flatpickr.js.org/), a
|
|
6
6
|
|
7
7
|
To learn more [visit flatpickr's docs](https://flatpickr.js.org/instance-methods-properties-elements/) or see the hook doc section below for an applied example.
|
8
8
|
|
9
|
-
The Date Picker works best with Javascript Date Objects or ISO Date strings. If you're programming in js use Date Objects. If you're using rails convert your date object (with timezone) to UTC and then to an ISO Date string. For example, `DateTime.now.utc.iso8601`. This ensures that the string passed to the Date Picker kit behaves as expected.
|
9
|
+
The Date Picker works best with Javascript Date Objects or ISO Date strings. If you're programming in js use Date Objects. If you're using rails convert your date object (with timezone) to UTC and then to an ISO Date string. For example, `DateTime.now.utc.iso8601`. This ensures that the string passed to the Date Picker kit behaves as expected.
|
10
|
+
|
11
|
+
The Date Picker expects a date format of `MM/DD/YYYY` by default. If a different date format (e.g. `DD/MM/YYYY`, `m/d/y`, etc.) is used, the component will not know how to handle it and use a default date instead. To change the date format used, read more [here](#format).
|
@@ -45,6 +45,7 @@
|
|
45
45
|
class: "checkbox-class"
|
46
46
|
%>
|
47
47
|
<%= form.date_picker :example_date_picker_1, props: { label: true } %>
|
48
|
+
<%= form.star_rating_field :example_star_rating, props: { variant: "interactive", label: true } %>
|
48
49
|
|
49
50
|
<%= form.actions do |action| %>
|
50
51
|
<%= action.submit %>
|
@@ -39,6 +39,7 @@ type IconProps = {
|
|
39
39
|
size?: IconSizes,
|
40
40
|
fontStyle?: 'far' | 'fas' | 'fab' | 'fak',
|
41
41
|
spin?: boolean,
|
42
|
+
tabIndex?: number,
|
42
43
|
} & GlobalProps
|
43
44
|
|
44
45
|
const flipMap = {
|
@@ -138,6 +139,7 @@ const Icon = (props: IconProps) => {
|
|
138
139
|
size,
|
139
140
|
fontStyle = 'far',
|
140
141
|
spin = false,
|
142
|
+
tabIndex,
|
141
143
|
} = props
|
142
144
|
|
143
145
|
let iconElement: ReactSVGElement | null = typeof(icon) === "object" ? icon : null
|
@@ -226,6 +228,7 @@ const Icon = (props: IconProps) => {
|
|
226
228
|
id,
|
227
229
|
width: 'auto',
|
228
230
|
height: 'auto',
|
231
|
+
...(props.tabIndex !== undefined && { tabIndex }),
|
229
232
|
})
|
230
233
|
}
|
231
234
|
</>
|
@@ -37,6 +37,7 @@ module Playbook
|
|
37
37
|
prop :spin, type: Playbook::Props::Boolean,
|
38
38
|
default: false
|
39
39
|
prop :color, type: Playbook::Props::String
|
40
|
+
prop :tabindex
|
40
41
|
|
41
42
|
def valid_emoji?
|
42
43
|
emoji_regex = /\p{Emoji}/
|
@@ -107,6 +108,7 @@ module Playbook
|
|
107
108
|
svg["aria"] = object.aria
|
108
109
|
svg["height"] = "auto"
|
109
110
|
svg["width"] = "auto"
|
111
|
+
svg["tabindex"] = object.tabindex
|
110
112
|
fill_color = object.color || "currentColor"
|
111
113
|
doc.at_css("path")["fill"] = fill_color
|
112
114
|
raw doc
|
@@ -10,8 +10,8 @@ module Playbook
|
|
10
10
|
values: %w[xxs xs sm md base lg xl],
|
11
11
|
default: "md"
|
12
12
|
prop :variant, type: Playbook::Props::Enum,
|
13
|
-
values: %w[default royal blue orange purple teal red yellow green orange],
|
14
|
-
default: "
|
13
|
+
values: %w[default royal blue orange purple teal red yellow green orange lighter],
|
14
|
+
default: "lighter"
|
15
15
|
|
16
16
|
def classname
|
17
17
|
generate_classname("pb_icon_circle_kit", "size_#{size}", variant)
|
@@ -50,15 +50,4 @@
|
|
50
50
|
margin-right: $space-sm;
|
51
51
|
}
|
52
52
|
}
|
53
|
-
[class^=pb_title_kit_1] + [class^=pb_body_kit] {
|
54
|
-
font-size: 36px;
|
55
|
-
}
|
56
|
-
|
57
|
-
[class^=pb_title_kit_2] + [class^=pb_body_kit] {
|
58
|
-
font-size: 24px
|
59
|
-
}
|
60
|
-
|
61
|
-
[class^=pb_title_kit_3] + [class^=pb_body_kit] {
|
62
|
-
font-size: 20px;
|
63
|
-
}
|
64
53
|
}
|
@@ -32,7 +32,8 @@ type IconStatValueProps = {
|
|
32
32
|
| "red"
|
33
33
|
| "yellow"
|
34
34
|
| "orange"
|
35
|
-
| "green"
|
35
|
+
| "green"
|
36
|
+
| "lighter",
|
36
37
|
}
|
37
38
|
|
38
39
|
const IconStatValue = (props: IconStatValueProps): React.ReactElement => {
|
@@ -49,7 +50,7 @@ const IconStatValue = (props: IconStatValueProps): React.ReactElement => {
|
|
49
50
|
text = '',
|
50
51
|
unit = '',
|
51
52
|
value = 0,
|
52
|
-
variant = '
|
53
|
+
variant = 'lighter',
|
53
54
|
} = props
|
54
55
|
const ariaProps = buildAriaProps(aria)
|
55
56
|
const dataProps = buildDataProps(data)
|
@@ -9,8 +9,8 @@ module Playbook
|
|
9
9
|
values: %w[sm md lg],
|
10
10
|
default: "sm"
|
11
11
|
prop :variant, type: Playbook::Props::Enum,
|
12
|
-
values: %w[default royal blue purple teal red yellow green orange],
|
13
|
-
default: "
|
12
|
+
values: %w[default royal blue purple teal red yellow green orange lighter],
|
13
|
+
default: "lighter"
|
14
14
|
|
15
15
|
prop :orientation, type: Playbook::Props::Enum,
|
16
16
|
values: %w[vertical horizontal],
|
@@ -18,7 +18,7 @@ describe("IconStatValue Kit", () => {
|
|
18
18
|
)
|
19
19
|
|
20
20
|
const kit = screen.getByTestId(testId)
|
21
|
-
expect(kit).toHaveClass("
|
21
|
+
expect(kit).toHaveClass("pb_icon_stat_value_kit_horizontal_sm_lighter")
|
22
22
|
})
|
23
23
|
|
24
24
|
test("renders icon", () => {
|
@@ -101,7 +101,7 @@ describe("IconStatValue Kit", () => {
|
|
101
101
|
)
|
102
102
|
|
103
103
|
const kit = screen.getByTestId(testId)
|
104
|
-
expect(kit).toHaveClass(`pb_icon_stat_value_kit_horizontal_${sizeProp}
|
104
|
+
expect(kit).toHaveClass(`pb_icon_stat_value_kit_horizontal_${sizeProp}_lighter`)
|
105
105
|
|
106
106
|
cleanup()
|
107
107
|
})
|
@@ -115,7 +115,8 @@ describe("IconStatValue Kit", () => {
|
|
115
115
|
"teal",
|
116
116
|
"red",
|
117
117
|
"yellow",
|
118
|
-
"green"
|
118
|
+
"green",
|
119
|
+
"lighter"].forEach(
|
119
120
|
(colorProp) => {
|
120
121
|
render(
|
121
122
|
<IconStatValue
|
@@ -148,7 +149,7 @@ describe("IconStatValue Kit", () => {
|
|
148
149
|
)
|
149
150
|
|
150
151
|
const kit = screen.getByTestId(testId)
|
151
|
-
expect(kit).toHaveClass("
|
152
|
+
expect(kit).toHaveClass("pb_icon_stat_value_kit_vertical_sm_lighter")
|
152
153
|
})
|
153
154
|
|
154
155
|
})
|
@@ -1,11 +1,58 @@
|
|
1
|
-
@import "
|
1
|
+
@import "../tokens/colors";
|
2
|
+
|
3
|
+
$pb_online_status_size: 8px;
|
4
|
+
$pb_online_status_border: 2px;
|
5
|
+
$pb_online_status_sizes: (
|
6
|
+
"sm": 8px,
|
7
|
+
"md": 10px,
|
8
|
+
"lg": 12px,
|
9
|
+
);
|
10
|
+
|
11
|
+
$pb_online_status_statuses: (
|
12
|
+
online: $success,
|
13
|
+
away: $warning,
|
14
|
+
offline: $neutral,
|
15
|
+
success: $success,
|
16
|
+
warning: $warning,
|
17
|
+
error: $error,
|
18
|
+
info: $info,
|
19
|
+
neutral: $neutral,
|
20
|
+
primary: $primary,
|
21
|
+
);
|
2
22
|
|
3
23
|
[class^=pb_online_status_kit] {
|
4
|
-
|
24
|
+
box-sizing: content-box;
|
25
|
+
width: $pb_online_status_size;
|
26
|
+
height: $pb_online_status_size;
|
27
|
+
flex-basis: $pb_online_status_size;
|
28
|
+
flex-grow: 0;
|
29
|
+
flex-shrink: 0;
|
30
|
+
border-width: $pb_online_status_border;
|
31
|
+
border-color: $white;
|
32
|
+
border-style: solid;
|
33
|
+
border-radius: 50%;
|
34
|
+
background: $neutral;
|
35
|
+
|
36
|
+
&.dark {
|
37
|
+
border-color: $bg_dark;
|
38
|
+
}
|
5
39
|
|
6
40
|
@each $status_name, $status_value in $pb_online_status_statuses {
|
7
|
-
&[class*=_#{$status_name}]
|
8
|
-
|
41
|
+
&[class*=_#{$status_name}] {
|
42
|
+
background: $status_value;
|
9
43
|
}
|
10
44
|
}
|
11
|
-
|
45
|
+
|
46
|
+
@each $size, $value in $pb_online_status_sizes {
|
47
|
+
&[class*=_size_#{$size}] {
|
48
|
+
width: $value;
|
49
|
+
height: $value;
|
50
|
+
flex-basis: $value;
|
51
|
+
}
|
52
|
+
}
|
53
|
+
|
54
|
+
&[class*=_no_border] {
|
55
|
+
border-width: 0;
|
56
|
+
border-style: none;
|
57
|
+
}
|
58
|
+
}
|
@@ -11,6 +11,8 @@ type OnlineStatusProps = {
|
|
11
11
|
htmlOptions?: {[key: string]: string | number | boolean | (() => void)},
|
12
12
|
id?: string,
|
13
13
|
status?: "away" | "error" | "info" | "neutral" | "offline" |"online" | "primary"| "success" | "warning",
|
14
|
+
size?: "sm" | "md" | "lg",
|
15
|
+
noBorder?: boolean,
|
14
16
|
} & GlobalProps
|
15
17
|
|
16
18
|
const OnlineStatus = (props: OnlineStatusProps) => {
|
@@ -21,6 +23,8 @@ const OnlineStatus = (props: OnlineStatusProps) => {
|
|
21
23
|
htmlOptions = {},
|
22
24
|
id,
|
23
25
|
status = 'offline',
|
26
|
+
size = 'sm',
|
27
|
+
noBorder = false,
|
24
28
|
} = props
|
25
29
|
|
26
30
|
aria.label = status
|
@@ -28,7 +32,8 @@ const OnlineStatus = (props: OnlineStatusProps) => {
|
|
28
32
|
const ariaProps = buildAriaProps(aria)
|
29
33
|
const dataProps = buildDataProps(data)
|
30
34
|
const htmlProps = buildHtmlProps(htmlOptions)
|
31
|
-
const
|
35
|
+
const getBorder = noBorder ? 'no_border' : ''
|
36
|
+
const classes = classnames(buildCss('pb_online_status_kit', status, getBorder, "size", size), globalProps(props), className)
|
32
37
|
|
33
38
|
return (
|
34
39
|
<div
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= pb_rails("online_status", props: { no_border: true }) %>
|
@@ -0,0 +1,25 @@
|
|
1
|
+
import React from 'react'
|
2
|
+
|
3
|
+
import OnlineStatus from '../_online_status'
|
4
|
+
|
5
|
+
const OnlineStatusSize = (props) => (
|
6
|
+
<>
|
7
|
+
<OnlineStatus
|
8
|
+
marginY="xs"
|
9
|
+
size="sm"
|
10
|
+
{...props}
|
11
|
+
/>
|
12
|
+
<OnlineStatus
|
13
|
+
marginY="xs"
|
14
|
+
size="md"
|
15
|
+
{...props}
|
16
|
+
/>
|
17
|
+
<OnlineStatus
|
18
|
+
marginY="xs"
|
19
|
+
size="lg"
|
20
|
+
{...props}
|
21
|
+
/>
|
22
|
+
</>
|
23
|
+
)
|
24
|
+
|
25
|
+
export default OnlineStatusSize
|
@@ -1,8 +1,12 @@
|
|
1
1
|
examples:
|
2
2
|
|
3
3
|
rails:
|
4
|
-
- online_status_default:
|
4
|
+
- online_status_default: Colors
|
5
|
+
- online_status_size: Size
|
6
|
+
- online_status_no_border: No Border
|
5
7
|
|
6
8
|
|
7
9
|
react:
|
8
|
-
- online_status_default:
|
10
|
+
- online_status_default: Colors
|
11
|
+
- online_status_size: Size
|
12
|
+
- online_status_no_border: No Border
|
@@ -7,8 +7,18 @@ module Playbook
|
|
7
7
|
values: %w[online offline away success warning error info neutral primary],
|
8
8
|
default: "offline"
|
9
9
|
|
10
|
+
prop :size, type: Playbook::Props::Enum,
|
11
|
+
values: %w[sm md lg],
|
12
|
+
default: "sm"
|
13
|
+
|
14
|
+
prop :no_border, type: Playbook::Props::Boolean, default: false
|
15
|
+
|
10
16
|
def classname
|
11
|
-
generate_classname("pb_online_status_kit", status)
|
17
|
+
generate_classname("pb_online_status_kit", status, is_no_border, "size", size)
|
18
|
+
end
|
19
|
+
|
20
|
+
def is_no_border
|
21
|
+
no_border ? "no_border" : nil
|
12
22
|
end
|
13
23
|
end
|
14
24
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
import React from 'react'
|
2
|
+
import { render, screen } from '../utilities/test-utils'
|
3
|
+
|
4
|
+
import OnlineStatus from './_online_status'
|
5
|
+
|
6
|
+
const testId = 'online-status'
|
7
|
+
|
8
|
+
test('renders online status with defaults', () => {
|
9
|
+
render(
|
10
|
+
<OnlineStatus data={{ testid: testId }} />
|
11
|
+
)
|
12
|
+
|
13
|
+
const kit = screen.getByTestId(testId)
|
14
|
+
expect(kit).toHaveClass('pb_online_status_kit_offline_size_sm')
|
15
|
+
})
|
16
|
+
|
17
|
+
test('renders online status with props', () => {
|
18
|
+
render(
|
19
|
+
<OnlineStatus
|
20
|
+
className="additional_class"
|
21
|
+
dark
|
22
|
+
data={{ testid: testId }}
|
23
|
+
noBorder
|
24
|
+
size="lg"
|
25
|
+
status="online"
|
26
|
+
/>
|
27
|
+
)
|
28
|
+
|
29
|
+
const kit = screen.getByTestId(testId)
|
30
|
+
expect(kit).toHaveClass('pb_online_status_kit_online_no_border_size_lg dark additional_class')
|
31
|
+
})
|
@@ -0,0 +1,61 @@
|
|
1
|
+
<div id="outer-container">
|
2
|
+
<%= pb_rails("overlay", props: { id: "overlay-container", overflow: "hidden" }) do %>
|
3
|
+
<div id="underlying-table">
|
4
|
+
<%= pb_rails("table", props: { size: "sm" }) do %>
|
5
|
+
<thead>
|
6
|
+
<tr>
|
7
|
+
<th>Column 1</th>
|
8
|
+
<th>Column 2</th>
|
9
|
+
<th>Column 3</th>
|
10
|
+
<th>Column 4</th>
|
11
|
+
<th>Column 5</th>
|
12
|
+
</tr>
|
13
|
+
</thead>
|
14
|
+
<tbody>
|
15
|
+
<% 7.times do %>
|
16
|
+
<tr>
|
17
|
+
<td>Value 1</td>
|
18
|
+
<td>Value 2</td>
|
19
|
+
<td>Value 3</td>
|
20
|
+
<td>Value 4</td>
|
21
|
+
<td>Value 5</td>
|
22
|
+
</tr>
|
23
|
+
<% end %>
|
24
|
+
</tbody>
|
25
|
+
<% end %>
|
26
|
+
</div>
|
27
|
+
<% end %>
|
28
|
+
<%= pb_rails("button", props: { text: "Show More", id: "show-more-button", variant: "link", full_width: true, icon: "chevron-down", icon_right: true }) %>
|
29
|
+
<%= pb_rails("button", props: { text: "Show Less", id: "show-less-button", variant: "link", full_width: true, icon: "chevron-up", icon_right: true }) %>
|
30
|
+
</div>
|
31
|
+
|
32
|
+
<script type="text/javascript">
|
33
|
+
document.addEventListener("DOMContentLoaded", () => {
|
34
|
+
const showMoreButton = document.getElementById("show-more-button");
|
35
|
+
const showLessButton = document.getElementById("show-less-button");
|
36
|
+
const overlayContainer = document.getElementById("overlay-container");
|
37
|
+
const underlyingTable = document.getElementById("underlying-table");
|
38
|
+
const outerContainer = document.getElementById("outer-container");
|
39
|
+
|
40
|
+
showLessButton.style.display = "none";
|
41
|
+
underlyingTable.style.height = "200px";
|
42
|
+
|
43
|
+
const showMore = () => {
|
44
|
+
outerContainer.appendChild(underlyingTable);
|
45
|
+
outerContainer.appendChild(showLessButton);
|
46
|
+
showMoreButton.style.display = "none";
|
47
|
+
showLessButton.style.display = "flex";
|
48
|
+
underlyingTable.style.height = "auto";
|
49
|
+
};
|
50
|
+
|
51
|
+
const showLess = () => {
|
52
|
+
overlayContainer.appendChild(underlyingTable);
|
53
|
+
showMoreButton.style.display = "flex";
|
54
|
+
showLessButton.style.display = "none";
|
55
|
+
underlyingTable.style.height = "200px";
|
56
|
+
};
|
57
|
+
|
58
|
+
showMoreButton.addEventListener("click", showMore);
|
59
|
+
showLessButton.addEventListener("click", showLess);
|
60
|
+
});
|
61
|
+
</script>
|
@@ -0,0 +1,70 @@
|
|
1
|
+
/* eslint-disable react/no-multi-comp */
|
2
|
+
import React, { useState } from "react";
|
3
|
+
import { Overlay, Table, Button } from "playbook-ui";
|
4
|
+
|
5
|
+
const TableExample = () => {
|
6
|
+
return (
|
7
|
+
<Table size="sm">
|
8
|
+
<thead>
|
9
|
+
<tr>
|
10
|
+
<th>{"Column 1"}</th>
|
11
|
+
<th>{"Column 2"}</th>
|
12
|
+
<th>{"Column 3"}</th>
|
13
|
+
<th>{"Column 4"}</th>
|
14
|
+
<th>{"Column 5"}</th>
|
15
|
+
</tr>
|
16
|
+
</thead>
|
17
|
+
<tbody>
|
18
|
+
{Array.from({ length: 7 }, (_, index) => (
|
19
|
+
<tr key={index}>
|
20
|
+
{Array.from({ length: 5 }, (_, columnIndex) => (
|
21
|
+
<td key={columnIndex}>{`Value ${columnIndex + 1}`}</td>
|
22
|
+
))}
|
23
|
+
</tr>
|
24
|
+
))}
|
25
|
+
</tbody>
|
26
|
+
</Table>
|
27
|
+
);
|
28
|
+
};
|
29
|
+
|
30
|
+
const OverlayToggle = () => {
|
31
|
+
const [showOverlay, setShowOverlay] = useState(true);
|
32
|
+
|
33
|
+
return (
|
34
|
+
<>
|
35
|
+
{showOverlay ? (
|
36
|
+
<>
|
37
|
+
<Overlay overflow="hidden">
|
38
|
+
<div style={{ height: 200 }}>
|
39
|
+
<TableExample />
|
40
|
+
</div>
|
41
|
+
</Overlay>
|
42
|
+
<Button
|
43
|
+
fullWidth
|
44
|
+
icon="chevron-down"
|
45
|
+
iconRight
|
46
|
+
key="chevron-down"
|
47
|
+
onClick={() => setShowOverlay(false)}
|
48
|
+
text="Show More"
|
49
|
+
variant="link"
|
50
|
+
/>
|
51
|
+
</>
|
52
|
+
) : (
|
53
|
+
<>
|
54
|
+
<TableExample />
|
55
|
+
<Button
|
56
|
+
fullWidth
|
57
|
+
icon="chevron-up"
|
58
|
+
iconRight
|
59
|
+
key="chevron-up"
|
60
|
+
onClick={() => setShowOverlay(true)}
|
61
|
+
text="Show Less"
|
62
|
+
variant="link"
|
63
|
+
/>
|
64
|
+
</>
|
65
|
+
)}
|
66
|
+
</>
|
67
|
+
);
|
68
|
+
};
|
69
|
+
|
70
|
+
export default OverlayToggle;
|
@@ -0,0 +1 @@
|
|
1
|
+
To toggle an overlay, add a button with an event handler. Remove the overlay container to reveal the underlying content. Re-wrap the overlay container to add the overlay back.
|
@@ -2,7 +2,9 @@ examples:
|
|
2
2
|
react:
|
3
3
|
- overlay_default: Default
|
4
4
|
- overlay_multi_directional: Multi-directional
|
5
|
+
- overlay_toggle: Toggle
|
5
6
|
|
6
7
|
rails:
|
7
|
-
|
8
|
-
|
8
|
+
- overlay_default: Default
|
9
|
+
- overlay_multi_directional: Multi-directional
|
10
|
+
- overlay_toggle: Toggle
|