playbook_ui 14.11.1 → 14.12.0.pre.alpha.PBNTR456fixedconftoastrailsautoclose5728

Sign up to get free protection for your applications and to get access to all the features.
Files changed (195) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/_playbook.scss +3 -0
  3. data/app/pb_kits/playbook/pb_advanced_table/Components/CustomCell.tsx +18 -2
  4. data/app/pb_kits/playbook/pb_advanced_table/Components/TableHeaderCell.tsx +27 -5
  5. data/app/pb_kits/playbook/pb_advanced_table/SubKits/TableBody.tsx +17 -2
  6. data/app/pb_kits/playbook/pb_advanced_table/SubKits/TableHeader.tsx +23 -1
  7. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +29 -0
  8. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +61 -4
  9. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.html.erb +3 -3
  10. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.rb +5 -1
  11. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.test.jsx +1 -1
  12. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_loading.html.erb +33 -0
  13. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_loading_rails.md +1 -0
  14. data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_loading.md → _advanced_table_loading_react.md} +2 -2
  15. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_no_subrows.jsx +50 -0
  16. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_pagination.jsx +1 -0
  17. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_pagination_with_props.jsx +1 -0
  18. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_responsive.html.erb +38 -0
  19. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows.jsx +60 -0
  20. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows.md +5 -0
  21. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_actions.jsx +78 -0
  22. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_actions.md +1 -0
  23. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_header.jsx +53 -0
  24. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_header.md +1 -0
  25. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_no_subrows.jsx +52 -0
  26. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_no_subrows.md +1 -0
  27. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_sort_control.md +2 -2
  28. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props.html.erb +33 -0
  29. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_rails.md +1 -0
  30. data/app/pb_kits/playbook/pb_advanced_table/docs/advanced_table_mock_data_no_subrows.json +42 -0
  31. data/app/pb_kits/playbook/pb_advanced_table/docs/advanced_table_mock_data_with_id.json +299 -0
  32. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +8 -0
  33. data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +6 -1
  34. data/app/pb_kits/playbook/pb_advanced_table/table_body.rb +17 -3
  35. data/app/pb_kits/playbook/pb_advanced_table/table_header.html.erb +15 -11
  36. data/app/pb_kits/playbook/pb_advanced_table/table_header.rb +14 -3
  37. data/app/pb_kits/playbook/pb_advanced_table/table_row.html.erb +2 -2
  38. data/app/pb_kits/playbook/pb_advanced_table/table_row.rb +9 -1
  39. data/app/pb_kits/playbook/pb_advanced_table/table_subrow_header.html.erb +1 -1
  40. data/app/pb_kits/playbook/pb_advanced_table/table_subrow_header.rb +9 -0
  41. data/app/pb_kits/playbook/pb_avatar/_avatar.scss +5 -0
  42. data/app/pb_kits/playbook/pb_button/button.html.erb +2 -3
  43. data/app/pb_kits/playbook/pb_card/card.html.erb +21 -2
  44. data/app/pb_kits/playbook/pb_card/card.rb +7 -0
  45. data/app/pb_kits/playbook/pb_checkbox/checkbox.html.erb +1 -6
  46. data/app/pb_kits/playbook/pb_collapsible/collapsible.html.erb +3 -1
  47. data/app/pb_kits/playbook/pb_collapsible/collapsible.rb +3 -0
  48. data/app/pb_kits/playbook/pb_copy_button/_copy_button.scss +3 -0
  49. data/app/pb_kits/playbook/pb_copy_button/_copy_button.tsx +92 -0
  50. data/app/pb_kits/playbook/pb_copy_button/copy_button.test.jsx +64 -0
  51. data/app/pb_kits/playbook/pb_copy_button/docs/_copy_button_default.jsx +21 -0
  52. data/app/pb_kits/playbook/pb_copy_button/docs/_copy_button_from.jsx +45 -0
  53. data/app/pb_kits/playbook/pb_copy_button/docs/_copy_button_from.md +1 -0
  54. data/app/pb_kits/playbook/pb_copy_button/docs/example.yml +8 -0
  55. data/app/pb_kits/playbook/pb_copy_button/docs/index.js +2 -0
  56. data/app/pb_kits/playbook/pb_date_picker/date_picker.html.erb +24 -16
  57. data/app/pb_kits/playbook/pb_date_picker/date_picker.rb +2 -0
  58. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_default_date.md +1 -1
  59. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_turbo_frames.html.erb +13 -0
  60. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_turbo_frames_rails.md +3 -0
  61. data/app/pb_kits/playbook/pb_date_picker/docs/example.yml +1 -0
  62. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_cards_rails.html.erb +1 -3
  63. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_cards_rails.md +7 -0
  64. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_list_rails.html.erb +3 -9
  65. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_list_rails.md +5 -0
  66. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_selectable_list_rails.html.erb +38 -0
  67. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_selectable_list_rails.md +3 -0
  68. data/app/pb_kits/playbook/pb_draggable/docs/example.yml +1 -0
  69. data/app/pb_kits/playbook/pb_drawer/_drawer.scss +145 -183
  70. data/app/pb_kits/playbook/pb_drawer/_drawer.tsx +158 -268
  71. data/app/pb_kits/playbook/pb_drawer/context.ts +11 -0
  72. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_behavior.jsx +38 -0
  73. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_borders.jsx +3 -45
  74. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_breakpoints.jsx +0 -1
  75. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_default.jsx +9 -16
  76. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_menu.jsx +44 -19
  77. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_menu.md +21 -3
  78. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_overlay.jsx +16 -21
  79. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_sizes.jsx +2 -19
  80. data/app/pb_kits/playbook/pb_drawer/docs/example.yml +2 -1
  81. data/app/pb_kits/playbook/pb_drawer/docs/index.js +1 -0
  82. data/app/pb_kits/playbook/pb_drawer/drawer.test.jsx +5 -5
  83. data/app/pb_kits/playbook/pb_drawer/hooks/useBreakpoint.tsx +60 -0
  84. data/app/pb_kits/playbook/pb_drawer/hooks/useDrawerAnimation.tsx +21 -0
  85. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_subtle_variant.md +1 -1
  86. data/app/pb_kits/playbook/pb_dropdown/dropdown.html.erb +7 -12
  87. data/app/pb_kits/playbook/pb_dropdown/dropdown_container.html.erb +9 -14
  88. data/app/pb_kits/playbook/pb_dropdown/dropdown_option.html.erb +6 -11
  89. data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.html.erb +8 -14
  90. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/_fixed_confirmation_toast_auto_close.html.erb +74 -0
  91. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/_fixed_confirmation_toast_auto_close_rails.md +3 -0
  92. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/example.yml +1 -0
  93. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/index.js +24 -13
  94. data/app/pb_kits/playbook/pb_icon_button/_icon_button.scss +78 -0
  95. data/app/pb_kits/playbook/pb_icon_button/docs/_icon_button_default.html.erb +3 -0
  96. data/app/pb_kits/playbook/pb_icon_button/docs/example.yml +7 -0
  97. data/app/pb_kits/playbook/pb_icon_button/icon_button.html.erb +16 -0
  98. data/app/pb_kits/playbook/pb_icon_button/icon_button.rb +22 -0
  99. data/app/pb_kits/playbook/pb_list/item.html.erb +30 -8
  100. data/app/pb_kits/playbook/pb_list/item.rb +7 -0
  101. data/app/pb_kits/playbook/pb_list/list.html.erb +31 -11
  102. data/app/pb_kits/playbook/pb_list/list.rb +4 -0
  103. data/app/pb_kits/playbook/pb_loading_inline/_loading_inline.tsx +6 -1
  104. data/app/pb_kits/playbook/pb_multiple_users/_multiple_users.scss +4 -0
  105. data/app/pb_kits/playbook/pb_multiple_users/_multiple_users.tsx +1 -0
  106. data/app/pb_kits/playbook/pb_multiple_users/multiple_users.html.erb +1 -1
  107. data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.tsx +30 -12
  108. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_format.html.erb +15 -0
  109. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_format.jsx +24 -0
  110. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_format.md +1 -0
  111. data/app/pb_kits/playbook/pb_phone_number_input/docs/example.yml +3 -1
  112. data/app/pb_kits/playbook/pb_phone_number_input/docs/index.js +1 -0
  113. data/app/pb_kits/playbook/pb_phone_number_input/phone_number_input.rb +3 -0
  114. data/app/pb_kits/playbook/pb_phone_number_input/phone_number_input.test.js +20 -1
  115. data/app/pb_kits/playbook/pb_radio/_radio.scss +12 -8
  116. data/app/pb_kits/playbook/pb_radio/docs/_radio_custom_children.jsx +8 -3
  117. data/app/pb_kits/playbook/pb_select/_select.scss +3 -5
  118. data/app/pb_kits/playbook/pb_select/_select.tsx +5 -1
  119. data/app/pb_kits/playbook/pb_select/select.html.erb +2 -2
  120. data/app/pb_kits/playbook/pb_selectable_icon/_selectable_icon.tsx +9 -1
  121. data/app/pb_kits/playbook/pb_selectable_icon/docs/_selectable_icon_default.jsx +4 -1
  122. data/app/pb_kits/playbook/pb_selectable_icon/docs/_selectable_icon_single_select.jsx +4 -1
  123. data/app/pb_kits/playbook/pb_selectable_list/selectable_list.html.erb +17 -3
  124. data/app/pb_kits/playbook/pb_selectable_list/selectable_list.rb +3 -0
  125. data/app/pb_kits/playbook/pb_selectable_list/selectable_list_item.html.erb +11 -4
  126. data/app/pb_kits/playbook/pb_selectable_list/selectable_list_item.rb +3 -0
  127. data/app/pb_kits/playbook/pb_table/_table.tsx +2 -3
  128. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_columns.html.erb +74 -0
  129. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_columns_rails.md +3 -0
  130. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_left_columns_rails.md +2 -2
  131. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_right_columns.html.erb +74 -0
  132. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_right_columns_rails.md +3 -0
  133. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible.html.erb +47 -0
  134. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_rails.md +2 -0
  135. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_custom_content.jsx +12 -8
  136. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_custom_content_rails.html.erb +52 -0
  137. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_custom_content_rails.md +0 -0
  138. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_nested_rows_rails.html.erb +52 -0
  139. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_nested_rows_rails.md +3 -0
  140. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_nested_table_rails.html.erb +80 -0
  141. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_nested_table_rails.md +1 -0
  142. data/app/pb_kits/playbook/pb_table/docs/example.yml +6 -0
  143. data/app/pb_kits/playbook/pb_table/index.ts +187 -88
  144. data/app/pb_kits/playbook/pb_table/styles/_collapsible.scss +12 -0
  145. data/app/pb_kits/playbook/pb_table/styles/_scroll.scss +6 -5
  146. data/app/pb_kits/playbook/pb_table/table.html.erb +1 -1
  147. data/app/pb_kits/playbook/pb_table/table.rb +17 -2
  148. data/app/pb_kits/playbook/pb_table/table_row.html.erb +20 -1
  149. data/app/pb_kits/playbook/pb_table/table_row.rb +5 -0
  150. data/app/pb_kits/playbook/pb_table/utilities/addDataTitle.ts +22 -0
  151. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_mask.html.erb +46 -0
  152. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_mask_rails.md +3 -0
  153. data/app/pb_kits/playbook/pb_text_input/docs/example.yml +2 -1
  154. data/app/pb_kits/playbook/pb_text_input/index.js +103 -0
  155. data/app/pb_kits/playbook/pb_text_input/text_input.html.erb +4 -0
  156. data/app/pb_kits/playbook/pb_text_input/text_input.rb +33 -3
  157. data/app/pb_kits/playbook/pb_timeline/_timeline.scss +30 -30
  158. data/app/pb_kits/playbook/pb_tooltip/_tooltip.tsx +3 -1
  159. data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +3 -2
  160. data/app/pb_kits/playbook/pb_typeahead/components/ClearIndicator.tsx +12 -4
  161. data/app/pb_kits/playbook/pb_typeahead/components/Control.tsx +5 -1
  162. data/app/pb_kits/playbook/pb_typeahead/components/IndicatorsContainer.tsx +8 -3
  163. data/app/pb_kits/playbook/pb_typeahead/components/MenuList.tsx +6 -1
  164. data/app/pb_kits/playbook/pb_typeahead/components/Option.tsx +21 -6
  165. data/app/pb_kits/playbook/pb_typeahead/components/Placeholder.tsx +13 -6
  166. data/app/pb_kits/playbook/pb_typeahead/components/ValueContainer.tsx +7 -3
  167. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_custom_menu_list.jsx +2 -0
  168. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_truncated_text.html.erb +19 -0
  169. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_truncated_text.jsx +27 -0
  170. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_truncated_text.md +1 -0
  171. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_async.jsx +4 -2
  172. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_async_custom_options.jsx +5 -5
  173. data/app/pb_kits/playbook/pb_typeahead/docs/example.yml +2 -0
  174. data/app/pb_kits/playbook/pb_typeahead/docs/index.js +1 -0
  175. data/dist/chunks/_typeahead-BIhRQo8Q.js +36 -0
  176. data/dist/chunks/_weekday_stacked-VKMYuo6-.js +45 -0
  177. data/dist/chunks/lazysizes-B7xYodB-.js +1 -0
  178. data/dist/chunks/{lib-B7sgJtGS.js → lib-kMuhBuU7.js} +2 -2
  179. data/dist/chunks/{pb_form_validation-C5Cc0-1v.js → pb_form_validation-DBJ0wZuS.js} +1 -1
  180. data/dist/chunks/vendor.js +1 -1
  181. data/dist/menu.yml +12 -0
  182. data/dist/playbook-doc.js +1 -1
  183. data/dist/playbook-rails-react-bindings.js +1 -1
  184. data/dist/playbook-rails.js +1 -1
  185. data/dist/playbook.css +1 -1
  186. data/lib/playbook/pb_forms_global_props_helper.rb +136 -0
  187. data/lib/playbook/pb_forms_helper.rb +13 -4
  188. data/lib/playbook/version.rb +2 -2
  189. metadata +88 -11
  190. data/dist/chunks/_typeahead-C2iCBqxQ.js +0 -36
  191. data/dist/chunks/_weekday_stacked-E-5KcEkc.js +0 -45
  192. data/dist/chunks/lazysizes-DHz07jlL.js +0 -1
  193. /data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_table_props.md → _advanced_table_table_props_react.md} +0 -0
  194. /data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/{_fixed_confirmation_toast_auto_close.md → _fixed_confirmation_toast_auto_close_react.md} +0 -0
  195. /data/app/pb_kits/playbook/pb_table/docs/{_table_with_collapsible.md → _table_with_collapsible_react.md} +0 -0
