playbook_ui 15.4.0 → 15.5.0.pre.alpha.draggablefix12557

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 (200) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling.jsx +2 -1
  3. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_column_headers.jsx +1 -1
  4. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_fullscreen.jsx +3 -1
  5. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_infinite_scroll.jsx +1 -1
  6. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_inline_editing.jsx +3 -1
  7. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_row_styling.jsx +2 -1
  8. data/app/pb_kits/playbook/pb_copy_button/_copy_button.tsx +21 -8
  9. data/app/pb_kits/playbook/pb_copy_button/copy_button.html.erb +6 -2
  10. data/app/pb_kits/playbook/pb_copy_button/copy_button.rb +3 -0
  11. data/app/pb_kits/playbook/pb_copy_button/copy_button.test.jsx +24 -0
  12. data/app/pb_kits/playbook/pb_copy_button/docs/_copy_button_button_variant.html.erb +9 -0
  13. data/app/pb_kits/playbook/pb_copy_button/docs/_copy_button_button_variant.jsx +24 -0
  14. data/app/pb_kits/playbook/pb_copy_button/docs/_copy_button_button_variant_rails.md +1 -0
  15. data/app/pb_kits/playbook/pb_copy_button/docs/_copy_button_button_variant_react.md +1 -0
  16. data/app/pb_kits/playbook/pb_copy_button/docs/_copy_button_default.html.erb +2 -2
  17. data/app/pb_kits/playbook/pb_copy_button/docs/_copy_button_default.jsx +1 -2
  18. data/app/pb_kits/playbook/pb_copy_button/docs/_copy_button_from.html.erb +2 -2
  19. data/app/pb_kits/playbook/pb_copy_button/docs/_copy_button_from.jsx +2 -0
  20. data/app/pb_kits/playbook/pb_copy_button/docs/example.yml +2 -0
  21. data/app/pb_kits/playbook/pb_copy_button/docs/index.js +1 -0
  22. data/app/pb_kits/playbook/pb_currency/docs/_currency_abbreviated.md +1 -0
  23. data/app/pb_kits/playbook/pb_currency/docs/_currency_matching_decimals_rails.md +1 -0
  24. data/app/pb_kits/playbook/pb_currency/docs/_currency_matching_decimals_react.md +1 -0
  25. data/app/pb_kits/playbook/pb_currency/docs/_currency_negative.html.erb +10 -0
  26. data/app/pb_kits/playbook/pb_currency/docs/_currency_negative.jsx +10 -0
  27. data/app/pb_kits/playbook/pb_currency/docs/_currency_negative.md +1 -0
  28. data/app/pb_kits/playbook/pb_currency/docs/_currency_no_symbol_rails.md +1 -0
  29. data/app/pb_kits/playbook/pb_currency/docs/_currency_no_symbol_react.md +1 -0
  30. data/app/pb_kits/playbook/pb_currency/docs/_currency_variants.html.erb +7 -0
  31. data/app/pb_kits/playbook/pb_currency/docs/_currency_variants.jsx +7 -0
  32. data/app/pb_kits/playbook/pb_currency/docs/_description.md +2 -2
  33. data/app/pb_kits/playbook/pb_date_picker/date_picker.html.erb +25 -11
  34. data/app/pb_kits/playbook/pb_date_picker/date_picker_helper.ts +44 -3
  35. data/app/pb_kits/playbook/pb_date_range_inline/_date_range_inline.tsx +20 -13
  36. data/app/pb_kits/playbook/pb_date_range_inline/date_range_inline.rb +6 -4
  37. data/app/pb_kits/playbook/pb_date_range_inline/date_range_inline.test.js +17 -0
  38. data/app/pb_kits/playbook/pb_date_range_inline/docs/_date_range_inline_show_current_year.html.erb +4 -0
  39. data/app/pb_kits/playbook/pb_date_range_inline/docs/_date_range_inline_show_current_year.jsx +43 -0
  40. data/app/pb_kits/playbook/pb_date_range_inline/docs/_date_range_inline_show_current_year.md +1 -0
  41. data/app/pb_kits/playbook/pb_date_range_inline/docs/_description.md +1 -1
  42. data/app/pb_kits/playbook/pb_date_range_inline/docs/example.yml +3 -2
  43. data/app/pb_kits/playbook/pb_date_range_inline/docs/index.js +1 -0
  44. data/app/pb_kits/playbook/pb_date_stacked/_date_stacked.tsx +6 -4
  45. data/app/pb_kits/playbook/pb_date_stacked/date_stacked.html.erb +2 -3
  46. data/app/pb_kits/playbook/pb_date_stacked/date_stacked.rb +11 -5
  47. data/app/pb_kits/playbook/pb_date_stacked/date_stacked.test.js +26 -9
  48. data/app/pb_kits/playbook/pb_date_stacked/docs/_date_stacked_current_year.html.erb +12 -0
  49. data/app/pb_kits/playbook/pb_date_stacked/docs/{_date_stacked_not_current_year.jsx → _date_stacked_current_year.jsx} +6 -5
  50. data/app/pb_kits/playbook/pb_date_stacked/docs/_date_stacked_current_year.md +1 -0
  51. data/app/pb_kits/playbook/pb_date_stacked/docs/_date_stacked_default.html.erb +1 -1
  52. data/app/pb_kits/playbook/pb_date_stacked/docs/_date_stacked_default.jsx +1 -1
  53. data/app/pb_kits/playbook/pb_date_stacked/docs/_description.md +1 -1
  54. data/app/pb_kits/playbook/pb_date_stacked/docs/example.yml +2 -2
  55. data/app/pb_kits/playbook/pb_date_stacked/docs/index.js +1 -1
  56. data/app/pb_kits/playbook/pb_date_time/_date_time.tsx +3 -0
  57. data/app/pb_kits/playbook/pb_date_time/date_time.html.erb +1 -0
  58. data/app/pb_kits/playbook/pb_date_time/date_time.rb +1 -0
  59. data/app/pb_kits/playbook/pb_date_time/docs/_date_time_show_current_year.html.erb +4 -0
  60. data/app/pb_kits/playbook/pb_date_time/docs/_date_time_show_current_year.jsx +14 -0
  61. data/app/pb_kits/playbook/pb_date_time/docs/_date_time_show_current_year_rails.md +1 -0
  62. data/app/pb_kits/playbook/pb_date_time/docs/_date_time_show_current_year_react.md +1 -0
  63. data/app/pb_kits/playbook/pb_date_time/docs/example.yml +3 -1
  64. data/app/pb_kits/playbook/pb_date_time/docs/index.js +1 -0
  65. data/app/pb_kits/playbook/pb_date_time_stacked/_date_time_stacked.tsx +3 -0
  66. data/app/pb_kits/playbook/pb_date_time_stacked/date_time_stacked.html.erb +2 -2
  67. data/app/pb_kits/playbook/pb_date_time_stacked/date_time_stacked.rb +2 -0
  68. data/app/pb_kits/playbook/pb_date_time_stacked/date_time_stacked.test.js +33 -0
  69. data/app/pb_kits/playbook/pb_date_time_stacked/docs/_date_time_stacked_show_current_year.html.erb +4 -0
  70. data/app/pb_kits/playbook/pb_date_time_stacked/docs/_date_time_stacked_show_current_year.jsx +22 -0
  71. data/app/pb_kits/playbook/pb_date_time_stacked/docs/_date_time_stacked_show_current_year.md +1 -0
  72. data/app/pb_kits/playbook/pb_date_time_stacked/docs/example.yml +3 -1
  73. data/app/pb_kits/playbook/pb_date_time_stacked/docs/index.js +1 -0
  74. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_compound_components.html.erb +2 -2
  75. data/app/pb_kits/playbook/pb_draggable/context/index.tsx +101 -4
  76. data/app/pb_kits/playbook/pb_draggable/context/types.ts +6 -3
  77. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_multiple_containers_dropzone.jsx +179 -0
  78. data/app/pb_kits/playbook/pb_draggable/docs/example.yml +1 -0
  79. data/app/pb_kits/playbook/pb_draggable/docs/index.js +2 -1
  80. data/app/pb_kits/playbook/pb_dropdown/index.js +32 -14
  81. data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_alignment.jsx +2 -1
  82. data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_default.jsx +2 -1
  83. data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_orientation.jsx +2 -1
  84. data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_size.jsx +2 -1
  85. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/_fixed_confirmation_toast.tsx +31 -9
  86. data/app/pb_kits/playbook/pb_flex/_flex_item.tsx +12 -5
  87. data/app/pb_kits/playbook/pb_flex/docs/_flex_item_example.jsx +1 -0
  88. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_wrapped.jsx +4 -1
  89. data/app/pb_kits/playbook/pb_loading_inline/docs/_loading_inline_variant.jsx +1 -1
  90. data/app/pb_kits/playbook/pb_nav/_item.tsx +18 -4
  91. data/app/pb_kits/playbook/pb_nav/_nav.scss +30 -5
  92. data/app/pb_kits/playbook/pb_nav/_nav_item.test.js +192 -0
  93. data/app/pb_kits/playbook/pb_nav/_vertical_nav.scss +1 -1
  94. data/app/pb_kits/playbook/pb_nav/docs/_horizontal_nav_disabled.html.erb +21 -0
  95. data/app/pb_kits/playbook/pb_nav/docs/_horizontal_nav_disabled.jsx +113 -0
  96. data/app/pb_kits/playbook/pb_nav/docs/_horizontal_nav_disabled.md +1 -0
  97. data/app/pb_kits/playbook/pb_nav/docs/_vertical_nav_disabled.html.erb +30 -0
  98. data/app/pb_kits/playbook/pb_nav/docs/_vertical_nav_disabled.jsx +117 -0
  99. data/app/pb_kits/playbook/pb_nav/docs/_vertical_nav_disabled.md +1 -0
  100. data/app/pb_kits/playbook/pb_nav/docs/example.yml +4 -0
  101. data/app/pb_kits/playbook/pb_nav/docs/index.js +3 -1
  102. data/app/pb_kits/playbook/pb_nav/item.html.erb +6 -4
  103. data/app/pb_kits/playbook/pb_nav/item.rb +11 -2
  104. data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_description.md +3 -1
  105. data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_pb_bar_graph_colors.jsx +1 -1
  106. data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_pb_bar_graph_default.jsx +1 -1
  107. data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_pb_bar_graph_default.md +1 -0
  108. data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_pb_bar_graph_height.jsx +1 -1
  109. data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_pb_bar_graph_horizontal.jsx +1 -1
  110. data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_pb_bar_graph_legend.jsx +1 -1
  111. data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_pb_bar_graph_legend_non_clickable.jsx +1 -2
  112. data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_pb_bar_graph_legend_position.html.erb +1 -1
  113. data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_pb_bar_graph_legend_position.jsx +1 -1
  114. data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_pb_bar_graph_legend_position.md +11 -0
  115. data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_pb_bar_graph_negative_numbers.jsx +1 -1
  116. data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_pb_bar_graph_secondary_y_axis.jsx +1 -1
  117. data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_pb_bar_graph_spline.jsx +1 -2
  118. data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_pb_bar_graph_stacked.jsx +1 -2
  119. data/app/pb_kits/playbook/pb_pb_circle_chart/docs/_description.md +3 -1
  120. data/app/pb_kits/playbook/pb_pb_circle_chart/docs/_pb_circle_chart_block_content.jsx +2 -1
  121. data/app/pb_kits/playbook/pb_pb_circle_chart/docs/_pb_circle_chart_color_overrides.jsx +2 -1
  122. data/app/pb_kits/playbook/pb_pb_circle_chart/docs/_pb_circle_chart_custom_tooltip.jsx +1 -1
  123. data/app/pb_kits/playbook/pb_pb_circle_chart/docs/_pb_circle_chart_custom_tooltip.md +2 -1
  124. data/app/pb_kits/playbook/pb_pb_circle_chart/docs/_pb_circle_chart_data_legend_position.jsx +2 -1
  125. data/app/pb_kits/playbook/pb_pb_circle_chart/docs/_pb_circle_chart_data_with_labels.jsx +1 -1
  126. data/app/pb_kits/playbook/pb_pb_circle_chart/docs/_pb_circle_chart_data_with_legend.jsx +1 -1
  127. data/app/pb_kits/playbook/pb_pb_circle_chart/docs/_pb_circle_chart_default.jsx +1 -1
  128. data/app/pb_kits/playbook/pb_pb_circle_chart/docs/_pb_circle_chart_default.md +1 -0
  129. data/app/pb_kits/playbook/pb_pb_circle_chart/docs/_pb_circle_chart_inner_sizes.jsx +1 -1
  130. data/app/pb_kits/playbook/pb_pb_circle_chart/docs/_pb_circle_chart_live_data.jsx +2 -1
  131. data/app/pb_kits/playbook/pb_pb_circle_chart/docs/_pb_circle_chart_rounded.jsx +1 -1
  132. data/app/pb_kits/playbook/pb_pb_circle_chart/docs/_pb_circle_chart_with_title.jsx +1 -1
  133. data/app/pb_kits/playbook/pb_pb_gauge_chart/docs/_description.md +3 -1
  134. data/app/pb_kits/playbook/pb_pb_gauge_chart/docs/_pb_gauge_chart_color.jsx +1 -1
  135. data/app/pb_kits/playbook/pb_pb_gauge_chart/docs/_pb_gauge_chart_color.md +2 -2
  136. data/app/pb_kits/playbook/pb_pb_gauge_chart/docs/_pb_gauge_chart_complex.jsx +2 -1
  137. data/app/pb_kits/playbook/pb_pb_gauge_chart/docs/_pb_gauge_chart_default.md +1 -0
  138. data/app/pb_kits/playbook/pb_pb_gauge_chart/docs/_pb_gauge_chart_full_circle.jsx +2 -1
  139. data/app/pb_kits/playbook/pb_pb_gauge_chart/docs/_pb_gauge_chart_height.jsx +2 -1
  140. data/app/pb_kits/playbook/pb_pb_gauge_chart/docs/_pb_gauge_chart_min_max.jsx +2 -1
  141. data/app/pb_kits/playbook/pb_pb_gauge_chart/docs/_pb_gauge_chart_units.jsx +2 -1
  142. data/app/pb_kits/playbook/pb_pb_line_graph/docs/_description.md +3 -1
  143. data/app/pb_kits/playbook/pb_pb_line_graph/docs/_pb_line_graph_colors.jsx +1 -1
  144. data/app/pb_kits/playbook/pb_pb_line_graph/docs/_pb_line_graph_default.md +1 -0
  145. data/app/pb_kits/playbook/pb_pb_line_graph/docs/_pb_line_graph_legend_position.html.erb +1 -1
  146. data/app/pb_kits/playbook/pb_popover/docs/_popover_append_to.jsx +4 -1
  147. data/app/pb_kits/playbook/pb_progress_step/_progress_step.scss +384 -262
  148. data/app/pb_kits/playbook/pb_progress_step/docs/_description.md +1 -5
  149. data/app/pb_kits/playbook/pb_progress_step/docs/_progress_step_color.html.erb +14 -0
  150. data/app/pb_kits/playbook/pb_progress_step/docs/_progress_step_color.jsx +29 -0
  151. data/app/pb_kits/playbook/pb_progress_step/docs/_progress_step_color.md +3 -0
  152. data/app/pb_kits/playbook/pb_progress_step/docs/_progress_step_custom_icon.jsx +31 -0
  153. data/app/pb_kits/playbook/pb_progress_step/docs/_progress_step_custom_icon.md +1 -0
  154. data/app/pb_kits/playbook/pb_progress_step/docs/_progress_step_default.html.erb +4 -1
  155. data/app/pb_kits/playbook/pb_progress_step/docs/_progress_step_default.jsx +14 -3
  156. data/app/pb_kits/playbook/pb_progress_step/docs/_progress_step_default.md +3 -0
  157. data/app/pb_kits/playbook/pb_progress_step/docs/_progress_step_tracker.md +3 -0
  158. data/app/pb_kits/playbook/pb_progress_step/docs/_progress_step_vertical.html.erb +1 -7
  159. data/app/pb_kits/playbook/pb_progress_step/docs/_progress_step_vertical.md +1 -0
  160. data/app/pb_kits/playbook/pb_progress_step/docs/example.yml +3 -0
  161. data/app/pb_kits/playbook/pb_progress_step/docs/index.js +2 -0
  162. data/app/pb_kits/playbook/pb_progress_step/progress_step.test.js +41 -0
  163. data/app/pb_kits/playbook/pb_radio/docs/_radio_react_hook.jsx +3 -1
  164. data/app/pb_kits/playbook/pb_select/docs/_select_react_hook.jsx +3 -1
  165. data/app/pb_kits/playbook/pb_table/_table.tsx +28 -26
  166. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_sizing.jsx +4 -1
  167. data/app/pb_kits/playbook/pb_typeahead/_typeahead.scss +4 -0
  168. data/app/pb_kits/playbook/pb_typeahead/components/MultiValue.tsx +1 -0
  169. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_react_hook.jsx +2 -1
  170. data/app/pb_kits/playbook/pb_user/docs/_user_font_options.jsx +1 -1
  171. data/app/pb_kits/playbook/utilities/_truncate.scss +2 -0
  172. data/app/pb_kits/playbook/utilities/globalProps.ts +26 -8
  173. data/app/pb_kits/playbook/utilities/test/globalProps/alignContent.test.js +18 -0
  174. data/app/pb_kits/playbook/utilities/test/globalProps/alignItems.test.js +18 -0
  175. data/app/pb_kits/playbook/utilities/test/globalProps/alignSelf.test.js +18 -0
  176. data/app/pb_kits/playbook/utilities/test/globalProps/display.test.js +18 -0
  177. data/app/pb_kits/playbook/utilities/test/globalProps/flex.test.js +18 -0
  178. data/app/pb_kits/playbook/utilities/test/globalProps/flexDirection.test.js +18 -0
  179. data/app/pb_kits/playbook/utilities/test/globalProps/flexGrow.test.js +18 -0
  180. data/app/pb_kits/playbook/utilities/test/globalProps/flexShrink.test.js +18 -0
  181. data/app/pb_kits/playbook/utilities/test/globalProps/flexWrap.test.js +18 -0
  182. data/app/pb_kits/playbook/utilities/test/globalProps/justifyContent.test.js +18 -0
  183. data/app/pb_kits/playbook/utilities/test/globalProps/justifySelf.test.js +18 -0
  184. data/app/pb_kits/playbook/utilities/test/globalProps/order.test.js +18 -0
  185. data/dist/chunks/_typeahead-LoB4DX1N.js +6 -0
  186. data/dist/chunks/lib-CgpqUb6l.js +29 -0
  187. data/dist/chunks/vendor.js +37 -1
  188. data/dist/playbook-rails-react-bindings.js +1 -1
  189. data/dist/playbook-rails.js +1 -1
  190. data/dist/playbook.css +1 -1
  191. data/lib/playbook/version.rb +2 -2
  192. metadata +47 -11
  193. data/app/pb_kits/playbook/pb_date_stacked/docs/_date_stacked_not_current_year.html.erb +0 -5
  194. data/dist/chunks/_line_graph-r__oOO2H.js +0 -1
  195. data/dist/chunks/_typeahead-B7c52zVj.js +0 -6
  196. data/dist/chunks/_weekday_stacked-DgiIj2w3.js +0 -37
  197. data/dist/chunks/componentRegistry-DzmmLR2x.js +0 -1
  198. data/dist/chunks/lib-CRUXizZe.js +0 -29
  199. data/dist/chunks/pb_form_validation-CywJN0ej.js +0 -1
  200. data/dist/playbook-doc.js +0 -19
