playbook_ui 18.2.0 → 18.3.0.pre.alpha.PLAY3342advancedtablereactmulticolumnselectablerow21082

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 (466) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_advanced_table/Components/CollapsibleTrail.tsx +8 -1
  3. data/app/pb_kits/playbook/pb_advanced_table/Components/RegularTableView.tsx +39 -8
  4. data/app/pb_kits/playbook/pb_advanced_table/Components/TableActionBar.tsx +62 -2
  5. data/app/pb_kits/playbook/pb_advanced_table/Components/VirtualizedTableView.tsx +24 -4
  6. data/app/pb_kits/playbook/pb_advanced_table/SubKits/TableHeader.tsx +105 -66
  7. data/app/pb_kits/playbook/pb_advanced_table/Utilities/RowUtils.ts +29 -0
  8. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +83 -5
  9. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +3 -0
  10. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.html.erb +1 -1
  11. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.rb +8 -0
  12. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.test.jsx +1100 -1
  13. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility.jsx +1 -1
  14. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility.md +5 -2
  15. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_custom.md +3 -1
  16. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_multi_select_all.jsx +82 -0
  17. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_multi_select_all.md +3 -0
  18. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_with_state.md +3 -1
  19. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_group_separators.jsx +67 -0
  20. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_group_separators.md +7 -0
  21. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_group_separators_rails.html.erb +78 -0
  22. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_group_separators_rails.md +3 -0
  23. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows.jsx +177 -58
  24. data/app/pb_kits/playbook/pb_advanced_table/docs/_playground.json +17 -2
  25. data/app/pb_kits/playbook/pb_advanced_table/docs/_playground.overrides.json +8 -1
  26. data/app/pb_kits/playbook/pb_advanced_table/docs/advanced_table_mock_data_group_separators.json +328 -0
  27. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +3 -0
  28. data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +2 -0
  29. data/app/pb_kits/playbook/pb_advanced_table/index.js +39 -2
  30. data/app/pb_kits/playbook/pb_advanced_table/kit.schema.json +44 -16
  31. data/app/pb_kits/playbook/pb_advanced_table/table_body.html.erb +2 -2
  32. data/app/pb_kits/playbook/pb_advanced_table/table_body.rb +53 -23
  33. data/app/pb_kits/playbook/pb_advanced_table/table_header.rb +1 -1
  34. data/app/pb_kits/playbook/pb_advanced_table/table_row.html.erb +1 -1
  35. data/app/pb_kits/playbook/pb_advanced_table/table_row.rb +2 -0
  36. data/app/pb_kits/playbook/pb_avatar/_avatar.tsx +3 -1
  37. data/app/pb_kits/playbook/pb_avatar/kit.schema.json +23 -10
  38. data/app/pb_kits/playbook/pb_background/docs/_playground.json +1 -0
  39. data/app/pb_kits/playbook/pb_background/kit.schema.json +10 -3
  40. data/app/pb_kits/playbook/pb_badge/docs/_playground.json +2 -0
  41. data/app/pb_kits/playbook/pb_badge/kit.schema.json +27 -13
  42. data/app/pb_kits/playbook/pb_body/docs/_playground.json +3 -3
  43. data/app/pb_kits/playbook/pb_body/kit.schema.json +14 -5
  44. data/app/pb_kits/playbook/pb_button/_button.tsx +3 -1
  45. data/app/pb_kits/playbook/pb_button/button.rb +3 -0
  46. data/app/pb_kits/playbook/pb_button/button.test.js +154 -0
  47. data/app/pb_kits/playbook/pb_button/docs/_button_options_rails.md +5 -0
  48. data/app/pb_kits/playbook/pb_button/docs/_button_options_react.md +9 -0
  49. data/app/pb_kits/playbook/pb_button/docs/_playground.json +4 -2
  50. data/app/pb_kits/playbook/pb_button/docs/_playground.overrides.json +1 -1
  51. data/app/pb_kits/playbook/pb_button/docs/example.yml +1 -1
  52. data/app/pb_kits/playbook/pb_button/kit.schema.json +31 -27
  53. data/app/pb_kits/playbook/pb_caption/kit.schema.json +17 -7
  54. data/app/pb_kits/playbook/pb_card/docs/_playground.json +1 -0
  55. data/app/pb_kits/playbook/pb_card/kit.schema.json +2 -1
  56. data/app/pb_kits/playbook/pb_checkbox/docs/_playground.json +6 -1
  57. data/app/pb_kits/playbook/pb_checkbox/kit.schema.json +10 -5
  58. data/app/pb_kits/playbook/pb_collapsible/child_kits/CollapsibleMain.tsx +4 -4
  59. data/app/pb_kits/playbook/pb_collapsible/collapsible.test.js +81 -2
  60. data/app/pb_kits/playbook/pb_contact/_contact.tsx +4 -1
  61. data/app/pb_kits/playbook/pb_contact/docs/_playground.json +1 -0
  62. data/app/pb_kits/playbook/pb_contact/kit.schema.json +3 -1
  63. data/app/pb_kits/playbook/pb_copy_button/docs/_playground.json +5 -1
  64. data/app/pb_kits/playbook/pb_copy_button/kit.schema.json +10 -5
  65. data/app/pb_kits/playbook/pb_currency/docs/_playground.json +1 -1
  66. data/app/pb_kits/playbook/pb_currency/kit.schema.json +6 -2
  67. data/app/pb_kits/playbook/pb_dashboard_value/docs/_playground.json +2 -2
  68. data/app/pb_kits/playbook/pb_dashboard_value/kit.schema.json +4 -2
  69. data/app/pb_kits/playbook/pb_date/_date.tsx +3 -1
  70. data/app/pb_kits/playbook/pb_date/date.test.js +1 -1
  71. data/app/pb_kits/playbook/pb_date/docs/_playground.json +1 -0
  72. data/app/pb_kits/playbook/pb_date/kit.schema.json +17 -7
  73. data/app/pb_kits/playbook/pb_date_picker/date_picker.test.js +4 -0
  74. data/app/pb_kits/playbook/pb_date_picker/docs/_playground.json +4 -1
  75. data/app/pb_kits/playbook/pb_date_picker/kit.schema.json +32 -14
  76. data/app/pb_kits/playbook/pb_date_range_inline/_date_range_inline.tsx +3 -1
  77. data/app/pb_kits/playbook/pb_date_range_inline/docs/_playground.json +1 -0
  78. data/app/pb_kits/playbook/pb_date_range_inline/kit.schema.json +3 -1
  79. data/app/pb_kits/playbook/pb_date_range_stacked/_date_range_stacked.tsx +3 -1
  80. data/app/pb_kits/playbook/pb_date_range_stacked/kit.schema.json +1 -0
  81. data/app/pb_kits/playbook/pb_date_stacked/_date_stacked.tsx +4 -1
  82. data/app/pb_kits/playbook/pb_date_stacked/date_stacked.test.js +1 -0
  83. data/app/pb_kits/playbook/pb_date_stacked/kit.schema.json +1 -0
  84. data/app/pb_kits/playbook/pb_date_time/_date_time.tsx +3 -1
  85. data/app/pb_kits/playbook/pb_date_time/dateTime.test.js +1 -0
  86. data/app/pb_kits/playbook/pb_date_time/docs/_playground.json +2 -1
  87. data/app/pb_kits/playbook/pb_date_time/kit.schema.json +3 -1
  88. data/app/pb_kits/playbook/pb_date_time_stacked/_date_time_stacked.tsx +2 -1
  89. data/app/pb_kits/playbook/pb_date_time_stacked/docs/_playground.json +1 -0
  90. data/app/pb_kits/playbook/pb_date_time_stacked/kit.schema.json +3 -1
  91. data/app/pb_kits/playbook/pb_date_year_stacked/_date_year_stacked.tsx +3 -1
  92. data/app/pb_kits/playbook/pb_date_year_stacked/date_year_stacked.test.js +1 -0
  93. data/app/pb_kits/playbook/pb_date_year_stacked/kit.schema.json +1 -0
  94. data/app/pb_kits/playbook/pb_detail/docs/_playground.json +2 -1
  95. data/app/pb_kits/playbook/pb_detail/kit.schema.json +2 -1
  96. data/app/pb_kits/playbook/pb_dialog/docs/_playground.json +1 -1
  97. data/app/pb_kits/playbook/pb_dialog/kit.schema.json +22 -9
  98. data/app/pb_kits/playbook/pb_distribution_bar/docs/_playground.json +2 -2
  99. data/app/pb_kits/playbook/pb_distribution_bar/kit.schema.json +2 -1
  100. data/app/pb_kits/playbook/pb_draggable/utilities/touchDrag.ts +10 -0
  101. data/app/pb_kits/playbook/pb_dropdown/_dropdown.scss +112 -0
  102. data/app/pb_kits/playbook/pb_dropdown/_dropdown.tsx +121 -15
  103. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_draggable_pills.html.erb +51 -0
  104. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_draggable_pills.jsx +62 -0
  105. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_draggable_pills_rails.md +9 -0
  106. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_draggable_pills_react.md +9 -0
  107. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_form.jsx +50 -0
  108. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_form_react.md +9 -0
  109. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_option_creation.html.erb +16 -0
  110. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_option_creation.jsx +27 -0
  111. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_option_creation_rails.md +9 -0
  112. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_option_creation_react.md +9 -0
  113. data/app/pb_kits/playbook/pb_dropdown/docs/_playground.json +39 -3
  114. data/app/pb_kits/playbook/pb_dropdown/docs/_playground.overrides.json +13 -2
  115. data/app/pb_kits/playbook/pb_dropdown/docs/example.yml +5 -0
  116. data/app/pb_kits/playbook/pb_dropdown/docs/index.js +4 -1
  117. data/app/pb_kits/playbook/pb_dropdown/dropdown.html.erb +2 -2
  118. data/app/pb_kits/playbook/pb_dropdown/dropdown.rb +24 -1
  119. data/app/pb_kits/playbook/pb_dropdown/dropdown.test.jsx +235 -1
  120. data/app/pb_kits/playbook/pb_dropdown/dropdown_creation.test.jsx +414 -0
  121. data/app/pb_kits/playbook/pb_dropdown/dropdown_form.test.jsx +173 -0
  122. data/app/pb_kits/playbook/pb_dropdown/dropdown_index.test.js +545 -0
  123. data/app/pb_kits/playbook/pb_dropdown/hooks/useHandleOnKeydown.tsx +22 -5
  124. data/app/pb_kits/playbook/pb_dropdown/index.js +260 -37
  125. data/app/pb_kits/playbook/pb_dropdown/keyboard_accessibility.js +3 -1
  126. data/app/pb_kits/playbook/pb_dropdown/kit.schema.json +59 -9
  127. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownContainer.tsx +43 -25
  128. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownFormFields.tsx +83 -0
  129. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownOption.tsx +13 -5
  130. data/app/pb_kits/playbook/pb_dropdown/subcomponents/MultiSelectTriggerDisplay.tsx +336 -31
  131. data/app/pb_kits/playbook/pb_dropdown/utilities/optionCreation.ts +21 -0
  132. data/app/pb_kits/playbook/pb_dropdown/utilities/pillReorder.js +281 -0
  133. data/app/pb_kits/playbook/pb_dropdown/utilities/quickpickDateSync.test.ts +24 -0
  134. data/app/pb_kits/playbook/pb_dropdown/utilities/usePillDropIndicator.ts +144 -0
  135. data/app/pb_kits/playbook/pb_empty_state/docs/_playground.json +1 -1
  136. data/app/pb_kits/playbook/pb_empty_state/kit.schema.json +2 -1
  137. data/app/pb_kits/playbook/pb_file_upload/docs/_playground.json +3 -2
  138. data/app/pb_kits/playbook/pb_file_upload/kit.schema.json +8 -3
  139. data/app/pb_kits/playbook/pb_filter/Filter/SortMenu.tsx +8 -1
  140. data/app/pb_kits/playbook/pb_filter/docs/_filter_one_click.html.erb +38 -0
  141. data/app/pb_kits/playbook/pb_filter/docs/_filter_one_click.jsx +69 -0
  142. data/app/pb_kits/playbook/pb_filter/docs/_filter_one_click.md +1 -0
  143. data/app/pb_kits/playbook/pb_filter/docs/example.yml +2 -0
  144. data/app/pb_kits/playbook/pb_filter/docs/index.js +2 -1
  145. data/app/pb_kits/playbook/pb_filter/filter.html.erb +4 -4
  146. data/app/pb_kits/playbook/pb_filter/filter.rb +28 -0
  147. data/app/pb_kits/playbook/pb_filter/filter.test.js +41 -0
  148. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/_playground.json +4 -4
  149. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/fixed_confirmation_toast.test.js +1 -2
  150. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/kit.schema.json +6 -3
  151. data/app/pb_kits/playbook/pb_flex/docs/_playground.json +3 -0
  152. data/app/pb_kits/playbook/pb_flex/kit.schema.json +27 -12
  153. data/app/pb_kits/playbook/pb_form/docs/_description_react.md +3 -0
  154. data/app/pb_kits/playbook/pb_form/docs/_form_default_values.jsx +898 -0
  155. data/app/pb_kits/playbook/pb_form/docs/_form_default_values_react.md +3 -0
  156. data/app/pb_kits/playbook/pb_form/docs/_form_defaults.jsx +879 -0
  157. data/app/pb_kits/playbook/pb_form/docs/_form_defaults_react.md +29 -0
  158. data/app/pb_kits/playbook/pb_form/docs/_form_loading.jsx +75 -0
  159. data/app/pb_kits/playbook/pb_form/docs/{_form_loading.md → _form_loading_rails.md} +1 -0
  160. data/app/pb_kits/playbook/pb_form/docs/_form_loading_react.md +1 -0
  161. data/app/pb_kits/playbook/pb_form/docs/_form_model_values.jsx +147 -0
  162. data/app/pb_kits/playbook/pb_form/docs/_form_model_values_react.md +16 -0
  163. data/app/pb_kits/playbook/pb_form/docs/_form_multi_column.jsx +164 -0
  164. data/app/pb_kits/playbook/pb_form/docs/_form_multi_column_react.md +3 -0
  165. data/app/pb_kits/playbook/pb_form/docs/_form_validation.jsx +1057 -0
  166. data/app/pb_kits/playbook/pb_form/docs/_form_validation_react.md +26 -0
  167. data/app/pb_kits/playbook/pb_form/docs/example.yml +7 -0
  168. data/app/pb_kits/playbook/pb_form/form.rb +1 -1
  169. data/app/pb_kits/playbook/pb_form/kit.schema.json +1 -6
  170. data/app/pb_kits/playbook/pb_form/pb_form_validation.js +1 -0
  171. data/app/pb_kits/playbook/pb_form_group/_form_group.scss +1 -4
  172. data/app/pb_kits/playbook/pb_form_pill/docs/_playground.json +3 -0
  173. data/app/pb_kits/playbook/pb_form_pill/kit.schema.json +6 -3
  174. data/app/pb_kits/playbook/pb_full_screen/_full_screen.scss +6 -0
  175. data/app/pb_kits/playbook/pb_full_screen/_full_screen.tsx +11 -2
  176. data/app/pb_kits/playbook/pb_full_screen/docs/_full_screen_advanced_table_sticky_header.jsx +73 -0
  177. data/app/pb_kits/playbook/pb_full_screen/docs/_full_screen_advanced_table_sticky_header.md +1 -0
  178. data/app/pb_kits/playbook/pb_full_screen/docs/_playground.json +3 -3
  179. data/app/pb_kits/playbook/pb_full_screen/docs/example.yml +1 -0
  180. data/app/pb_kits/playbook/pb_full_screen/docs/index.js +1 -0
  181. data/app/pb_kits/playbook/pb_full_screen/full_screen.test.jsx +4 -2
  182. data/app/pb_kits/playbook/pb_full_screen/kit.schema.json +8 -4
  183. data/app/pb_kits/playbook/pb_hashtag/docs/_playground.json +2 -2
  184. data/app/pb_kits/playbook/pb_hashtag/kit.schema.json +2 -1
  185. data/app/pb_kits/playbook/pb_highlight/kit.schema.json +2 -1
  186. data/app/pb_kits/playbook/pb_icon/_icon.tsx +6 -1
  187. data/app/pb_kits/playbook/pb_icon/docs/_playground.json +2 -2
  188. data/app/pb_kits/playbook/pb_icon/kit.schema.json +31 -13
  189. data/app/pb_kits/playbook/pb_icon_circle/_icon_circle.tsx +3 -1
  190. data/app/pb_kits/playbook/pb_icon_circle/docs/_playground.json +2 -2
  191. data/app/pb_kits/playbook/pb_icon_circle/kit.schema.json +3 -1
  192. data/app/pb_kits/playbook/pb_icon_stat_value/docs/_playground.json +3 -2
  193. data/app/pb_kits/playbook/pb_icon_stat_value/kit.schema.json +4 -2
  194. data/app/pb_kits/playbook/pb_image/_image.tsx +5 -3
  195. data/app/pb_kits/playbook/pb_image/docs/_playground.json +27 -27
  196. data/app/pb_kits/playbook/pb_image/kit.schema.json +57 -24
  197. data/app/pb_kits/playbook/pb_label_pill/_label_pill.tsx +3 -1
  198. data/app/pb_kits/playbook/pb_label_pill/kit.schema.json +1 -0
  199. data/app/pb_kits/playbook/pb_label_value/docs/_playground.json +2 -2
  200. data/app/pb_kits/playbook/pb_label_value/kit.schema.json +2 -1
  201. data/app/pb_kits/playbook/pb_layout/docs/_playground.json +2 -2
  202. data/app/pb_kits/playbook/pb_layout/kit.schema.json +43 -20
  203. data/app/pb_kits/playbook/pb_legend/_legend.tsx +3 -1
  204. data/app/pb_kits/playbook/pb_legend/docs/_playground.json +2 -2
  205. data/app/pb_kits/playbook/pb_legend/kit.schema.json +3 -1
  206. data/app/pb_kits/playbook/pb_lightbox/_lightbox.tsx +2 -2
  207. data/app/pb_kits/playbook/pb_lightbox/kit.schema.json +84 -0
  208. data/app/pb_kits/playbook/pb_link/docs/_playground.json +6 -3
  209. data/app/pb_kits/playbook/pb_link/kit.schema.json +14 -6
  210. data/app/pb_kits/playbook/pb_list/_list_item.tsx +6 -3
  211. data/app/pb_kits/playbook/pb_list/docs/_playground.json +2 -2
  212. data/app/pb_kits/playbook/pb_list/kit.schema.json +2 -1
  213. data/app/pb_kits/playbook/pb_loading_inline/docs/_playground.json +0 -1
  214. data/app/pb_kits/playbook/pb_loading_inline/kit.schema.json +4 -1
  215. data/app/pb_kits/playbook/pb_map/docs/_map_default.md +22 -3
  216. data/app/pb_kits/playbook/pb_map/kit.schema.json +4 -6
  217. data/app/pb_kits/playbook/pb_message/kit.schema.json +2 -1
  218. data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.tsx +4 -1
  219. data/app/pb_kits/playbook/pb_multiple_users/docs/_playground.json +2 -1
  220. data/app/pb_kits/playbook/pb_multiple_users/kit.schema.json +19 -11
  221. data/app/pb_kits/playbook/pb_multiple_users_stacked/docs/_playground.json +1 -0
  222. data/app/pb_kits/playbook/pb_multiple_users_stacked/kit.schema.json +2 -1
  223. data/app/pb_kits/playbook/pb_nav/_nav_item.test.js +17 -0
  224. data/app/pb_kits/playbook/pb_nav/docs/_playground.json +2 -0
  225. data/app/pb_kits/playbook/pb_nav/kit.schema.json +4 -2
  226. data/app/pb_kits/playbook/pb_online_status/_online_status.tsx +3 -1
  227. data/app/pb_kits/playbook/pb_online_status/kit.schema.json +1 -0
  228. data/app/pb_kits/playbook/pb_overlay/docs/_playground.json +3 -3
  229. data/app/pb_kits/playbook/pb_overlay/kit.schema.json +22 -12
  230. data/app/pb_kits/playbook/pb_pagination/kit.schema.json +6 -3
  231. data/app/pb_kits/playbook/pb_passphrase/docs/_playground.json +6 -4
  232. data/app/pb_kits/playbook/pb_passphrase/kit.schema.json +10 -5
  233. data/app/pb_kits/playbook/pb_pb_bar_graph/pbbargraph.test.jsx +1 -2
  234. data/app/pb_kits/playbook/pb_pb_circle_chart/pb_circle_chart.test.jsx +1 -2
  235. data/app/pb_kits/playbook/pb_pb_gauge_chart/kit.schema.json +2 -1
  236. data/app/pb_kits/playbook/pb_pb_gauge_chart/pb_gauge_chart.test.jsx +1 -2
  237. data/app/pb_kits/playbook/pb_pb_line_graph/pb_line_graph.test.jsx +1 -2
  238. data/app/pb_kits/playbook/pb_person/_person.tsx +3 -1
  239. data/app/pb_kits/playbook/pb_person/kit.schema.json +1 -0
  240. data/app/pb_kits/playbook/pb_person_contact/docs/_playground.json +3 -3
  241. data/app/pb_kits/playbook/pb_person_contact/kit.schema.json +2 -1
  242. data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.scss +3 -7
  243. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_validation.html.erb +1 -1
  244. data/app/pb_kits/playbook/pb_phone_number_input/docs/_playground.json +3 -0
  245. data/app/pb_kits/playbook/pb_phone_number_input/img/flags.webp +0 -0
  246. data/app/pb_kits/playbook/pb_phone_number_input/img/flags@2x.webp +0 -0
  247. data/app/pb_kits/playbook/pb_phone_number_input/img/globe.webp +0 -0
  248. data/app/pb_kits/playbook/pb_phone_number_input/img/globe@2x.webp +0 -0
  249. data/app/pb_kits/playbook/pb_phone_number_input/intlTelInput.scss +13 -6
  250. data/app/pb_kits/playbook/pb_phone_number_input/kit.schema.json +6 -3
  251. data/app/pb_kits/playbook/pb_phone_number_input/phone_number_input_assets.test.js +61 -0
  252. data/app/pb_kits/playbook/pb_pill/_pill.tsx +3 -1
  253. data/app/pb_kits/playbook/pb_pill/kit.schema.json +1 -0
  254. data/app/pb_kits/playbook/pb_popover/docs/_playground.json +1 -2
  255. data/app/pb_kits/playbook/pb_popover/index.ts +47 -8
  256. data/app/pb_kits/playbook/pb_popover/kit.schema.json +18 -9
  257. data/app/pb_kits/playbook/pb_popover/popover_index.test.js +456 -0
  258. data/app/pb_kits/playbook/pb_progress_pills/docs/_playground.json +1 -0
  259. data/app/pb_kits/playbook/pb_progress_pills/kit.schema.json +2 -1
  260. data/app/pb_kits/playbook/pb_progress_simple/docs/_playground.json +3 -2
  261. data/app/pb_kits/playbook/pb_progress_simple/kit.schema.json +4 -2
  262. data/app/pb_kits/playbook/pb_progress_step/_progress_step_item.tsx +3 -1
  263. data/app/pb_kits/playbook/pb_rich_text_editor/docs/_playground.json +10 -3
  264. data/app/pb_kits/playbook/pb_rich_text_editor/docs/_playground.overrides.json +1 -1
  265. data/app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_advanced_required_indicator.md +2 -2
  266. data/app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_rails_default.md +3 -4
  267. data/app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_rails_extensions.md +1 -1
  268. data/app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_rails_markdown_support.md +1 -1
  269. data/app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_rails_required_indicator.html.erb +9 -0
  270. data/app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_rails_required_indicator.md +3 -0
  271. data/app/pb_kits/playbook/pb_rich_text_editor/docs/example.yml +1 -0
  272. data/app/pb_kits/playbook/pb_rich_text_editor/kit.schema.json +18 -9
  273. data/app/pb_kits/playbook/pb_rich_text_editor/rich_text_editor.html.erb +3 -7
  274. data/app/pb_kits/playbook/pb_rich_text_editor/rich_text_editor_rails.js +26 -21
  275. data/app/pb_kits/playbook/pb_rich_text_editor/rich_text_editor_rails.test.js +85 -1
  276. data/app/pb_kits/playbook/pb_selectable_card/docs/_playground.json +1 -0
  277. data/app/pb_kits/playbook/pb_selectable_card/kit.schema.json +4 -2
  278. data/app/pb_kits/playbook/pb_selectable_card_icon/_selectable_card_icon.scss +0 -9
  279. data/app/pb_kits/playbook/pb_selectable_card_icon/docs/_playground.json +1 -0
  280. data/app/pb_kits/playbook/pb_selectable_card_icon/docs/_selectable_card_icon_custom.jsx +1 -1
  281. data/app/pb_kits/playbook/pb_selectable_card_icon/kit.schema.json +2 -1
  282. data/app/pb_kits/playbook/pb_selectable_icon/_selectable_icon.scss +0 -7
  283. data/app/pb_kits/playbook/pb_source/_source.tsx +3 -1
  284. data/app/pb_kits/playbook/pb_source/docs/_playground.json +1 -0
  285. data/app/pb_kits/playbook/pb_source/kit.schema.json +3 -1
  286. data/app/pb_kits/playbook/pb_source/source.rb +1 -1
  287. data/app/pb_kits/playbook/pb_star_rating/docs/_playground.json +1 -0
  288. data/app/pb_kits/playbook/pb_star_rating/kit.schema.json +15 -7
  289. data/app/pb_kits/playbook/pb_stat_change/_stat_change.tsx +3 -1
  290. data/app/pb_kits/playbook/pb_stat_change/docs/_playground.json +1 -0
  291. data/app/pb_kits/playbook/pb_stat_change/kit.schema.json +3 -1
  292. data/app/pb_kits/playbook/pb_stat_value/docs/_playground.json +3 -1
  293. data/app/pb_kits/playbook/pb_stat_value/kit.schema.json +2 -1
  294. data/app/pb_kits/playbook/pb_table/docs/_playground.json +5 -1
  295. data/app/pb_kits/playbook/pb_table/kit.schema.json +28 -11
  296. data/app/pb_kits/playbook/pb_text_input/docs/_playground.json +3 -0
  297. data/app/pb_kits/playbook/pb_text_input/kit.schema.json +22 -9
  298. data/app/pb_kits/playbook/pb_textarea/_textarea.tsx +4 -1
  299. data/app/pb_kits/playbook/pb_time/kit.schema.json +13 -5
  300. data/app/pb_kits/playbook/pb_time_picker/docs/_playground.json +1 -0
  301. data/app/pb_kits/playbook/pb_time_picker/kit.schema.json +2 -1
  302. data/app/pb_kits/playbook/pb_time_range_inline/_time_range_inline.tsx +3 -1
  303. data/app/pb_kits/playbook/pb_time_range_inline/kit.schema.json +13 -5
  304. data/app/pb_kits/playbook/pb_time_stacked/_time_stacked.tsx +3 -1
  305. data/app/pb_kits/playbook/pb_time_stacked/kit.schema.json +1 -0
  306. data/app/pb_kits/playbook/pb_timeline/_item.tsx +3 -1
  307. data/app/pb_kits/playbook/pb_timestamp/_timestamp.tsx +3 -1
  308. data/app/pb_kits/playbook/pb_timestamp/kit.schema.json +1 -0
  309. data/app/pb_kits/playbook/pb_timestamp/timestamp.test.js +1 -0
  310. data/app/pb_kits/playbook/pb_title/kit.schema.json +23 -10
  311. data/app/pb_kits/playbook/pb_title_count/docs/_playground.json +1 -0
  312. data/app/pb_kits/playbook/pb_title_count/kit.schema.json +2 -1
  313. data/app/pb_kits/playbook/pb_tooltip/docs/_playground.json +5 -1
  314. data/app/pb_kits/playbook/pb_tooltip/kit.schema.json +10 -5
  315. data/app/pb_kits/playbook/pb_typeahead/_typeahead.scss +73 -0
  316. data/app/pb_kits/playbook/pb_typeahead/_typeahead.test.jsx +285 -12
  317. data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +22 -14
  318. data/app/pb_kits/playbook/pb_typeahead/components/PillRenderer.tsx +15 -11
  319. data/app/pb_kits/playbook/pb_typeahead/components/ValueContainer.tsx +29 -30
  320. data/app/pb_kits/playbook/pb_typeahead/components/usePillDropIndicator.ts +155 -0
  321. data/app/pb_kits/playbook/pb_typeahead/docs/_playground.json +5 -5
  322. data/app/pb_kits/playbook/pb_typeahead/docs/_playground.overrides.json +2 -2
  323. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_draggable_pills.html.erb +0 -1
  324. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_draggable_pills.jsx +0 -1
  325. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_draggable_pills_rails.md +3 -3
  326. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_draggable_pills_react.md +7 -0
  327. data/app/pb_kits/playbook/pb_typeahead/kit.schema.json +3 -3
  328. data/app/pb_kits/playbook/pb_typeahead/typeahead.rb +3 -3
  329. data/app/pb_kits/playbook/pb_user/_user.tsx +3 -1
  330. data/app/pb_kits/playbook/pb_user/docs/_playground.json +3 -1
  331. data/app/pb_kits/playbook/pb_user/kit.schema.json +20 -9
  332. data/app/pb_kits/playbook/pb_user_badge/_user_badge.tsx +3 -1
  333. data/app/pb_kits/playbook/pb_user_badge/kit.schema.json +1 -0
  334. data/app/pb_kits/playbook/pb_weekday_stacked/_weekday_stacked.tsx +3 -1
  335. data/app/pb_kits/playbook/pb_weekday_stacked/docs/_playground.json +1 -0
  336. data/app/pb_kits/playbook/pb_weekday_stacked/kit.schema.json +3 -1
  337. data/app/pb_kits/playbook/pb_weekday_stacked/weekday_stacked.test.jsx +1 -0
  338. data/app/pb_kits/playbook/utilities/test/globalProps/onClick.test.js +471 -0
  339. data/app/pb_kits/playbook/utilities/test-utils.js +0 -1
  340. data/dist/ai/all-schemas.json +986 -388
  341. data/dist/ai/external-dependencies.json +1 -1
  342. data/dist/ai/forms.json +2 -2
  343. data/dist/ai/index.json +11 -3
  344. data/dist/ai/kits/advanced_table.schema.json +44 -16
  345. data/dist/ai/kits/avatar.schema.json +22 -9
  346. data/dist/ai/kits/background.schema.json +10 -3
  347. data/dist/ai/kits/badge.schema.json +26 -12
  348. data/dist/ai/kits/body.schema.json +14 -5
  349. data/dist/ai/kits/button.schema.json +29 -25
  350. data/dist/ai/kits/caption.schema.json +17 -7
  351. data/dist/ai/kits/card.schema.json +2 -1
  352. data/dist/ai/kits/checkbox.schema.json +10 -5
  353. data/dist/ai/kits/contact.schema.json +3 -1
  354. data/dist/ai/kits/copy_button.schema.json +10 -5
  355. data/dist/ai/kits/currency.schema.json +6 -2
  356. data/dist/ai/kits/dashboard_value.schema.json +4 -2
  357. data/dist/ai/kits/date.schema.json +16 -6
  358. data/dist/ai/kits/date_picker.schema.json +31 -13
  359. data/dist/ai/kits/date_range_inline.schema.json +3 -1
  360. data/dist/ai/kits/date_range_stacked.schema.json +1 -0
  361. data/dist/ai/kits/date_stacked.schema.json +1 -0
  362. data/dist/ai/kits/date_time.schema.json +3 -1
  363. data/dist/ai/kits/date_time_stacked.schema.json +3 -1
  364. data/dist/ai/kits/date_year_stacked.schema.json +1 -0
  365. data/dist/ai/kits/detail.schema.json +2 -1
  366. data/dist/ai/kits/dialog.schema.json +22 -9
  367. data/dist/ai/kits/distribution_bar.schema.json +2 -1
  368. data/dist/ai/kits/dropdown.schema.json +98 -18
  369. data/dist/ai/kits/empty_state.schema.json +2 -1
  370. data/dist/ai/kits/file_upload.schema.json +8 -3
  371. data/dist/ai/kits/fixed_confirmation_toast.schema.json +6 -3
  372. data/dist/ai/kits/flex.schema.json +27 -12
  373. data/dist/ai/kits/form.schema.json +1 -6
  374. data/dist/ai/kits/form_pill.schema.json +6 -3
  375. data/dist/ai/kits/full_screen.schema.json +8 -4
  376. data/dist/ai/kits/hashtag.schema.json +2 -1
  377. data/dist/ai/kits/highlight.schema.json +2 -1
  378. data/dist/ai/kits/icon.schema.json +31 -13
  379. data/dist/ai/kits/icon_circle.schema.json +3 -1
  380. data/dist/ai/kits/icon_stat_value.schema.json +4 -2
  381. data/dist/ai/kits/image.schema.json +57 -24
  382. data/dist/ai/kits/label_pill.schema.json +1 -0
  383. data/dist/ai/kits/label_value.schema.json +2 -1
  384. data/dist/ai/kits/layout.schema.json +43 -20
  385. data/dist/ai/kits/legend.schema.json +3 -1
  386. data/dist/ai/kits/lightbox.schema.json +86 -0
  387. data/dist/ai/kits/link.schema.json +14 -6
  388. data/dist/ai/kits/list.schema.json +2 -1
  389. data/dist/ai/kits/loading_inline.schema.json +4 -1
  390. data/dist/ai/kits/map.schema.json +4 -7
  391. data/dist/ai/kits/message.schema.json +2 -1
  392. data/dist/ai/kits/multiple_users.schema.json +19 -11
  393. data/dist/ai/kits/multiple_users_stacked.schema.json +2 -1
  394. data/dist/ai/kits/nav.schema.json +4 -2
  395. data/dist/ai/kits/online_status.schema.json +1 -0
  396. data/dist/ai/kits/overlay.schema.json +22 -12
  397. data/dist/ai/kits/pagination.schema.json +6 -3
  398. data/dist/ai/kits/passphrase.schema.json +10 -5
  399. data/dist/ai/kits/pb_gauge_chart.schema.json +2 -1
  400. data/dist/ai/kits/person.schema.json +1 -0
  401. data/dist/ai/kits/person_contact.schema.json +2 -1
  402. data/dist/ai/kits/phone_number_input.schema.json +6 -3
  403. data/dist/ai/kits/pill.schema.json +1 -0
  404. data/dist/ai/kits/popover.schema.json +17 -8
  405. data/dist/ai/kits/progress_pills.schema.json +2 -1
  406. data/dist/ai/kits/progress_simple.schema.json +4 -2
  407. data/dist/ai/kits/rich_text_editor.schema.json +19 -10
  408. data/dist/ai/kits/selectable_card.schema.json +4 -2
  409. data/dist/ai/kits/selectable_card_icon.schema.json +2 -1
  410. data/dist/ai/kits/source.schema.json +3 -1
  411. data/dist/ai/kits/star_rating.schema.json +15 -7
  412. data/dist/ai/kits/stat_change.schema.json +3 -1
  413. data/dist/ai/kits/stat_value.schema.json +2 -1
  414. data/dist/ai/kits/table.schema.json +28 -11
  415. data/dist/ai/kits/text_input.schema.json +22 -9
  416. data/dist/ai/kits/time.schema.json +12 -4
  417. data/dist/ai/kits/time_picker.schema.json +2 -1
  418. data/dist/ai/kits/time_range_inline.schema.json +13 -5
  419. data/dist/ai/kits/time_stacked.schema.json +1 -0
  420. data/dist/ai/kits/timestamp.schema.json +1 -0
  421. data/dist/ai/kits/title.schema.json +23 -10
  422. data/dist/ai/kits/title_count.schema.json +2 -1
  423. data/dist/ai/kits/tooltip.schema.json +10 -5
  424. data/dist/ai/kits/typeahead.schema.json +3 -3
  425. data/dist/ai/kits/user.schema.json +20 -9
  426. data/dist/ai/kits/user_badge.schema.json +1 -0
  427. data/dist/ai/kits/weekday_stacked.schema.json +3 -1
  428. data/dist/ai/playgrounds/advanced_table.json +1 -1
  429. data/dist/ai/playgrounds/dropdown.json +1 -1
  430. data/dist/ai/playgrounds/index.json +1 -1
  431. data/dist/ai/playgrounds/rich_text_editor.json +1 -1
  432. data/dist/ai/playgrounds/typeahead.json +1 -1
  433. data/dist/ai/visual-index.json +1 -1
  434. data/dist/chunks/_pagination-DZ0eQuH2.js +1 -0
  435. data/dist/chunks/{_pb_line_graph-Du7xE9vl.js → _pb_line_graph-DyvH5Zj1.js} +1 -1
  436. data/dist/chunks/{_detail-Bsvl694i.js → _tooltip-CFbtqu-E.js} +2 -2
  437. data/dist/chunks/_typeahead-CkiAf8zx.js +1 -0
  438. data/dist/chunks/{globalProps-B120NbSJ.js → globalProps-xfGTpdLP.js} +1 -1
  439. data/dist/chunks/index-4jrZjexD.js +1 -0
  440. data/dist/chunks/index-BAy61y8S.js +1 -0
  441. data/dist/chunks/index-Cb_SDipk.js +1 -0
  442. data/dist/chunks/index-D3RdsDp7.js +1 -0
  443. data/dist/chunks/index-D8PZIesy.js +1 -0
  444. data/dist/chunks/index-DIoc-aua.js +1 -0
  445. data/dist/chunks/index-qex65UMn.js +1 -0
  446. data/dist/chunks/lib-Cu_i0y0k.js +29 -0
  447. data/dist/chunks/{time_picker_helper-CYGg0UQ0.js → time_picker_helper-B82MORju.js} +1 -1
  448. data/dist/chunks/vendor.js +2 -2
  449. data/dist/menu.yml +3 -3
  450. data/dist/playbook-rails-react-bindings.js +1 -1
  451. data/dist/playbook-rails.js +1 -1
  452. data/dist/playbook.css +1 -1
  453. data/lib/playbook/changelog_generator.rb +47 -21
  454. data/lib/playbook/connect_message_generator.rb +15 -2
  455. data/lib/playbook/version.rb +2 -2
  456. metadata +99 -23
  457. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_draggable_pills.md +0 -7
  458. data/dist/chunks/_table-Bf6LGyL9.js +0 -1
  459. data/dist/chunks/_typeahead-w6S5Vx4b.js +0 -1
  460. data/dist/chunks/lib-Buo6zHEw.js +0 -29
  461. /data/app/pb_kits/playbook/pb_form/docs/{_description.md → _description_rails.md} +0 -0
  462. /data/app/pb_kits/playbook/pb_form/docs/{_form_default_values.md → _form_default_values_rails.md} +0 -0
  463. /data/app/pb_kits/playbook/pb_form/docs/{_form_defaults.md → _form_defaults_rails.md} +0 -0
  464. /data/app/pb_kits/playbook/pb_form/docs/{_form_model_values.md → _form_model_values_rails.md} +0 -0
  465. /data/app/pb_kits/playbook/pb_form/docs/{_form_multi_column.md → _form_multi_column_rails.md} +0 -0
  466. /data/app/pb_kits/playbook/pb_form/docs/{_form_validation.md → _form_validation_rails.md} +0 -0
