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
@@ -6,8 +6,23 @@ import weekSelect from "flatpickr/dist/plugins/weekSelect/weekSelect"
6
6
  import timeSelectPlugin from './plugins/timeSelect'
7
7
  import quickPickPlugin from './plugins/quickPick'
8
8
  import { getAllIcons } from '../utilities/icons/allicons';
9
-
10
- const angleDown = getAllIcons().angleDown.string
9
+ import {
10
+ announceFloatingKitOpen,
11
+ nextPortaledFloatingZIndex,
12
+ positionDropdownPortalToWrapper,
13
+ resolveFloatingOwnerId,
14
+ resolvePortaledFloatingZIndex,
15
+ resolvePortaledKitHost,
16
+ kitRequiresPortaledFloatingUi,
17
+ setFloatingOwnerAttribute,
18
+ subscribeFloatingKitOpen,
19
+ subscribeFloatingKitReposition,
20
+ } from '../utilities/floatingPortalHosts'
21
+
22
+ const { angleDown, angleLeft, angleRight } = getAllIcons()
23
+ const angleDownString = angleDown.string
24
+ const angleLeftString = angleLeft.string
25
+ const angleRightString = angleRight.string
11
26
 
12
27
  const getPositionElement = (element: string | Element) => {
13
28
  return (typeof element === 'string') ? document.querySelectorAll(element)[0] : element
@@ -32,12 +47,15 @@ type DatePickerConfig = {
32
47
  thisRangesEndToday?: boolean,
33
48
  timeCaption?: string,
34
49
  timeFormat?: string,
50
+ yearAscending?: boolean,
35
51
  yearRange: number[],
36
52
  controlsStartId?: string,
37
53
  controlsEndId?: string,
38
54
  syncStartWith?: string,
39
55
  syncEndWith?: string,
40
- } & Pick<BaseOptions, "allowInput" | "defaultDate" | "enableTime" | "maxDate" | "minDate" | "mode" | "plugins" | "position" | "positionElement" >
56
+ /** React Dialog floating root; omit in Rails (DOM resolution only). */
57
+ dialogPortalTarget?: HTMLElement | null,
58
+ } & Pick<BaseOptions, "allowInput" | "defaultDate" | "enableTime" | "maxDate" | "minDate" | "mode" | "plugins" | "position" | "positionElement" | "inline" >
41
59
 
