playbook_ui 14.25.0.pre.alpha.dialogfix10277 → 14.25.0.pre.alpha.play1986inlineloadingsolidvariant9963

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 (230) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/_playbook.scss +1 -0
  3. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +6 -6
  4. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.test.jsx +1 -1
  5. data/app/pb_kits/playbook/pb_avatar/_avatar.scss +65 -60
  6. data/app/pb_kits/playbook/pb_avatar/avatar.test.js +1 -1
  7. data/app/pb_kits/playbook/pb_background/_background.scss +3 -3
  8. data/app/pb_kits/playbook/pb_badge/_badge.scss +29 -135
  9. data/app/pb_kits/playbook/pb_body/_body.scss +35 -108
  10. data/app/pb_kits/playbook/pb_body/_body_mixins.scss +1 -1
  11. data/app/pb_kits/playbook/pb_bread_crumbs/_bread_crumbs.scss +30 -17
  12. data/app/pb_kits/playbook/pb_button/_button.scss +31 -39
  13. data/app/pb_kits/playbook/pb_button/_button.tsx +12 -12
  14. data/app/pb_kits/playbook/pb_button/_button_mixins.scss +1 -1
  15. data/app/pb_kits/playbook/pb_button/button.rb +18 -11
  16. data/app/pb_kits/playbook/pb_button/button.test.js +3 -3
  17. data/app/pb_kits/playbook/pb_button_toolbar/_button_toolbar.scss +73 -82
  18. data/app/pb_kits/playbook/pb_button_toolbar/_button_toolbar_dark.scss +33 -32
  19. data/app/pb_kits/playbook/pb_button_toolbar/_button_toolbar_mixins.scss +1 -1
  20. data/app/pb_kits/playbook/pb_button_toolbar/button_toolbar.test.js +2 -2
  21. data/app/pb_kits/playbook/pb_caption/_caption.scss +17 -100
  22. data/app/pb_kits/playbook/pb_caption/_caption_mixin.scss +8 -1
  23. data/app/pb_kits/playbook/pb_card/_card.scss +79 -116
  24. data/app/pb_kits/playbook/pb_card/_card.tsx +11 -26
  25. data/app/pb_kits/playbook/pb_card/_card_mixin.scss +1 -1
  26. data/app/pb_kits/playbook/pb_card/card.rb +7 -8
  27. data/app/pb_kits/playbook/pb_card/card_header.rb +2 -6
  28. data/app/pb_kits/playbook/pb_card/docs/_card_header.html.erb +1 -1
  29. data/app/pb_kits/playbook/pb_checkbox/_checkbox.scss +2 -11
  30. data/app/pb_kits/playbook/pb_circle_icon_button/_circle_icon_button.scss +7 -7
  31. data/app/pb_kits/playbook/pb_circle_icon_button/circle_icon_button.test.js +1 -1
  32. data/app/pb_kits/playbook/pb_collapsible/__snapshots__/collapsible.test.js.snap +1 -1
  33. data/app/pb_kits/playbook/pb_collapsible/_collapsible.scss +4 -4
  34. data/app/pb_kits/playbook/pb_copy_button/copy_button.test.jsx +1 -1
  35. data/app/pb_kits/playbook/pb_currency/_currency.scss +39 -124
  36. data/app/pb_kits/playbook/pb_dashboard_value/_dashboard_value.scss +6 -16
  37. data/app/pb_kits/playbook/pb_date/_date.scss +18 -16
  38. data/app/pb_kits/playbook/pb_date_picker/_date_picker.scss +1 -1
  39. data/app/pb_kits/playbook/pb_date_picker/sass_partials/_inline_styles.scss +12 -12
  40. data/app/pb_kits/playbook/pb_date_picker/sass_partials/_input_styles.scss +2 -2
  41. data/app/pb_kits/playbook/pb_date_picker/sass_partials/_time_selection_styles.scss +5 -6
  42. data/app/pb_kits/playbook/pb_date_range_inline/_date_range_inline.scss +23 -29
  43. data/app/pb_kits/playbook/pb_date_range_inline/_date_range_inline.tsx +1 -1
  44. data/app/pb_kits/playbook/pb_date_range_stacked/_date_range_stacked.scss +1 -1
  45. data/app/pb_kits/playbook/pb_date_range_stacked/date_range_stacked.test.js +2 -2
  46. data/app/pb_kits/playbook/pb_date_stacked/_date_stacked.scss +26 -66
  47. data/app/pb_kits/playbook/pb_date_stacked/date_stacked.rb +1 -1
  48. data/app/pb_kits/playbook/pb_date_stacked/date_stacked.test.js +2 -2
  49. data/app/pb_kits/playbook/pb_date_time/_date_time.scss +15 -8
  50. data/app/pb_kits/playbook/pb_date_time_stacked/_date_time_stacked.scss +7 -6
  51. data/app/pb_kits/playbook/pb_date_year_stacked/_date_year_stacked.scss +14 -17
  52. data/app/pb_kits/playbook/pb_date_year_stacked/date_year_stacked.test.js +1 -1
  53. data/app/pb_kits/playbook/pb_detail/_detail.scss +21 -86
  54. data/app/pb_kits/playbook/pb_dialog/_dialog.scss +123 -330
  55. data/app/pb_kits/playbook/pb_dialog/_dialog.tsx +7 -5
  56. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_loading.html.erb +2 -16
  57. data/app/pb_kits/playbook/pb_distribution_bar/_distribution_bar.scss +7 -10
  58. data/app/pb_kits/playbook/pb_draggable/draggable.test.jsx +1 -1
  59. data/app/pb_kits/playbook/pb_drawer/_close_icon.tsx +25 -0
  60. data/app/pb_kits/playbook/pb_drawer/_drawer.scss +381 -0
  61. data/app/pb_kits/playbook/pb_drawer/_drawer.tsx +231 -0
  62. data/app/pb_kits/playbook/pb_drawer/_drawer_context.tsx +3 -0
  63. data/app/pb_kits/playbook/pb_drawer/context.ts +11 -0
  64. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_behavior.html.erb +8 -0
  65. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_behavior.jsx +41 -0
  66. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_borders.html.erb +33 -0
  67. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_borders.jsx +78 -0
  68. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_breakpoints.html.erb +3 -0
  69. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_breakpoints.jsx +26 -0
  70. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_default.html.erb +20 -0
  71. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_default.jsx +59 -0
  72. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_menu.html.erb +24 -0
  73. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_menu.jsx +61 -0
  74. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_menu.md +24 -0
  75. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_overlay.html.erb +21 -0
  76. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_overlay.jsx +54 -0
  77. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_overlay.md +1 -0
  78. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_sizes.html.erb +49 -0
  79. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_sizes.jsx +99 -0
  80. data/app/pb_kits/playbook/pb_drawer/docs/example.yml +20 -0
  81. data/app/pb_kits/playbook/pb_drawer/docs/index.js +7 -0
  82. data/app/pb_kits/playbook/pb_drawer/drawer.html.erb +20 -0
  83. data/app/pb_kits/playbook/pb_drawer/drawer.rb +56 -0
  84. data/app/pb_kits/playbook/pb_drawer/drawer.test.jsx +81 -0
  85. data/app/pb_kits/playbook/pb_drawer/hooks/useBreakpoint.tsx +60 -0
  86. data/app/pb_kits/playbook/pb_drawer/hooks/useDrawerAnimation.tsx +21 -0
  87. data/app/pb_kits/playbook/pb_drawer/index.js +257 -0
  88. data/app/pb_kits/playbook/pb_dropdown/_dropdown.scss +1 -1
  89. data/app/pb_kits/playbook/pb_dropdown/dropdown.test.jsx +6 -6
  90. data/app/pb_kits/playbook/pb_dropdown/index.js +3 -3
  91. data/app/pb_kits/playbook/pb_empty_state/_empty_state.scss +4 -4
  92. data/app/pb_kits/playbook/pb_file_upload/_file_upload.scss +9 -20
  93. data/app/pb_kits/playbook/pb_file_upload/file_upload.html.erb +1 -1
  94. data/app/pb_kits/playbook/pb_filter/_filter.scss +8 -8
  95. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/_fixed_confirmation_toast.scss +29 -65
  96. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/_fixed_confirmation_toast.tsx +2 -1
  97. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/fixed_confirmation_toast.test.js +1 -1
  98. data/app/pb_kits/playbook/pb_flex/_flex.scss +100 -106
  99. data/app/pb_kits/playbook/pb_flex/_flex.tsx +25 -32
  100. data/app/pb_kits/playbook/pb_flex/_flex_item.scss +51 -146
  101. data/app/pb_kits/playbook/pb_flex/_flex_item.tsx +8 -19
  102. data/app/pb_kits/playbook/pb_flex/flex.rb +16 -16
  103. data/app/pb_kits/playbook/pb_flex/flex_item.rb +6 -6
  104. data/app/pb_kits/playbook/pb_form_group/_form_group.scss +1 -1
  105. data/app/pb_kits/playbook/pb_form_pill/_form_pill.scss +344 -381
  106. data/app/pb_kits/playbook/pb_form_pill/_form_pill.test.jsx +4 -4
  107. data/app/pb_kits/playbook/pb_form_pill/_form_pill.tsx +7 -8
  108. data/app/pb_kits/playbook/pb_form_pill/form_pill.rb +2 -9
  109. data/app/pb_kits/playbook/pb_gauge/_gauge.scss +5 -5
  110. data/app/pb_kits/playbook/pb_hashtag/_hashtag.scss +1 -1
  111. data/app/pb_kits/playbook/pb_highlight/_highlight.scss +1 -1
  112. data/app/pb_kits/playbook/pb_home_address_street/home_adress_street.test.js +2 -2
  113. data/app/pb_kits/playbook/pb_icon_button/_icon_button.scss +4 -4
  114. data/app/pb_kits/playbook/pb_icon_circle/_icon_circle.scss +39 -40
  115. data/app/pb_kits/playbook/pb_icon_circle/icon_circle.rb +1 -1
  116. data/app/pb_kits/playbook/pb_icon_stat_value/icon_stat_value.test.js +1 -1
  117. data/app/pb_kits/playbook/pb_icon_value/_icon_value.scss +15 -16
  118. data/app/pb_kits/playbook/pb_image/_image.scss +36 -41
  119. data/app/pb_kits/playbook/pb_label_pill/_label_pill.scss +1 -1
  120. data/app/pb_kits/playbook/pb_label_value/_label_value.scss +2 -3
  121. data/app/pb_kits/playbook/pb_label_value/label_value.test.js +2 -2
  122. data/app/pb_kits/playbook/pb_layout/_layout.scss +305 -336
  123. data/app/pb_kits/playbook/pb_layout/_layout.tsx +11 -14
  124. data/app/pb_kits/playbook/pb_layout/item.rb +7 -1
  125. data/app/pb_kits/playbook/pb_layout/layout.rb +25 -16
  126. data/app/pb_kits/playbook/pb_layout/layout.test.js +3 -3
  127. data/app/pb_kits/playbook/pb_legend/_legend.scss +16 -66
  128. data/app/pb_kits/playbook/pb_legend/legend.test.js +1 -1
  129. data/app/pb_kits/playbook/pb_lightbox/lightbox.scss +4 -4
  130. data/app/pb_kits/playbook/pb_lightbox/lightbox.test.jsx +1 -1
  131. data/app/pb_kits/playbook/pb_link/_link.scss +19 -113
  132. data/app/pb_kits/playbook/pb_list/_list.scss +1 -1
  133. data/app/pb_kits/playbook/pb_loading_inline/_loading_inline.scss +11 -13
  134. data/app/pb_kits/playbook/pb_loading_inline/_loading_inline.tsx +3 -1
  135. data/app/pb_kits/playbook/pb_loading_inline/docs/_loading_inline_variant.html.erb +5 -0
  136. data/app/pb_kits/playbook/pb_loading_inline/docs/_loading_inline_variant.jsx +24 -0
  137. data/app/pb_kits/playbook/pb_loading_inline/docs/example.yml +2 -0
  138. data/app/pb_kits/playbook/pb_loading_inline/docs/index.js +1 -0
  139. data/app/pb_kits/playbook/pb_loading_inline/loading_inline.html.erb +1 -1
  140. data/app/pb_kits/playbook/pb_loading_inline/loading_inline.rb +11 -0
  141. data/app/pb_kits/playbook/pb_map/_map.scss +1 -1
  142. data/app/pb_kits/playbook/pb_map/docs/_map_default.jsx +1 -1
  143. data/app/pb_kits/playbook/pb_map/docs/_map_with_custom_button.jsx +1 -1
  144. data/app/pb_kits/playbook/pb_map/docs/_map_with_plugin.jsx +1 -1
  145. data/app/pb_kits/playbook/pb_message/_message.scss +16 -21
  146. data/app/pb_kits/playbook/pb_message/_message.tsx +0 -1
  147. data/app/pb_kits/playbook/pb_message/_message_mixins.scss +12 -5
  148. data/app/pb_kits/playbook/pb_message/message.html.erb +1 -1
  149. data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.scss +3 -6
  150. data/app/pb_kits/playbook/pb_multiple_users/_multiple_users.scss +15 -16
  151. data/app/pb_kits/playbook/pb_multiple_users_stacked/_multiple_users_stacked.scss +1 -1
  152. data/app/pb_kits/playbook/pb_nav/_bold_mixin.scss +1 -1
  153. data/app/pb_kits/playbook/pb_nav/_collapsible_nav.scss +1 -1
  154. data/app/pb_kits/playbook/pb_online_status/_online_status.scss +15 -19
  155. data/app/pb_kits/playbook/pb_online_status/_online_status.tsx +1 -1
  156. data/app/pb_kits/playbook/pb_online_status/online_status.rb +4 -5
  157. data/app/pb_kits/playbook/pb_online_status/online_status.test.js +2 -2
  158. data/app/pb_kits/playbook/pb_overlay/_overlay.scss +1 -1
  159. data/app/pb_kits/playbook/pb_overlay/overlay.rb +1 -1
  160. data/app/pb_kits/playbook/pb_passphrase/_passphrase.scss +2 -5
  161. data/app/pb_kits/playbook/pb_person/_person.scss +1 -1
  162. data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.scss +1 -1
  163. data/app/pb_kits/playbook/pb_pill/_pill.scss +21 -23
  164. data/app/pb_kits/playbook/pb_progress_pills/_progress_pills.scss +13 -15
  165. data/app/pb_kits/playbook/pb_progress_simple/_progress_simple.scss +33 -108
  166. data/app/pb_kits/playbook/pb_progress_step/_progress_step.scss +1 -1
  167. data/app/pb_kits/playbook/pb_radio/_radio.scss +52 -71
  168. data/app/pb_kits/playbook/pb_radio/_radio.tsx +1 -1
  169. data/app/pb_kits/playbook/pb_radio/docs/_radio_react_hook.jsx +3 -0
  170. data/app/pb_kits/playbook/pb_rich_text_editor/_rich_text_editor.scss +4 -4
  171. data/app/pb_kits/playbook/pb_section_separator/_section_separator.scss +70 -81
  172. data/app/pb_kits/playbook/pb_section_separator/_section_separator.tsx +1 -9
  173. data/app/pb_kits/playbook/pb_section_separator/_section_separator_mixin.scss +1 -1
  174. data/app/pb_kits/playbook/pb_section_separator/docs/_section_separator_color.jsx +1 -3
  175. data/app/pb_kits/playbook/pb_section_separator/section_separator.rb +1 -7
  176. data/app/pb_kits/playbook/pb_select/_select.scss +4 -4
  177. data/app/pb_kits/playbook/pb_selectable_card/_selectable_card.scss +2 -6
  178. data/app/pb_kits/playbook/pb_selectable_card_icon/_selectable_card_icon.scss +8 -17
  179. data/app/pb_kits/playbook/pb_selectable_icon/_selectable_icon.scss +29 -39
  180. data/app/pb_kits/playbook/pb_selectable_list/_item.tsx +0 -2
  181. data/app/pb_kits/playbook/pb_selectable_list/_selectable_list.scss +11 -8
  182. data/app/pb_kits/playbook/pb_selectable_list/selectable_list.test.js +3 -2
  183. data/app/pb_kits/playbook/pb_selectable_list/selectable_list_item.html.erb +2 -2
  184. data/app/pb_kits/playbook/pb_source/_source.scss +8 -8
  185. data/app/pb_kits/playbook/pb_star_rating/_star_rating.scss +1 -1
  186. data/app/pb_kits/playbook/pb_star_rating/star_rating.test.js +1 -1
  187. data/app/pb_kits/playbook/pb_stat_value/_stat_value.scss +2 -2
  188. data/app/pb_kits/playbook/pb_text_input/_text_input.scss +5 -5
  189. data/app/pb_kits/playbook/pb_textarea/_textarea.scss +6 -6
  190. data/app/pb_kits/playbook/pb_time/_time.scss +17 -44
  191. data/app/pb_kits/playbook/pb_time_range_inline/_time_range_inline.scss +23 -44
  192. data/app/pb_kits/playbook/pb_time_range_inline/time_range_inline.rb +1 -1
  193. data/app/pb_kits/playbook/pb_time_stacked/_time_stacked.scss +8 -5
  194. data/app/pb_kits/playbook/pb_timestamp/_timestamp.scss +10 -16
  195. data/app/pb_kits/playbook/pb_timestamp/_timestamp.tsx +4 -1
  196. data/app/pb_kits/playbook/pb_timestamp/timestamp.rb +1 -1
  197. data/app/pb_kits/playbook/pb_timestamp/timestamp.test.js +2 -2
  198. data/app/pb_kits/playbook/pb_title/_title.scss +39 -44
  199. data/app/pb_kits/playbook/pb_title/_title.tsx +8 -17
  200. data/app/pb_kits/playbook/pb_title/_title_mixin.scss +2 -2
  201. data/app/pb_kits/playbook/pb_title/title.rb +10 -20
  202. data/app/pb_kits/playbook/pb_title/title.test.js +4 -4
  203. data/app/pb_kits/playbook/pb_title_count/_title_count.scss +8 -19
  204. data/app/pb_kits/playbook/pb_title_detail/_title_detail.scss +11 -10
  205. data/app/pb_kits/playbook/pb_toggle/_toggle.scss +1 -4
  206. data/app/pb_kits/playbook/pb_tooltip/_tooltip.scss +4 -3
  207. data/app/pb_kits/playbook/pb_tooltip/tooltip.rb +1 -1
  208. data/app/pb_kits/playbook/pb_typeahead/_typeahead.test.jsx +3 -3
  209. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills.html.erb +1 -1
  210. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills.jsx +1 -1
  211. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_color.html.erb +22 -1
  212. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_color.jsx +1 -1
  213. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_without_pills.html.erb +2 -2
  214. data/app/pb_kits/playbook/pb_user/_user.scss +33 -83
  215. data/app/pb_kits/playbook/pb_user/user.test.js +1 -1
  216. data/app/pb_kits/playbook/pb_user_badge/_user_badge.scss +8 -23
  217. data/app/pb_kits/playbook/pb_weekday_stacked/_weekday_stacked.scss +10 -10
  218. data/app/pb_kits/playbook/pb_weekday_stacked/weekday_stacked.test.jsx +3 -3
  219. data/dist/chunks/{_line_graph-CApw7aQD.js → _line_graph-CiVc-Cod.js} +1 -1
  220. data/dist/chunks/{_typeahead-J1_avqdO.js → _typeahead-BQnvz-Ks.js} +1 -1
  221. data/dist/chunks/_weekday_stacked-BkvHv3ZO.js +37 -0
  222. data/dist/chunks/vendor.js +1 -1
  223. data/dist/menu.yml +6 -0
  224. data/dist/playbook-doc.js +2 -2
  225. data/dist/playbook-rails-react-bindings.js +1 -1
  226. data/dist/playbook-rails.js +1 -1
  227. data/dist/playbook.css +1 -1
  228. data/lib/playbook/version.rb +1 -1
  229. metadata +36 -5
  230. data/dist/chunks/_weekday_stacked-Bugv1mOh.js +0 -37