@@ -1,9 +1,12 @@
1
1
  examples:
2
2
  rails:
3
3
  - advanced_table_beta: Default (Required Props)
4
+ - advanced_table_loading: Loading State
4
5
  - advanced_table_beta_subrow_headers: SubRow Headers
5
6
  - advanced_table_collapsible_trail_rails: Collapsible Trail
7
+ - advanced_table_table_props: Table Props
6
8
  - advanced_table_beta_sort: Enable Sorting
9
+ - advanced_table_responsive: Responsive Tables
7
10
  - advanced_table_custom_cell_rails: Custom Components for Cells
8
11
  - advanced_table_column_headers: Multi-Header Columns
9
12
  - advanced_table_column_headers_multiple: Multi-Header Columns (Multiple Levels)
@@ -26,3 +29,8 @@ examples:
26
29
  - advanced_table_pagination_with_props: Pagination Props
27
30
  - advanced_table_column_headers: Multi-Header Columns
28
31
  - advanced_table_column_headers_multiple: Multi-Header Columns (Multiple Levels)
32
+ # - advanced_table_no_subrows: Table with No Subrows
33
+ - advanced_table_selectable_rows: Selectable Rows
34
+ - advanced_table_selectable_rows_no_subrows: Selectable Rows (No Subrows)
35
+ - advanced_table_selectable_rows_actions: Selectable Rows (With Actions)
36
+ - advanced_table_selectable_rows_header: Selectable Rows (No Actions Bar)
@@ -13,4 +13,9 @@ export { default as AdvancedTableCustomCell } from './_advanced_table_custom_cel
13
13
  export { default as AdvancedTablePagination } from './_advanced_table_pagination.jsx'
