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.
Files changed (135) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/_playbook.scss +0 -1
  3. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_beta.md +0 -6
  4. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_no_subrows_rails.md +5 -1
  5. 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
  6. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_rails.md +3 -2
  7. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +4 -5
  8. data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +1 -1
  9. data/app/pb_kits/playbook/pb_advanced_table/flat_advanced_table.js +106 -0
  10. data/app/pb_kits/playbook/pb_advanced_table/index.js +228 -11
  11. data/app/pb_kits/playbook/pb_advanced_table/table_body.rb +9 -1
  12. data/app/pb_kits/playbook/pb_advanced_table/table_header.rb +0 -3
  13. data/app/pb_kits/playbook/pb_advanced_table/table_row.rb +1 -2
  14. data/app/pb_kits/playbook/pb_avatar/_avatar.scss +4 -0
  15. data/app/pb_kits/playbook/pb_avatar/_avatar.tsx +3 -0
  16. data/app/pb_kits/playbook/pb_avatar/avatar.html.erb +3 -3
  17. data/app/pb_kits/playbook/pb_avatar/avatar.rb +2 -0
  18. data/app/pb_kits/playbook/pb_avatar/avatar.test.js +18 -0
  19. data/app/pb_kits/playbook/pb_avatar/docs/_avatar_grayscale.html.erb +5 -0
  20. data/app/pb_kits/playbook/pb_avatar/docs/_avatar_grayscale.jsx +16 -0
  21. data/app/pb_kits/playbook/pb_avatar/docs/example.yml +2 -0
  22. data/app/pb_kits/playbook/pb_avatar/docs/index.js +1 -0
  23. data/app/pb_kits/playbook/pb_card/card.html.erb +1 -1
  24. data/app/pb_kits/playbook/pb_card/card.rb +12 -0
  25. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_error.html.erb +2 -2
  26. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones.html.erb +22 -1
  27. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones_line.html.erb +55 -0
  28. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones_line_rails.md +5 -0
  29. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones_rails.md +5 -0
  30. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_event_listeners.jsx +59 -0
  31. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_event_listeners_react.md +1 -0
  32. data/app/pb_kits/playbook/pb_draggable/docs/example.yml +2 -0
  33. data/app/pb_kits/playbook/pb_draggable/docs/index.js +2 -1
  34. data/app/pb_kits/playbook/pb_draggable/draggable_container.rb +11 -1
  35. data/app/pb_kits/playbook/pb_draggable/draggable_item.rb +11 -1
  36. data/app/pb_kits/playbook/pb_draggable/index.js +4 -2
  37. data/app/pb_kits/playbook/pb_draggable/subcomponents/DraggableItem.tsx +33 -5
  38. data/app/pb_kits/playbook/pb_dropdown/_dropdown.scss +5 -0
  39. data/app/pb_kits/playbook/pb_dropdown/_dropdown.tsx +5 -16
  40. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_error.html.erb +5 -2
  41. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete.html.erb +28 -0
  42. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete.jsx +17 -64
  43. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_with_subcomponents.html.erb +58 -0
  44. data/app/pb_kits/playbook/pb_dropdown/docs/{_dropdown_with_autocomplete_and_custom_display.jsx → _dropdown_with_autocomplete_with_subcomponents.jsx} +11 -25
  45. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_with_subcomponents.md +1 -0
  46. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_external_control.md +1 -0
  47. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search.jsx +61 -0
  48. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search.md +2 -0
  49. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search_rails.html.erb +52 -0
  50. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search_rails.md +2 -0
  51. data/app/pb_kits/playbook/pb_dropdown/docs/example.yml +7 -4
  52. data/app/pb_kits/playbook/pb_dropdown/docs/index.js +2 -2
  53. data/app/pb_kits/playbook/pb_dropdown/dropdown.html.erb +2 -2
  54. data/app/pb_kits/playbook/pb_dropdown/dropdown.rb +4 -0
  55. data/app/pb_kits/playbook/pb_dropdown/dropdown.test.jsx +45 -1
  56. data/app/pb_kits/playbook/pb_dropdown/dropdown_container.html.erb +10 -0
  57. data/app/pb_kits/playbook/pb_dropdown/dropdown_container.rb +3 -0
  58. data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.html.erb +12 -2
  59. data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.rb +3 -1
  60. data/app/pb_kits/playbook/pb_dropdown/index.js +57 -0
  61. data/app/pb_kits/playbook/pb_dropdown/keyboard_accessibility.js +26 -0
  62. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownContainer.tsx +1 -2
  63. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownTrigger.tsx +4 -4
  64. data/app/pb_kits/playbook/pb_empty_state/_empty_state.scss +8 -1
  65. data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_alignment.html.erb +27 -0
  66. data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_default.html.erb +7 -0
  67. data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_orientation.html.erb +12 -0
  68. data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_size.html.erb +23 -0
  69. data/app/pb_kits/playbook/pb_empty_state/docs/example.yml +5 -1
  70. data/app/pb_kits/playbook/pb_empty_state/empty_state.html.erb +19 -0
  71. data/app/pb_kits/playbook/pb_empty_state/empty_state.rb +123 -0
  72. data/app/pb_kits/playbook/pb_form_group/_error_state_mixin.scss +22 -18
  73. data/app/pb_kits/playbook/pb_message/_message.tsx +3 -0
  74. data/app/pb_kits/playbook/pb_message/docs/_message_grayscale.html.erb +9 -0
  75. data/app/pb_kits/playbook/pb_message/docs/_message_grayscale.jsx +21 -0
  76. data/app/pb_kits/playbook/pb_message/docs/example.yml +2 -0
  77. data/app/pb_kits/playbook/pb_message/docs/index.js +1 -0
  78. data/app/pb_kits/playbook/pb_message/message.html.erb +2 -1
  79. data/app/pb_kits/playbook/pb_message/message.rb +1 -0
  80. data/app/pb_kits/playbook/pb_overlay/_overlay.scss +2 -1
  81. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_vertical_dynamic_multi_directional.jsx +1 -1
  82. data/app/pb_kits/playbook/pb_overlay/subcomponents/_overlay_token.tsx +5 -4
  83. data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.scss +13 -0
  84. data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.tsx +3 -1
  85. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_country_search.html.erb +10 -0
  86. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_country_search.jsx +20 -0
  87. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_country_search.md +1 -0
  88. data/app/pb_kits/playbook/pb_phone_number_input/docs/example.yml +2 -0
  89. data/app/pb_kits/playbook/pb_phone_number_input/docs/index.js +1 -0
  90. data/app/pb_kits/playbook/pb_phone_number_input/phone_number_input.rb +3 -0
  91. data/app/pb_kits/playbook/pb_phone_number_input/phone_number_input.test.js +19 -0
  92. data/app/pb_kits/playbook/pb_select/_select.scss +10 -0
  93. data/app/pb_kits/playbook/pb_select/docs/_select_error.html.erb +1 -1
  94. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_custom_click.jsx +7 -7
  95. data/app/pb_kits/playbook/pb_table/subcomponents/_table_row.tsx +5 -5
  96. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_error.html.erb +1 -1
  97. data/app/pb_kits/playbook/pb_textarea/docs/_textarea_error.html.erb +5 -1
  98. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_error_state.html.erb +8 -1
  99. data/app/pb_kits/playbook/pb_user/_user.tsx +3 -0
  100. data/app/pb_kits/playbook/pb_user/docs/_user_grayscale.html.erb +6 -0
  101. data/app/pb_kits/playbook/pb_user/docs/_user_grayscale.jsx +16 -0
  102. data/app/pb_kits/playbook/pb_user/docs/example.yml +2 -0
  103. data/app/pb_kits/playbook/pb_user/docs/index.js +1 -0
  104. data/app/pb_kits/playbook/pb_user/user.html.erb +2 -1
  105. data/app/pb_kits/playbook/pb_user/user.rb +1 -0
  106. data/dist/chunks/_typeahead-D62OcwsT.js +22 -0
  107. data/dist/chunks/_weekday_stacked-Ceh9N0ow.js +45 -0
  108. data/dist/chunks/lazysizes-DHz07jlL.js +1 -0
  109. data/dist/chunks/lib-CeKZrPmu.js +29 -0
  110. data/dist/chunks/{pb_form_validation-BWjy4bFn.js → pb_form_validation-BioH7DWv.js} +1 -1
  111. data/dist/chunks/vendor.js +1 -1
  112. data/dist/menu.yml +6 -14
  113. data/dist/playbook-doc.js +2 -2
  114. data/dist/playbook-rails-react-bindings.js +1 -1
  115. data/dist/playbook-rails.js +1 -1
  116. data/dist/playbook.css +1 -1
  117. data/lib/playbook/version.rb +1 -1
  118. metadata +43 -22
  119. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_and_custom_display.md +0 -1
  120. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_hook.jsx +0 -79
  121. data/app/pb_kits/playbook/pb_gantt_chart/_gantt_chart.scss +0 -3
  122. data/app/pb_kits/playbook/pb_gantt_chart/_gantt_chart.tsx +0 -72
  123. data/app/pb_kits/playbook/pb_gantt_chart/docs/_gantt_chart_default.jsx +0 -53
  124. data/app/pb_kits/playbook/pb_gantt_chart/docs/example.yml +0 -7
  125. data/app/pb_kits/playbook/pb_gantt_chart/docs/index.js +0 -1
  126. data/app/pb_kits/playbook/pb_gantt_chart/gantt_chart.test.jsx +0 -19
  127. data/dist/chunks/_typeahead-CITBvzU7.js +0 -22
  128. data/dist/chunks/_weekday_stacked-C8-PW1nI.js +0 -45
  129. data/dist/chunks/lazysizes-B7xYodB-.js +0 -1
  130. data/dist/chunks/lib-BmTAc7Nc.js +0 -29
  131. /data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows_react.md → _advanced_table_selectable_rows.md} +0 -0
  132. /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
  133. /data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows.html.erb → _advanced_table_selectable_rows_rails.html.erb} +0 -0
  134. /data/app/pb_kits/playbook/pb_draggable/docs/{_draggable_drop_zones_line.md → _draggable_drop_zones_line_react.md} +0 -0
  135. /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={() => toggleDropdown()}
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,7 @@
1
+ <%= pb_rails("flex", props: {align: "center", justify: "center"}) 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
+ }) %>
7
+ <% 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 %>
@@ -1,5 +1,9 @@
1
1
  examples:
