playbook_ui 14.13.0 → 14.14.0.pre.alpha.PBNTR890typeahead6390

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 (185) 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/_advanced_table.scss +3 -0
  4. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +6 -5
  5. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.rb +8 -1
  6. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_headers_custom_cell.jsx +75 -0
  7. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props.html.erb +1 -1
  8. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_rails.md +3 -1
  9. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_react.md +1 -1
  10. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_sticky_header.html.erb +33 -0
  11. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_sticky_header_rails.md +3 -0
  12. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +2 -0
  13. data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +2 -1
  14. data/app/pb_kits/playbook/pb_bar_graph/BarGraphStyles.scss +58 -0
  15. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_pb_styles.jsx +64 -0
  16. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_pb_styles.md +1 -0
  17. data/app/pb_kits/playbook/pb_bar_graph/docs/example.yml +1 -0
  18. data/app/pb_kits/playbook/pb_bar_graph/docs/index.js +1 -0
  19. data/app/pb_kits/playbook/pb_checkbox/_checkbox.tsx +17 -8
  20. data/app/pb_kits/playbook/pb_checkbox/checkbox.test.js +16 -0
  21. data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_react_hook.jsx +69 -0
  22. data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_react_hook.md +1 -0
  23. data/app/pb_kits/playbook/pb_checkbox/docs/example.yml +2 -1
  24. data/app/pb_kits/playbook/pb_checkbox/docs/index.js +1 -0
  25. data/app/pb_kits/playbook/pb_currency/_currency.tsx +46 -31
  26. data/app/pb_kits/playbook/pb_currency/currency.html.erb +15 -8
  27. data/app/pb_kits/playbook/pb_currency/currency.rb +17 -2
  28. data/app/pb_kits/playbook/pb_currency/docs/_currency_null_display.html.erb +22 -0
  29. data/app/pb_kits/playbook/pb_currency/docs/_currency_null_display.jsx +34 -0
  30. data/app/pb_kits/playbook/pb_currency/docs/_currency_null_display_rails.md +1 -0
  31. data/app/pb_kits/playbook/pb_currency/docs/_currency_null_display_react.md +1 -0
  32. data/app/pb_kits/playbook/pb_currency/docs/example.yml +2 -0
  33. data/app/pb_kits/playbook/pb_currency/docs/index.js +2 -1
  34. data/app/pb_kits/playbook/pb_date_picker/_date_picker.tsx +3 -1
  35. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_table.html.erb +2 -2
  36. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_table.md +4 -1
  37. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_table_react.jsx +90 -0
  38. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_table_react.md +5 -0
  39. data/app/pb_kits/playbook/pb_draggable/docs/example.yml +2 -0
  40. data/app/pb_kits/playbook/pb_draggable/docs/index.js +2 -1
  41. data/app/pb_kits/playbook/pb_draggable/subcomponents/DraggableContainer.tsx +7 -4
  42. data/app/pb_kits/playbook/pb_draggable/subcomponents/DraggableItem.tsx +6 -3
  43. data/app/pb_kits/playbook/pb_drawer/_drawer.scss +32 -8
  44. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_behavior.html.erb +8 -0
  45. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_borders.html.erb +33 -0
  46. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_breakpoints.html.erb +0 -0
  47. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_default.html.erb +20 -1
  48. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_menu.html.erb +24 -0
  49. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_overlay.html.erb +21 -0
  50. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_overlay.md +1 -0
  51. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_sizes.html.erb +49 -0
  52. data/app/pb_kits/playbook/pb_drawer/docs/example.yml +5 -0
  53. data/app/pb_kits/playbook/pb_drawer/drawer.html.erb +20 -12
  54. data/app/pb_kits/playbook/pb_drawer/drawer.rb +49 -1
  55. data/app/pb_kits/playbook/pb_drawer/index.js +257 -0
  56. data/app/pb_kits/playbook/pb_form/docs/_form_form_with.html.erb +1 -0
  57. data/app/pb_kits/playbook/pb_form/docs/_form_form_with_validate.html.erb +2 -1
  58. data/app/pb_kits/playbook/pb_icon_button/_icon_button.tsx +71 -0
  59. data/app/pb_kits/playbook/pb_icon_button/docs/_icon_button_default.html.erb +1 -2
  60. data/app/pb_kits/playbook/pb_icon_button/docs/_icon_button_default.jsx +17 -0
  61. data/app/pb_kits/playbook/pb_icon_button/docs/_icon_button_sizes.html.erb +27 -0
  62. data/app/pb_kits/playbook/pb_icon_button/docs/_icon_button_sizes.jsx +61 -0
  63. data/app/pb_kits/playbook/pb_icon_button/docs/example.yml +5 -3
  64. data/app/pb_kits/playbook/pb_icon_button/docs/index.js +2 -0
  65. data/app/pb_kits/playbook/pb_icon_button/icon_button.html.erb +1 -1
  66. data/app/pb_kits/playbook/pb_icon_button/icon_button.rb +3 -0
  67. data/app/pb_kits/playbook/pb_icon_button/icon_button.test.jsx +39 -0
  68. data/app/pb_kits/playbook/pb_multi_level_select/multi_level_select.html.erb +1 -6
  69. data/app/pb_kits/playbook/pb_nav/item.html.erb +7 -19
  70. data/app/pb_kits/playbook/pb_nav/nav.html.erb +3 -8
  71. data/app/pb_kits/playbook/pb_online_status/online_status.html.erb +1 -6
  72. data/app/pb_kits/playbook/pb_overlay/_overlay.tsx +4 -0
  73. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_vertical_dynamic_multi_directional.html.erb +11 -0
  74. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_vertical_dynamic_multi_directional.jsx +37 -0
  75. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_vertical_dynamic_multi_directional.md +1 -0
  76. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_vertical_dynamic_multi_directional_react.md +1 -0
  77. data/app/pb_kits/playbook/pb_overlay/docs/example.yml +2 -0
  78. data/app/pb_kits/playbook/pb_overlay/docs/index.js +1 -0
  79. data/app/pb_kits/playbook/pb_overlay/index.js +61 -0
  80. data/app/pb_kits/playbook/pb_overlay/overlay.html.erb +5 -3
  81. data/app/pb_kits/playbook/pb_overlay/overlay.rb +9 -0
  82. data/app/pb_kits/playbook/pb_overlay/subcomponents/_overlay_token.tsx +48 -10
  83. data/app/pb_kits/playbook/pb_popover/popover.html.erb +1 -6
  84. data/app/pb_kits/playbook/pb_progress_pills/_progress_pills.scss +6 -1
  85. data/app/pb_kits/playbook/pb_progress_pills/_progress_pills.tsx +7 -5
  86. data/app/pb_kits/playbook/pb_progress_pills/docs/_progress_pills_default.html.erb +1 -0
  87. data/app/pb_kits/playbook/pb_progress_pills/docs/_progress_pills_default.jsx +7 -0
  88. data/app/pb_kits/playbook/pb_progress_pills/docs/_progress_pills_default.md +1 -0
  89. data/app/pb_kits/playbook/pb_progress_pills/docs/_progress_pills_full_width.html.erb +1 -0
  90. data/app/pb_kits/playbook/pb_progress_pills/docs/_progress_pills_full_width.jsx +18 -0
  91. data/app/pb_kits/playbook/pb_progress_pills/docs/_progress_pills_full_width_rails.md +1 -0
  92. data/app/pb_kits/playbook/pb_progress_pills/docs/_progress_pills_full_width_react.md +1 -0
  93. data/app/pb_kits/playbook/pb_progress_pills/docs/example.yml +2 -0
  94. data/app/pb_kits/playbook/pb_progress_pills/docs/index.js +1 -0
  95. data/app/pb_kits/playbook/pb_progress_pills/progress_pills.html.erb +2 -7
  96. data/app/pb_kits/playbook/pb_progress_pills/progress_pills.rb +6 -0
  97. data/app/pb_kits/playbook/pb_progress_pills/progress_pills.test.js +26 -1
  98. data/app/pb_kits/playbook/pb_progress_simple/progress_simple.html.erb +1 -5
  99. data/app/pb_kits/playbook/pb_progress_step/progress_step.html.erb +1 -5
  100. data/app/pb_kits/playbook/pb_progress_step/progress_step_item.html.erb +3 -7
  101. data/app/pb_kits/playbook/pb_radio/radio.html.erb +6 -11
  102. data/app/pb_kits/playbook/pb_select/index.js +38 -0
  103. data/app/pb_kits/playbook/pb_select/select.rb +8 -0
  104. data/app/pb_kits/playbook/pb_table/docs/_table_with_clickable_rows.html.erb +47 -0
  105. data/app/pb_kits/playbook/pb_table/docs/_table_with_clickable_rows.jsx +88 -0
  106. data/app/pb_kits/playbook/pb_table/docs/_table_with_clickable_rows.md +1 -0
  107. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible.jsx +1 -1
  108. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_custom_click.html.erb +51 -0
  109. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_custom_click_rails.md +2 -0
  110. data/app/pb_kits/playbook/pb_table/docs/_table_with_selectable_rows.html.erb +96 -0
  111. data/app/pb_kits/playbook/pb_table/docs/_table_with_selectable_rows.jsx +101 -0
  112. data/app/pb_kits/playbook/pb_table/docs/_table_with_selectable_rows.md +1 -0
  113. data/app/pb_kits/playbook/pb_table/docs/example.yml +5 -0
  114. data/app/pb_kits/playbook/pb_table/docs/index.js +3 -1
  115. data/app/pb_kits/playbook/pb_table/index.ts +41 -9
  116. data/app/pb_kits/playbook/pb_table/styles/_collapsible.scss +4 -0
  117. data/app/pb_kits/playbook/pb_table/subcomponents/_table_body.tsx +29 -2
  118. data/app/pb_kits/playbook/pb_table/subcomponents/_table_row.tsx +31 -3
  119. data/app/pb_kits/playbook/pb_table/table_body.html.erb +13 -7
  120. data/app/pb_kits/playbook/pb_table/table_body.rb +2 -0
  121. data/app/pb_kits/playbook/pb_table/table_row.html.erb +14 -7
  122. data/app/pb_kits/playbook/pb_table/table_row.rb +14 -1
  123. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_mask.html.erb +14 -0
  124. data/app/pb_kits/playbook/pb_text_input/index.js +9 -0
  125. data/app/pb_kits/playbook/pb_text_input/text_input.rb +5 -2
  126. data/app/pb_kits/playbook/pb_title/_title.scss +35 -0
  127. data/app/pb_kits/playbook/pb_title/_title.tsx +10 -1
  128. data/app/pb_kits/playbook/pb_title/docs/_title_default.html.erb +1 -2
  129. data/app/pb_kits/playbook/pb_title/docs/_title_default.jsx +1 -1
  130. data/app/pb_kits/playbook/pb_title/docs/_title_display_size.html.erb +7 -0
  131. data/app/pb_kits/playbook/pb_title/docs/_title_display_size.jsx +54 -0
  132. data/app/pb_kits/playbook/pb_title/docs/_title_display_size.md +1 -0
  133. data/app/pb_kits/playbook/pb_title/docs/example.yml +2 -0
  134. data/app/pb_kits/playbook/pb_title/docs/index.js +1 -0
  135. data/app/pb_kits/playbook/pb_title/title.rb +10 -1
  136. data/app/pb_kits/playbook/pb_tooltip/_tooltip.scss +0 -3
  137. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_delay_rails.html.erb +39 -0
  138. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_delay_rails.md +3 -0
  139. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_interaction.html.erb +26 -0
  140. data/app/pb_kits/playbook/pb_tooltip/docs/example.yml +2 -0
  141. data/app/pb_kits/playbook/pb_tooltip/floating_ui.js +282 -0
  142. data/app/pb_kits/playbook/pb_tooltip/index.js +2 -2
  143. data/app/pb_kits/playbook/pb_tooltip/tooltip.rb +10 -2
  144. data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +34 -1
  145. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_dynamic_options.html.erb +45 -0
  146. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_dynamic_options.md +5 -0
  147. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_dynamic_options_pure_rails.html.erb +33 -0
  148. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_dynamic_options_pure_rails.md +3 -0
  149. data/app/pb_kits/playbook/pb_typeahead/docs/example.yml +2 -0
  150. data/app/pb_kits/playbook/pb_typeahead/index.ts +61 -8
  151. data/app/pb_kits/playbook/pb_typeahead/typeahead.rb +13 -1
  152. data/dist/chunks/{_typeahead-btjo1UN5.js → _typeahead-DkFE6eZr.js} +4 -4
  153. data/dist/chunks/_weekday_stacked-BXq4AGmy.js +45 -0
  154. data/dist/chunks/lazysizes-B7xYodB-.js +1 -0
  155. data/dist/chunks/{lib-DjpLC8uO.js → lib-Dmay5Z6U.js} +2 -2
  156. data/dist/chunks/{pb_form_validation-S56UaHZl.js → pb_form_validation-DdP7BnVX.js} +1 -1
  157. data/dist/chunks/vendor.js +1 -1
  158. data/dist/menu.yml +3 -10
  159. data/dist/playbook-doc.js +1 -1
  160. data/dist/playbook-rails-react-bindings.js +1 -1
  161. data/dist/playbook-rails.js +1 -1
  162. data/dist/playbook.css +1 -1
  163. data/lib/playbook/forms/builder/time_zone_select_field.rb +19 -0
  164. data/lib/playbook/forms/builder.rb +1 -0
  165. data/lib/playbook/version.rb +2 -2
  166. metadata +67 -24
  167. data/app/pb_kits/playbook/pb_avatar_action_button/_avatar_action_button.scss +0 -66
  168. data/app/pb_kits/playbook/pb_avatar_action_button/_avatar_action_button.tsx +0 -98
  169. data/app/pb_kits/playbook/pb_avatar_action_button/avatar_action_button.html.erb +0 -28
  170. data/app/pb_kits/playbook/pb_avatar_action_button/avatar_action_button.rb +0 -42
  171. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_actions.html.erb +0 -19
  172. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_actions.jsx +0 -26
  173. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_default.html.erb +0 -10
  174. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_default.jsx +0 -17
  175. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_on_click.jsx +0 -19
  176. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_onclick.html.erb +0 -16
  177. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_placement.html.erb +0 -35
  178. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_placement.jsx +0 -42
  179. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_tooltip.html.erb +0 -13
  180. data/app/pb_kits/playbook/pb_avatar_action_button/docs/example.yml +0 -15
  181. data/app/pb_kits/playbook/pb_avatar_action_button/docs/index.js +0 -4
  182. data/app/pb_kits/playbook/pb_avatar_action_button/pb_avatar_action_button.test.js +0 -31
  183. data/dist/chunks/_weekday_stacked-DeYS_l8v.js +0 -45
  184. data/dist/chunks/lazysizes-DHz07jlL.js +0 -1
  185. /data/app/pb_kits/playbook/pb_table/docs/{_table_with_collapsible_with_custom_click.md → _table_with_collapsible_with_custom_click_react.md} +0 -0
