playbook_ui 14.12.0.pre.alpha.testingwithfas5689 → 14.12.0.pre.rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/_playbook.scss +0 -2
  3. data/app/pb_kits/playbook/pb_advanced_table/Components/CustomCell.tsx +2 -18
  4. data/app/pb_kits/playbook/pb_advanced_table/Components/TableHeaderCell.tsx +5 -27
  5. data/app/pb_kits/playbook/pb_advanced_table/SubKits/TableBody.tsx +2 -17
  6. data/app/pb_kits/playbook/pb_advanced_table/SubKits/TableHeader.tsx +1 -23
  7. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +0 -29
  8. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +4 -61
  9. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.html.erb +8 -13
  10. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.rb +1 -3
  11. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_pagination.jsx +0 -1
  12. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_pagination_with_props.jsx +0 -1
  13. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_sort_control.md +2 -2
  14. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +0 -7
  15. data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +1 -6
  16. data/app/pb_kits/playbook/pb_advanced_table/table_body.rb +3 -15
  17. data/app/pb_kits/playbook/pb_advanced_table/table_header.html.erb +11 -11
  18. data/app/pb_kits/playbook/pb_advanced_table/table_header.rb +3 -12
  19. data/app/pb_kits/playbook/pb_advanced_table/table_row.html.erb +1 -1
  20. data/app/pb_kits/playbook/pb_advanced_table/table_row.rb +1 -7
  21. data/app/pb_kits/playbook/pb_advanced_table/table_subrow_header.html.erb +1 -1
  22. data/app/pb_kits/playbook/pb_advanced_table/table_subrow_header.rb +0 -9
  23. data/app/pb_kits/playbook/pb_button/button.html.erb +3 -2
  24. data/app/pb_kits/playbook/pb_button/button.rb +1 -1
  25. data/app/pb_kits/playbook/pb_card/card.html.erb +2 -21
  26. data/app/pb_kits/playbook/pb_card/card.rb +0 -7
  27. data/app/pb_kits/playbook/pb_checkbox/checkbox.html.erb +6 -1
  28. data/app/pb_kits/playbook/pb_collapsible/__snapshots__/collapsible.test.js.snap +1 -1
  29. data/app/pb_kits/playbook/pb_collapsible/collapsible.html.erb +1 -3
  30. data/app/pb_kits/playbook/pb_collapsible/collapsible.rb +0 -3
  31. data/app/pb_kits/playbook/pb_date_picker/date_picker.html.erb +16 -24
  32. data/app/pb_kits/playbook/pb_date_picker/date_picker.rb +0 -2
  33. data/app/pb_kits/playbook/pb_date_picker/date_picker_helper.ts +2 -2
  34. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_default_date.md +1 -1
  35. data/app/pb_kits/playbook/pb_date_picker/docs/example.yml +0 -1
  36. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_cards_rails.html.erb +3 -1
  37. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_cards_rails.md +0 -7
  38. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_list_rails.html.erb +9 -3
  39. data/app/pb_kits/playbook/pb_draggable/docs/example.yml +0 -1
  40. data/app/pb_kits/playbook/pb_drawer/_drawer.scss +183 -145
  41. data/app/pb_kits/playbook/pb_drawer/_drawer.tsx +268 -158
  42. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_borders.jsx +45 -3
  43. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_breakpoints.jsx +1 -0
  44. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_default.jsx +16 -9
  45. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_menu.jsx +19 -44
  46. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_menu.md +3 -21
  47. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_overlay.jsx +21 -16
  48. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_sizes.jsx +19 -2
  49. data/app/pb_kits/playbook/pb_drawer/docs/example.yml +1 -2
  50. data/app/pb_kits/playbook/pb_drawer/docs/index.js +0 -1
  51. data/app/pb_kits/playbook/pb_drawer/drawer.test.jsx +5 -5
  52. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_subtle_variant.md +1 -1
  53. data/app/pb_kits/playbook/pb_dropdown/dropdown.html.erb +12 -7
  54. data/app/pb_kits/playbook/pb_dropdown/dropdown_container.html.erb +14 -9
  55. data/app/pb_kits/playbook/pb_dropdown/dropdown_option.html.erb +11 -6
  56. data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.html.erb +14 -8
  57. data/app/pb_kits/playbook/pb_icon/_icon.tsx +1 -1
  58. data/app/pb_kits/playbook/pb_icon/icon.rb +2 -2
  59. data/app/pb_kits/playbook/pb_icon/icon.test.js +8 -8
  60. data/app/pb_kits/playbook/pb_list/item.html.erb +8 -30
  61. data/app/pb_kits/playbook/pb_list/item.rb +0 -7
  62. data/app/pb_kits/playbook/pb_list/list.html.erb +11 -31
  63. data/app/pb_kits/playbook/pb_list/list.rb +0 -4
  64. data/app/pb_kits/playbook/pb_loading_inline/_loading_inline.tsx +1 -6
  65. data/app/pb_kits/playbook/pb_multiple_users/_multiple_users.scss +0 -4
  66. data/app/pb_kits/playbook/pb_multiple_users/_multiple_users.tsx +0 -1
  67. data/app/pb_kits/playbook/pb_multiple_users/multiple_users.html.erb +1 -1
  68. data/app/pb_kits/playbook/pb_nav/_nav_item.test.js +2 -2
  69. data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.tsx +12 -30
  70. data/app/pb_kits/playbook/pb_phone_number_input/docs/example.yml +1 -3
  71. data/app/pb_kits/playbook/pb_phone_number_input/docs/index.js +0 -1
  72. data/app/pb_kits/playbook/pb_phone_number_input/phone_number_input.rb +0 -3
  73. data/app/pb_kits/playbook/pb_phone_number_input/phone_number_input.test.js +1 -20
  74. data/app/pb_kits/playbook/pb_radio/_radio.scss +8 -12
  75. data/app/pb_kits/playbook/pb_radio/docs/_radio_custom_children.jsx +3 -8
  76. data/app/pb_kits/playbook/pb_select/_select.scss +5 -3
  77. data/app/pb_kits/playbook/pb_select/_select.tsx +1 -5
  78. data/app/pb_kits/playbook/pb_select/select.html.erb +2 -2
  79. data/app/pb_kits/playbook/pb_selectable_icon/_selectable_icon.tsx +1 -9
  80. data/app/pb_kits/playbook/pb_selectable_icon/docs/_selectable_icon_default.jsx +1 -4
  81. data/app/pb_kits/playbook/pb_selectable_icon/docs/_selectable_icon_single_select.jsx +1 -4
  82. data/app/pb_kits/playbook/pb_selectable_list/selectable_list.html.erb +3 -17
  83. data/app/pb_kits/playbook/pb_selectable_list/selectable_list.rb +0 -3
  84. data/app/pb_kits/playbook/pb_selectable_list/selectable_list_item.html.erb +4 -11
  85. data/app/pb_kits/playbook/pb_selectable_list/selectable_list_item.rb +0 -3
  86. data/app/pb_kits/playbook/pb_table/_table.tsx +3 -2
  87. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_left_columns_rails.md +2 -2
  88. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_custom_content.jsx +8 -12
  89. data/app/pb_kits/playbook/pb_table/docs/example.yml +0 -6
  90. data/app/pb_kits/playbook/pb_table/index.ts +88 -187
  91. data/app/pb_kits/playbook/pb_table/styles/_collapsible.scss +0 -12
  92. data/app/pb_kits/playbook/pb_table/styles/_scroll.scss +5 -6
  93. data/app/pb_kits/playbook/pb_table/table.html.erb +1 -1
  94. data/app/pb_kits/playbook/pb_table/table.rb +2 -17
  95. data/app/pb_kits/playbook/pb_table/table_row.html.erb +1 -20
  96. data/app/pb_kits/playbook/pb_table/table_row.rb +0 -5
  97. data/app/pb_kits/playbook/pb_text_input/docs/example.yml +1 -2
  98. data/app/pb_kits/playbook/pb_text_input/text_input.html.erb +0 -4
  99. data/app/pb_kits/playbook/pb_text_input/text_input.rb +3 -33
  100. data/app/pb_kits/playbook/pb_timeline/_timeline.scss +30 -30
  101. data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +2 -3
  102. data/app/pb_kits/playbook/pb_typeahead/components/ClearIndicator.tsx +4 -12
  103. data/app/pb_kits/playbook/pb_typeahead/components/Control.tsx +1 -5
  104. data/app/pb_kits/playbook/pb_typeahead/components/IndicatorsContainer.tsx +3 -8
  105. data/app/pb_kits/playbook/pb_typeahead/components/MenuList.tsx +1 -6
  106. data/app/pb_kits/playbook/pb_typeahead/components/Option.tsx +6 -21
  107. data/app/pb_kits/playbook/pb_typeahead/components/Placeholder.tsx +6 -13
  108. data/app/pb_kits/playbook/pb_typeahead/components/ValueContainer.tsx +3 -7
  109. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_custom_menu_list.jsx +0 -2
  110. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_async.jsx +2 -4
  111. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_async_custom_options.jsx +5 -5
  112. data/app/pb_kits/playbook/pb_typeahead/docs/example.yml +0 -2
  113. data/app/pb_kits/playbook/pb_typeahead/docs/index.js +0 -1
  114. data/dist/chunks/_typeahead-C2iCBqxQ.js +36 -0
  115. data/dist/chunks/_weekday_stacked-CWnbnW7m.js +45 -0
  116. data/dist/chunks/{lib-RmkltInK.js → lib-B7sgJtGS.js} +2 -2
  117. data/dist/chunks/{pb_form_validation-Bu-zi4X-.js → pb_form_validation-C5Cc0-1v.js} +1 -1
  118. data/dist/chunks/vendor.js +1 -1
  119. data/dist/menu.yml +0 -6
  120. data/dist/playbook-doc.js +1 -1
  121. data/dist/playbook-rails-react-bindings.js +1 -1
  122. data/dist/playbook-rails.js +1 -1
  123. data/dist/playbook.css +1 -1
  124. data/lib/playbook/version.rb +2 -2
  125. metadata +11 -75
  126. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_no_subrows.jsx +0 -50
  127. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_responsive.html.erb +0 -38
  128. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows.jsx +0 -60
  129. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows.md +0 -5
  130. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_actions.jsx +0 -78
  131. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_actions.md +0 -1
  132. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_header.jsx +0 -53
  133. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_header.md +0 -1
  134. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_no_subrows.jsx +0 -52
  135. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_no_subrows.md +0 -1
  136. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props.html.erb +0 -33
  137. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_rails.md +0 -1
  138. data/app/pb_kits/playbook/pb_advanced_table/docs/advanced_table_mock_data_no_subrows.json +0 -42
  139. data/app/pb_kits/playbook/pb_advanced_table/docs/advanced_table_mock_data_with_id.json +0 -299
  140. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_turbo_frames.html.erb +0 -13
  141. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_turbo_frames_rails.md +0 -3
  142. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_list_rails.md +0 -5
  143. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_selectable_list_rails.html.erb +0 -38
  144. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_selectable_list_rails.md +0 -3
  145. data/app/pb_kits/playbook/pb_drawer/context.ts +0 -11
  146. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_behavior.jsx +0 -38
  147. data/app/pb_kits/playbook/pb_drawer/hooks/useBreakpoint.tsx +0 -60
  148. data/app/pb_kits/playbook/pb_drawer/hooks/useDrawerAnimation.tsx +0 -21
  149. data/app/pb_kits/playbook/pb_icon_button/_icon_button.scss +0 -78
  150. data/app/pb_kits/playbook/pb_icon_button/docs/_icon_button_default.html.erb +0 -3
  151. data/app/pb_kits/playbook/pb_icon_button/docs/example.yml +0 -7
  152. data/app/pb_kits/playbook/pb_icon_button/icon_button.html.erb +0 -16
  153. data/app/pb_kits/playbook/pb_icon_button/icon_button.rb +0 -22
  154. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_format.html.erb +0 -15
  155. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_format.jsx +0 -24
  156. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_format.md +0 -1
  157. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_columns.html.erb +0 -74
  158. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_columns_rails.md +0 -3
  159. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_right_columns.html.erb +0 -74
  160. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_right_columns_rails.md +0 -3
  161. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible.html.erb +0 -47
  162. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_rails.md +0 -2
  163. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_custom_content_rails.html.erb +0 -52
  164. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_custom_content_rails.md +0 -0
  165. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_nested_rows_rails.html.erb +0 -52
  166. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_nested_rows_rails.md +0 -3
  167. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_nested_table_rails.html.erb +0 -80
  168. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_nested_table_rails.md +0 -1
  169. data/app/pb_kits/playbook/pb_table/utilities/addDataTitle.ts +0 -22
  170. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_mask.html.erb +0 -46
  171. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_mask_rails.md +0 -3
  172. data/app/pb_kits/playbook/pb_text_input/index.js +0 -103
  173. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_truncated_text.html.erb +0 -19
  174. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_truncated_text.jsx +0 -27
  175. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_truncated_text.md +0 -1
  176. data/dist/chunks/_typeahead-BDhvNf6A.js +0 -36
  177. data/dist/chunks/_weekday_stacked-BhU_44Uo.js +0 -45
  178. /data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_table_props_react.md → _advanced_table_table_props.md} +0 -0
  179. /data/app/pb_kits/playbook/pb_table/docs/{_table_with_collapsible_react.md → _table_with_collapsible.md} +0 -0