@@ -0,0 +1,879 @@
1
+ import React, { useEffect, useState } from "react"
2
+ import { Controller, useForm } from "react-hook-form"
3
+
4
+ import Body from "../../pb_body/_body"
5
+ import Button from "../../pb_button/_button"
6
+ import Caption from "../../pb_caption/_caption"
7
+ import Card from "../../pb_card/_card"
8
+ import Checkbox from "../../pb_checkbox/_checkbox"
9
+ import DatePicker from "../../pb_date_picker/_date_picker"
10
+ import Dropdown from "../../pb_dropdown/_dropdown"
11
+ import Flex from "../../pb_flex/_flex"
12
+ import MultiLevelSelect from "../../pb_multi_level_select/_multi_level_select"
13
+ import PhoneNumberInput from "../../pb_phone_number_input/_phone_number_input"
14
+ import Pill from "../../pb_pill/_pill"
15
+ import Select from "../../pb_select/_select"
16
+ import StarRating from "../../pb_star_rating/_star_rating"
17
+ import Textarea from "../../pb_textarea/_textarea"
18
+ import TextInput from "../../pb_text_input/_text_input"
19
+ import TimePicker from "../../pb_time_picker/_time_picker"
20
+ import Typeahead from "../../pb_typeahead/_typeahead"
21
+
22
+ const INPUT_TYPES = [
23
+ { key: "checkbox", label: "Checkbox" },
24
+ { key: "date_picker", label: "Date Picker" },
25
+ { key: "dropdown", label: "Dropdown: Default" },
26
+ { key: "multi_select", label: "Dropdown: Multi Select" },
27
+ { key: "multi_level_select", label: "Multi Level Select" },
28
+ { key: "phone_number", label: "Phone Number" },
29
+ { key: "select", label: "Select: Default" },
30
+ { key: "star_rating", label: "Star Rating" },
31
+ { key: "text_field", label: "Text Input: Default" },
32
+ { key: "email_field", label: "Text Input: Email" },
33
+ { key: "number_field", label: "Text Input: Number" },
34
+ { key: "password_field", label: "Text Input: Password" },
35
+ { key: "search_field", label: "Text Input: Search" },
36
+ { key: "url_field", label: "Text Input: URL" },
37
+ { key: "textarea", label: "Textarea" },
38
+ { key: "time_picker", label: "Time Picker" },
39
+ { key: "typeahead_default", label: "Typeahead: Default" },
40
+ { key: "typeahead", label: "Typeahead: Multi" },
41
+ ]
42
+
43
+ const DEFAULT_SELECTED_KEY = "text_field"
44
+
45
+ const COLOR_SELECT_OPTIONS = [
46
+ { value: "red", text: "Red" },
47
+ { value: "blue", text: "Blue" },
48
+ { value: "green", text: "Green" },
49
+ ]
50
+
51
+ const COUNTRY_OPTIONS = [
52
+ { label: "United States", value: "unitedStates", id: "us" },
53
+ { label: "Canada", value: "canada", id: "ca" },
54
+ { label: "Pakistan", value: "pakistan", id: "pk" },
55
+ ]
56
+
57
+ const TYPEAHEAD_COLOR_OPTIONS = [
58
+ { label: "Orange", value: "#FFA500" },
59
+ { label: "Red", value: "#FF0000" },
60
+ { label: "Green", value: "#00FF00" },
61
+ { label: "Blue", value: "#0000FF" },
62
+ ]
63
+
64
+ const DEPARTMENT_TREE_DATA = [
65
+ {
66
+ label: "Power Home Remodeling",
67
+ value: "powerHomeRemodeling",
68
+ id: "form-defaults-100",
69
+ expanded: true,
70
+ children: [
71
+ {
72
+ label: "People",
73
+ value: "people",
74
+ id: "form-defaults-101",
75
+ children: [
76
+ { label: "Talent Acquisition", value: "talentAcquisition", id: "form-defaults-102" },
77
+ { label: "People Experience", value: "peopleExperience", id: "form-defaults-103" },
78
+ ],
79
+ },
80
+ {
81
+ label: "Contact Center",
82
+ value: "contactCenter",
83
+ id: "form-defaults-104",
84
+ children: [
85
+ { label: "Customer Service", value: "customerService", id: "form-defaults-105" },
86
+ { label: "Energy", value: "energy", id: "form-defaults-106" },
87
+ ],
88
+ },
89
+ ],
90
+ },
91
+ ]
92
+
93
+ // Recursively locate a node by its `id` so onSubmit can translate stored ids
94
+ // back into the human-readable `value`s a consumer of this form expects.
95
+ const findNodeById = (nodes, id) => {
96
+ for (const node of nodes) {
97
+ if (node.id === id) return node
98
+ if (node.children) {
99
+ const found = findNodeById(node.children, id)
100
+ if (found) return found
101
+ }
102
+ }
103
+ return null
104
+ }
105
+
106
+ // Map each field name to its toggle key so onSubmit can filter out fields
107
+ // whose pill has been deselected.
108
+ const FIELD_TO_INPUT_KEY = {
109
+ newsletter: "checkbox",
110
+ startDate: "date_picker",
111
+ country: "dropdown",
112
+ countries: "multi_select",
113
+ department: "multi_level_select",
114
+ phone: "phone_number",
115
+ favoriteColor: "select",
116
+ rating: "star_rating",
117
+ fullName: "text_field",
118
+ email: "email_field",
119
+ quantity: "number_field",
120
+ password: "password_field",
121
+ projectNumber: "search_field",
122
+ website: "url_field",
123
+ bio: "textarea",
124
+ startTime: "time_picker",
125
+ favoriteColorSearch: "typeahead_default",
126
+ favoriteColors: "typeahead",
127
+ }
128
+
129
+ // Only interactive StarRating needs the reset: it keeps its own useState and
130
+ // ignores `rating`, so a stored rating would submit while the control looks
131
+ // empty after remount. Other toggle-remounted kits (TimePicker, DatePicker,
132
+ // Dropdown, Typeahead) rehydrate from their `defaultX` / `value` props.
133
+ const RESET_ON_DESELECT = {
134
+ star_rating: "rating",
135
+ }
136
+
137
+ // Static copies of the JSX rendered below, kept in sync by hand so the code
138
+ // preview can show only the fields currently selected (mirrors the Rails
139
+ // Defaults demo, which reads similarly static per-field snippet files).
140
+ const CODE_SNIPPETS = {
141
+ checkbox: `<Controller
142
+ control={control}
143
+ name="newsletter"
144
+ render={({ field }) => (
145
+ <Checkbox
146
+ checked={!!field.value}
147
+ onChange={(event) => field.onChange(event.target.checked)}
148
+ text="Subscribe to newsletter"
149
+ />
150
+ )}
151
+ />`,
152
+ date_picker: `<Controller
153
+ control={control}
154
+ name="startDate"
155
+ render={({ field }) => (
156
+ <DatePicker
157
+ defaultDate={field.value}
158
+ initializeOnce
159
+ key={\`date-\${resetKey}\`}
160
+ label="Start Date"
161
+ onChange={(dateStr) => field.onChange(dateStr)}
162
+ pickerId="form-defaults-start-date"
163
+ />
164
+ )}
165
+ />`,
166
+ dropdown: `<Controller
167
+ control={control}
168
+ name="country"
169
+ render={({ field }) => (
170
+ <Dropdown
171
+ key={\`dropdown-\${resetKey}\`}
172
+ label="Country"
173
+ onChange={(event) => field.onChange(event.target.value)}
174
+ options={countryOptions}
175
+ value={field.value}
176
+ />
177
+ )}
178
+ />`,
179
+ multi_select: `<Controller
180
+ control={control}
181
+ name="countries"
182
+ render={({ field }) => (
183
+ <Dropdown
184
+ key={\`multi-select-\${resetKey}\`}
185
+ label="Countries"
186
+ multiSelect
187
+ onChange={(event) => field.onChange(event.target.value)}
188
+ options={countryOptions}
189
+ value={field.value}
190
+ />
191
+ )}
192
+ />`,
193
+ multi_level_select: `<Controller
194
+ control={control}
195
+ name="department"
196
+ render={({ field }) => (
197
+ <MultiLevelSelect
198
+ id="mls-form-defaults"
199
+ label="Department"
200
+ onChange={(event) =>
201
+ field.onChange(event.target.value.map((item) => item.id))
202
+ }
203
+ selectedIds={field.value}
204
+ treeData={departmentTreeData}
205
+ />
206
+ )}
207
+ />`,
208
+ phone_number: `<Controller
209
+ control={control}
210
+ name="phone"
211
+ render={({ field }) => (
212
+ <PhoneNumberInput
213
+ key={\`phone-\${resetKey}\`}
214
+ label="Phone Number"
215
+ onChange={(data) => field.onChange(data.number)}
216
+ value={field.value}
217
+ />
218
+ )}
219
+ />`,
220
+ select: `<Controller
221
+ control={control}
222
+ name="favoriteColor"
223
+ render={({ field }) => (
224
+ <Select
225
+ blankSelection="Select one..."
226
+ key={\`select-\${resetKey}\`}
227
+ label="Favorite Color"
228
+ onChange={(event) => field.onChange(event.target.value)}
229
+ options={colorSelectOptions}
230
+ value={field.value}
231
+ />
232
+ )}
233
+ />`,
234
+ star_rating: `// NOTE: resetField("rating") runs from an effect when this pill is
235
+ // deselected, because interactive StarRating keeps its own state and ignores
236
+ // the rating prop on remount.
237
+ <Controller
238
+ control={control}
239
+ name="rating"
240
+ render={({ field }) => (
241
+ <StarRating
242
+ key={\`rating-\${resetKey}\`}
243
+ label="Rating"
244
+ onClick={(value) => field.onChange(value)}
245
+ rating={field.value || 0}
246
+ variant="interactive"
247
+ />
248
+ )}
249
+ />`,
250
+ text_field: `<Controller
251
+ control={control}
252
+ name="fullName"
253
+ render={({ field }) => (
254
+ <TextInput
255
+ label="Full Name"
256
+ onChange={(event) => field.onChange(event.target.value)}
257
+ value={field.value ?? ""}
258
+ />
259
+ )}
260
+ />`,
261
+ email_field: `<Controller
262
+ control={control}
263
+ name="email"
264
+ render={({ field }) => (
265
+ <TextInput
266
+ label="Email"
267
+ onChange={(event) => field.onChange(event.target.value)}
268
+ type="email"
269
+ value={field.value ?? ""}
270
+ />
271
+ )}
272
+ />`,
273
+ number_field: `<Controller
274
+ control={control}
275
+ name="quantity"
276
+ render={({ field }) => (
277
+ <TextInput
278
+ label="Quantity"
279
+ onChange={(event) => field.onChange(event.target.value)}
280
+ type="number"
281
+ value={field.value ?? ""}
282
+ />
283
+ )}
284
+ />`,
285
+ password_field: `<Controller
286
+ control={control}
287
+ name="password"
288
+ render={({ field }) => (
289
+ <TextInput
290
+ label="Password"
291
+ onChange={(event) => field.onChange(event.target.value)}
292
+ type="password"
293
+ value={field.value ?? ""}
294
+ />
295
+ )}
296
+ />`,
297
+ search_field: `<Controller
298
+ control={control}
299
+ name="projectNumber"
300
+ render={({ field }) => (
301
+ <TextInput
302
+ label="Project Number"
303
+ onChange={(event) => field.onChange(event.target.value)}
304
+ type="search"
305
+ value={field.value ?? ""}
306
+ />
307
+ )}
308
+ />`,
309
+ url_field: `<Controller
310
+ control={control}
311
+ name="website"
312
+ render={({ field }) => (
313
+ <TextInput
314
+ label="Website"
315
+ onChange={(event) => field.onChange(event.target.value)}
316
+ type="url"
317
+ value={field.value ?? ""}
318
+ />
319
+ )}
320
+ />`,
321
+ textarea: `<Controller
322
+ control={control}
323
+ name="bio"
324
+ render={({ field }) => (
325
+ <Textarea
326
+ label="Bio"
327
+ onChange={(event) => field.onChange(event.target.value)}
328
+ value={field.value ?? ""}
329
+ />
330
+ )}
331
+ />`,
332
+ time_picker: `// NOTE: TimePicker rehydrates from defaultTime={field.value} on remount, so
333
+ // no reset is needed when the pill is turned off and back on.
334
+ <Controller
335
+ control={control}
336
+ name="startTime"
337
+ render={({ field }) => (
338
+ <TimePicker
339
+ defaultTime={field.value}
340
+ key={\`time-\${resetKey}\`}
341
+ label="Start Time"
342
+ onChange={(time) => field.onChange(time)}
343
+ />
344
+ )}
345
+ />`,
346
+ typeahead_default: `<Controller
347
+ control={control}
348
+ name="favoriteColorSearch"
349
+ render={({ field: { onChange: handleChange, value } }) => (
350
+ <Typeahead
351
+ key={\`typeahead-default-\${resetKey}\`}
352
+ label="Favorite Color"
353
+ onChange={handleChange}
354
+ options={typeaheadColorOptions}
355
+ placeholder="Search for a color"
356
+ value={value}
357
+ />
358
+ )}
359
+ />`,
360
+ typeahead: `<Controller
361
+ control={control}
362
+ name="favoriteColors"
363
+ render={({ field: { onChange: handleChange, value } }) => (
364
+ <Typeahead
365
+ isMulti
366
+ key={\`typeahead-multi-\${resetKey}\`}
367
+ label="Favorite Color"
368
+ onChange={handleChange}
369
+ options={typeaheadColorOptions}
370
+ pills
371
+ placeholder="Search for a color"
372
+ value={value}
373
+ />
374
+ )}
375
+ />`,
376
+ }
377
+
378
+ const FORM_OPEN = `const { control, handleSubmit } = useForm()
379
+
380
+ <form onSubmit={handleSubmit(onSubmit)}>`
381
+ const FORM_CLOSE = ` <Button htmlType="submit" text="Submit" />
382
+ <Button htmlType="button" onClick={onReset} text="Cancel" variant="secondary" />
383
+ </form>`
384
+
385
+ const FormDefaults = () => {
386
+ const [selectedKeys, setSelectedKeys] = useState([DEFAULT_SELECTED_KEY])
387
+ const [submittedData, setSubmittedData] = useState(null)
388
+ const [resetKey, setResetKey] = useState(0)
389
+ const { control, handleSubmit, reset, resetField, getValues } = useForm({
390
+ defaultValues: {
391
+ bio: "",
392
+ country: undefined,
393
+ countries: undefined,
394
+ department: [],
395
+ email: "",
396
+ favoriteColor: "",
397
+ favoriteColors: [],
398
+ favoriteColorSearch: "",
399
+ fullName: "",
400
+ password: "",
401
+ projectNumber: "",
402
+ quantity: "",
403
+ rating: 0,
404
+ website: "",
405
+ },
406
+ })
407
+
408
+ const isSelected = (key) => selectedKeys.includes(key)
409
+
410
+ // When a pill is turned off for a control that can't rehydrate on remount,
411
+ // clear its stored value so the next mount and the submitted payload agree.
412
+ useEffect(() => {
413
+ Object.entries(RESET_ON_DESELECT).forEach(([inputKey, fieldName]) => {
414
+ const stillSelected = selectedKeys.includes(inputKey)
415
+ const hasValue = getValues(fieldName) !== undefined && getValues(fieldName) !== null
416
+ if (!stillSelected && hasValue) resetField(fieldName)
417
+ })
418
+ }, [selectedKeys, getValues, resetField])
419
+
420
+ const toggleKey = (key) => {
421
+ setSelectedKeys((current) => {
422
+ if (!current.includes(key)) return [...current, key]
423
+ // Always keep at least one field selected, matching the Rails demo.
424
+ return current.length > 1 ? current.filter((selected) => selected !== key) : current
425
+ })
426
+ }
427
+
428
+ const handlePillKeyDown = (event, key) => {
429
+ if (event.key !== "Enter" && event.key !== " ") return
430
+ event.preventDefault()
431
+ toggleKey(key)
432
+ }
433
+
434
+ const onSubmit = (data) => {
435
+ // Dropdown stores the selected option node (or array of nodes for multi),
436
+ // and MultiLevelSelect stores selected ids. Translate each back into the
437
+ // human-readable `value`s so the submitted payload is primitives, not
438
+ // kit-internal shapes.
439
+ const normalized = {
440
+ ...data,
441
+ country:
442
+ data.country && typeof data.country === "object"
443
+ ? data.country.value ?? data.country.label
444
+ : data.country,
445
+ countries: Array.isArray(data.countries)
446
+ ? data.countries.map((node) =>
447
+ node && typeof node === "object" ? node.value ?? node.label : node
448
+ )
449
+ : data.countries,
450
+ department: Array.isArray(data.department)
451
+ ? data.department.map((id) => findNodeById(DEPARTMENT_TREE_DATA, id)?.value ?? id)
452
+ : data.department,
453
+ }
454
+
455
+ // Fields that are deselected stay mounted (we removed shouldUnregister)
456
+ // so we filter them out here rather than letting RHF drop their values.
457
+ const filtered = Object.fromEntries(
458
+ Object.entries(normalized).filter(([fieldName]) => {
459
+ const inputKey = FIELD_TO_INPUT_KEY[fieldName]
460
+ return inputKey ? isSelected(inputKey) : true
461
+ })
462
+ )
463
+ setSubmittedData(filtered)
464
+ }
465
+
466
+ const onReset = () => {
467
+ reset()
468
+ setResetKey((current) => current + 1)
469
+ setSubmittedData(null)
470
+ }
471
+
472
+ const codePreview = [FORM_OPEN]
473
+ .concat(INPUT_TYPES.filter((inputType) => isSelected(inputType.key)).map((inputType) => CODE_SNIPPETS[inputType.key]))
474
+ .concat([FORM_CLOSE])
475
+ .join("\n\n")
476
+
477
+ return (
478
+ <div>
479
+ <Body color="light"
480
+ marginBottom="xs"
481
+ text="Select one or more inputs to add them to the form."
482
+ />
483
+ <Flex gap="xs"
484
+ marginBottom="md"
485
+ wrap
486
+ >
487
+ {INPUT_TYPES.map((inputType) => (
488
+ <Pill
489
+ htmlOptions={{
490
+ onClick: () => toggleKey(inputType.key),
491
+ onKeyDown: (event) => handlePillKeyDown(event, inputType.key),
492
+ role: "button",
493
+ style: { cursor: "pointer" },
494
+ tabIndex: 0,
495
+ }}
496
+ key={inputType.key}
497
+ text={inputType.label}
498
+ textTransform="none"
499
+ variant={isSelected(inputType.key) ? "primary" : "neutral"}
500
+ />
501
+ ))}
502
+ </Flex>
503
+
504
+ <Flex align="stretch"
505
+ gap="md"
506
+ wrap
507
+ >
508
+ <Flex
509
+ align="stretch"
510
+ htmlOptions={{ style: { flex: "2 1" } }}
511
+ orientation="column"
512
+ >
513
+ <Card
514
+ htmlOptions={{ style: { minWidth: 0 } }}
515
+ padding="md"
516
+ shadow="deep"
517
+ >
518
+ <form onSubmit={handleSubmit(onSubmit)}>
519
+ {isSelected("checkbox") && (
520
+ <Controller
521
+ control={control}
522
+ name="newsletter"
523
+ render={({ field }) => (
524
+ <Checkbox
525
+ checked={!!field.value}
526
+ marginBottom="sm"
527
+ onChange={(event) => field.onChange(event.target.checked)}
528
+ text="Subscribe to newsletter"
529
+ />
530
+ )}
531
+ />
532
+ )}
533
+
534
+ {isSelected("date_picker") && (
535
+ <Controller
536
+ control={control}
537
+ name="startDate"
538
+ render={({ field }) => (
539
+ <DatePicker
540
+ defaultDate={field.value}
541
+ initializeOnce
542
+ key={`date-${resetKey}`}
543
+ label="Start Date"
544
+ marginBottom="sm"
545
+ onChange={(dateStr) => field.onChange(dateStr)}
546
+ pickerId="form-defaults-start-date"
547
+ />
548
+ )}
549
+ />
550
+ )}
551
+
552
+ {isSelected("dropdown") && (
553
+ <Controller
554
+ control={control}
555
+ name="country"
556
+ render={({ field }) => (
557
+ <Dropdown
558
+ key={`dropdown-${resetKey}`}
559
+ label="Country"
560
+ marginBottom="sm"
561
+ onChange={(event) => field.onChange(event.target.value)}
562
+ options={COUNTRY_OPTIONS}
563
+ value={field.value}
564
+ />
565
+ )}
566
+ />
567
+ )}
568
+
569
+ {isSelected("multi_select") && (
570
+ <Controller
571
+ control={control}
572
+ name="countries"
573
+ render={({ field }) => (
574
+ <Dropdown
575
+ key={`multi-select-${resetKey}`}
576
+ label="Countries"
577
+ marginBottom="sm"
578
+ multiSelect
579
+ onChange={(event) => field.onChange(event.target.value)}
580
+ options={COUNTRY_OPTIONS}
581
+ value={field.value}
582
+ />
583
+ )}
584
+ />
585
+ )}
586
+
587
+ {isSelected("multi_level_select") && (
588
+ <Controller
589
+ control={control}
590
+ name="department"
591
+ render={({ field }) => (
592
+ <MultiLevelSelect
593
+ id="mls-form-defaults"
594
+ label="Department"
595
+ marginBottom="sm"
596
+ onChange={(event) =>
597
+ field.onChange(event.target.value.map((item) => item.id))
598
+ }
599
+ selectedIds={field.value}
600
+ treeData={DEPARTMENT_TREE_DATA}
601
+ />
602
+ )}
603
+ />
604
+ )}
605
+
606
+ {isSelected("phone_number") && (
607
+ <Controller
608
+ control={control}
609
+ name="phone"
610
+ render={({ field }) => (
611
+ <PhoneNumberInput
612
+ key={`phone-${resetKey}`}
613
+ label="Phone Number"
614
+ marginBottom="sm"
615
+ onChange={(data) => field.onChange(data.number)}
616
+ value={field.value}
617
+ />
618
+ )}
619
+ />
620
+ )}
621
+
622
+ {isSelected("select") && (
623
+ <Controller
624
+ control={control}
625
+ name="favoriteColor"
626
+ render={({ field }) => (
627
+ <Select
628
+ blankSelection="Select one..."
629
+ key={`select-${resetKey}`}
630
+ label="Favorite Color"
631
+ marginBottom="sm"
632
+ onChange={(event) => field.onChange(event.target.value)}
633
+ options={COLOR_SELECT_OPTIONS}
634
+ value={field.value}
635
+ />
636
+ )}
637
+ />
638
+ )}
639
+
640
+ {isSelected("star_rating") && (
641
+ <Controller
642
+ control={control}
643
+ name="rating"
644
+ render={({ field }) => (
645
+ <StarRating
646
+ key={`rating-${resetKey}`}
647
+ label="Rating"
648
+ marginBottom="sm"
649
+ onClick={(value) => field.onChange(value)}
650
+ rating={field.value || 0}
651
+ variant="interactive"
652
+ />
653
+ )}
654
+ />
655
+ )}
656
+
657
+ {isSelected("text_field") && (
658
+ <Controller
659
+ control={control}
660
+ name="fullName"
661
+ render={({ field }) => (
662
+ <TextInput
663
+ label="Full Name"
664
+ marginBottom="sm"
665
+ onChange={(event) => field.onChange(event.target.value)}
666
+ value={field.value ?? ""}
667
+ />
668
+ )}
669
+ />
670
+ )}
671
+
672
+ {isSelected("email_field") && (
673
+ <Controller
674
+ control={control}
675
+ name="email"
676
+ render={({ field }) => (
677
+ <TextInput
678
+ label="Email"
679
+ marginBottom="sm"
680
+ onChange={(event) => field.onChange(event.target.value)}
681
+ type="email"
682
+ value={field.value ?? ""}
683
+ />
684
+ )}
685
+ />
686
+ )}
687
+
688
+ {isSelected("number_field") && (
689
+ <Controller
690
+ control={control}
691
+ name="quantity"
692
+ render={({ field }) => (
693
+ <TextInput
694
+ label="Quantity"
695
+ marginBottom="sm"
696
+ onChange={(event) => field.onChange(event.target.value)}
697
+ type="number"
698
+ value={field.value ?? ""}
699
+ />
700
+ )}
701
+ />
702
+ )}
703
+
704
+ {isSelected("password_field") && (
705
+ <Controller
706
+ control={control}
707
+ name="password"
708
+ render={({ field }) => (
709
+ <TextInput
710
+ label="Password"
711
+ marginBottom="sm"
712
+ onChange={(event) => field.onChange(event.target.value)}
713
+ type="password"
714
+ value={field.value ?? ""}
715
+ />
716
+ )}
717
+ />
718
+ )}
719
+
720
+ {isSelected("search_field") && (
721
+ <Controller
722
+ control={control}
723
+ name="projectNumber"
724
+ render={({ field }) => (
725
+ <TextInput
726
+ label="Project Number"
727
+ marginBottom="sm"
728
+ onChange={(event) => field.onChange(event.target.value)}
729
+ type="search"
730
+ value={field.value ?? ""}
731
+ />
732
+ )}
733
+ />
734
+ )}
735
+
736
+ {isSelected("url_field") && (
737
+ <Controller
738
+ control={control}
739
+ name="website"
740
+ render={({ field }) => (
741
+ <TextInput
742
+ label="Website"
743
+ marginBottom="sm"
744
+ onChange={(event) => field.onChange(event.target.value)}
745
+ type="url"
746
+ value={field.value ?? ""}
747
+ />
748
+ )}
749
+ />
750
+ )}
751
+
752
+ {isSelected("textarea") && (
753
+ <Controller
754
+ control={control}
755
+ name="bio"
756
+ render={({ field }) => (
757
+ <Textarea
758
+ label="Bio"
759
+ marginBottom="sm"
760
+ onChange={(event) => field.onChange(event.target.value)}
761
+ value={field.value ?? ""}
762
+ />
763
+ )}
764
+ />
765
+ )}
766
+
767
+ {isSelected("time_picker") && (
768
+ <Controller
769
+ control={control}
770
+ name="startTime"
771
+ render={({ field }) => (
772
+ <TimePicker
773
+ defaultTime={field.value}
774
+ key={`time-${resetKey}`}
775
+ label="Start Time"
776
+ marginBottom="sm"
777
+ onChange={(time) => field.onChange(time)}
778
+ />
779
+ )}
780
+ />
781
+ )}
782
+
783
+ {isSelected("typeahead_default") && (
784
+ <Controller
785
+ control={control}
786
+ name="favoriteColorSearch"
787
+ render={({ field: { onChange: handleChange, value } }) => (
788
+ <Typeahead
789
+ key={`typeahead-default-${resetKey}`}
790
+ label="Favorite Color"
791
+ marginBottom="sm"
792
+ onChange={handleChange}
793
+ options={TYPEAHEAD_COLOR_OPTIONS}
794
+ placeholder="Search for a color"
795
+ value={value}
796
+ />
797
+ )}
798
+ />
799
+ )}
800
+
801
+ {isSelected("typeahead") && (
802
+ <Controller
803
+ control={control}
804
+ name="favoriteColors"
805
+ render={({ field: { onChange: handleChange, value } }) => (
806
+ <Typeahead
807
+ isMulti
808
+ key={`typeahead-multi-${resetKey}`}
809
+ label="Favorite Color"
810
+ marginBottom="sm"
811
+ onChange={handleChange}
812
+ options={TYPEAHEAD_COLOR_OPTIONS}
813
+ pills
814
+ placeholder="Search for a color"
815
+ value={value}
816
+ />
817
+ )}
818
+ />
819
+ )}
820
+
821
+ <Flex gap="xs"
822
+ marginTop="sm"
823
+ >
824
+ <Button htmlType="submit"
825
+ text="Submit"
826
+ />
827
+ <Button htmlType="button"
828
+ onClick={onReset}
829
+ text="Cancel"
830
+ variant="secondary"
831
+ />
832
+ </Flex>
833
+ </form>
834
+ </Card>
835
+ </Flex>
836
+
837
+ <Flex
838
+ align="stretch"
839
+ htmlOptions={{ style: { flex: "1 1"} }}
840
+ orientation="column"
841
+ >
842
+ <Caption marginBottom="xs"
843
+ text="Submitted Form Data"
844
+ />
845
+ <Card background="light"
846
+ padding="md"
847
+ >
848
+ {submittedData ? (
849
+ <pre style={{ margin: 0, overflow: "auto", fontSize: "12px", lineHeight: 1.5, whiteSpace: "pre-wrap" }}>
850
+ {JSON.stringify(submittedData, null, 2)}
851
+ </pre>
852
+ ) : (
853
+ <Body color="light"
854
+ text="No data submitted yet."
855
+ />
856
+ )}
857
+ </Card>
858
+ </Flex>
859
+ </Flex>
860
+
861
+ <Body color="light"
862
+ marginBottom="sm"
863
+ marginTop="sm"
864
+ text="Submit the form to see the data on the right."
865
+ />
866
+
867
+ <Card background="dark"
868
+ dark
869
+ padding="none"
870
+ >
871
+ <pre style={{ margin: 0, overflow: "auto", fontSize: "12px", lineHeight: 1.5, whiteSpace: "pre", padding: "16px" }}>
872
+ {codePreview}
873
+ </pre>
874
+ </Card>
875
+ </div>
876
+ )
877
+ }
878
+
879
+ export default FormDefaults