@@ -0,0 +1,24 @@
1
+ <%= pb_rails("button", props: { padding: "xs", margin_right: "sm", data: {"open-drawer": "drawer-4"} }) do %>
2
+ <%= pb_rails("icon", props: { icon: "bars", size: "2x" }) %>
3
+ <% end %>
4
+
5
+ <%= pb_rails("drawer", props: {
6
+ id:"drawer-4",
7
+ within_element: true,
8
+ placement: "bottom",
9
+ breakpoint: "md",
10
+ size: "full"
11
+ }) do %>
12
+ <%= pb_rails("nav", props: { display: {xl: "none", lg: "none", md: "none", sm: "block" } }) do %>
13
+ <%= pb_rails("nav/item", props: { text: "Photos", link: "#" }) %>
14
+ <%= pb_rails("nav/item", props: { text: "Music", link: "#" }) %>
15
+ <%= pb_rails("nav/item", props: { text: "Video", link: "#", active: true }) %>
16
+ <%= pb_rails("nav/item", props: { text: "Files", link: "#" }) %>
17
+ <% end %>
18
+ <%= pb_rails("nav", props: { display: {md: "block", sm: "none", xs: "none" }, orientation: "horizontal" }) do %>
19
+ <%= pb_rails("nav/item", props: { text: "About", link: "#" }) %>
20
+ <%= pb_rails("nav/item", props: { text: "Case Studies", link: "#", active: true }) %>
21
+ <%= pb_rails("nav/item", props: { text: "Service ", link: "#" }) %>
22
+ <%= pb_rails("nav/item", props: { text: "Contacts", link: "#" }) %>
23
+ <% end %>
24
+ <% end %>
@@ -0,0 +1,21 @@
1
+ <%= pb_rails("flex") do %>
2
+ <%= pb_rails("button", props: { text: "No Overlay Drawer", margin_right: "sm", data: {"open-drawer": "drawer-10"} }) %>
3
+
4
+ <%= pb_rails("drawer", props: {
5
+ id:"drawer-10",
6
+ overlay: false
7
+ }) do %>
8
+ Test me (No Overlay)
9
+ <% end %>
10
+
11
+
12
+ <%= pb_rails("button", props: { text: "Overlay Drawer", data: {"open-drawer": "drawer-11"} }) %>
13
+
14
+ <%= pb_rails("drawer", props: {
15
+ id:"drawer-11",
16
+ placement: "right"
17
+ }) do %>
18
+ Test me (Has Overlay)
19
+ <% end %>
20
+ <% end %>
21
+
@@ -0,0 +1 @@
1
+ Click the button to close the drawer when there is no overlay.
@@ -0,0 +1,49 @@
1
+ <%= pb_rails("flex") do %>
2
+ <%= pb_rails("button", props: { text: "XS Drawer", margin_right: "sm", data: {"open-drawer": "drawer-5"} }) %>
3
+
4
+ <%= pb_rails("drawer", props: {
5
+ id:"drawer-5",
6
+ size: "xs"
7
+ }) do %>
8
+ XS
9
+ <% end %>
10
+
11
+ <%= pb_rails("button", props: { text: "SM Drawer", margin_right: "sm", data: {"open-drawer": "drawer-6"} }) %>
12
+
13
+ <%= pb_rails("drawer", props: {
14
+ id:"drawer-6",
15
+ size: "sm",
16
+ placement: "right"
17
+ }) do %>
18
+ This is a small drawer
19
+ <% end %>
20
+
21
+ <%= pb_rails("button", props: { text: "MD Drawer", margin_right: "sm", data: {"open-drawer": "drawer-7"} }) %>
22
+
23
+ <%= pb_rails("drawer", props: {
24
+ id:"drawer-7",
25
+ size: "md"
26
+ }) do %>
27
+ This is a medium drawer
28
+ <% end %>
29
+
30
+ <%= pb_rails("button", props: { text: "LG Drawer", margin_right: "sm", data: {"open-drawer": "drawer-8"} }) %>
31
+
32
+ <%= pb_rails("drawer", props: {
33
+ id:"drawer-8",
34
+ size: "lg",
35
+ placement: "right"
36
+ }) do %>
37
+ This is a large drawer
38
+ <% end %>
39
+
40
+ <%= pb_rails("button", props: { text: "XL Drawer", margin_right: "sm", data: {"open-drawer": "drawer-9"} }) %>
41
+
42
+ <%= pb_rails("drawer", props: {
43
+ id:"drawer-9",
44
+ size: "xl"
45
+ }) do %>
46
+ This is an extra large drawer
47
+ <% end %>
48
+ <% end %>
49
+
@@ -2,6 +2,11 @@ examples:
2
2
 
