nfg_ui 0.9.8.15

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 (384) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +431 -0
  4. data/Rakefile +23 -0
  5. data/app/assets/config/nfg_ui_manifest.js +3 -0
  6. data/app/assets/images/nfg_ui/app_icon/android-chrome-192x192.png +0 -0
  7. data/app/assets/images/nfg_ui/app_icon/android-chrome-384x384.png +0 -0
  8. data/app/assets/images/nfg_ui/app_icon/apple-touch-icon.png +0 -0
  9. data/app/assets/images/nfg_ui/app_icon/browserconfig.xml.erb +9 -0
  10. data/app/assets/images/nfg_ui/app_icon/favicon-16x16.png +0 -0
  11. data/app/assets/images/nfg_ui/app_icon/favicon-32x32.png +0 -0
  12. data/app/assets/images/nfg_ui/app_icon/favicon.ico +0 -0
  13. data/app/assets/images/nfg_ui/app_icon/mstile-150x150.png +0 -0
  14. data/app/assets/images/nfg_ui/app_icon/safari-pinned-tab.svg +38 -0
  15. data/app/assets/images/nfg_ui/app_icon/site.webmanifest.erb +19 -0
  16. data/app/assets/images/nfg_ui/email/icons/fa-caret-right.png +0 -0
  17. data/app/assets/images/nfg_ui/email/icons/fa-facebook.png +0 -0
  18. data/app/assets/images/nfg_ui/email/icons/fa-linkedin.png +0 -0
  19. data/app/assets/images/nfg_ui/email/icons/fa-twitter.png +0 -0
  20. data/app/assets/images/nfg_ui/email/icons/fa-youtube.png +0 -0
  21. data/app/assets/images/nfg_ui/email/nfg-logo.png +0 -0
  22. data/app/assets/javascripts/nfg_ui/application.coffee +16 -0
  23. data/app/assets/javascripts/nfg_ui/collapsible_toggle.coffee +47 -0
  24. data/app/assets/javascripts/nfg_ui/prevent_clickable_disabled_element.coffee +47 -0
  25. data/app/assets/javascripts/nfg_ui/vendor/select2.coffee +26 -0
  26. data/app/assets/javascripts/nfg_ui/vendor/tooltips.coffee +18 -0
  27. data/app/assets/stylesheets/nfg_ui/bootstrap/application.scss +2 -0
  28. data/app/assets/stylesheets/nfg_ui/network_for_good/admin/_variables.scss +1123 -0
  29. data/app/assets/stylesheets/nfg_ui/network_for_good/admin/application.scss +23 -0
  30. data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/_alert.scss +2 -0
  31. data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/_backgrounds.scss +9 -0
  32. data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/_button-group.scss +8 -0
  33. data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/_buttons.scss +17 -0
  34. data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/_card.scss +20 -0
  35. data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/_custom.scss +20 -0
  36. data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/_custom_forms.scss +156 -0
  37. data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/_dropdown.scss +24 -0
  38. data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/_forms.scss +85 -0
  39. data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/_media.scss +2 -0
  40. data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/_nav.scss +22 -0
  41. data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/_navbar.scss +132 -0
  42. data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/_progress.scss +3 -0
  43. data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/_reboot.scss +31 -0
  44. data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/_tables.scss +7 -0
  45. data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/_tooltip.scss +5 -0
  46. data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/_type.scss +82 -0
  47. data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/custom/_campaign_card.scss +6 -0
  48. data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/custom/_campaign_preview.scss +25 -0
  49. data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/custom/_content_section_buttons.scss +11 -0
  50. data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/custom/_custom_questions_questionnaire.scss +84 -0
  51. data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/custom/_custom_receipt_language.scss +15 -0
  52. data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/custom/_email_preview.scss +24 -0
  53. data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/custom/_interaction.scss +2 -0
  54. data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/custom/_mobile.scss +4 -0
  55. data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/custom/_nav_step.scss +95 -0
  56. data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/custom/_overlay_blocker.scss +49 -0
  57. data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/custom/_page_header.scss +9 -0
  58. data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/custom/_product_icons.scss +45 -0
  59. data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/custom/_redactor.scss +25 -0
  60. data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/custom/_share_dropdown.scss +53 -0
  61. data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/custom/_slat.scss +113 -0
  62. data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/custom/_social_share.scss +44 -0
  63. data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/custom/_status_indicator.scss +9 -0
  64. data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/custom/_ticket.scss +12 -0
  65. data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/custom/_tile.scss +71 -0
  66. data/app/assets/stylesheets/nfg_ui/network_for_good/email/application.scss +38 -0
  67. data/app/assets/stylesheets/nfg_ui/network_for_good/email/foundation_emails/_alignment.scss +93 -0
  68. data/app/assets/stylesheets/nfg_ui/network_for_good/email/foundation_emails/_button.scss +345 -0
  69. data/app/assets/stylesheets/nfg_ui/network_for_good/email/nfg_theme/_backgrounds.scss +15 -0
  70. data/app/assets/stylesheets/nfg_ui/network_for_good/email/nfg_theme/_layout.scss +33 -0
  71. data/app/assets/stylesheets/nfg_ui/network_for_good/email/nfg_theme/_rainbow_bar.scss +47 -0
  72. data/app/assets/stylesheets/nfg_ui/network_for_good/email/nfg_theme/_spacers.scss +60 -0
  73. data/app/assets/stylesheets/nfg_ui/network_for_good/email/nfg_theme/_typography.scss +6 -0
  74. data/app/assets/stylesheets/nfg_ui/network_for_good/email/settings/_settings.scss +148 -0
  75. data/app/assets/stylesheets/nfg_ui/network_for_good/public/_variables.scss +1124 -0
  76. data/app/assets/stylesheets/nfg_ui/network_for_good/public/application.scss +23 -0
  77. data/app/assets/stylesheets/nfg_ui/network_for_good/public/entity_branding/application.scss +19 -0
  78. data/app/assets/stylesheets/nfg_ui/network_for_good/public/entity_branding/nfg_theme/_badge.scss +6 -0
  79. data/app/assets/stylesheets/nfg_ui/network_for_good/public/entity_branding/nfg_theme/_buttons.scss +43 -0
  80. data/app/assets/stylesheets/nfg_ui/network_for_good/public/entity_branding/nfg_theme/_custom.scss +3 -0
  81. data/app/assets/stylesheets/nfg_ui/network_for_good/public/entity_branding/nfg_theme/_custom_forms.scss +50 -0
  82. data/app/assets/stylesheets/nfg_ui/network_for_good/public/entity_branding/nfg_theme/_forms.scss +12 -0
  83. data/app/assets/stylesheets/nfg_ui/network_for_good/public/entity_branding/nfg_theme/_functions.scss +29 -0
  84. data/app/assets/stylesheets/nfg_ui/network_for_good/public/entity_branding/nfg_theme/_navbar.scss +18 -0
  85. data/app/assets/stylesheets/nfg_ui/network_for_good/public/entity_branding/nfg_theme/_reboot.scss +6 -0
  86. data/app/assets/stylesheets/nfg_ui/network_for_good/public/entity_branding/nfg_theme/_type.scss +16 -0
  87. data/app/assets/stylesheets/nfg_ui/network_for_good/public/entity_branding/nfg_theme/_utilities.scss +8 -0
  88. data/app/assets/stylesheets/nfg_ui/network_for_good/public/entity_branding/nfg_theme/custom/_everyday_default.scss +6 -0
  89. data/app/assets/stylesheets/nfg_ui/network_for_good/public/entity_branding/nfg_theme/custom/_nav_step.scss +20 -0
  90. data/app/assets/stylesheets/nfg_ui/network_for_good/public/entity_branding/plugins/_select2.scss +16 -0
  91. data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/_variables.scss +13 -0
  92. data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/application.scss +35 -0
  93. data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/_breadcrumb.scss +4 -0
  94. data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/_button-group.scss +10 -0
  95. data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/_card.scss +45 -0
  96. data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/_carousel.scss +18 -0
  97. data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/_custom-forms.scss +12 -0
  98. data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/_custom.scss +4 -0
  99. data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/_forms.scss +68 -0
  100. data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/_grid.scss +4 -0
  101. data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/_input-group.scss +25 -0
  102. data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/_list-group.scss +9 -0
  103. data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/_media.scss +5 -0
  104. data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/_mixins.scss +6 -0
  105. data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/_modal.scss +28 -0
  106. data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/_nav.scss +21 -0
  107. data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/_navbar.scss +54 -0
  108. data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/_pagination.scss +1 -0
  109. data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/_progress.scss +6 -0
  110. data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/_utilities.scss +2 -0
  111. data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/custom/_everyday_giving.scss +8 -0
  112. data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/custom/_nav_step.scss +13 -0
  113. data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/custom/_slat.scss +66 -0
  114. data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/mixins/_breakpoints.scss +123 -0
  115. data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/mixins/_grid-framework.scss +30 -0
  116. data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/mixins/_grid.scss +10 -0
  117. data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/utilities/_display.scss +9 -0
  118. data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/utilities/_flex.scss +49 -0
  119. data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/plugins/_sticky_div.scss +9 -0
  120. data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/_alert.scss +2 -0
  121. data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/_buttons.scss +17 -0
  122. data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/_card.scss +6 -0
  123. data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/_carousel.scss +9 -0
  124. data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/_custom.scss +12 -0
  125. data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/_custom_forms.scss +156 -0
  126. data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/_dropdown.scss +1 -0
  127. data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/_event.scss +19 -0
  128. data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/_forms.scss +83 -0
  129. data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/_list-group.scss +12 -0
  130. data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/_progress.scss +9 -0
  131. data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/_reboot.scss +31 -0
  132. data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/_tooltip.scss +5 -0
  133. data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/_type.scss +81 -0
  134. data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/custom/_admin_bar.scss +20 -0
  135. data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/custom/_background_variations.scss +12 -0
  136. data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/custom/_everyday_default.scss +43 -0
  137. data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/custom/_everyday_story.scss +21 -0
  138. data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/custom/_footer_links.scss +8 -0
  139. data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/custom/_nav_step.scss +95 -0
  140. data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/custom/_slat.scss +110 -0
  141. data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/custom/_social_share.scss +44 -0
  142. data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/custom/_ticket.scss +12 -0
  143. data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/custom/_tile.scss +63 -0
  144. data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/custom/_user_navbar.scss +33 -0
  145. data/app/assets/stylesheets/nfg_ui/network_for_good/public/plugins/_datepicker.scss +2 -0
  146. data/app/assets/stylesheets/nfg_ui/network_for_good/public/plugins/_select2.scss +216 -0
  147. data/app/assets/stylesheets/nfg_ui/network_for_good/public/plugins/_sticky_div.scss +11 -0
  148. data/app/controllers/nfg_ui/application_controller.rb +5 -0
  149. data/app/helpers/nfg_ui/application_helper.rb +27 -0
  150. data/app/helpers/nfg_ui/components/email_helpers.rb +8 -0
  151. data/app/helpers/nfg_ui/components/resource_themes_helper.rb +8 -0
  152. data/app/helpers/nfg_ui/components/tooltip_helper.rb +24 -0
  153. data/app/models/nfg_ui/application_record.rb +5 -0
  154. data/app/views/nfg_ui/app_icons/_icons.html.haml +10 -0
  155. data/app/views/nfg_ui/email/README.md +12 -0
  156. data/app/views/nfg_ui/email/_button.html.haml +12 -0
  157. data/app/views/nfg_ui/email/_email_signature.html.haml +4 -0
  158. data/app/views/nfg_ui/email/_footer.html.haml +16 -0
  159. data/app/views/nfg_ui/email/_header.html.haml +6 -0
  160. data/app/views/nfg_ui/email/_logo.html.haml +6 -0
  161. data/app/views/nfg_ui/email/_product_content_image.html.haml +7 -0
  162. data/app/views/nfg_ui/email/_rainbow_bar.html.haml +10 -0
  163. data/app/views/nfg_ui/email/_section_header.html.haml +8 -0
  164. data/app/views/nfg_ui/email/_social_network_link.html.haml +12 -0
  165. data/app/views/nfg_ui/email/_sub_footer.html.haml +9 -0
  166. data/app/views/nfg_ui/email/_table_row.html.haml +13 -0
  167. data/config/initializers/web_app_manifest.rb +3 -0
  168. data/config/locales/email.yml +34 -0
  169. data/config/locales/en.yml +63 -0
  170. data/config/routes.rb +2 -0
  171. data/config/spring.rb +1 -0
  172. data/lib/nfg_ui/bootstrap/components/alert.rb +52 -0
  173. data/lib/nfg_ui/bootstrap/components/badge.rb +39 -0
  174. data/lib/nfg_ui/bootstrap/components/base.rb +151 -0
  175. data/lib/nfg_ui/bootstrap/components/breadcrumb.rb +23 -0
  176. data/lib/nfg_ui/bootstrap/components/breadcrumb_item.rb +28 -0
  177. data/lib/nfg_ui/bootstrap/components/button.rb +74 -0
  178. data/lib/nfg_ui/bootstrap/components/button_group.rb +36 -0
  179. data/lib/nfg_ui/bootstrap/components/button_toolbar.rb +21 -0
  180. data/lib/nfg_ui/bootstrap/components/card.rb +81 -0
  181. data/lib/nfg_ui/bootstrap/components/card_body.rb +15 -0
  182. data/lib/nfg_ui/bootstrap/components/card_footer.rb +15 -0
  183. data/lib/nfg_ui/bootstrap/components/card_header.rb +35 -0
  184. data/lib/nfg_ui/bootstrap/components/card_image.rb +33 -0
  185. data/lib/nfg_ui/bootstrap/components/card_image_overlay.rb +46 -0
  186. data/lib/nfg_ui/bootstrap/components/carousel.rb +57 -0
  187. data/lib/nfg_ui/bootstrap/components/carousel_caption.rb +34 -0
  188. data/lib/nfg_ui/bootstrap/components/carousel_control.rb +73 -0
  189. data/lib/nfg_ui/bootstrap/components/carousel_indicators.rb +54 -0
  190. data/lib/nfg_ui/bootstrap/components/carousel_item.rb +49 -0
  191. data/lib/nfg_ui/bootstrap/components/collapse.rb +32 -0
  192. data/lib/nfg_ui/bootstrap/components/dropdown.rb +51 -0
  193. data/lib/nfg_ui/bootstrap/components/dropdown_divider.rb +19 -0
  194. data/lib/nfg_ui/bootstrap/components/dropdown_header.rb +23 -0
  195. data/lib/nfg_ui/bootstrap/components/dropdown_item.rb +41 -0
  196. data/lib/nfg_ui/bootstrap/components/dropdown_menu.rb +32 -0
  197. data/lib/nfg_ui/bootstrap/components/dropdown_toggle.rb +82 -0
  198. data/lib/nfg_ui/bootstrap/components/embed.rb +80 -0
  199. data/lib/nfg_ui/bootstrap/components/form.rb +13 -0
  200. data/lib/nfg_ui/bootstrap/components/input_group.rb +13 -0
  201. data/lib/nfg_ui/bootstrap/components/jumbotron.rb +13 -0
  202. data/lib/nfg_ui/bootstrap/components/list_group.rb +39 -0
  203. data/lib/nfg_ui/bootstrap/components/list_group_item.rb +69 -0
  204. data/lib/nfg_ui/bootstrap/components/media.rb +15 -0
  205. data/lib/nfg_ui/bootstrap/components/media_body.rb +15 -0
  206. data/lib/nfg_ui/bootstrap/components/media_object.rb +23 -0
  207. data/lib/nfg_ui/bootstrap/components/modal.rb +66 -0
  208. data/lib/nfg_ui/bootstrap/components/modal_body.rb +16 -0
  209. data/lib/nfg_ui/bootstrap/components/modal_footer.rb +16 -0
  210. data/lib/nfg_ui/bootstrap/components/modal_header.rb +37 -0
  211. data/lib/nfg_ui/bootstrap/components/nav.rb +71 -0
  212. data/lib/nfg_ui/bootstrap/components/nav_item.rb +103 -0
  213. data/lib/nfg_ui/bootstrap/components/nav_link.rb +62 -0
  214. data/lib/nfg_ui/bootstrap/components/navbar.rb +97 -0
  215. data/lib/nfg_ui/bootstrap/components/navbar_brand.rb +25 -0
  216. data/lib/nfg_ui/bootstrap/components/navbar_nav.rb +48 -0
  217. data/lib/nfg_ui/bootstrap/components/navbar_text.rb +21 -0
  218. data/lib/nfg_ui/bootstrap/components/navbar_toggler.rb +38 -0
  219. data/lib/nfg_ui/bootstrap/components/page_item.rb +66 -0
  220. data/lib/nfg_ui/bootstrap/components/pagination.rb +30 -0
  221. data/lib/nfg_ui/bootstrap/components/popover.rb +12 -0
  222. data/lib/nfg_ui/bootstrap/components/progress.rb +44 -0
  223. data/lib/nfg_ui/bootstrap/components/progress_bar.rb +51 -0
  224. data/lib/nfg_ui/bootstrap/components/tab_content.rb +15 -0
  225. data/lib/nfg_ui/bootstrap/components/tab_pane.rb +49 -0
  226. data/lib/nfg_ui/bootstrap/components/table.rb +17 -0
  227. data/lib/nfg_ui/bootstrap/readme.md +1 -0
  228. data/lib/nfg_ui/bootstrap/utilities/activatable.rb +32 -0
  229. data/lib/nfg_ui/bootstrap/utilities/alignable.rb +33 -0
  230. data/lib/nfg_ui/bootstrap/utilities/collapse_toggleable.rb +35 -0
  231. data/lib/nfg_ui/bootstrap/utilities/collapsible.rb +42 -0
  232. data/lib/nfg_ui/bootstrap/utilities/disableable.rb +49 -0
  233. data/lib/nfg_ui/bootstrap/utilities/dismissible.rb +24 -0
  234. data/lib/nfg_ui/bootstrap/utilities/dropdown_directionable.rb +40 -0
  235. data/lib/nfg_ui/bootstrap/utilities/headable.rb +20 -0
  236. data/lib/nfg_ui/bootstrap/utilities/modalable.rb +104 -0
  237. data/lib/nfg_ui/bootstrap/utilities/progressable.rb +42 -0
  238. data/lib/nfg_ui/bootstrap/utilities/remotable.rb +24 -0
  239. data/lib/nfg_ui/bootstrap/utilities/sizable.rb +40 -0
  240. data/lib/nfg_ui/bootstrap/utilities/themeable.rb +51 -0
  241. data/lib/nfg_ui/bootstrap/utilities/tooltipable.rb +95 -0
  242. data/lib/nfg_ui/bootstrap/utilities/wrappable.rb +48 -0
  243. data/lib/nfg_ui/components/base.rb +14 -0
  244. data/lib/nfg_ui/components/elements/activity.rb +10 -0
  245. data/lib/nfg_ui/components/elements/alert.rb +63 -0
  246. data/lib/nfg_ui/components/elements/badge.rb +32 -0
  247. data/lib/nfg_ui/components/elements/breadcrumb.rb +16 -0
  248. data/lib/nfg_ui/components/elements/breadcrumb_item.rb +16 -0
  249. data/lib/nfg_ui/components/elements/button.rb +97 -0
  250. data/lib/nfg_ui/components/elements/card_body.rb +15 -0
  251. data/lib/nfg_ui/components/elements/card_footer.rb +14 -0
  252. data/lib/nfg_ui/components/elements/card_header.rb +14 -0
  253. data/lib/nfg_ui/components/elements/card_image.rb +14 -0
  254. data/lib/nfg_ui/components/elements/card_image_overlay.rb +14 -0
  255. data/lib/nfg_ui/components/elements/carousel_caption.rb +14 -0
  256. data/lib/nfg_ui/components/elements/carousel_control.rb +14 -0
  257. data/lib/nfg_ui/components/elements/carousel_indicators.rb +23 -0
  258. data/lib/nfg_ui/components/elements/carousel_item.rb +16 -0
  259. data/lib/nfg_ui/components/elements/chart.rb +11 -0
  260. data/lib/nfg_ui/components/elements/dropdown_divider.rb +14 -0
  261. data/lib/nfg_ui/components/elements/dropdown_header.rb +14 -0
  262. data/lib/nfg_ui/components/elements/dropdown_item.rb +78 -0
  263. data/lib/nfg_ui/components/elements/dropdown_toggle.rb +37 -0
  264. data/lib/nfg_ui/components/elements/embed.rb +15 -0
  265. data/lib/nfg_ui/components/elements/form_control.rb +18 -0
  266. data/lib/nfg_ui/components/elements/input_group.rb +14 -0
  267. data/lib/nfg_ui/components/elements/key.rb +11 -0
  268. data/lib/nfg_ui/components/elements/list_group_item.rb +14 -0
  269. data/lib/nfg_ui/components/elements/loader.rb +11 -0
  270. data/lib/nfg_ui/components/elements/media_body.rb +14 -0
  271. data/lib/nfg_ui/components/elements/media_object.rb +12 -0
  272. data/lib/nfg_ui/components/elements/modal_body.rb +14 -0
  273. data/lib/nfg_ui/components/elements/modal_footer.rb +14 -0
  274. data/lib/nfg_ui/components/elements/modal_header.rb +14 -0
  275. data/lib/nfg_ui/components/elements/nav.rb +19 -0
  276. data/lib/nfg_ui/components/elements/nav_item.rb +39 -0
  277. data/lib/nfg_ui/components/elements/nav_link.rb +33 -0
  278. data/lib/nfg_ui/components/elements/navbar_brand.rb +15 -0
  279. data/lib/nfg_ui/components/elements/navbar_text.rb +14 -0
  280. data/lib/nfg_ui/components/elements/navbar_toggler.rb +14 -0
  281. data/lib/nfg_ui/components/elements/page_item.rb +14 -0
  282. data/lib/nfg_ui/components/elements/popover.rb +14 -0
  283. data/lib/nfg_ui/components/elements/progress_bar.rb +62 -0
  284. data/lib/nfg_ui/components/elements/slat_action.rb +14 -0
  285. data/lib/nfg_ui/components/elements/slat_body.rb +14 -0
  286. data/lib/nfg_ui/components/elements/slat_item.rb +62 -0
  287. data/lib/nfg_ui/components/elements/stat.rb +11 -0
  288. data/lib/nfg_ui/components/elements/step.rb +55 -0
  289. data/lib/nfg_ui/components/elements/step_indicator.rb +41 -0
  290. data/lib/nfg_ui/components/elements/tab_pane.rb +15 -0
  291. data/lib/nfg_ui/components/elements/table.rb +14 -0
  292. data/lib/nfg_ui/components/elements/task.rb +11 -0
  293. data/lib/nfg_ui/components/elements.rb +58 -0
  294. data/lib/nfg_ui/components/foundations/color.rb +11 -0
  295. data/lib/nfg_ui/components/foundations/grid.rb +11 -0
  296. data/lib/nfg_ui/components/foundations/icon.rb +82 -0
  297. data/lib/nfg_ui/components/foundations/image.rb +14 -0
  298. data/lib/nfg_ui/components/foundations/input.rb +11 -0
  299. data/lib/nfg_ui/components/foundations/typeface.rb +122 -0
  300. data/lib/nfg_ui/components/patterns/activity_feed.rb +11 -0
  301. data/lib/nfg_ui/components/patterns/button_group.rb +23 -0
  302. data/lib/nfg_ui/components/patterns/button_toolbar.rb +20 -0
  303. data/lib/nfg_ui/components/patterns/card.rb +39 -0
  304. data/lib/nfg_ui/components/patterns/carousel.rb +31 -0
  305. data/lib/nfg_ui/components/patterns/collapse.rb +31 -0
  306. data/lib/nfg_ui/components/patterns/dropdown.rb +27 -0
  307. data/lib/nfg_ui/components/patterns/dropdown_menu.rb +16 -0
  308. data/lib/nfg_ui/components/patterns/empty_state.rb +11 -0
  309. data/lib/nfg_ui/components/patterns/filter_bar.rb +11 -0
  310. data/lib/nfg_ui/components/patterns/form_group.rb +11 -0
  311. data/lib/nfg_ui/components/patterns/graph.rb +11 -0
  312. data/lib/nfg_ui/components/patterns/jumbotron.rb +14 -0
  313. data/lib/nfg_ui/components/patterns/list_group.rb +16 -0
  314. data/lib/nfg_ui/components/patterns/media.rb +14 -0
  315. data/lib/nfg_ui/components/patterns/modal.rb +15 -0
  316. data/lib/nfg_ui/components/patterns/navbar.rb +17 -0
  317. data/lib/nfg_ui/components/patterns/navbar_nav.rb +17 -0
  318. data/lib/nfg_ui/components/patterns/page_header.rb +85 -0
  319. data/lib/nfg_ui/components/patterns/pagination.rb +14 -0
  320. data/lib/nfg_ui/components/patterns/progress.rb +24 -0
  321. data/lib/nfg_ui/components/patterns/slat.rb +14 -0
  322. data/lib/nfg_ui/components/patterns/slat_actions.rb +115 -0
  323. data/lib/nfg_ui/components/patterns/slat_header.rb +23 -0
  324. data/lib/nfg_ui/components/patterns/slat_list.rb +18 -0
  325. data/lib/nfg_ui/components/patterns/slats.rb +14 -0
  326. data/lib/nfg_ui/components/patterns/steps.rb +27 -0
  327. data/lib/nfg_ui/components/patterns/tab_content.rb +14 -0
  328. data/lib/nfg_ui/components/patterns/task_list.rb +11 -0
  329. data/lib/nfg_ui/components/patterns/tile.rb +58 -0
  330. data/lib/nfg_ui/components/patterns/tile_body.rb +29 -0
  331. data/lib/nfg_ui/components/patterns/tile_header.rb +40 -0
  332. data/lib/nfg_ui/components/patterns/tile_section.rb +29 -0
  333. data/lib/nfg_ui/components/traits/active.rb +14 -0
  334. data/lib/nfg_ui/components/traits/alert.rb +36 -0
  335. data/lib/nfg_ui/components/traits/alignment.rb +26 -0
  336. data/lib/nfg_ui/components/traits/button.rb +47 -0
  337. data/lib/nfg_ui/components/traits/button_group.rb +22 -0
  338. data/lib/nfg_ui/components/traits/card.rb +14 -0
  339. data/lib/nfg_ui/components/traits/collapse.rb +29 -0
  340. data/lib/nfg_ui/components/traits/disable.rb +19 -0
  341. data/lib/nfg_ui/components/traits/disable_with.rb +14 -0
  342. data/lib/nfg_ui/components/traits/dismiss.rb +16 -0
  343. data/lib/nfg_ui/components/traits/dropdown_toggle.rb +14 -0
  344. data/lib/nfg_ui/components/traits/icon.rb +16 -0
  345. data/lib/nfg_ui/components/traits/list_group.rb +16 -0
  346. data/lib/nfg_ui/components/traits/muted.rb +16 -0
  347. data/lib/nfg_ui/components/traits/nav.rb +26 -0
  348. data/lib/nfg_ui/components/traits/nav_item.rb +16 -0
  349. data/lib/nfg_ui/components/traits/navbar.rb +18 -0
  350. data/lib/nfg_ui/components/traits/page_header.rb +16 -0
  351. data/lib/nfg_ui/components/traits/pill.rb +14 -0
  352. data/lib/nfg_ui/components/traits/progress_bar.rb +24 -0
  353. data/lib/nfg_ui/components/traits/remote.rb +14 -0
  354. data/lib/nfg_ui/components/traits/size.rb +18 -0
  355. data/lib/nfg_ui/components/traits/slat_item.rb +28 -0
  356. data/lib/nfg_ui/components/traits/step.rb +14 -0
  357. data/lib/nfg_ui/components/traits/theme.rb +57 -0
  358. data/lib/nfg_ui/components/traits/typeface.rb +53 -0
  359. data/lib/nfg_ui/components/traits/vertical.rb +16 -0
  360. data/lib/nfg_ui/components/traits.rb +43 -0
  361. data/lib/nfg_ui/components/utilities/browser_detectable.rb +16 -0
  362. data/lib/nfg_ui/components/utilities/confirmable.rb +24 -0
  363. data/lib/nfg_ui/components/utilities/describable.rb +22 -0
  364. data/lib/nfg_ui/components/utilities/disable_withable.rb +26 -0
  365. data/lib/nfg_ui/components/utilities/emailable.rb +44 -0
  366. data/lib/nfg_ui/components/utilities/iconable.rb +20 -0
  367. data/lib/nfg_ui/components/utilities/left_iconable.rb +22 -0
  368. data/lib/nfg_ui/components/utilities/methodable.rb +24 -0
  369. data/lib/nfg_ui/components/utilities/renderable.rb +24 -0
  370. data/lib/nfg_ui/components/utilities/resource_themeable.rb +49 -0
  371. data/lib/nfg_ui/components/utilities/titleable.rb +20 -0
  372. data/lib/nfg_ui/components/utilities/traitable.rb +32 -0
  373. data/lib/nfg_ui/components/utilities/vertically_alignable.rb +31 -0
  374. data/lib/nfg_ui/components/utilities.rb +22 -0
  375. data/lib/nfg_ui/engine.rb +45 -0
  376. data/lib/nfg_ui/ui/base.rb +35 -0
  377. data/lib/nfg_ui/ui/bootstrap.rb +44 -0
  378. data/lib/nfg_ui/ui/network_for_good.rb +54 -0
  379. data/lib/nfg_ui/ui/utilities/initializer.rb +88 -0
  380. data/lib/nfg_ui/ui/utilities.rb +10 -0
  381. data/lib/nfg_ui/version.rb +5 -0
  382. data/lib/nfg_ui.rb +174 -0
  383. data/lib/tasks/nfg_ui_tasks.rake +53 -0
  384. metadata +741 -0
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NfgUi
4
+ module Bootstrap
5
+ module Components
6
+ # Bootstrap Pagination - Page Item Component
7
+ # https://getbootstrap.com/docs/4.1/components/pagination/
8
+ class PageItem < NfgUi::Bootstrap::Components::Base
9
+ # include Bootstrap::Utilities::Disableable
10
+ include Bootstrap::Utilities::Activatable
11
+
12
+ def component_family
13
+ :pagination
14
+ end
15
+
16
+ def disabled
17
+ options.fetch(:disabled, false)
18
+ end
19
+
20
+ def href
21
+ options[:href] || '#' # return # when nil
22
+ end
23
+
24
+ # Send href through to the "page link" that's embedded within
25
+ # the page item component
26
+ def html_options
27
+ super.except!(:href)
28
+ end
29
+
30
+ def page_link_html_options
31
+ { class: 'page-link',
32
+ **(disabled ? { tabindex: '-1' } : {}),
33
+ href: href }
34
+ end
35
+
36
+ def render
37
+ super do
38
+ content_tag(:a, page_link_html_options) do
39
+ capture do
40
+ concat(block_given? ? yield : body)
41
+ concat(content_tag(:span, '(current)', class: 'sr-only')) if active
42
+ end
43
+ end
44
+ end
45
+ end
46
+
47
+ private
48
+
49
+ def base_element
50
+ :li
51
+ end
52
+
53
+ def css_classes
54
+ [
55
+ super,
56
+ ('disabled' if disabled)
57
+ ].join(' ').squish
58
+ end
59
+
60
+ def non_html_attribute_options
61
+ super.push(:disabled)
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NfgUi
4
+ module Bootstrap
5
+ module Components
6
+ # Bootstrap Pagination Component
7
+ # https://getbootstrap.com/docs/4.1/components/pagination/
8
+ class Pagination < NfgUi::Bootstrap::Components::Base
9
+ include Bootstrap::Utilities::Alignable
10
+ include Bootstrap::Utilities::Sizable
11
+
12
+ def component_family
13
+ :pagination
14
+ end
15
+
16
+ def render
17
+ content_tag(:nav) do
18
+ super
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def base_element
25
+ :ul
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NfgUi
4
+ module Bootstrap
5
+ module Components
6
+ # Bootstrap Popover Component
7
+ # https://getbootstrap.com/docs/4.1/components/popovers/
8
+ class Popover < NfgUi::Bootstrap::Components::Base
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NfgUi
4
+ module Bootstrap
5
+ module Components
6
+ # Bootstrap Parent Progress Component
7
+ # https://getbootstrap.com/docs/4.1/components/progress/
8
+ class Progress < NfgUi::Bootstrap::Components::Base
9
+ include Bootstrap::Utilities::Progressable
10
+
11
+ def component_family
12
+ :progress
13
+ end
14
+
15
+ def height
16
+ options.fetch(:height, nil)
17
+ end
18
+
19
+ def style
20
+ [
21
+ super,
22
+ ("height: #{height}px;" if height)
23
+ ].join(' ').squish
24
+ end
25
+
26
+ def render
27
+ super do
28
+ if body
29
+ (block_given? ? yield : body)
30
+ else
31
+ NfgUi::Bootstrap::Components::ProgressBar.new({ theme: theme, label: label, progress: progress, striped: striped, animated: animated }, view_context).render
32
+ end
33
+ end
34
+ end
35
+
36
+ private
37
+
38
+ def non_html_attribute_options
39
+ super.push(:height)
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NfgUi
4
+ module Bootstrap
5
+ module Components
6
+ # Bootstrap Progress Bar Component
7
+ # https://getbootstrap.com/docs/4.1/components/progress/
8
+ class ProgressBar < NfgUi::Bootstrap::Components::Progress
9
+ include Bootstrap::Utilities::Progressable
10
+ include Bootstrap::Utilities::Themeable
11
+
12
+ def component_family
13
+ :progress
14
+ end
15
+
16
+ def style
17
+ [
18
+ options[:style],
19
+ ("width: #{progress.to_i}%;" if progress)
20
+ ].join(' ').squish
21
+ end
22
+
23
+ def render
24
+ content_tag(:div, label, html_options)
25
+ end
26
+
27
+ private
28
+
29
+ def css_classes
30
+ [
31
+ super,
32
+ ("#{component_css_class}-striped" if striped),
33
+ ("#{component_css_class}-animated" if animated)
34
+ ].join(' ').squish
35
+ end
36
+
37
+ def assistive_html_attributes
38
+ super.merge!(role: 'progressbar', aria: { valuenow: progress, valuemin: 0, valuemax: 100 })
39
+ end
40
+
41
+ def theme_css_class_prefix
42
+ 'bg-'
43
+ end
44
+
45
+ def outlineable?
46
+ false
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NfgUi
4
+ module Bootstrap
5
+ module Components
6
+ # Bootstrap Progress Component
7
+ # https://getbootstrap.com/docs/4.1/components/progress/
8
+ class TabContent < NfgUi::Bootstrap::Components::Base
9
+ def component_family
10
+ :tab
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NfgUi
4
+ module Bootstrap
5
+ module Components
6
+ # Bootstrap Progress Component
7
+ # https://getbootstrap.com/docs/4.1/components/progress/
8
+ class TabPane < NfgUi::Bootstrap::Components::Base
9
+ include Bootstrap::Utilities::Activatable
10
+
11
+ def component_family
12
+ :tab
13
+ end
14
+
15
+ def tab
16
+ options.fetch(:tab, nil)
17
+ end
18
+
19
+ def id
20
+ tab ? tab.tr('#', '') : super
21
+ end
22
+
23
+ # Fade is turned on by default
24
+ # This should probably be a global setting
25
+ def fade
26
+ options.fetch(:fade, true)
27
+ end
28
+
29
+ private
30
+
31
+ def css_classes
32
+ [
33
+ super,
34
+ ('fade' if fade),
35
+ ('show' if active)
36
+ ].join(' ').squish
37
+ end
38
+
39
+ def non_html_attribute_options
40
+ super.push(:tab)
41
+ end
42
+
43
+ def assistive_html_attributes
44
+ { role: 'tabpanel' }
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NfgUi
4
+ module Bootstrap
5
+ module Components
6
+ # Bootstrap Table Component
7
+ # https://getbootstrap.com/docs/4.1/content/tables/
8
+ class Table < NfgUi::Bootstrap::Components::Base
9
+ private
10
+
11
+ def base_element
12
+ :table
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1 @@
1
+ Bootstrap4 code will be isolated into its own gem later.
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NfgUi
4
+ module Bootstrap
5
+ module Utilities
6
+ # Passes in necessary attributes to allow a component to have an active state
7
+ module Activatable
8
+
9
+ def active
10
+ options.fetch(:active, default_active)
11
+ end
12
+
13
+ private
14
+
15
+ def css_classes
16
+ [
17
+ super,
18
+ ('active' if active)
19
+ ].join(' ').squish
20
+ end
21
+
22
+ def non_html_attribute_options
23
+ super.push(:active)
24
+ end
25
+
26
+ def default_active
27
+ false
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NfgUi
4
+ module Bootstrap
5
+ module Utilities
6
+ # Allow components to be right and center aligned
7
+ module Alignable
8
+ def center
9
+ options.fetch(:center, false)
10
+ end
11
+
12
+ def right
13
+ options.fetch(:right, false)
14
+ end
15
+
16
+ private
17
+
18
+ def css_classes
19
+ [
20
+ super,
21
+ ('justify-content-center' if center),
22
+ ('justify-content-end' if right)
23
+ ].join(' ').squish
24
+ end
25
+
26
+ def non_html_attribute_options
27
+ super.push(:right,
28
+ :center)
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NfgUi
4
+ module Bootstrap
5
+ module Utilities
6
+ # Allows components to have a collapsed state when appropriate
7
+ module CollapseToggleable
8
+ include Bootstrap::Utilities::Collapsible
9
+
10
+ def data
11
+ collapse ? super.merge!(collapse_data_attributes) : super
12
+ end
13
+
14
+ private
15
+
16
+ # Buttons need to be able to to set a target on :buttons
17
+ # and an href on links -- so this attribute is customizable if needed
18
+ def collapse_data_attributes
19
+ @collapse_data_attributes ||= { toggle: 'collapse', target: collapse }
20
+ end
21
+
22
+ # To do: currently collapsible doesn't control the actual collapse
23
+ # As such, there's no way to set aria-expanded on the button / toggle...
24
+ # based on whether or not the collapse component is expanded or not
25
+ #
26
+ # To solve: how to address aria-expanded to accurately reflect the expanded status
27
+ def assistive_html_attributes
28
+ return super unless collapse
29
+ super.merge!(aria: (options[:aria] || {}).merge!(expanded: 'false', controls: collapse.tr('#','')),
30
+ role: 'button')
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NfgUi
4
+ module Bootstrap
5
+ module Utilities
6
+ # Allows components to carry collapse attributes
7
+ # to more easily pass collapse status to a collapsible target
8
+ #
9
+ # Example:
10
+ # Tile & TileHeader both include Collapsible
11
+ # because they both pass collapse attributes to
12
+ # a collapse button within TileHeader
13
+ #
14
+ # They do not, however need a collapse toggle
15
+ # unlike a NavbarToggle / Button, and thus they do not include
16
+ # The CollapseToggleable module
17
+ #
18
+ # CollapseToggleable components have this module included
19
+ # by default via the CollapseToggleable module.
20
+ module Collapsible
21
+ def collapse
22
+ options.fetch(:collapse, nil)
23
+ end
24
+
25
+ def collapsed
26
+ options.fetch(:collapsed, nil)
27
+ end
28
+
29
+ # Collapsible checks if collapse is manually set true or false and thus, collapsible
30
+ def collapsible
31
+ options[:collapsible] || collapse || !collapsed.nil?
32
+ end
33
+
34
+ private
35
+
36
+ def non_html_attribute_options
37
+ super.push(:collapse, :collapsed, :collapsible)
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NfgUi
4
+ module Bootstrap
5
+ module Utilities
6
+ # Allows components to have a disabled state when appropriate
7
+ module Disableable
8
+ attr_reader :as
9
+
10
+ def disabled
11
+ options.fetch(:disabled, false)
12
+ end
13
+
14
+ private
15
+
16
+ def css_classes
17
+ # when the tag does not take a disabled attribute we
18
+ # assigne the disabled class
19
+ [
20
+ super,
21
+ ('disabled' if disabled && !tag_allows_for_disable_attribute?)
22
+ ].join(' ').squish
23
+ end
24
+
25
+ def non_html_attribute_options
26
+ # if tag accepts the disabled attribute
27
+ # push it through, otherwise remove it from the
28
+ # html options. We do this regardless of whether or not
29
+ # disabled was actually set to ensure that those
30
+ # tags that can't take a disabled option never receive it
31
+ tag_allows_for_disable_attribute? ? super : super.push(:disabled)
32
+ end
33
+
34
+ def assistive_html_attributes
35
+ if disabled
36
+ super.merge!(tabindex: '-1',
37
+ **(tag_allows_for_disable_attribute?) ? { disabled: true } : {})
38
+ else
39
+ super
40
+ end
41
+ end
42
+
43
+ def tag_allows_for_disable_attribute?
44
+ [:button, :input, :fieldset, :optgroup, :option, :select, :textarea].include?(as)
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NfgUi
4
+ module Bootstrap
5
+ module Utilities
6
+ # Delivers the dismissibility of the component to the HAML partial
7
+ module Dismissible
8
+ def dismissible
9
+ options.fetch(:dismissible, default_dismissible)
10
+ end
11
+
12
+ private
13
+
14
+ def non_html_attribute_options
15
+ super.push(:dismissible)
16
+ end
17
+
18
+ def default_dismissible
19
+ true
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NfgUi
4
+ module Bootstrap
5
+ module Utilities
6
+ # Allows components to supply the dropDIRECTION for menus
7
+ # This is applicable to more than just the Dropdown component
8
+ module DropdownDirectionable
9
+ def dropleft
10
+ options.fetch(:dropleft, false)
11
+ end
12
+
13
+ def dropright
14
+ options.fetch(:dropright, false)
15
+ end
16
+
17
+ def dropup
18
+ options.fetch(:dropup, false)
19
+ end
20
+
21
+ private
22
+
23
+ def css_classes
24
+ [
25
+ super,
26
+ ('dropleft' if dropleft),
27
+ ('dropright' if dropright),
28
+ ('dropup' if dropup)
29
+ ].join(' ').squish
30
+ end
31
+
32
+ def non_html_attribute_options
33
+ super.push(:dropleft,
34
+ :dropright,
35
+ :dropup)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NfgUi
4
+ module Bootstrap
5
+ module Utilities
6
+ # Delivers the dismissibility of the component to the HAML partial
7
+ module Headable
8
+ def heading
9
+ options.fetch(:heading, nil)
10
+ end
11
+
12
+ private
13
+
14
+ def non_html_attribute_options
15
+ super.push(:heading)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,104 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NfgUi
4
+ module Bootstrap
5
+ module Utilities
6
+ # Allows a component to utilize the :modal option
7
+ # Which then formats the component's HTML data attributes
8
+ # to connect to the desired modal. Note the :modal option requires the '#'
9
+ # preceding the CSS ID per bootstrap docs
10
+ #
11
+ # Correct: { modal: '#the_modal_id' } <-- note the '#'
12
+ # Incorrect: { modal: 'the_modal_id' }
13
+ #
14
+ # USAGE:
15
+ # When to use the :modal option on a component:
16
+ # The :modal option should only be used when activating a modal
17
+ # that has been embedded on the HTML page and is not being injected
18
+ # from a remote ajax request via remote: true.
19
+ #
20
+ # INVALID USAGE:
21
+ # Do not set a modal option on a remote link in Rails
22
+ # Setting a component to remote: true in addition to suppling a modal
23
+ # will result in an ArgumentError. This is due to poor / buggy behavior resulting from
24
+ # remotely re-rendering a modal that is already on the page
25
+ #
26
+ # (basically: there's a high likelihood that the targeted modal will
27
+ # be shown / animated twice)
28
+ #
29
+ # Like when remote: true, components that contain tooltips
30
+ # Will also raise an ArgumentError due to the competing data-toggles
31
+ # and the subsequent silent failure of the tooltip.
32
+ #
33
+ # EXCEPTIONS:
34
+ # Exception for a modalable component with a tooltip:
35
+ # *Disabled* components may use a modal and a tooltip in its options
36
+ # (thanks to how disabled components are wrapped with an html element & the tooltip
37
+ # is applied to the wrapping element, not the component itself)
38
+ #
39
+ # Valid example:
40
+ # = ui.bootstrap :button, disabled: true, tooltip: 'The tooltip', modal: '#the_modal', ...
41
+ #
42
+ # Extra care is taken with the modal and competing options given its typical wide-ranging
43
+ # use in rails applications.
44
+ module Modalable
45
+ def data
46
+ # Raise an error when a component utilizes 'illegal' options (which are options that
47
+ # result in silent failures and/or directly compete with a
48
+ # modalable component's necessary HTML)
49
+ if component_includes_problematic_options_for_modal?
50
+ raise ArgumentError.new(I18n.t("nfg_ui.errors.argument_error.modalable.#{error_message_i18n_path}",
51
+ modal: modal,
52
+ class_name: self.class.name,
53
+ options: options,
54
+ file: __FILE__,
55
+ method: __method__))
56
+ end
57
+
58
+ # Overwrites data-toggle and data-target
59
+ # forcing the modal to take precedence.
60
+ # If a tooltip is present in the options, an ArgumentError is raised
61
+ modal ? super.merge!(toggle: 'modal', target: options[:modal]) : super
62
+ end
63
+
64
+ def modal
65
+ options.fetch(:modal, nil)
66
+ end
67
+
68
+ private
69
+
70
+ # Corresponds to i18n locale: config/locales/en.yml
71
+ # Remote is checked first, given its importance and impact on the application
72
+ # Then, check for tooltip.
73
+ def error_message_i18n_path
74
+ return 'remote' if options[:remote]
75
+ return 'tooltip' if options[:tooltip]
76
+ end
77
+
78
+ # Force an error when:
79
+ # 1. The component includes remote: true (and the modal option is present)
80
+ # 2. The component includes a :tooltip in the options
81
+ #
82
+ # When a tooltip is present, the data-toggle would be overwritten with
83
+ # the modal data attributes (given the `data.merge!`) causing a silent failure
84
+ # of the tooltip (it doesn't get added to the component)
85
+ #
86
+ # Exception: when tooltip is not "illegal" (the component has a tooltip *and* is disabled)
87
+ def component_includes_problematic_options_for_modal?
88
+ modal.present? && (options.fetch(:remote, nil) || illegal_tooltip?)
89
+ end
90
+
91
+ # When a modalable component is disabled
92
+ # the tooltip is applied to a wrapping element
93
+ # and will not compete with the modal's data attributes.
94
+ def illegal_tooltip?
95
+ options[:tooltip].present? && !options[:disabled]
96
+ end
97
+
98
+ def non_html_attribute_options
99
+ super.push(:modal)
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end