playbook_ui 16.9.0 → 16.10.0.pre.alpha.PLAY3053advancedtablebottompinnedrowsreact17469

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (375) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/_playbook.scss +2 -0
  3. data/app/pb_kits/playbook/pb_advanced_table/Components/RegularTableView.tsx +32 -11
  4. data/app/pb_kits/playbook/pb_advanced_table/Components/TableActionBar.tsx +5 -2
  5. data/app/pb_kits/playbook/pb_advanced_table/Context/AdvancedTableContext.tsx +27 -2
  6. data/app/pb_kits/playbook/pb_advanced_table/Hooks/useTableState.ts +19 -14
  7. data/app/pb_kits/playbook/pb_advanced_table/Utilities/CellRendererUtils.tsx +4 -2
  8. data/app/pb_kits/playbook/pb_advanced_table/Utilities/RowUtils.ts +17 -0
  9. data/app/pb_kits/playbook/pb_advanced_table/Utilities/StickyLayoutHelper.ts +100 -0
  10. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +38 -71
  11. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +27 -77
  12. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.rb +7 -0
  13. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.test.jsx +128 -12
  14. data/app/pb_kits/playbook/pb_advanced_table/advanced_table_action_bar.js +31 -9
  15. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_pinned_rows.jsx +19 -2
  16. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_pinned_rows_react.md +2 -2
  17. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_row_styling.html.erb +4 -0
  18. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_row_styling.jsx +6 -2
  19. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_row_styling_rails.md +1 -0
  20. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_row_styling_react.md +1 -0
  21. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_sticky_header.html.erb +36 -44
  22. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_sticky_header.jsx +10 -19
  23. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_sticky_header_rails.md +0 -4
  24. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_sticky_header_react.md +3 -5
  25. data/app/pb_kits/playbook/pb_advanced_table/docs/_playground.json +2 -8
  26. data/app/pb_kits/playbook/pb_advanced_table/docs/_playground.overrides.json +1 -8
  27. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +0 -1
  28. data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +0 -1
  29. data/app/pb_kits/playbook/pb_advanced_table/index.js +20 -29
  30. data/app/pb_kits/playbook/pb_advanced_table/kit.schema.json +0 -12
  31. data/app/pb_kits/playbook/pb_advanced_table/table_body.rb +1 -1
  32. data/app/pb_kits/playbook/pb_advanced_table/table_row.html.erb +2 -1
  33. data/app/pb_kits/playbook/pb_advanced_table/table_row.rb +16 -2
  34. data/app/pb_kits/playbook/pb_badge/kit.schema.json +1 -1
  35. data/app/pb_kits/playbook/pb_button_toolbar/kit.schema.json +1 -1
  36. data/app/pb_kits/playbook/pb_card/card.rb +1 -1
  37. data/app/pb_kits/playbook/pb_card/kit.schema.json +2 -0
  38. data/app/pb_kits/playbook/pb_checkbox/kit.schema.json +2 -2
  39. data/app/pb_kits/playbook/pb_circle_icon_button/kit.schema.json +2 -2
  40. data/app/pb_kits/playbook/pb_date_picker/_date_picker.scss +6 -0
  41. data/app/pb_kits/playbook/pb_date_picker/_date_picker.tsx +19 -2
  42. data/app/pb_kits/playbook/pb_date_picker/date_picker.html.erb +58 -1
  43. data/app/pb_kits/playbook/pb_date_picker/date_picker.rb +3 -0
  44. data/app/pb_kits/playbook/pb_date_picker/date_picker_helper.ts +319 -65
  45. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_year_asc.html.erb +1 -0
  46. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_year_asc.jsx +15 -0
  47. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_year_asc.md +1 -0
  48. data/app/pb_kits/playbook/pb_date_picker/docs/_playground.json +1 -0
  49. data/app/pb_kits/playbook/pb_date_picker/docs/example.yml +2 -0
  50. data/app/pb_kits/playbook/pb_date_picker/docs/index.js +1 -0
  51. data/app/pb_kits/playbook/pb_date_picker/kit.schema.json +9 -1
  52. data/app/pb_kits/playbook/pb_date_time/kit.schema.json +1 -1
  53. data/app/pb_kits/playbook/pb_date_time_stacked/kit.schema.json +1 -1
  54. data/app/pb_kits/playbook/pb_dialog/_dialog.scss +54 -1
  55. data/app/pb_kits/playbook/pb_dialog/_dialog.tsx +21 -5
  56. data/app/pb_kits/playbook/pb_dialog/_dialog_context.tsx +8 -2
  57. data/app/pb_kits/playbook/pb_dialog/child_kits/_dialog_header.tsx +1 -1
  58. data/app/pb_kits/playbook/pb_dialog/dialog.html.erb +5 -1
  59. data/app/pb_kits/playbook/pb_dialog/dialog.test.jsx +125 -0
  60. data/app/pb_kits/playbook/pb_dialog/index.js +11 -1
  61. data/app/pb_kits/playbook/pb_draggable/context/index.tsx +1 -1
  62. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_event_listeners_rails.md +1 -1
  63. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_independent_containers.html.erb +35 -0
  64. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_independent_containers_rails.md +8 -0
  65. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_multiple_containers_rails.md +3 -1
  66. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_multiple_containers_react.md +1 -1
  67. data/app/pb_kits/playbook/pb_draggable/docs/_playground.json +260 -19
  68. data/app/pb_kits/playbook/pb_draggable/docs/_playground.overrides.json +258 -13
  69. data/app/pb_kits/playbook/pb_draggable/docs/example.yml +1 -0
  70. data/app/pb_kits/playbook/pb_draggable/index.js +10 -3
  71. data/app/pb_kits/playbook/pb_dropdown/_dropdown.scss +122 -0
  72. data/app/pb_kits/playbook/pb_dropdown/_dropdown.tsx +114 -35
  73. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_custom_display_disabled_option.html.erb +93 -0
  74. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_custom_display_disabled_option.jsx +127 -0
  75. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_custom_display_disabled_option.md +1 -0
  76. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_disabled.html.erb +10 -0
  77. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_disabled.jsx +37 -0
  78. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_disabled_option.html.erb +10 -0
  79. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_disabled_option.jsx +37 -0
  80. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_disabled_option.md +1 -0
  81. data/app/pb_kits/playbook/pb_dropdown/docs/_playground.json +150 -237
  82. data/app/pb_kits/playbook/pb_dropdown/docs/_playground.overrides.json +58 -74
  83. data/app/pb_kits/playbook/pb_dropdown/docs/example.yml +6 -0
  84. data/app/pb_kits/playbook/pb_dropdown/docs/index.js +3 -0
  85. data/app/pb_kits/playbook/pb_dropdown/dropdown.html.erb +5 -4
  86. data/app/pb_kits/playbook/pb_dropdown/dropdown.rb +6 -1
  87. data/app/pb_kits/playbook/pb_dropdown/dropdown.test.jsx +96 -0
  88. data/app/pb_kits/playbook/pb_dropdown/dropdown_container.html.erb +1 -0
  89. data/app/pb_kits/playbook/pb_dropdown/dropdown_container.rb +2 -0
  90. data/app/pb_kits/playbook/pb_dropdown/dropdown_option.html.erb +2 -2
  91. data/app/pb_kits/playbook/pb_dropdown/dropdown_option.rb +27 -2
  92. data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.html.erb +4 -2
  93. data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.rb +2 -0
  94. data/app/pb_kits/playbook/pb_dropdown/hooks/useHandleOnKeydown.tsx +25 -5
  95. data/app/pb_kits/playbook/pb_dropdown/index.js +270 -25
  96. data/app/pb_kits/playbook/pb_dropdown/keyboard_accessibility.js +19 -10
  97. data/app/pb_kits/playbook/pb_dropdown/kit.schema.json +8 -0
  98. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownContainer.tsx +39 -2
  99. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownOption.tsx +15 -4
  100. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownTrigger.tsx +22 -13
  101. data/app/pb_kits/playbook/pb_file_upload/docs/_file_upload_remove_replace.html.erb +66 -0
  102. data/app/pb_kits/playbook/pb_file_upload/docs/_file_upload_remove_replace.jsx +53 -0
  103. data/app/pb_kits/playbook/pb_file_upload/docs/_file_upload_remove_replace.md +5 -0
  104. data/app/pb_kits/playbook/pb_file_upload/docs/_playground.json +2 -1
  105. data/app/pb_kits/playbook/pb_file_upload/docs/example.yml +3 -1
  106. data/app/pb_kits/playbook/pb_file_upload/docs/index.js +1 -0
  107. data/app/pb_kits/playbook/pb_file_upload/kit.schema.json +3 -3
  108. data/app/pb_kits/playbook/pb_filter/Filter/CurrentFilters.tsx +55 -28
  109. data/app/pb_kits/playbook/pb_filter/Filter/FilterDouble.tsx +4 -1
  110. data/app/pb_kits/playbook/pb_filter/Filter/FilterSingle.tsx +4 -1
  111. data/app/pb_kits/playbook/pb_filter/Filter/InteractiveFilter.tsx +277 -0
  112. data/app/pb_kits/playbook/pb_filter/_filter.scss +88 -1
  113. data/app/pb_kits/playbook/pb_filter/_filter.tsx +27 -0
  114. data/app/pb_kits/playbook/pb_filter/docs/_filter_interactive.html.erb +116 -0
  115. data/app/pb_kits/playbook/pb_filter/docs/_filter_interactive.md +12 -0
  116. data/app/pb_kits/playbook/pb_filter/docs/_filter_interactive_react.jsx +153 -0
  117. data/app/pb_kits/playbook/pb_filter/docs/_filter_interactive_react.md +10 -0
  118. data/app/pb_kits/playbook/pb_filter/docs/_filter_no_background.html.erb +1 -1
  119. data/app/pb_kits/playbook/pb_filter/docs/_playground.json +308 -5
  120. data/app/pb_kits/playbook/pb_filter/docs/_playground.overrides.json +312 -0
  121. data/app/pb_kits/playbook/pb_filter/docs/example.yml +2 -0
  122. data/app/pb_kits/playbook/pb_filter/docs/index.js +2 -1
  123. data/app/pb_kits/playbook/pb_filter/filter.html.erb +80 -3
  124. data/app/pb_kits/playbook/pb_filter/filter.rb +71 -0
  125. data/app/pb_kits/playbook/pb_filter/filter.test.js +78 -0
  126. data/app/pb_kits/playbook/pb_filter/index.ts +349 -0
  127. data/app/pb_kits/playbook/pb_filter/kit.schema.json +94 -29
  128. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/_playground.json +210 -14
  129. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/_playground.overrides.json +231 -0
  130. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/kit.schema.json +1 -1
  131. data/app/pb_kits/playbook/pb_flex/docs/_playground.json +297 -38
  132. data/app/pb_kits/playbook/pb_flex/docs/_playground.overrides.json +300 -40
  133. data/app/pb_kits/playbook/pb_form/docs/_form_with_required_indicator.html.erb +20 -19
  134. data/app/pb_kits/playbook/pb_form/docs/_playground.json +1 -13
  135. data/app/pb_kits/playbook/pb_form_group/docs/_playground.json +82 -5
  136. data/app/pb_kits/playbook/pb_form_group/docs/_playground.overrides.json +91 -0
  137. data/app/pb_kits/playbook/pb_form_pill/docs/_playground.json +155 -14
  138. data/app/pb_kits/playbook/pb_form_pill/docs/_playground.overrides.json +147 -0
  139. data/app/pb_kits/playbook/pb_form_pill/kit.schema.json +1 -1
  140. data/app/pb_kits/playbook/pb_full_screen/_full_screen.scss +77 -0
  141. data/app/pb_kits/playbook/pb_full_screen/_full_screen.tsx +183 -0
  142. data/app/pb_kits/playbook/pb_full_screen/docs/_description.md +1 -0
  143. data/app/pb_kits/playbook/pb_full_screen/docs/_full_screen_content_padding.jsx +68 -0
  144. data/app/pb_kits/playbook/pb_full_screen/docs/_full_screen_content_padding.md +1 -0
  145. data/app/pb_kits/playbook/pb_full_screen/docs/_full_screen_custom_trigger.jsx +71 -0
  146. data/app/pb_kits/playbook/pb_full_screen/docs/_full_screen_custom_trigger.md +1 -0
  147. data/app/pb_kits/playbook/pb_full_screen/docs/_full_screen_default.html.erb +3 -0
  148. data/app/pb_kits/playbook/pb_full_screen/docs/_full_screen_default.jsx +63 -0
  149. data/app/pb_kits/playbook/pb_full_screen/docs/_full_screen_default.md +1 -0
  150. data/app/pb_kits/playbook/pb_full_screen/docs/_full_screen_header_text_styling.jsx +68 -0
  151. data/app/pb_kits/playbook/pb_full_screen/docs/_full_screen_header_text_styling.md +1 -0
  152. data/app/pb_kits/playbook/pb_full_screen/docs/_full_screen_sticky_header.jsx +68 -0
  153. data/app/pb_kits/playbook/pb_full_screen/docs/_full_screen_sticky_header.md +1 -0
  154. data/app/pb_kits/playbook/pb_full_screen/docs/_full_screen_table_and_filter.jsx +149 -0
  155. data/app/pb_kits/playbook/pb_full_screen/docs/_full_screen_table_and_filter.md +1 -0
  156. data/app/pb_kits/playbook/pb_full_screen/docs/_playground.json +155 -0
  157. data/app/pb_kits/playbook/pb_full_screen/docs/_playground.overrides.json +137 -0
  158. data/app/pb_kits/playbook/pb_full_screen/docs/example.yml +14 -0
  159. data/app/pb_kits/playbook/pb_full_screen/docs/index.js +6 -0
  160. data/app/pb_kits/playbook/pb_full_screen/full_screen.html.erb +12 -0
  161. data/app/pb_kits/playbook/pb_full_screen/full_screen.rb +11 -0
  162. data/app/pb_kits/playbook/pb_full_screen/full_screen.test.jsx +237 -0
  163. data/app/pb_kits/playbook/pb_full_screen/kit.schema.json +89 -0
  164. data/app/pb_kits/playbook/pb_full_screen/useFullScreen.ts +15 -0
  165. data/app/pb_kits/playbook/pb_hashtag/docs/_playground.json +72 -11
  166. data/app/pb_kits/playbook/pb_hashtag/docs/_playground.overrides.json +75 -0
  167. data/app/pb_kits/playbook/pb_highlight/docs/_playground.json +75 -4
  168. data/app/pb_kits/playbook/pb_highlight/docs/_playground.overrides.json +75 -0
  169. data/app/pb_kits/playbook/pb_home_address_street/docs/_playground.json +138 -12
  170. data/app/pb_kits/playbook/pb_home_address_street/docs/_playground.overrides.json +162 -0
  171. data/app/pb_kits/playbook/pb_icon/_icon.tsx +22 -11
  172. data/app/pb_kits/playbook/pb_icon/docs/_icon_default.jsx +1 -1
  173. data/app/pb_kits/playbook/pb_icon/docs/_playground.json +66 -41
  174. data/app/pb_kits/playbook/pb_icon/docs/_playground.overrides.json +85 -27
  175. data/app/pb_kits/playbook/pb_icon/icon.rb +5 -2
  176. data/app/pb_kits/playbook/pb_icon/kit.schema.json +3 -5
  177. data/app/pb_kits/playbook/pb_icon_button/docs/_playground.json +111 -9
  178. data/app/pb_kits/playbook/pb_icon_button/docs/_playground.overrides.json +131 -0
  179. data/app/pb_kits/playbook/pb_icon_button/kit.schema.json +1 -1
  180. data/app/pb_kits/playbook/pb_icon_circle/docs/_playground.json +92 -7
  181. data/app/pb_kits/playbook/pb_icon_circle/docs/_playground.overrides.json +108 -0
  182. data/app/pb_kits/playbook/pb_icon_stat_value/docs/_playground.json +32 -17
  183. data/app/pb_kits/playbook/pb_icon_stat_value/docs/_playground.overrides.json +81 -8
  184. data/app/pb_kits/playbook/pb_icon_value/docs/_playground.json +28 -18
  185. data/app/pb_kits/playbook/pb_icon_value/docs/_playground.overrides.json +58 -9
  186. data/app/pb_kits/playbook/pb_image/docs/_playground.json +124 -47
  187. data/app/pb_kits/playbook/pb_image/docs/_playground.overrides.json +122 -47
  188. data/app/pb_kits/playbook/pb_label_pill/docs/_playground.json +68 -6
  189. data/app/pb_kits/playbook/pb_label_pill/docs/_playground.overrides.json +85 -0
  190. data/app/pb_kits/playbook/pb_label_value/docs/_playground.json +59 -36
  191. data/app/pb_kits/playbook/pb_label_value/docs/_playground.overrides.json +101 -30
  192. data/app/pb_kits/playbook/pb_layout/docs/_playground.json +216 -10
  193. data/app/pb_kits/playbook/pb_layout/docs/_playground.overrides.json +188 -0
  194. data/app/pb_kits/playbook/pb_legend/docs/_playground.json +60 -7
  195. data/app/pb_kits/playbook/pb_legend/docs/_playground.overrides.json +77 -0
  196. data/app/pb_kits/playbook/pb_list/docs/_playground.json +165 -17
  197. data/app/pb_kits/playbook/pb_list/docs/_playground.overrides.json +191 -0
  198. data/app/pb_kits/playbook/pb_loading_inline/_loading_inline.tsx +3 -1
  199. data/app/pb_kits/playbook/pb_loading_inline/docs/_loading_inline_color.html.erb +21 -0
  200. data/app/pb_kits/playbook/pb_loading_inline/docs/_loading_inline_color.jsx +55 -0
  201. data/app/pb_kits/playbook/pb_loading_inline/docs/_loading_inline_color.md +1 -0
  202. data/app/pb_kits/playbook/pb_loading_inline/docs/_playground.json +28 -1
  203. data/app/pb_kits/playbook/pb_loading_inline/docs/_playground.overrides.json +27 -1
  204. data/app/pb_kits/playbook/pb_loading_inline/docs/example.yml +2 -0
  205. data/app/pb_kits/playbook/pb_loading_inline/docs/index.js +1 -0
  206. data/app/pb_kits/playbook/pb_loading_inline/kit.schema.json +18 -2
  207. data/app/pb_kits/playbook/pb_loading_inline/loading_inline.html.erb +1 -1
  208. data/app/pb_kits/playbook/pb_loading_inline/loading_inline.rb +3 -0
  209. data/app/pb_kits/playbook/pb_map/docs/_playground.json +164 -7
  210. data/app/pb_kits/playbook/pb_map/docs/_playground.overrides.json +180 -0
  211. data/app/pb_kits/playbook/pb_message/docs/_playground.json +114 -8
  212. data/app/pb_kits/playbook/pb_message/docs/_playground.overrides.json +144 -0
  213. data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.scss +7 -7
  214. data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.tsx +127 -12
  215. data/app/pb_kits/playbook/pb_multi_level_select/docs/_playground.json +310 -61
  216. data/app/pb_kits/playbook/pb_multi_level_select/docs/_playground.overrides.json +327 -44
  217. data/app/pb_kits/playbook/pb_multiple_users/docs/_playground.json +35 -6
  218. data/app/pb_kits/playbook/pb_multiple_users/docs/_playground.overrides.json +35 -6
  219. data/app/pb_kits/playbook/pb_multiple_users_stacked/docs/_playground.json +32 -21
  220. data/app/pb_kits/playbook/pb_multiple_users_stacked/docs/_playground.overrides.json +32 -21
  221. data/app/pb_kits/playbook/pb_nav/docs/_playground.json +546 -18
  222. data/app/pb_kits/playbook/pb_nav/docs/_playground.overrides.json +561 -14
  223. data/app/pb_kits/playbook/pb_online_status/docs/_playground.json +18 -23
  224. data/app/pb_kits/playbook/pb_online_status/docs/_playground.overrides.json +18 -14
  225. data/app/pb_kits/playbook/pb_overlay/docs/_playground.json +133 -14
  226. data/app/pb_kits/playbook/pb_overlay/docs/_playground.overrides.json +154 -0
  227. data/app/pb_kits/playbook/pb_pagination/docs/_playground.json +35 -14
  228. data/app/pb_kits/playbook/pb_pagination/docs/_playground.overrides.json +35 -14
  229. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_breached.html.erb +1 -1
  230. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_common.html.erb +1 -1
  231. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_meter_settings.html.erb +5 -5
  232. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_strength_change.html.erb +1 -1
  233. data/app/pb_kits/playbook/pb_passphrase/docs/_playground.json +129 -14
  234. data/app/pb_kits/playbook/pb_passphrase/docs/_playground.overrides.json +148 -0
  235. data/app/pb_kits/playbook/pb_passphrase/index.ts +58 -0
  236. data/app/pb_kits/playbook/pb_passphrase/kit.schema.json +13 -0
  237. data/app/pb_kits/playbook/pb_passphrase/passphrase.html.erb +70 -1
  238. data/app/pb_kits/playbook/pb_passphrase/passphrase.rb +70 -0
  239. data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_playground.json +378 -4
  240. data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_playground.overrides.json +245 -0
  241. data/app/pb_kits/playbook/pb_pb_bar_graph/kit.schema.json +1 -1
  242. data/app/pb_kits/playbook/pb_pb_circle_chart/docs/_playground.json +215 -4
  243. data/app/pb_kits/playbook/pb_pb_circle_chart/docs/_playground.overrides.json +224 -0
  244. data/app/pb_kits/playbook/pb_pb_circle_chart/kit.schema.json +1 -1
  245. data/app/pb_kits/playbook/pb_pb_gauge_chart/docs/_playground.json +149 -4
  246. data/app/pb_kits/playbook/pb_pb_gauge_chart/docs/_playground.overrides.json +162 -0
  247. data/app/pb_kits/playbook/pb_pb_gauge_chart/kit.schema.json +1 -1
  248. data/app/pb_kits/playbook/pb_pb_line_graph/docs/_playground.json +392 -4
  249. data/app/pb_kits/playbook/pb_pb_line_graph/docs/_playground.overrides.json +212 -0
  250. data/app/pb_kits/playbook/pb_pb_line_graph/kit.schema.json +1 -1
  251. data/app/pb_kits/playbook/pb_person/docs/_playground.json +27 -11
  252. data/app/pb_kits/playbook/pb_person/docs/_playground.overrides.json +34 -9
  253. data/app/pb_kits/playbook/pb_person_contact/docs/_playground.json +72 -21
  254. data/app/pb_kits/playbook/pb_person_contact/docs/_playground.overrides.json +71 -21
  255. data/app/pb_kits/playbook/pb_phone_number_input/docs/_playground.json +179 -21
  256. data/app/pb_kits/playbook/pb_phone_number_input/docs/_playground.overrides.json +180 -0
  257. data/app/pb_kits/playbook/pb_phone_number_input/kit.schema.json +2 -2
  258. data/app/pb_kits/playbook/pb_pill/docs/_playground.json +16 -49
  259. data/app/pb_kits/playbook/pb_pill/docs/_playground.overrides.json +33 -30
  260. data/app/pb_kits/playbook/pb_popover/_popover.scss +27 -0
  261. data/app/pb_kits/playbook/pb_popover/_popover.tsx +49 -16
  262. data/app/pb_kits/playbook/pb_popover/docs/_playground.json +155 -46
  263. data/app/pb_kits/playbook/pb_popover/docs/_playground.overrides.json +162 -30
  264. data/app/pb_kits/playbook/pb_popover/docs/_popover_list.jsx +9 -11
  265. data/app/pb_kits/playbook/pb_popover/index.ts +35 -4
  266. data/app/pb_kits/playbook/pb_popover/popover.html.erb +5 -2
  267. data/app/pb_kits/playbook/pb_popover/popover.test.js +212 -5
  268. data/app/pb_kits/playbook/pb_progress_pills/docs/_playground.json +26 -13
  269. data/app/pb_kits/playbook/pb_progress_pills/docs/_playground.overrides.json +24 -6
  270. data/app/pb_kits/playbook/pb_progress_simple/docs/_playground.json +50 -17
  271. data/app/pb_kits/playbook/pb_progress_simple/docs/_playground.overrides.json +41 -7
  272. data/app/pb_kits/playbook/pb_progress_step/docs/_playground.json +197 -10
  273. data/app/pb_kits/playbook/pb_progress_step/docs/_playground.overrides.json +189 -0
  274. data/app/pb_kits/playbook/pb_radio/docs/_playground.json +80 -6
  275. data/app/pb_kits/playbook/pb_radio/docs/_playground.overrides.json +82 -3
  276. data/app/pb_kits/playbook/pb_radio/kit.schema.json +1 -1
  277. data/app/pb_kits/playbook/pb_rich_text_editor/TipTap/ToolbarDropdown.tsx +12 -24
  278. data/app/pb_kits/playbook/pb_rich_text_editor/docs/_playground.json +152 -22
  279. data/app/pb_kits/playbook/pb_rich_text_editor/docs/_playground.overrides.json +153 -0
  280. data/app/pb_kits/playbook/pb_select/_select.tsx +1 -0
  281. data/app/pb_kits/playbook/pb_select/docs/_playground.json +65 -19
  282. data/app/pb_kits/playbook/pb_select/docs/_playground.overrides.json +54 -14
  283. data/app/pb_kits/playbook/pb_select/kit.schema.json +2 -2
  284. data/app/pb_kits/playbook/pb_select/select.html.erb +1 -1
  285. data/app/pb_kits/playbook/pb_selectable_card/docs/_playground.json +75 -82
  286. data/app/pb_kits/playbook/pb_selectable_card/docs/_playground.overrides.json +76 -76
  287. data/app/pb_kits/playbook/pb_selectable_card/kit.schema.json +2 -2
  288. data/app/pb_kits/playbook/pb_selectable_card_icon/docs/_playground.json +105 -15
  289. data/app/pb_kits/playbook/pb_selectable_card_icon/docs/_playground.overrides.json +106 -0
  290. data/app/pb_kits/playbook/pb_selectable_card_icon/kit.schema.json +2 -2
  291. data/app/pb_kits/playbook/pb_selectable_icon/docs/_playground.json +37 -21
  292. data/app/pb_kits/playbook/pb_selectable_icon/docs/_playground.overrides.json +35 -18
  293. data/app/pb_kits/playbook/pb_selectable_icon/kit.schema.json +1 -1
  294. data/app/pb_kits/playbook/pb_selectable_list/docs/_playground.json +174 -12
  295. data/app/pb_kits/playbook/pb_selectable_list/docs/_playground.overrides.json +162 -10
  296. data/app/pb_kits/playbook/pb_skeleton_loading/docs/_playground.json +68 -6
  297. data/app/pb_kits/playbook/pb_skeleton_loading/docs/_playground.overrides.json +80 -0
  298. data/app/pb_kits/playbook/pb_source/docs/_playground.json +67 -6
  299. data/app/pb_kits/playbook/pb_source/docs/_playground.overrides.json +80 -0
  300. data/app/pb_kits/playbook/pb_star_rating/docs/_playground.json +28 -53
  301. data/app/pb_kits/playbook/pb_star_rating/docs/_playground.overrides.json +33 -32
  302. data/app/pb_kits/playbook/pb_star_rating/kit.schema.json +1 -1
  303. data/app/pb_kits/playbook/pb_stat_change/docs/_playground.json +15 -9
  304. data/app/pb_kits/playbook/pb_stat_change/docs/_playground.overrides.json +15 -5
  305. data/app/pb_kits/playbook/pb_stat_value/docs/_playground.json +19 -9
  306. data/app/pb_kits/playbook/pb_stat_value/docs/_playground.overrides.json +18 -7
  307. data/app/pb_kits/playbook/pb_stat_value/kit.schema.json +1 -1
  308. data/app/pb_kits/playbook/pb_table/docs/_playground.json +223 -21
  309. data/app/pb_kits/playbook/pb_table/docs/_playground.overrides.json +176 -0
  310. data/app/pb_kits/playbook/pb_text_input/docs/_playground.json +44 -5
  311. data/app/pb_kits/playbook/pb_text_input/docs/_playground.overrides.json +39 -3
  312. data/app/pb_kits/playbook/pb_text_input/kit.schema.json +3 -3
  313. data/app/pb_kits/playbook/pb_textarea/docs/_playground.json +35 -3
  314. data/app/pb_kits/playbook/pb_textarea/docs/_playground.overrides.json +28 -3
  315. data/app/pb_kits/playbook/pb_textarea/kit.schema.json +1 -1
  316. data/app/pb_kits/playbook/pb_time/docs/_playground.json +28 -14
  317. data/app/pb_kits/playbook/pb_time/docs/_playground.overrides.json +26 -13
  318. data/app/pb_kits/playbook/pb_time_picker/_time_picker.scss +42 -0
  319. data/app/pb_kits/playbook/pb_time_picker/_time_picker.tsx +309 -167
  320. data/app/pb_kits/playbook/pb_time_picker/docs/_playground.json +36 -30
  321. data/app/pb_kits/playbook/pb_time_picker/docs/_playground.overrides.json +31 -26
  322. data/app/pb_kits/playbook/pb_time_picker/index.ts +263 -11
  323. data/app/pb_kits/playbook/pb_time_range_inline/docs/_playground.json +63 -9
  324. data/app/pb_kits/playbook/pb_time_range_inline/docs/_playground.overrides.json +69 -0
  325. data/app/pb_kits/playbook/pb_time_stacked/docs/_playground.json +30 -9
  326. data/app/pb_kits/playbook/pb_time_stacked/docs/_playground.overrides.json +30 -9
  327. data/app/pb_kits/playbook/pb_timeline/docs/_playground.json +178 -6
  328. data/app/pb_kits/playbook/pb_timeline/docs/_playground.overrides.json +165 -0
  329. data/app/pb_kits/playbook/pb_timestamp/docs/_playground.json +36 -21
  330. data/app/pb_kits/playbook/pb_timestamp/docs/_playground.overrides.json +35 -20
  331. data/app/pb_kits/playbook/pb_toggle/docs/_playground.json +24 -13
  332. data/app/pb_kits/playbook/pb_toggle/docs/_playground.overrides.json +20 -12
  333. data/app/pb_kits/playbook/pb_toggle/kit.schema.json +2 -2
  334. data/app/pb_kits/playbook/pb_tooltip/docs/_playground.json +42 -23
  335. data/app/pb_kits/playbook/pb_tooltip/docs/_playground.overrides.json +35 -15
  336. data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +109 -3
  337. data/app/pb_kits/playbook/pb_typeahead/docs/_playground.json +124 -44
  338. data/app/pb_kits/playbook/pb_typeahead/docs/_playground.overrides.json +98 -31
  339. data/app/pb_kits/playbook/pb_typeahead/kit.schema.json +8 -2
  340. data/app/pb_kits/playbook/pb_user/docs/_playground.json +33 -15
  341. data/app/pb_kits/playbook/pb_user/docs/_playground.overrides.json +32 -15
  342. data/app/pb_kits/playbook/pb_user_badge/docs/_playground.json +26 -12
  343. data/app/pb_kits/playbook/pb_user_badge/docs/_playground.overrides.json +26 -9
  344. data/app/pb_kits/playbook/pb_weekday_stacked/docs/_playground.json +32 -5
  345. data/app/pb_kits/playbook/pb_weekday_stacked/docs/_playground.overrides.json +30 -4
  346. data/app/pb_kits/playbook/tokens/_colors.scss +5 -1
  347. data/app/pb_kits/playbook/utilities/_border.scss +262 -0
  348. data/app/pb_kits/playbook/utilities/floatingPortalHosts.ts +565 -0
  349. data/app/pb_kits/playbook/utilities/global-props.schema.json +98 -0
  350. data/app/pb_kits/playbook/utilities/globalProps.ts +83 -1
  351. data/app/pb_kits/playbook/utilities/icons/allicons.tsx +38 -0
  352. data/app/pb_kits/playbook/utilities/test/globalProps/border.test.js +66 -0
  353. data/dist/chunks/{_pb_line_graph-B870s9g1.js → _pb_line_graph-C2H9vs_8.js} +1 -1
  354. data/dist/chunks/_typeahead-Du8dRYaM.js +5 -0
  355. data/dist/chunks/globalProps-DIAZ03-L.js +6 -0
  356. data/dist/chunks/lib-ZHDedNfP.js +29 -0
  357. data/dist/chunks/time_picker_helper-CVMV9ync.js +1 -0
  358. data/dist/chunks/vendor.js +5 -5
  359. data/dist/menu.yml +7 -0
  360. data/dist/playbook-rails-react-bindings.js +1 -1
  361. data/dist/playbook-rails.js +1 -1
  362. data/dist/playbook.css +1 -1
  363. data/lib/playbook/border.rb +87 -0
  364. data/lib/playbook/classnames.rb +1 -0
  365. data/lib/playbook/forms/builder/form_field_builder.rb +2 -0
  366. data/lib/playbook/kit_base.rb +2 -0
  367. data/lib/playbook/pb_forms_global_props_helper.rb +15 -0
  368. data/lib/playbook/version.rb +2 -2
  369. metadata +93 -9
  370. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_fullscreen.jsx +0 -92
  371. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_fullscreen.md +0 -3
  372. data/dist/chunks/_typeahead-jMN-A0_C.js +0 -5
  373. data/dist/chunks/globalProps-BInmh-C7.js +0 -6
  374. data/dist/chunks/lib-CVYIIiwI.js +0 -29
  375. data/dist/chunks/time_picker_helper-Bx8nzyM8.js +0 -1