3
3
  rails:
4
4
  - drawer_default: Default
5
+ - drawer_behavior: Push Behavior
6
+ - drawer_menu: Within Element
7
+ - drawer_sizes: Sizes
8
+ - drawer_overlay: Overlay
9
+ - drawer_borders: Borders
5
10
 
6
11
 
7
12
  react:
@@ -1,12 +1,20 @@
1
- <!-- Go to pb_content_tag definition in kit_base.rb for usage information. Commented out options are default (showing the default shape), and each can be deleted if not customizing that param. -->
2
- <!-- If using nonstandard params please un-comment out and replace with your custom params. -->
3
- <%= pb_content_tag(
4
- # :div,
5
- # aria: object.aria,
6
- # class: object.classname,
7
- # data: object.data,
8
- # id: object.id,
9
- # **combined_html_options
10
- ) do %>
11
- <span>DRAWER CONTENT</span>
12
- <% end %>
1
+ <% if within_element %>
2
+ <%= pb_content_tag(:div, data: {breakpoint: object.breakpoint} ) do %>
3
+ <%= content %>
4
+ <% end %>
5
+ <% else %>
6
+ <div class="pb_drawer_wrapper"
7
+ id="drawer-wrapper-<%= object.id %>"
8
+ style="display:none;"
9
+ data-behavior="<%= object.behavior %>"
10
+ data-size="<%= object.size %>"
11
+ data-placement="<%= object.placement %>"
12
+ data-breakpoint="<%= object.breakpoint %>"
13
+ >
14
+ <div class="<%= overlay_classes %>" style="display:none;" id="drawer-overlay-<%= object.id %>">
15
+ <%= pb_content_tag do %>
16
+ <%= content %>
17
+ <% end %>
18
+ </div>
19
+ </div>
20
+ <% end %>
@@ -2,7 +2,55 @@
2
2
 