14
14
  export { default as AdvancedTablePaginationWithProps } from './_advanced_table_pagination_with_props.jsx'
15
15
  export { default as AdvancedTableColumnHeaders } from './_advanced_table_column_headers.jsx'
16
- export { default as AdvancedTableColumnHeadersMultiple } from './_advanced_table_column_headers_multiple.jsx'
16
+ export { default as AdvancedTableColumnHeadersMultiple } from './_advanced_table_column_headers_multiple.jsx'
17
+ export { default as AdvancedTableSelectableRows } from './_advanced_table_selectable_rows.jsx'
18
+ export { default as AdvancedTableSelectableRowsNoSubrows } from './_advanced_table_selectable_rows_no_subrows.jsx'
19
+ export { default as AdvancedTableNoSubrows } from './_advanced_table_no_subrows.jsx'
20
+ export { default as AdvancedTableSelectableRowsHeader } from './_advanced_table_selectable_rows_header.jsx'
21
+ export { default as AdvancedTableSelectableRowsActions } from './_advanced_table_selectable_rows_actions.jsx'
@@ -16,6 +16,11 @@ module Playbook
16
16
  default: []
17
17
  prop :collapsible_trail, type: Playbook::Props::Boolean,
18
18
  default: true
19
+ prop :loading, type: Playbook::Props::Boolean,
20
+ default: false
21
+ prop :responsive, type: Playbook::Props::Enum,
22
+ values: %w[none scroll],
23
+ default: "scroll"
19
24
 