@@ -0,0 +1,81 @@
1
+ import React, { useState } from 'react';
2
+ import { render, fireEvent, screen } from '../utilities/test-utils';
3
+ import { Drawer, Button } from 'playbook-ui';
4
+ import { waitFor } from '@testing-library/react';
5
+
6
+ const size = 'sm';
7
+
8
+ function DrawerTest({ props }) {
9
+ const [isOpen, setIsOpen] = useState(false);
10
+ const close = () => setIsOpen(false);
11
+ const open = () => setIsOpen(true);
12
+
13
+ return (
14
+ <>
15
+ <Button onClick={open}>{'Open Drawer'}</Button>
16
+ <Drawer
17
+ className="wrapper"
18
+ id="drawer-id"
19
+ onClose={close}
20
+ opened={isOpen}
21
+ placement="left"
22
+ portalClassName="portal"
23
+ size={size}
24
+ {...props}
25
+ >
26
+ {props && props.children}
27
+ </Drawer>
28
+ </>
29
+ );
30
+ }
31
+
32
+ test('renders with the right border class when border prop is right', async () => {
33
+ render(<DrawerTest props={{ border: 'right' }} />);
34
+
35
+ fireEvent.click(screen.getByText('Open Drawer'));
36
+
37
+ await waitFor(() => expect(document.getElementById('drawer-id')).toBeInTheDocument());
38
+
39
+ const container = document.getElementById('drawer-id');
40
+ const drawer = container.querySelector('#drawer-id .pb_drawer');
41
+
42
+ expect(drawer).toHaveClass('drawer_border-right');
43
+ });
44
+
45
+ test('renders with the full border class when border prop is full', async () => {
46
+ render(<DrawerTest props={{ border: 'full' }} />);
47
+
48
+ fireEvent.click(screen.getByText('Open Drawer'));
49
+
50
+ await waitFor(() => expect(document.getElementById('drawer-id')).toBeInTheDocument());
51
+
52
+ const container = document.getElementById('drawer-id');
53
+ const drawer = container.querySelector('#drawer-id .pb_drawer');
54
+ expect(drawer).toHaveClass('drawer_border-full');
55
+ });
56
+
57
+ test('does not have a border class when border prop is none', async () => {
58
+ render(<DrawerTest props={{ border: 'none' }} />);
59
+
60
+ fireEvent.click(screen.getByText('Open Drawer'));
61
+
62
+ await waitFor(() => expect(document.getElementById('drawer-id')).toBeInTheDocument());
63
+
64
+ const container = document.getElementById('drawer-id');
65
+ const drawer = container.querySelector('#drawer-id .pb_drawer');
66
+ expect(drawer).not.toHaveClass('drawer_border-right');
67
+ expect(drawer).not.toHaveClass('drawer_border-left');
68
+ expect(drawer).not.toHaveClass('drawer_border-full');
69
+ });
70
+
71
+ test('renders the correct size class for a large drawer', async () => {
72
+ render(<DrawerTest props={{ size: 'lg' }} />);
73
+
74
+ fireEvent.click(screen.getByText('Open Drawer'));
75
+
76
+ await waitFor(() => expect(document.getElementById('drawer-id')).toBeInTheDocument());
77
+
78
+ const container = document.getElementById('drawer-id');
79
+ const drawer = container.querySelector('#drawer-id .pb_drawer');
80
+ expect(drawer).toHaveClass('pb_drawer pb_drawer_lg_left');
81
+ });
@@ -0,0 +1,60 @@
1
+ import { useState, useEffect } from 'react'
2
+
3
+ export const breakpointValues = {
4
+ none: 0,
5
+ xs: 575,
6
+ sm: 768,
7
+ md: 992,
8
+ lg: 1200,
9
+ xl: 1400,
10
+ } as const
11
+
12
+ type BreakpointSize = keyof typeof breakpointValues
13
+
14
+ interface UseBreakpointProps {
15
+ breakpoint?: BreakpointSize
16
+ triggerId?: string
17
+ }
18
+
19
+ export const useBreakpoint = ({
20
+ breakpoint = 'none',
21
+ triggerId
22
+ }: UseBreakpointProps) => {
23
+ const [isOpenBreakpointOpen, setIsOpenBreakpointOpen] = useState(false)
24
+ const [isUserClosed, setIsUserClosed] = useState(false)
25
+
26
+ useEffect(() => {
27
+ if (breakpoint === 'none') return
28
+
29
+ const handleResize = () => {
30
+ const width = window.innerWidth
31
+
32
+ const openBreakpointWidth = breakpointValues[breakpoint]
33
+ if (width >= openBreakpointWidth) {
34
+ setIsOpenBreakpointOpen(true)
35
+ } else {
36
+ setIsOpenBreakpointOpen(false)
37
+ setIsUserClosed(false)
38
+ }
39
+
40
+ // Handle menu button visibility
41
+ if (triggerId) {
42
+ const menuButton = document.getElementById(triggerId)
43
+ if (menuButton) {
44
+ menuButton.style.display = isOpenBreakpointOpen ? 'none' : ''
45
+ }
46
+ }
47
+ }
48
+
49
+ window.addEventListener('resize', handleResize)
50
+ handleResize()
51
+
52
+ return () => window.removeEventListener('resize', handleResize)
53
+ }, [breakpoint, triggerId, isOpenBreakpointOpen])
54
+
55
+ return {
56
+ isOpenBreakpointOpen,
57
+ isUserClosed,
58
+ setIsUserClosed
59
+ }
60
+ }
@@ -0,0 +1,21 @@
1
+ import { useState, useEffect } from 'react'
2
+
3
+ export const useDrawerAnimation = (isOpen: boolean) => {
4
+ const [animationState, setAnimationState] = useState('')
5
+
6
+ useEffect(() => {
7
+ if (isOpen) {
8
+ setAnimationState('afterOpen')
9
+ } else if (!isOpen && animationState === 'afterOpen') {
10
+ setAnimationState('beforeClose')
11
+ setTimeout(() => {
12
+ setAnimationState('')
13
+ }, 200)
14
+ }
15
+ }, [isOpen])
16
+
17
+ return {
18
+ animationState,
19
+ isVisible: isOpen || animationState === 'beforeClose'
20
+ }
21
+ }
@@ -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
+ }
@@ -287,4 +287,4 @@
287
287
  }