3
3
  module Playbook
4
4
  module PbDrawer
5
- class Drawer < ::Playbook::KitBase
5
+ class Drawer < Playbook::KitBase
6
+ prop :size, type: Playbook::Props::Enum,
7
+ values: %w[xs sm md lg xl full],
8
+ default: "md"
9
+ prop :placement, type: Playbook::Props::Enum,
10
+ values: %w[left right bottom],
11
+ default: "left"
12
+ prop :behavior, type: Playbook::Props::Enum,
13
+ values: %w[floating push],
14
+ default: "floating"
15
+ prop :overlay, type: Playbook::Props::Boolean,
16
+ default: true
17
+ prop :within_element, type: Playbook::Props::Boolean,
18
+ default: false
19
+ prop :border, type: Playbook::Props::Enum,
20
+ values: %w[full none right left],
21
+ default: "none"
22
+ prop :breakpoint, type: Playbook::Props::Enum,
23
+ values: %w[none xs sm md lg xl],
24
+ default: "none"
25
+
26
+ def classname
27
+ generate_classname("pb_drawer pb_drawer_#{size}_#{placement} #{within_class} #{border_classes}")
28
+ end
29
+
30
+ def border_classes
31
+ case border
32
+ when "full"
33
+ "drawer_border-full"
34
+ when "right"
35
+ "drawer_border-right"
36
+ when "left"
37
+ "drawer_border-left"
38
+ else
39
+ ""
40
+ end
41
+ end
42
+
43
+ def overlay_close
44
+ !should_close_on_overlay_click ? "overlay_close" : ""
45
+ end
46
+
47
+ def within_class
48
+ within_element ? "pb_drawer_within_element_rails" : ""
49
+ end
50
+
51
+ def overlay_classes
52
+ "pb_drawer_#{overlay ? '' : 'no_'}overlay drawer_content_#{placement} pb_drawer_overlay_after_open #{overlay ? '' : 'no-background'}"
53
+ end
6
54
  end