@@ -1,81 +1,230 @@
1
- import React, { useState, useEffect, useRef } from "react"
2
- import classnames from "classnames"
1
+ import React, { useState, useEffect } from "react";
2
+ import classnames from "classnames";
3
3
 
4
4
  import {
5
5
  buildAriaProps,
6
6
  buildCss,
7
7
  buildDataProps,
8
8
  buildHtmlProps,
9
- } from "../utilities/props"
10
- import { globalProps, globalInlineProps } from "../utilities/globalProps"
11
- import { DrawerContext } from "./context"
12
- import { useBreakpoint } from "./hooks/useBreakpoint"
9
+ } from "../utilities/props";
10
+ import { globalProps, globalInlineProps } from "../utilities/globalProps";
11
+
12
+ import { DialogContext } from "../pb_dialog/_dialog_context";
13
13
 
14
14
  type DrawerProps = {
15
- aria?: { [key: string]: string }
16
- behavior?: "floating" | "push"
17
- border?: "full" | "none" | "right" | "left"
18
- breakpoint?: "none" | "xs" | "sm" | "md" | "lg" | "xl"
19
- children: React.ReactNode | React.ReactNode[] | string
20
- className?: string
21
- data?: { [key: string]: string }
22
- htmlOptions?: { [key: string]: string | number | boolean | (() => void) }
23
- id?: string
24
- triggerId?: string
25
- onClose?: () => void
26
- opened: boolean
27
- overlay: boolean
28
- placement?: "left" | "right" | "top" | "bottom"
29
- size?: "xs" | "sm" | "md" | "lg" | "xl" | "full"
30
- text?: string
31
- withinElement?: boolean
32
- }
33
-
34
- const Drawer = (props: DrawerProps): React.ReactElement | null => {
15
+ aria?: { [key: string]: string };
16
+ behavior?: "floating" | "push";
17
+ border?: "full" | "none" | "right" | "left";
18
+ openBreakpoint?: "none" | "xs" | "sm" | "md" | "lg" | "xl";
19
+ closeBreakpoint?: "none" | "xs" | "sm" | "md" | "lg" | "xl";
20
+ children: React.ReactNode | React.ReactNode[] | string;
21
+ className?: string;
22
+ data?: { [key: string]: string };
23
+ htmlOptions?: { [key: string]: string | number | boolean | (() => void) };
24
+ id?: string;
25
+ fullHeight?: boolean;
26
+ menuButtonID?: string;
27
+ onClose?: () => void;
28
+ opened: boolean;
29
+ overlay: boolean;
30
+ placement?: "left" | "right";
31
+ size?: "xs" | "sm" | "md" | "lg" | "xl";
32
+ text?: string;
33
+ withinElement?: boolean;
34
+ };
35
+
36
+ const Drawer = (props: DrawerProps): React.ReactElement => {
35
37
  const {
36
38
  aria = {},
37
39
  behavior = "floating",
38
40
  border = "none",
39
- breakpoint = "none",
41
+ openBreakpoint = "none",
42
+ closeBreakpoint = "none",
40
43
  className,
41
44
  data = {},
42
45
  htmlOptions = {},
43
46
  id,
44
47
  size = "md",
45
48
  children,
46
- triggerId,
49
+ fullHeight = true,
50
+ menuButtonID,
47
51
  opened,
48
52
  onClose,
49
53
  overlay = true,
50
54
  placement = "left",
51
55
  withinElement = false,
52
- } = props
56
+ } = props;
57
+ const ariaProps = buildAriaProps(aria);
58
+ const dataProps = buildDataProps(data);
59
+ const htmlProps = buildHtmlProps(htmlOptions);
60
+
61
+ let globalPropsString: string = globalProps(props);
62
+
63
+ // Check if the string contains any of the prefixes
64
+ const containsPrefix = [
65
+ "p_",
66
+ "pb_",
67
+ "pt_",
68
+ "pl_",
69
+ "pr_",
70
+ "px_",
71
+ "py_",
72
+ ].some((prefix) => globalPropsString.includes(prefix));
73
+
74
+ // If none of the prefixes are found, append 'p_sm' to the string
75
+ if (!containsPrefix) {
76
+ globalPropsString += " p_sm";
77
+ }
78
+
79
+ const drawerClassNames = {
80
+ base: `${classnames(
81
+ "pb_drawer",
82
+ buildCss("pb_drawer", size, placement),
83
+ {
84
+ drawer_border_full: border === "full",
85
+ drawer_border_right: border === "right",
86
+ drawer_border_left: border === "left",
87
+ pb_drawer_within_element: withinElement,
88
+ }
89
+ )} ${globalPropsString}`,
90
+ afterOpen: "pb_drawer_after_open",
91
+ beforeClose: "pb_drawer_before_close",
92
+ };
93
+
94
+ const fullHeightClassNames = () => {
95
+ if (!fullHeight) return null;
96
+ return `full_height_${placement}`;
97
+ };
98
+
99
+ const overlayClassNames = {
100
+ base: `pb_drawer${overlay ? "_overlay" : "_no_overlay"} ${
101
+ fullHeight !== null && fullHeightClassNames()
102
+ } ${!overlay ? "no-background" : ""}`,
103
+ afterOpen: "pb_drawer_overlay_after_open",
104
+ beforeClose: "pb_drawer_overlay_before_close",
105
+ };
106
+
107
+ const classes = classnames(buildCss("pb_drawer_wrapper"), className);
108
+ const dynamicInlineProps = globalInlineProps(props)
109
+ const [menuButtonOpened, setMenuButtonOpened] = useState(false);
110
+ const [triggerOpened, setTriggerOpened] = useState(false);
111
+
112
+ const breakpointWidths: Record<DrawerProps["openBreakpoint"], number> = {
113
+ none: 0,
114
+ xs: 575,
115
+ sm: 768,
116
+ md: 992,
117
+ lg: 1200,
118
+ xl: 1400,
119
+ };
120
+
121
+ const breakpointValues = {
122
+ none: 0,
123
+ xs: 575,
124
+ sm: 768,
125
+ md: 992,
126
+ lg: 1200,
127
+ xl: 1400,
128
+ }
129
+
130
+ const [isOpenBreakpointOpen, setIsOpenBreakpointOpen] = useState(false);
131
+ const [isUserClosed, setIsUserClosed] = useState(false);
132
+
133
+ useEffect(() => {
134
+ if (openBreakpoint === "none") return;
135
+
136
+ const handleResize = () => {
137
+ const width = window.innerWidth;
138
+ const openBreakpointWidth = breakpointWidths[openBreakpoint];
139
+
140
+ if (width <= openBreakpointWidth) {
141
+ setIsOpenBreakpointOpen(true);
142
+ } else {
143
+ setIsOpenBreakpointOpen(false);
144
+ setIsUserClosed(false); // Reset when the breakpoint condition changes
145
+ }
146
+ };
147
+
148
+ window.addEventListener("resize", handleResize);
149
+
150
+ // Call handler once on mount to set initial state
151
+ handleResize();
152
+
153
+ return () => {
154
+ window.removeEventListener("resize", handleResize);
155
+ };
156
+ }, [openBreakpoint]);
157
+
158
+ useEffect(() => {
159
+ if (closeBreakpoint === "none") return;
160
+
161
+ const handleResize = () => {
162
+ const width = window.innerWidth;
163
+ if (width >= breakpointValues[closeBreakpoint]) {
164
+ setIsOpenBreakpointOpen(true);
165
+ } else {
166
+ setIsOpenBreakpointOpen(false);
167
+ }
168
+ }
53
169
 
54
- const drawerRef = useRef<HTMLDivElement>(null)
55
- const [menuButtonOpened, setMenuButtonOpened] = useState(false)
56
- const [shouldRender, setShouldRender] = useState(false)
57
- const [isAnimating, setIsAnimating] = useState(false)
170
+ window.addEventListener("resize", handleResize);
58
171
 
59
- const { isOpenBreakpointOpen, isUserClosed, setIsUserClosed } = useBreakpoint(
60
- {
61
- breakpoint: breakpoint,
62
- triggerId,
172
+ handleResize();
173
+
174
+ return () => {
175
+ window.removeEventListener("resize", handleResize);
176
+ };
177
+
178
+ }, [closeBreakpoint]);
179
+
180
+ //hide menu button if breakpoint opens the drawer
181
+ useEffect(() => {
182
+ if (menuButtonID) {
183
+ const menuButton = document.getElementById(menuButtonID);
184
+ if (menuButton) {
185
+ if (isOpenBreakpointOpen) {
186
+ menuButton.style.display = 'none';
187
+ } else {
188
+ menuButton.style.display = '';
189
+ }
190
+ }
63
191
  }
64
- )
192
+ }, [menuButtonID, isOpenBreakpointOpen]);
193
+
194
+ // Reset isUserClosed when isBreakpointOpen changes
195
+ useEffect(() => {
196
+ if (isOpenBreakpointOpen) {
197
+ setIsUserClosed(false);
198
+ }
199
+ }, [isOpenBreakpointOpen]);
65
200
 
66
201
  const modalIsOpened =
67
- (isOpenBreakpointOpen && !isUserClosed) || menuButtonOpened || opened
202
+ (isOpenBreakpointOpen && !isUserClosed) || menuButtonOpened || opened;
203
+
204
+ const [animationState, setAnimationState] = useState("");
205
+
206
+ useEffect(() => {
207
+ if (modalIsOpened) {
208
+ setAnimationState("afterOpen");
209
+ } else if (!modalIsOpened && animationState === "afterOpen") {
210
+ setAnimationState("beforeClose");
211
+ setTimeout(() => {
212
+ setAnimationState("");
213
+ }, 200);
214
+ }
215
+ }, [modalIsOpened]);
216
+
217
+ const isModalVisible = modalIsOpened || animationState === "beforeClose";
68
218
 
69
219
  useEffect(() => {
70
220
  if (withinElement) return;
71
221
 
72
- const sizeMap: { [key: string]: string } = {
222
+ const sizeMap: Record<DrawerProps["size"], string> = {
73
223
  xl: "365px",
74
224
  lg: "300px",
75
225
  md: "250px",
76
226
  sm: "200px",
77
227
  xs: "64px",
78
- full: "100%",
79
228
  };
80
229
  const body = document.querySelector("body");
81
230
  if (modalIsOpened && behavior === "push" && body) {
@@ -90,142 +239,103 @@ const Drawer = (props: DrawerProps): React.ReactElement | null => {
90
239
  if (body.classList.contains("PBDrawer__Body--open")) {
91
240
  body.classList.add("PBDrawer__Body--close");
92
241
  }
93
- body.style.cssText = "";
242
+ body.style.cssText = ""; // Clear the styles when modal is closed or behavior is not 'push'
94
243
  body.classList.remove("PBDrawer__Body--open");
95
244
  }
96
- }, [modalIsOpened]);
97
-
98
- // Helper functions
99
- const updateDrawerHeight = () => {
100
- if (drawerRef.current) {
101
- const height = drawerRef.current.scrollHeight;
102
- drawerRef.current.style.setProperty('--drawer-height', `${height}px`);
103
- }
104
- }
105
-
106
- useEffect(() => {
107
- if (modalIsOpened) {
108
- setShouldRender(true)
109
- if (withinElement) {
110
- const timer = setTimeout(() => {
111
- updateDrawerHeight()
112
- setIsAnimating(true)
113
- }, 10)
114
- return () => clearTimeout(timer)
115
- } else {
116
- setIsAnimating(true)
117
- }
118
- } else {
119
- setIsAnimating(false)
120
- const timer = setTimeout(() => {
121
- setShouldRender(false)
122
- }, 250)
123
- return () => clearTimeout(timer)
124
- }
125
- }, [modalIsOpened])
126
-
127
-
128
-
129
- const handleMenuButtonClick = () => {
130
- if (modalIsOpened) {
131
- setMenuButtonOpened(false)
132
- setIsUserClosed(true)
133
- } else {
134
- setMenuButtonOpened(true)
135
- setIsUserClosed(false)
136
- }
137
- }
138
-
139
- // Setup menu button click handler
140
- useEffect(() => {
141
- if (!triggerId) return;
142
-
143
- const menuButton = document.getElementById(triggerId)
144
- if (menuButton) {
145
- menuButton.addEventListener("click", handleMenuButtonClick)
146
- return () => menuButton.removeEventListener("click", handleMenuButtonClick)
147
- }
148
- }, [modalIsOpened])
149
-
150
- const ariaProps = buildAriaProps(aria)
151
- const dataProps = buildDataProps(data)
152
- const htmlProps = buildHtmlProps(htmlOptions)
153
- const dynamicInlineProps = globalInlineProps(props)
154
-
155
- const drawerClasses = classnames(
156
- "pb_drawer",
157
- buildCss("pb_drawer", size as string, placement as string),
158
- {
159
- "drawer_border-full": border === "full",
160
- "drawer_border-right": border === "right",
161
- "drawer_border-left": border === "left",
162
- pb_drawer_within_element: withinElement,
163
- pb_drawer_after_open: isAnimating,
164
- pb_drawer_before_close: !isAnimating && shouldRender,
165
- },
166
- withinElement ? "shadow_none" : "shadow_deepest",
167
- globalProps(props),
168
- className
169
- )
170
-
171
- const overlayClasses = classnames(
172
- `pb_drawer${overlay ? "_overlay" : "_no_overlay"}`,
173
- `drawer_content_${placement}`,
174
- !overlay && "no-background",
175
- {
176
- pb_drawer_overlay_after_open: isAnimating,
177
- pb_drawer_overlay_before_close: !isAnimating && shouldRender,
178
- }
179
- )
245
+ }, [modalIsOpened, behavior, placement, size, withinElement]);
180
246
 
181
247
  const api = {
182
248
  onClose: () => {
183
- if (triggerId) {
184
- setMenuButtonOpened(false)
249
+ if (menuButtonID) {
250
+ setMenuButtonOpened(false);
185
251
  }
186
- setIsUserClosed(true)
252
+ setIsUserClosed(true);
187
253
  if (onClose) {
188
- onClose()
254
+ onClose();
189
255
  }
190
256
  },
191
- }
192
-
193
- const drawerContent = (
194
- <div
195
- className={drawerClasses}
196
- onClick={(e) => e.stopPropagation()}
197
- ref={drawerRef}
198
- >
199
- {children}
200
- </div>
201
- )
257
+ };
202
258
 
203
- // Step 5: Only render when shouldRender is true
204
- if (!shouldRender) return null
259
+ useEffect(() => {
260
+ if (menuButtonID) {
261
+ const menuButton = document.getElementById(menuButtonID);
262
+ if (menuButton) {
263
+ const handleMenuButtonClick = () => {
264
+ if (modalIsOpened) {
265
+ // Drawer is open, close it
266
+ setMenuButtonOpened(false);
267
+ setIsUserClosed(true);
268
+ } else {
269
+ // Drawer is closed, open it
270
+ setMenuButtonOpened(true);
271
+ setIsUserClosed(false);
272
+ }
273
+ };
274
+ menuButton.addEventListener("click", handleMenuButtonClick);
275
+ return () => {
276
+ menuButton.removeEventListener("click", handleMenuButtonClick);
277
+ };
278
+ }
279
+ }
280
+ }, [menuButtonID, modalIsOpened]);
205
281
 
206
282
  return (
207
- <DrawerContext.Provider value={api}>
283
+ <DialogContext.Provider value={api}>
208
284
  {withinElement ? (
209
- drawerContent
285
+ isModalVisible && (
286
+ <div
287
+ {...ariaProps}
288
+ {...dataProps}
289
+ {...htmlProps}
290
+ className={classnames(drawerClassNames.base, {
291
+ [drawerClassNames.afterOpen]:
292
+ animationState === "afterOpen",
293
+ [drawerClassNames.beforeClose]:
294
+ animationState === "beforeClose",
295
+ })}
296
+ id={id}
297
+ onClick={(e) => e.stopPropagation()}
298
+ style={dynamicInlineProps}
299
+ >
300
+ {children}
301
+ </div>
302
+ )
210
303
  ) : (
211
304
  <div
212
305
  {...ariaProps}
213
306
  {...dataProps}
214
307
  {...htmlProps}
215
- className={classnames(buildCss("pb_drawer_wrapper"), className)}
216
- style={dynamicInlineProps}
308
+ className={classes}
217
309
  >
218
- <div
219
- className={overlayClasses}
220
- id={id}
221
- onClick={overlay ? api.onClose : undefined}
222
- >
223
- {drawerContent}
224
- </div>
310
+ {isModalVisible && (
311
+ <div
312
+ className={classnames(overlayClassNames.base, {
313
+ [overlayClassNames.afterOpen]:
314
+ animationState === "afterOpen",
315
+ [overlayClassNames.beforeClose]:
316
+ animationState === "beforeClose",
317
+ })}
318
+ id={id}
319
+ onClick={overlay ? api.onClose : undefined}
320
+ >
321
+ <div
322
+ className={classnames(drawerClassNames.base, {
323
+ [drawerClassNames.afterOpen]:
324
+ animationState === "afterOpen",
325
+ [drawerClassNames.beforeClose]:
326
+ animationState === "beforeClose",
327
+ })}
328
+ onClick={(e) => e.stopPropagation()}
329
+ style={dynamicInlineProps}
330
+ >
331
+ {children}
332
+ </div>
333
+ </div>
334
+ )}
225
335
  </div>
226
336
  )}
227
- </DrawerContext.Provider>
228
- )
229
- }
337
+ </DialogContext.Provider>
338
+ );
339
+ };
230
340
 