288
288
  }
289
289
  }
290
- }
290
+ }
@@ -278,7 +278,7 @@ test("MultiSelect prop to allow multiple selections + add correct Form Pills", (
278
278
  const option = Array.from(kit.querySelectorAll(".pb_dropdown_option_list"));
279
279
  fireEvent.click(option[0]); // Select first option
280
280
  fireEvent.click(option[1]); // Select second option
281
- const formPills = kit.querySelectorAll(".pb_form_pill_kit.pb_form_pill_primary");
281
+ const formPills = kit.querySelectorAll(".pb_form_pill_kit_primary");
282
282
  expect(formPills.length).toBe(2);
283
283
  expect(formPills[0]).toHaveTextContent("United States");
284
284
  expect(formPills[1]).toHaveTextContent("Canada");
@@ -314,7 +314,7 @@ test("renders form pills inside trigger", () => {
314
314
  const kit = screen.getByTestId(testId)
315
315
  const option = kit.querySelector('.pb_dropdown_option_list')
316
316
  fireEvent.click(option)
317
- const formPill = kit.querySelector(".pb_form_pill_kit.pb_form_pill_primary")
317
+ const formPill = kit.querySelector(".pb_form_pill_kit_primary")
318
318
  expect(formPill).toBeInTheDocument()
319
319
  })
320
320
 
@@ -333,7 +333,7 @@ test("multiSelect and autocomplete to work together", () => {
333
333
  expect(input).toBeInTheDocument()
334
334
  const option = kit.querySelector('.pb_dropdown_option_list')
335
335
  fireEvent.click(option)
336
- const formPill = kit.querySelector(".pb_form_pill_kit.pb_form_pill_primary")
336
+ const formPill = kit.querySelector(".pb_form_pill_kit_primary")
337
337
  expect(formPill).toBeInTheDocument()
338
338
  })
339
339
 
@@ -350,9 +350,9 @@ test("renders form pills with size and color", () => {
350
350
  const kit = screen.getByTestId(testId)
351
351
  const option = kit.querySelector('.pb_dropdown_option_list')
352
352
  fireEvent.click(option)
353
- const formPill = kit.querySelector(".pb_form_pill_kit.pb_form_pill_neutral")
353
+ const formPill = kit.querySelector(".pb_form_pill_kit_neutral")
354
354
  expect(formPill).toBeInTheDocument()
355
- expect(formPill).toHaveClass("pb_form_pill_small")
355
+ expect(formPill).toHaveClass("small")
356
356
  })
357
357
 
358
358
  test("defaultValue works with multiSelect", () => {
@@ -365,7 +365,7 @@ test("defaultValue works with multiSelect", () => {
365
365
  />
366
366
  )
367
367
  const kit = screen.getByTestId(testId)
368
- expect(kit.querySelectorAll(".pb_form_pill_kit.pb_form_pill_primary")).toHaveLength(2)
368
+ expect(kit.querySelectorAll(".pb_form_pill_kit_primary")).toHaveLength(2)
369
369
  const option2 = Array.from(kit.querySelectorAll(".pb_dropdown_option_list"));
370
370
  const firstOpt = options[0].label
371
371
  expect(option2[0]).not.toHaveTextContent(firstOpt)
@@ -507,14 +507,14 @@ export default class PbDropdown extends PbEnhancedElement {
507
507
  // Create a form pill for each selected option
508
508
  const pill = document.createElement("div");
509
509
  const color = this.formPillProps.color || "primary";
510
- pill.classList.add("pb_form_pill_kit", `pb_form_pill_${color}`, "pb_form_pill_none", "mr_xs");
510
+ pill.classList.add(`pb_form_pill_kit_${color}`, "mr_xs");
511
511
  if (this.formPillProps.size === "small") {
512
- pill.classList.add("pb_form_pill_small");
512
+ pill.classList.add("small");
513
513
  }
514
514
  pill.tabIndex = 0;
515
515
  pill.dataset.pillId = JSON.parse(option).id;
516
516
  const innerDiv = document.createElement("h3");
517
- innerDiv.className = "pb_title_kit pb_title_4 pb_form_pill_text";
517
+ innerDiv.className = "pb_title_kit_size_4 pb_form_pill_text";
518
518
  innerDiv.textContent = JSON.parse(option).label;
519
519
  pill.appendChild(innerDiv);
520
520
 
@@ -37,9 +37,9 @@
37
37
  }
38
38
 
39
39
  &.dark {
40
- .pb_title_kit,
41
- .pb_body_kit,
42
- .pb_detail_kit,
43
- .pb_button_kit_link:hover { color: $white; }
40
+ [class*="pb_title_kit"],
41
+ [class*="pb_body_kit"],
42
+ [class*="pb_detail_kit"],
43
+ [class*="pb_button_kit_link"]:hover { color: $white; }
44
44
  }
45
45
  }
@@ -1,5 +1,5 @@
1
- .pb_file_upload_kit {
2
- .pb_card_kit_deselected_border_radius_md {
1
+ [class^='pb_file_upload_kit'] {
2
+ [class^='pb_card_kit'] {
3
3
  border: 1px #ccc dashed;
4
4
  text-align: center;
5
5
  }
@@ -9,33 +9,22 @@
9
9
  border: none;
10
10
  width: 0;
11
11
  }
12
- &.error,
13
- &.pb_file_upload_kit_error {
14
- .pb_card_kit_deselected_border_radius_md {
12
+ &.error {
13
+ [class^='pb_card_kit'] {
15
14
  border-color: $error;
16
15
  }
17
- .pb_body_kit_negative {
16
+ [class^='pb_body_kit'][status="negative"] {
18
17
  margin-top: $space_xs;
19
18
  }
20
19
  }
21
20
  }
22
21
 
23
- .pb_file_upload_kit_error {
24
- ::file-selector-button {
25
- visibility: hidden;
26
- padding: 0;
27
- border: none;
28
- width: 0;
29
- }
30
- }
31
-
32
- .dark .pb_file_upload_kit {
33
- .pb_card_kit_deselected_border_radius_md {
22
+ .dark [class*='pb_file_upload_kit'] {
23
+ [class*='pb_card_kit'] {
34
24
  border: 1px $text_dk_lighter dashed;
35
25
  }
36
- &.error,
37
- &.pb_file_upload_kit_error {
38
- .pb_card_kit_deselected_border_radius_md {
26
+ &.error {
27
+ [class^='pb_card_kit'] {
39
28
  border-color: $error_dark;
40
29
  }
41
30
  }
@@ -2,7 +2,7 @@
2
2
  <%= pb_rails("form_group", props: {cursor: "pointer", full_width: object.full_width}) do %>
3
3
  <label
4
4
  for="upload-<%= object.id %>"
5
- class="pb_button_kit pb_button_secondary pb_button_inline pb_button_enabled <%= 'dark' if object.dark %>"
5
+ class="pb_button_kit_secondary_inline_enabled <%= 'dark' if object.dark %>"
6
6
  >
7
7
  <%= "#{object.label}" %>
8
8
  </label>
@@ -6,7 +6,7 @@
6
6
  padding: 0 $space_sm !important;
7
7
  }
8
8
 
9
- .pb_button_kit.pb_button_link {
9
+ [class^=pb_button_kit][class*=_link] {
10
10
  flex-shrink:0;
11
11
  padding: 0 $space_xs !important;
12
12
  [id^="sort"] {
@@ -14,19 +14,19 @@
14
14
  }
15
15
  }
16
16
 
17
- .pb_card_body_kit_md {
17
+ [class^=pb_card_body_kit][class*=_md] {
18
18
  padding: 0 !important;
19
19
  }
20
20
  }
21
21
 
22
- .pb_filter_kit {
23
- .pb_circle_icon_button_kit {
22
+ [class^=pb_filter_kit] {
23
+ [class^=pb_circle_icon_button_kit] {
24
24
  padding-left: $space_sm !important;
25
25
  padding-top: $space_sm !important;
26
26
  padding-bottom: $space_sm !important;
27
27
  }
28
28
 
29
- .pb-form {
29
+ [class^=pb-form] {
30
30
  padding: $space_sm ;
31
31
  }
32
32
 
@@ -88,11 +88,11 @@
88
88
  z-index: 1;
89
89
  }
90
90
 
91
- .pb_collapsible_kit .toggle-content.filter_section_collapsible {
91
+ [class^=pb_collapsible_kit] .toggle-content.filter_section_collapsible {
92
92
  padding-top: $space_xs !important;
93
93
  }
94
94
 
95
- &.dark {
95
+ &[class*=dark] {
96
96
  .filters .filter {
97
97
  border-right: 1px solid $border_dark !important;
98
98
  }
@@ -103,4 +103,4 @@
103
103
  opacity:0;
104
104
  }
105
105
  }
106
- }
106
+ }