7
55
  end
8
56
  end
@@ -0,0 +1,257 @@
1
+ import PbEnhancedElement from "../pb_enhanced_element"
2
+
3
+ export default class PbDrawer extends PbEnhancedElement {
4
+ static get selector() {
5
+ return ".pb_drawer_wrapper"
6
+ }
7
+
8
+ connect() {
9
+ this.handleToggleClick = this.handleToggleClick.bind(this)
10
+ this.handleOutsideClick = this.handleOutsideClick.bind(this)
11
+ this.handleResize = this.handleResize.bind(this)
12
+
13
+ this._toggleTriggers = Array.from(document.querySelectorAll("[data-open-drawer]"))
14
+ this._toggleTriggers.forEach(el => {
15
+ el.addEventListener("click", this.handleToggleClick)
16
+ })
17
+
18
+ this._wrappers = Array.from(document.querySelectorAll(".pb_drawer_wrapper"))
19
+ this._wrappers.forEach(el => {
20
+ el.addEventListener("mousedown", this.handleOutsideClick)
21
+ })
22
+
23
+ this._withinElementDrawers = Array.from(
24
+ document.querySelectorAll(".pb_drawer_within_element_rails[data-breakpoint]")
25
+ )
26
+
27
+ window.addEventListener("resize", this.handleResize)
28
+ this.handleResize()
29
+ }
30
+
31
+ disconnect() {
32
+ this._toggleTriggers.forEach(el => {
33
+ el.removeEventListener("click", this.handleToggleClick)
34
+ })
35
+ this._wrappers.forEach(el => {
36
+ el.removeEventListener("mousedown", this.handleOutsideClick)
37
+ })
38
+ window.removeEventListener("resize", this.handleResize)
39
+ }
40
+
41
+ getOverlay(wrapper) {
42
+ if (wrapper.id && wrapper.id.startsWith("drawer-wrapper-")) {
43
+ const overlayId = wrapper.id.replace("drawer-wrapper-", "drawer-overlay-")
44
+ return document.getElementById(overlayId)
45
+ }
46
+ return wrapper.querySelector(".pb_drawer_overlay") || wrapper.querySelector(".pb_drawer_no_overlay")
47
+ }
48
+
49
+ handleToggleClick(event) {
50
+ const trigger = event.currentTarget
51
+ const drawerId = trigger.dataset.openDrawer
52
+ const dialog = document.getElementById(drawerId)
53
+ if (!dialog) return
54
+
55
+ if (dialog.classList.contains("pb_drawer_within_element_rails")) {
56
+ if (dialog.classList.contains("open")) {
57
+ this.closeWithinElementDrawer(dialog)
58
+ dialog.dataset.manualOpen = "false"
59
+ } else {
60
+ this.openWithinElementDrawer(dialog)
61
+ dialog.dataset.manualOpen = "true"
62
+ }
63
+ return
64
+ }
65
+
66
+ const wrapperId = `drawer-wrapper-${drawerId}`
67
+ const wrapper = document.getElementById(wrapperId)
68
+ if (!wrapper) return
69
+
70
+ if (wrapper !== this.element) return
71
+
72
+ if (wrapper.classList.contains("open")) {
73
+ this.closeDrawer(wrapper, dialog)
74
+ wrapper.dataset.manualOpen = "false"
75
+ } else {
76
+ this.openDrawer(wrapper, dialog)
77
+ wrapper.dataset.manualOpen = "true"
78
+ }
79
+ }
80
+
81
+ openWithinElementDrawer(dialog) {
82
+ if (dialog.classList.contains("open")) return
83
+ dialog.style.maxHeight = "0px"
84
+ dialog.offsetHeight
85
+ dialog.classList.add("open")
86
+ // Get trigger's height and add it to the final height
87
+ const trigger = document.querySelector(`[data-open-drawer="${dialog.id}"]`)
88
+ const triggerHeight = trigger ? trigger.offsetHeight : 0
89
+ const finalHeight = (dialog.scrollHeight + triggerHeight) + "px"
90
+ dialog.style.maxHeight = finalHeight
91
+ dialog.addEventListener("transitionend", function handleOpenEnd(e) {
92
+ if (e.propertyName === "max-height") {
93
+ dialog.style.maxHeight = "none"
94
+ dialog.removeEventListener("transitionend", handleOpenEnd)
95
+ }
96
+ })
97
+ }
98
+
99
+ closeWithinElementDrawer(dialog) {
100
+ if (!dialog.classList.contains("open")) return
101
+ const currentHeight = dialog.scrollHeight
102
+ dialog.style.maxHeight = currentHeight + "px"
103
+ dialog.offsetHeight
104
+ dialog.classList.remove("open")
105
+ dialog.style.maxHeight = "0px"
106
+ dialog.addEventListener("transitionend", function handleCloseEnd(e) {
107
+ if (e.propertyName === "max-height") {
108
+ dialog.removeEventListener("transitionend", handleCloseEnd)
109
+ dialog.style.maxHeight = "0px"
110
+ }
111
+ })
112
+ }
113
+
114
+ openDrawer(wrapper, dialog) {
115
+ const behavior = wrapper.dataset.behavior
116
+ const size = wrapper.dataset.size
117
+ const placement = wrapper.dataset.placement
118
+ this.handlePushOpen(behavior, size, placement)
119
+
120
+ wrapper.style.display = ""
121
+ const overlay = this.getOverlay(wrapper)
122
+ if (overlay) overlay.style.display = ""
123
+
124
+ wrapper.classList.add("open")
125
+ dialog.classList.add("open")
126
+ }
127
+
128
+ closeDrawer(wrapper, dialog) {
129
+ const behavior = wrapper.dataset.behavior
130
+ this.handlePushClose(behavior)
131
+
132
+ if (wrapper.className.includes("open")) wrapper.style.display = "none"
133
+ const overlay = this.getOverlay(wrapper)
134
+ if (overlay && wrapper.className.includes("open")) overlay.style.display = "none"
135
+
136
+ wrapper.classList.remove("open")
137
+ dialog.classList.remove("open")
138
+ }
139
+
140
+ handleOutsideClick(event) {
141
+ const wrapper = event.currentTarget
142
+ const dialog = wrapper.querySelector(".pb_drawer")
143
+ const overlay = this.getOverlay(wrapper)
144
+
145
+ if (dialog && dialog.classList.contains("pb_drawer_within_element_rails")) {
146
+ return
147
+ }
148
+
149
+ if (wrapper.dataset.overlayClick === "overlay_close" && event.target === overlay) {
150
+ this.closeDrawer(wrapper, dialog)
151
+ event.stopPropagation()
152
+ return
153
+ }
154
+
155
+ const dialogRect = dialog.getBoundingClientRect()
156
+ const clickedOutside =
157
+ event.clientX < dialogRect.left ||
158
+ event.clientX > dialogRect.right ||
159
+ event.clientY < dialogRect.top ||
160
+ event.clientY > dialogRect.bottom
161
+
162
+ if (clickedOutside) {
163
+ this.closeDrawer(wrapper, dialog)
164
+ event.stopPropagation()
165
+ }
166
+ }
167
+
168
+ handleResize() {
169
+ const breakpointValues = {
170
+ none: 0,
171
+ xs: 575,
172
+ sm: 768,
173
+ md: 992,
174
+ lg: 1200,
175
+ xl: 1400,
176
+ }
177
+
178
+ // Process wrappers
179
+ this._wrappers.forEach(wrapper => {
180
+ const bp = wrapper.dataset.breakpoint || "none"
181
+ if (bp === "none") return
182
+
183
+ const threshold = breakpointValues[bp] || 0
184
+ const dialog = wrapper.querySelector(".pb_drawer")
185
+ const trigger = dialog ? document.querySelector(`[data-open-drawer="${dialog.id}"]`) : null
186
+
187
+ if (window.innerWidth >= threshold) {
188
+ if (!wrapper.classList.contains("open")) {
189
+ this.openDrawer(wrapper, dialog)
190
+ }
191
+ if (trigger) trigger.style.display = "none"
192
+ } else {
193
+ if (trigger) trigger.style.display = ""
194
+ if (wrapper.classList.contains("open") && wrapper.dataset.manualOpen !== "true") {
195
+ this.closeDrawer(wrapper, dialog)
196
+ }
197
+ }
198
+ })
199
+
200
+ // Process within element drawers
201
+ this._withinElementDrawers.forEach(drawer => {
202
+ const bp = drawer.dataset.breakpoint || "none"
203
+ if (bp === "none") return
204
+
205
+ const threshold = breakpointValues[bp] || 0
206
+ const trigger = document.querySelector(`[data-open-drawer="${drawer.id}"]`)
207
+
208
+ if (window.innerWidth >= threshold) {
209
+ if (!drawer.classList.contains("open")) {
210
+ this.openWithinElementDrawer(drawer)
211
+ }
212
+ if (trigger) trigger.style.display = "none"
213
+ } else {
214
+ if (trigger) trigger.style.display = ""
215
+ if (drawer.classList.contains("open") && drawer.dataset.manualOpen !== "true") {
216
+ this.closeWithinElementDrawer(drawer)
217
+ }
218
+ }
219
+ })
220
+ }
221
+
222
+ handlePushOpen(behavior, size, placement) {
223
+ if (behavior !== "push") return
224
+
225
+ const sizeMap = {
226
+ xl: "365px",
227
+ lg: "300px",
228
+ md: "250px",
229
+ sm: "200px",
230
+ xs: "64px",
231
+ full: "100%",
232
+ }
233
+
234
+ const body = document.querySelector("body")
235
+ if (!body) return
236
+
237
+ if (placement === "left") {
238
+ body.style.cssText = `margin-left: ${sizeMap[size]} !important; margin-right: '' !important;`
239
+ } else if (placement === "right") {
240
+ body.style.cssText = `margin-right: ${sizeMap[size]} !important; margin-left: '' !important;`
241
+ }
242
+ body.classList.add("PBDrawer__Body--open")
243
+ }
244
+
245
+ handlePushClose(behavior) {
246
+ if (behavior !== "push") return
247
+
248
+ const body = document.querySelector("body")
249
+ if (!body) return
250
+
251
+ if (body.classList.contains("PBDrawer__Body--open")) {
252
+ body.classList.add("PBDrawer__Body--close")
253
+ }
254
+ body.style.cssText = ""
255
+ body.classList.remove("PBDrawer__Body--open")
256
+ }
257
+ }
@@ -46,6 +46,7 @@
46
46
  %>