@@ -1,4 +1,5 @@
1
1
  {
2
+ "hiddenProps": ["inputOptions", "onChange"],
2
3
  "groups": [
3
4
  {
4
5
  "name": "Content",
@@ -6,7 +7,7 @@
6
7
  },
7
8
  {
8
9
  "name": "State",
9
- "props": ["disabled", "checked"]
10
+ "props": ["checked", "disabled"]
10
11
  },
11
12
  {
12
13
  "name": "Appearance",
@@ -22,7 +23,7 @@
22
23
  }
23
24
  },
24
25
  {
25
- "name": "With Error",
26
+ "name": "Checked",
26
27
  "props": {
27
28
  "name": "dark_mode",
28
29
  "value": "theme",
@@ -37,17 +38,24 @@
37
38
  "checked": true,
38
39
  "disabled": true
39
40
  }
40
- },
41
- {
42
- "name": "Required",
43
- "props": {
44
- "name": "notifications",
45
- "value": "push",
46
- "size": "md",
47
- "checked": true
48
- }
49
41
  }
50
42
  ],
51
43
  "conditionals": {},
52
- "hints": {}
44
+ "hints": {
45
+ "default": {
46
+ "presetName": "Default",
47
+ "message": "Default renders an unchecked small toggle with name and value for forms.",
48
+ "type": "info"
49
+ },
50
+ "checked": {
51
+ "presetName": "Checked",
52
+ "message": "Checked initializes the toggle in the on state.",
53
+ "type": "info"
54
+ },
55
+ "disabled": {
56
+ "presetName": "Disabled",
57
+ "message": "Disabled keeps the selected state visible while preventing changes.",
58
+ "type": "info"
59
+ }
60
+ }
53
61
  }
