playbook_ui 14.11.1.pre.alpha.PBNTR440enableglobalpropspbformwith5624 → 14.11.1.pre.alpha.PBNTR573datepickerinvestigation5355

Sign up to get free protection for your applications and to get access to all the features.
Files changed (140) 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/docs/_advanced_table_pagination.jsx +0 -1
  10. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_pagination_with_props.jsx +0 -1
  11. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_sort_control.md +2 -2
  12. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +0 -5
  13. data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +1 -6
  14. data/app/pb_kits/playbook/pb_button/button.html.erb +3 -2
  15. data/app/pb_kits/playbook/pb_checkbox/checkbox.html.erb +6 -1
  16. data/app/pb_kits/playbook/pb_collapsible/collapsible.html.erb +1 -3
  17. data/app/pb_kits/playbook/pb_collapsible/collapsible.rb +0 -3
  18. data/app/pb_kits/playbook/pb_date_picker/date_picker.html.erb +26 -23
  19. data/app/pb_kits/playbook/pb_date_picker/date_picker.rb +2 -2
  20. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_default.html.erb +12 -1
  21. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_default_date.md +1 -1
  22. data/app/pb_kits/playbook/pb_date_picker/docs/example.yml +0 -1
  23. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_list_rails.html.erb +9 -3
  24. data/app/pb_kits/playbook/pb_draggable/docs/example.yml +0 -1
  25. data/app/pb_kits/playbook/pb_drawer/_drawer.scss +183 -145
  26. data/app/pb_kits/playbook/pb_drawer/_drawer.tsx +268 -158
  27. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_borders.jsx +45 -3
  28. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_breakpoints.jsx +1 -0
  29. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_default.jsx +16 -9
  30. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_menu.jsx +19 -44
  31. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_menu.md +3 -21
  32. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_overlay.jsx +21 -16
  33. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_sizes.jsx +19 -2
  34. data/app/pb_kits/playbook/pb_drawer/docs/example.yml +1 -2
  35. data/app/pb_kits/playbook/pb_drawer/docs/index.js +0 -1
  36. data/app/pb_kits/playbook/pb_drawer/drawer.test.jsx +5 -5
  37. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_subtle_variant.md +1 -1
  38. data/app/pb_kits/playbook/pb_dropdown/dropdown.html.erb +12 -7
  39. data/app/pb_kits/playbook/pb_dropdown/dropdown_container.html.erb +14 -9
  40. data/app/pb_kits/playbook/pb_dropdown/dropdown_option.html.erb +11 -6
  41. data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.html.erb +14 -8
  42. data/app/pb_kits/playbook/pb_list/item.html.erb +8 -30
  43. data/app/pb_kits/playbook/pb_list/item.rb +0 -7
  44. data/app/pb_kits/playbook/pb_list/list.html.erb +11 -31
  45. data/app/pb_kits/playbook/pb_list/list.rb +0 -4
  46. data/app/pb_kits/playbook/pb_loading_inline/_loading_inline.tsx +1 -6
  47. data/app/pb_kits/playbook/pb_multiple_users/_multiple_users.scss +0 -4
  48. data/app/pb_kits/playbook/pb_multiple_users/_multiple_users.tsx +0 -1
  49. data/app/pb_kits/playbook/pb_multiple_users/multiple_users.html.erb +1 -1
  50. data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.tsx +12 -30
  51. data/app/pb_kits/playbook/pb_phone_number_input/docs/example.yml +1 -3
  52. data/app/pb_kits/playbook/pb_phone_number_input/docs/index.js +0 -1
  53. data/app/pb_kits/playbook/pb_phone_number_input/phone_number_input.rb +0 -3
  54. data/app/pb_kits/playbook/pb_phone_number_input/phone_number_input.test.js +1 -20
  55. data/app/pb_kits/playbook/pb_radio/_radio.scss +8 -12
  56. data/app/pb_kits/playbook/pb_radio/docs/_radio_custom_children.jsx +3 -8
  57. data/app/pb_kits/playbook/pb_select/_select.scss +5 -3
  58. data/app/pb_kits/playbook/pb_select/_select.tsx +1 -5
  59. data/app/pb_kits/playbook/pb_select/select.html.erb +2 -2
  60. data/app/pb_kits/playbook/pb_selectable_icon/_selectable_icon.tsx +1 -9
  61. data/app/pb_kits/playbook/pb_selectable_icon/docs/_selectable_icon_default.jsx +1 -4
  62. data/app/pb_kits/playbook/pb_selectable_icon/docs/_selectable_icon_single_select.jsx +1 -4
  63. data/app/pb_kits/playbook/pb_selectable_list/selectable_list.html.erb +3 -17
  64. data/app/pb_kits/playbook/pb_selectable_list/selectable_list.rb +0 -3
  65. data/app/pb_kits/playbook/pb_selectable_list/selectable_list_item.html.erb +4 -11
  66. data/app/pb_kits/playbook/pb_selectable_list/selectable_list_item.rb +0 -3
  67. data/app/pb_kits/playbook/pb_table/_table.tsx +3 -2
  68. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_left_columns_rails.md +2 -2
  69. data/app/pb_kits/playbook/pb_table/docs/example.yml +0 -3
  70. data/app/pb_kits/playbook/pb_table/index.ts +88 -187
  71. data/app/pb_kits/playbook/pb_table/styles/_collapsible.scss +0 -12
  72. data/app/pb_kits/playbook/pb_table/styles/_scroll.scss +5 -6
  73. data/app/pb_kits/playbook/pb_table/table.html.erb +1 -1
  74. data/app/pb_kits/playbook/pb_table/table.rb +2 -17
  75. data/app/pb_kits/playbook/pb_table/table_row.html.erb +1 -20
  76. data/app/pb_kits/playbook/pb_table/table_row.rb +0 -5
  77. data/app/pb_kits/playbook/pb_text_input/docs/example.yml +1 -2
  78. data/app/pb_kits/playbook/pb_text_input/text_input.html.erb +0 -4
  79. data/app/pb_kits/playbook/pb_text_input/text_input.rb +3 -33
  80. data/app/pb_kits/playbook/pb_timeline/_timeline.scss +30 -30
  81. data/app/pb_kits/playbook/pb_typeahead/docs/example.yml +0 -2
  82. data/app/pb_kits/playbook/pb_typeahead/docs/index.js +0 -1
  83. data/dist/chunks/_typeahead-BNULwihE.js +36 -0
  84. data/dist/chunks/_weekday_stacked-BKWemDAe.js +45 -0
  85. data/dist/chunks/{lib-kMuhBuU7.js → lib-B7sgJtGS.js} +2 -2
  86. data/dist/chunks/{pb_form_validation-DBJ0wZuS.js → pb_form_validation-C5Cc0-1v.js} +1 -1
  87. data/dist/chunks/vendor.js +1 -1
  88. data/dist/menu.yml +0 -6
  89. data/dist/playbook-doc.js +1 -1
  90. data/dist/playbook-rails-react-bindings.js +1 -1
  91. data/dist/playbook-rails.js +1 -1
  92. data/dist/playbook.css +1 -1
  93. data/lib/playbook/pb_forms_helper.rb +4 -13
  94. data/lib/playbook/version.rb +1 -1
  95. metadata +7 -63
  96. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_no_subrows.jsx +0 -50
  97. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows.jsx +0 -60
  98. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows.md +0 -5
  99. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_actions.jsx +0 -78
  100. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_actions.md +0 -1
  101. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_header.jsx +0 -53
  102. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_header.md +0 -1
  103. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_no_subrows.jsx +0 -52
  104. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_no_subrows.md +0 -1
  105. data/app/pb_kits/playbook/pb_advanced_table/docs/advanced_table_mock_data_no_subrows.json +0 -42
  106. data/app/pb_kits/playbook/pb_advanced_table/docs/advanced_table_mock_data_with_id.json +0 -299
  107. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_turbo_frames.html.erb +0 -13
  108. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_turbo_frames_rails.md +0 -3
  109. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_list_rails.md +0 -5
  110. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_selectable_list_rails.html.erb +0 -38
  111. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_selectable_list_rails.md +0 -3
  112. data/app/pb_kits/playbook/pb_drawer/context.ts +0 -11
  113. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_behavior.jsx +0 -38
  114. data/app/pb_kits/playbook/pb_drawer/hooks/useBreakpoint.tsx +0 -60
  115. data/app/pb_kits/playbook/pb_drawer/hooks/useDrawerAnimation.tsx +0 -21
  116. data/app/pb_kits/playbook/pb_icon_button/_icon_button.scss +0 -78
  117. data/app/pb_kits/playbook/pb_icon_button/docs/_icon_button_default.html.erb +0 -3
  118. data/app/pb_kits/playbook/pb_icon_button/docs/example.yml +0 -7
  119. data/app/pb_kits/playbook/pb_icon_button/icon_button.html.erb +0 -16
  120. data/app/pb_kits/playbook/pb_icon_button/icon_button.rb +0 -22
  121. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_format.html.erb +0 -15
  122. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_format.jsx +0 -24
  123. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_format.md +0 -1
  124. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_columns.html.erb +0 -74
  125. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_columns_rails.md +0 -3
  126. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_right_columns.html.erb +0 -74
  127. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_right_columns_rails.md +0 -3
  128. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible.html.erb +0 -47
  129. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_rails.md +0 -2
  130. data/app/pb_kits/playbook/pb_table/utilities/addDataTitle.ts +0 -22
  131. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_mask.html.erb +0 -46
  132. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_mask_rails.md +0 -3
  133. data/app/pb_kits/playbook/pb_text_input/index.js +0 -103
  134. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_truncated_text.html.erb +0 -19
  135. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_truncated_text.jsx +0 -27
  136. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_truncated_text.md +0 -1
  137. data/dist/chunks/_typeahead-BWwaAo_0.js +0 -36
  138. data/dist/chunks/_weekday_stacked-zyBCd1s8.js +0 -45
  139. data/lib/playbook/pb_forms_global_props_helper.rb +0 -136
  140. /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;