47
47
  <%= form.date_picker :example_date_picker_1, props: { label: true } %>
48
48
  <%= form.star_rating_field :example_star_rating, props: { variant: "interactive", label: true } %>
49
+ <%= form.time_zone_select_field :example_time_zone_select, ActiveSupport::TimeZone.us_zones, { default: "Eastern Time (US & Canada)" }, props: { label: true } %>
49
50
 
50
51
  <%= form.actions do |action| %>
51
52
  <%= action.submit %>
@@ -32,11 +32,12 @@
32
32
  <%= form.url_field :example_url_field_validation, props: { label: true, required: true } %>
33
33
  <%= form.text_area :example_text_area_validation, props: { label: true, required: true } %>
34
34
  <%= form.dropdown_field :example_dropdown_validation, props: { label: true, options: example_dropdown_options, required: true } %>
35
- <%= form.select :example_select_validation, [ ["Yes", 1], ["No", 2] ], props: { label: true, blank_selection: "Select One...", required: true } %>
35
+ <%= form.select :example_select_validation, [ ["Yes", 1], ["No", 2] ], props: { label: true, blank_selection: "Select One...", required: true, validation_message: "Please, select an option." } %>
36
36
  <%= form.collection_select :example_collection_select_validation, example_collection, :value, :name, props: { label: true, blank_selection: "Select One...", required: true } %>