@@ -31,7 +31,7 @@
31
31
  ]
32
32
  },
33
33
  "onChange": {
34
- "type": "ReactNode",
34
+ "type": "function",
35
35
  "platforms": [
36
36
  "react"
37
37
  ]
@@ -59,7 +59,7 @@
59
59
  "platforms": [
60
60
  "rails"
61
61
  ],
62
- "type": "string"
62
+ "type": "GenericObject"
63
63
  }
64
64
  },
65
65
  "globalProps": true,
@@ -31,7 +31,19 @@
31
31
  "name": "Appearance",
32
32
  "props": [
33
33
  "showTooltip",
34
- "forceOpenTooltip"
34
+ "forceOpenTooltip",
35
+ "position"
36
+ ]
37
+ },
38
+ {
39
+ "name": "Sizing",
40
+ "props": [
41
+ "width",
42
+ "minWidth",
43
+ "maxWidth",
44
+ "height",
45
+ "minHeight",
46
+ "maxHeight"
35
47
  ]
36
48
  }
37
49
  ],
@@ -45,47 +57,54 @@
45
57
  "children": "Hover me"
46
58
  },
47
59
  {
48
- "name": "Bottom",
49
- "props": {
50
- "placement": "bottom",
51
- "text": "Tooltip on bottom"
52
- },
53
- "children": "Hover me"
54
- },
55
- {
56
- "name": "Left",
57
- "props": {
58
- "placement": "left",
59
- "text": "Tooltip on the left"
60
- },
61
- "children": "Hover me"
62
- },
63
- {
64
- "name": "Right",
60
+ "name": "With Icon",
65
61
  "props": {
62
+ "icon": "info-circle",
66
63
  "placement": "right",
67
- "text": "Tooltip on the right"
64
+ "text": "Tooltip with an icon"
68
65
  },
69
66
  "children": "Hover me"
70
67
  },