@@ -1,7 +1,7 @@
1
1
  <%= pb_rails("button", props: { text: "Open Complex Dialog", data:{"open-dialog": "dialog-complex"} }) %>
2
2
 
3
3
  <%= pb_rails("dialog", props: { id:"dialog-complex", size: "lg", full_height: true }) do %>
4
- <form>
4
+ <%= pb_form_with(scope: :example, method: :get, url: "", options: { remote: true }) do |form| %>
5
5
  <%= pb_rails("dialog/dialog_header", props: { id: "dialog-complex" } ) do %>
6
6
  <%= pb_rails("body", props: { text: "What do you need us to take care of?" }) %>
7
7
  <% end %>
@@ -13,5 +13,5 @@
13
13
 
14
14
  <% end %>
15
15
  <%= pb_rails("dialog/dialog_footer", props: {cancel_button: "Back", confirm_button: "Send my Issue", confirm_button_id:"confirm-complex", id: "dialog-complex"}) %>
16
- </form>
16
+ <% end %>
17
17
  <% end %>
@@ -39,6 +39,56 @@ const reducer = (state: InitialStateType, action: ActionType) => {
39
39
 
40
40
  return { ...state, items: newItems };
41
41
  }
42
+ case 'REORDER_ITEMS_CROSS_CONTAINER': {
43
+ const { dragId, targetId, newContainer } = action.payload;
44
+ const newItems = [...state.items];
45
+ const draggedItem = newItems.find(item => item.id === dragId);
46
+ const draggedIndex = newItems.indexOf(draggedItem);
47
+ const targetIndex = newItems.findIndex(item => item.id === targetId);
48
+
49
+ // Update container temporarily so dropzone preview works correctly
50
+ const updatedItem = { ...draggedItem, container: newContainer };
51
+
52
+ newItems.splice(draggedIndex, 1);
53
+ newItems.splice(targetIndex, 0, updatedItem);
54
+
55
+ return { ...state, items: newItems };
56
+ }
57
+ case 'MOVE_TO_CONTAINER_END': {
58
+ const { dragId, newContainer } = action.payload;
59
+ const newItems = [...state.items];
60
+ const draggedItem = newItems.find(item => item.id === dragId);
61
+ const draggedIndex = newItems.indexOf(draggedItem);
62
+
63
+ // Update container temporarily so dropzone preview works correctly
64
+ const updatedItem = { ...draggedItem, container: newContainer };
65
+
66
+ // Remove from current position
67
+ newItems.splice(draggedIndex, 1);
68
+
69
+ // Find the last item in the target container and insert after it
70
+ const lastIndexInContainer = newItems.map(item => item.container).lastIndexOf(newContainer);
71
+ if (lastIndexInContainer === -1) {
72
+ // Container is empty, add to end
73
+ newItems.push(updatedItem);
74
+ } else {
75
+ // Insert after last item in container
76
+ newItems.splice(lastIndexInContainer + 1, 0, updatedItem);
77
+ }
78
+
79
+ return { ...state, items: newItems };
80
+ }
81
+ case 'RESET_DRAG_CONTAINER': {
82
+ const { itemId, originalContainer } = action.payload;
83
+ return {
84
+ ...state,
85
+ items: state.items.map(item =>
86
+ item.id === itemId
87
+ ? { ...item, container: originalContainer }
88
+ : item
89
+ )
90
+ };
91
+ }
42
92
  default:
