playbook_ui 13.25.0 → 13.26.0.pre.alpha.jasoncypretpatch12816

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 (224) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/index.js +1 -0
  3. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +14 -0
  4. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.html.erb +10 -14
  5. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_beta.html.erb +33 -0
  6. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_beta.md +24 -0
  7. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_default.md +5 -0
  8. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +2 -2
  9. data/app/pb_kits/playbook/pb_advanced_table/index.js +78 -0
  10. data/app/pb_kits/playbook/pb_advanced_table/table_body.html.erb +5 -9
  11. data/app/pb_kits/playbook/pb_advanced_table/table_body.rb +4 -2
  12. data/app/pb_kits/playbook/pb_advanced_table/table_header.html.erb +2 -6
  13. data/app/pb_kits/playbook/pb_advanced_table/table_row.html.erb +5 -8
  14. data/app/pb_kits/playbook/pb_avatar/Utilities/GetPlacementPropsHelper.tsx +44 -0
  15. data/app/pb_kits/playbook/pb_avatar/_avatar.tsx +86 -21
  16. data/app/pb_kits/playbook/pb_avatar/avatar.html.erb +26 -3
  17. data/app/pb_kits/playbook/pb_avatar/avatar.rb +41 -0
  18. data/app/pb_kits/playbook/pb_avatar/docs/_avatar_badge_component_overlay.html.erb +71 -0
  19. data/app/pb_kits/playbook/pb_avatar/docs/_avatar_badge_component_overlay.jsx +77 -0
  20. data/app/pb_kits/playbook/pb_avatar/docs/_avatar_circle_icon_component_overlay.html.erb +71 -0
  21. data/app/pb_kits/playbook/pb_avatar/docs/_avatar_circle_icon_component_overlay.jsx +77 -0
  22. data/app/pb_kits/playbook/pb_avatar/docs/_avatar_default.jsx +20 -0
  23. data/app/pb_kits/playbook/pb_avatar/docs/example.yml +4 -0
  24. data/app/pb_kits/playbook/pb_avatar/docs/index.js +2 -0
  25. data/app/pb_kits/playbook/pb_avatar_action_button/avatar_action_button.html.erb +1 -6
  26. data/app/pb_kits/playbook/pb_background/background.html.erb +2 -11
  27. data/app/pb_kits/playbook/pb_badge/badge.html.erb +1 -6
  28. data/app/pb_kits/playbook/pb_bar_graph/_bar_graph.tsx +1 -1
  29. data/app/pb_kits/playbook/pb_body/_body.tsx +1 -1
  30. data/app/pb_kits/playbook/pb_body/body.html.erb +1 -6
  31. data/app/pb_kits/playbook/pb_bread_crumbs/bread_crumb_item.html.erb +1 -6
  32. data/app/pb_kits/playbook/pb_bread_crumbs/bread_crumbs.html.erb +2 -7
  33. data/app/pb_kits/playbook/pb_button/_button.scss +1 -1
  34. data/app/pb_kits/playbook/pb_button/_button_mixins.scss +1 -0
  35. data/app/pb_kits/playbook/pb_button/button.html.erb +2 -3
  36. data/app/pb_kits/playbook/pb_button_toolbar/button_toolbar.html.erb +2 -7
  37. data/app/pb_kits/playbook/pb_caption/caption.html.erb +1 -6
  38. data/app/pb_kits/playbook/pb_card/card.html.erb +1 -7
  39. data/app/pb_kits/playbook/pb_card/card_body.html.erb +1 -6
  40. data/app/pb_kits/playbook/pb_card/card_header.html.erb +1 -6
  41. data/app/pb_kits/playbook/pb_checkbox/_checkbox.scss +49 -0
  42. data/app/pb_kits/playbook/pb_checkbox/_checkbox.tsx +3 -0
  43. data/app/pb_kits/playbook/pb_checkbox/checkbox.html.erb +1 -6
  44. data/app/pb_kits/playbook/pb_checkbox/checkbox.rb +2 -1
  45. data/app/pb_kits/playbook/pb_checkbox/checkbox.test.js +14 -0
  46. data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_disabled.html.erb +23 -0
  47. data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_disabled.jsx +29 -0
  48. data/app/pb_kits/playbook/pb_checkbox/docs/example.yml +2 -0
  49. data/app/pb_kits/playbook/pb_checkbox/docs/index.js +1 -0
  50. data/app/pb_kits/playbook/pb_circle_icon_button/circle_icon_button.html.erb +1 -6
  51. data/app/pb_kits/playbook/pb_collapsible/collapsible.html.erb +1 -6
  52. data/app/pb_kits/playbook/pb_collapsible/collapsible_content.html.erb +1 -6
  53. data/app/pb_kits/playbook/pb_collapsible/collapsible_main.html.erb +1 -7
  54. data/app/pb_kits/playbook/pb_contact/contact.html.erb +1 -6
  55. data/app/pb_kits/playbook/pb_currency/currency.html.erb +1 -6
  56. data/app/pb_kits/playbook/pb_currency/docs/_currency_alignment_swift.md +43 -0
  57. data/app/pb_kits/playbook/pb_currency/docs/_currency_props_swift.md +12 -0
  58. data/app/pb_kits/playbook/pb_currency/docs/_currency_size_swift.md +31 -0
  59. data/app/pb_kits/playbook/pb_currency/docs/example.yml +5 -0
  60. data/app/pb_kits/playbook/pb_dashboard_value/dashboard_value.html.erb +1 -6
  61. data/app/pb_kits/playbook/pb_date/date.html.erb +1 -6
  62. data/app/pb_kits/playbook/pb_date_picker/date_picker.html.erb +2 -6
  63. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_on_change.md +3 -1
  64. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_on_close.md +3 -1
  65. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_quick_pick_range_limit.md +1 -1
  66. data/app/pb_kits/playbook/pb_date_range_inline/date_range_inline.html.erb +1 -5
  67. data/app/pb_kits/playbook/pb_date_range_stacked/date_range_stacked.html.erb +1 -5
  68. data/app/pb_kits/playbook/pb_date_range_stacked/docs/_date_range_stacked_default_swift.md +14 -0
  69. data/app/pb_kits/playbook/pb_date_range_stacked/docs/_date_range_stacked_props_swift.md +9 -0
  70. data/app/pb_kits/playbook/pb_date_range_stacked/docs/example.yml +4 -0
  71. data/app/pb_kits/playbook/pb_date_stacked/date_stacked.html.erb +1 -5
  72. data/app/pb_kits/playbook/pb_date_time/date_time.html.erb +1 -6
  73. data/app/pb_kits/playbook/pb_date_time_stacked/date_time_stacked.html.erb +1 -7
  74. data/app/pb_kits/playbook/pb_date_year_stacked/date_year_stacked.html.erb +1 -5
  75. data/app/pb_kits/playbook/pb_detail/detail.html.erb +1 -6
  76. data/app/pb_kits/playbook/pb_dialog/_dialog.scss +4 -2
  77. data/app/pb_kits/playbook/pb_dialog/dialog.html.erb +1 -6
  78. data/app/pb_kits/playbook/pb_dialog/dialog_body.html.erb +2 -7
  79. data/app/pb_kits/playbook/pb_dialog/dialog_footer.html.erb +1 -5
  80. data/app/pb_kits/playbook/pb_dialog/dialog_header.html.erb +2 -6
  81. data/app/pb_kits/playbook/pb_dropdown/_dropdown.scss +100 -34
  82. data/app/pb_kits/playbook/pb_dropdown/_dropdown.tsx +93 -26
  83. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default.jsx +4 -22
  84. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default.md +1 -0
  85. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_subcomponent_structure.jsx +42 -0
  86. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_subcomponent_structure.md +7 -0
  87. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete.jsx +84 -0
  88. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete.md +1 -0
  89. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_and_custom_display.jsx +101 -0
  90. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_and_custom_display.md +1 -0
  91. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display.jsx +5 -3
  92. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display.md +5 -0
  93. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_options.jsx +6 -9
  94. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_options.md +1 -0
  95. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_padding.jsx +48 -0
  96. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_padding.md +1 -0
  97. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_trigger.jsx +5 -5
  98. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_trigger.md +1 -0
  99. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_external_control.jsx +59 -0
  100. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_hook.jsx +72 -0
  101. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_label.jsx +39 -0
  102. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_label.md +1 -0
  103. data/app/pb_kits/playbook/pb_dropdown/docs/example.yml +7 -0
  104. data/app/pb_kits/playbook/pb_dropdown/docs/index.js +7 -0
  105. data/app/pb_kits/playbook/pb_dropdown/dropdown.test.jsx +200 -10
  106. data/app/pb_kits/playbook/pb_dropdown/hooks/useDropdown.tsx +2 -2
  107. data/app/pb_kits/playbook/pb_dropdown/hooks/useHandleOnKeydown.tsx +14 -9
  108. data/app/pb_kits/playbook/pb_dropdown/scss_partials/_dropdown_animation.scss +18 -0
  109. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownContainer.tsx +22 -8
  110. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownOption.tsx +56 -29
  111. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownTrigger.tsx +130 -68
  112. data/app/pb_kits/playbook/pb_dropdown/utilities/clickOutsideHelper.tsx +41 -0
  113. data/app/pb_kits/playbook/pb_dropdown/utilities/index.ts +2 -0
  114. data/app/pb_kits/playbook/pb_dropdown/utilities/subComponentHelper.tsx +9 -7
  115. data/app/pb_kits/playbook/pb_file_upload/file_upload.html.erb +1 -6
  116. data/app/pb_kits/playbook/pb_filter/filter.html.erb +1 -5
  117. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/fixed_confirmation_toast.html.erb +1 -6
  118. data/app/pb_kits/playbook/pb_flex/flex.html.erb +1 -5
  119. data/app/pb_kits/playbook/pb_flex/flex_item.html.erb +2 -6
  120. data/app/pb_kits/playbook/pb_form_group/form_group.html.erb +1 -6
  121. data/app/pb_kits/playbook/pb_form_pill/form_pill.html.erb +1 -1
  122. data/app/pb_kits/playbook/pb_hashtag/hashtag.html.erb +1 -6
  123. data/app/pb_kits/playbook/pb_highlight/highlight.html.erb +1 -5
  124. data/app/pb_kits/playbook/pb_home_address_street/home_address_street.html.erb +1 -5
  125. data/app/pb_kits/playbook/pb_icon_circle/icon_circle.html.erb +2 -7
  126. data/app/pb_kits/playbook/pb_icon_stat_value/icon_stat_value.html.erb +1 -6
  127. data/app/pb_kits/playbook/pb_icon_value/icon_value.html.erb +1 -6
  128. data/app/pb_kits/playbook/pb_label_pill/label_pill.html.erb +1 -6
  129. data/app/pb_kits/playbook/pb_label_value/label_value.html.erb +1 -6
  130. data/app/pb_kits/playbook/pb_layout/body.html.erb +1 -5
  131. data/app/pb_kits/playbook/pb_layout/footer.html.erb +1 -5
  132. data/app/pb_kits/playbook/pb_layout/header.html.erb +1 -5
  133. data/app/pb_kits/playbook/pb_layout/item.html.erb +1 -5
  134. data/app/pb_kits/playbook/pb_layout/layout.html.erb +1 -5
  135. data/app/pb_kits/playbook/pb_layout/sidebar.html.erb +1 -5
  136. data/app/pb_kits/playbook/pb_list/item.html.erb +2 -8
  137. data/app/pb_kits/playbook/pb_list/list.html.erb +2 -8
  138. data/app/pb_kits/playbook/pb_loading_inline/_loading_inline.tsx +3 -1
  139. data/app/pb_kits/playbook/pb_loading_inline/docs/_loading_inline_custom.html.erb +13 -0
  140. data/app/pb_kits/playbook/pb_loading_inline/docs/_loading_inline_custom.jsx +26 -0
  141. data/app/pb_kits/playbook/pb_loading_inline/docs/{_loading_inline_light.html.erb → _loading_inline_default.html.erb} +2 -2
  142. data/app/pb_kits/playbook/pb_loading_inline/docs/{_loading_inline_light.jsx → _loading_inline_default.jsx} +2 -2
  143. data/app/pb_kits/playbook/pb_loading_inline/docs/example.yml +4 -2
  144. data/app/pb_kits/playbook/pb_loading_inline/docs/index.js +2 -1
  145. data/app/pb_kits/playbook/pb_loading_inline/loading_inline.html.erb +2 -7
  146. data/app/pb_kits/playbook/pb_loading_inline/loading_inline.rb +1 -0
  147. data/app/pb_kits/playbook/pb_loading_inline/loading_inline.test.js +14 -0
  148. data/app/pb_kits/playbook/pb_message/message.html.erb +1 -6
  149. data/app/pb_kits/playbook/pb_message/message_mention.html.erb +1 -6
  150. data/app/pb_kits/playbook/pb_multi_level_select/multi_level_select.html.erb +1 -6
  151. data/app/pb_kits/playbook/pb_multiple_users/multiple_users.html.erb +1 -6
  152. data/app/pb_kits/playbook/pb_multiple_users_stacked/multiple_users_stacked.html.erb +1 -6
  153. data/app/pb_kits/playbook/pb_nav/item.html.erb +3 -14
  154. data/app/pb_kits/playbook/pb_nav/nav.html.erb +1 -6
  155. data/app/pb_kits/playbook/pb_online_status/online_status.html.erb +2 -6
  156. data/app/pb_kits/playbook/pb_pagination/pagination.html.erb +1 -6
  157. data/app/pb_kits/playbook/pb_passphrase/passphrase.html.erb +1 -1
  158. data/app/pb_kits/playbook/pb_person/person.html.erb +7 -12
  159. data/app/pb_kits/playbook/pb_person_contact/person_contact.html.erb +1 -6
  160. data/app/pb_kits/playbook/pb_pill/pill.html.erb +1 -6
  161. data/app/pb_kits/playbook/pb_popover/popover.html.erb +1 -6
  162. data/app/pb_kits/playbook/pb_progress_pills/progress_pills.html.erb +2 -6
  163. data/app/pb_kits/playbook/pb_progress_simple/docs/_progress_simple_flex.html.erb +3 -0
  164. data/app/pb_kits/playbook/pb_progress_simple/docs/_progress_simple_flex.jsx +16 -0
  165. data/app/pb_kits/playbook/pb_progress_simple/docs/_progress_simple_flex.md +1 -0
  166. data/app/pb_kits/playbook/pb_progress_simple/docs/example.yml +2 -0
  167. data/app/pb_kits/playbook/pb_progress_simple/docs/index.js +1 -0
  168. data/app/pb_kits/playbook/pb_progress_simple/progress_simple.html.erb +3 -6
  169. data/app/pb_kits/playbook/pb_progress_simple/progress_simple.rb +1 -1
  170. data/app/pb_kits/playbook/pb_progress_step/progress_step.html.erb +1 -5
  171. data/app/pb_kits/playbook/pb_progress_step/progress_step_item.html.erb +1 -5
  172. data/app/pb_kits/playbook/pb_radio/_radio.scss +35 -0
  173. data/app/pb_kits/playbook/pb_radio/_radio.tsx +3 -0
  174. data/app/pb_kits/playbook/pb_radio/docs/_radio_alignment.jsx +4 -1
  175. data/app/pb_kits/playbook/pb_radio/docs/_radio_default.jsx +4 -1
  176. data/app/pb_kits/playbook/pb_radio/docs/_radio_disabled.html.erb +26 -0
  177. data/app/pb_kits/playbook/pb_radio/docs/_radio_disabled.jsx +31 -0
  178. data/app/pb_kits/playbook/pb_radio/docs/_radio_error.jsx +2 -1
  179. data/app/pb_kits/playbook/pb_radio/docs/example.yml +2 -0
  180. data/app/pb_kits/playbook/pb_radio/docs/index.js +1 -0
  181. data/app/pb_kits/playbook/pb_radio/radio.html.erb +2 -8
  182. data/app/pb_kits/playbook/pb_radio/radio.rb +5 -0
  183. data/app/pb_kits/playbook/pb_radio/radio.test.js +17 -0
  184. data/app/pb_kits/playbook/pb_section_separator/_section_separator.scss +6 -2
  185. data/app/pb_kits/playbook/pb_section_separator/_section_separator_mixin.scss +11 -1
  186. data/app/pb_kits/playbook/pb_section_separator/section_separator.html.erb +1 -6
  187. data/app/pb_kits/playbook/pb_select/select.html.erb +1 -5
  188. data/app/pb_kits/playbook/pb_selectable_card/selectable_card.html.erb +1 -5
  189. data/app/pb_kits/playbook/pb_selectable_card_icon/selectable_card_icon.html.erb +1 -4
  190. data/app/pb_kits/playbook/pb_selectable_icon/selectable_icon.html.erb +1 -5
  191. data/app/pb_kits/playbook/pb_selectable_list/selectable_list.html.erb +1 -6
  192. data/app/pb_kits/playbook/pb_selectable_list/selectable_list_item.html.erb +1 -6
  193. data/app/pb_kits/playbook/pb_source/source.html.erb +1 -5
  194. data/app/pb_kits/playbook/pb_star_rating/star_rating.html.erb +1 -5
  195. data/app/pb_kits/playbook/pb_stat_change/stat_change.html.erb +1 -5
  196. data/app/pb_kits/playbook/pb_stat_value/stat_value.html.erb +1 -5
  197. data/app/pb_kits/playbook/pb_table/table.html.erb +2 -12
  198. data/app/pb_kits/playbook/pb_table/table_body.html.erb +6 -16
  199. data/app/pb_kits/playbook/pb_table/table_cell.html.erb +6 -16
  200. data/app/pb_kits/playbook/pb_table/table_head.html.erb +6 -16
  201. data/app/pb_kits/playbook/pb_table/table_header.html.erb +4 -13
  202. data/app/pb_kits/playbook/pb_table/table_row.html.erb +6 -16
  203. data/app/pb_kits/playbook/pb_textarea/textarea.html.erb +1 -5
  204. data/app/pb_kits/playbook/pb_time/time.html.erb +1 -5
  205. data/app/pb_kits/playbook/pb_time_range_inline/time_range_inline.html.erb +1 -5
  206. data/app/pb_kits/playbook/pb_time_stacked/time_stacked.html.erb +1 -5
  207. data/app/pb_kits/playbook/pb_timeline/item.html.erb +3 -7
  208. data/app/pb_kits/playbook/pb_timeline/timeline.html.erb +1 -5
  209. data/app/pb_kits/playbook/pb_timestamp/timestamp.html.erb +1 -6
  210. data/app/pb_kits/playbook/pb_title/title.html.erb +1 -6
  211. data/app/pb_kits/playbook/pb_title_count/title_count.html.erb +1 -6
  212. data/app/pb_kits/playbook/pb_title_detail/title_detail.html.erb +1 -5
  213. data/app/pb_kits/playbook/pb_toggle/toggle.html.erb +1 -6
  214. data/app/pb_kits/playbook/pb_tooltip/tooltip.html.erb +1 -5
  215. data/app/pb_kits/playbook/pb_user/user.html.erb +1 -6
  216. data/app/pb_kits/playbook/pb_user_badge/user_badge.html.erb +1 -6
  217. data/app/pb_kits/playbook/pb_weekday_stacked/weekday_stacked.html.erb +1 -6
  218. data/app/pb_kits/playbook/playbook-rails.js +3 -0
  219. data/dist/menu.yml +1 -1
  220. data/dist/playbook-rails.js +6 -6
  221. data/lib/playbook/kit_base.rb +1 -1
  222. data/lib/playbook/version.rb +2 -2
  223. metadata +48 -8
  224. data/app/pb_kits/playbook/pb_advanced_table/docs/_description.md +0 -1
