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
@@ -0,0 +1,277 @@
1
+ import React, { useEffect, useMemo, useRef, useState } from 'react'
2
+ import flatpickr from 'flatpickr'
3
+ import { Instance } from 'flatpickr/dist/types/instance'
4
+
5
+ import Flex from '../../pb_flex/_flex'
6
+ import Caption from '../../pb_caption/_caption'
7
+ import Icon from '../../pb_icon/_icon'
8
+ import PbReactPopover from '../../pb_popover/_popover'
9
+ import getQuickPickOptions from '../../pb_dropdown/quickpick'
10
+ import { uniqueId } from '../../utilities/object'
11
+ import Title from '../../pb_title/_title'
12
+
13
+ export type SelectInteractiveConfig = {
14
+ type: 'select',
15
+ options: { value: string, text?: string }[],
16
+ value?: string,
17
+ /** Draft value for the inline editor active state (chip label uses `value`). */
18
+ editorValue?: string,
19
+ onChange: (value: string) => void,
20
+ }
21
+
22
+ export type DropdownInteractiveConfig = {
23
+ type: 'dropdown',
24
+ options?: { value?: string, label: string, id?: string }[],
25
+ variant?: 'default' | 'quickpick',
26
+ rangeEndsToday?: boolean,
27
+ customQuickPickDates?: {
28
+ override?: boolean,
29
+ dates: {
30
+ label: string,
31
+ value: string[] | { timePeriod: string, amount: number },
32
+ }[],
33
+ },
34
+ value?: string,
35
+ editorValue?: string,
36
+ onChange: (value: string) => void,
37
+ }
38
+
39
+ export type DatePickerInteractiveConfig = {
40
+ type: 'date-picker',
41
+ value?: string,
42
+ editorValue?: string,
43
+ onChange: (value: string) => void,
44
+ format?: string,
45
+ minDate?: string,
46
+ maxDate?: string,
47
+ mode?: 'single' | 'range' | 'multiple',
48
+ }
49
+
50
+ export type InteractiveFilterConfig =
51
+ | SelectInteractiveConfig
52
+ | DropdownInteractiveConfig
53
+ | DatePickerInteractiveConfig
54
+
55
+ const dropdownOptionsFor = (
56
+ config: DropdownInteractiveConfig
57
+ ): { value: string, label: string }[] => {
58
+ if (config.variant === 'quickpick' && !config.options?.length) {
59
+ return getQuickPickOptions(
60
+ config.rangeEndsToday,
61
+ config.customQuickPickDates
62
+ ).map((opt) => ({
63
+ value: opt.id || opt.label,
64
+ label: opt.label,
65
+ }))
66
+ }
67
+
68
+ return (config.options || []).map((opt) => ({
69
+ value: opt.id || opt.value || opt.label,
70
+ label: opt.label,
71
+ }))
72
+ }
73
+
74
+ type InteractiveFilterProps = {
75
+ dark?: boolean,
76
+ name: string,
77
+ value: string,
78
+ editorValue?: string,
79
+ config: InteractiveFilterConfig,
80
+ }
81
+
82
+ const labelFor = (
83
+ config: InteractiveFilterConfig,
84
+ value: string
85
+ ): string => {
86
+ if (config.type === 'select') {
87
+ const match = config.options.find((opt) => opt.value === value)
88
+ if (match) return match.text || match.value
89
+ }
90
+ if (config.type === 'dropdown') {
91
+ const match = dropdownOptionsFor(config).find((opt) => opt.value === value)
92
+ if (match) return match.label || match.value
93
+ }
94
+ return value
95
+ }
96
+
97
+ type ChipVisualProps = {
98
+ dark: boolean,
99
+ name: string,
100
+ displayValue: string,
101
+ }
102
+
103
+ const ChipVisual = ({
104
+ dark,
105
+ name,
106
+ displayValue,
107
+ }: ChipVisualProps): React.ReactElement => (
108
+ <div className="pb_interactive_filter_container">
109
+ <Caption
110
+ dark={dark}
111
+ text={name}
112
+ />
113
+ <Flex
114
+ alignItems="center"
115
+ gap="xxs"
116
+ >
117
+ <Title
118
+ dark={dark}
119
+ size={4}
120
+ text={displayValue || '—'}
121
+ />
122
+ <Icon
123
+ color="primary"
124
+ fixedWidth
125
+ icon="angle-down"
126
+ size="xs"
127
+ />
128
+ </Flex>
129
+ </div>
130
+ )
131
+
132
+ type InlineCalendarProps = {
133
+ calendarValue: string,
134
+ config: DatePickerInteractiveConfig,
135
+ onSinglePick: () => void,
136
+ }
137
+
138
+ const InlineCalendar = ({
139
+ calendarValue,
140
+ config,
141
+ onSinglePick,
142
+ }: InlineCalendarProps): React.ReactElement => {
143
+ const containerRef = useRef<HTMLDivElement | null>(null)
144
+
145
+ useEffect(() => {
146
+ if (!containerRef.current) return
147
+ const fp = flatpickr(containerRef.current, {
148
+ inline: true,
149
+ defaultDate: calendarValue || undefined,
150
+ mode: config.mode || 'single',
151
+ dateFormat: config.format || 'm/d/Y',
152
+ minDate: config.minDate,
153
+ maxDate: config.maxDate,
154
+ nextArrow: '<i class="far fa-angle-right"></i>',
155
+ prevArrow: '<i class="far fa-angle-left"></i>',
156
+ onChange: (_selectedDates, dateStr) => {
157
+ config.onChange(dateStr)
158
+ if ((config.mode || 'single') === 'single') onSinglePick()
159
+ },
160
+ }) as Instance
161
+ return () => fp.destroy()
162
+ // eslint-disable-next-line react-hooks/exhaustive-deps
163
+ }, [calendarValue])
164
+
165
+ return <div ref={containerRef} />
166
+ }
167
+
168
+ const InteractiveFilter = ({
169
+ dark = false,
170
+ name,
171
+ value,
172
+ editorValue,
173
+ config,
174
+ }: InteractiveFilterProps): React.ReactElement => {
175
+ const [open, setOpen] = useState(false)
176
+ const pickerId = useMemo(() => uniqueId('interactive-filter-date-'), [])
177
+ const displayValue = labelFor(config, value)
178
+ const activeValue =
179
+ editorValue ??
180
+ config.editorValue ??
181
+ value
182
+
183
+ const renderEditor = () => {
184
+ switch (config.type) {
185
+ case 'select':
186
+ case 'dropdown': {
187
+ const options =
188
+ config.type === 'dropdown'
189
+ ? dropdownOptionsFor(config)
190
+ : config.options.map((opt) => ({
191
+ value: opt.value,
192
+ label: opt.text || opt.value,
193
+ }))
194
+ return (
195
+ <ul
196
+ className="pb_interactive_filter_options"
197
+ role="listbox"
198
+ >
199
+ {options.map((option) => {
200
+ const isActive = option.value === activeValue
201
+ return (
202
+ <li
203
+ aria-selected={isActive}
204
+ className={`pb_interactive_filter_option${
205
+ isActive ? ' active' : ''
206
+ }`}
207
+ key={option.value}
208
+ onClick={() => {
209
+ config.onChange(option.value)
210
+ setOpen(false)
211
+ }}
212
+ onKeyDown={(event) => {
213
+ if (event.key === 'Enter' || event.key === ' ') {
214
+ event.preventDefault()
215
+ config.onChange(option.value)
216
+ setOpen(false)
217
+ }
218
+ }}
219
+ role="option"
220
+ tabIndex={0}
221
+ >
222
+ <span>{option.label}</span>
223
+ </li>
224
+ )
225
+ })}
226
+ </ul>
227
+ )
228
+ }
229
+
230
+ case 'date-picker':
231
+ return (
232
+ <InlineCalendar
233
+ calendarValue={activeValue}
234
+ config={config}
235
+ onSinglePick={() => setOpen(false)}
236
+ />
237
+ )
238
+ }
239
+ }
240
+
241
+ const trigger = (
242
+ <button
243
+ aria-expanded={open}
244
+ aria-haspopup="dialog"
245
+ className={`pb_interactive_filter_trigger${dark ? ' dark' : ''}`}
246
+ data-picker-id={pickerId}
247
+ onClick={() => setOpen((prev) => !prev)}
248
+ type="button"
249
+ >
250
+ <ChipVisual
251
+ dark={dark}
252
+ displayValue={displayValue}
253
+ name={name}
254
+ />
255
+ </button>
256
+ )
257
+
258
+ return (
259
+ <PbReactPopover
260
+ closeOnClick="outside"
261
+ offset
262
+ placement="bottom-start"
263
+ reference={trigger}
264
+ shouldClosePopover={() => setOpen(false)}
265
+ show={open}
266
+ zIndex={10}
267
+ >
268
+ <div
269
+ className={`pb_interactive_filter_editor pb_interactive_filter_editor--${config.type}`}
270
+ >
271
+ {renderEditor()}
272
+ </div>
273
+ </PbReactPopover>
274
+ )
275
+ }
276
+
277
+ export default InteractiveFilter
@@ -1,5 +1,6 @@
1
1
  @import "../tokens/spacing";