20
25
  def flatten_columns(columns)
21
26
  columns.flat_map do |col|
@@ -46,12 +51,12 @@ module Playbook
46
51
  row_parent: "#{id}_#{ancestor_ids.last}",
47
52
  }
48
53
  # Subrow header if applicable
49
- output << pb_rails("advanced_table/table_subrow_header", props: { row: row, column_definitions: leaf_columns, depth: current_depth, subrow_header: subrow_headers[current_depth - 1], collapsible_trail: collapsible_trail, classname: "toggle-content", subrow_data_attributes: subrow_data_attributes }) if is_first_child_of_subrow && enable_toggle_expansion == "all"
54
+ output << pb_rails("advanced_table/table_subrow_header", props: { row: row, column_definitions: leaf_columns, depth: current_depth, subrow_header: subrow_headers[current_depth - 1], collapsible_trail: collapsible_trail, classname: "toggle-content", responsive: responsive, subrow_data_attributes: subrow_data_attributes }) if is_first_child_of_subrow && enable_toggle_expansion == "all"
50
55
 
51
56
  current_data_attributes = current_depth.zero? ? { row_depth: 0 } : table_data_attributes
52
57
 
53
58
  # Additional class and data attributes needed for toggle logic
54
- output << pb_rails("advanced_table/table_row", props: { id: id, row: row, column_definitions: leaf_columns, depth: current_depth, collapsible_trail: collapsible_trail, classname: additional_classes, table_data_attributes: current_data_attributes })
59
+ output << pb_rails("advanced_table/table_row", props: { id: id, row: row, column_definitions: leaf_columns, depth: current_depth, collapsible_trail: collapsible_trail, classname: additional_classes, table_data_attributes: current_data_attributes, responsive: responsive, loading: loading })
55
60
 
56
61
  if row[:children].present?
57
62
  row[:children].each do |child_row|
@@ -74,7 +79,16 @@ module Playbook
74
79
  end
75
80
 
76
81
  def classname
77
- generate_classname("pb_advanced_table_body", separator: " ")
82
+ additional_classes = []
83
+ additional_classes << "advanced-table-responsive-#{responsive} pinned-left" if responsive == "scroll"
84
+
85
+ generate_classname("pb_advanced_table_body", *additional_classes, separator: " ")
86
+ end
87
+
88
+ def pinned_cell_class(index)
89
+ return "pinned-left" if index.zero? && responsive == "scroll"
90
+
91
+ ""
78
92
  end
79
93
 
80
94
  private
@@ -3,17 +3,21 @@
3
3
  <%= pb_rails("table/table_row") do %>
4
4
  <% header_row.each_with_index do |cell, cell_index| %>
5
5
  <% header_id = cell[:accessor].present? ? cell[:accessor] : "header_#{row_index}_#{cell_index}" %>
6
- <%= pb_rails("table/table_header", props: { id: header_id, colspan: cell[:colspan], classname: [object.th_classname, ('last-header-cell' if cell[:is_last_in_group] && cell_index != 0)].compact.join(' '), sort_menu: cell[:accessor] ? cell[:sort_menu] : nil }) do %>
7
- <%= pb_rails("flex", props:{ align: "center", justify: cell_index.zero? ? "start" : row_index === header_rows.size - 1 ? "end" : "center", text_align: "end" }) do %>
8
- <% if cell_index.zero? && (object.enable_toggle_expansion == "header" || object.enable_toggle_expansion == "all") && row_index === header_rows.size - 1 %>
9
- <button
10
- class="gray-icon toggle-all-icon"
11
- onclick="expandAllRows(this); event.preventDefault();">
12
- <%= pb_rails("icon", props: { icon: "arrows-from-line", cursor: "pointer", fixed_width: true, padding_right: "xs" }) %>
13
- </button>
14
- <% end %>
15
- <%= cell[:label] %>
16
- <% end %>
6
+ <%= pb_rails("table/table_header", props: { id: header_id, colspan: cell[:colspan], classname: [object.th_classname(is_first_column: cell_index.zero?), ('last-header-cell' if cell[:is_last_in_group] && cell_index != 0)].compact.join(' '), sort_menu: cell[:accessor] ? cell[:sort_menu] : nil }) do %>
7
+ <%= pb_rails("flex", props: { align: "center", justify: cell_index.zero? ? "start" : row_index === header_rows.size - 1 ? "end" : "center", text_align: "end" }) do %>
8
+ <% if cell_index.zero? && (object.enable_toggle_expansion == "header" || object.enable_toggle_expansion == "all") && row_index === header_rows.size - 1 %>
9
+ <% if loading %>
10
+ <div class="<%= object.loading ? 'loading-toggle-icon' : '' %>"></div>
11
+ <% else %>
12
+ <button
13
+ class="gray-icon toggle-all-icon"
14
+ onclick="expandAllRows(this); event.preventDefault();">
15
+ <%= pb_rails("icon", props: { icon: "arrows-from-line", cursor: "pointer", fixed_width: true, padding_right: "xs" }) %>
16
+ </button>
17
+ <% end %>
18
+ <% end %>
19
+ <%= cell[:label] %>
20
+ <% end %>
17
21
  <% end %>
