playbook_ui 14.19.0.pre.rc.1 → 14.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/pb_kits/playbook/_playbook.scss +0 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_beta.md +0 -6
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_no_subrows_rails.md +5 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows_no_subrows.jsx → _advanced_table_selectable_rows_no_subrows_react.jsx} +2 -2
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_rails.md +3 -2
- data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +4 -5
- data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +1 -1
- data/app/pb_kits/playbook/pb_advanced_table/flat_advanced_table.js +106 -0
- data/app/pb_kits/playbook/pb_advanced_table/index.js +228 -11
- data/app/pb_kits/playbook/pb_advanced_table/table_body.rb +9 -1
- data/app/pb_kits/playbook/pb_advanced_table/table_header.rb +0 -3
- data/app/pb_kits/playbook/pb_advanced_table/table_row.rb +1 -2
- data/app/pb_kits/playbook/pb_avatar/_avatar.scss +4 -0
- data/app/pb_kits/playbook/pb_avatar/_avatar.tsx +3 -0
- data/app/pb_kits/playbook/pb_avatar/avatar.html.erb +3 -3
- data/app/pb_kits/playbook/pb_avatar/avatar.rb +2 -0
- data/app/pb_kits/playbook/pb_avatar/avatar.test.js +18 -0
- data/app/pb_kits/playbook/pb_avatar/docs/_avatar_grayscale.html.erb +5 -0
- data/app/pb_kits/playbook/pb_avatar/docs/_avatar_grayscale.jsx +16 -0
- data/app/pb_kits/playbook/pb_avatar/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_avatar/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_card/card.html.erb +1 -1
- data/app/pb_kits/playbook/pb_card/card.rb +12 -0
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_error.html.erb +2 -2
- data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones.html.erb +22 -1
- data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones_line.html.erb +55 -0
- data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones_line_rails.md +5 -0
- data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones_rails.md +5 -0
- data/app/pb_kits/playbook/pb_draggable/docs/_draggable_event_listeners.jsx +59 -0
- data/app/pb_kits/playbook/pb_draggable/docs/_draggable_event_listeners_react.md +1 -0
- data/app/pb_kits/playbook/pb_draggable/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_draggable/docs/index.js +2 -1
- data/app/pb_kits/playbook/pb_draggable/draggable_container.rb +11 -1
- data/app/pb_kits/playbook/pb_draggable/draggable_item.rb +11 -1
- data/app/pb_kits/playbook/pb_draggable/index.js +4 -2
- data/app/pb_kits/playbook/pb_draggable/subcomponents/DraggableItem.tsx +33 -5
- data/app/pb_kits/playbook/pb_dropdown/_dropdown.scss +5 -0
- data/app/pb_kits/playbook/pb_dropdown/_dropdown.tsx +5 -16
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_error.html.erb +5 -2
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete.html.erb +28 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete.jsx +17 -64
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_with_subcomponents.html.erb +58 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/{_dropdown_with_autocomplete_and_custom_display.jsx → _dropdown_with_autocomplete_with_subcomponents.jsx} +11 -25
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_with_subcomponents.md +1 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_external_control.md +1 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search.jsx +61 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search.md +2 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search_rails.html.erb +52 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search_rails.md +2 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/example.yml +7 -4
- data/app/pb_kits/playbook/pb_dropdown/docs/index.js +2 -2
- data/app/pb_kits/playbook/pb_dropdown/dropdown.html.erb +2 -2
- data/app/pb_kits/playbook/pb_dropdown/dropdown.rb +4 -0
- data/app/pb_kits/playbook/pb_dropdown/dropdown.test.jsx +45 -1
- data/app/pb_kits/playbook/pb_dropdown/dropdown_container.html.erb +10 -0
- data/app/pb_kits/playbook/pb_dropdown/dropdown_container.rb +3 -0
- data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.html.erb +12 -2
- data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.rb +3 -1
- data/app/pb_kits/playbook/pb_dropdown/index.js +57 -0
- data/app/pb_kits/playbook/pb_dropdown/keyboard_accessibility.js +26 -0
- data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownContainer.tsx +1 -2
- data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownTrigger.tsx +4 -4
- data/app/pb_kits/playbook/pb_empty_state/_empty_state.scss +8 -1
- data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_alignment.html.erb +27 -0
- data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_default.html.erb +7 -0
- data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_orientation.html.erb +12 -0
- data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_size.html.erb +23 -0
- data/app/pb_kits/playbook/pb_empty_state/docs/example.yml +5 -1
- data/app/pb_kits/playbook/pb_empty_state/empty_state.html.erb +19 -0
- data/app/pb_kits/playbook/pb_empty_state/empty_state.rb +123 -0
- data/app/pb_kits/playbook/pb_form_group/_error_state_mixin.scss +22 -18
- data/app/pb_kits/playbook/pb_message/_message.tsx +3 -0
- data/app/pb_kits/playbook/pb_message/docs/_message_grayscale.html.erb +9 -0
- data/app/pb_kits/playbook/pb_message/docs/_message_grayscale.jsx +21 -0
- data/app/pb_kits/playbook/pb_message/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_message/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_message/message.html.erb +2 -1
- data/app/pb_kits/playbook/pb_message/message.rb +1 -0
- data/app/pb_kits/playbook/pb_overlay/_overlay.scss +2 -1
- data/app/pb_kits/playbook/pb_overlay/docs/_overlay_vertical_dynamic_multi_directional.jsx +1 -1
- data/app/pb_kits/playbook/pb_overlay/subcomponents/_overlay_token.tsx +5 -4
- data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.scss +13 -0
- data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.tsx +3 -1
- data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_country_search.html.erb +10 -0
- data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_country_search.jsx +20 -0
- data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_country_search.md +1 -0
- data/app/pb_kits/playbook/pb_phone_number_input/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_phone_number_input/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_phone_number_input/phone_number_input.rb +3 -0
- data/app/pb_kits/playbook/pb_phone_number_input/phone_number_input.test.js +19 -0
- data/app/pb_kits/playbook/pb_select/_select.scss +10 -0
- data/app/pb_kits/playbook/pb_select/docs/_select_error.html.erb +1 -1
- data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_custom_click.jsx +7 -7
- data/app/pb_kits/playbook/pb_table/subcomponents/_table_row.tsx +5 -5
- data/app/pb_kits/playbook/pb_text_input/docs/_text_input_error.html.erb +1 -1
- data/app/pb_kits/playbook/pb_textarea/docs/_textarea_error.html.erb +5 -1
- data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_error_state.html.erb +8 -1
- data/app/pb_kits/playbook/pb_user/_user.tsx +3 -0
- data/app/pb_kits/playbook/pb_user/docs/_user_grayscale.html.erb +6 -0
- data/app/pb_kits/playbook/pb_user/docs/_user_grayscale.jsx +16 -0
- data/app/pb_kits/playbook/pb_user/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_user/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_user/user.html.erb +2 -1
- data/app/pb_kits/playbook/pb_user/user.rb +1 -0
- data/dist/chunks/_typeahead-D62OcwsT.js +22 -0
- data/dist/chunks/_weekday_stacked-Ceh9N0ow.js +45 -0
- data/dist/chunks/lazysizes-DHz07jlL.js +1 -0
- data/dist/chunks/lib-CeKZrPmu.js +29 -0
- data/dist/chunks/{pb_form_validation-BWjy4bFn.js → pb_form_validation-BioH7DWv.js} +1 -1
- data/dist/chunks/vendor.js +1 -1
- data/dist/menu.yml +6 -14
- data/dist/playbook-doc.js +2 -2
- 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 +1 -1
- metadata +43 -22
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_and_custom_display.md +0 -1
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_hook.jsx +0 -79
- data/app/pb_kits/playbook/pb_gantt_chart/_gantt_chart.scss +0 -3
- data/app/pb_kits/playbook/pb_gantt_chart/_gantt_chart.tsx +0 -72
- data/app/pb_kits/playbook/pb_gantt_chart/docs/_gantt_chart_default.jsx +0 -53
- data/app/pb_kits/playbook/pb_gantt_chart/docs/example.yml +0 -7
- data/app/pb_kits/playbook/pb_gantt_chart/docs/index.js +0 -1
- data/app/pb_kits/playbook/pb_gantt_chart/gantt_chart.test.jsx +0 -19
- data/dist/chunks/_typeahead-CITBvzU7.js +0 -22
- data/dist/chunks/_weekday_stacked-C8-PW1nI.js +0 -45
- data/dist/chunks/lazysizes-B7xYodB-.js +0 -1
- data/dist/chunks/lib-BmTAc7Nc.js +0 -29
- /data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows_react.md → _advanced_table_selectable_rows.md} +0 -0
- /data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows_no_subrows.html.erb → _advanced_table_selectable_rows_no_subrows_rails.html.erb} +0 -0
- /data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows.html.erb → _advanced_table_selectable_rows_rails.html.erb} +0 -0
- /data/app/pb_kits/playbook/pb_draggable/docs/{_draggable_drop_zones_line.md → _draggable_drop_zones_line_react.md} +0 -0
- /data/app/pb_kits/playbook/pb_draggable/docs/{_draggable_event_listeners.md → _draggable_event_listeners_rails.md} +0 -0
@@ -53,7 +53,6 @@ const DropdownTrigger = (props: DropdownTriggerProps) => {
|
|
53
53
|
selected,
|
54
54
|
setIsInputFocused,
|
55
55
|
toggleDropdown,
|
56
|
-
triggerRef,
|
57
56
|
} = useContext(DropdownContext);
|
58
57
|
|
59
58
|
const handleKeyDown = useHandleOnKeyDown();
|
@@ -99,7 +98,6 @@ const DropdownTrigger = (props: DropdownTriggerProps) => {
|
|
99
98
|
id={id}
|
100
99
|
>
|
101
100
|
{
|
102
|
-
!triggerRef && (
|
103
101
|
children ? (
|
104
102
|
<div
|
105
103
|
onClick={() => toggleDropdown()}
|
@@ -147,7 +145,10 @@ const DropdownTrigger = (props: DropdownTriggerProps) => {
|
|
147
145
|
<input
|
148
146
|
className="dropdown_input"
|
149
147
|
onChange={handleChange}
|
150
|
-
onClick={() =>
|
148
|
+
onClick={(e) => {
|
149
|
+
e.stopPropagation();// keep the wrapper’s handler from firing
|
150
|
+
toggleDropdown();
|
151
|
+
}}
|
151
152
|
onFocus={() => setIsInputFocused(true)}
|
152
153
|
onKeyDown={handleKeyDown}
|
153
154
|
placeholder={
|
@@ -181,7 +182,6 @@ const DropdownTrigger = (props: DropdownTriggerProps) => {
|
|
181
182
|
</Flex>
|
182
183
|
</>
|
183
184
|
)
|
184
|
-
)
|
185
185
|
}
|
186
186
|
</div>
|
187
187
|
);
|
@@ -1,4 +1,5 @@
|
|
1
1
|
.pb_empty_state_kit {
|
2
|
+
max-width: 100%;
|
2
3
|
|
3
4
|
.sm-state-vertical {
|
4
5
|
width: 150px;
|
@@ -35,4 +36,10 @@
|
|
35
36
|
}
|
36
37
|
}
|
37
38
|
|
38
|
-
|
39
|
+
&.dark {
|
40
|
+
[class*="pb_title_kit"],
|
41
|
+
[class*="pb_body_kit"],
|
42
|
+
[class*="pb_detail_kit"],
|
43
|
+
[class*="pb_button_kit_link"]:hover { color: $white; }
|
44
|
+
}
|
45
|
+
}
|
@@ -0,0 +1,27 @@
|
|
1
|
+
<%= pb_rails("flex", props: {align: "center", spacing: "evenly", wrap: true}) do %>
|
2
|
+
<%= pb_rails("empty_state", props: {
|
3
|
+
description: "Body text goes into detail with possible steps for user to take",
|
4
|
+
header: "Title Explains",
|
5
|
+
image: "default",
|
6
|
+
primary_button: "Next Action",
|
7
|
+
primary_button_url: "#primary_button_url",
|
8
|
+
alignment: "left",
|
9
|
+
}) %>
|
10
|
+
|
11
|
+
<%= pb_rails("empty_state", props: {
|
12
|
+
description: "Body text goes into detail with possible steps for user to take",
|
13
|
+
header: "Title Explains",
|
14
|
+
image: "default",
|
15
|
+
primary_button: "Next Action",
|
16
|
+
primary_button_url: "#primary_button_url",
|
17
|
+
}) %>
|
18
|
+
|
19
|
+
<%= pb_rails("empty_state", props: {
|
20
|
+
description: "Body text goes into detail with possible steps for user to take",
|
21
|
+
header: "Title Explains",
|
22
|
+
image: "default",
|
23
|
+
primary_button: "Next Action",
|
24
|
+
primary_button_url: "#primary_button_url",
|
25
|
+
alignment: "right",
|
26
|
+
}) %>
|
27
|
+
<% end %>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<%= pb_rails("flex", props: {align: "center", justify: "center", wrap: true}) do %>
|
2
|
+
<%= pb_rails("empty_state", props: {
|
3
|
+
description: "Body text goes into detail with possible steps for user to take",
|
4
|
+
header: "Title Explains",
|
5
|
+
image: "default",
|
6
|
+
orientation:"horizontal",
|
7
|
+
alignment: "left",
|
8
|
+
size: "lg",
|
9
|
+
primary_button: "Next Action",
|
10
|
+
primary_button_url: "#primary_button_url",
|
11
|
+
}) %>
|
12
|
+
<% end %>
|
@@ -0,0 +1,23 @@
|
|
1
|
+
<%= pb_rails("flex", props: {align: "center", spacing: "evenly", wrap: true}) do %>
|
2
|
+
<%= pb_rails("empty_state", props: {
|
3
|
+
description: "Body text goes into detail with possible steps for user to take",
|
4
|
+
header: "Title Explains",
|
5
|
+
image: "default",
|
6
|
+
primary_button: "Next Action",
|
7
|
+
primary_button_url: "#primary_button_url",
|
8
|
+
link_button: "Alt Action",
|
9
|
+
link_button_url: "#link_button_url",
|
10
|
+
size: "sm",
|
11
|
+
}) %>
|
12
|
+
|
13
|
+
<%= pb_rails("empty_state", props: {
|
14
|
+
description: "Body text goes into detail with possible steps for user to take",
|
15
|
+
header: "Title Explains",
|
16
|
+
image: "default",
|
17
|
+
primary_button: "Next Action",
|
18
|
+
primary_button_url: "#primary_button_url",
|
19
|
+
link_button: "Alt Action",
|
20
|
+
link_button_url: "#link_button_url",
|
21
|
+
size: "lg",
|
22
|
+
}) %>
|
23
|
+
<% end %>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<%= pb_content_tag do %>
|
2
|
+
<%= pb_rails("flex", props: { align: flex_align, orientation: config[:flex_direction], padding_left: padding_size, padding_right: padding_size, vertical: "center", classname: config[:scss_class], max_width: "100%" }) do %>
|
3
|
+
<%= pb_rails("image", props: { url: image == "default" ? default_image_data_uri : image, alt: "Empty State Image", html_options: { width: config[:image_width], height: "auto", alignment: "start" } }) %>
|
4
|
+
<%= pb_rails("flex/flex_item") do %>
|
5
|
+
<%= pb_rails("title", props: { text: object.header, size: config[:title_size], padding_bottom: config[:title_padding], text_align: alignment }) %>
|
6
|
+
<% if size == "sm" %>
|
7
|
+
<%= pb_rails("detail", props: { text: object.description, padding_bottom: config[:description_pad], text_align: alignment }) %>
|
8
|
+
<% else %>
|
9
|
+
<%= pb_rails("body", props: { text: object.description, padding_bottom: config[:description_pad], text_align: alignment }) %>
|
10
|
+
<% end %>
|
11
|
+
<% if primary_button.present? %>
|
12
|
+
<%= pb_rails("button", props: { text: primary_button, variant: "primary", width: "100%", size: config[:button_size], link: primary_button_url, margin_bottom: config[:button_margin] }) %>
|
13
|
+
<% end %>
|
14
|
+
<% if link_button.present? %>
|
15
|
+
<%= pb_rails("button", props: { text: link_button, variant: "link", size: config[:button_size], link: link_button_url, width: "100%" }) %>
|
16
|
+
<% end %>
|
17
|
+
<% end %>
|
18
|
+
<% end %>
|
19
|
+
<% end %>
|
@@ -0,0 +1,123 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Playbook
|
4
|
+
module PbEmptyState
|
5
|
+
class EmptyState < Playbook::KitBase
|
6
|
+
prop :alignment, type: Playbook::Props::Enum,
|
7
|
+
values: %w[center left right],
|
8
|
+
default: "center"
|
9
|
+
prop :description
|
10
|
+
prop :header
|
11
|
+
prop :image
|
12
|
+
prop :link_button
|
13
|
+
prop :link_button_url
|
14
|
+
prop :orientation, type: Playbook::Props::Enum,
|
15
|
+
values: %w[horizontal vertical],
|
16
|
+
default: "vertical"
|
17
|
+
prop :primary_button
|
18
|
+
prop :primary_button_url
|
19
|
+
prop :size, type: Playbook::Props::Enum,
|
20
|
+
values: %w[sm md lg],
|
21
|
+
default: "md"
|
22
|
+
|
23
|
+
SIZE_CONFIGS = {
|
24
|
+
sm: {
|
25
|
+
vertical: {
|
26
|
+
image_width: "100px",
|
27
|
+
title_size: 4,
|
28
|
+
title_padding: "xxs",
|
29
|
+
description_pad: "sm",
|
30
|
+
button_size: "sm",
|
31
|
+
button_margin: "xs",
|
32
|
+
scss_class: "sm-state-vertical",
|
33
|
+
flex_direction: "column",
|
34
|
+
},
|
35
|
+
horizontal: {
|
36
|
+
image_width: "100px",
|
37
|
+
title_size: 4,
|
38
|
+
title_padding: "xxs",
|
39
|
+
description_pad: "sm",
|
40
|
+
button_size: "sm",
|
41
|
+
button_margin: "xs",
|
42
|
+
scss_class: "sm-state-horizontal",
|
43
|
+
flex_direction: "row",
|
44
|
+
},
|
45
|
+
},
|
46
|
+
md: {
|
47
|
+
vertical: {
|
48
|
+
image_width: "140px",
|
49
|
+
title_size: 3,
|
50
|
+
title_padding: "xs",
|
51
|
+
description_pad: "md",
|
52
|
+
button_size: "md",
|
53
|
+
button_margin: "sm",
|
54
|
+
scss_class: "md-state-vertical",
|
55
|
+
flex_direction: "column",
|
56
|
+
},
|
57
|
+
horizontal: {
|
58
|
+
image_width: "140px",
|
59
|
+
title_size: 3,
|
60
|
+
title_padding: "xs",
|
61
|
+
description_pad: "md",
|
62
|
+
button_size: "md",
|
63
|
+
button_margin: "sm",
|
64
|
+
scss_class: "md-state-horizontal",
|
65
|
+
flex_direction: "row",
|
66
|
+
},
|
67
|
+
},
|
68
|
+
lg: {
|
69
|
+
vertical: {
|
70
|
+
image_width: "100%",
|
71
|
+
title_size: 1,
|
72
|
+
title_padding: "sm",
|
73
|
+
description_pad: "lg",
|
74
|
+
button_size: "md",
|
75
|
+
button_margin: "md",
|
76
|
+
scss_class: "lg-state-vertical",
|
77
|
+
flex_direction: "column",
|
78
|
+
},
|
79
|
+
horizontal: {
|
80
|
+
image_width: "100%",
|
81
|
+
title_size: 2,
|
82
|
+
title_padding: "sm",
|
83
|
+
description_pad: "lg",
|
84
|
+
button_size: "md",
|
85
|
+
button_margin: "md",
|
86
|
+
scss_class: "lg-state-horizontal",
|
87
|
+
flex_direction: "row",
|
88
|
+
},
|
89
|
+
},
|
90
|
+
}.freeze
|
91
|
+
|
92
|
+
def classname
|
93
|
+
generate_classname("pb_empty_state_kit")
|
94
|
+
end
|
95
|
+
|
96
|
+
def config
|
97
|
+
SIZE_CONFIGS[size.to_sym][orientation.to_sym]
|
98
|
+
end
|
99
|
+
|
100
|
+
def default_image_data_uri
|
101
|
+
svg_path = __dir__.then { |d| File.join(d, "docs", "default_image", "computer_fly_no_branding.svg") }
|
102
|
+
svg = File.read(svg_path)
|
103
|
+
encoded = ERB::Util.url_encode(svg)
|
104
|
+
"data:image/svg+xml,#{encoded}"
|
105
|
+
end
|
106
|
+
|
107
|
+
def padding_size
|
108
|
+
size == "sm" ? "xs" : "xl"
|
109
|
+
end
|
110
|
+
|
111
|
+
def flex_align
|
112
|
+
case alignment
|
113
|
+
when "left"
|
114
|
+
"start"
|
115
|
+
when "right"
|
116
|
+
"end"
|
117
|
+
else
|
118
|
+
"center"
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
@@ -23,35 +23,39 @@
|
|
23
23
|
@mixin error-state-right-side-select-kit {
|
24
24
|
&:has(.pb_text_input_kit:not(.error)):has(.pb_text_input_kit_label):has(.pb_select_kit_wrapper.error),
|
25
25
|
&:has(.pb_text_input_kit.error):has(.pb_text_input_kit_label):has(.pb_select_kit_wrapper) {
|
26
|
-
|
27
|
-
|
28
|
-
.pb_select_kit_wrapper {
|
29
|
-
padding-top: $space_md;
|
30
|
-
margin-top: 2px;
|
26
|
+
&:not(:has(.pb_phone_number_input)) {
|
27
|
+
align-items: flex-start;
|
31
28
|
|
32
|
-
.
|
29
|
+
.pb_select_kit_wrapper {
|
33
30
|
padding-top: $space_md;
|
31
|
+
margin-top: 2px;
|
32
|
+
|
33
|
+
.pb_select_kit_caret {
|
34
|
+
padding-top: $space_md;
|
35
|
+
}
|
34
36
|
}
|
35
|
-
}
|
36
37
|
|
37
|
-
|
38
|
-
|
39
|
-
|
38
|
+
.pb_select_kit_wrapper.error {
|
39
|
+
padding-top: $space_md;
|
40
|
+
margin-top: 2px;
|
40
41
|
|
41
|
-
|
42
|
-
|
42
|
+
.pb_select_kit_caret {
|
43
|
+
padding-top: $space_xl;
|
44
|
+
}
|
43
45
|
}
|
44
46
|
}
|
45
47
|
}
|
46
48
|
}
|
47
49
|
|
48
50
|
@mixin error-state-left-side-select-kit {
|
49
|
-
&:has(.pb_select_kit_label):has(.pb_select_kit_wrapper):has(.
|
50
|
-
|
51
|
+
&:has(.pb_select_kit_label):has(.pb_select_kit_wrapper):has(.pb_text_input_kit.error) {
|
52
|
+
&:not(:has(.pb_phone_number_input)) {
|
53
|
+
align-items: flex-start;
|
51
54
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
+
.pb_text_input_kit.error {
|
56
|
+
padding-top: $space_md;
|
57
|
+
margin-top: 2px;
|
58
|
+
}
|
55
59
|
}
|
56
60
|
}
|
57
|
-
}
|
61
|
+
}
|
@@ -13,6 +13,7 @@ import MessageMention from './_message_mention'
|
|
13
13
|
|
14
14
|
type MessageProps = {
|
15
15
|
aria: { [key: string]: string },
|
16
|
+
avatarGrayscale?: boolean,
|
16
17
|
avatarName?: string,
|
17
18
|
avatarStatus?: "away" | "offline" | "online",
|
18
19
|
avatarUrl?: string,
|
@@ -32,6 +33,7 @@ type MessageProps = {
|
|
32
33
|
const Message = (props: MessageProps) => {
|
33
34
|
const {
|
34
35
|
aria = {},
|
36
|
+
avatarGrayscale = false,
|
35
37
|
avatarName,
|
36
38
|
avatarStatus = null,
|
37
39
|
avatarUrl,
|
@@ -71,6 +73,7 @@ const Message = (props: MessageProps) => {
|
|
71
73
|
>
|
72
74
|
{shouldDisplayAvatar &&
|
73
75
|
<Avatar
|
76
|
+
grayscale={avatarGrayscale}
|
74
77
|
imageUrl={avatarUrl}
|
75
78
|
name={avatarName}
|
76
79
|
size="xs"
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<%= pb_rails("message", props: {
|
2
|
+
label: "Mike Bishop",
|
3
|
+
message: "So long, and thanks for all the fish!",
|
4
|
+
timestamp: "3 months ago",
|
5
|
+
avatar_name: "Mike Bishop",
|
6
|
+
avatar_url: "https://randomuser.me/api/portraits/men/50.jpg",
|
7
|
+
avatar_status: "offline",
|
8
|
+
avatar_grayscale: true,
|
9
|
+
}) %>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
import React from "react"
|
2
|
+
|
3
|
+
import Message from "../_message"
|
4
|
+
|
5
|
+
const MessageGrayscale = (props) => {
|
6
|
+
return (
|
7
|
+
<Message
|
8
|
+
avatarGrayscale
|
9
|
+
avatarName='Mike Bishop'
|
10
|
+
avatarStatus='offline'
|
11
|
+
avatarUrl='https://randomuser.me/api/portraits/men/50.jpg'
|
12
|
+
borderRadius='rounded'
|
13
|
+
label='Mike Bishop'
|
14
|
+
message='So long, and thanks for all the fish!'
|
15
|
+
timestamp='3 months ago'
|
16
|
+
{...props}
|
17
|
+
/>
|
18
|
+
)
|
19
|
+
}
|
20
|
+
|
21
|
+
export default MessageGrayscale
|
@@ -5,12 +5,14 @@ examples:
|
|
5
5
|
- message_timestamp: With Timestamp Hover
|
6
6
|
- message_hover: Hover
|
7
7
|
- message_mentions: Mentions
|
8
|
+
- message_grayscale: Grayscale Avatar
|
8
9
|
|
9
10
|
react:
|
10
11
|
- message_default: Default
|
11
12
|
- message_timestamp: With Timestamp Hover
|
12
13
|
- message_hover: Hover
|
13
14
|
- message_mentions: Mentions
|
15
|
+
- message_grayscale: Grayscale Avatar
|
14
16
|
|
15
17
|
swift:
|
16
18
|
- message_default_swift: Default
|
@@ -2,3 +2,4 @@ export { default as MessageDefault } from './_message_default.jsx'
|
|
2
2
|
export { default as MessageTimestamp } from './_message_timestamp.jsx'
|
3
3
|
export { default as MessageHover } from './_message_hover.jsx'
|
4
4
|
export { default as MessageMentions } from './_message_mentions.jsx'
|
5
|
+
export { default as MessageGrayscale } from './_message_grayscale.jsx'
|
@@ -78,7 +78,8 @@ $overlay_colors: (
|
|
78
78
|
&.overlay-hide-scrollbar {
|
79
79
|
& [class*="overflow_x_auto"],
|
80
80
|
& [class*="overflow_y_auto"],
|
81
|
-
& [class*="overflow_auto"]
|
81
|
+
& [class*="overflow_auto"],
|
82
|
+
.overlay_token_container {
|
82
83
|
&::-webkit-scrollbar {
|
83
84
|
display: none !important;
|
84
85
|
}
|
@@ -30,7 +30,7 @@ const OverlayToken = (props: OverlayChildrenProps) => {
|
|
30
30
|
if (container) {
|
31
31
|
const { scrollLeft, scrollWidth, clientWidth } = container;
|
32
32
|
const atStart = scrollLeft === 0;
|
33
|
-
const atEnd = scrollLeft + clientWidth >= scrollWidth - 1;
|
33
|
+
const atEnd = scrollLeft + clientWidth >= scrollWidth - 1;
|
34
34
|
|
35
35
|
setIsAtStart(atStart);
|
36
36
|
setIsAtEnd(atEnd);
|
@@ -64,16 +64,17 @@ const OverlayToken = (props: OverlayChildrenProps) => {
|
|
64
64
|
return (
|
65
65
|
<>
|
66
66
|
<div className={dynamic ? isAtStart ? '' : previousOverlayClassName : previousOverlayClassName} />
|
67
|
-
{dynamic ?
|
67
|
+
{dynamic ?
|
68
68
|
<div
|
69
|
+
className="overlay_token_container"
|
69
70
|
ref={scrollContainerRef}
|
70
71
|
style={{
|
71
|
-
overflowX: 'auto',
|
72
|
+
overflowX: 'auto',
|
72
73
|
}}
|
73
74
|
>
|
74
75
|
{children}
|
75
76
|
</div>
|
76
|
-
:
|
77
|
+
:
|
77
78
|
children
|
78
79
|
}
|
79
80
|
{hasSubsequentOverlay &&
|
@@ -39,6 +39,9 @@ $flag-min-resolution: 192dpi;
|
|
39
39
|
color: $charcoal;
|
40
40
|
}
|
41
41
|
|
42
|
+
.iti__country-list {
|
43
|
+
min-width: $dropdown-min-width;
|
44
|
+
}
|
42
45
|
// iti-spacer-horizontal's default is 8px, or $space_xs
|
43
46
|
.iti__country-list .iti__flag, .iti__country-name {
|
44
47
|
margin-right: $space_xs;
|
@@ -227,6 +230,16 @@ $flag-min-resolution: 192dpi;
|
|
227
230
|
.iti__dropdown-content {
|
228
231
|
border-radius: $space_xs;
|
229
232
|
border: 1px solid $border_dark !important;
|
233
|
+
.iti__search-input {
|
234
|
+
background-color: $bg_dark_card;
|
235
|
+
&:hover {
|
236
|
+
background-color: $bg_dark_card;
|
237
|
+
}
|
238
|
+
&:active,
|
239
|
+
&:focus {
|
240
|
+
background-color: $card_dark;
|
241
|
+
}
|
242
|
+
}
|
230
243
|
}
|
231
244
|
|
232
245
|
.iti__divider {
|
@@ -37,6 +37,7 @@ type PhoneNumberInputProps = {
|
|
37
37
|
required?: boolean,
|
38
38
|
value?: string,
|
39
39
|
formatAsYouType?: boolean,
|
40
|
+
countrySearch?: boolean,
|
40
41
|
}
|
41
42
|
|
42
43
|
enum ValidationError {
|
@@ -91,6 +92,7 @@ const PhoneNumberInput = (props: PhoneNumberInputProps, ref?: React.MutableRefOb
|
|
91
92
|
preferredCountries = [],
|
92
93
|
value = "",
|
93
94
|
formatAsYouType = false,
|
95
|
+
countrySearch = false,
|
94
96
|
} = props
|
95
97
|
|
96
98
|
const ariaProps = buildAriaProps(aria)
|
@@ -242,7 +244,7 @@ const PhoneNumberInput = (props: PhoneNumberInputProps, ref?: React.MutableRefOb
|
|
242
244
|
autoInsertDialCode: false,
|
243
245
|
initialCountry: initialCountry || fallbackCountry,
|
244
246
|
onlyCountries,
|
245
|
-
countrySearch:
|
247
|
+
countrySearch: countrySearch,
|
246
248
|
fixDropdownWidth: false,
|
247
249
|
formatAsYouType: formatAsYouType,
|
248
250
|
hiddenInput: hiddenInputs ? () => ({
|
@@ -0,0 +1,20 @@
|
|
1
|
+
import React from 'react'
|
2
|
+
import PhoneNumberInput from '../_phone_number_input'
|
3
|
+
|
4
|
+
const PhoneNumberInputCountrySearch = (props) => (
|
5
|
+
<>
|
6
|
+
<PhoneNumberInput
|
7
|
+
countrySearch
|
8
|
+
id='country-search'
|
9
|
+
{...props}
|
10
|
+
/>
|
11
|
+
<PhoneNumberInput
|
12
|
+
countrySearch
|
13
|
+
id='country-search-limited'
|
14
|
+
onlyCountries={["br", "us", "ph", "gb"]}
|
15
|
+
{...props}
|
16
|
+
/>
|
17
|
+
</>
|
18
|
+
)
|
19
|
+
|
20
|
+
export default PhoneNumberInputCountrySearch
|
@@ -0,0 +1 @@
|
|
1
|
+
Set `country_search` / `countrySearch` to true to allow users to search for a specific Country within the dropdown. If the range of countries has been limited, only the selected countries will be searchable.
|
@@ -9,6 +9,7 @@ examples:
|
|
9
9
|
- phone_number_input_clear_field: Clearing the Input Field
|
10
10
|
- phone_number_input_access_input_element: Accessing the Input Element
|
11
11
|
- phone_number_input_format: Format as You Type
|
12
|
+
- phone_number_input_country_search: Country Search
|
12
13
|
|
13
14
|
rails:
|
14
15
|
- phone_number_input_default: Default
|
@@ -18,4 +19,5 @@ examples:
|
|
18
19
|
- phone_number_input_validation: Form Validation
|
19
20
|
- phone_number_input_format: Format as You Type
|
20
21
|
- phone_number_input_hidden_inputs: Hidden Inputs
|
22
|
+
- phone_number_input_country_search: Country Search
|
21
23
|
|
@@ -6,3 +6,4 @@ export { default as PhoneNumberInputValidation } from './_phone_number_input_val
|
|
6
6
|
export { default as PhoneNumberInputClearField } from './_phone_number_input_clear_field'
|
7
7
|
export { default as PhoneNumberInputAccessInputElement } from './_phone_number_input_access_input_element'
|
8
8
|
export { default as PhoneNumberInputFormat } from './_phone_number_input_format'
|
9
|
+
export { default as PhoneNumberInputCountrySearch } from './_phone_number_input_country_search'
|
@@ -25,6 +25,8 @@ module Playbook
|
|
25
25
|
default: false
|
26
26
|
prop :hidden_inputs, type: Playbook::Props::Boolean,
|
27
27
|
default: false
|
28
|
+
prop :country_search, type: Playbook::Props::Boolean,
|
29
|
+
default: false
|
28
30
|
|
29
31
|
def classname
|
30
32
|
generate_classname("pb_phone_number_input")
|
@@ -45,6 +47,7 @@ module Playbook
|
|
45
47
|
preferredCountries: preferred_countries,
|
46
48
|
required: required,
|
47
49
|
value: value,
|
50
|
+
countrySearch: country_search,
|
48
51
|
}
|
49
52
|
end
|
50
53
|
end
|
@@ -139,3 +139,22 @@ test("should format phone number as '555-555-5555' with formatAsYouType and 'us'
|
|
139
139
|
|
140
140
|
expect(input.value).toBe("555-555-5555");
|
141
141
|
});
|
142
|
+
|
143
|
+
test("should pass countrySearch prop to component", () => {
|
144
|
+
window.intlTelInput = jest.fn(() => ({
|
145
|
+
getSelectedCountryData: jest.fn(() => ({})),
|
146
|
+
isValidNumber: jest.fn(() => true),
|
147
|
+
getValidationError: jest.fn(() => 0),
|
148
|
+
}));
|
149
|
+
|
150
|
+
const props = {
|
151
|
+
id: testId,
|
152
|
+
countrySearch: true,
|
153
|
+
data: { testid: 'phone-input-with-search' }
|
154
|
+
};
|
155
|
+
|
156
|
+
render(<PhoneNumberInput {...props} />);
|
157
|
+
|
158
|
+
const wrapper = screen.getByTestId('phone-input-with-search');
|
159
|
+
expect(wrapper).toBeInTheDocument();
|
160
|
+
});
|
@@ -143,6 +143,16 @@
|
|
143
143
|
select {
|
144
144
|
font-size: 12px;
|
145
145
|
}
|
146
|
+
.pb_select_kit_wrapper.error {
|
147
|
+
.pb_select_kit_caret {
|
148
|
+
top: 13.7px;
|
149
|
+
}
|
150
|
+
}
|
151
|
+
}
|
152
|
+
.pb_select_kit_wrapper.error {
|
153
|
+
.pb_select_kit_caret {
|
154
|
+
top: 16.2px;
|
155
|
+
}
|
146
156
|
}
|
147
157
|
}
|
148
158
|
}
|