71
68
  {
72
- "name": "Click to open",
69
+ "name": "Click to Open",
73
70
  "props": {
74
71
  "placement": "top",
75
72
  "useClickToOpen": true,
76
73
  "text": "Click toggles this tooltip"
77
74
  },
78
75
  "children": "Click me"
76
+ },
77
+ {
78
+ "name": "Forced Open",
79
+ "props": {
80
+ "forceOpenTooltip": true,
81
+ "placement": "bottom",
82
+ "text": "Forced open for demos"
83
+ },
84
+ "children": "Always visible"
79
85
  }
80
86
  ],
81
87
  "conditionals": {},
82
88
  "hints": {
89
+ "top": {
90
+ "presetName": "Top",
91
+ "message": "Top uses the default hover behavior with the tooltip above the trigger.",
92
+ "type": "info"
93
+ },
94
+ "with_icon": {
95
+ "presetName": "With Icon",
96
+ "message": "With Icon adds an icon inside the tooltip content.",
97
+ "type": "info"
98
+ },
83
99
  "click_to_open": {
84
- "when": {
85
- "useClickToOpen": true
86
- },
100
+ "presetName": "Click to Open",
87
101
  "message": "When click to open is on, the tooltip toggles on click instead of hover.",
88
102
  "type": "info"
103
+ },
104
+ "forced_open": {
105
+ "presetName": "Forced Open",
106
+ "message": "Forced Open keeps the tooltip visible, which is useful for demos and visual checks.",
107
+ "type": "info"
89
108
  }
90
109
  }
