playbook_ui 14.25.0.pre.alpha.PLAY2361datepickerarrownav9708 → 14.25.0.pre.alpha.PLAY2369textinputautocompleteprop10269

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 (250) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/_playbook.scss +0 -1
  3. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +6 -6
  4. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.test.jsx +1 -1
  5. data/app/pb_kits/playbook/pb_avatar/_avatar.scss +60 -65
  6. data/app/pb_kits/playbook/pb_avatar/avatar.test.js +1 -1
  7. data/app/pb_kits/playbook/pb_background/_background.scss +3 -3
  8. data/app/pb_kits/playbook/pb_badge/_badge.scss +135 -29
  9. data/app/pb_kits/playbook/pb_body/_body.scss +108 -35
  10. data/app/pb_kits/playbook/pb_body/_body_mixins.scss +1 -1
  11. data/app/pb_kits/playbook/pb_bread_crumbs/_bread_crumbs.scss +17 -30
  12. data/app/pb_kits/playbook/pb_button/_button.scss +39 -31
  13. data/app/pb_kits/playbook/pb_button/_button.tsx +12 -12
  14. data/app/pb_kits/playbook/pb_button/_button_mixins.scss +1 -1
  15. data/app/pb_kits/playbook/pb_button/button.rb +11 -18
  16. data/app/pb_kits/playbook/pb_button/button.test.js +3 -3
  17. data/app/pb_kits/playbook/pb_button_toolbar/_button_toolbar.scss +82 -73
  18. data/app/pb_kits/playbook/pb_button_toolbar/_button_toolbar_dark.scss +32 -33
  19. data/app/pb_kits/playbook/pb_button_toolbar/_button_toolbar_mixins.scss +1 -1
  20. data/app/pb_kits/playbook/pb_button_toolbar/button_toolbar.test.js +2 -2
  21. data/app/pb_kits/playbook/pb_caption/_caption.scss +100 -17
  22. data/app/pb_kits/playbook/pb_caption/_caption_mixin.scss +1 -8
  23. data/app/pb_kits/playbook/pb_card/_card.scss +116 -79
  24. data/app/pb_kits/playbook/pb_card/_card.tsx +26 -11
  25. data/app/pb_kits/playbook/pb_card/_card_mixin.scss +1 -1
  26. data/app/pb_kits/playbook/pb_card/card.rb +8 -7
  27. data/app/pb_kits/playbook/pb_card/card_header.rb +6 -2
  28. data/app/pb_kits/playbook/pb_card/docs/_card_header.html.erb +1 -1
  29. data/app/pb_kits/playbook/pb_checkbox/_checkbox.scss +11 -2
  30. data/app/pb_kits/playbook/pb_circle_icon_button/_circle_icon_button.scss +7 -7
  31. data/app/pb_kits/playbook/pb_circle_icon_button/circle_icon_button.test.js +1 -1
  32. data/app/pb_kits/playbook/pb_collapsible/__snapshots__/collapsible.test.js.snap +1 -1
  33. data/app/pb_kits/playbook/pb_collapsible/_collapsible.scss +4 -4
  34. data/app/pb_kits/playbook/pb_copy_button/copy_button.test.jsx +1 -1
  35. data/app/pb_kits/playbook/pb_currency/_currency.scss +124 -39
  36. data/app/pb_kits/playbook/pb_dashboard_value/_dashboard_value.scss +16 -6
  37. data/app/pb_kits/playbook/pb_date/_date.scss +16 -18
  38. data/app/pb_kits/playbook/pb_date/date.test.js +506 -0
  39. data/app/pb_kits/playbook/pb_date_picker/_date_picker.scss +1 -1
  40. data/app/pb_kits/playbook/pb_date_picker/_date_picker.tsx +19 -0
  41. data/app/pb_kits/playbook/pb_date_picker/date_picker.html.erb +1 -0
  42. data/app/pb_kits/playbook/pb_date_picker/date_picker_helper.ts +3 -15
  43. data/app/pb_kits/playbook/pb_date_picker/sass_partials/_inline_styles.scss +12 -12
  44. data/app/pb_kits/playbook/pb_date_picker/sass_partials/_input_styles.scss +2 -2
  45. data/app/pb_kits/playbook/pb_date_picker/sass_partials/_time_selection_styles.scss +6 -5
  46. data/app/pb_kits/playbook/pb_date_range_inline/_date_range_inline.scss +29 -23
  47. data/app/pb_kits/playbook/pb_date_range_inline/_date_range_inline.tsx +1 -1
  48. data/app/pb_kits/playbook/pb_date_range_stacked/_date_range_stacked.scss +1 -1
  49. data/app/pb_kits/playbook/pb_date_range_stacked/date_range_stacked.test.js +2 -2
  50. data/app/pb_kits/playbook/pb_date_stacked/_date_stacked.scss +66 -26
  51. data/app/pb_kits/playbook/pb_date_stacked/date_stacked.rb +1 -1
  52. data/app/pb_kits/playbook/pb_date_stacked/date_stacked.test.js +2 -2
  53. data/app/pb_kits/playbook/pb_date_time/_date_time.scss +8 -15
  54. data/app/pb_kits/playbook/pb_date_time_stacked/_date_time_stacked.scss +6 -7
  55. data/app/pb_kits/playbook/pb_date_year_stacked/_date_year_stacked.scss +17 -14
  56. data/app/pb_kits/playbook/pb_date_year_stacked/date_year_stacked.test.js +1 -1
  57. data/app/pb_kits/playbook/pb_detail/_detail.scss +86 -21
  58. data/app/pb_kits/playbook/pb_dialog/_dialog.scss +330 -123
  59. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_loading.html.erb +16 -2
  60. data/app/pb_kits/playbook/pb_distribution_bar/_distribution_bar.scss +10 -7
  61. data/app/pb_kits/playbook/pb_draggable/draggable.test.jsx +1 -1
  62. data/app/pb_kits/playbook/pb_dropdown/_dropdown.scss +1 -1
  63. data/app/pb_kits/playbook/pb_dropdown/dropdown.test.jsx +6 -6
  64. data/app/pb_kits/playbook/pb_dropdown/index.js +3 -3
  65. data/app/pb_kits/playbook/pb_empty_state/_empty_state.scss +4 -4
  66. data/app/pb_kits/playbook/pb_file_upload/_file_upload.scss +20 -9
  67. data/app/pb_kits/playbook/pb_file_upload/file_upload.html.erb +1 -1
  68. data/app/pb_kits/playbook/pb_filter/_filter.scss +8 -8
  69. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/_fixed_confirmation_toast.scss +65 -29
  70. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/_fixed_confirmation_toast.tsx +1 -2
  71. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/_fixed_confirmation_toast_props_swift.md +3 -2
  72. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/fixed_confirmation_toast.test.js +1 -1
  73. data/app/pb_kits/playbook/pb_flex/_flex.scss +106 -100
  74. data/app/pb_kits/playbook/pb_flex/_flex.tsx +38 -28
  75. data/app/pb_kits/playbook/pb_flex/_flex_item.scss +146 -51
  76. data/app/pb_kits/playbook/pb_flex/_flex_item.tsx +19 -8
  77. data/app/pb_kits/playbook/pb_flex/docs/_flex_gap.html.erb +12 -1
  78. data/app/pb_kits/playbook/pb_flex/docs/_flex_gap.jsx +26 -1
  79. data/app/pb_kits/playbook/pb_flex/docs/_flex_gap_rails.md +11 -0
  80. data/app/pb_kits/playbook/pb_flex/docs/_flex_gap_react.md +11 -0
  81. data/app/pb_kits/playbook/pb_flex/flex.rb +22 -28
  82. data/app/pb_kits/playbook/pb_flex/flex_item.rb +6 -6
  83. data/app/pb_kits/playbook/pb_form_group/_form_group.scss +1 -1
  84. data/app/pb_kits/playbook/pb_form_pill/_form_pill.scss +381 -344
  85. data/app/pb_kits/playbook/pb_form_pill/_form_pill.test.jsx +4 -4
  86. data/app/pb_kits/playbook/pb_form_pill/_form_pill.tsx +8 -7
  87. data/app/pb_kits/playbook/pb_form_pill/form_pill.rb +9 -2
  88. data/app/pb_kits/playbook/pb_gauge/_gauge.scss +5 -5
  89. data/app/pb_kits/playbook/pb_hashtag/_hashtag.scss +1 -1
  90. data/app/pb_kits/playbook/pb_highlight/_highlight.scss +1 -1
  91. data/app/pb_kits/playbook/pb_home_address_street/home_adress_street.test.js +2 -2
  92. data/app/pb_kits/playbook/pb_icon/_icon.scss +4 -0
  93. data/app/pb_kits/playbook/pb_icon_button/_icon_button.scss +4 -4
  94. data/app/pb_kits/playbook/pb_icon_circle/_icon_circle.scss +40 -39
  95. data/app/pb_kits/playbook/pb_icon_circle/icon_circle.rb +1 -1
  96. data/app/pb_kits/playbook/pb_icon_stat_value/icon_stat_value.test.js +1 -1
  97. data/app/pb_kits/playbook/pb_icon_value/_icon_value.scss +16 -15
  98. data/app/pb_kits/playbook/pb_image/_image.scss +41 -36
  99. data/app/pb_kits/playbook/pb_label_pill/_label_pill.scss +1 -1
  100. data/app/pb_kits/playbook/pb_label_value/_label_value.scss +3 -2
  101. data/app/pb_kits/playbook/pb_label_value/label_value.test.js +2 -2
  102. data/app/pb_kits/playbook/pb_layout/_layout.scss +336 -305
  103. data/app/pb_kits/playbook/pb_layout/_layout.tsx +14 -11
  104. data/app/pb_kits/playbook/pb_layout/item.rb +1 -7
  105. data/app/pb_kits/playbook/pb_layout/layout.rb +16 -25
  106. data/app/pb_kits/playbook/pb_layout/layout.test.js +3 -3
  107. data/app/pb_kits/playbook/pb_legend/_legend.scss +66 -16
  108. data/app/pb_kits/playbook/pb_legend/legend.test.js +1 -1
  109. data/app/pb_kits/playbook/pb_lightbox/lightbox.scss +4 -4
  110. data/app/pb_kits/playbook/pb_lightbox/lightbox.test.jsx +1 -1
  111. data/app/pb_kits/playbook/pb_link/_link.scss +113 -19
  112. data/app/pb_kits/playbook/pb_list/_list.scss +1 -1
  113. data/app/pb_kits/playbook/pb_loading_inline/_loading_inline.scss +13 -11
  114. data/app/pb_kits/playbook/pb_map/_map.scss +1 -1
  115. data/app/pb_kits/playbook/pb_map/docs/_map_default.jsx +1 -1
  116. data/app/pb_kits/playbook/pb_map/docs/_map_with_custom_button.jsx +1 -1
  117. data/app/pb_kits/playbook/pb_map/docs/_map_with_plugin.jsx +1 -1
  118. data/app/pb_kits/playbook/pb_message/_message.scss +21 -16
  119. data/app/pb_kits/playbook/pb_message/_message.tsx +1 -0
  120. data/app/pb_kits/playbook/pb_message/_message_mixins.scss +5 -12
  121. data/app/pb_kits/playbook/pb_message/message.html.erb +1 -1
  122. data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.scss +6 -3
  123. data/app/pb_kits/playbook/pb_multiple_users/_multiple_users.scss +16 -15
  124. data/app/pb_kits/playbook/pb_multiple_users_stacked/_multiple_users_stacked.scss +1 -1
  125. data/app/pb_kits/playbook/pb_nav/_bold_mixin.scss +1 -1
  126. data/app/pb_kits/playbook/pb_nav/_collapsible_nav.scss +1 -1
  127. data/app/pb_kits/playbook/pb_online_status/_online_status.scss +19 -15
  128. data/app/pb_kits/playbook/pb_online_status/_online_status.tsx +1 -1
  129. data/app/pb_kits/playbook/pb_online_status/online_status.rb +5 -4
  130. data/app/pb_kits/playbook/pb_online_status/online_status.test.js +2 -2
  131. data/app/pb_kits/playbook/pb_overlay/_overlay.scss +1 -1
  132. data/app/pb_kits/playbook/pb_overlay/overlay.rb +1 -1
  133. data/app/pb_kits/playbook/pb_passphrase/_passphrase.scss +5 -2
  134. data/app/pb_kits/playbook/pb_person/_person.scss +1 -1
  135. data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.scss +1 -1
  136. data/app/pb_kits/playbook/pb_pill/_pill.scss +23 -21
  137. data/app/pb_kits/playbook/pb_progress_pills/_progress_pills.scss +15 -13
  138. data/app/pb_kits/playbook/pb_progress_simple/_progress_simple.scss +108 -33
  139. data/app/pb_kits/playbook/pb_progress_step/_progress_step.scss +1 -1
  140. data/app/pb_kits/playbook/pb_radio/_radio.scss +71 -52
  141. data/app/pb_kits/playbook/pb_radio/_radio.tsx +1 -1
  142. data/app/pb_kits/playbook/pb_radio/docs/_radio_react_hook.jsx +0 -3
  143. data/app/pb_kits/playbook/pb_rich_text_editor/_rich_text_editor.scss +4 -4
  144. data/app/pb_kits/playbook/pb_section_separator/_section_separator.scss +81 -70
  145. data/app/pb_kits/playbook/pb_section_separator/_section_separator.tsx +9 -1
  146. data/app/pb_kits/playbook/pb_section_separator/_section_separator_mixin.scss +1 -1
  147. data/app/pb_kits/playbook/pb_section_separator/docs/_section_separator_color.jsx +3 -1
  148. data/app/pb_kits/playbook/pb_section_separator/section_separator.rb +7 -1
  149. data/app/pb_kits/playbook/pb_select/_select.scss +4 -4
  150. data/app/pb_kits/playbook/pb_selectable_card/_selectable_card.scss +6 -2
  151. data/app/pb_kits/playbook/pb_selectable_card_icon/_selectable_card_icon.scss +17 -8
  152. data/app/pb_kits/playbook/pb_selectable_icon/_selectable_icon.scss +39 -29
  153. data/app/pb_kits/playbook/pb_selectable_list/_item.tsx +2 -0
  154. data/app/pb_kits/playbook/pb_selectable_list/_selectable_list.scss +8 -11
  155. data/app/pb_kits/playbook/pb_selectable_list/selectable_list.test.js +2 -3
  156. data/app/pb_kits/playbook/pb_selectable_list/selectable_list_item.html.erb +2 -2
  157. data/app/pb_kits/playbook/pb_source/_source.scss +8 -8
  158. data/app/pb_kits/playbook/pb_star_rating/_star_rating.scss +1 -1
  159. data/app/pb_kits/playbook/pb_star_rating/star_rating.test.js +1 -1
  160. data/app/pb_kits/playbook/pb_stat_value/_stat_value.scss +2 -2
  161. data/app/pb_kits/playbook/pb_text_input/_text_input.scss +5 -5
  162. data/app/pb_kits/playbook/pb_text_input/_text_input.tsx +3 -0
  163. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_autocomplete.html.erb +41 -0
  164. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_autocomplete.jsx +80 -0
  165. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_autocomplete.md +1 -0
  166. data/app/pb_kits/playbook/pb_text_input/docs/example.yml +3 -0
  167. data/app/pb_kits/playbook/pb_text_input/docs/index.js +1 -0
  168. data/app/pb_kits/playbook/pb_text_input/text_input.rb +17 -3
  169. data/app/pb_kits/playbook/pb_text_input/text_input.test.js +38 -0
  170. data/app/pb_kits/playbook/pb_textarea/_textarea.scss +6 -6
  171. data/app/pb_kits/playbook/pb_time/_time.scss +44 -17
  172. data/app/pb_kits/playbook/pb_time_range_inline/_time_range_inline.scss +44 -23
  173. data/app/pb_kits/playbook/pb_time_range_inline/time_range_inline.rb +1 -1
  174. data/app/pb_kits/playbook/pb_time_stacked/_time_stacked.scss +5 -8
  175. data/app/pb_kits/playbook/pb_timestamp/_timestamp.scss +16 -10
  176. data/app/pb_kits/playbook/pb_timestamp/_timestamp.tsx +1 -4
  177. data/app/pb_kits/playbook/pb_timestamp/timestamp.rb +1 -1
  178. data/app/pb_kits/playbook/pb_timestamp/timestamp.test.js +2 -2
  179. data/app/pb_kits/playbook/pb_title/_title.scss +44 -39
  180. data/app/pb_kits/playbook/pb_title/_title.tsx +17 -8
  181. data/app/pb_kits/playbook/pb_title/_title_mixin.scss +2 -2
  182. data/app/pb_kits/playbook/pb_title/title.rb +20 -10
  183. data/app/pb_kits/playbook/pb_title/title.test.js +4 -4
  184. data/app/pb_kits/playbook/pb_title_count/_title_count.scss +19 -8
  185. data/app/pb_kits/playbook/pb_title_detail/_title_detail.scss +10 -11
  186. data/app/pb_kits/playbook/pb_toggle/_toggle.scss +4 -1
  187. data/app/pb_kits/playbook/pb_tooltip/_tooltip.scss +3 -4
  188. data/app/pb_kits/playbook/pb_tooltip/tooltip.rb +1 -1
  189. data/app/pb_kits/playbook/pb_typeahead/_typeahead.test.jsx +3 -3
  190. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills.html.erb +1 -1
  191. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills.jsx +1 -1
  192. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_color.html.erb +1 -22
  193. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_color.jsx +1 -1
  194. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_without_pills.html.erb +2 -2
  195. data/app/pb_kits/playbook/pb_user/_user.scss +83 -33
  196. data/app/pb_kits/playbook/pb_user/docs/_user_props_table.md +14 -7
  197. data/app/pb_kits/playbook/pb_user/user.test.js +1 -1
  198. data/app/pb_kits/playbook/pb_user_badge/_user_badge.scss +23 -8
  199. data/app/pb_kits/playbook/pb_weekday_stacked/_weekday_stacked.scss +10 -10
  200. data/app/pb_kits/playbook/pb_weekday_stacked/weekday_stacked.test.jsx +3 -3
  201. data/app/pb_kits/playbook/utilities/_gap.scss +12 -24
  202. data/app/pb_kits/playbook/utilities/globalPropNames.mjs +2 -0
  203. data/app/pb_kits/playbook/utilities/globalProps.ts +28 -4
  204. data/dist/chunks/{_line_graph-Ccznc59K.js → _line_graph-CTpWU06n.js} +1 -1
  205. data/dist/chunks/_typeahead-DmVCLhQz.js +6 -0
  206. data/dist/chunks/_weekday_stacked-DvnT8mDi.js +37 -0
  207. data/dist/chunks/{lib-C43ywQsO.js → lib-CY5ZPzic.js} +1 -1
  208. data/dist/chunks/{pb_form_validation-Cqj3itLG.js → pb_form_validation-D3b0JKHH.js} +1 -1
  209. data/dist/chunks/vendor.js +1 -1
  210. data/dist/menu.yml +0 -6
  211. data/dist/playbook-doc.js +2 -2
  212. data/dist/playbook-rails-react-bindings.js +1 -1
  213. data/dist/playbook-rails.js +1 -1
  214. data/dist/playbook.css +1 -1
  215. data/lib/playbook/classnames.rb +2 -0
  216. data/lib/playbook/spacing.rb +53 -1
  217. data/lib/playbook/version.rb +1 -1
  218. metadata +13 -37
  219. data/app/pb_kits/playbook/pb_drawer/_close_icon.tsx +0 -25
  220. data/app/pb_kits/playbook/pb_drawer/_drawer.scss +0 -381
  221. data/app/pb_kits/playbook/pb_drawer/_drawer.tsx +0 -231
  222. data/app/pb_kits/playbook/pb_drawer/_drawer_context.tsx +0 -3
  223. data/app/pb_kits/playbook/pb_drawer/context.ts +0 -11
  224. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_behavior.html.erb +0 -8
  225. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_behavior.jsx +0 -41
  226. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_borders.html.erb +0 -33
  227. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_borders.jsx +0 -78
  228. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_breakpoints.html.erb +0 -3
  229. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_breakpoints.jsx +0 -26
  230. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_default.html.erb +0 -20
  231. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_default.jsx +0 -59
  232. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_menu.html.erb +0 -24
  233. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_menu.jsx +0 -61
  234. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_menu.md +0 -24
  235. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_overlay.html.erb +0 -21
  236. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_overlay.jsx +0 -54
  237. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_overlay.md +0 -1
  238. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_sizes.html.erb +0 -49
  239. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_sizes.jsx +0 -99
  240. data/app/pb_kits/playbook/pb_drawer/docs/example.yml +0 -20
  241. data/app/pb_kits/playbook/pb_drawer/docs/index.js +0 -7
  242. data/app/pb_kits/playbook/pb_drawer/drawer.html.erb +0 -20
  243. data/app/pb_kits/playbook/pb_drawer/drawer.rb +0 -56
  244. data/app/pb_kits/playbook/pb_drawer/drawer.test.jsx +0 -81
  245. data/app/pb_kits/playbook/pb_drawer/hooks/useBreakpoint.tsx +0 -60
  246. data/app/pb_kits/playbook/pb_drawer/hooks/useDrawerAnimation.tsx +0 -21
  247. data/app/pb_kits/playbook/pb_drawer/index.js +0 -257
  248. data/app/pb_kits/playbook/pb_flex/docs/_flex_gap.md +0 -9
  249. data/dist/chunks/_typeahead-QdrWudzd.js +0 -6
  250. data/dist/chunks/_weekday_stacked-DG1VCDDN.js +0 -37