231
- export default Drawer
341
+ export default Drawer;
@@ -6,15 +6,19 @@ const DrawerBorders = () => {
6
6
  const [openedBRightDrawer, setOpenedBRightDrawer] = useState(false);
7
7
  const [openedBLeftDrawer, setOpenedBLeftDrawer] = useState(false);
8
8
  const [openedBFullDrawer, setOpenedBFullDrawer] = useState(false);
9
+ const [openedBDefaultDrawer, setOpenedBDefaultDrawer] = useState(false);
10
+ const [openedBRoundedDrawer, setOpenedBRoundedDrawer] = useState(false);
9
11
 
10
12
  // Toggle functions for each drawer
11
13
  const toggleBRightDrawer = () => setOpenedBRightDrawer(!openedBRightDrawer);
12
14
  const toggleBLeftDrawer = () => setOpenedBLeftDrawer(!openedBLeftDrawer);
13
15
  const toggleBFullDrawer = () => setOpenedBFullDrawer(!openedBFullDrawer);
16
+ const toggleBDefaultDrawer = () => setOpenedBDefaultDrawer(!openedBDefaultDrawer);
17
+ const toggleBRoundedDrawer = () => setOpenedBRoundedDrawer(!openedBRoundedDrawer);
14
18
 
15
19
  return (
16
20
  <>
17
- <Flex
21
+ <Flex padding="md"
18
22
  wrap
19
23
  >
20
24
  <Button marginRight="md"
@@ -32,12 +36,23 @@ const DrawerBorders = () => {
32
36
  >
33
37
  Drawer with border full
34
38
  </Button>
39
+ <Button marginRight="md"
40
+ onClick={toggleBDefaultDrawer}
41
+ >
42
+ Default Drawer
43
+ </Button>
44
+ <Button marginRight="md"
45
+ onClick={toggleBRoundedDrawer}
46
+ >
47
+ Rounded Drawer
48
+ </Button>
35
49
  </Flex>
36
50
 
37
51
  {/* Drawers for each size */}
38
52
  <Drawer
39
53
  behavior="float"
40
54
  border="right"
55
+ fullHeight
41
56
  onClose={toggleBRightDrawer}
42
57
  opened={openedBRightDrawer}
43
58
  overlay={false}
@@ -49,10 +64,11 @@ const DrawerBorders = () => {
49
64
  <Drawer
50
65
  behavior="float"
51
66
  border="left"
67
+ fullHeight
52
68
  onClose={toggleBLeftDrawer}
53
69
  opened={openedBLeftDrawer}
54
70
  overlay={false}
55
- placement="left"
71
+ placement="right"
56
72
  size="lg"
57
73
  >
58
74
  This is a Drawer with border left
@@ -60,14 +76,40 @@ const DrawerBorders = () => {
60
76
  <Drawer
61
77
  behavior="float"
62
78
  border="full"
79
+ fullHeight
63
80
  onClose={toggleBFullDrawer}
64
81
  opened={openedBFullDrawer}
65
82
  overlay={false}
66
- placement="left"
83
+ placement="right"
67
84
  size="lg"
68
85
  >
69
86
  This is a Drawer with border full
70
87
  </Drawer>
88
+ <Drawer
89
+ behavior="float"
90
+ fullHeight
91
+ onClose={toggleBDefaultDrawer}
92
+ opened={openedBDefaultDrawer}
93
+ overlay={false}
94
+ placement="right"
95
+ size="lg"
96
+ >
97
+ This is a Default Drawer
98
+ </Drawer>
99
+ <Drawer
100
+ behavior="float"
101
+ borderRadius="rounded"
102
+ fullHeight
103
+ onClose={toggleBRoundedDrawer}
104
+ opened={openedBRoundedDrawer}
105
+ overlay={false}
106
+ placement="right"
107
+ size="lg"
108
+ >
109
+ <div style={{ paddingTop: '100px', paddingLeft: '12px' }}>
110
+ This is a Rounded Drawer
111
+ </div>
112
+ </Drawer>
71
113
  </>
72
114
  );
73
115
  };
@@ -26,6 +26,7 @@ const DrawerBreakpoints = () => {
26
26
  <Drawer
27
27
  behavior={"push"}
28
28
  breakpoint="sm"
29
+ fullHeight
29
30
  onClose={toggleSmallDrawer}
30
31
  opened={smallDrawerOpened}
31
32
  overlay={false}
@@ -9,8 +9,8 @@ const useDrawer = (visible = false) => {
9
9
  };
10
10
 
11
11
  const DrawerDefault = () => {
12
- const [drawerLeftOpen, toggleDrawerLeftOpen] = useDrawer();
13
- const [drawerRightOpen, toggleDrawerRightOpen ] = useDrawer();
12
+ const [headerSeparatorDrawerOpened, toggleHeaderSeparatorDrawer] = useDrawer();
13
+ const [bothSeparatorsDrawerOpened, toggleBothSeparatorsDrawer] = useDrawer();
14
14
 
15
15
  return (
16
16
  <>
@@ -18,13 +18,13 @@ const DrawerDefault = () => {
18
18
  <Button
19
19
  id="sm"
20
20
  marginRight="md"
21
- onClick={toggleDrawerLeftOpen}
21
+ onClick={toggleHeaderSeparatorDrawer}
22
22
  >
23
23
  {"Left Drawer"}
24
24
  </Button>
25
25
  <Button
26
26
  marginRight="xl"
27
- onClick={toggleDrawerRightOpen}
27
+ onClick={toggleBothSeparatorsDrawer}
28
28
  >
29
29
  {"Right Drawer"}
30
30
  </Button>
@@ -32,8 +32,12 @@ const DrawerDefault = () => {
32
32
  <Flex>
33
33
  {/* Left Drawer */}
34
34
  <Drawer
35
- onClose={toggleDrawerLeftOpen}
36
- opened={drawerLeftOpen}
35
+ behavior={"push"}
36
+ fullHeight
37
+ onClose={toggleHeaderSeparatorDrawer}
38
+ opened={headerSeparatorDrawerOpened}
39
+ overlay
40
+ placement={"left"}
37
41
  size={"lg"}
38
42
  >
39
43
  Test me (Left Drawer)
@@ -41,8 +45,11 @@ const DrawerDefault = () => {
41
45
 
42
46
  {/* Right Drawer */}
43
47
  <Drawer
44
- onClose={toggleDrawerRightOpen}
45
- opened={drawerRightOpen}
48
+ behavior={"push"}
49
+ fullHeight
50
+ onClose={toggleBothSeparatorsDrawer}
51
+ opened={bothSeparatorsDrawerOpened}
52
+ overlay
46
53
  placement={"right"}
47
54
  size={"lg"}
48
55
  >
@@ -53,4 +60,4 @@ const DrawerDefault = () => {
53
60
  );
54
61
  };
55
62
 
56
- export default DrawerDefault;
63
+ export default DrawerDefault;