91
110
  }
@@ -1,5 +1,6 @@
1
1
  {
2
2
  "children": {
3
+ "editable": true,
3
4
  "default": "Hover me",
4
5
  "hideWhenPropSet": []
5
6
  },
@@ -9,7 +10,8 @@
9
10
  "name": "Behavior",
10
11
  "props": ["placement", "useClickToOpen", "interaction", "delay"]
11
12
  },
12
- { "name": "Appearance", "props": ["showTooltip", "forceOpenTooltip"] }
13
+ { "name": "Appearance", "props": ["showTooltip", "forceOpenTooltip", "position"] },
14
+ { "name": "Sizing", "props": ["width", "minWidth", "maxWidth", "height", "minHeight", "maxHeight"] }
13
15
  ],
14
16
  "presets": [
15
17
  {
@@ -18,36 +20,54 @@
18
20
  "children": "Hover me"
19
21
  },
20
22
  {
21
- "name": "Bottom",
22
- "props": { "placement": "bottom", "text": "Tooltip on bottom" },
23
- "children": "Hover me"
24
- },
25
- {
26
- "name": "Left",
27
- "props": { "placement": "left", "text": "Tooltip on the left" },
28
- "children": "Hover me"
29
- },
30
- {
31
- "name": "Right",
32
- "props": { "placement": "right", "text": "Tooltip on the right" },
23
+ "name": "With Icon",
24
+ "props": {
25
+ "icon": "info-circle",
26
+ "placement": "right",
27
+ "text": "Tooltip with an icon"
28
+ },
33
29
  "children": "Hover me"
34
30
  },
35
31
  {
36
- "name": "Click to open",
32
+ "name": "Click to Open",
37
33
  "props": {
38
34
  "placement": "top",
39
35
  "useClickToOpen": true,
40
36
  "text": "Click toggles this tooltip"
41
37
  },
42
38
  "children": "Click me"
39
+ },
40
+ {
41
+ "name": "Forced Open",
42
+ "props": {
43
+ "forceOpenTooltip": true,
44
+ "placement": "bottom",
45
+ "text": "Forced open for demos"
46
+ },
47
+ "children": "Always visible"
43
48
  }
44
49
  ],