@@ -2,7 +2,7 @@
2
2
  @import "../tokens/titles";
3
3
  @import "../tokens/colors";
4
4
 
5
- [class^="pb_text_input_kit"] {
5
+ .pb_text_input_kit {
6
6
  .pb_text_input_kit_label {
7
7
  margin-bottom: $space_xs;
8
8
  display: block;
@@ -76,7 +76,7 @@
76
76
  .text_input {
77
77
  border-color: $error_dark;
78
78
  }
79
- [class*=pb_body_kit_negative] {
79
+ .pb_body_kit_negative {
80
80
  color: $error_dark;
81
81
  }
82
82
  }
@@ -100,7 +100,7 @@
100
100
  }
101
101
  &.error {
102
102
  .text_input_wrapper {
103
- [class*="pb_body_kit"] {
103
+ .pb_body_kit_negative {
104
104
  margin-top: $space_xs / 2;
105
105
  }
106
106
  // The `:not` here prevents error styling from affecting the country search input in the Phone Number Input Kit.
@@ -174,9 +174,9 @@
174
174
  }
175
175
 
176
176
  .text_input_wrapper_add_on {
177
- & > [class^="pb_text_input_kit"]:not(:last-child) {
177
+ & > .pb_text_input_kit:not(:last-child) {
178
178
  .text_input_wrapper_add_on input,
179
- [class^="pb_text_input_kit"] .text_input_wrapper_add_on .text_input {
179
+ .pb_text_input_kit .text_input_wrapper_add_on .text_input {
180
180
  border-bottom-right-radius: 0;
181
181
  border-top-right-radius: 0;
182
182
  border-right-width: 0;
@@ -36,6 +36,7 @@ type TextInputProps = {
36
36
  alignment?: "right" | "left",
37
37
  border?: boolean,
38
38
  },
39
+ autoComplete?: boolean | string,
39
40
  } & GlobalProps
40
41
 
41
42
  const TextInput = (props: TextInputProps, ref: React.LegacyRef<HTMLInputElement>) => {
@@ -59,6 +60,7 @@ const TextInput = (props: TextInputProps, ref: React.LegacyRef<HTMLInputElement>
59
60
  type = 'text',
60
61
  value = '',
61
62
  children = null,
63
+ autoComplete = true,
62
64
  } = props
63
65
 
64
66
  const ariaProps = buildAriaProps(aria)
@@ -142,6 +144,7 @@ const TextInput = (props: TextInputProps, ref: React.LegacyRef<HTMLInputElement>
142
144
  childInput ? React.cloneElement(children, { className: "text_input" }) :
143
145
  (<input
144
146
  {...domSafeProps(props)}
147
+ autoComplete={typeof autoComplete === "string" ? autoComplete : ( autoComplete ? undefined : "off" )}
145
148
  className="text_input"
146
149
  disabled={disabled}
147
150
  id={id}
@@ -0,0 +1,41 @@
1
+ <%= pb_rails("text_input", props: {
2
+ autocomplete: false,
3
+ label: "autocomplete='off'",
4
+ name: "firstName",
5
+ placeholder: "Enter first name",
6
+ }) %>
7
+
8
+ <%= pb_rails("text_input", props: {
9
+ label: "no autocomplete attribute (let browser decide- basically 'on')",
10
+ name: "lastName",
11
+ placeholder: "Enter last name"
12
+ }) %>
13
+
14
+ <%= pb_rails("text_input", props: {
15
+ autocomplete: true,
16
+ label: "autocomplete='on'",
17
+ name: "phone",
18
+ type: "phone",
19
+ placeholder: "Enter phone number"
20
+ }) %>
21
+
22
+ <%= pb_rails("body", props: { margin_bottom: "sm" }) do %>
23
+ The following have the same autocomplete attributes (email), but have
24
+ different name attributes (email and emailAlt). Many browsers will
25
+ open autocomplete based on name attributes instead of autocomplete:
26
+ <% end %>
27
+
28
+ <%= pb_rails("text_input", props: {
29
+ autocomplete: "email",
30
+ label: "autocomplete='email' name='email'",
31
+ name: "email",
32
+ placeholder: "Enter email address"
33
+ }) %>
34
+
35
+ <%= pb_rails("text_input", props: {
36
+ autocomplete: "email",
37
+ label: "autocomplete='email' name='emailAlt'",
38
+ name: "emailAlt",
39
+ type: "email",
40
+ placeholder: "Enter email address"
41
+ }) %>
@@ -0,0 +1,80 @@
1
+ import React, { useState } from 'react'
2
+
3
+ import TextInput from '../../pb_text_input/_text_input'
4
+ import Body from '../../pb_body/_body'
5
+
6
+
7
+ const TextInputAutocomplete = (props) => {
8
+ const [formFields, setFormFields] = useState({
9
+ firstName: "",
10
+ lastName: "",
11
+ phone: "",
12
+ emailTest: "",
13
+ email: "",
14
+ });
15
+
16
+ const handleOnChangeFormField = ({ target }) => {
17
+ const { name, value } = target;
18
+ setFormFields({ ...formFields, [name]: value });
19
+ };
20
+
21
+ return (
22
+ <div>
23
+ <TextInput
24
+ autoComplete={false}
25
+ label="autocomplete='off'"
26
+ name="firstName"
27
+ onChange={handleOnChangeFormField}
28
+ placeholder="Enter first name"
29
+ value={formFields.firstName}
30
+ {...props}
31
+ />
32
+ <TextInput
33
+ label="no autocomplete attribute (let browser decide- basically 'on')"
34
+ name="lastName"
35
+ onChange={handleOnChangeFormField}
36
+ placeholder="Enter last name"
37
+ value={formFields.lastName}
38
+ {...props}
39
+ />
40
+ <TextInput
41
+ autoComplete
42
+ label="autocomplete='on'"
43
+ name="phone"
44
+ onChange={handleOnChangeFormField}
45
+ placeholder="Enter phone number"
46
+ type="phone"
47
+ value={formFields.phone}
48
+ {...props}
49
+ />
50
+ <Body marginBottom="sm">
51
+ The following have the same autocomplete attributes (email), but have
52
+ different name attributes (email and emailAlt). Many browsers will
53
+ open autocomplete based on name attributes instead of autocomplete:
54
+ </Body>
55
+ <TextInput
56
+ autoComplete="email"
57
+ label="autocomplete='email' name='email'"
58
+ name="email"
59
+ onChange={handleOnChangeFormField}
60
+ placeholder="Enter email address"
61
+ type="email"
62
+ value={formFields.email}
63
+ {...props}
64
+ />
65
+ <TextInput
66
+ autoComplete="email"
67
+ label="autocomplete='email' name='emailAlt'"
68
+ marginTop="sm"
69
+ name="emailTest"
70
+ onChange={handleOnChangeFormField}
71
+ placeholder="Enter email address"
72
+ type="email"
73
+ value={formFields.emailTest}
74
+ {...props}
75
+ />
76
+ </div>
77
+ );
78
+ };
79
+
80
+ export default TextInputAutocomplete;
@@ -0,0 +1 @@
1
+ Set this prop to `false` or `"off"` to remove autocomplete from text inputs. You can also set it to a string, but browsers will often defer to other attributes like `name`.
@@ -9,6 +9,8 @@ examples:
9
9
  - text_input_no_label: No Label
10
10
  - text_input_options: Input Options
11
11
  - text_input_mask: Mask
12
+ - text_input_autocomplete: Autocomplete
13
+
12
14
  react:
13
15
  - text_input_default: Default
14
16
  - text_input_error: With Error
@@ -19,6 +21,7 @@ examples:
19
21
  - text_input_no_label: No Label
20
22
  - text_input_mask: Mask
21
23
  - text_input_sanitize: Sanitized Masked Input
24
+ - text_input_autocomplete: Autocomplete
22
25
 
23
26
 
24
27
  swift:
@@ -7,3 +7,4 @@ export { default as TextInputInline } from './_text_input_inline.jsx'
7
7
  export { default as TextInputNoLabel } from './_text_input_no_label.jsx'
8
8
  export { default as TextInputMask } from './_text_input_mask.jsx'
9
9
  export { default as TextInputSanitize } from './_text_input_sanitize.jsx'
10
+ export { default as TextInputAutocomplete } from './_text_input_autocomplete.jsx'
@@ -15,8 +15,7 @@ module Playbook
15
15
  "cvv" => '\d{3,4}',
16
16
  }.freeze
17
17
 
18
- prop :autocomplete, type: Playbook::Props::Boolean,
19
- default: true
18
+ prop :autocomplete, default: true
20
19
  prop :disabled, type: Playbook::Props::Boolean,
21
20
  default: false
22
21
  prop :error
@@ -69,7 +68,7 @@ module Playbook
69
68
 
70
69
  def all_input_options
71
70
  {
72
- autocomplete: autocomplete ? nil : "off",
71
+ autocomplete: autocomplete == true ? nil : (autocomplete.presence || "off"),
73
72
  class: "text_input #{input_options.dig(:classname) || ''}",
74
73
  data: validation_data,
75
74
  disabled: disabled,
@@ -77,6 +76,7 @@ module Playbook
77
76
  name: mask.present? ? "" : name,
78
77
  pattern: validation_pattern || mask_pattern,
79
78
  placeholder: placeholder,
79
+ style: "cursor: #{cursor_style}",
80
80
  required: required,
81
81
  type: type,
82
82
  value: value,
@@ -84,6 +84,20 @@ module Playbook
84
84
  }.merge(input_options)
85
85
  end
86
86
 
87
+ def cursor_style
88
+ # If input is disabled, always use 'not-allowed'
89
+ return "not-allowed" if disabled
90
+
91
+ # If cursor prop is provided, convert it to kebab-case
92
+ if cursor.present?
93
+ # Convert camelCase (ex. notAllowed) to kebab-case (ex. not-allowed)
94
+ cursor.to_s.gsub(/([a-z\d])([A-Z])/, '\1-\2').downcase
95
+ else
96
+ # Default to 'pointer'
97
+ "pointer"
98
+ end
99
+ end
100
+
87
101
  def validation_message
88
102
  validation[:message] || ""
89
103
  end
@@ -306,3 +306,41 @@ test('returns masked CVV value', () => {
306
306
 
307
307
  expect(input.value).toBe('')
308
308
  })
309
+
310
+ test('adds autocomplete string attribute', () => {
311
+ render(
312
+ <TextInput
313
+ autoComplete="family-name"
314
+ data={{ testid: testId }}
315
+ />
316
+ )
317
+
318
+ const kit = screen.getByTestId(testId)
319
+ const input = within(kit).getByRole('textbox')
320
+ expect(input).toHaveAttribute("autocomplete", "family-name")
321
+ })
322
+
323
+ test('adds autocomplete "off" attribute', () => {
324
+ render(
325
+ <TextInput
326
+ autoComplete={false}
327
+ data={{ testid: testId }}
328
+ />
329
+ )
330
+
331
+ const kit = screen.getByTestId(testId)
332
+ const input = within(kit).getByRole('textbox')
333
+ expect(input).toHaveAttribute("autocomplete", "off")
334
+ })
335
+
336
+ test('does not add autocomplete attribute otherwise', () => {
337
+ render(
338
+ <TextInput
339
+ data={{ testid: testId }}
340
+ />
341
+ )
342
+
343
+ const kit = screen.getByTestId(testId)
344
+ const input = within(kit).getByRole('textbox')
345
+ expect(input).not.toHaveAttribute("autocomplete")
346
+ })
@@ -3,11 +3,11 @@
3
3
  @import "../tokens/spacing";
4
4
  @import "../tokens/titles";
5
5
 
6
- [class^=pb_textarea_kit] {
6
+ .pb_textarea_kit {
7
7
  margin-bottom: $space_sm;
8
8
 
9
- [class^=pb_caption_kit] {
10
- margin-bottom: $space_xs;
9
+ .pb_caption_kit_md {
10
+ margin-bottom: $space_xs !important;
11
11
  display: block;
12
12
  }
13
13
  textarea::placeholder,
@@ -59,8 +59,8 @@
59
59
  }
60
60
 
61
61
  &.error {
62
- [class*=pb_body_kit] {
63
- margin-top: $space_xs / 2;
62
+ .pb_body_kit_negative {
63
+ margin-top: $space_xs / 2 !important;
64
64
  }
65
65
  textarea {
66
66
  border-color: $error;
@@ -81,4 +81,4 @@
81
81
  .pb_caption_kit_xs {
82
82
  text-align: right;
83
83
  }
84
- }
84
+ }
@@ -4,16 +4,20 @@
4
4
  @import "../pb_body/body";
5
5
  @import "../pb_caption/caption";
6
6
 
7
- [class^=pb_time_kit] {
8
- &[class*=_center] {
9
- text-align: center;
10
- }
11
-
12
- &[class*=_right] {
13
- text-align: right;
14
- }
7
+ .pb_time_kit,
8
+ .pb_time_kit_left,
9
+ .pb_time_kit_center,
10
+ .pb_time_kit_right,
11
+ .pb_time_kit_sm,
12
+ .pb_time_kit_md,
13
+ .pb_time_kit_left_sm,
14
+ .pb_time_kit_left_md,
15
+ .pb_time_kit_center_sm,
16
+ .pb_time_kit_center_md,
17
+ .pb_time_kit_right_sm,
18
+ .pb_time_kit_right_md {
15
19
 
16
- [class^=pb_time_timezone] {
20
+ .pb_time_timezone {
17
21
  color: $text_lt_light;
18
22
  font-weight: $bold;
19
23
 
@@ -21,13 +25,36 @@
21
25
  content: " ";
22
26
  }
23
27
  }
28
+ }
24
29
 
25
- &[class*=dark] {
26
- & * {
27
- @include caption_dark;
28
- }
29
- .pb_time {
30
- color: $text_dk_default;
31
- }
32
- }
30
+ .pb_time_kit_center,
31
+ .pb_time_kit_center_sm,
32
+ .pb_time_kit_center_md {
33
+ text-align: center;
34
+ }
35
+
36
+ .pb_time_kit_right,
37
+ .pb_time_kit_right_sm,
38
+ .pb_time_kit_right_md {
39
+ text-align: right;
33
40
  }
41
+
42
+ .pb_time_kit.dark,
43
+ .pb_time_kit_left.dark,
44
+ .pb_time_kit_center.dark,
45
+ .pb_time_kit_right.dark,
46
+ .pb_time_kit_sm.dark,
47
+ .pb_time_kit_md.dark,
48
+ .pb_time_kit_left_sm.dark,
49
+ .pb_time_kit_left_md.dark,
50
+ .pb_time_kit_center_sm.dark,
51
+ .pb_time_kit_center_md.dark,
52
+ .pb_time_kit_right_sm.dark,
53
+ .pb_time_kit_right_md.dark {
54
+ & * {
55
+ @include caption_dark;
56
+ }
57
+ .pb_time {
58
+ color: $text_dk_default;
59
+ }
60
+ }
@@ -1,35 +1,56 @@
1
1
 
2
- [class^=pb_time_range_inline_kit] {
3
- &[class*=_center] {
4
- & > [class^=pb_caption],
5
- & > [class^=pb_body] {
6
- text-align: center;
7
- }
8
- & > [class*=pb_time_range_inline_wrapper] {
9
- justify-content: center;
10
- }
11
- }
12
- &[class*=_right] {
13
- & > [class^=pb_caption],
14
- & > [class^=pb_body] {
15
- text-align: right;
16
- }
17
- & > [class*=pb_time_range_inline_wrapper] {
18
- justify-content: flex-end;
19
- }
20
- }
21
- [class^=pb_time_range_inline_wrapper] {
2
+ @import "../tokens/spacing";
3
+
4
+ // Base time range inline classes
5
+ .pb_time_range_inline_kit_left,
6
+ .pb_time_range_inline_kit_center,
7
+ .pb_time_range_inline_kit_right,
8
+ .pb_time_range_inline_kit_vertical {
9
+ .pb_time_range_inline_wrapper {
22
10
  display: flex;
23
11
  align-items: center;
24
- [class*=pb_time_range_inline_arrow] {
12
+ .pb_time_range_inline_arrow {
25
13
  margin-left: $space_xs/2;
26
14
  margin-right: $space_xs/2;
27
15
  }
28
- [class*=pb_time_range_inline_timezone] {
16
+ .pb_time_range_inline_timezone {
29
17
  margin-left: $space_xs/2;
30
18
  }
31
- [class*=pb_time_range_inline_icon] {
19
+ .pb_time_range_inline_icon {
32
20
  margin-right: $space_xs/2;
33
21
  }
34
22
  }
35
23
  }
24
+
25
+ // Center alignment
26
+ .pb_time_range_inline_kit_center {
27
+ & > .pb_caption_kit,
28
+ & > .pb_body_kit {
29
+ text-align: center;
30
+ }
31
+ & > .pb_time_range_inline_wrapper {
32
+ justify-content: center;
33
+ }
34
+ }
35
+
36
+ // Right alignment
37
+ .pb_time_range_inline_kit_right {
38
+ & > .pb_caption_kit,
39
+ & > .pb_body_kit {
40
+ text-align: right;
41
+ }
42
+ & > .pb_time_range_inline_wrapper {
43
+ justify-content: flex-end;
44
+ }
45
+ }
46
+
47
+ // Vertical alignment
48
+ .pb_time_range_inline_kit_vertical {
49
+ & > .pb_caption_kit,
50
+ & > .pb_body_kit {
51
+ text-align: center;
52
+ }
53
+ & > .pb_time_range_inline_wrapper {
54
+ justify-content: center;
55
+ }
56
+ }
@@ -16,7 +16,7 @@ module Playbook
16
16
  prop :timezone, default: false
17
17
 
18
18
  def classname
19
- generate_classname("pb_time_range_inline_kit", dark_class, alignment)
19
+ generate_classname("pb_time_range_inline_kit", alignment)
20
20
  end
21
21
 
22
22
  def format_start_time_string
@@ -2,15 +2,12 @@
2
2
  @import "../pb_caption/caption";
3
3
  @import "../tokens/colors";
4
4
 
5
- [class^=pb_time_stacked_kit] {
6
- &[class*=_center] {
7
- text-align: center;
8
- }
9
-
10
- &[class*=_right] {
11
- text-align: right;
12
- }
5
+ .pb_time_stacked_kit_center {
6
+ text-align: center;
7
+ }
13
8
 
9
+ .pb_time_stacked_kit_right {
10
+ text-align: right;
14
11
  }
15
12
 
16
13
  .time-spacing {
@@ -1,16 +1,22 @@
1
1
  @import "timestamp-mixins";
2
2
  @import "../tokens/colors";
3
3
 
4
- [class^=pb_timestamp_kit]{
4
+ .pb_timestamp_kit_left,
5
+ .pb_timestamp_kit_center,
6
+ .pb_timestamp_kit_right {
5
7
  @include pb_timestamp;
8
+ }
9
+
10
+ .pb_timestamp_kit_center {
11
+ text-align: center;
12
+ }
13
+
14
+ .pb_timestamp_kit_right {
15
+ text-align: right;
16
+ }
6
17
 
7
- &[class*=_center] {
8
- text-align: center;
9
- }
10
- &[class*=_right] {
11
- text-align: right;
12
- }
13
- &[class*=_dark] {
14
- color: $text_dk_default;
15
- }
18
+ .pb_timestamp_kit_left.dark,
19
+ .pb_timestamp_kit_center.dark,
20
+ .pb_timestamp_kit_right.dark {
21
+ color: $text_dk_default;
16
22
  }
@@ -49,10 +49,7 @@ const Timestamp = (props: TimestampProps): React.ReactElement => {
49
49
  const dataProps = buildDataProps(data)
50
50
  const htmlProps = buildHtmlProps(htmlOptions)
51
51
  const classes = classnames(
52
- buildCss('pb_timestamp_kit', align, {
53
- dark: dark,
54
- variant: variant,
55
- }),
52
+ buildCss('pb_timestamp_kit', align),
56
53
  globalProps(props),
57
54
  className
58
55
  )
@@ -40,7 +40,7 @@ module Playbook
40
40
  SECS_PER_CENT = 100 * SECS_PER_YEAR # 3,153,600,000 seconds
41
41
 
42
42
  def classname
43
- generate_classname("pb_timestamp_kit", variant_class, align)
43
+ generate_classname("pb_timestamp_kit", align)
44
44
  end
45
45
 
46
46
  def timestamp_text
@@ -36,7 +36,7 @@ describe("Timestamp Kit", () => {
36
36
  );
37
37
 
38
38
  const kit = screen.getByTestId(testId);
39
- expect(kit).toHaveClass("pb_timestamp_kit_left_variant");
39
+ expect(kit).toHaveClass("pb_timestamp_kit_left");
40
40
  });
41
41
 
42
42
  test("renders Timestamp time", () => {
@@ -79,7 +79,7 @@ describe("Timestamp Kit", () => {
79
79
  );
80
80
 
81
81
  const kit = screen.getByTestId(testId);
82
- expect(kit).toHaveClass("pb_timestamp_kit_center_variant");
82
+ expect(kit).toHaveClass("pb_timestamp_kit_center");
83
83
  });
84
84
 
85
85
  test("renders Timestamp timezone", () => {