2
2
  @import "../tokens/colors";
3
+ @import "../tokens/border_radius";
3
4
 
4
5
  .pb_filter_sort_menu {
5
6
  li {
@@ -70,6 +71,26 @@
70
71
  padding-right: $space_xs;
71
72
  border-right: 1px solid $border_light !important;
72
73
  }
74
+
75
+ .filter.interactive {
76
+ padding-top: 2px;
77
+ padding-bottom: 2px;
78
+ }
79
+ }
80
+
81
+ // Interactive filter chip: clickable button that opens a popover whose
82
+ // contents are the editor for that filter type.
83
+ .pb_interactive_filter_trigger {
84
+ background: transparent;
85
+ border: none;
86
+ cursor: pointer;
87
+ border-radius: 4px;
88
+ text-align: left;
89
+
90
+ &:focus-visible {
91
+ outline: $primary solid 2px;
92
+ outline-offset: -1px;
93
+ }
73
94
  }
74
95
 
75
96
  .maskContainer::after {
@@ -103,4 +124,70 @@
103
124
  opacity:0;
104
125
  }
105
126
  }
106
- }
127
+ }
128
+
129
+ .pb_popover_tooltip.pb_interactive_filter_editor {
130
+ position: fixed;
131
+ top: 0;
132
+ left: 0;
133
+ margin: 0;
134
+ }
135
+
136
+ // Popover contents for an interactive filter.
137
+ .pb_interactive_filter_editor {
138
+ min-width: 220px;
139
+
140
+ .pb_date_picker_kit {
141
+ margin-bottom: 0 !important;
142
+ }
143
+
144
+ // Select editor: option list. (Native HTML <select> can't be auto-opened
145
+ // without a user gesture in modern browsers, so we render options
146
+ // directly — one click on the chip = options visible.)
147
+ .pb_interactive_filter_options {
148
+ list-style: none;
149
+ margin: 0;
150
+ padding: 0;
151
+ border-radius: $border_rad_heavier;
152
+ border: 1px solid $border_light;
153
+ max-height: 280px;
154
+ overflow-y: auto;
155
+ }
156
+
157
+ .pb_interactive_filter_option {
158
+ display: flex;
159
+ align-items: center;
160
+ justify-content: space-between;
161
+ gap: $space_xs;
162
+ padding: $space_xs $space_sm;
163
+ cursor: pointer;
164
+ font-size: $font_base;
165
+ color: $text_lt_default;
166
+ transition: background-color 0.15s ease;
167
+ border-bottom: 1px solid $border_light;
168
+ &:last-child {
169
+ border-bottom: none;
170
+ }
171
+
172
+ &:hover {
173
+ background-color: rgba($primary, 0.08);
174
+ }
175
+
176
+ &.active {
177
+ background-color: $primary;
178
+ color: $white;
179
+ }
180
+ }
181
+
182
+ &.pb_interactive_filter_editor--date-picker {
183
+ // flatpickr inline mode renders directly into our wrapper; suppress its
184
+ // own shadow since the popover already provides the floating surface.
185
+ .flatpickr-calendar {
186
+ box-shadow: none;
187
+ }
188
+ .flatpickr-calendar.inline {
189
+ position: static;
190
+ top: 0;
191
+ }
192
+ }
193
+ }
@@ -1 +1,28 @@
1
+ type SortValue = {
2
+ name: string,
3
+ dir: "asc" | "desc",
4
+ }
5
+
6
+ /**
7
+ * React prop schema source for `yarn generate:ai-metadata`.
8
+ * The Filter implementation lives under ./Filter, but the metadata generator
9
+ * only parses root kit files shaped like `type XProps = { ... }`.
10
+ */
11
+ export type FilterProps = {
12
+ background?: boolean,
13
+ double?: boolean,
14
+ filters?: Record<string, unknown>,
15
+ isCollapsed?: boolean,
16
+ maxHeight?: string,
17
+ minWidth?: string,
18
+ onCollapse?: () => void,
19
+ onSortChange?: (value: SortValue[]) => void,
20
+ placement?: "top" | "bottom" | "left" | "right" | "top-start" | "top-end" | "bottom-start" | "bottom-end" | "right-start" | "right-end" | "left-start" | "left-end",
21
+ popoverProps?: Record<string, unknown>,
22
+ results?: number,
23
+ sortOptions?: Record<string, unknown>,
24
+ sortValue?: SortValue[],
25
+ variant?: string,
26
+ }
27
+
1
28
  export { default } from './Filter'