@@ -0,0 +1 @@
1
+ The Dropdown can also be given a custom Trigger by passing children to the `Dropdown.Trigger` subcomponent as shown in this example. Here we are using the IconCircle kit.
@@ -0,0 +1,59 @@
1
+ import React from 'react'
2
+ import { Dropdown, useDropdown, Button } from '../../'
3
+
4
+ const DropdownWithExternalControl = (props) => {
5
+ const [isDropDownClosed, setIsDropdownClosed] = useDropdown(true);
6
+
7
+ const options = [
8
+ {
9
+ label: "United States",
10
+ value: "United States",
11
+ areaCode: "+1",
12
+ icon: "🇺🇸",
13
+ id: "United-states"
14
+ },
15
+ {
16
+ label: "Canada",
17
+ value: "Canada",
18
+ areaCode: "+1",
19
+ icon: "🇨🇦",
20
+ id: "canada"
21
+ },
22
+ {
23
+ label: "Pakistan",
24
+ value: "Pakistan",
25
+ areaCode: "+92",
26
+ icon: "🇵🇰",
27
+ id: "pakistan"
28
+ }
29
+ ];
30
+
31
+ return (
32
+ <div>
33
+ <Button
34
+ data={{dropdown:'pb-dropdown-trigger'}}
35
+ marginBottom='sm'
36
+ onClick={() => setIsDropdownClosed(!isDropDownClosed)}
37
+ padding="none"
38
+ tabIndex={0}
39
+ variant="link"
40
+ >
41
+ {isDropDownClosed ? "Open Dropdown" : "Close Dropdown"}
42
+ </Button>
43
+
44
+ <Dropdown
45
+ isClosed={isDropDownClosed}
46
+ options={options}
47
+ {...props}
48
+ >
49
+ {options.map((option) => (
50
+ <Dropdown.Option key={option.id}
51
+ option={option}
52
+ />
53
+ ))}
54
+ </Dropdown>
55
+ </div>
56
+ )
57
+ }
58
+
59
+ export default DropdownWithExternalControl
@@ -0,0 +1,72 @@
1
+ import React, { useRef } from 'react'
2
+ import { Dropdown, useDropdown, CircleIconButton, Icon, Body, FlexItem, Flex } from '../..'
3
+
4
+ const DropdownWithHook = (props) => {
5
+ const [isDropDownClosed, setIsDropdownClosed] = useDropdown(true);
6
+ const buttonRef = useRef(null);
7
+
8
+ const options = [
9
+ {
10
+ label: "United States",
11
+ value: "United States",
12
+ areaCode: "+1",
13
+ icon: "🇺🇸",
14
+ id: "United-states"
15
+ },
16
+ {
17
+ label: "Canada",
18
+ value: "Canada",
19
+ areaCode: "+1",
20
+ icon: "🇨🇦",
21
+ id: "canada"
22
+ },
23
+ {
24
+ label: "Pakistan",
25
+ value: "Pakistan",
26
+ areaCode: "+92",
27
+ icon: "🇵🇰",
28
+ id: "pakistan"
29
+ }
30
+ ];
31
+
32
+ return (
33
+ <div>
34
+ <CircleIconButton
35
+ htmlOptions={{ref: buttonRef}}
36
+ icon={"flag"}
37
+ onClick={() => setIsDropdownClosed(!isDropDownClosed)}
38
+ variant="secondary"
39
+ />
40
+ <Dropdown
41
+ isClosed={isDropDownClosed}
42
+ options={options}
43
+ triggerRef={buttonRef}
44
+ {...props}
45
+ >
46
+ {options.map((option) => (
47
+ <Dropdown.Option key={option.id}
48
+ option={option}
49
+ >
50
+ <>
51
+ <FlexItem>
52
+ <Flex paddingRight='md'>
53
+ <Icon icon={option.icon}
54
+ paddingRight="xs"
55
+ />
56
+ <Body text={option.label} />
57
+ </Flex>
58
+ </FlexItem>
59
+ <FlexItem>
60
+ <Body color="light"
61
+ text={option.areaCode}
62
+ />
63
+ </FlexItem>
64
+ </>
65
+ </Dropdown.Option>
66
+ ))}
67
+ </Dropdown>
68
+ </div>
69
+ )
70
+ }
71
+
72
+ export default DropdownWithHook
@@ -0,0 +1,39 @@
1
+ import React from 'react'
2
+ import { Dropdown } from '../..'
3
+
4
+ const DropdownDefault = (props) => {
5
+
6
+ const options = [
7
+ {
8
+ label: "United States",
9
+ value: "United States",
10
+ },
11
+ {
12
+ label: "Canada",
13
+ value: "Canada",
14
+ },
15
+ {
16
+ label: "Pakistan",
17
+ value: "Pakistan",
18
+ }
19
+ ];
20
+
21
+
22
+ return (
23
+ <div>
24
+ <Dropdown
25
+ label="Select a Country"
26
+ options={options}
27
+ {...props}
28
+ >
29
+ {options.map((option) => (
30
+ <Dropdown.Option key={option.id}
31
+ option={option}
32
+ />
33
+ ))}
34
+ </Dropdown>
35
+ </div>
36
+ )
37
+ }
38
+
39
+ export default DropdownDefault
@@ -0,0 +1 @@
1
+ The optional `label` prop takes a string value that if present will render that string as the label for the Dropdown.
@@ -3,7 +3,14 @@ examples:
3
3
 