37
37
  <%= form.check_box :example_checkbox, props: { text: "Example Checkbox", label: true, required: true } %>
38
38
  <%= form.date_picker :example_date_picker_2, props: { label: true, required: true } %>
39
39
  <%= form.star_rating_field :example_star_rating_validation, props: { variant: "interactive", label: true, required: true } %>
40
+ <%= form.time_zone_select_field :example_time_zone_select, ActiveSupport::TimeZone.us_zones, { default: "Eastern Time (US & Canada)" }, props: { label: true, blank_selection: "Select a Time Zone...", required: true } %>
40
41
 
41
42
  <%= form.actions do |action| %>
42
43
  <%= action.submit %>
@@ -0,0 +1,71 @@
1
+
2
+ import React from 'react'
3
+ import classnames from 'classnames'
4
+ import { buildAriaProps, buildCss, buildDataProps } from '../utilities/props'
5
+ import { globalProps } from '../utilities/globalProps'
6
+
7
+ import Button from '../pb_button/_button'
8
+ import Icon from '../pb_icon/_icon'
9
+ import { IconSizes } from "../pb_icon/_icon"
10
+
11
+ type IconButtonProps = {
12
+ aria?: { [key: string]: string },
13
+ className?: string,
14
+ data?: { [key: string]: string },
15
+ htmlType?: 'submit' | 'reset' | 'button' | undefined,
16
+ icon?: string,
17
+ id?: string,
18
+ link?: string,
19
+ newWindow?: boolean,
20
+ size?: IconSizes,
21
+ target?: string,
22
+ variant?: 'default' | 'link',
23
+ }
24
+
25
+ const IconButton = (props: IconButtonProps) => {
26
+ const {
27
+ aria = {},
28
+ className,
29
+ data = {},
30
+ htmlType = 'button',
31
+ icon = 'bars',
32
+ id,
33
+ link,
34
+ newWindow = false,
35
+ size = "2x",
36
+ target,
37
+ variant = "default",
38
+ } = props
39
+
40
+ const ariaProps = buildAriaProps(aria)
41
+ const dataProps = buildDataProps(data)
42
+ const classes = classnames(buildCss('pb_icon_button_kit', variant), globalProps(props), className)
43
+
44
+ return (
45
+ <div
46
+ {...ariaProps}
47
+ {...dataProps}
48
+ className={classes}
49
+ id={id}
50
+ >
51
+ <Button
52
+ borderRadius="lg"
53
+ htmlType={htmlType}
54
+ link={link}
55
+ newWindow={newWindow}
56
+ target={target}
57
+ >
58
+ <Icon
59
+ className="icon_button_icon"
60
+ fixedWidth
61
+ icon={icon}
62
+ paddingX="xxs"
63
+ paddingY="xs"
64
+ size={size}
65
+ />
66
+ </Button>
67
+ </div>
68
+ )
69
+ }
70
+
71
+ export default IconButton
@@ -1,3 +1,2 @@
1
1
  <%= pb_rails("icon_button") %>