42
60
  const datePickerHelper = (config: DatePickerConfig, scrollContainer: string | HTMLElement) => {
43
61
  const noop = () => {
@@ -70,13 +88,98 @@ const datePickerHelper = (config: DatePickerConfig, scrollContainer: string | HT
70
88
  thisRangesEndToday = false,
71
89
  timeCaption = 'Select Time',
72
90
  timeFormat = 'at h:i K',
91
+ yearAscending,
73
92
  yearRange,
74
93
  controlsStartId,
75
94
  controlsEndId,
76
95
  syncStartWith,
77
96
  syncEndWith,
97
+ dialogPortalTarget,
98
+ inline = false,
78
99
  } = config
79
100
 
101
+ const inputElForPortal =
102
+ typeof document !== "undefined"
103
+ ? document.querySelector<HTMLElement>(`#${String(pickerId)}`)
104
+ : null
105
+ const kitRootForPortal = inputElForPortal?.closest(".pb_date_picker_kit") as HTMLElement | null
106
+ const portalHost =
107
+ !inline && kitRootForPortal && kitRequiresPortaledFloatingUi(kitRootForPortal)
108
+ ? resolvePortaledKitHost(kitRootForPortal, dialogPortalTarget ?? null)
109
+ : null
110
+
111
+ const floatingOwnerId = resolveFloatingOwnerId(kitRootForPortal)
112
+ const effectiveStatic = portalHost ? false : staticPosition
113
+
114
+ type DatePickerInputEl = HTMLElement & {
115
+ _flatpickr?: Instance
116
+ _pbDatePickerOpenUnsub?: () => void
117
+ }
118
+
119
+ const existingInput = document.querySelector(`#${String(pickerId)}`) as DatePickerInputEl | null
120
+ if (existingInput?._pbDatePickerOpenUnsub) {
121
+ existingInput._pbDatePickerOpenUnsub()
122
+ delete existingInput._pbDatePickerOpenUnsub
123
+ }
124
+ if (existingInput?._flatpickr) {
125
+ existingInput._flatpickr.destroy()
126
+ }
127
+
128
+ let portalAppendShell: HTMLElement | undefined
129
+
130
+ const removePortalShell = (): void => {
131
+ if (!portalHost) return
132
+
133
+ const shellSelector = `[data-pb-date-picker-floating-shell="${String(pickerId)}"]`
134
+ const shell =
135
+ portalAppendShell?.isConnected
136
+ ? portalAppendShell
137
+ : (portalHost.querySelector(shellSelector) as HTMLElement | undefined)
138
+
139
+ shell?.remove()
140
+ portalAppendShell = undefined
141
+ }
142
+
143
+ const ensurePortalShell = (): HTMLElement | undefined => {
144
+ if (!portalHost) return undefined
145
+ if (portalAppendShell?.isConnected) return portalAppendShell
146
+
147
+ const shellSelector = `[data-pb-date-picker-floating-shell="${String(pickerId)}"]`
148
+ portalAppendShell =
149
+ portalHost.querySelector(shellSelector) as HTMLElement | undefined
150
+
151
+ if (!portalAppendShell) {
152
+ portalAppendShell = document.createElement("div")
153
+ portalAppendShell.className = "pb_date_picker_floating_shell pb_date_picker_kit"
154
+ portalAppendShell.setAttribute(
155
+ "data-pb-date-picker-floating-shell",
156
+ String(pickerId),
157
+ )
158
+ portalAppendShell.addEventListener("mousedown", (e) => {
159
+ e.stopPropagation()
160
+ })
161
+ portalAppendShell.addEventListener("click", (e) => {
162
+ e.stopPropagation()
163
+ })
164
+ portalHost.appendChild(portalAppendShell)
165
+ }
166
+
167
+ setFloatingOwnerAttribute(portalAppendShell, floatingOwnerId)
168
+ return portalAppendShell
169
+ }
170
+
171
+ const mountCalendarInPortalShell = (fp: Instance): void => {
172
+ const shell = ensurePortalShell()
173
+ if (!shell?.isConnected || !fp.calendarContainer) return
174
+ if (fp.calendarContainer.parentElement !== shell) {
175
+ shell.appendChild(fp.calendarContainer)
176
+ }
177
+ }
178
+
179
+ let activePortalZIndex: string | undefined
180
+
181
+ let unsubscribeFloatingReposition: (() => void) | null = null
182
+
80
183
  // ===========================================================
81
184
  // | Hook Definitions |
82
185
  // ===========================================================
@@ -183,6 +286,12 @@ const datePickerHelper = (config: DatePickerConfig, scrollContainer: string | HT
183
286
  }
184
287
 
185
288
  const positionCalendarIfNeeded = (fp: Instance) => {
289
+ if (portalHost) {
290
+ mountCalendarInPortalShell(fp)
291
+ fp._positionCalendar()
292
+ return
293
+ }
294
+
186
295
  const cal = document.querySelector(`#cal-${pickerId}`) as HTMLElement
187
296
  if (!cal) return
188
297
 
@@ -192,7 +301,7 @@ const datePickerHelper = (config: DatePickerConfig, scrollContainer: string | HT
192
301
  const spaceAbove = inputRect.top
193
302
 
194
303
  if (spaceBelow < h + 10 && spaceAbove >= h + 10) {
195
- if (staticPosition) {
304
+ if (effectiveStatic) {
196
305
  cal.style.top = 'auto'
197
306
  cal.style.bottom = 'calc(100% + 5px)'
198
307
  } else {
@@ -200,7 +309,7 @@ const datePickerHelper = (config: DatePickerConfig, scrollContainer: string | HT
200
309
  cal.style.top = `${Math.max(10, inputRect.top - h - 5)}px`
201
310
  cal.style.left = `${inputRect.left}px`
202
311
  }
203
- } else if (staticPosition) {
312
+ } else if (effectiveStatic) {
204
313
  cal.style.top = ''
205
314
  cal.style.bottom = ''
206
315
  } else {
@@ -234,9 +343,10 @@ const datePickerHelper = (config: DatePickerConfig, scrollContainer: string | HT
234
343
  }
235
344
 
236
345
  // Attach / detach to / from scroll events
237
- const initialPicker = document.querySelector<HTMLElement & { [x: string]: any }>(`#${pickerId}`)._flatpickr
238
346
  const scrollEvent = () => {
239
- initialPicker._positionCalendar()
347
+ const fp = document.querySelector<HTMLElement & { _flatpickr?: Instance }>(`#${pickerId}`)
348
+ ?._flatpickr
349
+ fp?._positionCalendar()
240
350
  }
241
351
  function attachToScroll(scrollParent: string | HTMLElement) {
242
352
  document.querySelectorAll(scrollParent as string)[0]?.addEventListener("scroll", scrollEvent, { passive: true })
@@ -245,10 +355,23 @@ const datePickerHelper = (config: DatePickerConfig, scrollContainer: string | HT
245
355
  document.querySelectorAll(scrollParent as string)[0]?.removeEventListener("scroll", scrollEvent)
246
356
  }
247
357
 
358
+ const yearSelectId = `year-${pickerId}`
359
+
360
+ const yearDropdownFromCalendar = (fp: Instance): HTMLSelectElement | null => {
361
+ return fp.calendarContainer?.querySelector<HTMLSelectElement>(`#${yearSelectId}`) ?? null
362
+ }
363
+
364
+ const yearDropdownIsReady = (fp: Instance): boolean => {
365
+ const dropdown = yearDropdownFromCalendar(fp)
366
+ return dropdown !== null && dropdown.options.length > 0
367
+ }
368
+
248
369
  // two way binding
249
370
  const yearChangeHook = (fp: Instance) => {
250
- const yearInput = document.querySelector(`#year-${fp.input.id}`) as HTMLInputElement
371
+ const yearInput = yearDropdownFromCalendar(fp)
372
+ if (yearInput) {
251
373
  yearInput.value = fp.currentYear?.toString()
374
+ }
252
375
  }
253
376
 
254
377
  const handleDatePickerChange = (fp: Instance, selectedDates: Date[]) => {
@@ -350,7 +473,94 @@ const datePickerHelper = (config: DatePickerConfig, scrollContainer: string | HT
350
473
  : setMaxDate
351
474
 
352
475
  // End of Default Date + Min/Max Date Initialization Helper Functions section ----/
353
-
476
+ const resolveDatePickerPortalWrapper = (input: HTMLElement): HTMLElement | null => {
477
+ return (
478
+ (input.closest(".date_picker_input_wrapper") as HTMLElement | null) ??
479
+ (input.closest(".text_input_wrapper") as HTMLElement | null) ??
480
+ (input.closest(".input_wrapper") as HTMLElement | null) ??
481
+ (input.closest(".pb_date_picker_kit") as HTMLElement | null)
482
+ )
483
+ }
484
+
485
+ const portalPositionFn: ((self: Instance) => void) | undefined = portalHost
486
+ ? (self: Instance) => {
487
+ mountCalendarInPortalShell(self)
488
+ const shell = ensurePortalShell()
489
+ const cal = self.calendarContainer
490
+ if (!cal || !shell) return
491
+ const wrap = resolveDatePickerPortalWrapper(self.input)
492
+ const host = shell.parentElement as HTMLElement | null
493
+ if (!wrap || !host) return
494
+ positionDropdownPortalToWrapper({
495
+ panel: cal,
496
+ wrapperViewportRect: wrap.getBoundingClientRect(),
497
+ positionHost: host,
498
+ matchWrapperWidth: selectionType === "quickpick",
499
+ zIndex: activePortalZIndex,
500
+ })
501
+ }
502
+ : undefined
503
+
504
+ const setupYearMonthDropdowns = (fp: Instance) => {
505
+ if (yearDropdownIsReady(fp) || !fp.yearElements?.[0]?.parentElement) return
506
+
507
+ fp.yearElements[0].parentElement.innerHTML = `<select class="numInput cur-year" type="number" tabIndex="-1" aria-label="Year" id="${yearSelectId}"></select>`
508
+
509
+ let years = ''
510
+ if (yearAscending) {
511
+ for (let year = setMinYear; year <= setMaxYear; year++) {
512
+ years += `<option value="${year}">${year}</option>`
513
+ }
514
+ } else {
515
+ for (let year = setMaxYear; year >= setMinYear; year--) {
516
+ years += `<option value="${year}">${year}</option>`
517
+ }
518
+ }
519
+
520
+ const dropdown = yearDropdownFromCalendar(fp)
521
+ if (!dropdown) return
522
+
523
+ dropdown.innerHTML = years
524
+ dropdown.value = String(fp.currentYear)
525
+
526
+ dropdown.addEventListener('input', (e: Event & { target: { value: string }}) => {
527
+ fp.changeYear(Number(e.target.value))
528
+ })
529
+
530
+ if (fp.input.form) {
531
+ fp.input.form.addEventListener('reset', () => {
532
+ setTimeout(() => {
533
+ dropdown.value = String(fp.currentYear)
534
+ if (fp.monthsDropdownContainer) {
535
+ fp.monthsDropdownContainer.value = String(fp.currentMonth)
536
+ }
537
+
538
+ if (defaultDate) {
539
+ fp.setDate(defaultDate)
540
+ yearChangeHook(fp)
541
+ }
542
+ }, 0)
543
+ })
544
+ }
545
+
546
+ if (!dropdown.nextElementSibling?.classList.contains('year-dropdown-icon')) {
547
+ dropdown.insertAdjacentHTML('afterend', `<i class="year-dropdown-icon">${angleDownString}</i>`)
548
+ }
549
+ if (
550
+ fp.monthElements[0]?.parentElement &&
551
+ !fp.calendarContainer?.querySelector('.month-dropdown-icon')
552
+ ) {
553
+ fp.monthElements[0].insertAdjacentHTML('afterend', `<i class="month-dropdown-icon">${angleDownString}</i>`)
554
+ }
555
+ }
556
+
557
+ const assignCalendarId = (fp: Instance): void => {
558
+ const calEl = fp.calendarContainer ?? fp.innerContainer?.parentElement
559
+ if (calEl) {
560
+ calEl.id = `cal-${pickerId}`
561
+ }
562
+ }
563
+
354
564
  flatpickr(`#${pickerId}`, {
355
565
  allowInput,
356
566
  closeOnSelect,
@@ -365,8 +575,27 @@ const datePickerHelper = (config: DatePickerConfig, scrollContainer: string | HT
365
575
  maxDate: effectiveMaxDate,
366
576
  minDate: effectiveMinDate,
367
577
  mode,
368
- nextArrow: '<i class="far fa-angle-right"></i>',
578
+ nextArrow: `<div style="height: 14px;">${angleRightString}</div>`,
369
579
  onOpen: [(_selectedDates, _dateStr, fp) => {
580
+ activePortalZIndex = portalHost
581
+ ? resolvePortaledFloatingZIndex(
582
+ portalHost,
583
+ nextPortaledFloatingZIndex(),
584
+ )
585
+ : undefined
586
+ if (portalHost) {
587
+ mountCalendarInPortalShell(fp)
588
+ }
589
+ if (portalAppendShell) {
590
+ portalAppendShell.style.zIndex = activePortalZIndex
591
+ setFloatingOwnerAttribute(portalAppendShell, floatingOwnerId)
592
+ }
593
+ if (fp.calendarContainer) {
594
+ fp.calendarContainer.style.zIndex = activePortalZIndex
595
+ setFloatingOwnerAttribute(fp.calendarContainer, floatingOwnerId)
596
+ }
597
+ announceFloatingKitOpen('date-picker', floatingOwnerId)
598
+
370
599
  // If defaultDate was out of range of a dev set min/max date, restore it when calendar opens (in situation where the input was manually cleared or the calendar was closed without selection)
371
600
  if (hasOutOfRangeDefault) {
372
601
  const dateObj = toDateObject(defaultDateValue)
@@ -397,15 +626,37 @@ const datePickerHelper = (config: DatePickerConfig, scrollContainer: string | HT
397
626
  positionCalendarIfNeeded(fp)
398
627
  }
399
628
  window.addEventListener('resize', resizeRepositionHandlerRef)
400
- if (!staticPosition && scrollContainer) attachToScroll(scrollContainer)
629
+ if (!effectiveStatic && scrollContainer) attachToScroll(scrollContainer)
630
+ if (portalHost) {
631
+ unsubscribeFloatingReposition = subscribeFloatingKitReposition(() => {
632
+ positionCalendarIfNeeded(fp)
633
+ })
634
+ }
635
+ assignCalendarId(fp)
401
636
  positionCalendarIfNeeded(fp)
637
+ setupYearMonthDropdowns(fp)
638
+ }],
639
+ onDestroy: [() => {
640
+ if (unsubscribeFloatingReposition) {
641
+ unsubscribeFloatingReposition()
642
+ unsubscribeFloatingReposition = null
643
+ }
644
+ if (resizeRepositionHandlerRef) {
645
+ window.removeEventListener('resize', resizeRepositionHandlerRef)
646
+ resizeRepositionHandlerRef = null
647
+ }
648
+ removePortalShell()
402
649
  }],
403
650
  onClose: [(selectedDates, dateStr, fp) => {
651
+ if (unsubscribeFloatingReposition) {
652
+ unsubscribeFloatingReposition()
653
+ unsubscribeFloatingReposition = null
654
+ }
404
655
  if (resizeRepositionHandlerRef) {
405
656
  window.removeEventListener('resize', resizeRepositionHandlerRef)
406
657
  resizeRepositionHandlerRef = null
407
658
  }
408
- if (!staticPosition && scrollContainer) detachFromScroll(scrollContainer as HTMLElement)
659
+ if (!effectiveStatic && scrollContainer) detachFromScroll(scrollContainer as HTMLElement)
409
660
 
410
661
  // If defaultDate was out of range and no date was selected, preserve the default date
411
662
  if (hasOutOfRangeDefault && (!selectedDates || selectedDates.length === 0)) {
@@ -435,15 +686,17 @@ const datePickerHelper = (config: DatePickerConfig, scrollContainer: string | HT
435
686
  yearChangeHook(fp)
436
687
  }],
437
688
  plugins: setPlugins(thisRangesEndToday, customQuickPickDates),
438
- position,
689
+ position: portalPositionFn ?? position,
439
690
  positionElement: getPositionElement(positionElement),
440
- prevArrow: '<i class="far fa-angle-left"></i>',
441
- static: staticPosition,
691
+ prevArrow: `<div style="height: 14px;">${angleLeftString}</div>`,
692
+ static: effectiveStatic,
442
693
  })
443
694
 
444
695
  // Assign dynamically sourced flatpickr instance to variable
445
- const picker = document.querySelector<HTMLElement & { [x: string]: any }>(`#${pickerId}`)._flatpickr
446
- picker.innerContainer.parentElement.id = `cal-${pickerId}`
696
+ const picker = document.querySelector<HTMLElement & { [x: string]: any }>(`#${pickerId}`)?._flatpickr
697
+ if (!picker) return
698
+
699
+ assignCalendarId(picker)
447
700
 
448
701
  // If defaultDate was out of range, restore the original minDate/maxDate after initialization (defaultDate displayed, still cannot select dates outside the actual range via user provided minDate/maxDate constraints)
449
702
  if ((isBeforeMin || isAfterMax) && defaultDateValue) {
@@ -510,45 +763,7 @@ const datePickerHelper = (config: DatePickerConfig, scrollContainer: string | HT
510
763
  }, 10)
511
764
  }
512
765
 
513
- // replace year selector with dropdown
514
- picker.yearElements[0].parentElement.innerHTML = `<select class="numInput cur-year" type="number" tabIndex="-1" aria-label="Year" id="year-${pickerId}"></select>`
515
-
516
- // create html option tags for desired years
517
- let years = ''
518
- for (let year = setMaxYear; year >= setMinYear; year--) {
519
- years += `<option value="${year}">${year}</option>`
520
- }
521
-
522
- // variablize each dropdown selector
523
- const dropdown = document.querySelector<HTMLElement & { [x: string]: any }>(`#year-${pickerId}`)
524
-
525
- // inject year options into dropdown and assign it the flatpickr's current year value
526
- dropdown.innerHTML = years
527
- dropdown.value = picker.currentYear
528
-
529
- // whenever a new year is selected from dropdown update flatpickr's current year value
530
- dropdown.addEventListener('input', (e: Event & { target: { value: string}}) => {
531
- picker.changeYear(Number(e.target.value))
532
- })
533
-
534
- // Reverse month and year dropdown reset on form.reset()
535
- if (picker.input.form) {
536
- picker.input.form.addEventListener('reset', () => {
537
- // Code block triggers after form.reset() is called and executed
538
- setTimeout(() => {
539
- dropdown.value = picker.currentYear
540
- if (picker.monthsDropdownContainer) {
541
- picker.monthsDropdownContainer.value = picker.currentMonth
542
- }
543
-
544
- /* Reset date picker to default value on form.reset() */
545
- if (defaultDate){
546
- picker.setDate(defaultDate)
547
- yearChangeHook(picker)
548
- }
549
- }, 0)
550
- })
551
- }
766
+ setupYearMonthDropdowns(picker)
552
767
 
553
768
  // === Automatic Sync Logic for 3 input range pattern===
554
769
 
@@ -650,14 +865,6 @@ const datePickerHelper = (config: DatePickerConfig, scrollContainer: string | HT
650
865
  }
651
866
  }
652
867
 
653
- // Adding dropdown icons to year and month select
654
- dropdown.insertAdjacentHTML('afterend', `<i class="year-dropdown-icon">${angleDown}</i>`)
655
- if (picker.monthElements[0].parentElement) {
656
- return picker.monthElements[0].insertAdjacentHTML('afterend', `<i class="month-dropdown-icon">${angleDown}</i>`)}
657
- // if (picker.weekElements[0].parentElement){
658
- // return picker.weekElements[0].insertAdjacentHTML('afterend', '<i class="far fa-angle-down year-dropdown-icon" id="test-id"></i>')
659
- // }
660
-
661
868
  // Remove readonly attribute for validation and or text input
662
869
  if (allowInput){
663
870
  picker.input.removeAttribute('readonly')
@@ -669,8 +876,55 @@ const datePickerHelper = (config: DatePickerConfig, scrollContainer: string | HT
669
876
  picker.input.style.cursor = 'pointer'
670
877
  }
671
878
 
879
+ const stopPointerForFlatpickrDocClose = (e: Event) => {
880
+ e.stopPropagation()
881
+ }
882
+
883
+ // Prevent flatpickr's document mousedown listener from treating the opening click as outside.
884
+ picker.input.addEventListener('mousedown', stopPointerForFlatpickrDocClose)
885
+ picker.input.addEventListener('touchstart', stopPointerForFlatpickrDocClose, { passive: true })
886
+
887
+ const calIconWrapper = document.querySelector(`#cal-icon-${pickerId}`) as HTMLElement | null
888
+ const isPointerInCalIcon = (e: MouseEvent) => {
889
+ if (!calIconWrapper) return false
890
+ const rect = calIconWrapper.getBoundingClientRect()
891
+ return (
892
+ e.clientX >= rect.left &&
893
+ e.clientX <= rect.right &&
894
+ e.clientY >= rect.top &&
895
+ e.clientY <= rect.bottom
896
+ )
897
+ }
898
+
899
+ const openDatePickerFromUi = (e: MouseEvent) => {
900
+ e.preventDefault()
901
+ e.stopPropagation()
902
+ if (picker.input.disabled) return
903
+ if (picker.isOpen) {
904
+ picker.close()
905
+ return
906
+ }
907
+ picker.open()
908
+ picker.input.focus()
909
+ }
910
+
911
+ const textInputWrapper = picker.input.closest('.text_input_wrapper') as HTMLElement | null
912
+ const inputWrapper = picker.input.closest('.input_wrapper') as HTMLElement | null
913
+ inputWrapper?.addEventListener('click', (e: MouseEvent) => {
914
+ if (e.target === picker.input) return
915
+ if (!isPointerInCalIcon(e) && !textInputWrapper?.contains(e.target as Node)) return
916
+ openDatePickerFromUi(e)
917
+ })
918
+
919
+ const pickerInput = picker.input as DatePickerInputEl
920
+ pickerInput._pbDatePickerOpenUnsub = subscribeFloatingKitOpen(({ kitKind }) => {
921
+ if (kitKind !== 'date-picker' && picker.isOpen) {
922
+ picker.close()
923
+ }
924
+ })
925
+
672
926
  // Fix event bubbling bug on wrapper
673
- document.querySelector(`#${pickerId}`).parentElement.addEventListener('click', (e) => e.stopPropagation())
927
+ document.querySelector(`#${pickerId}`)?.parentElement?.addEventListener('click', (e) => e.stopPropagation())
674
928
  }
675
929
 
676
930
  export default datePickerHelper
@@ -0,0 +1 @@
1
+ <%= pb_rails("date_picker", props: { picker_id: "date-picker-date-asc", year_ascending: true}) %>
@@ -0,0 +1,15 @@
1
+ import React from 'react'
2
+
3
+ import DatePicker from '../_date_picker'
4
+
5
+ const DatePickerYearAsc = (props) => (
6
+ <div>
7
+ <DatePicker
8
+ pickerId="date-picker-date-asc"
9
+ yearAscending
10
+ {...props}
11
+ />
12
+ </div>
13
+ )
14
+
15
+ export default DatePickerYearAsc
@@ -0,0 +1 @@
1
+ `yearAscending`/`year_ascending` is a boolean prop that if set to true, will render the years in the year dropdown in chronological order. This prop is set to false by default.
@@ -16,6 +16,7 @@
16
16
  "showTimezone": false,
17
17
  "staticPosition": true,
18
18
  "thisRangesEndToday": false,
19
+ "yearAscending": false,
19
20
  "controlsStartId": "",
20
21
  "controlsEndId": "",
21
22
  "syncStartWith": "",
@@ -23,6 +23,7 @@ examples:
23
23
  - date_picker_flatpickr_methods: Flatpickr Methods
24
24
  - date_picker_hooks: Hooks
25
25
  - date_picker_year_range: Year Range
26
+ - date_picker_year_asc: Year Ascending
26
27
  - date_picker_anti_patterns: Anti-Patterns
27
28
  - date_picker_margin_bottom: Margin Bottom
28
29
  - date_picker_inline: Inline
@@ -58,6 +59,7 @@ examples:
58
59
  - date_picker_flatpickr_methods: Flatpickr Methods
59
60
  - date_picker_hooks: Hooks
60
61
  - date_picker_year_range: Year Range
62
+ - date_picker_year_asc: Year Ascending
61
63
  - date_picker_margin_bottom: Margin Bottom
62
64
  - date_picker_inline: Inline
63
65
  - date_picker_month_and_year: Month & Year Only
@@ -30,3 +30,4 @@ export { default as DatePickerRangePattern } from './_date_picker_range_pattern'
30
30
  export { default as DatePickerAndDropdownRange } from './_date_picker_and_dropdown_range.jsx'
31
31
  export { default as DatePickerRequiredIndicator } from "./_date_picker_required_indicator.jsx";
32
32
  export { default as DatePickerDialogSubmission } from "./_date_picker_dialog_submission.jsx";
33
+ export { default as DatePickerYearAsc } from './_date_picker_year_asc.jsx'
@@ -131,7 +131,7 @@
131
131
  ]
132
132
  },
133
133
  "inputOnChange": {
134
- "type": "ReactNode",
134
+ "type": "function",
135
135
  "platforms": [
136
136
  "react"
137
137
  ]
@@ -257,6 +257,14 @@
257
257
  "react"
258
258
  ]
259
259
  },
260
+ "yearAscending": {
261
+ "type": "boolean",
262
+ "platforms": [
263
+ "react",
264
+ "rails"
265
+ ],
266
+ "default": false
267
+ },
260
268
  "yearRange": {
261
269
  "type": "array",
262
270
  "platforms": [
@@ -72,7 +72,7 @@
72
72
  "platforms": [
73
73
  "rails"
74
74
  ],
75
- "type": "string"
75
+ "type": "Date"
76
76
  },
77
77
  "timezone": {
78
78
  "platforms": [
@@ -44,7 +44,7 @@
44
44
  "platforms": [
45
45
  "rails"
46
46
  ],
47
- "type": "string"
47
+ "type": "Date"
48
48
  },
49
49
  "timezone": {
50
50
  "platforms": [
@@ -151,11 +151,33 @@
151
151
  border-radius: $border_radius_md;
152
152
  max-height: calc(100vh - #{$gutter * 2});
153
153
  max-width: calc(100vw - #{$gutter * 2});
154
- overflow: auto;
154
+ display: flex;
155
+ flex-direction: column;
156
+ min-height: 0;
157
+ overflow: visible;
155
158
  animation-name: modalFadeIn;
156
159
  animation-duration: $animation-duration;
157
160
  outline: none;
158
161
  animation-timing-function: $easeInOutQuint;
162
+
163
+ .pb_dialog_scroll_region {
164
+ flex: 1 1 auto;
165
+ min-height: 0;
166
+ overflow: auto;
167
+ -webkit-overflow-scrolling: touch;
168
+ }
169
+
170
+ .pb_dialog_floating_root {
171
+ flex: 0 0 auto;
172
+ min-height: 0;
173
+ pointer-events: none;
174
+ position: relative;
175
+ z-index: 1;
176
+ }
177
+
178
+ .pb_dialog_floating_root > * {
179
+ pointer-events: auto;
180
+ }
159
181
  }
160
182
 
161
183
  // Left placement animations
@@ -584,4 +606,35 @@
584
606
  border: none;
585
607
  cursor: pointer;
586
608
  }
609
+
610
+ // Rails native dialog: scroll region + floating portal host for portaled form inputs
611
+ dialog.pb_dialog_rails:not([open]) {
612
+ display: none !important;
613
+ }
614
+
615
+ .pb_dialog_rails[open] {
616
+ display: flex;
617
+ flex-direction: column;
618
+ min-height: 0;
619
+ overflow: visible;
620
+ }
621
+
622
+ .pb_dialog_scroll_region {
623
+ flex: 1 1 auto;
624
+ min-height: 0;
625
+ overflow: auto;
626
+ -webkit-overflow-scrolling: touch;
627
+ }
628
+
629
+ .pb_dialog_floating_root {
630
+ flex: 0 0 auto;
631
+ min-height: 0;
632
+ pointer-events: none;
633
+ position: relative;
634
+ z-index: 1;
635
+ }
636
+
637
+ .pb_dialog_floating_root > * {
638
+ pointer-events: auto;
639
+ }
587
640
  }