45
50
  "conditionals": {},
46
51
  "hints": {
52
+ "top": {
53
+ "presetName": "Top",
54
+ "message": "Top uses the default hover behavior with the tooltip above the trigger.",
55
+ "type": "info"
56
+ },
57
+ "with_icon": {
58
+ "presetName": "With Icon",
59
+ "message": "With Icon adds an icon inside the tooltip content.",
60
+ "type": "info"
61
+ },
47
62
  "click_to_open": {
48
- "when": { "useClickToOpen": true },
63
+ "presetName": "Click to Open",
49
64
  "message": "When click to open is on, the tooltip toggles on click instead of hover.",
50
65
  "type": "info"
66
+ },
67
+ "forced_open": {
68
+ "presetName": "Forced Open",
69
+ "message": "Forced Open keeps the tooltip visible, which is useful for demos and visual checks.",
70
+ "type": "info"
51
71
  }
52
72
  }
53
73
  }
@@ -1,5 +1,5 @@
1
- import React, {useState, useEffect, forwardRef, useRef} from "react"
2
- import Select from "react-select"
1
+ import React, {useState, useEffect, useLayoutEffect, useMemo, useCallback, forwardRef, useRef, useContext} from "react"
2
+ import Select, {components as selectComponents, mergeStyles} from "react-select"
3
3
  import AsyncSelect from "react-select/async"
4
4
  import CreateableSelect from "react-select/creatable"
5
5
  import AsyncCreateableSelect from "react-select/async-creatable"