@@ -0,0 +1,116 @@
1
+ <%
2
+ territory_options = [
3
+ { value: "USA", label: "USA" },
4
+ { value: "Canada", label: "Canada" },
5
+ { value: "Brazil", label: "Brazil" },
6
+ { value: "Philippines", label: "Philippines" },
7
+ ]
8
+
9
+ status_options = [
10
+ { value: "open", label: "Open", id: "open" },
11
+ { value: "in_progress", label: "In progress", id: "in_progress" },
12
+ { value: "resolved", label: "Resolved", id: "resolved" },
13
+ { value: "closed", label: "Closed", id: "closed" },
14
+ ]
15
+
16
+ raw_example = params[:example]
17
+ example_params =
18
+ if raw_example.respond_to?(:permit)
19
+ raw_example.permit(:territory, :status, :date_range, :start_date)
20
+ else
21
+ raw_example || {}
22
+ end
23
+ current_territory = example_params[:territory].presence || "USA"
24
+ current_status = example_params[:status].presence || "open"
25
+ current_date_range = example_params[:date_range].presence || "quickpick-this-week"
26
+ current_start = example_params[:start_date].presence || "05/01/2026"
27
+ status_default = status_options.find { |o| o[:value] == current_status }
28
+ %>
29
+
30
+ <%=
31
+ pb_rails("filter", props: {
32
+ id: "filter-interactive-demo",
33
+ min_width: "360px",
34
+ margin_bottom: "xl",
35
+ template: "default",
36
+ results: 546,
37
+ filters: [
38
+ { name: "Territory", value: current_territory },
39
+ { name: "Status", value: current_status },
40
+ { name: "Date range", value: current_date_range },
41
+ { name: "Start date", value: current_start },
42
+ ],
43
+ interactive_filters: [
44
+ {
45
+ name: "Territory",
46
+ type: "select",
47
+ options: territory_options,
48
+ target_input: "filter-interactive-territory",
49
+ auto_submit: true,
50
+ },
51
+ {
52
+ name: "Status",
53
+ type: "dropdown",
54
+ options: status_options,
55
+ target_input: "filter-interactive-status",
56
+ auto_submit: true,
57
+ },
58
+ {
59
+ name: "Date range",
60
+ type: "dropdown",
61
+ variant: "quickpick",
62
+ target_input: "filter-interactive-date-range",
63
+ auto_submit: true,
64
+ },
65
+ {
66
+ name: "Start date",
67
+ type: "date-picker",
68
+ target_input: "filter-interactive-start",
69
+ format: "m/d/Y",
70
+ auto_submit: true,
71
+ },
72
+ ],
73
+ sort_menu: [
74
+ { item: "Popularity", link: "?q[sorts]=managers_popularity+asc", active: true, direction: "desc" },
75
+ ],
76
+ }) do
77
+ %>
78
+ <%= pb_rails("form", props: { form_system_options: { scope: :example, method: :get } }) do |form| %>
79
+ <%= pb_rails("select", props: {
80
+ label: "Territory",
81
+ name: "territory",
82
+ options: territory_options.map { |o| { value: o[:value], text: o[:label] } },
83
+ value: current_territory,
84
+ input_options: { id: "filter-interactive-territory" }
85
+ }) %>
86
+
87
+ <%= pb_rails("dropdown", props: {
88
+ id: "filter-interactive-status",
89
+ label: "Status",
90
+ name: "status",
91
+ options: status_options,
92
+ default_value: status_default,
93
+ margin_bottom: "sm",
94
+ }) %>
95
+
96
+ <%= pb_rails("dropdown", props: {
97
+ id: "filter-interactive-date-range",
98
+ label: "Date range",
99
+ name: "date_range",
100
+ variant: "quickpick",
101
+ margin_bottom: "sm",
102
+ }) %>
103
+
104
+ <%= pb_rails("date_picker", props: {
105
+ label: "Start date",
106
+ name: "start_date",
107
+ picker_id: "filter-interactive-start",
108
+ default_date: current_start,
109
+ }) %>
110
+
111
+ <%= form.actions do |action| %>
112
+ <%= action.submit props: { text: "Apply" } %>
113
+ <%= action.button props: { type: "reset", text: "Clear", variant: "secondary" } %>
114
+ <% end %>
115
+ <% end %>
116
+ <% end %>
@@ -0,0 +1,12 @@
1
+ Click an applied filter chip to edit it inline. `interactive_filters` supports:
2
+
3
+ - `type: 'select'` / `'dropdown'`: pick from a list of options.
4
+ - `type: 'date-picker'`: inline calendar. Supports `format`, `min_date`, `max_date`, and `mode`.
5
+
6
+ Each entry needs a `target_input` that points to the form control it updates. For `select` and `date-picker`, use the input's `id`. For `dropdown`, use the Dropdown kit's `id`.
7
+
8
+ For date ranges, use `type: 'dropdown'` with `variant: 'quickpick'`. The Filter kit generates the same quickpick options as Dropdown, so no `options` are needed. Values are quickpick ids, such as `quickpick-this-week`.
9
+
10
+ Chip edits update the linked control inside the filter popover. Click **Apply** to submit, then pass the submitted values back into `filters` so chips re-render with the latest labels.
11
+
12
+ Optional `auto_submit: true` on a chip entry submits the form immediately when a chip value is picked.
@@ -0,0 +1,153 @@
1
+ import React, { useState } from "react";
2
+
3
+ import Filter from "../_filter";
4
+
5
+ import Button from "../../pb_button/_button";
6
+ import DatePicker from "../../pb_date_picker/_date_picker";
7
+ import Dropdown from "../../pb_dropdown/_dropdown";
8
+ import Flex from "../../pb_flex/_flex";
9
+ import Select from "../../pb_select/_select";
10
+
11
+ const territorySelectOptions = [
12
+ { value: "USA" },
13
+ { value: "Canada" },
14
+ { value: "Brazil" },
15
+ { value: "Philippines" },
16
+ ];
17
+
18
+ const statusDropdownOptions = [
19
+ { id: "open", label: "Open", value: "open" },
20
+ { id: "in_progress", label: "In progress", value: "in_progress" },
21
+ { id: "resolved", label: "Resolved", value: "resolved" },
22
+ { id: "closed", label: "Closed", value: "closed" },
23
+ ];
24
+
25
+ const INITIAL_FILTERS = {
26
+ territory: "USA",
27
+ status: "open",
28
+ dateRange: "quickpick-this-week",
29
+ startDate: "05/01/2026",
30
+ };
31
+
32
+ const statusOptionForValue = (value) =>
33
+ value
34
+ ? statusDropdownOptions.find((opt) => opt.value === value)
35
+ : undefined;
36
+
37
+ const FilterInteractive = (props) => {
38
+ const [filters, setFilters] = useState(INITIAL_FILTERS);
39
+
40
+ const updateFilter = (key) => (value) =>
41
+ setFilters((prev) => ({ ...prev, [key]: value }));
42
+
43
+ const handleClear = () => {
44
+ setFilters(INITIAL_FILTERS);
45
+ };
46
+
47
+ return (
48
+ <Filter
49
+ {...props}
50
+ filters={{
51
+ Territory: filters.territory,
52
+ Status: filters.status,
53
+ "Date range": filters.dateRange,
54
+ "Start date": filters.startDate,
55
+ }}
56
+ interactiveFilters={{
57
+ Territory: {
58
+ type: "select",
59
+ options: territorySelectOptions,
60
+ value: filters.territory,
61
+ onChange: updateFilter("territory"),
62
+ },
63
+ Status: {
64
+ type: "dropdown",
65
+ options: statusDropdownOptions,
66
+ value: filters.status,
67
+ onChange: updateFilter("status"),
68
+ },
69
+ "Date range": {
70
+ type: "dropdown",
71
+ variant: "quickpick",
72
+ value: filters.dateRange,
73
+ onChange: updateFilter("dateRange"),
74
+ },
75
+ "Start date": {
76
+ type: "date-picker",
77
+ value: filters.startDate,
78
+ onChange: updateFilter("startDate"),
79
+ format: "m/d/Y",
80
+ },
81
+ }}
82
+ minWidth="360px"
83
+ results={546}
84
+ sortOptions={{
85
+ popularity: "Popularity",
86
+ }}
87
+ sortValue={[{ name: "popularity", dir: "desc" }]}
88
+ >
89
+ {({ closePopover }) => (
90
+ <form>
91
+ <Select
92
+ {...props}
93
+ label="Territory"
94
+ name="location"
95
+ onChange={(e) => updateFilter("territory")(e.target.value)}
96
+ options={territorySelectOptions}
97
+ value={filters.territory}
98
+ />
99
+ <Dropdown
100
+ {...props}
101
+ blankSelection="Select status..."
102
+ defaultValue={statusOptionForValue(filters.status)}
103
+ key={filters.status || "cleared"}
104
+ label="Status"
105
+ marginBottom="sm"
106
+ onSelect={(option) =>
107
+ updateFilter("status")(option ? option.value : "")
108
+ }
109
+ options={statusDropdownOptions}
110
+ />
111
+
112
+ <Dropdown
113
+ {...props}
114
+ key={filters.dateRange || "cleared"}
115
+ label="Date range"
116
+ marginBottom="sm"
117
+ onSelect={(option) =>
118
+ updateFilter("dateRange")(option ? option.id : "")
119
+ }
120
+ variant="quickpick"
121
+ />
122
+
123
+ <DatePicker
124
+ {...props}
125
+ inputValue={filters.startDate}
126
+ label="Start date"
127
+ onChange={updateFilter("startDate")}
128
+ pickerId="filter-panel-start-date"
129
+ />
130
+
131
+ <Flex
132
+ {...props}
133
+ spacing="between"
134
+ >
135
+ <Button
136
+ {...props}
137
+ onClick={closePopover}
138
+ text="Apply"
139
+ />
140
+ <Button
141
+ {...props}
142
+ onClick={handleClear}
143
+ text="Clear"
144
+ variant="secondary"
145
+ />
146
+ </Flex>
147
+ </form>
148
+ )}
149
+ </Filter>
150
+ );
151
+ };
152
+
153
+ export default FilterInteractive;
@@ -0,0 +1,10 @@
1
+ Click an applied filter chip to edit it inline. `interactiveFilters` supports:
2
+
3
+ - `type: 'select'` / `'dropdown'`: pick from a list of options.
4
+ - `type: 'date-picker'`: inline calendar. Supports `format`, `minDate`, `maxDate`, and `mode`.
5
+
6
+ For date ranges, use `type: 'dropdown'` with `variant: 'quickpick'`. The Filter kit generates the same quickpick options as Dropdown, so no `options` are needed. Values are quickpick ids, such as `quickpick-this-week`.
7
+
8
+ Keep `filters`, `interactiveFilters.value`, and the filter popover fields backed by the same state so chip labels and form controls stay in sync.
9
+
10
+ On Rails, pass `interactive_filters` with `target_input` so chip picks update the linked form control. Re-read submitted params in your view after Apply so `filters` reflects the new values.