playbook_ui 14.19.0.pre.rc.2 → 14.20.0.pre.alpha.revert4453PBNTR933reactdraggablebugdragbtwnexamples7854
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.
- checksums.yaml +4 -4
- data/app/pb_kits/playbook/_playbook.scss +0 -1
- data/app/pb_kits/playbook/pb_advanced_table/Components/RegularTableView.tsx +11 -1
- data/app/pb_kits/playbook/pb_advanced_table/Components/TableActionBar.tsx +175 -16
- data/app/pb_kits/playbook/pb_advanced_table/Components/TableHeaderCell.tsx +56 -25
- data/app/pb_kits/playbook/pb_advanced_table/Hooks/useTableState.ts +23 -13
- data/app/pb_kits/playbook/pb_advanced_table/Utilities/VisibilityTree.ts +47 -0
- data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +6 -10
- data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +7 -2
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_beta.md +0 -6
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility.jsx +57 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility.md +4 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_custom.jsx +62 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_custom.md +1 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_multi.jsx +82 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_multi.md +1 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_with_state.jsx +66 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_with_state.md +3 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_no_subrows_rails.md +5 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows_no_subrows.jsx → _advanced_table_selectable_rows_no_subrows_react.jsx} +2 -2
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_rails.md +3 -2
- data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +7 -3
- data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +6 -2
- data/app/pb_kits/playbook/pb_advanced_table/flat_advanced_table.js +106 -0
- data/app/pb_kits/playbook/pb_advanced_table/index.js +228 -11
- data/app/pb_kits/playbook/pb_advanced_table/scss_partials/advanced_table_sticky_mixin.scss +1 -0
- data/app/pb_kits/playbook/pb_advanced_table/table_body.rb +9 -1
- data/app/pb_kits/playbook/pb_advanced_table/table_header.rb +0 -3
- data/app/pb_kits/playbook/pb_advanced_table/table_row.rb +1 -2
- data/app/pb_kits/playbook/pb_avatar/_avatar.scss +4 -0
- data/app/pb_kits/playbook/pb_avatar/_avatar.tsx +3 -0
- data/app/pb_kits/playbook/pb_avatar/avatar.html.erb +3 -3
- data/app/pb_kits/playbook/pb_avatar/avatar.rb +2 -0
- data/app/pb_kits/playbook/pb_avatar/avatar.test.js +18 -0
- data/app/pb_kits/playbook/pb_avatar/docs/_avatar_grayscale.html.erb +5 -0
- data/app/pb_kits/playbook/pb_avatar/docs/_avatar_grayscale.jsx +16 -0
- data/app/pb_kits/playbook/pb_avatar/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_avatar/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_card/card.html.erb +1 -1
- data/app/pb_kits/playbook/pb_card/card.rb +12 -0
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_error.html.erb +2 -2
- data/app/pb_kits/playbook/pb_draggable/context/index.tsx +17 -58
- data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones.html.erb +22 -1
- data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones_line.html.erb +55 -0
- data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones_line_rails.md +5 -0
- data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones_rails.md +5 -0
- data/app/pb_kits/playbook/pb_draggable/docs/_draggable_event_listeners.jsx +59 -0
- data/app/pb_kits/playbook/pb_draggable/docs/_draggable_event_listeners_react.md +1 -0
- data/app/pb_kits/playbook/pb_draggable/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_draggable/docs/index.js +2 -1
- data/app/pb_kits/playbook/pb_draggable/draggable_container.rb +11 -1
- data/app/pb_kits/playbook/pb_draggable/draggable_item.rb +11 -1
- data/app/pb_kits/playbook/pb_draggable/index.js +4 -2
- data/app/pb_kits/playbook/pb_draggable/subcomponents/DraggableItem.tsx +33 -5
- data/app/pb_kits/playbook/pb_dropdown/_dropdown.scss +6 -1
- data/app/pb_kits/playbook/pb_dropdown/_dropdown.tsx +82 -35
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default_rails.html.erb +31 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default_rails.md +5 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_error.html.erb +5 -2
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select.jsx +56 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select.md +3 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display.jsx +58 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display.md +3 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display_rails.html.erb +20 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display_rails.md +1 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_rails.html.erb +19 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_rails.md +3 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_autocomplete.html.erb +20 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_autocomplete.jsx +57 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_autocomplete.md +1 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_custom_options.html.erb +50 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_custom_options.jsx +105 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_default.html.erb +22 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_default.jsx +67 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete.html.erb +28 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete.jsx +17 -64
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_with_subcomponents.html.erb +58 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/{_dropdown_with_autocomplete_and_custom_display.jsx → _dropdown_with_autocomplete_with_subcomponents.jsx} +11 -25
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_with_subcomponents.md +1 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display.jsx +11 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display.md +1 -1
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display_rails.html.erb +33 -2
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display_rails.md +3 -1
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_external_control.md +1 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search.jsx +61 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search.md +2 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search_rails.html.erb +52 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search_rails.md +2 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/example.yml +18 -5
- data/app/pb_kits/playbook/pb_dropdown/docs/index.js +7 -2
- data/app/pb_kits/playbook/pb_dropdown/dropdown.html.erb +3 -3
- data/app/pb_kits/playbook/pb_dropdown/dropdown.rb +20 -2
- data/app/pb_kits/playbook/pb_dropdown/dropdown.test.jsx +45 -1
- data/app/pb_kits/playbook/pb_dropdown/dropdown_container.html.erb +10 -0
- data/app/pb_kits/playbook/pb_dropdown/dropdown_container.rb +3 -0
- data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.html.erb +37 -6
- data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.rb +5 -1
- data/app/pb_kits/playbook/pb_dropdown/hooks/useHandleOnKeydown.tsx +0 -6
- data/app/pb_kits/playbook/pb_dropdown/index.js +380 -17
- data/app/pb_kits/playbook/pb_dropdown/keyboard_accessibility.js +64 -11
- data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownContainer.tsx +3 -4
- data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownOption.tsx +16 -12
- data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownTrigger.tsx +83 -17
- data/app/pb_kits/playbook/pb_dropdown/subcomponents/MultiSelectTriggerDisplay.tsx +58 -0
- data/app/pb_kits/playbook/pb_empty_state/_empty_state.scss +8 -1
- data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_alignment.html.erb +27 -0
- data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_default.html.erb +7 -0
- data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_orientation.html.erb +12 -0
- data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_size.html.erb +23 -0
- data/app/pb_kits/playbook/pb_empty_state/docs/example.yml +5 -1
- data/app/pb_kits/playbook/pb_empty_state/empty_state.html.erb +19 -0
- data/app/pb_kits/playbook/pb_empty_state/empty_state.rb +123 -0
- data/app/pb_kits/playbook/pb_file_upload/_file_upload.scss +13 -0
- data/app/pb_kits/playbook/pb_file_upload/_file_upload.tsx +11 -1
- data/app/pb_kits/playbook/pb_file_upload/docs/_file_upload_error.html.erb +1 -0
- data/app/pb_kits/playbook/pb_file_upload/docs/_file_upload_error.jsx +41 -0
- data/app/pb_kits/playbook/pb_file_upload/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_file_upload/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_file_upload/file_upload.html.erb +1 -0
- data/app/pb_kits/playbook/pb_file_upload/file_upload.rb +7 -1
- data/app/pb_kits/playbook/pb_file_upload/fileupload.test.js +18 -0
- data/app/pb_kits/playbook/pb_form/docs/_form_form_with.html.erb +1 -0
- data/app/pb_kits/playbook/pb_form/docs/_form_form_with_validate.html.erb +1 -0
- data/app/pb_kits/playbook/pb_form_group/_error_state_mixin.scss +2 -2
- data/app/pb_kits/playbook/pb_form_pill/_form_pill.scss +19 -12
- data/app/pb_kits/playbook/pb_home_address_street/_home_address_street.tsx +13 -7
- data/app/pb_kits/playbook/pb_message/_message.tsx +3 -0
- data/app/pb_kits/playbook/pb_message/docs/_message_grayscale.html.erb +9 -0
- data/app/pb_kits/playbook/pb_message/docs/_message_grayscale.jsx +21 -0
- data/app/pb_kits/playbook/pb_message/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_message/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_message/message.html.erb +2 -1
- data/app/pb_kits/playbook/pb_message/message.rb +1 -0
- data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.tsx +2 -2
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_color.html.erb +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_color.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_default.html.erb +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_default.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled.html.erb +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options.html.erb +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_default.html.erb +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_default.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent.html.erb +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent_default.html.erb +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent_default.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_error.html.erb +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_error.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_label.html.erb +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_label.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_react_hook.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_reset.html.erb +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_return_all_selected.html.erb +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_return_all_selected.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids.html.erb +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids.md +2 -0
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids_react.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids_react.md +3 -1
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_single.html.erb +22 -22
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_single.jsx +22 -22
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_single_children_only.html.erb +22 -22
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_single_children_only.jsx +22 -22
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_with_children.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_with_children_with_radios.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_with_form.html.erb +11 -11
- data/app/pb_kits/playbook/pb_overlay/_overlay.scss +2 -1
- data/app/pb_kits/playbook/pb_overlay/docs/_overlay_vertical_dynamic_multi_directional.jsx +1 -1
- data/app/pb_kits/playbook/pb_overlay/subcomponents/_overlay_token.tsx +5 -4
- data/app/pb_kits/playbook/pb_person/_person.tsx +12 -2
- data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.scss +9 -9
- data/app/pb_kits/playbook/pb_section_separator/_section_separator.tsx +2 -2
- data/app/pb_kits/playbook/pb_select/_select.scss +10 -0
- data/app/pb_kits/playbook/pb_select/docs/_select_error.html.erb +1 -1
- data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_custom_click.jsx +7 -7
- data/app/pb_kits/playbook/pb_table/subcomponents/_table_row.tsx +5 -5
- data/app/pb_kits/playbook/pb_text_input/_text_input.scss +4 -2
- data/app/pb_kits/playbook/pb_text_input/docs/_text_input_error.html.erb +1 -1
- data/app/pb_kits/playbook/pb_textarea/docs/_textarea_error.html.erb +5 -1
- data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +73 -3
- data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_error_state.html.erb +8 -1
- data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_preserve_input.jsx +23 -0
- data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_preserve_input.md +1 -0
- data/app/pb_kits/playbook/pb_typeahead/docs/example.yml +1 -0
- data/app/pb_kits/playbook/pb_typeahead/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_user/_user.tsx +3 -0
- data/app/pb_kits/playbook/pb_user/docs/_user_grayscale.html.erb +6 -0
- data/app/pb_kits/playbook/pb_user/docs/_user_grayscale.jsx +16 -0
- data/app/pb_kits/playbook/pb_user/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_user/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_user/user.html.erb +2 -1
- data/app/pb_kits/playbook/pb_user/user.rb +1 -0
- data/dist/chunks/_typeahead-C-CI5Vgw.js +22 -0
- data/dist/chunks/_weekday_stacked-BCiM3zWM.js +45 -0
- data/dist/chunks/lib-D5R1BjUn.js +29 -0
- data/dist/chunks/{pb_form_validation-BWjy4bFn.js → pb_form_validation-BZ2AVAi_.js} +1 -1
- data/dist/chunks/vendor.js +1 -1
- data/dist/menu.yml +6 -14
- data/dist/playbook-doc.js +2 -2
- data/dist/playbook-rails-react-bindings.js +1 -1
- data/dist/playbook-rails.js +1 -1
- data/dist/playbook.css +1 -1
- data/lib/playbook/kit_base.rb +3 -3
- data/lib/playbook/version.rb +2 -2
- metadata +70 -22
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default.html.erb +0 -10
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_and_custom_display.md +0 -1
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_hook.jsx +0 -79
- data/app/pb_kits/playbook/pb_gantt_chart/_gantt_chart.scss +0 -3
- data/app/pb_kits/playbook/pb_gantt_chart/_gantt_chart.tsx +0 -72
- data/app/pb_kits/playbook/pb_gantt_chart/docs/_gantt_chart_default.jsx +0 -53
- data/app/pb_kits/playbook/pb_gantt_chart/docs/example.yml +0 -7
- data/app/pb_kits/playbook/pb_gantt_chart/docs/index.js +0 -1
- data/app/pb_kits/playbook/pb_gantt_chart/gantt_chart.test.jsx +0 -19
- data/dist/chunks/_typeahead-D8CsVBZO.js +0 -22
- data/dist/chunks/_weekday_stacked-D3oLTSkH.js +0 -45
- data/dist/chunks/lib-BmTAc7Nc.js +0 -29
- /data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows_react.md → _advanced_table_selectable_rows.md} +0 -0
- /data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows_no_subrows.html.erb → _advanced_table_selectable_rows_no_subrows_rails.html.erb} +0 -0
- /data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows.html.erb → _advanced_table_selectable_rows_rails.html.erb} +0 -0
- /data/app/pb_kits/playbook/pb_draggable/docs/{_draggable_drop_zones_line.md → _draggable_drop_zones_line_react.md} +0 -0
- /data/app/pb_kits/playbook/pb_draggable/docs/{_draggable_event_listeners.md → _draggable_event_listeners_rails.md} +0 -0
| @@ -55,7 +55,7 @@ const TableRow = (props: TableRowPropTypes): React.ReactElement => { | |
| 55 55 | 
             
              const htmlProps = buildHtmlProps(htmlOptions);
         | 
| 56 56 | 
             
              const sideHighlightClass =
         | 
| 57 57 | 
             
                sideHighlightColor != "" ? `side_highlight_${sideHighlightColor}` : null;
         | 
| 58 | 
            -
             | 
| 58 | 
            +
             | 
| 59 59 | 
             
              const [isCollapsed, setIsCollapsed] = useCollapsible(true);
         | 
| 60 60 |  | 
| 61 61 | 
             
              const collapsibleRow = collapsible && isCollapsed === true ? "collapsible_table_row" : null;
         | 
| @@ -83,14 +83,14 @@ const TableRow = (props: TableRowPropTypes): React.ReactElement => { | |
| 83 83 | 
             
                  target instanceof SVGElement &&
         | 
| 84 84 | 
             
                  (target.matches("svg.pb_custom_icon") || target.closest("svg.pb_custom_icon"));
         | 
| 85 85 |  | 
| 86 | 
            -
                    if (clickedCell || isIconClick) { | 
| 86 | 
            +
                    if (clickedCell || (clickedCell && isIconClick)) {
         | 
| 87 87 | 
             
                  setIsCollapsed(!isCollapsed);
         | 
| 88 88 | 
             
                  }
         | 
| 89 89 | 
             
                } else {
         | 
| 90 90 | 
             
                  setIsCollapsed(!isCollapsed);
         | 
| 91 91 | 
             
                }
         | 
| 92 92 | 
             
              };
         | 
| 93 | 
            -
             | 
| 93 | 
            +
             | 
| 94 94 | 
             
              return (
         | 
| 95 95 | 
             
                <>
         | 
| 96 96 | 
             
                  {collapsible ? (
         | 
| @@ -116,7 +116,7 @@ const TableRow = (props: TableRowPropTypes): React.ReactElement => { | |
| 116 116 | 
             
                              tag="td"
         | 
| 117 117 | 
             
                          >
         | 
| 118 118 | 
             
                            <tr/>
         | 
| 119 | 
            -
                            <Collapsible.Content | 
| 119 | 
            +
                            <Collapsible.Content
         | 
| 120 120 | 
             
                                className={collapsibleSideHighlight ? `table_collapsible_side_highlight` : ''}
         | 
| 121 121 | 
             
                                dark={dark}
         | 
| 122 122 | 
             
                                margin="none"
         | 
| @@ -149,7 +149,7 @@ const TableRow = (props: TableRowPropTypes): React.ReactElement => { | |
| 149 149 | 
             
                              tag="td"
         | 
| 150 150 | 
             
                          >
         | 
| 151 151 | 
             
                            <tr/>
         | 
| 152 | 
            -
                            <Collapsible.Content | 
| 152 | 
            +
                            <Collapsible.Content
         | 
| 153 153 | 
             
                                className={collapsibleSideHighlight ? `table_collapsible_side_highlight` : ''}
         | 
| 154 154 | 
             
                                dark={dark}
         | 
| 155 155 | 
             
                                margin="none"
         | 
| @@ -71,7 +71,8 @@ | |
| 71 71 | 
             
                }
         | 
| 72 72 | 
             
                &.error {
         | 
| 73 73 | 
             
                  .text_input_wrapper {
         | 
| 74 | 
            -
                    input | 
| 74 | 
            +
                    // The `:not` here prevents error styling from affecting the country search input in the Phone Number Input Kit.
         | 
| 75 | 
            +
                    input:not(.iti__search-input),
         | 
| 75 76 | 
             
                    .text_input {
         | 
| 76 77 | 
             
                      border-color: $error_dark;
         | 
| 77 78 | 
             
                    }
         | 
| @@ -102,7 +103,8 @@ | |
| 102 103 | 
             
                  [class*="pb_body_kit"] {
         | 
| 103 104 | 
             
                    margin-top: $space_xs / 2;
         | 
| 104 105 | 
             
                  }
         | 
| 105 | 
            -
                  input | 
| 106 | 
            +
                  // The `:not` here prevents error styling from affecting the country search input in the Phone Number Input Kit.
         | 
| 107 | 
            +
                  input:not(.iti__search-input),
         | 
| 106 108 | 
             
                  .text_input {
         | 
| 107 109 | 
             
                    border-color: $error;
         | 
| 108 110 | 
             
                  }
         | 
| @@ -29,6 +29,7 @@ import { GenericObject, Noop } from '../types' | |
| 29 29 | 
             
             * @prop {boolean} async - whether Typeahead should fetch data from
         | 
| 30 30 | 
             
             * a remote location to populate the options
         | 
| 31 31 | 
             
             * @prop {string} label - the text for the optional typeahead input label
         | 
| 32 | 
            +
             * @prop {boolean} preserveSearchInput - whether to preserve the input value when the field loses focus
         | 
| 32 33 | 
             
             */
         | 
| 33 34 |  | 
| 34 35 | 
             
            type TypeaheadProps = {
         | 
| @@ -54,6 +55,7 @@ type TypeaheadProps = { | |
| 54 55 | 
             
              optionsByContext?: Record<string, Array<{ label: string; value?: string }>>
         | 
| 55 56 | 
             
              searchContextSelector?: string,
         | 
| 56 57 | 
             
              clearOnContextChange?: boolean,
         | 
| 58 | 
            +
              preserveSearchInput?: boolean,
         | 
| 57 59 | 
             
            } & GlobalProps
         | 
| 58 60 |  | 
| 59 61 | 
             
            export type SelectValueType = {
         | 
| @@ -93,8 +95,44 @@ const Typeahead = forwardRef<HTMLInputElement, TypeaheadProps>(({ | |
| 93 95 | 
             
              optionsByContext = {},
         | 
| 94 96 | 
             
              searchContextSelector,
         | 
| 95 97 | 
             
              clearOnContextChange = false,
         | 
| 98 | 
            +
              preserveSearchInput = false, // Default to false to maintain backward compatibility
         | 
| 96 99 | 
             
              ...props
         | 
| 97 100 | 
             
            }: TypeaheadProps) => {
         | 
| 101 | 
            +
              // State to manage the input value when preserveSearchInput is true
         | 
| 102 | 
            +
              const [inputValue, setInputValue] = useState("")
         | 
| 103 | 
            +
             | 
| 104 | 
            +
              // If preserveSearchInput is true, we need to control the input value
         | 
| 105 | 
            +
              const handleInputChange = preserveSearchInput
         | 
| 106 | 
            +
                ? (newValue: string, actionMeta: {action: string}) => {
         | 
| 107 | 
            +
                    // Only update the input value for certain actions
         | 
| 108 | 
            +
                    if (actionMeta.action === 'input-change') {
         | 
| 109 | 
            +
                      setInputValue(newValue)
         | 
| 110 | 
            +
                    } else if (actionMeta.action === 'menu-close' && !props.value) {
         | 
| 111 | 
            +
                      // Don't clear the input when the menu closes without a selection
         | 
| 112 | 
            +
                      // unless the component is controlled and has a value
         | 
| 113 | 
            +
                    } else if (actionMeta.action === 'set-value') {
         | 
| 114 | 
            +
                      // When an option is selected, clear the input
         | 
| 115 | 
            +
                      setInputValue('')
         | 
| 116 | 
            +
                    }
         | 
| 117 | 
            +
             | 
| 118 | 
            +
                    // If the original onInputChange was provided, call it too
         | 
| 119 | 
            +
                    if (props.onInputChange) {
         | 
| 120 | 
            +
                      return props.onInputChange(newValue, actionMeta)
         | 
| 121 | 
            +
                    }
         | 
| 122 | 
            +
                    return newValue
         | 
| 123 | 
            +
                  }
         | 
| 124 | 
            +
                : props.onInputChange
         | 
| 125 | 
            +
             | 
| 126 | 
            +
              // Handle blur events if we're preserving input
         | 
| 127 | 
            +
              const handleBlur = preserveSearchInput
         | 
| 128 | 
            +
                ? (event: React.FocusEvent<HTMLInputElement>) => {
         | 
| 129 | 
            +
                    // Do not clear input on blur - the value is preserved in our state
         | 
| 130 | 
            +
                    if (props.onBlur) {
         | 
| 131 | 
            +
                      props.onBlur(event)
         | 
| 132 | 
            +
                    }
         | 
| 133 | 
            +
                  }
         | 
| 134 | 
            +
                : props.onBlur
         | 
| 135 | 
            +
             | 
| 98 136 | 
             
              const selectProps = {
         | 
| 99 137 | 
             
                cacheOptions: true,
         | 
| 100 138 | 
             
                components: {
         | 
| @@ -124,11 +162,29 @@ const Typeahead = forwardRef<HTMLInputElement, TypeaheadProps>(({ | |
| 124 162 | 
             
                // eslint-disable-next-line @typescript-eslint/no-unused-vars
         | 
| 125 163 | 
             
                onMultiValueClick: (_option: SelectValueType): any => undefined,
         | 
| 126 164 | 
             
                pillColor: pillColor,
         | 
| 165 | 
            +
                ...(preserveSearchInput ? { inputValue } : {}),
         | 
| 166 | 
            +
                onInputChange: handleInputChange,
         | 
| 167 | 
            +
                onBlur: handleBlur,
         | 
| 127 168 | 
             
                ...props,
         | 
| 128 169 | 
             
              }
         | 
| 129 170 |  | 
| 130 171 | 
             
              const [contextValue, setContextValue] = useState("")
         | 
| 131 172 |  | 
| 173 | 
            +
              // Add listener for clearing
         | 
| 174 | 
            +
              useEffect(() => {
         | 
| 175 | 
            +
                const handleClear = () => {
         | 
| 176 | 
            +
                  if (preserveSearchInput) {
         | 
| 177 | 
            +
                    setInputValue('')
         | 
| 178 | 
            +
                  }
         | 
| 179 | 
            +
                }
         | 
| 180 | 
            +
             | 
| 181 | 
            +
                document.addEventListener(`pb-typeahead-kit-${selectProps.id}:clear`, handleClear)
         | 
| 182 | 
            +
             | 
| 183 | 
            +
                return () => {
         | 
| 184 | 
            +
                  document.removeEventListener(`pb-typeahead-kit-${selectProps.id}:clear`, handleClear)
         | 
| 185 | 
            +
                }
         | 
| 186 | 
            +
              }, [selectProps.id, preserveSearchInput])
         | 
| 187 | 
            +
             | 
| 132 188 | 
             
              useEffect(() => {
         | 
| 133 189 | 
             
                if (searchContextSelector) {
         | 
| 134 190 | 
             
                  const searchContextElement = document.getElementById(searchContextSelector)
         | 
| @@ -137,7 +193,12 @@ const Typeahead = forwardRef<HTMLInputElement, TypeaheadProps>(({ | |
| 137 193 | 
             
                  const handleContextChange = (e: Event) => {
         | 
| 138 194 | 
             
                    const target = e.target as HTMLInputElement;
         | 
| 139 195 | 
             
                    setContextValue(target.value);
         | 
| 140 | 
            -
                    if (clearOnContextChange)  | 
| 196 | 
            +
                    if (clearOnContextChange) {
         | 
| 197 | 
            +
                      document.dispatchEvent(new CustomEvent(`pb-typeahead-kit-${selectProps.id}:clear`))
         | 
| 198 | 
            +
                      if (preserveSearchInput) {
         | 
| 199 | 
            +
                        setInputValue('')
         | 
| 200 | 
            +
                      }
         | 
| 201 | 
            +
                    }
         | 
| 141 202 | 
             
                  }
         | 
| 142 203 |  | 
| 143 204 | 
             
                  if (searchContextElement) searchContextElement.addEventListener('change', handleContextChange)
         | 
| @@ -146,7 +207,7 @@ const Typeahead = forwardRef<HTMLInputElement, TypeaheadProps>(({ | |
| 146 207 | 
             
                    if (searchContextElement) searchContextElement.removeEventListener('change', handleContextChange)
         | 
| 147 208 | 
             
                  }
         | 
| 148 209 | 
             
                }
         | 
| 149 | 
            -
              }, [searchContextSelector])
         | 
| 210 | 
            +
              }, [searchContextSelector, clearOnContextChange, selectProps.id, preserveSearchInput])
         | 
| 150 211 |  | 
| 151 212 | 
             
              const contextArray = optionsByContext[contextValue]
         | 
| 152 213 | 
             
              if (Array.isArray(contextArray) && contextArray.length > 0) {
         | 
| @@ -168,7 +229,12 @@ const Typeahead = forwardRef<HTMLInputElement, TypeaheadProps>(({ | |
| 168 229 | 
             
                    onChange(_data)
         | 
| 169 230 | 
             
                  }
         | 
| 170 231 | 
             
                }
         | 
| 171 | 
            -
             | 
| 232 | 
            +
             | 
| 233 | 
            +
                // If a value is selected and we're preserving input on blur, clear the input
         | 
| 234 | 
            +
                if (action === 'select-option' && preserveSearchInput) {
         | 
| 235 | 
            +
                  setInputValue('')
         | 
| 236 | 
            +
                }
         | 
| 237 | 
            +
             | 
| 172 238 | 
             
                if (action === 'select-option') {
         | 
| 173 239 | 
             
                  if (selectProps.onMultiValueClick) selectProps.onMultiValueClick(option)
         | 
| 174 240 | 
             
                  const multiValueClearEvent = new CustomEvent(`pb-typeahead-kit-${selectProps.id}-result-option-select`, { detail: option ? option : _data })
         | 
| @@ -181,6 +247,10 @@ const Typeahead = forwardRef<HTMLInputElement, TypeaheadProps>(({ | |
| 181 247 | 
             
                if (action === 'clear') {
         | 
| 182 248 | 
             
                  const multiValueClearEvent = new CustomEvent(`pb-typeahead-kit-${selectProps.id}-result-clear`)
         | 
| 183 249 | 
             
                  document.dispatchEvent(multiValueClearEvent)
         | 
| 250 | 
            +
                  // If preserving input on blur, also clear input on explicit clear
         | 
| 251 | 
            +
                  if (preserveSearchInput) {
         | 
| 252 | 
            +
                    setInputValue('')
         | 
| 253 | 
            +
                  }
         | 
| 184 254 | 
             
                }
         | 
| 185 255 | 
             
              }
         | 
| 186 256 |  | 
| @@ -8,7 +8,14 @@ | |
| 8 8 |  | 
| 9 9 | 
             
            %>
         | 
| 10 10 |  | 
| 11 | 
            -
            <%= pb_rails("typeahead", props: { | 
| 11 | 
            +
            <%= pb_rails("typeahead", props: {
         | 
| 12 | 
            +
              id: "typeahead-error-example",
         | 
| 13 | 
            +
              options: options,
         | 
| 14 | 
            +
              error: "Please make a valid selection",
         | 
| 15 | 
            +
              label: "Products",
         | 
| 16 | 
            +
              name: :foo,
         | 
| 17 | 
            +
              is_multi: false
         | 
| 18 | 
            +
            }) %>
         | 
| 12 19 |  | 
| 13 20 | 
             
            <!-- This section is an example of the available JavaScript event hooks -->
         | 
| 14 21 | 
             
            <%= javascript_tag defer: "defer" do %>
         | 
| @@ -0,0 +1,23 @@ | |
| 1 | 
            +
            import React from 'react'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            import Typeahead from '../_typeahead'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            const options = [
         | 
| 6 | 
            +
              { label: 'Orange', value: '#FFA500' },
         | 
| 7 | 
            +
              { label: 'Red', value: '#FF0000' },
         | 
| 8 | 
            +
              { label: 'Green', value: '#00FF00' },
         | 
| 9 | 
            +
              { label: 'Blue', value: '#0000FF' },
         | 
| 10 | 
            +
            ]
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            const TypeaheadPreserveInput = (props) => {
         | 
| 13 | 
            +
              return (
         | 
| 14 | 
            +
                <Typeahead
         | 
| 15 | 
            +
                    label="Colors"
         | 
| 16 | 
            +
                    options={options}
         | 
| 17 | 
            +
                    preserveSearchInput
         | 
| 18 | 
            +
                    {...props}
         | 
| 19 | 
            +
                />
         | 
| 20 | 
            +
              )
         | 
| 21 | 
            +
            }
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            export default TypeaheadPreserveInput
         | 
| @@ -0,0 +1 @@ | |
| 1 | 
            +
            By default, text is not preserved in the typeahead kit when you click off of the input field. You can utilize the `preserveSearchInput` prop in order to prevent text from being cleared when the field loses focus
         | 
| @@ -15,3 +15,4 @@ export { default as TypeaheadWithPillsColor } from './_typeahead_with_pills_colo | |
| 15 15 | 
             
            export { default as TypeaheadTruncatedText } from './_typeahead_truncated_text.jsx'
         | 
| 16 16 | 
             
            export { default as TypeaheadReactHook } from './_typeahead_react_hook.jsx'
         | 
| 17 17 | 
             
            export { default as TypeaheadDisabled } from './_typeahead_disabled.jsx'
         | 
| 18 | 
            +
            export { default as TypeaheadPreserveInput } from './_typeahead_preserve_input.jsx'
         | 
| @@ -19,6 +19,7 @@ type UserProps = { | |
| 19 19 | 
             
              className?: string,
         | 
| 20 20 | 
             
              dark?: boolean,
         | 
| 21 21 | 
             
              data?: {[key: string]: string},
         | 
| 22 | 
            +
              avatarGrayscale?: boolean,
         | 
| 22 23 | 
             
              htmlOptions?: {[key: string]: string | number | boolean | (() => void)},
         | 
| 23 24 | 
             
              id?: string,
         | 
| 24 25 | 
             
              name?: string,
         | 
| @@ -41,6 +42,7 @@ const User = (props: UserProps): React.ReactElement => { | |
| 41 42 | 
             
                className,
         | 
| 42 43 | 
             
                dark = false,
         | 
| 43 44 | 
             
                data = {},
         | 
| 45 | 
            +
                avatarGrayscale = false,
         | 
| 44 46 | 
             
                htmlOptions = {},
         | 
| 45 47 | 
             
                id,
         | 
| 46 48 | 
             
                name,
         | 
| @@ -145,6 +147,7 @@ const User = (props: UserProps): React.ReactElement => { | |
| 145 147 | 
             
                >
         | 
| 146 148 | 
             
                  { avatarPresent &&
         | 
| 147 149 | 
             
                    <Avatar
         | 
| 150 | 
            +
                        grayscale={avatarGrayscale}
         | 
| 148 151 | 
             
                        imageUrl={avatarUrl}
         | 
| 149 152 | 
             
                        name={name}
         | 
| 150 153 | 
             
                        size={size}
         | 
| @@ -0,0 +1,16 @@ | |
| 1 | 
            +
            import React from 'react'
         | 
| 2 | 
            +
            import User from '../../pb_user/_user'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            const UserGrayscale = (props) => {
         | 
| 5 | 
            +
              return (
         | 
| 6 | 
            +
                <User
         | 
| 7 | 
            +
                    avatarGrayscale
         | 
| 8 | 
            +
                    avatarUrl="https://randomuser.me/api/portraits/women/44.jpg"
         | 
| 9 | 
            +
                    name="Anna Black"
         | 
| 10 | 
            +
                    title="Remodeling Consultant"
         | 
| 11 | 
            +
                    {...props}
         | 
| 12 | 
            +
                />
         | 
| 13 | 
            +
              )
         | 
| 14 | 
            +
            }
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            export default UserGrayscale
         | 
| @@ -10,6 +10,7 @@ examples: | |
| 10 10 | 
             
              - user_subtitle: Subtitle
         | 
| 11 11 | 
             
              - user_block_content_subtitle_rails: Block Content Subtitle
         | 
| 12 12 | 
             
              - user_font_options: Font Options
         | 
| 13 | 
            +
              - user_grayscale: Grayscale Avatar
         | 
| 13 14 |  | 
| 14 15 | 
             
              react:
         | 
| 15 16 | 
             
              - user_default: Default
         | 
| @@ -21,6 +22,7 @@ examples: | |
| 21 22 | 
             
              - user_subtitle: Subtitle
         | 
| 22 23 | 
             
              - user_block_content_subtitle_react: Block Content Subtitle
         | 
| 23 24 | 
             
              - user_font_options: Font Options
         | 
| 25 | 
            +
              - user_grayscale: Grayscale Avatar
         | 
| 24 26 |  | 
| 25 27 | 
             
              swift:
         | 
| 26 28 | 
             
              - user_horizontal_swift: Horizontal
         | 
| @@ -7,3 +7,4 @@ export { default as UserVerticalSize } from './_user_vertical_size.jsx' | |
| 7 7 | 
             
            export { default as UserSubtitle } from './_user_subtitle.jsx'
         | 
| 8 8 | 
             
            export { default as UserBlockContentSubtitleReact } from './_user_block_content_subtitle_react.jsx'
         | 
| 9 9 | 
             
            export { default as UserFontOptions } from './_user_font_options.jsx'
         | 
| 10 | 
            +
            export { default as UserGrayscale } from './_user_grayscale.jsx'
         | 
| @@ -8,6 +8,7 @@ module Playbook | |
| 8 8 | 
             
                               default: "left"
         | 
| 9 9 | 
             
                  prop :avatar, type: Playbook::Props::Boolean,
         | 
| 10 10 | 
             
                                default: false
         | 
| 11 | 
            +
                  prop :avatar_grayscale, type: Playbook::Props::Boolean, default: false
         | 
| 11 12 | 
             
                  prop :avatar_url
         | 
| 12 13 | 
             
                  prop :bold, type: Playbook::Props::Boolean, default: true
         | 
| 13 14 | 
             
                  prop :name
         |