@@ -22,8 +22,18 @@ import {
22
22
  import * as kitComponents from "./components"
23
23
 
24
24
  import {noop, buildDataProps, buildHtmlProps} from "../utilities/props"
25
+ import {
26
+ PB_FLOATING_OWNER_ATTR,
27
+ kitRequiresPortaledFloatingUi,
28
+ resolveFloatingOwnerId,
29
+ resolvePortaledFloatingZIndex,
30
+ resolvePortaledKitHost,
31
+ } from "../utilities/floatingPortalHosts"
32
+ import {DialogContext} from "../pb_dialog/_dialog_context"
25
33
  import {GenericObject, Noop} from "../types"
26
34
 
35
+ type TypeaheadStylesConfig = Parameters<typeof mergeStyles>[0]
36
+
27
37
  /**
28
38
  * @typedef {object} Props
29
39
  * @prop {boolean} async - whether Typeahead should fetch data from
@@ -82,6 +92,8 @@ type TypeaheadProps = {
82
92
  searchContextSelector?: string
83
93
  clearOnContextChange?: boolean
84
94
  preserveSearchInput?: boolean
95
+ // Passed through to react-select; merged when menu is portaled to `document.body`.
96
+ styles?: TypeaheadStylesConfig
85
97
  } & GlobalProps
86
98
 
87
99
  export type SelectValueType = {
@@ -129,6 +141,7 @@ const Typeahead = forwardRef<HTMLInputElement, TypeaheadProps>(
129
141
  validation,
130
142
  clearOnContextChange = false,
131
143
  preserveSearchInput = false, // Default to false to maintain backward compatibility
144
+ styles: stylesProp,
132
145
  ...props
133
146
  }: TypeaheadProps) => {
134
147
  // State to manage the input value when preserveSearchInput is true
@@ -197,6 +210,70 @@ const Typeahead = forwardRef<HTMLInputElement, TypeaheadProps>(
197
210
  // Create a ref to access React Select instance
198
211
  const selectRef = useRef<any>(null)
199
212
 
213
+ const dialogCtx = useContext(DialogContext)
214
+
215
+ const kitContainerRef = useRef<HTMLDivElement>(null)
216
+ const [menuPortalHost, setMenuPortalHost] = useState<HTMLElement | null>(
217
+ null,
218
+ )
219
+ const [floatingOwnerId, setFloatingOwnerId] = useState<string | null>(null)
220
+ const [menuIsOpen, setMenuIsOpen] = useState(false)
221
+
222
+ const resolveMenuPortalConfig = useCallback(() => {
223
+ const el = kitContainerRef.current
224
+ setFloatingOwnerId(resolveFloatingOwnerId(el))
225
+ setMenuPortalHost(
226
+ resolvePortaledKitHost(
227
+ el,
228
+ dialogCtx?.selectMenuPortalTarget ?? null,
229
+ ),
230
+ )
231
+ }, [dialogCtx?.selectMenuPortalTarget])
232
+
233
+ useLayoutEffect(() => {
234
+ if (!menuIsOpen) {
235
+ setFloatingOwnerId(null)
236
+ setMenuPortalHost(null)
237
+ return
238
+ }
239
+ resolveMenuPortalConfig()
240
+ }, [menuIsOpen, resolveMenuPortalConfig])
241
+
242
+ const MenuPortalWithOwner = useMemo(
243
+ () =>
244
+ function TypeaheadMenuPortal(
245
+ portalProps: React.ComponentProps<typeof selectComponents.MenuPortal>,
246
+ ) {
247
+ return (
248
+ <selectComponents.MenuPortal
249
+ {...portalProps}
250
+ innerProps={{
251
+ ...portalProps.innerProps,
252
+ ...(floatingOwnerId
253
+ ? {[PB_FLOATING_OWNER_ATTR]: floatingOwnerId}
254
+ : {}),
255
+ }}
256
+ />
257
+ )
258
+ },
259
+ [floatingOwnerId],
260
+ )
261
+
262
+ const mergedSelectStyles = useMemo(() => {
263
+ if (menuPortalHost !== document.body) return stylesProp
264
+ const zIndex = Number(resolvePortaledFloatingZIndex(document.body))
265
+ return mergeStyles(stylesProp ?? {}, {
266
+ menuPortal: (base: Record<string, unknown>) => ({
267
+ ...base,
268
+ zIndex,
269
+ }),
270
+ menu: (base: Record<string, unknown>) => ({
271
+ ...base,
272
+ zIndex,
273
+ }),
274
+ } as TypeaheadStylesConfig)
275
+ }, [menuPortalHost, stylesProp])
276
+
200
277
  // Helper function to flatten grouped options if custom groups are used
201
278
  const flattenOptions = (options: any[]): any[] => {
202
279
  if (!options) return []
@@ -209,8 +286,21 @@ const Typeahead = forwardRef<HTMLInputElement, TypeaheadProps>(
209
286
  }, [])
210
287
  }
211
288
 
289
+ const handleMenuClose = () => {
290
+ setMenuIsOpen(false)
291
+ setMenuPortalHost(null)
292
+ setFloatingOwnerId(null)
293
+ if (props.onMenuClose) {
294
+ props.onMenuClose()
295
+ }
296
+ }
297
+
212
298
  // Configure focus on selected option using React Select's API
213
299
  const handleMenuOpen = () => {
300
+ if (kitRequiresPortaledFloatingUi(kitContainerRef.current)) {
301
+ resolveMenuPortalConfig()
302
+ setMenuIsOpen(true)
303
+ }
214
304
  setTimeout(() => {
215
305
  let currentValue = props.value || props.defaultValue
216
306
 
@@ -372,6 +462,7 @@ const resolvedLoadOptions =
372
462
  Option,
373
463
  Placeholder,
374
464
  ValueContainer,
465
+ ...(menuPortalHost ? {MenuPortal: MenuPortalWithOwner} : {}),
375
466
  ...components,
376
467
  },
377
468
  loadOptions: wrappedLoadOptions,
@@ -399,10 +490,24 @@ const resolvedLoadOptions =
399
490
  ...(preserveSearchInput ? {inputValue} : {}),
400
491
  onInputChange: handleInputChange,
401
492
  onBlur: handleBlur,
402
- onMenuOpen: handleMenuOpen,
403
493
  required,
404
494
  requiredIndicator: requiredIndicator,
405
495
  ...props,
496
+ onMenuClose: () => {
497
+ handleMenuClose()
498
+ props.onMenuClose?.()
499
+ },
500
+ onMenuOpen: () => {
501
+ handleMenuOpen()
502
+ props.onMenuOpen?.()
503
+ },
504
+ ...(menuPortalHost
505
+ ? {
506
+ menuPortalTarget: menuPortalHost,
507
+ menuPosition: "fixed" as const,
508
+ }
509
+ : {}),
510
+ styles: mergedSelectStyles,
406
511
  }
407
512
 
408
513
  const [contextValue, setContextValue] = useState("")
@@ -579,6 +684,7 @@ const resolvedLoadOptions =
579
684
 
580
685
  return (
581
686
  <div
687
+ ref={kitContainerRef}
582
688
  {...dataProps}
583
689
  {...htmlProps}
584
690
  aria-busy={asyncLoading ? "true" : "false"}
@@ -18,7 +18,9 @@
18
18
  "props": [
19
19
  "label",
20
20
  "name",
21
- "options"
21
+ "options",
22
+ "inputDisplay",
23
+ "isMulti"
22
24
  ]
23
25
  },
24
26
  {
@@ -32,31 +34,32 @@
32
34
  ]
33
35
  },
34
36
  {
35
- "name": "Appearance",
36
- "props": [
37
- "inputDisplay"
38
- ]
39
- },
40
- {
41
- "name": "Async & data",
37
+ "name": "Async & Data",
42
38
  "props": [
43
39
  "async",
44
- "createable",
45
40
  "loadOptions",
46
41
  "getOptionLabel",
47
42
  "getOptionValue",
48
43
  "optionsByContext",
49
44
  "searchContextSelector",
50
- "clearOnContextChange",
51
- "preserveSearchInput"
45
+ "clearOnContextChange"
52
46
  ]
53
47
  },
54
48
  {
55
- "name": "Advanced",
49
+ "name": "Behavior",
56
50
  "props": [
57
- "components",
51
+ "createable",
52
+ "preserveSearchInput",
58
53
  "onChange"
59
54
  ]
55
+ },
56
+ {
57
+ "name": "Appearance",
58
+ "props": [
59
+ "components",
60
+ "dark",
61
+ "marginBottom"
62
+ ]
60
63
  }
61
64
  ],
62
65
  "presets": [
@@ -64,6 +67,7 @@
64
67
  "name": "Basic list",
65
68
  "props": {
66
69
  "label": "Colors",
70
+ "name": "color",
67
71
  "options": [
68
72
  {
69
73
  "label": "Orange",
@@ -85,10 +89,12 @@
85
89
  }
86
90
  },
87
91
  {
88
- "name": "Pills display",
92
+ "name": "Count display",
89
93
  "props": {
90
94
  "label": "Tags",
91
- "inputDisplay": "pills",
95
+ "name": "tags",
96
+ "inputDisplay": "none",
97
+ "isMulti": true,
92
98
  "options": [
93
99
  {
94
100
  "label": "Design",
@@ -106,57 +112,75 @@
106
112
  }
107
113
  },
108
114
  {
109
- "name": "Plain input",
115
+ "name": "Required validation",
110
116
  "props": {
111
- "label": "Team",
112
- "inputDisplay": "none",
117
+ "label": "Assignee",
118
+ "name": "assignee",
119
+ "required": true,
120
+ "requiredIndicator": true,
121
+ "validation": {
122
+ "message": "Choose an assignee."
123
+ },
124
+ "error": "Selection is required.",
113
125
  "options": [
114
126
  {
115
- "label": "North",
116
- "value": "north"
127
+ "label": "Ada",
128
+ "value": "ada"
117
129
  },
118
130
  {
119
- "label": "South",
120
- "value": "south"
131
+ "label": "Grace",
132
+ "value": "grace"
121
133
  }
122
134
  ]
123
135
  }
124
136
  },
125
137
  {
126
- "name": "Disabled",
138
+ "name": "Async users",
139
+ "structureMode": "advanced",
127
140
  "props": {
128
- "label": "Read only",
129
- "disabled": true,
130
- "options": [
131
- {
132
- "label": "Only option",
133
- "value": "one"
134
- }
135
- ]
141
+ "async": true,
142
+ "label": "Users",
143
+ "name": "users",
144
+ "loadOptions": "playgroundTypeahead.loadOptions",
145
+ "getOptionLabel": "playgroundTypeahead.getOptionLabel",
146
+ "getOptionValue": "playgroundTypeahead.getOptionValue",
147
+ "options": []
136
148
  }
137
149
  },
138
150
  {
139
- "name": "With error",
151
+ "name": "Custom menu",
152
+ "structureMode": "advanced",
140
153
  "props": {
141
- "label": "Assignee",
142
- "error": "Selection is required.",
154
+ "label": "Colors",
155
+ "name": "custom_menu",
156
+ "components": {
157
+ "__playgroundCode": "{ MenuList }"
158
+ },
159
+ "marginBottom": "none",
143
160
  "options": [
144
161
  {
145
- "label": "Ada",
146
- "value": "ada"
162
+ "label": "Orange",
163
+ "value": "#FFA500"
147
164
  },
148
165
  {
149
- "label": "Grace",
150
- "value": "grace"
166
+ "label": "Red",
167
+ "value": "#FF0000"
168
+ },
169
+ {
170
+ "label": "Green",
171
+ "value": "#00FF00"
151
172
  }
152
173
  ]
153
174
  }
154
175
  },
155
176
  {
156
- "name": "Creatable",
177
+ "name": "Creatable handler",
157
178
  "props": {
158
179
  "label": "Add labels",
180
+ "name": "labels",
159
181
  "createable": true,
182
+ "preserveSearchInput": true,
183
+ "onChange": "(selected) => console.log(selected)",
160
184
  "options": [
161
185
  {
162
186
  "label": "Bug",
@@ -186,6 +210,14 @@
186
210
  "async": true
187
211
  }
188
212
  },
213
+ "requiredIndicator": {
214
+ "requires": "label"
215
+ },
216
+ "validation": {
217
+ "requires": {
218
+ "required": true
219
+ }
220
+ },
189
221
  "optionsByContext": {
190
222
  "requires": "searchContextSelector"
191
223
  },
@@ -194,12 +226,60 @@
194
226
  }
195
227
  },
196
228
  "hints": {
197
- "async_options": {
198
- "when": {
199
- "async": true
200
- },
201
- "message": "Async mode expects loadOptions to return option objects with label and value.",
229
+ "basic_list": {
230
+ "presetName": "Basic list",
231
+ "message": "Basic list uses a local options array with label and value keys.",
202
232
  "type": "info"
233
+ },
234
+ "count_display": {
235
+ "presetName": "Count display",
236
+ "message": "Count display uses multi-select with inputDisplay set to none so selected values render as a count.",
237
+ "type": "info"
238
+ },
239
+ "required_validation": {
240
+ "presetName": "Required validation",
241
+ "message": "Required validation pairs required, requiredIndicator, validation, and error copy.",
242
+ "type": "info"
243
+ },
244
+ "async_users": {
245
+ "presetName": "Async users",
246
+ "message": "Async users demonstrates loadOptions plus custom option label/value resolvers.",
247
+ "type": "info"
248
+ },
249
+ "custom_menu": {
250
+ "presetName": "Custom menu",
251
+ "message": "Custom menu passes a components map to replace Typeahead.MenuList content.",
252
+ "type": "info"
253
+ },
254
+ "creatable_handler": {
255
+ "presetName": "Creatable handler",
256
+ "message": "Creatable handler shows custom option creation, preserved search input, and an onChange handler.",
257
+ "type": "info"
258
+ }
259
+ },
260
+ "customProps": {
261
+ "isMulti": {
262
+ "type": "boolean",
263
+ "platforms": [
264
+ "react"
265
+ ],
266
+ "default": false
267
+ }
268
+ },
269
+ "structureModes": {
270
+ "default": "standard",
271
+ "modes": {
272
+ "standard": {
273
+ "label": "Standard",
274
+ "template": "<Typeahead{{props}} />",
275
+ "children": ""
276
+ },
277
+ "advanced": {
278
+ "label": "Advanced setup",
279
+ "template": "<Typeahead{{props}} />",
280
+ "children": "",
281
+ "wrapper": "const playgroundTypeaheadOptions = [\n { name: \"Ada Lovelace\", id: \"ada\" },\n { name: \"Grace Hopper\", id: \"grace\" },\n { name: \"Katherine Johnson\", id: \"katherine\" },\n { name: \"Margaret Hamilton\", id: \"margaret\" },\n]\n\nconst playgroundTypeahead = {\n loadOptions: (inputValue) => new Promise((resolve) => {\n const search = inputValue.toLowerCase()\n window.setTimeout(() => {\n resolve(playgroundTypeaheadOptions.filter((option) => option.name.toLowerCase().includes(search)))\n }, 250)\n }),\n getOptionLabel: (option) => option.name || option.label,\n getOptionValue: (option) => String(option.id || option.value),\n}\n\nif (typeof window !== \"undefined\") {\n window.playgroundTypeahead = playgroundTypeahead\n}\n\nconst MenuList = (props) => (\n <Typeahead.MenuList\n {...props}\n footer={<Button margin=\"sm\" text=\"Custom footer\" />}\n />\n)\n\nconst TypeaheadPlaygroundExample = () => (\n {{component}}\n)\n\n<TypeaheadPlaygroundExample />"
282
+ }
203
283
  }
204
284
  }
205
285
  }