2
-
2
+ rails:
3
+ - empty_state_default: Default
4
+ - empty_state_size: Size
5
+ - empty_state_orientation: Orientation
6
+ - empty_state_alignment: Alignment
3
7
 
4
8
  react:
5
9
  - empty_state_default: Default
@@ -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
- align-items: flex-start;
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
- .pb_select_kit_caret {
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
- .pb_select_kit_wrapper.error {
38
- padding-top: $space_md;
39
- margin-top: 2px;
38
+ .pb_select_kit_wrapper.error {
39
+ padding-top: $space_md;
40
+ margin-top: 2px;
40
41
 
41
- .pb_select_kit_caret {
42
- padding-top: $space_xl;
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(.pb_phone_number_input):has(.pb_text_input_kit.error) {
50
- align-items: flex-start;
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
- .pb_text_input_kit.error {
53
- padding-top: $space_md;
54
- margin-top: 2px;
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'
@@ -4,7 +4,8 @@
4
4
  name: object.avatar_name,
5
5
  size: "xs",
6
6
  image_url: object.avatar_url,
7
- status: object.avatar_status
7
+ status: object.avatar_status,
8
+ grayscale: object.avatar_grayscale
8
9
  }) %>
9
10
  <% end %>
10
11
  <div class="content_wrapper">
@@ -6,6 +6,7 @@ module Playbook
6
6
  prop :avatar_name
7
7
  prop :avatar_status
8
8
  prop :avatar_url
9
+ prop :avatar_grayscale, type: Playbook::Props::Boolean, default: false
9
10
  prop :label
10
11
  prop :message
11
12
  prop :timestamp
@@ -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
  }
@@ -9,7 +9,7 @@ const InlineCardsExample = forwardRef(function InlineCardsExample(ref) {
9
9
  <Flex
10
10
  columnGap="lg"
11
11
  orientation="row"
12
- ref={ref}
12
+ ref={ref}
13
13
  >
14
14
  {Array.from({ length: 15 }, (_, index) => (
15
15
  <FlexItem key={index}>
@@ -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: false,
247
+ countrySearch: countrySearch,
246
248
  fixDropdownWidth: false,
247
249
  formatAsYouType: formatAsYouType,
248
250
  hiddenInput: hiddenInputs ? () => ({
@@ -0,0 +1,10 @@
1
+ <%= pb_rails("phone_number_input", props: {
2
+ country_search: true,
3
+ id: "country-search",
4
+ }) %>
5
+
6
+ <%= pb_rails("phone_number_input", props: {
7
+ country_search: true,
8
+ id: "country-search-limited",
9
+ only_countries: ["br", "us", "ph", "gb"],
10
+ }) %>
@@ -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
  }