18
22
  <% end %>
19
23
  <% end %>
@@ -8,13 +8,24 @@ module Playbook
8
8
  prop :enable_toggle_expansion, type: Playbook::Props::Enum,
9
9
  values: %w[all header none],
10
10
  default: "header"
11
+ prop :loading, type: Playbook::Props::Boolean,
12
+ default: false
13
+ prop :responsive, type: Playbook::Props::Enum,
14
+ values: %w[none scroll],
15
+ default: "scroll"
11
16
 
12
17
  def classname
13
- generate_classname("pb_advanced_table_header", "pb_table_thead", separator: " ")
18
+ additional_classes = []
19
+ additional_classes << "advanced-table-responsive-#{responsive} pinned-left" if responsive == "scroll"
20
+
21
+ generate_classname("pb_advanced_table_header", "pb_table_thead", *additional_classes, separator: " ")
14
22
  end
15
23
 
16
- def th_classname
17
- generate_classname("table-header-cells", separator: " ")
24
+ def th_classname(is_first_column: false)
25
+ additional_classes = []
26
+ additional_classes << "pinned-left" if is_first_column && responsive == "scroll"
27
+
28
+ generate_classname("table-header-cells", *additional_classes, separator: " ")
18
29
  end
19
30
 
20
31
  def header_rows
@@ -1,8 +1,8 @@
1
1
  <%= pb_content_tag(:tr) do %>
2
2
  <% object.column_definitions.each_with_index do |column, index| %>
3
3
  <% next unless column[:accessor].present? %>
4
- <%= pb_rails("table/table_cell", props: { classname:object.td_classname(column)}) do %>
5
- <%= pb_rails("flex", props:{ align: "center", justify: index.zero? ? "start" : "end" }) do %>
4
+ <%= pb_rails("table/table_cell", props: { classname:object.td_classname(column, index)}) do %>
5
+ <%= pb_rails("flex", props:{ align: "center", justify: index.zero? ? "start" : "end", classname: object.loading ? "loading-cell" : "" }) do %>
6
6
  <% if collapsible_trail && index.zero? %>
7
7
  <% (1..depth).each do |i| %>
8
8
  <% additional_offset = i > 1 ? (i - 1) * 0.25 : 0 %>
@@ -13,6 +13,13 @@ module Playbook
13
13
  default: true
14
14
  prop :table_data_attributes, type: Playbook::Props::HashProp,
15
15
  default: {}
16
+ prop :loading, type: Playbook::Props::Boolean,
17
+ default: false
18
+ prop :responsive, type: Playbook::Props::Enum,
19
+ values: %w[none scroll],
20
+ default: "scroll"
21
+ prop :is_pinned_left, type: Playbook::Props::Boolean,
22
+ default: false
16
23
 
17
24
  def data
18
25
  Hash(prop(:data)).merge(table_data_attributes)
@@ -22,9 +29,10 @@ module Playbook
22
29
  generate_classname("pb_table_tr", "bg-white", subrow_depth_classname, separator: " ")
23
30
  end
24
31
 
25
- def td_classname(column)
32
+ def td_classname(column, index)
26
33
  classes = %w[id-cell chrome-styles]
27
34
  classes << "last-cell" if column[:is_last_in_group]
35
+ classes << "pinned-left" if index.zero? && is_pinned_left && responsive == "scroll"
28
36
  classes.join(" ")
29
37
  end
30
38
 
@@ -1,6 +1,6 @@
1
1
  <%= pb_content_tag(:tr) do %>
2
2
  <% object.column_definitions.each_with_index do |column, index| %>
3
- <%= pb_rails("table/table_cell", props: { classname: "id-cell chrome-styles"}) do %>
3
+ <%= pb_rails("table/table_cell", props: { classname: object.td_classname(index) }) do %>
4
4
  <%= pb_rails("flex", props:{ align: "center", justify: "start" }) do %>
5
5
  <% if collapsible_trail && index.zero? %>
6
6
  <% (1..depth).each do |i| %>
@@ -16,6 +16,9 @@ module Playbook
16
16
  default: true
17
17
  prop :subrow_data_attributes, type: Playbook::Props::HashProp,
18
18
  default: {}
19
+ prop :responsive, type: Playbook::Props::Enum,
20
+ values: %w[none scroll],
21
+ default: "scroll"
19
22
 
20
23
  def data
21
24
  Hash(prop(:data)).merge(subrow_data_attributes)
@@ -25,6 +28,12 @@ module Playbook
25
28
  generate_classname("pb_table_tr", "bg-silver", "pb_subrow_header", subrow_depth_classname, separator: " ")
26
29
  end
27
30
 
31
+ def td_classname(index)
32
+ classes = %w[id-cell chrome-styles]
33
+ classes << "pinned-left" if index.zero? && responsive == "scroll"
34
+ classes.join(" ")
35
+ end
36
+
28
37
  private
29
38
 
30
39
  def subrow_depth_classname
@@ -78,4 +78,9 @@ $avatar-sizes: (
78
78
  }
79
79
  }
80
80
  }
