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,12 @@
1
- import React, { useState, useEffect, useRef, useMemo } from 'react'
1
+ import React, {
2
+ useState,
3
+ useEffect,
4
+ useLayoutEffect,
5
+ useRef,
6
+ useMemo,
7
+ useContext,
8
+ } from 'react'
9
+ import { createPortal } from 'react-dom'
2
10
  import classnames from 'classnames'
3
11
  import { buildAriaProps, buildCss, buildDataProps, buildHtmlProps } from '../utilities/props'
4
12
  import { globalProps, GlobalProps } from '../utilities/globalProps'
@@ -6,6 +14,18 @@ import Caption from '../pb_caption/_caption'
6
14
  import SelectableCard from '../pb_selectable_card/_selectable_card'
7
15
  import TextInput from '../pb_text_input/_text_input'
8
16
  import colors from '../tokens/exports/_colors.module.scss'
17
+ import { DialogContext } from '../pb_dialog/_dialog_context'
18
+ import {
19
+ announceFloatingKitOpen,
20
+ nextPortaledFloatingZIndex,
21
+ positionDropdownPortalToWrapper,
22
+ resolveFloatingOwnerId,
23
+ resolvePortaledFloatingZIndex,
24
+ resolvePortaledKitHost,
25
+ setFloatingOwnerAttribute,
26
+ subscribeFloatingKitOpen,
27
+ subscribeFloatingKitReposition,
28
+ } from '../utilities/floatingPortalHosts'
9
29
 