4
4
  react:
5
5
  - dropdown_default: Default
6
+ - dropdown_subcomponent_structure: Subcomponent Structure
7
+ - dropdown_with_label: With Label
6
8
  - dropdown_with_custom_options: Custom Options
7
9
  - dropdown_with_custom_display: Custom Display
8
10
  - dropdown_with_custom_trigger: Custom Trigger
11
+ - dropdown_with_custom_padding: Custom Padding for Dropdown Options
12
+ # - dropdown_with_autocomplete: Autocomplete
13
+ # - dropdown_with_autocomplete_and_custom_display: Autocomplete with Custom Display
14
+ # - dropdown_with_external_control: useDropdown Hook
15
+ # - dropdown_with_hook: useDropdown Hook with Any Trigger
9
16
 
@@ -2,3 +2,10 @@ export { default as DropdownDefault } from './_dropdown_default.jsx'
2
2
  export { default as DropdownWithCustomDisplay } from './_dropdown_with_custom_display.jsx'
3
3
  export { default as DropdownWithCustomOptions } from './_dropdown_with_custom_options.jsx'
4
4
  export { default as DropdownWithCustomTrigger } from './_dropdown_with_custom_trigger.jsx'
5
+ export { default as DropdownWithAutocomplete } from './_dropdown_with_autocomplete.jsx'
6
+ export { default as DropdownWithAutocompleteAndCustomDisplay } from './_dropdown_with_autocomplete_and_custom_display.jsx'
7
+ export { default as DropdownWithCustomPadding } from './_dropdown_with_custom_padding.jsx'
8
+ export { default as DropdownWithLabel } from './_dropdown_with_label.jsx'
9
+ export { default as DropdownWithExternalControl } from './_dropdown_with_external_control.jsx'
10
+ export { default as DropdownWithHook } from './_dropdown_with_hook.jsx'
11
+ export { default as DropdownSubcomponentStructure } from './_dropdown_subcomponent_structure.jsx'
@@ -1,17 +1,207 @@
1
- import { renderKit } from '../utilities/test-utils'
1
+ import React from "react"
2
+ import { render, screen } from "../utilities/test-utils"
2
3
 