81
+ &.dark {
82
+ [class^=pb_card_kit] {
83
+ position: absolute;
84
+ }
85
+ }
81
86
  }
@@ -1,6 +1,5 @@
1
- <%= content_tag(object.tag,
2
- object.tag == "button" ? object.options : object.link_options,
3
- **combined_html_options) do %>
1
+ <%= pb_content_tag(object.tag,
2
+ object.tag == "button" ? object.options : object.link_options) do %>
4
3
  <% if object.variant === "reaction" %>
5
4
  <% if icon && object.valid_emoji(object.icon) %>
6
5
  <%= pb_rails("flex", props:{ align: "center" }) do %>
@@ -1,5 +1,24 @@
1
- <%= pb_content_tag(object.tag) do %>
2
- <%= content.presence %>
1
+ <% if object.draggable_item %>
2
+ <%= pb_rails("draggable/draggable_item", props:{drag_id: object.drag_id}) do %>
3
+ <%= pb_content_tag(object.tag) do %>
4
+ <% if object.draggable_item %>
5
+ <%= pb_rails("flex", props: { align: "center" }) do %>
6
+ <% if object.drag_handle %>
7
+ <span classname="card_draggable_handle">
8
+ <%= pb_rails("icon", props: { icon: "grip-dots-vertical", padding_right: "xs" }) %>
9
+ </span>
10
+ <% end %>
11
+ <div style="width: 100%">
12
+ <%= content.presence %>
13
+ </div>
14
+ <% end %>
15
+ <% end %>
16
+ <% end %>
17
+ <% end %>
18
+ <% else %>
19
+ <%= pb_content_tag(object.tag) do %>
20
+ <%= content.presence %>
21
+ <% end %>
3
22
  <% end %>
4
23
 
5
24
 
@@ -17,6 +17,13 @@ module Playbook
17
17
  prop :background, type: Playbook::Props::Enum,
18
18
  values: %w[white light dark product_1_background product_1_highlight product_2_background product_2_highlight product_3_background product_3_highlight product_4_background product_4_highlight product_5_background product_5_highlight product_6_background product_6_highlight product_7_background product_7_highlight product_8_background product_8_highlight product_9_background product_9_highlight product_10_background product_10_highlight windows siding doors solar roofing gutters insulation none success_subtle warning_subtle error_subtle info_subtle neutral_subtle],
19
19
  default: "none"
20
+ prop :drag_id, type: Playbook::Props::String
21
+ prop :draggable_item, type: Playbook::Props::Boolean,
22
+ default: false
23
+ prop :drag_handle, type: Playbook::Props::Boolean,
24
+ default: true
25
+ prop :items, type: Playbook::Props::Array,
26
+ default: []
20
27
 
21
28
  def classname