43
93
  return state;
44
94
  }
@@ -103,17 +153,39 @@ export const DraggableProvider = ({
103
153
  if (state.dragData.originId !== providerId) return; // Ignore drag events from other providers
104
154
 
105
155
  if (state.dragData.id !== id) {
106
- dispatch({ type: 'REORDER_ITEMS', payload: { dragId: state.dragData.id, targetId: id } });
156
+ // Check if this is a cross-container drag
157
+ const isCrossContainer = state.dragData.initialGroup !== container;
158
+
159
+ if (isCrossContainer) {
160
+ // Use cross-container reorder to update container temporarily for dropzone preview
161
+ dispatch({ type: 'REORDER_ITEMS_CROSS_CONTAINER', payload: { dragId: state.dragData.id, targetId: id, newContainer: container } });
162
+ } else {
163
+ // Same container: use normal reorder no need to be fancy nancy
164
+ dispatch({ type: 'REORDER_ITEMS', payload: { dragId: state.dragData.id, targetId: id } });
165
+ }
107
166
  dispatch({ type: 'SET_DRAG_DATA', payload: { id: state.dragData.id, initialGroup: container, originId: providerId } });
108
167
  }
109
168
  if (onDragEnter) onDragEnter(id, container);
110
169
  };
111
170
 
112
171
  const handleDragEnd = () => {
172
+ const draggedItemId = state.dragData.id;
173
+ const originalContainer = state.dragData.initialGroup;
174
+ const draggedItem = state.items.find(item => item.id === draggedItemId);
175
+ const finalContainer = draggedItem ? draggedItem.container : originalContainer;
176
+
177
+ // Find items above and below in the same container
178
+ const itemsInContainer = state.items.filter(item => item.container === finalContainer);
179
+ const indexInContainer = itemsInContainer.findIndex(item => item.id === draggedItemId);
180
+ const itemAbove = indexInContainer > 0 ? itemsInContainer[indexInContainer - 1] : null;
181
+ const itemBelow = indexInContainer < itemsInContainer.length - 1 ? itemsInContainer[indexInContainer + 1] : null;
182
+
113
183
  dispatch({ type: 'SET_IS_DRAGGING', payload: "" });
114
184
  dispatch({ type: 'SET_ACTIVE_CONTAINER', payload: "" });
115
185
  dispatch({ type: 'SET_DRAG_DATA', payload: { id: "", initialGroup: "", originId: "" } });
116
- if (onDragEnd) onDragEnd();
186
+
187
+ // Pass enhanced info to onDragEnd callback to give dev more context
188
+ if (onDragEnd) onDragEnd(draggedItemId, finalContainer, originalContainer, itemAbove, itemBelow);
117
189
  };
118
190
 
119
191
  const changeCategory = (itemId: string, container: string) => {
@@ -123,10 +195,26 @@ export const DraggableProvider = ({
123
195
  const handleDrop = (container: string) => {
124
196
  if (state.dragData.originId !== providerId) return; // Ignore drop events from other providers
125
197
 
198
+ const draggedItemId = state.dragData.id;
199
+ const originalContainer = state.dragData.initialGroup;
200
+ const draggedItem = state.items.find(item => item.id === draggedItemId);
201
+
202
+ // Find items above and below in the same container (before changeCategory updates it)
203
+ const itemsInContainer = state.items.filter(item => item.container === container);
204
+ const indexInContainer = itemsInContainer.findIndex(item => item.id === draggedItemId);
205
+ const itemAbove = indexInContainer > 0 ? itemsInContainer[indexInContainer - 1] : null;
206
+ const itemBelow = indexInContainer < itemsInContainer.length - 1 ? itemsInContainer[indexInContainer + 1] : null;
207
+
126
208
  dispatch({ type: 'SET_IS_DRAGGING', payload: "" });
127
209
  dispatch({ type: 'SET_ACTIVE_CONTAINER', payload: "" });
128
- changeCategory(state.dragData.id, container);
129
- if (onDrop) onDrop(container);
210
+ // changeCategory will ensure the container is set correctly on drop for cross container and same container drops
211
+ changeCategory(draggedItemId, container);
212
+
213
+ // Pass enhanced info to onDrop callback so devs have more context
214
+ if (onDrop && draggedItem) {
215
+ const updatedItem = { ...draggedItem, container };
216
+ onDrop(draggedItemId, container, originalContainer, updatedItem, itemAbove, itemBelow);
217
+ }
130
218
  };
131
219
 
132
220
  const handleDragOver = (e: Event, container: string) => {
@@ -134,6 +222,15 @@ export const DraggableProvider = ({
134
222
 
135
223
  e.preventDefault();
136
224
  dispatch({ type: 'SET_ACTIVE_CONTAINER', payload: container });
225
+
226
+ // Check if we're dragging over a different container than where the item currently is
227
+ const draggedItem = state.items.find(item => item.id === state.dragData.id);
228
+ if (draggedItem && draggedItem.container !== container) {
229
+ // This handles the case when dragging to empty space at bottom of container OR in empty container
230
+ dispatch({ type: 'MOVE_TO_CONTAINER_END', payload: { dragId: state.dragData.id, newContainer: container } });
231
+ dispatch({ type: 'SET_DRAG_DATA', payload: { id: state.dragData.id, initialGroup: container, originId: providerId } });
232
+ }
233
+
137
234
  if (onDragOver) onDragOver(e, container);
138
235
  };
139
236
 
@@ -19,7 +19,10 @@ export type ActionType =
19
19
  | { type: 'SET_IS_DRAGGING'; payload: string }
20
20
  | { type: 'SET_ACTIVE_CONTAINER'; payload: string }
21
21
  | { type: 'CHANGE_CATEGORY'; payload: { itemId: string; container: string } }
22
- | { type: 'REORDER_ITEMS'; payload: { dragId: string; targetId: string } };
22
+ | { type: 'REORDER_ITEMS'; payload: { dragId: string; targetId: string } }
23
+ | { type: 'REORDER_ITEMS_CROSS_CONTAINER'; payload: { dragId: string; targetId: string; newContainer: string } }
24
+ | { type: 'MOVE_TO_CONTAINER_END'; payload: { dragId: string; newContainer: string } }
25
+ | { type: 'RESET_DRAG_CONTAINER'; payload: { itemId: string; originalContainer: string } };
23
26
 
24
27
  export interface DropZoneConfig {
25
28
  type?: 'ghost' | 'outline' | 'shadow' | 'line';
@@ -33,8 +36,8 @@ export type ActionType =
33
36
  onReorder: (items: ItemType[]) => void;
34
37
  onDragStart?: (id: string, container: string) => void;
35
38
  onDragEnter?: (id: string, container: string) => void;
36
- onDragEnd?: () => void;
37
- onDrop?: (container: string) => void;
39
+ onDragEnd?: (draggedItemId: string, finalContainer: string, originalContainer: string, itemAbove: ItemType | null, itemBelow: ItemType | null) => void;
40
+ onDrop?: (draggedItemId: string, droppedContainer: string, originalContainer: string, item: ItemType, itemAbove: ItemType | null, itemBelow: ItemType | null) => void;
38
41
  onDragOver?: (e: Event, container: string) => void;
39
42
  dropZone?: DropZoneConfig | string; // Can accept string for backward compatibility
40
43
  providerId?: string;
@@ -0,0 +1,179 @@
1
+ import React, { useState } from "react";
2
+
3
+ import Flex from '../../pb_flex/_flex'
4
+ import Draggable from '../../pb_draggable/_draggable'
5
+ import { DraggableProvider } from '../../pb_draggable/context'
6
+ import Badge from '../../pb_badge/_badge'
7
+ import Title from '../../pb_title/_title'
8
+ import Caption from '../../pb_caption/_caption'
9
+ import Card from '../../pb_card/_card'
10
+ import FlexItem from '../../pb_flex/_flex_item'
11
+ import Avatar from '../../pb_avatar/_avatar'
12
+ import Body from '../../pb_body/_body'
13
+
14
+ // Initial groups to drag between
15
+ const containers = ["To Do", "In Progress", "Done"];
16
+
17
+ // Initial items to be dragged
18
+ const data = [
19
+ {
20
+ id: "11",
21
+ container: "To Do",
22
+ title: "Task 1",
23
+ description: "Bug fixes",
24
+ assignee_name: "Terry Miles",
25
+ assignee_img: "https://randomuser.me/api/portraits/men/44.jpg",
26
+ },
27
+ {
28
+ id: "12",
29
+ container: "To Do",
30
+ title: "Task 2",
31
+ description: "Documentation",
32
+ assignee_name: "Sophia Miles",
33
+ assignee_img: "https://randomuser.me/api/portraits/women/8.jpg",
34
+ },
35
+ {
36
+ id: "13",
37
+ container: "In Progress",
38
+ title: "Task 3",
39
+ description: "Add a variant",
40
+ assignee_name: "Alice Jones",
41
+ assignee_img: "https://randomuser.me/api/portraits/women/10.jpg",
42
+ },
43
+ {
44
+ id: "14",
45
+ container: "To Do",
46
+ title: "Task 4",
47
+ description: "Add jest tests",
48
+ assignee_name: "Mike James",
49
+ assignee_img: "https://randomuser.me/api/portraits/men/8.jpg",
50
+ },
51
+ {
52
+ id: "15",
53
+ container: "Done",
54
+ title: "Task 5",
55
+ description: "Alpha testing",
56
+ assignee_name: "James Guy",
57
+ assignee_img: "https://randomuser.me/api/portraits/men/18.jpg",
58
+ },
59
+ {
60
+ id: "16",
61
+ container: "In Progress",
62
+ title: "Task 6",
63
+ description: "Release",
64
+ assignee_name: "Sally Jones",
65
+ assignee_img: "https://randomuser.me/api/portraits/women/28.jpg",
66
+ },
67
+ ];
68
+
69
+ const DraggableMultipleContainersDropzone = (props) => {
70
+ const [initialState, setInitialState] = useState(data);
71
+
72
+ const badgeProperties = (container) => {
73
+ switch (container) {
74
+ case "To Do":
75
+ return { text: "queue", color: "warning" };
76
+ case "In Progress":
77
+ return { text: "progress", color: "primary" };
78
+ default:
79
+ return { text: "done", color: "success" };
80
+ }
81
+ };
82
+
83
+ return (
84
+ <DraggableProvider
85
+ dropZone={{type: "outline"}}
86
+ initialItems={data}
87
+ onDragEnd={(draggedItemId, finalContainer, originalContainer, itemAbove, itemBelow) => {
88
+ console.log(`Dragged Item ID: ${draggedItemId}`);
89
+ console.log(`Final Container: ${finalContainer}`);
90
+ console.log(`Original Container: ${originalContainer}`);
91
+ console.log('Item Above:', itemAbove);
92
+ console.log('Item Below:', itemBelow);
93
+ }}
94
+ onDrop={(draggedItemId, droppedContainer, originalContainer, item, itemAbove, itemBelow) => {
95
+ console.log(`Dragged Item ID: ${draggedItemId}`);
96
+ console.log(`Dropped Container: ${droppedContainer}`);
97
+ console.log(`Original Container: ${originalContainer}`);
98
+ console.log('Dropped Item:', item);
99
+ console.log('Item Above:', itemAbove);
100
+ console.log('Item Below:', itemBelow);
101
+ }}
102
+ onReorder={(items) => setInitialState(items)}
103
+ >
104
+ <Flex
105
+ justifyContent="center"
106
+ {...props}
107
+ >
108
+ {containers?.map((container) => (
109
+ <Draggable.Container
110
+ container={container}
111
+ htmlOptions={{style:{ width: "200px", height: "70vh"}}}
112
+ key={container}
113
+ padding="sm"
114
+ >
115
+ <Caption textAlign="center">{container}</Caption>
116
+ <Flex
117
+ alignItems="stretch"
118
+ gap="sm"
119
+ orientation="column"
120
+ >
121
+ {initialState
122
+ .filter((item) => item.container === container)
123
+ .map(
124
+ ({
125
+ assignee_img,
126
+ assignee_name,
127
+ description,
128
+ id,
129
+ title,
130
+ }) => (
131
+ <Draggable.Item
132
+ container={container}
133
+ dragId={id}
134
+ key={id}
135
+ >
136
+ <Card
137
+ padding="sm"
138
+ {...props}
139
+ >
140
+ <Flex justify="between">
141
+ <FlexItem>
142
+ <Flex>
143
+ <Avatar
144
+ imageUrl={assignee_img}
145
+ name={assignee_name}
146
+ size="xxs"
147
+ />
148
+ <Title paddingLeft="xs"
149
+ size={4}
150
+ text={title}
151
+ {...props}
152
+ />
153
+ </Flex>
154
+ </FlexItem>
155
+ <Badge
156
+ marginLeft="sm"
157
+ rounded
158
+ text={badgeProperties(container).text}
159
+ variant={badgeProperties(container).color}
160
+ {...props}
161
+ />
162
+ </Flex>
163
+ <Body paddingTop="xs"
164
+ text={description}
165
+ {...props}
166
+ />
167
+ </Card>
168
+ </Draggable.Item>
169
+ )
170
+ )}
171
+ </Flex>
172
+ </Draggable.Container>
173
+ ))}
174
+ </Flex>
175
+ </DraggableProvider>
176
+ );
177
+ };
178
+
179
+ export default DraggableMultipleContainersDropzone;
@@ -1,6 +1,7 @@
1
1
  examples:
2
2
  react:
3
3
  - draggable_default: Default
4
+ - draggable_multiple_containers_dropzone: Dragging Across Multiple Containers with Dropzones
4
5
  - draggable_with_list: Draggable with List Kit
5
6
  - draggable_with_selectable_list: Draggable with SelectableList Kit
6
7
  - draggable_with_cards: Draggable with Cards
@@ -7,4 +7,5 @@ export { default as DraggableWithTable } from './_draggable_with_table.jsx'
7
7
  export { default as DraggableDropZones } from './_draggable_drop_zones.jsx'
8
8
  export { default as DraggableDropZonesColors } from './_draggable_drop_zones_colors.jsx'
9
9
  export { default as DraggableDropZonesLine } from './_draggable_drop_zones_line.jsx'
10
- export { default as DraggableEventListeners } from './_draggable_event_listeners.jsx'
10
+ export { default as DraggableEventListeners } from './_draggable_event_listeners.jsx'
11
+ export { default as DraggableMultipleContainersDropzone } from './_draggable_multiple_containers_dropzone.jsx'
@@ -33,6 +33,8 @@ export default class PbDropdown extends PbEnhancedElement {
33
33
  this.formPillProps = this.element.dataset.formPillProps
34
34
  ? JSON.parse(this.element.dataset.formPillProps)
35
35
  : {};
36
+ const baseInput = this.element.querySelector(DROPDOWN_INPUT);
37
+ this.wasOriginallyRequired = baseInput && baseInput.hasAttribute("required");
36
38
  this.setDefaultValue();
37
39
  this.bindEventListeners();
38
40
  this.bindSearchInput();
@@ -126,7 +128,7 @@ export default class PbDropdown extends PbEnhancedElement {
126
128
  .label.toString()
127
129
  .toLowerCase();
128
130
 
129
- // hide or show option
131
+ // hide or show option
130
132
  const match = label.includes(lcTerm);
131
133
  opt.style.display = match ? "" : "none";
132
134
  if (match) hasMatch = true
@@ -356,17 +358,6 @@ export default class PbDropdown extends PbEnhancedElement {
356
358
  }
357
359
 
358
360
  clearFormValidation(input) {
359
- if (input.checkValidity()) {
360
- const dropdownWrapperElement = input.closest(".dropdown_wrapper");
361
- dropdownWrapperElement.classList.remove("error");
362
-
363
- const errorLabelElement = dropdownWrapperElement.querySelector(
364
- ".pb_body_kit_negative"
365
- );
366
- if (errorLabelElement) {
367
- errorLabelElement.remove();
368
- }
369
- }
370
361
  if (this.isMultiSelect) {
371
362
  if (this.selectedOptions.size > 0) {
372
363
  const dropdownWrapperElement = input.closest(".dropdown_wrapper");
@@ -377,6 +368,19 @@ export default class PbDropdown extends PbEnhancedElement {
377
368
  if (errorLabelElement) {
378
369
  errorLabelElement.remove();
379
370
  }
371
+ return;
372
+ }
373
+ }
374
+
375
+ if (input.checkValidity()) {
376
+ const dropdownWrapperElement = input.closest(".dropdown_wrapper");
377
+ dropdownWrapperElement.classList.remove("error");
378
+
379
+ const errorLabelElement = dropdownWrapperElement.querySelector(
380
+ ".pb_body_kit_negative"
381
+ );
382
+ if (errorLabelElement) {
383
+ errorLabelElement.remove();
380
384
  }
381
385
  }
382
386
  }
@@ -585,7 +589,9 @@ export default class PbDropdown extends PbEnhancedElement {
585
589
  // for multi_select, for each selectedOption, create a hidden input
586
590
  const name = baseInput.getAttribute("name");
587
591
  this.selectedOptions.forEach((raw) => {
588
- const id = JSON.parse(raw).id;
592
+ const optionData = JSON.parse(raw);
593
+ // Use id if available, otherwise fall back to value
594
+ const id = optionData.id || optionData.value;
589
595
  const inp = document.createElement("input");
590
596
  inp.type = "hidden";
591
597
  inp.name = name;
@@ -593,7 +599,19 @@ export default class PbDropdown extends PbEnhancedElement {
593
599
  inp.dataset.generated = "true";
594
600
  baseInput.insertAdjacentElement("afterend", inp);
595
601
  });
596
- baseInput.value = "";
602
+
603
+ // For multi-select, remove required from base input when there are selections
604
+ // The generated inputs handle the form submission with actual values
605
+ // Restore required attribute when there are no selections (if it was originally required)
606
+ if (this.selectedOptions.size > 0) {
607
+ baseInput.value = "";
608
+ baseInput.removeAttribute("required");
609
+ } else {
610
+ baseInput.value = "";
611
+ if (this.wasOriginallyRequired) {
612
+ baseInput.setAttribute("required", "");
613
+ }
614
+ }
597
615
  }
598
616
 
599
617
  handleBackspaceClear() {
@@ -1,5 +1,6 @@
1
1
  import React from 'react'
2
- import { EmptyState, Flex } from 'playbook-ui'
2
+ import EmptyState from '../_empty_state'
3
+ import Flex from '../../pb_flex/_flex'
3
4
 
4
5
  const EmptyStateAlignment = (props) => (
5
6
  <Flex align="center"
@@ -1,5 +1,6 @@
1
1
  import React from 'react'
2
- import { EmptyState, Flex } from 'playbook-ui'
2
+ import EmptyState from '../_empty_state'
3
+ import Flex from '../../pb_flex/_flex'
3
4
 
4
5
  const EmptyStateDefault = (props) => (
5
6
  <Flex align="center"
@@ -1,5 +1,6 @@
1
1
  import React from 'react'
2
- import { EmptyState, Flex } from 'playbook-ui'
2
+ import EmptyState from '../_empty_state'
3
+ import Flex from '../../pb_flex/_flex'
3
4
 
4
5
  const EmptyStateOrientation = (props) => (
5
6
  <Flex align="center"
@@ -1,5 +1,6 @@
1
1
  import React from 'react'
2
- import { EmptyState, Flex } from 'playbook-ui'
2
+ import EmptyState from '../_empty_state'
3
+ import Flex from '../../pb_flex/_flex'
3
4
 
4
5
  const EmptyStateSize = (props) => (
5
6
  <Flex align="center"
@@ -1,4 +1,4 @@
1
- import React, { useEffect, useState } from "react";
1
+ import React, { useEffect, useState, useRef } from "react";
2
2
  import classnames from "classnames";
3
3
 
4
4
  import { globalProps, GlobalProps } from "../utilities/globalProps";
@@ -36,6 +36,7 @@ type FixedConfirmationToastProps = {
36
36
 
37
37
  const FixedConfirmationToast = (props: FixedConfirmationToastProps): React.ReactElement => {
38
38
  const [showToast, toggleToast] = useState(true);
39
+ const timeoutRef = useRef<NodeJS.Timeout | null>(null);
39
40
 
40
41
  const {
41
42
  autoClose = 0,
@@ -67,21 +68,42 @@ const FixedConfirmationToast = (props: FixedConfirmationToastProps): React.React
67
68
 
68
69
  const htmlProps = buildHtmlProps(htmlOptions);
69
70
 
70
- const autoCloseToast = () => {
71
- if (autoClose && open) {
72
- setTimeout(() => {
71
+ useEffect(() => {
72
+ toggleToast(open);
73
+ }, [open]);
74
+
75
+ // Manage auto-close timeout separately
76
+ useEffect(() => {
77
+ // Clear any existing timeout
78
+ if (timeoutRef.current) {
79
+ clearTimeout(timeoutRef.current);
80
+ timeoutRef.current = null;
81
+ }
82
+
83
+ // Set new timeout if autoClose is enabled and toast is open
84
+ if (autoClose && open && showToast) {
85
+ timeoutRef.current = setTimeout(() => {
73
86
  toggleToast(false);
74
87
  onClose();
88
+ timeoutRef.current = null;
75
89
  }, autoClose);
76
90
  }
77
- };
78
91
 
79
- useEffect(() => {
80
- toggleToast(open);
81
- autoCloseToast();
82
- }, [open]);
92
+ // Cleanup function to clear timeout on unmount or when dependencies change
93
+ return () => {
94
+ if (timeoutRef.current) {
95
+ clearTimeout(timeoutRef.current);
96
+ timeoutRef.current = null;
97
+ }
98
+ };
99
+ }, [autoClose, open, showToast, onClose]);
83
100
 
84
101
  const handleClick = () => {
102
+ // Clear autoClose timeout when manually closing
103
+ if (timeoutRef.current) {
104
+ clearTimeout(timeoutRef.current);
105
+ timeoutRef.current = null;
106
+ }
85
107
  toggleToast(!closeable);
86
108
  onClose();
87
109
  };
@@ -2,6 +2,7 @@ import React from 'react'
2
2
  import classnames from 'classnames'
3
3
  import { buildCss, buildHtmlProps } from '../utilities/props'
4
4
  import { globalProps, GlobalProps, globalInlineProps} from '../utilities/globalProps'
5
+
5
6
  type FlexItemPropTypes = {
6
7
  children: React.ReactNode[] | React.ReactNode,
7
8
  fixedSize?: string,
@@ -28,22 +29,28 @@ const FlexItem = (props: FlexItemPropTypes): React.ReactElement => {
28
29
  alignSelf,
29
30
  displayFlex
30
31
  } = props
32
+
31
33
  const growClass = grow === true ? 'pb_flex_item_kit_grow' : ''
32
34
  const displayFlexClass = displayFlex === true ? 'pb_flex_item_kit_display_flex' : ''
33
35
  const flexClass = flex !== 'none' ? `pb_flex_item_kit_flex_${flex}` : ''
34
36
  const shrinkClass = shrink === true ? 'pb_flex_item_kit_shrink' : ''
35
37
  const alignSelfClass = alignSelf ? `pb_flex_item_kit_align_self_${alignSelf}` : ''
36
- const fixedStyle =
37
- fixedSize !== undefined ? { flexBasis: `${fixedSize}` } : null
38
+ const fixedStyle = fixedSize !== undefined ? { flexBasis: `${fixedSize}` } : null
38
39
  const orderClass = order !== 'none' ? `pb_flex_item_kit_order_${order}` : ''
39
40
  const dynamicInlineProps = globalInlineProps(props)
41
+
42
+ // Extract style from htmlOptions and remove it
43
+ const { style: htmlStyle, ...htmlOptionsWithoutStyle } = htmlOptions
44
+ const htmlStyleObj = htmlStyle && typeof htmlStyle === 'object' ? htmlStyle : {}
45
+
46
+ // Merge all styles
40
47
  const combinedStyles = {
48
+ ...htmlStyleObj,
41
49
  ...fixedStyle,
42
50
  ...dynamicInlineProps
43
51
  }
44
52
 
45
- const htmlProps = buildHtmlProps(htmlOptions)
46
-
53
+ const htmlProps = buildHtmlProps(htmlOptionsWithoutStyle)
47
54
 
48
55
  return (
49
56
  <div
@@ -66,4 +73,4 @@ const FlexItem = (props: FlexItemPropTypes): React.ReactElement => {
66
73
  )
67
74
  }
68
75
 
69
- export default FlexItem
76
+ export default FlexItem
@@ -15,6 +15,7 @@ const FlexItemExample = (props) => {
15
15
  <FlexItem
16
16
  displayFlex
17
17
  gap="xs"
18
+ htmlOptions={{style: {padding:"2px"}}}
18
19
  {...props}
19
20
  >
20
21
  <FlexItem>
@@ -1,5 +1,8 @@
1
1
  import React from 'react'
2
- import { Card, Caption, FormPill, Typeahead } from 'playbook-ui'
2
+ import Card from '../../pb_card/_card'
3
+ import Caption from '../../pb_caption/_caption'
4
+ import FormPill from '../_form_pill'
5
+ import Typeahead from '../../pb_typeahead/_typeahead'
3
6
 
4
7
  const names = [
5
8
  { label: 'Alexander Nathaniel Montgomery', value: 'Alexander Nathaniel Montgomery' },
@@ -1,5 +1,5 @@
1
1
  import React from 'react'
2
- import { LoadingInline } from 'playbook-ui'
2
+ import LoadingInline from '../_loading_inline'
3
3
 
4
4
  const LoadingInlineVariant = (props) => {
5
5
  return (