3
- import { Dropdown } from '../'
4
+ import { Dropdown, Icon } from '../'
4
5
 
5
- /* See these resources for more testing info:
6
- - https://github.com/testing-library/jest-dom#usage for useage and examples
7
- - https://jestjs.io/docs/en/using-matchers
8
- */
9
6
 
10
- test('generated scaffold test - update me', () => {
11
- const props = {
12
- data: { testid: 'default' }
7
+ const testId = 'dropdown'
8
+
9
+ const options = [
10
+ {
11
+ label: "United States",
12
+ value: "United States",
13
+ areaCode: "+1",
14
+ icon: "🇺🇸",
15
+ id: "United-states"
16
+ },
17
+ {
18
+ label: "Canada",
19
+ value: "Canada",
20
+ areaCode: "+1",
21
+ icon: "🇨🇦",
22
+ id: "canada"
23
+ },
24
+ {
25
+ label: "Pakistan",
26
+ value: "Pakistan",
27
+ areaCode: "+92",
28
+ icon: "🇵🇰",
29
+ id: "pakistan"
13
30
  }
31
+ ];
32
+
33
+ const DefaultDropdownKit = () => {
34
+ return (
35
+ <Dropdown
36
+ data={{ testid: testId }}
37
+ options={options}
38
+ >
39
+ {options.map((option) => (
40
+ <Dropdown.Option key={option.id}
41
+ option={option}
42
+ />
43
+ ))}
44
+ </Dropdown>
45
+ )
46
+ }
14
47
 
15
- const kit = renderKit(Dropdown , props)
48
+ test('generated default kit and classname', () => {
49
+ render(<DefaultDropdownKit/>)
50
+
51
+ const kit = screen.getByTestId(testId)
16
52
  expect(kit).toBeInTheDocument()
53
+ expect(kit).toHaveClass('pb_dropdown')
54
+ })
55
+
56
+ test('generated default Trigger and Container when none passed in', () => {
57
+ render(<DefaultDropdownKit/>)
58
+
59
+ const kit = screen.getByTestId(testId)
60
+
61
+ const trigger = kit.querySelector('.pb_dropdown_trigger')
62
+ expect(trigger).toBeInTheDocument()
63
+
64
+ const container = kit.querySelector('.pb_dropdown_container')
65
+ expect(container).toBeInTheDocument()
66
+
67
+ const defaultTrigger = kit.querySelector('.dropdown_trigger_wrapper_select_only')
68
+ expect(defaultTrigger).toBeInTheDocument()
69
+ })
70
+
71
+ test('generated Options', () => {
72
+ render(<DefaultDropdownKit/>)
73
+
74
+ const kit = screen.getByTestId(testId)
75
+ const option = kit.querySelector('.pb_dropdown_option_list')
76
+ expect(option).toBeInTheDocument()
77
+ })
78
+
79
+ test('generated customDisplay for trigger', () => {
80
+ render (
81
+ <Dropdown
82
+ data={{ testid: testId }}
83
+ options={options}
84
+ >
85
+ <Dropdown.Trigger
86
+ customDisplay={<Icon icon="flag" />}
87
+ />
88
+ {options.map((option) => (
89
+ <Dropdown.Option key={option.id}
90
+ option={option}
91
+ />
92
+ ))}
93
+ </Dropdown>
94
+ )
95
+
96
+ const kit = screen.getByTestId(testId)
97
+ const trigger = kit.querySelector('.pb_dropdown_trigger')
98
+ const customDisplay = trigger.querySelector('.fa-flag.pb_icon_kit.fa-fw')
99
+ expect(customDisplay).toBeInTheDocument()
17
100
  })
101
+
102
+ test('generated placeholder prop', () => {
103
+ render (
104
+ <Dropdown
105
+ data={{ testid: testId }}
106
+ options={options}
107
+ >
108
+ <Dropdown.Trigger
109
+ placeholder="Select a country"
110
+ />
111
+ {options.map((option) => (
112
+ <Dropdown.Option key={option.id}
113
+ option={option}
114
+ />
115
+ ))}
116
+ </Dropdown>
117
+ )
118
+
119
+ const kit = screen.getByTestId(testId)
120
+ const trigger = kit.querySelector('.pb_dropdown_trigger')
121
+ expect(trigger).toHaveTextContent('Select a country')
122
+
123
+ })
124
+
125
+ test('generated label prop', () => {
126
+ render (
127
+ <Dropdown
128
+ data={{ testid: testId }}
129
+ label="Countries"
130
+ options={options}
131
+ >
132
+ {options.map((option) => (
133
+ <Dropdown.Option key={option.id}
134
+ option={option}
135
+ />
136
+ ))}
137
+ </Dropdown>
138
+ )
139
+
140
+ const kit = screen.getByTestId(testId)
141
+ const label = kit.querySelector('.pb_caption_kit_md')
142
+ expect(label).toHaveTextContent('Countries')
143
+ })
144
+
145
+ test('generated custom option', () => {
146
+ render (
147
+ <Dropdown
148
+ data={{ testid: testId }}
149
+ options={options}
150
+ >
151
+ {options.map((option) => (
152
+ <Dropdown.Option key={option.id}
153
+ option={option}
154
+ >
155
+ <Icon icon={option.icon} />
156
+ </Dropdown.Option>
157
+ ))}
158
+ </Dropdown>
159
+ )
160
+
161
+ const kit = screen.getByTestId(testId)
162
+ const customOption = kit.querySelector('.pb_icon_kit_emoji')
163
+ expect(customOption).toBeInTheDocument()
164
+ })
165
+
166
+ test('generated custom Trigger', () => {
167
+ render (
168
+ <Dropdown
169
+ data={{ testid: testId }}
170
+ options={options}
171
+ >
172
+ <Dropdown.Trigger>
173
+ <Icon icon="home" />
174
+ </Dropdown.Trigger>
175
+ {options.map((option) => (
176
+ <Dropdown.Option key={option.id}
177
+ option={option}
178
+ />
179
+ ))}
180
+ </Dropdown>
181
+ )
182
+
183
+ const kit = screen.getByTestId(testId)
184
+ const trigger = kit.querySelector('.pb_dropdown_trigger')
185
+ const customTrigger = trigger.querySelector('.fa-home.pb_icon_kit.fa-fw')
186
+ expect(customTrigger).toBeInTheDocument()
187
+ })
188
+
189
+ test('selected option on click', () => {
190
+ render (
191
+ <Dropdown
192
+ data={{ testid: testId }}
193
+ options={options}
194
+ >
195
+ {options.map((option) => (
196
+ <Dropdown.Option key={option.id}
197
+ option={option}
198
+ />
199
+ ))}
200
+ </Dropdown>
201
+ )
202
+
203
+ const kit = screen.getByTestId(testId)
204
+ const option = kit.querySelector('.pb_dropdown_option_list')
205
+ option.click()
206
+ expect(option).toHaveClass('pb_dropdown_option_selected p_xs')
207
+ })
@@ -1,11 +1,11 @@
1
1
  import {useState} from 'react';
2
2
 
3
3
 
4
- const useDropdown = (initial=true) => {
4
+ const useDropdown = (initial= true) => {
5
5
 
6
6
  const [isDropDownClosed, setIsDropDownClosed] = useState(initial);
7
7
 
8
- const toggleDropdown = () => setIsDropDownClosed(!isDropDownClosed);
8
+ const toggleDropdown = () => setIsDropDownClosed((prev) => !prev);
9
9
 
10
10
  return [
11
11
  isDropDownClosed,
@@ -6,16 +6,21 @@ export const useHandleOnKeyDown = () => {
6
6
 
7
7
  const {
8
8
  autocomplete,
9
- focusedOptionIndex,
10
9
  filteredOptions,
11
- setFocusedOptionIndex,
10
+ focusedOptionIndex,
11
+ handleBackspace,
12
12
  handleOptionClick,
13
+ selected,
14
+ setFocusedOptionIndex,
13
15
  setIsDropDownClosed,
14
- handleBackspace,
15
- selected
16
16
  }= useContext(DropdownContext)
17
17
 
18
18
  return (e: React.KeyboardEvent) => {
19
+
20
+ if (e.key !== "Tab" && autocomplete && selected && selected.label) {
21
+ handleBackspace();
22
+ }
23
+
19
24
  switch (e.key) {
20
25
  case "Backspace":
21
26
  case "Delete":
@@ -43,13 +48,13 @@ const {
43
48
  e.preventDefault();
44
49
  handleOptionClick(filteredOptions[focusedOptionIndex]);
45
50
  setFocusedOptionIndex(-1)
51
+ } else if (focusedOptionIndex === -1) {
52
+ setIsDropDownClosed(false)
46
53
  }
47
54
  break;
48
- default:
49
- if (selected && selected.label) {
50
- e.preventDefault();
51
- handleBackspace();
52
- }
55
+ case "Tab":
56
+ setIsDropDownClosed(true);
57
+ setFocusedOptionIndex(-1)
53
58
  break;
54
59
  }
55
60
  }
@@ -0,0 +1,18 @@
1
+ @keyframes fadeIn {
2
+ from {
3
+ opacity: 0;
4
+ }
5
+
6
+ to {
7
+ opacity: 1;
8
+ }
9
+ }
10
+ @keyframes fadeOut {
11
+ from {
12
+ opacity: 1;
13
+ }
14
+
15
+ to {
16
+ opacity: 0;
17
+ }
18
+ }
@@ -4,6 +4,7 @@ import {
4
4
  buildAriaProps,
5
5
  buildCss,
6
6
  buildDataProps,
7
+ buildHtmlProps
7
8
  } from "../../utilities/props";
8
9
  import { globalProps } from "../../utilities/globalProps";
9
10
 
@@ -16,9 +17,11 @@ import Body from "../../pb_body/_body";
16
17
 
17
18
  type DropdownContainerProps = {
18
19
  aria?: { [key: string]: string };
19
- className?: string;
20
20
  children?: React.ReactChild[] | React.ReactChild;
21
+ className?: string;
22
+ dark?: boolean;
21
23
  data?: { [key: string]: string };
24
+ htmlOptions?: {[key: string]: string | number | boolean | (() => void)},
22
25
  id?: string;
23
26
  searchbar?: boolean;
24
27
  };
@@ -26,24 +29,29 @@ type DropdownContainerProps = {
26
29
  const DropdownContainer = (props: DropdownContainerProps) => {
27
30
  const {
28
31
  aria = {},
29
- className,
30
32
  children,
33
+ className,
34
+ dark = false,
31
35
  data = {},
36
+ htmlOptions = {},
32
37
  id,
33
38
  searchbar = false,
34
39
  } = props;
35
40
 
36
41
  const {
37
- isDropDownClosed,
38
- handleChange,
39
- filterItem,
42
+ dropdownContainerRef,
40
43
  filteredOptions,
44
+ filterItem,
45
+ handleChange,
41
46
  inputRef,
47
+ isDropDownClosed,
42
48
  setFocusedOptionIndex,
49
+ triggerRef
43
50
  } = useContext(DropdownContext);
44
51
 
45
52
  const ariaProps = buildAriaProps(aria);
46
53
  const dataProps = buildDataProps(data);
54
+ const htmlProps = buildHtmlProps(htmlOptions);
47
55
  const classes = classnames(
48
56
  buildCss("pb_dropdown_container"),
49
57
  `${isDropDownClosed ? "close" : "open"}`,
@@ -54,12 +62,16 @@ const DropdownContainer = (props: DropdownContainerProps) => {
54
62
  return (
55
63
  <div {...ariaProps}
56
64
  {...dataProps}
65
+ {...htmlProps}
57
66
  className={classes}
58
67
  id={id}
59
68
  onMouseEnter={() => setFocusedOptionIndex(-1)}
69
+ ref={dropdownContainerRef}
70
+ style={triggerRef ? {} : { position: "absolute"}}
60
71
  >
61
72
  {searchbar && (
62
- <TextInput paddingTop="xs"
73
+ <TextInput dark={dark}
74
+ paddingTop="xs"
63
75
  paddingX="xs"
64
76
  >
65
77
  <input
@@ -70,9 +82,10 @@ const DropdownContainer = (props: DropdownContainerProps) => {
70
82
  />
71
83
  </TextInput>
72
84
  )}
73
- <List>{
85
+ <List dark={dark}>
86
+ {
74
87
  filteredOptions?.length === 0 ? (
75
- <ListItem
88
+ <ListItem dark={dark}
76
89
  display="flex"
77
90
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
78
91
  // @ts-ignore
@@ -80,6 +93,7 @@ const DropdownContainer = (props: DropdownContainerProps) => {
80
93
  padding="xs"
81
94
  >
82
95
  <Body color="light"
96
+ dark={dark}
83
97
  text="no option"
84
98
  />
85
99
  </ListItem>