22
29
  generate_classname("pb_card_kit",
@@ -1,9 +1,4 @@
1
- <%= content_tag(:label, aria: object.aria,
2
- id: object.id,
3
- data: object.data,
4
- class: object.classname,
5
- **combined_html_options
6
- ) do %>
1
+ <%= pb_content_tag(:label) do %>
7
2
  <%= content.presence || object.input %>
8
3
  <% if object.indeterminate %>
9
4
  <span data-pb-checkbox-icon-span="true" class="pb_checkbox_indeterminate">
@@ -1,3 +1,5 @@
1
- <%= pb_content_tag do %>
1
+ <%= pb_content_tag(
2
+ object.tag
3
+ ) do %>
2
4
  <%= content.presence %>
3
5
  <% end %>
@@ -3,6 +3,9 @@
3
3
  module Playbook
4
4
  module PbCollapsible
5
5
  class Collapsible < Playbook::KitBase
6
+ prop :tag, type: Playbook::Props::Enum,
7
+ values: %w[h1 h2 h3 h4 h5 h6 p div span tr th td thead col],
8
+ default: "div"
6
9
  def classname
7
10
  generate_classname("pb_collapsible_kit")
8
11
  end
@@ -0,0 +1,3 @@
1
+ .pb_copy_button_kit {
2
+
3
+ }
@@ -0,0 +1,92 @@
1
+
2
+ import React, { useState } from 'react'
3
+ import classnames from 'classnames'
4
+ import { buildAriaProps, buildCss, buildDataProps } from '../utilities/props'
5
+ import { globalProps } from '../utilities/globalProps'
6
+
7
+ import Button from '../pb_button/_button'
8
+ import Tooltip from '../pb_tooltip/_tooltip'
9
+
10
+ type CopyButtonProps = {
11
+ aria?: { [key: string]: string },
12
+ className?: string,
13
+ data?: { [key: string]: string },
14
+ id?: string,
15
+ from?: string,
16
+ text?: string,
17
+ tooltipPlacement?: "top" | "right" | "bottom" | "left",
18
+ tooltipText?: string,
19
+ value?: string,
20
+ }
21
+
22
+ const CopyButton = (props: CopyButtonProps) => {
23
+ const {
24
+ aria = {},
25
+ className,
26
+ data = {},
27
+ from = '',
28
+ id,
29
+ text= 'Copy',
30
+ tooltipPlacement= 'bottom',
31
+ tooltipText = 'Copied!',
32
+ value = '',
33
+ } = props
34
+
35
+ const [copied, setCopied] = useState(false)
36
+
37
+ const ariaProps = buildAriaProps(aria)
38
+ const dataProps = buildDataProps(data)
39
+ const classes = classnames(buildCss('pb_copy_button_kit'), globalProps(props), className)
40
+
41
+ const copy = () => {
42
+ if (!from && !value) {
43
+ return
44
+ }
45
+
46
+ if (value) {
47
+ navigator.clipboard.writeText(value)
48
+ } else if (from) {
49
+ const copyElement = document.getElementById(from);
50
+ let copyText = copyElement?.innerText
51
+
52
+ if (copyElement instanceof HTMLTextAreaElement || copyElement instanceof HTMLInputElement) {
53
+ copyText = copyElement.value;
54
+ }
55
+
56
+ if (copyText) {
57
+ navigator.clipboard.writeText(copyText)
58
+ }
59
+ }
60
+
61
+ setCopied(true)
62
+
63
+ setTimeout(() => {
64
+ setCopied(false)
65
+ }, 1000);
66
+ }
67
+
68
+ return (
69
+ <div
70
+ {...ariaProps}
71
+ {...dataProps}
72
+ className={classes}
73
+ id={id}
74
+ >
75
+ <Tooltip
76
+ forceOpenTooltip={copied}
77
+ placement={tooltipPlacement}
78
+ showTooltip={false}
79
+ text={tooltipText}
80
+ >
81
+ <Button
82
+ icon='copy'
83
+ onClick={copy}
84
+ >
85
+ { text }
86
+ </Button>
87
+ </Tooltip>
88
+ </div>
89
+ )
90
+ }
91
+
92
+ export default CopyButton
@@ -0,0 +1,64 @@
1
+ import React from 'react';
2
+ import { CopyButton } from 'playbook-ui'
3
+ import { ensureAccessible, renderKit, render, fireEvent, screen } from '../utilities/test-utils'
4
+
5
+ const props = {
6
+ data: { testid: 'default', value: 'copy' }
7
+ }
8
+
9
+ test('returns namespaced class name', () => {
10
+ const kit = renderKit(CopyButton, props)
11
+ expect(kit).toBeInTheDocument()
12
+ expect(kit).toHaveClass('pb_copy_button_kit')
13
+ })
14
+
15
+ it('should be accessible', async () => {
16
+ ensureAccessible(CopyButton, props)
17
+ })
18
+
19
+ // It's difficult to actually use navigator.clipboard.readText, so we mock
20
+ it('copies the value to clipboard and pastes it into an input', async () => {
21
+ Object.defineProperty(global, 'navigator', {
22
+ value: {
23
+ clipboard: {
24
+ writeText: jest.fn().mockResolvedValueOnce(undefined),
25
+ },
26
+ },
27
+ writable: true,
28
+ })
29
+
30
+ render(<CopyButton {...props} />)
31
+
32
+ const copyButton = screen.getByTestId('default')
33
+ fireEvent.click(copyButton)
34
+
35
+ await navigator.clipboard.writeText('copy')
36
+
37
+ expect(navigator.clipboard.writeText).toHaveBeenCalledWith("copy");
38
+ })
39
+
40
+ test('passes text and tooltip props to button', () => {
41
+ render(
42
+ <CopyButton
43
+ data={{ testid: 'text-test' }}
44
+ text={"text"}
45
+ tooltipPlacement="right"
46
+ tooltipText="Text copied!"
47
+ value="copy"
48
+ />
49
+ )
50
+
51
+ const content = screen.getByText("text")
52
+ expect(content).toHaveTextContent("text")
53
+
54
+ const kit = screen.getByTestId('text-test')
55
+ const button = kit.querySelector('.pb_button_kit_primary_inline_enabled')
56
+ expect(button).toBeInTheDocument()
57
+
58
+ fireEvent.click(button)
59
+ const tooltipContent = screen.getByText("Text copied!")
60
+ expect(tooltipContent).toHaveTextContent("Text copied!")
61
+
62
+ const tooltip = kit.querySelector('.pb_tooltip_kit')
63
+ expect(tooltip).toBeInTheDocument()
64
+ })
@@ -0,0 +1,21 @@
1
+ import React from 'react'
2
+ import { CopyButton, Textarea } from 'playbook-ui'
3
+
4
+ const CopyButtonDefault = (props) => (
5
+ <div>
6
+ <CopyButton
7
+ {...props}
8
+ text="Copy Text"
9
+ tooltipPlacement="right"
10
+ tooltipText="Text copied!"
11
+ value="Playbook makes it easy to support bleeding edge, or legacy systems. Use Playbook’s 200+ components and end-to-end design language to create simple, intuitive and beautiful experiences with ease."
12
+ />
13
+
14
+ <Textarea
15
+ {...props}
16
+ placeholder="Copy and paste here"
17
+ />
18
+ </div>
19
+ )
20
+
21
+ export default CopyButtonDefault
@@ -0,0 +1,45 @@
1
+ import React, { useState } from 'react'
2
+ import { CopyButton, Body, TextInput, Textarea } from 'playbook-ui'
3
+
4
+ const CopyButtonFrom = (props) => {
5
+ const [text, setText] = useState("Copy this text input text")
6
+
7
+ const handleChange = (event) => {
8
+ setText(event.target.value);
9
+ }
10
+
11
+ return (<div>
12
+ <Body id="body">Copy this body text!</Body>
13
+ <CopyButton
14
+ {...props}
15
+ from="body"
16
+ marginBottom="sm"
17
+ text="Copy Body text"
18
+ tooltipPlacement="right"
19
+ tooltipText="Body text copied!"
20
+ />
21
+
22
+ <TextInput
23
+ {...props}
24
+ id="textinput"
25
+ onChange={handleChange}
26
+ value={text}
27
+ />
28
+ <CopyButton
29
+ {...props}
30
+ from="textinput"
31
+ marginBottom="sm"
32
+ text="Copy Text Input"
33
+ tooltipPlacement="right"
34
+ tooltipText="Text input copied!"
35
+ />
36
+
37
+ <Textarea
38
+ {...props}
39
+ placeholder="Copy and paste here"
40
+ />
41
+ </div>
42
+ )
43
+ }
44
+
45
+ export default CopyButtonFrom
@@ -0,0 +1 @@
1
+ Provide an element's ID as the `from` parameter, and its text will be copied. If the element is an input, its `value` will be copied; otherwise, the `innerText` will be used. Additionally, if a `value` prop is provided, it will override the content from the `from` element and be copied instead.
@@ -0,0 +1,8 @@
1
+ examples:
2
+
3
+
4
+ react:
5
+ - copy_button_default: Default
6
+ - copy_button_from: Copy From
7
+
8
+
@@ -0,0 +1,2 @@
1
+ export { default as CopyButtonDefault } from './_copy_button_default.jsx'
2
+ export { default as CopyButtonFrom } from './_copy_button_from.jsx'
@@ -1,9 +1,5 @@
1
- <%= content_tag(:div,
2
- aria: object.aria,
3
- class: object.classname + object.error_class,
4
- data: object.data,
5
- id: object.id,
6
- **combined_html_options) do %>
1
+ <%= pb_content_tag(:div,
2
+ class: object.classname + object.error_class) do %>
7
3
  <div class="input_wrapper">
8
4
  <% if content.present? %>
9
5
  <%= content %>
@@ -68,18 +64,30 @@
68
64
  </div>
69
65
 
70
66
  <%= javascript_tag do %>
71
- window.addEventListener("DOMContentLoaded", () => {
72
- datePickerHelper(<%= object.date_picker_config %>, "<%= object.scroll_container %>")
67
+ (function() {
68
+ const loadDatePicker = () => {
69
+ datePickerHelper(<%= object.date_picker_config %>, "<%= object.scroll_container %>")
73
70
 
74
- if (<%= object.selection_type == "quickpick" %>) {
75
- document.getElementById("<%= object.picker_id %>").addEventListener("change", ({ target }) => {
76
- const startDate = document.getElementById("<%= object.start_date_id %>")
77
- const endDate = document.getElementById("<%= object.end_date_id %>")
78
- const splittedValue = target.value.split(" to ")
79
- startDate.value = splittedValue[0]
80
- endDate.value = splittedValue[1] ? splittedValue[1] : splittedValue[0]
71
+ if (<%= object.selection_type == "quickpick" %>) {
72
+ document.getElementById("<%= object.picker_id %>").addEventListener("change", ({ target }) => {
73
+ const startDate = document.getElementById("<%= object.start_date_id %>")
74
+ const endDate = document.getElementById("<%= object.end_date_id %>")
75
+ const splittedValue = target.value.split(" to ")
76
+ startDate.value = splittedValue[0]
77
+ endDate.value = splittedValue[1] ? splittedValue[1] : splittedValue[0]
78
+ })
79
+ }
80
+ }
81
+
82
+ window.addEventListener("DOMContentLoaded", () => {
83
+ loadDatePicker()
84
+ })
85
+
86
+ if (<%= !object.custom_event_type.empty? %>) {
87
+ window.addEventListener("<%= object.custom_event_type %>", () => {
88
+ loadDatePicker()
81
89
  })
82
90
  }
83
- })
91
+ })()
84
92
  <% end %>
85
93
  <% end %>
@@ -73,6 +73,8 @@ module Playbook
73
73
  default: false
74
74
  prop :year_range, type: Playbook::Props::Array,
75
75
  default: [1900, 2100]
76
+ prop :custom_event_type, type: Playbook::Props::String,
77
+ default: ""
76
78
 
77
79
  def classname
78
80
  default_margin_bottom = margin_bottom.present? ? "" : " mb_sm"
@@ -2,4 +2,4 @@ The `defaultDate`/`default_date` prop has a null or empty string value by defaul
2
2
 
3
3
  If you use a Date object without UTC time standardization the Date Picker kit may misinterpret that date as yesterdays date (consequence of timezone differentials and the Javascript Date Object constructor). See [this GitHub issue for more information](https://github.com/powerhome/playbook/issues/1167) and the anti-pattern examples below.
4
4
 
5
-
5
+ You can leverage the `defaultDate`/`default_date` prop with custom logic in your filter or controller files where the determination of the default value changes based on user interaction. The page can load with an initial default date picker value or placeholder text, then after filter submission save the submitted values as the "new default" (via state or params).
@@ -0,0 +1,13 @@
1
+ <%= pb_rails("date_picker", props: { picker_id: "date-picker-turbo-frames", custom_event_type: "datePickerLoader" }) %>
2
+ <%= pb_rails("button", props: { id: "date-picker-loader", text: "Click Event Simulation" }) %>
3
+
4
+ <script>
5
+ document.getElementById("date-picker-loader").addEventListener("click", () => {
6
+ window.document.dispatchEvent(
7
+ new CustomEvent("datePickerLoader", {
8
+ bubbles: true,
9
+ })
10
+ )
11
+ console.log("Event 'datePickerLoader' dispatched - in a real implementation, this event would trigger the date picker's reinitialization through the custom_event_type prop connection")
12
+ })
13
+ </script>
@@ -0,0 +1,3 @@
1
+ The `custom_event_type` prop allows you to specify a custom event that will trigger the date picker's initialization, in addition to the default initialization on `DOMContentLoaded`. This is particularly useful in dynamic contexts like Turbo Frame updates where you need to reinitialize the date picker after new content loads. For Turbo integration, use `custom_event_type: "turbo:before-render"` to ensure the date picker properly reinitializes after Turbo navigation events.
2
+
3
+ In this example, we demonstrate the setup pattern by connecting a button to dispatch a "datePickerLoader" event - while the date picker's event listener is properly configured through the `custom_event_type` prop, this demo only logs the event dispatch to the console to illustrate the connection structure.