2
- </br>
3
- <%= pb_rails("icon_button", props: {variant: "link"}) %>
2
+ <%= pb_rails("icon_button", props: {variant: "link", margin_top: "md" }) %>
@@ -0,0 +1,17 @@
1
+ import React from 'react'
2
+ import { IconButton } from 'playbook-ui'
3
+
4
+ const IconButtonDefault = (props) => (
5
+ <div>
6
+ <IconButton
7
+ {...props}
8
+ />
9
+ <IconButton
10
+ {...props}
11
+ marginTop="md"
12
+ variant="link"
13
+ />
14
+ </div>
15
+ )
16
+
17
+ export default IconButtonDefault
@@ -0,0 +1,27 @@
1
+ <%= pb_rails("flex", props: { align: "center"}) do %>
2
+ <%= pb_rails("icon_button", props: {size: "lg"}) %> <span>Large</span>
3
+ <% end %>
4
+
5
+ <%= pb_rails("flex", props: { align: "center" }) do %>
6
+ <%= pb_rails("icon_button", props: {size: "sm"}) %> <span>Small</span>
7
+ <% end %>
8
+
9
+ <%= pb_rails("flex", props: { align: "center" }) do %>
10
+ <%= pb_rails("icon_button", props: {size: "xs"}) %> <span>XSmall</span>
11
+ <% end %>
12
+
13
+ <%= pb_rails("flex", props: { align: "center", margin_top: "md" }) do %>
14
+ <%= pb_rails("icon_button", props: {size: "1x"}) %> <span>1x</span>
15
+ <% end %>
16
+
17
+ <%= pb_rails("flex", props: { align: "center" }) do %>
18
+ <%= pb_rails("icon_button", props: {size: "2x"}) %> <span>2x</span>
19
+ <% end %>
20
+
21
+ <%= pb_rails("flex", props: { align: "center" }) do %>
22
+ <%= pb_rails("icon_button", props: {size: "3x"}) %> <span>3x</span>
23
+ <% end %>
24
+
25
+ <%= pb_rails("flex", props: { align: "center" }) do %>
26
+ <%= pb_rails("icon_button", props: {size: "4x"}) %> <span>4x</span>
27
+ <% end %>
@@ -0,0 +1,61 @@
1
+ import React from 'react'
2
+ import { IconButton, Flex } from 'playbook-ui'
3
+
4
+ const IconButtonSizes = (props) => (
5
+ <div>
6
+ <Flex align="center">
7
+ <IconButton
8
+ {...props}
9
+ size="lg"
10
+ />
11
+ <span>Large</span>
12
+ </Flex>
13
+ <Flex align="center">
14
+ <IconButton
15
+ {...props}
16
+ size="sm"
17
+ />
18
+ <span>Small</span>
19
+ </Flex>
20
+ <Flex align="center">
21
+ <IconButton
22
+ {...props}
23
+ size="xs"
24
+ />
25
+ <span>XSmall</span>
26
+ </Flex>
27
+ <Flex
28
+ align="center"
29
+ marginTop="md"
30
+ >
31
+ <IconButton
32
+ {...props}
33
+ size="1x"
34
+ />
35
+ <span>1x</span>
36
+ </Flex>
37
+ <Flex align="center">
38
+ <IconButton
39
+ {...props}
40
+ size="2x"
41
+ />
42
+ <span>2x</span>
43
+ </Flex>
44
+ <Flex align="center">
45
+ <IconButton
46
+ {...props}
47
+ size="3x"
48
+ />
49
+ <span>3x</span>
50
+ </Flex>
51
+ <Flex align="center">
52
+ <IconButton
53
+ {...props}
54
+ size="4x"
55
+ />
56
+ <span>4x</span>
57
+ </Flex>
58
+ </div>
59
+ )
60
+
61
+ export default IconButtonSizes