10
30
  import {
11
31
  parseTime,
@@ -91,6 +111,10 @@ const TimePicker = (props: TimePickerProps): JSX.Element => {
91
111
 
92
112
  const fieldName = name || `${uniqueId}-time`
93
113
 
114
+ const dialogCtx = useContext(DialogContext)
115
+ const timePickerPanelPortalRef = useRef<HTMLDivElement | null>(null)
116
+ const triggerWrapperRef = useRef<HTMLDivElement | null>(null)
117
+
94
118
  useEffect(() => {
95
119
  const handleInvalid = (event: Event) => {
96
120
  const target = event.target as HTMLInputElement
@@ -181,6 +205,7 @@ const TimePicker = (props: TimePickerProps): JSX.Element => {
181
205
  const amInputRef = useRef<HTMLInputElement | null>(null)
182
206
  const pmInputRef = useRef<HTMLInputElement | null>(null)
183
207
  const timePickerWrapperRef = useRef<HTMLDivElement>(null)
208
+ const activePortalZIndexRef = useRef<string | undefined>()
184
209
  const hourDropdownRef = useRef<HTMLDivElement>(null)
185
210
  const minuteDropdownRef = useRef<HTMLDivElement>(null)
186
211
  const [showDropdown, setShowDropdown] = useState(false)
@@ -657,16 +682,44 @@ const TimePicker = (props: TimePickerProps): JSX.Element => {
657
682
  }, [showDropdown, timeFormat, uniqueId, meridiem])
658
683
 
659
684
  useEffect(() => {
660
- const handleClickOutside = (event: MouseEvent) => {
661
- if (timePickerWrapperRef.current && !timePickerWrapperRef.current.contains(event.target as Node)) {
662
- closeDropdown()
685
+ return subscribeFloatingKitOpen(({ kitKind }) => {
686
+ if (kitKind !== 'time-picker') {
687
+ setShowHourDropdown(false)
688
+ setShowMinuteDropdown(false)
689
+ setShowDropdown(false)
663
690
  }
691
+ })
692
+ }, [])
693
+
694
+ useEffect(() => {
695
+ if (!showDropdown || disabled) return
696
+ const host = resolvePortaledKitHost(
697
+ timePickerWrapperRef.current,
698
+ dialogCtx?.selectMenuPortalTarget ?? null,
699
+ )
700
+ if (!host) return
701
+ activePortalZIndexRef.current = resolvePortaledFloatingZIndex(
702
+ host,
703
+ nextPortaledFloatingZIndex(),
704
+ )
705
+ announceFloatingKitOpen(
706
+ 'time-picker',
707
+ resolveFloatingOwnerId(timePickerWrapperRef.current),
708
+ )
709
+ }, [showDropdown, disabled, dialogCtx?.selectMenuPortalTarget])
710
+
711
+ useEffect(() => {
712
+ const handleClickOutside = (event: MouseEvent) => {
713
+ const target = event.target as Node
714
+ if (timePickerWrapperRef.current?.contains(target)) return
715
+ if (timePickerPanelPortalRef.current?.contains(target)) return
716
+ closeDropdown()
664
717
  }
665
718
 
666
719
  if (showDropdown) {
667
- document.addEventListener('mousedown', handleClickOutside)
720
+ document.addEventListener('mousedown', handleClickOutside, true)
668
721
  return () => {
669
- document.removeEventListener('mousedown', handleClickOutside)
722
+ document.removeEventListener('mousedown', handleClickOutside, true)
670
723
  }
671
724
  }
672
725
  // eslint-disable-next-line react-hooks/exhaustive-deps
@@ -692,12 +745,238 @@ const TimePicker = (props: TimePickerProps): JSX.Element => {
692
745
  // Get hour constraints for the input
693
746
  const { maxHour, minHour } = getHourConstraints(timeFormat)
694
747
 
748
+ const timePickerContainerClass = classnames(
749
+ 'pb_time_picker_container',
750
+ timeFormat === '24hour' && 'pb_time_picker_container_24hour',
751
+ )
752
+
753
+ const portaledPanelRootClass = classnames(
754
+ buildCss('pb_time_picker'),
755
+ 'pb_time_picker_panel_portal',
756
+ errorDisplay ? 'error' : null,
757
+ disabled ? 'disabled' : null,
758
+ dark ? 'dark' : null,
759
+ )
760
+
761
+ const timeSelectionInner = (
762
+ <div className="pb_time_selection">
763
+ <div className="time_input_wrapper">
764
+ <label htmlFor={`${uniqueId}-hour`}>
765
+ <Caption
766
+ className="time_input_label"
767
+ color="lighter"
768
+ dark={dark}
769
+ size="sm"
770
+ text="Hour"
771
+ />
772
+ </label>
773
+ <input
774
+ className={`time_input time-hour ${hasSelectedTime && !isCurrentTimeValid(hour, minute, meridiem) ? 'invalid' : ''}`}
775
+ id={`${uniqueId}-hour`}
776
+ inputMode="numeric"
777
+ max={maxHour}
778
+ maxLength={2}
779
+ min={minHour}
780
+ name={`${uniqueId}-hour`}
781
+ onBlur={handleHourBlur}
782
+ onChange={handleHourChange}
783
+ onClick={() => { setShowHourDropdown(!showHourDropdown); setShowMinuteDropdown(false) }}
784
+ onFocus={handleHourFocus}
785
+ onKeyDown={handleHourKeyDown}
786
+ pattern="[0-9]*"
787
+ ref={hourInputRef}
788
+ step={1}
789
+ tabIndex={0}
790
+ type="number"
791
+ value={hourInputValue}
792
+ />
793
+ {showHourDropdown && (
794
+ <div
795
+ className="time_dropdown"
796
+ ref={hourDropdownRef}
797
+ >
798
+ {generateHourOptions(timeFormat).map((h) => (
799
+ <div
800
+ className={`time_dropdown_option ${hour === h ? 'selected' : ''}`}
801
+ key={h}
802
+ onClick={() => handleHourOptionClick(h)}
803
+ >
804
+ {timeFormat === '24hour' ? h.toString().padStart(2, '0') : h}
805
+ </div>
806
+ ))}
807
+ </div>
808
+ )}
809
+ </div>
810
+ <span className="time-separator">{':'}</span>
811
+ <div className="time_input_wrapper">
812
+ <label htmlFor={`${uniqueId}-minute`}>
813
+ <Caption
814
+ className="time_input_label"
815
+ color="lighter"
816
+ dark={dark}
817
+ size="sm"
818
+ text="Minute"
819
+ />
820
+ </label>
821
+ <input
822
+ className={`time_input time-minute ${hasSelectedTime && !isCurrentTimeValid(hour, minute, meridiem) ? 'invalid' : ''}`}
823
+ id={`${uniqueId}-minute`}
824
+ inputMode="numeric"
825
+ max={59}
826
+ maxLength={2}
827
+ min={0}
828
+ name={`${uniqueId}-minute`}
829
+ onBlur={handleMinuteBlur}
830
+ onChange={handleMinuteChange}
831
+ onClick={() => { setShowMinuteDropdown(!showMinuteDropdown); setShowHourDropdown(false) }}
832
+ onFocus={handleMinuteFocus}
833
+ onKeyDown={handleMinuteKeyDown}
834
+ pattern="[0-9]*"
835
+ ref={minuteInputRef}
836
+ step={1}
837
+ tabIndex={0}
838
+ type="number"
839
+ value={minuteInputValue}
840
+ />
841
+ {showMinuteDropdown && (
842
+ <div
843
+ className="time_dropdown"
844
+ ref={minuteDropdownRef}
845
+ >
846
+ {generateMinuteOptions().map((m) => (
847
+ <div
848
+ className={`time_dropdown_option ${minute === m ? 'selected' : ''}`}
849
+ key={m}
850
+ onClick={() => handleMinuteOptionClick(m)}
851
+ >
852
+ {m.toString().padStart(2, '0')}
853
+ </div>
854
+ ))}
855
+ </div>
856
+ )}
857
+ </div>
858
+ {timeFormat === 'AMPM' && (
859
+ <div className="meridiem">
860
+ <Caption
861
+ className="time_input_label"
862
+ color="lighter"
863
+ dark={dark}
864
+ size="sm"
865
+ text="Period"
866
+ />
867
+ <div className="pb_form_group_kit">
868
+ <SelectableCard
869
+ checked={meridiem === 'AM'}
870
+ className={!isAnyAMTimeValid() ? 'disabled_meridiem' : ''}
871
+ dark={dark}
872
+ disabled={!isAnyAMTimeValid()}
873
+ inputId={`${uniqueId}-am`}
874
+ multi={false}
875
+ name={`${uniqueId}-meridiem`}
876
+ onChange={() => handleMeridiemChange('AM')}
877
+ text="AM"
878
+ value="AM"
879
+ />
880
+ <SelectableCard
881
+ checked={meridiem === 'PM'}
882
+ className={!isAnyPMTimeValid() ? 'disabled_meridiem' : ''}
883
+ dark={dark}
884
+ disabled={!isAnyPMTimeValid()}
885
+ inputId={`${uniqueId}-pm`}
886
+ multi={false}
887
+ name={`${uniqueId}-meridiem`}
888
+ onChange={() => handleMeridiemChange('PM')}
889
+ text="PM"
890
+ value="PM"
891
+ />
892
+ </div>
893
+ </div>
894
+ )}
895
+ {hasSelectedTime && !isCurrentTimeValid(hour, minute, meridiem) && (
896
+ <div className="time_range_error">
897
+ <Caption
898
+ className="time_range_error_text"
899
+ dark={dark}
900
+ marginTop="sm"
901
+ size="xs"
902
+ text={getTimeRangeErrorMessage(minTime, maxTime, timeFormat)}
903
+ />
904
+ </div>
905
+ )}
906
+ {showTimezone && (
907
+ <Caption
908
+ color="lighter"
909
+ dark={dark}
910
+ lineHeight="tight"
911
+ marginTop="sm"
912
+ size="xs"
913
+ text={getTimezoneText()}
914
+ />
915
+ )}
916
+ </div>
917
+ )
918
+
919
+ const portaledMenuHost =
920
+ typeof document !== "undefined"
921
+ ? resolvePortaledKitHost(
922
+ timePickerWrapperRef.current,
923
+ dialogCtx?.selectMenuPortalTarget ?? null,
924
+ )
925
+ : null
926
+
927
+ useLayoutEffect(() => {
928
+ if (!showDropdown || disabled) return
929
+
930
+ const resolvedHost = resolvePortaledKitHost(
931
+ timePickerWrapperRef.current,
932
+ dialogCtx?.selectMenuPortalTarget ?? null,
933
+ )
934
+ if (!resolvedHost) return
935
+
936
+ const applyPortalPosition = () => {
937
+ const panel = timePickerPanelPortalRef.current
938
+ const wrap = triggerWrapperRef.current
939
+ if (!panel || !wrap) return
940
+
941
+ positionDropdownPortalToWrapper({
942
+ panel,
943
+ wrapperViewportRect: wrap.getBoundingClientRect(),
944
+ positionHost: resolvedHost,
945
+ preferBelow: true,
946
+ zIndex: activePortalZIndexRef.current,
947
+ })
948
+ if (panel && activePortalZIndexRef.current) {
949
+ panel.style.zIndex = activePortalZIndexRef.current
950
+ }
951
+ }
952
+
953
+ setFloatingOwnerAttribute(
954
+ timePickerPanelPortalRef.current,
955
+ resolveFloatingOwnerId(timePickerWrapperRef.current),
956
+ )
957
+
958
+ applyPortalPosition()
959
+ const raf = window.requestAnimationFrame(applyPortalPosition)
960
+ const unsubscribeReposition = subscribeFloatingKitReposition(applyPortalPosition)
961
+ return () => {
962
+ window.cancelAnimationFrame(raf)
963
+ unsubscribeReposition()
964
+ }
965
+ }, [
966
+ showDropdown,
967
+ disabled,
968
+ dialogCtx?.selectMenuPortalTarget,
969
+ uniqueId,
970
+ ])
971
+
695
972
  return (
973
+ <>
696
974
  <div
697
975
  {...ariaProps}
698
976
  {...dataProps}
699
977
  {...htmlProps}
700
978
  className={classes}
979
+ data-pb-time-picker-id={uniqueId}
701
980
  id={uniqueId}
702
981
  ref={timePickerWrapperRef}
703
982
  style={{ position: 'relative' }}
@@ -726,7 +1005,10 @@ const TimePicker = (props: TimePickerProps): JSX.Element => {
726
1005
  )}
727
1006
  </label>
728
1007
  )}
729
- <div className="time_picker_wrapper">
1008
+ <div
1009
+ className="time_picker_wrapper"
1010
+ ref={triggerWrapperRef}
1011
+ >
730
1012
  <TextInput
731
1013
  addOn={{ icon: 'clock', alignment: 'right', border: true }}
732
1014
  cursor="pointer"
@@ -760,169 +1042,29 @@ const TimePicker = (props: TimePickerProps): JSX.Element => {
760
1042
  {...inputHtmlProps}
761
1043
  />
762
1044
  </TextInput>
763
-
764
- {showDropdown && !disabled && (
765
- <div className={`pb_time_picker_container ${timeFormat === '24hour' ? 'pb_time_picker_container_24hour' : ''}`}>
766
- <div className="pb_time_selection">
767
- <div className="time_input_wrapper">
768
- <label htmlFor={`${uniqueId}-hour`}>
769
- <Caption
770
- className="time_input_label"
771
- color="lighter"
772
- dark={dark}
773
- size="sm"
774
- text="Hour"
775
- />
776
- </label>
777
- <input
778
- className={`time_input time-hour ${hasSelectedTime && !isCurrentTimeValid(hour, minute, meridiem) ? 'invalid' : ''}`}
779
- id={`${uniqueId}-hour`}
780
- inputMode="numeric"
781
- max={maxHour}
782
- maxLength={2}
783
- min={minHour}
784
- name={`${uniqueId}-hour`}
785
- onBlur={handleHourBlur}
786
- onChange={handleHourChange}
787
- onClick={() => { setShowHourDropdown(!showHourDropdown); setShowMinuteDropdown(false) }}
788
- onFocus={handleHourFocus}
789
- onKeyDown={handleHourKeyDown}
790
- pattern="[0-9]*"
791
- ref={hourInputRef}
792
- step={1}
793
- tabIndex={0}
794
- type="number"
795
- value={hourInputValue}
796
- />
797
- {showHourDropdown && (
798
- <div
799
- className="time_dropdown"
800
- ref={hourDropdownRef}
801
- >
802
- {generateHourOptions(timeFormat).map((h) => (
803
- <div
804
- className={`time_dropdown_option ${hour === h ? 'selected' : ''}`}
805
- key={h}
806
- onClick={() => handleHourOptionClick(h)}
807
- >
808
- {timeFormat === '24hour' ? h.toString().padStart(2, '0') : h}
809
- </div>
810
- ))}
811
- </div>
812
- )}
813
- </div>
814
- <span className="time-separator">{':'}</span>
815
- <div className="time_input_wrapper">
816
- <label htmlFor={`${uniqueId}-minute`}>
817
- <Caption
818
- className="time_input_label"
819
- color="lighter"
820
- dark={dark}
821
- size="sm"
822
- text="Minute"
823
- />
824
- </label>
825
- <input
826
- className={`time_input time-minute ${hasSelectedTime && !isCurrentTimeValid(hour, minute, meridiem) ? 'invalid' : ''}`}
827
- id={`${uniqueId}-minute`}
828
- inputMode="numeric"
829
- max={59}
830
- maxLength={2}
831
- min={0}
832
- name={`${uniqueId}-minute`}
833
- onBlur={handleMinuteBlur}
834
- onChange={handleMinuteChange}
835
- onClick={() => { setShowMinuteDropdown(!showMinuteDropdown); setShowHourDropdown(false) }}
836
- onFocus={handleMinuteFocus}
837
- onKeyDown={handleMinuteKeyDown}
838
- pattern="[0-9]*"
839
- ref={minuteInputRef}
840
- step={1}
841
- tabIndex={0}
842
- type="number"
843
- value={minuteInputValue}
844
- />
845
- {showMinuteDropdown && (
846
- <div
847
- className="time_dropdown"
848
- ref={minuteDropdownRef}
849
- >
850
- {generateMinuteOptions().map((m) => (
851
- <div
852
- className={`time_dropdown_option ${minute === m ? 'selected' : ''}`}
853
- key={m}
854
- onClick={() => handleMinuteOptionClick(m)}
855
- >
856
- {m.toString().padStart(2, '0')}
857
- </div>
858
- ))}
859
- </div>
860
- )}
861
- </div>
862
- {timeFormat === 'AMPM' && (
863
- <div className="meridiem">
864
- <Caption
865
- className="time_input_label"
866
- color="lighter"
867
- dark={dark}
868
- size="sm"
869
- text="Period"
870
- />
871
- <div className="pb_form_group_kit">
872
- <SelectableCard
873
- checked={meridiem === 'AM'}
874
- className={!isAnyAMTimeValid() ? 'disabled_meridiem' : ''}
875
- dark={dark}
876
- disabled={!isAnyAMTimeValid()}
877
- inputId={`${uniqueId}-am`}
878
- multi={false}
879
- name={`${uniqueId}-meridiem`}
880
- onChange={() => handleMeridiemChange('AM')}
881
- text="AM"
882
- value="AM"
883
- />
884
- <SelectableCard
885
- checked={meridiem === 'PM'}
886
- className={!isAnyPMTimeValid() ? 'disabled_meridiem' : ''}
887
- dark={dark}
888
- disabled={!isAnyPMTimeValid()}
889
- inputId={`${uniqueId}-pm`}
890
- multi={false}
891
- name={`${uniqueId}-meridiem`}
892
- onChange={() => handleMeridiemChange('PM')}
893
- text="PM"
894
- value="PM"
895
- />
896
- </div>
897
- </div>
898
- )}
899
- {/* Show validation error in dropdownwhen time is out of range */}
900
- {hasSelectedTime && !isCurrentTimeValid(hour, minute, meridiem) && (
901
- <div className="time_range_error">
902
- <Caption
903
- className="time_range_error_text"
904
- dark={dark}
905
- marginTop="sm"
906
- size="xs"
907
- text={getTimeRangeErrorMessage(minTime, maxTime, timeFormat)}
908
- />
909
- </div>
910
- )}
911
- {showTimezone && (
912
- <Caption
913
- color="lighter"
914
- dark={dark}
915
- lineHeight="tight"
916
- marginTop="sm"
917
- size="xs"
918
- text={getTimezoneText()}
919
- />
920
- )}
921
- </div>
922
- </div>
1045
+
1046
+ {showDropdown && !disabled && !portaledMenuHost && (
1047
+ <div className={timePickerContainerClass}>{timeSelectionInner}</div>
923
1048
  )}
924
1049
  </div>
925
1050
  </div>
1051
+
1052
+ {showDropdown && portaledMenuHost && !disabled
1053
+ ? createPortal(
1054
+ <div
1055
+ className={portaledPanelRootClass}
1056
+ data-pb-time-picker-id={uniqueId}
1057
+ onMouseDown={(e) => {
1058
+ e.stopPropagation()
1059
+ }}
1060
+ ref={timePickerPanelPortalRef}
1061
+ >
1062
+ <div className={timePickerContainerClass}>{timeSelectionInner}</div>
1063
+ </div>,
1064
+ portaledMenuHost,
1065
+ )
1066
+ : null}
1067
+ </>
926
1068
  )
927
1069
  }
928
1070
 
@@ -16,7 +16,6 @@
16
16
  "props": [
17
17
  "label",
18
18
  "name",
19
- "value",
20
19
  "defaultTime"
21
20
  ]
22
21
  },
@@ -24,7 +23,8 @@
24
23
  "name": "Appearance",
25
24
  "props": [
26
25
  "timeFormat",
27
- "showTimezone"
26
+ "showTimezone",
27
+ "dark"
28
28
  ]
29
29
  },
30
30
  {
@@ -38,14 +38,6 @@
38
38
  "error",
39
39
  "validationMessage"
40
40
  ]
41
- },
42
- {
43
- "name": "Advanced",
44
- "props": [
45
- "inputOptions",
46
- "onChange",
47
- "onClose"
48
- ]
49
41
  }
50
42
  ],
51
43
  "presets": [
@@ -86,7 +78,7 @@
86
78
  }
87
79
  },
88
80
  {
89
- "name": "Required field",
81
+ "name": "Required Field",
90
82
  "props": {
91
83
  "label": "Appointment",
92
84
  "name": "appointment_time",
@@ -94,26 +86,40 @@
94
86
  "requiredIndicator": true,
95
87
  "defaultTime": "10:00 AM"
96
88
  }
97
- },
98
- {
99
- "name": "Disabled",
100
- "props": {
101
- "label": "Locked",
102
- "name": "locked_time",
103
- "disabled": true,
104
- "defaultTime": "12:00 PM"
105
- }
106
- },
107
- {
108
- "name": "Error state",
109
- "props": {
110
- "label": "Invalid slot",
111
- "name": "error_time",
112
- "error": "Selected time is unavailable",
113
- "defaultTime": "11:45 AM"
114
- }
115
89
  }
116
90
  ],
117
91
  "conditionals": {},
118
- "hints": {}
92
+ "hints": {
93
+ "default": {
94
+ "presetName": "Default",
95
+ "message": "Default uses defaultTime so the picker initializes with a value while remaining internally editable.",
96
+ "type": "info"
97
+ },
98
+ "twenty_four_hour": {
99
+ "presetName": "24-hour",
100
+ "message": "24-hour switches timeFormat to the 24hour display and input pattern.",
101
+ "type": "info"
102
+ },
103
+ "with_timezone": {
104
+ "presetName": "With timezone",
105
+ "message": "With timezone shows the timezone label next to the selected time.",
106
+ "type": "info"
107
+ },
108
+ "business_hours": {
109
+ "presetName": "Business hours",
110
+ "message": "Business hours combines minTime and maxTime to constrain available selections.",
111
+ "type": "info"
112
+ },
113
+ "required_field": {
114
+ "presetName": "Required Field",
115
+ "message": "Required Field combines required and requiredIndicator for validation-ready forms.",
116
+ "type": "info"
117
+ }
118
+ },
119
+ "hiddenProps": [
120
+ "inputOptions",
121
+ "onChange",
122
+ "onClose",
123
+ "value"
124
+ ]
119
125
  }