voom-presenters 0.2.0 → 2.0.0

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 (440) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +1 -1
  3. data/.github/ISSUE_TEMPLATE/bug_report.md +38 -0
  4. data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  5. data/.github/ISSUE_TEMPLATE/questions-support.md +10 -0
  6. data/.github/workflows/semantic-release.yml +39 -0
  7. data/.gitignore +3 -2
  8. data/.releaserc +8 -0
  9. data/.ruby-version +2 -1
  10. data/CHANGELOG.md +64 -114
  11. data/CONTRIBUTING.md +60 -0
  12. data/Gemfile +12 -3
  13. data/Gemfile.lock +83 -45
  14. data/Procfile +1 -0
  15. data/README.md +41 -39
  16. data/app/demo/component_status.pom +1 -1
  17. data/app/demo/components/avatars.pom +40 -0
  18. data/app/demo/components/cards.pom +11 -4
  19. data/app/demo/components/chips.pom +61 -54
  20. data/app/demo/components/content.pom +96 -16
  21. data/app/demo/components/dialogs.pom +175 -6
  22. data/app/demo/components/file_inputs.pom +38 -2
  23. data/app/demo/components/google_maps.pom +6 -1
  24. data/app/demo/components/headers.pom +80 -20
  25. data/app/demo/components/icons.pom +86 -55
  26. data/app/demo/components/image_lists.pom +100 -0
  27. data/app/demo/components/images.pom +45 -0
  28. data/app/demo/components/layouts.pom +3 -25
  29. data/app/demo/components/lists.pom +24 -4
  30. data/app/demo/components/menus.pom +14 -4
  31. data/app/demo/components/nav/menu.pom +38 -7
  32. data/app/demo/components/nav/pattern_menu.pom +2 -2
  33. data/app/demo/components/number_fields.pom +53 -0
  34. data/app/demo/components/padding.pom +96 -0
  35. data/app/demo/components/progress.pom +71 -0
  36. data/app/demo/components/selects.pom +44 -5
  37. data/app/demo/components/sliders.pom +5 -0
  38. data/app/demo/components/tab_bars.pom +15 -0
  39. data/app/demo/components/tables.pom +51 -40
  40. data/app/demo/components/text_areas.pom +23 -16
  41. data/app/demo/components/text_fields.pom +61 -15
  42. data/app/demo/components/toggles.pom +35 -4
  43. data/app/demo/components/tooltips.pom +8 -4
  44. data/app/demo/components/unordered_list.pom +81 -0
  45. data/app/demo/custom_css.pom +37 -0
  46. data/app/demo/events/actions/autocomplete.pom +32 -0
  47. data/app/demo/events/actions/clear.pom +5 -3
  48. data/app/demo/events/actions/dialogs/discard.pom +9 -0
  49. data/app/demo/events/actions/dialogs/show_dialog.pom +4 -2
  50. data/app/demo/events/actions/last_response.pom +40 -0
  51. data/app/demo/events/actions/prompt_if_dirty.pom +54 -0
  52. data/app/demo/events/content_as_form.pom +313 -0
  53. data/app/demo/events/nav/drawer.pom +7 -3
  54. data/app/demo/events/parallel.pom +44 -0
  55. data/app/demo/nav/top_nav.pom +12 -0
  56. data/app/demo/patterns/drag_drop.pom +89 -0
  57. data/app/demo/patterns/floating_card.pom +29 -0
  58. data/app/demo/patterns/search_select.pom +9 -7
  59. data/app/demo/plugins/chart.pom +254 -0
  60. data/app/demo/plugins/image_crop.pom +44 -0
  61. data/app/demo/plugins/index.pom +29 -0
  62. data/app/demo/plugins/nav/drawer.pom +19 -0
  63. data/app/demo/shared/context_list.pom +1 -1
  64. data/app/demo/styles.pom +3 -1
  65. data/bin/console +4 -4
  66. data/bin/presenters +3 -0
  67. data/component-status.yml +15 -15
  68. data/config.ru +20 -10
  69. data/docs/settings.md +81 -0
  70. data/lib/hash_ext/traverse.rb +14 -0
  71. data/lib/voom.rb +25 -0
  72. data/lib/voom/container_methods.rb +2 -2
  73. data/lib/voom/engine.rb +5 -0
  74. data/lib/voom/presenters/api/app.rb +31 -11
  75. data/lib/voom/presenters/api/router.rb +3 -49
  76. data/lib/voom/presenters/app.rb +3 -3
  77. data/lib/voom/presenters/cli.rb +28 -0
  78. data/lib/voom/presenters/demo/dragon_drop.rb +48 -0
  79. data/lib/voom/presenters/demo/echo.rb +2 -0
  80. data/lib/voom/presenters/demo/slow.rb +18 -0
  81. data/lib/voom/presenters/dsl/components/actions/autocomplete.rb +15 -0
  82. data/lib/voom/presenters/dsl/components/actions/base.rb +36 -8
  83. data/lib/voom/presenters/dsl/components/actions/clear.rb +0 -2
  84. data/lib/voom/presenters/dsl/components/actions/close_dialog.rb +17 -0
  85. data/lib/voom/presenters/dsl/components/actions/deletes.rb +0 -2
  86. data/lib/voom/presenters/dsl/components/actions/dialog.rb +0 -2
  87. data/lib/voom/presenters/dsl/components/actions/loads.rb +5 -6
  88. data/lib/voom/presenters/dsl/components/actions/navigates.rb +0 -2
  89. data/lib/voom/presenters/dsl/components/actions/post_message.rb +17 -0
  90. data/lib/voom/presenters/dsl/components/actions/posts.rb +5 -2
  91. data/lib/voom/presenters/dsl/components/actions/prompt_if_dirty.rb +15 -0
  92. data/lib/voom/presenters/dsl/components/actions/remove.rb +0 -2
  93. data/lib/voom/presenters/dsl/components/actions/replaces.rb +4 -4
  94. data/lib/voom/presenters/dsl/components/actions/snackbar.rb +0 -2
  95. data/lib/voom/presenters/dsl/components/actions/stepper.rb +0 -2
  96. data/lib/voom/presenters/dsl/components/actions/toggle_disabled.rb +15 -0
  97. data/lib/voom/presenters/dsl/components/actions/toggle_visibility.rb +0 -2
  98. data/lib/voom/presenters/dsl/components/actions/updates.rb +5 -2
  99. data/lib/voom/presenters/dsl/components/avatar.rb +4 -8
  100. data/lib/voom/presenters/dsl/components/badge.rb +0 -2
  101. data/lib/voom/presenters/dsl/components/base.rb +25 -18
  102. data/lib/voom/presenters/dsl/components/button.rb +15 -11
  103. data/lib/voom/presenters/dsl/components/card.rb +49 -36
  104. data/lib/voom/presenters/dsl/components/checkbox.rb +0 -2
  105. data/lib/voom/presenters/dsl/components/chip.rb +5 -7
  106. data/lib/voom/presenters/dsl/components/chipset.rb +33 -0
  107. data/lib/voom/presenters/dsl/components/content.rb +28 -18
  108. data/lib/voom/presenters/dsl/components/datetime_base.rb +0 -2
  109. data/lib/voom/presenters/dsl/components/datetime_field.rb +0 -2
  110. data/lib/voom/presenters/dsl/components/dialog.rb +36 -12
  111. data/lib/voom/presenters/dsl/components/drawer.rb +9 -6
  112. data/lib/voom/presenters/dsl/components/event.rb +106 -65
  113. data/lib/voom/presenters/dsl/components/event_base.rb +1 -3
  114. data/lib/voom/presenters/dsl/components/expansion_panel.rb +0 -3
  115. data/lib/voom/presenters/dsl/components/file_input.rb +18 -6
  116. data/lib/voom/presenters/dsl/components/footer.rb +2 -2
  117. data/lib/voom/presenters/dsl/components/form.rb +2 -17
  118. data/lib/voom/presenters/dsl/components/grid.rb +52 -50
  119. data/lib/voom/presenters/dsl/components/header.rb +17 -1
  120. data/lib/voom/presenters/dsl/components/hidden_field.rb +0 -2
  121. data/lib/voom/presenters/dsl/components/icon.rb +2 -4
  122. data/lib/voom/presenters/dsl/components/icon_base.rb +5 -7
  123. data/lib/voom/presenters/dsl/components/icon_toggle.rb +2 -4
  124. data/lib/voom/presenters/dsl/components/image.rb +61 -13
  125. data/lib/voom/presenters/dsl/components/image_list.rb +43 -0
  126. data/lib/voom/presenters/dsl/components/input.rb +14 -5
  127. data/lib/voom/presenters/dsl/components/link.rb +33 -0
  128. data/lib/voom/presenters/dsl/components/list.rb +6 -13
  129. data/lib/voom/presenters/dsl/components/lists/action.rb +9 -11
  130. data/lib/voom/presenters/dsl/components/lists/actions.rb +0 -3
  131. data/lib/voom/presenters/dsl/components/lists/line.rb +27 -15
  132. data/lib/voom/presenters/dsl/components/menu.rb +51 -9
  133. data/lib/voom/presenters/dsl/components/mixins/append.rb +2 -2
  134. data/lib/voom/presenters/dsl/components/mixins/attaches.rb +0 -2
  135. data/lib/voom/presenters/dsl/components/mixins/avatar.rb +1 -3
  136. data/lib/voom/presenters/dsl/components/mixins/chips.rb +0 -2
  137. data/lib/voom/presenters/dsl/components/mixins/chipset.rb +19 -0
  138. data/lib/voom/presenters/dsl/components/mixins/common.rb +13 -14
  139. data/lib/voom/presenters/dsl/components/mixins/dialogs.rb +0 -2
  140. data/lib/voom/presenters/dsl/components/mixins/event.rb +0 -2
  141. data/lib/voom/presenters/dsl/components/mixins/image_lists.rb +15 -0
  142. data/lib/voom/presenters/dsl/components/mixins/last_response.rb +48 -0
  143. data/lib/voom/presenters/dsl/components/mixins/padding.rb +42 -0
  144. data/lib/voom/presenters/dsl/components/mixins/progress.rb +16 -0
  145. data/lib/voom/presenters/dsl/components/mixins/tab_bars.rb +2 -0
  146. data/lib/voom/presenters/dsl/components/mixins/tables.rb +15 -0
  147. data/lib/voom/presenters/dsl/components/mixins/text_fields.rb +5 -0
  148. data/lib/voom/presenters/dsl/components/mixins/toggles.rb +0 -2
  149. data/lib/voom/presenters/dsl/components/mixins/typography.rb +55 -8
  150. data/lib/voom/presenters/dsl/components/mixins/yield_to.rb +2 -2
  151. data/lib/voom/presenters/dsl/components/number_field.rb +20 -0
  152. data/lib/voom/presenters/dsl/components/page_title.rb +31 -0
  153. data/lib/voom/presenters/dsl/components/progress.rb +27 -0
  154. data/lib/voom/presenters/dsl/components/radio_button.rb +0 -1
  155. data/lib/voom/presenters/dsl/components/rich_text_area.rb +5 -11
  156. data/lib/voom/presenters/dsl/components/select.rb +21 -9
  157. data/lib/voom/presenters/dsl/components/separator.rb +21 -0
  158. data/lib/voom/presenters/dsl/components/slider.rb +6 -7
  159. data/lib/voom/presenters/dsl/components/stepper.rb +0 -10
  160. data/lib/voom/presenters/dsl/components/switch.rb +0 -2
  161. data/lib/voom/presenters/dsl/components/tab_bar.rb +0 -3
  162. data/lib/voom/presenters/dsl/components/table.rb +39 -20
  163. data/lib/voom/presenters/dsl/components/text_area.rb +1 -3
  164. data/lib/voom/presenters/dsl/components/text_field.rb +54 -11
  165. data/lib/voom/presenters/dsl/components/time_field.rb +0 -2
  166. data/lib/voom/presenters/dsl/components/toggle_base.rb +8 -6
  167. data/lib/voom/presenters/dsl/components/typography.rb +4 -4
  168. data/lib/voom/presenters/dsl/components/unordered_list.rb +50 -0
  169. data/lib/voom/presenters/dsl/definer.rb +0 -4
  170. data/lib/voom/presenters/dsl/definition.rb +6 -5
  171. data/lib/voom/presenters/dsl/protect_from_forgery.rb +43 -0
  172. data/lib/voom/presenters/dsl/user_interface.rb +37 -22
  173. data/lib/voom/presenters/errors.rb +1 -0
  174. data/lib/voom/presenters/errors/invalid_dsl.rb +8 -0
  175. data/lib/voom/presenters/errors/parameter_validation.rb +1 -3
  176. data/lib/voom/presenters/generators/inflectors.rb +59 -0
  177. data/lib/voom/presenters/generators/plugin.rb +115 -0
  178. data/lib/voom/presenters/generators/templates/plugin/.gitignore +12 -0
  179. data/lib/voom/presenters/generators/templates/plugin/Gemfile +6 -0
  180. data/lib/voom/presenters/generators/templates/plugin/LICENSE.txt.tt +21 -0
  181. data/lib/voom/presenters/generators/templates/plugin/README.md +253 -0
  182. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/components/actions/action.rb.tt +16 -0
  183. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/components/actions/dsl.rb.tt +22 -0
  184. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/components/component.rb.tt +18 -0
  185. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/components/dsl.rb.tt +19 -0
  186. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/helpers/helper.rb.tt +15 -0
  187. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/plugin.rb.tt +9 -0
  188. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/web_client/components/actions/data.rb.tt +17 -0
  189. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/web_client/components/render.rb.tt +23 -0
  190. data/lib/voom/presenters/generators/templates/plugin/presenter_plugin.gemspec.tt +21 -0
  191. data/lib/voom/presenters/generators/templates/plugin/views/assets/css/components/component.css.tt +21 -0
  192. data/lib/voom/presenters/generators/templates/plugin/views/assets/js/components/actions/action.js.tt +15 -0
  193. data/lib/voom/presenters/generators/templates/plugin/views/assets/js/components/component.js.tt +39 -0
  194. data/lib/voom/presenters/generators/templates/plugin/views/components/component.erb.tt +14 -0
  195. data/lib/voom/presenters/generators/templates/plugin/views/components/component_header.erb.tt +20 -0
  196. data/lib/voom/presenters/helpers.rb +2 -8
  197. data/lib/voom/presenters/helpers/inflector.rb +1 -1
  198. data/lib/voom/presenters/helpers/rails.rb +15 -8
  199. data/lib/voom/presenters/helpers/redact.rb +13 -0
  200. data/lib/voom/presenters/helpers/route.rb +12 -5
  201. data/lib/voom/presenters/pluggable.rb +37 -0
  202. data/lib/voom/presenters/plugins.rb +7 -0
  203. data/lib/voom/presenters/plugins/google_maps.rb +24 -0
  204. data/lib/voom/presenters/plugins/google_maps/google_map.erb +10 -0
  205. data/lib/voom/presenters/{dsl/components → plugins/google_maps}/google_map.rb +4 -3
  206. data/lib/voom/presenters/{dsl.rb → registry.rb} +13 -15
  207. data/lib/voom/presenters/router.rb +59 -0
  208. data/lib/voom/presenters/settings.rb +18 -8
  209. data/lib/voom/presenters/version.rb +1 -1
  210. data/lib/voom/presenters/web_client/app.rb +86 -29
  211. data/lib/voom/presenters/web_client/component_decorator_factory.rb +27 -0
  212. data/lib/voom/presenters/web_client/component_html_decorator.rb +50 -0
  213. data/lib/voom/presenters/web_client/component_renderer.rb +49 -0
  214. data/lib/voom/presenters/web_client/custom_css.rb +65 -0
  215. data/lib/voom/presenters/web_client/{markdown_render.rb → custom_render.rb} +5 -3
  216. data/lib/voom/presenters/web_client/helpers/expand_hash.rb +19 -0
  217. data/lib/voom/presenters/web_client/helpers/form_helpers.rb +14 -0
  218. data/lib/voom/presenters/web_client/helpers/padding_helpers.rb +21 -0
  219. data/lib/voom/presenters/web_client/plugin_headers.rb +37 -0
  220. data/lib/voom/presenters/web_client/router.rb +3 -54
  221. data/lib/voom/railtie.rb +37 -0
  222. data/lib/voom/symbol/to_str.rb +3 -3
  223. data/lib/voom/trace.rb +0 -2
  224. data/presenters.gemspec +8 -4
  225. data/public/bundle.css +18221 -0
  226. data/public/bundle.js +59949 -0
  227. data/public/img/demo/avatar.jpg +0 -0
  228. data/public/presenters/custom_css.css +26 -0
  229. data/public/wc.js +52704 -0
  230. data/scripts/build.sh +10 -0
  231. data/views/mdc/.eslintrc.yml +1 -0
  232. data/views/mdc/.nvmrc +1 -0
  233. data/views/mdc/assets/js/app.js +13 -2
  234. data/views/mdc/assets/js/components/base-component.js +147 -12
  235. data/views/mdc/assets/js/components/base-container.js +54 -14
  236. data/views/mdc/assets/js/components/base-toggle.js +56 -0
  237. data/views/mdc/assets/js/components/button.js +74 -5
  238. data/views/mdc/assets/js/components/cards.js +3 -3
  239. data/views/mdc/assets/js/components/checkboxes.js +7 -30
  240. data/views/mdc/assets/js/components/chips.js +76 -12
  241. data/views/mdc/assets/js/components/content.js +5 -4
  242. data/views/mdc/assets/js/components/data-tables.js +11 -34
  243. data/views/mdc/assets/js/components/datetime.js +29 -6
  244. data/views/mdc/assets/js/components/dialogs.js +128 -31
  245. data/views/mdc/assets/js/components/drag_n_drop.js +182 -0
  246. data/views/mdc/assets/js/components/drawer.js +43 -0
  247. data/views/mdc/assets/js/components/events.js +190 -73
  248. data/views/mdc/assets/js/components/events/action_parameter.js +62 -0
  249. data/views/mdc/assets/js/components/events/action_parameter.test.js +62 -0
  250. data/views/mdc/assets/js/components/events/autocomplete.js +94 -0
  251. data/views/mdc/assets/js/components/events/base.js +139 -23
  252. data/views/mdc/assets/js/components/events/clears.js +15 -12
  253. data/views/mdc/assets/js/components/events/close_dialog.js +50 -0
  254. data/views/mdc/assets/js/components/events/dialog.js +32 -14
  255. data/views/mdc/assets/js/components/events/encode.js +8 -0
  256. data/views/mdc/assets/js/components/events/errors.js +175 -92
  257. data/views/mdc/assets/js/components/events/loads.js +50 -11
  258. data/views/mdc/assets/js/components/events/navigates.js +17 -15
  259. data/views/mdc/assets/js/components/events/plugin.js +18 -0
  260. data/views/mdc/assets/js/components/events/post_message.js +21 -0
  261. data/views/mdc/assets/js/components/events/posts.js +147 -65
  262. data/views/mdc/assets/js/components/events/prompt_if_dirty.js +67 -0
  263. data/views/mdc/assets/js/components/events/removes.js +7 -6
  264. data/views/mdc/assets/js/components/events/replaces.js +87 -33
  265. data/views/mdc/assets/js/components/events/snackbar.js +10 -10
  266. data/views/mdc/assets/js/components/events/stepper.js +8 -10
  267. data/views/mdc/assets/js/components/events/toggle_disabled.js +41 -0
  268. data/views/mdc/assets/js/components/events/toggle_visibility.js +57 -15
  269. data/views/mdc/assets/js/components/file-inputs.js +68 -21
  270. data/views/mdc/assets/js/components/form-fields.js +16 -0
  271. data/views/mdc/assets/js/components/forms.js +3 -3
  272. data/views/mdc/assets/js/components/get_event_target.js +15 -0
  273. data/views/mdc/assets/js/components/grid.js +7 -6
  274. data/views/mdc/assets/js/components/header.js +20 -0
  275. data/views/mdc/assets/js/components/hidden-fields.js +19 -8
  276. data/views/mdc/assets/js/components/icon-toggles.js +7 -7
  277. data/views/mdc/assets/js/components/images.js +19 -0
  278. data/views/mdc/assets/js/components/initialize.js +52 -27
  279. data/views/mdc/assets/js/components/lists.js +9 -4
  280. data/views/mdc/assets/js/components/menus.js +60 -13
  281. data/views/mdc/assets/js/components/mixins/dirtyable.js +22 -0
  282. data/views/mdc/assets/js/components/mixins/event-handler.js +7 -7
  283. data/views/mdc/assets/js/components/mixins/visibility-observer.js +22 -21
  284. data/views/mdc/assets/js/components/plugins.js +86 -0
  285. data/views/mdc/assets/js/components/progress.js +31 -0
  286. data/views/mdc/assets/js/components/radios.js +6 -31
  287. data/views/mdc/assets/js/components/rich-text-area.js +217 -33
  288. data/views/mdc/assets/js/components/rich-text-area/horizontal-rule-blot.js +23 -0
  289. data/views/mdc/assets/js/components/root_document.js +5 -0
  290. data/views/mdc/assets/js/components/selects.js +18 -8
  291. data/views/mdc/assets/js/components/sliders.js +23 -12
  292. data/views/mdc/assets/js/components/snackbar.js +11 -8
  293. data/views/mdc/assets/js/components/steppers.js +3 -3
  294. data/views/mdc/assets/js/components/switches.js +6 -29
  295. data/views/mdc/assets/js/components/tab-bars.js +18 -4
  296. data/views/mdc/assets/js/components/text-fields.js +94 -22
  297. data/views/mdc/assets/js/components/tooltip.js +17 -0
  298. data/views/mdc/assets/js/components/typography.js +28 -0
  299. data/views/mdc/assets/js/components/uninitialize.js +7 -0
  300. data/views/mdc/assets/js/wc.js +111 -0
  301. data/views/mdc/assets/scss/app.scss +12 -5
  302. data/views/mdc/assets/scss/components/avatar.scss +51 -7
  303. data/views/mdc/assets/scss/components/button.scss +7 -9
  304. data/views/mdc/assets/scss/components/card.scss +6 -5
  305. data/views/mdc/assets/scss/components/chip.scss +4 -0
  306. data/views/mdc/assets/scss/components/content.scss +25 -0
  307. data/views/mdc/assets/scss/components/data-table.scss +12 -1
  308. data/views/mdc/assets/scss/components/datetime.scss +1 -2
  309. data/views/mdc/assets/scss/components/dialog.scss +7 -2
  310. data/views/mdc/assets/scss/components/drag_n_drop.scss +17 -0
  311. data/views/mdc/assets/scss/components/drawer.scss +82 -0
  312. data/views/mdc/assets/scss/components/expansion-panel.scss +2 -2
  313. data/views/mdc/assets/scss/components/fab.scss +23 -5
  314. data/views/mdc/assets/scss/components/file-input.scss +10 -14
  315. data/views/mdc/assets/scss/components/grid.scss +32 -17
  316. data/views/mdc/assets/scss/components/header.scss +21 -0
  317. data/views/mdc/assets/scss/components/icon-button-toggles.scss +2 -0
  318. data/views/mdc/assets/scss/components/icon.scss +23 -0
  319. data/views/mdc/assets/scss/components/image-list.scss +18 -0
  320. data/views/mdc/assets/scss/components/image.scss +13 -21
  321. data/views/mdc/assets/scss/components/list.scss +9 -3
  322. data/views/mdc/assets/scss/components/menu.scss +13 -3
  323. data/views/mdc/assets/scss/components/progress.scss +1 -0
  324. data/views/mdc/assets/scss/components/rich-text-area.scss +38 -2
  325. data/views/mdc/assets/scss/components/select.scss +6 -3
  326. data/views/mdc/assets/scss/components/separator.scss +3 -0
  327. data/views/mdc/assets/scss/components/switch.scss +10 -0
  328. data/views/mdc/assets/scss/components/textfield.scss +8 -4
  329. data/views/mdc/assets/scss/components/tooltip.scss +3 -0
  330. data/views/mdc/assets/scss/components/typography.scss +6 -0
  331. data/views/mdc/assets/scss/components/unordered-lists.scss +17 -0
  332. data/views/mdc/assets/scss/material.blue_grey-orange.min.css +1 -1
  333. data/views/mdc/assets/scss/media.scss +39 -0
  334. data/views/mdc/assets/scss/palette.scss +16 -0
  335. data/views/mdc/assets/scss/styles.scss +39 -1
  336. data/views/mdc/assets/scss/theme.scss +19 -2
  337. data/views/mdc/body/dismissable-drawer.erb +34 -0
  338. data/views/mdc/body/drawer/divider.erb +1 -0
  339. data/views/mdc/body/drawer/item.erb +13 -0
  340. data/views/mdc/body/drawer/label.erb +1 -0
  341. data/views/mdc/body/drawers/menu.erb +1 -1
  342. data/views/mdc/body/footers/menu_item.erb +2 -2
  343. data/views/mdc/body/header.erb +38 -31
  344. data/views/mdc/body/modal-drawer.erb +35 -0
  345. data/views/mdc/body/snackbar.erb +11 -5
  346. data/views/mdc/components/actions/autocomplete.rb +8 -0
  347. data/views/mdc/components/actions/close_dialog.rb +10 -0
  348. data/views/mdc/components/actions/loads.rb +7 -1
  349. data/views/mdc/components/actions/navigates.rb +1 -1
  350. data/views/mdc/components/actions/post.rb +4 -7
  351. data/views/mdc/components/actions/post_message.rb +10 -0
  352. data/views/mdc/components/actions/prompt_if_dirty.rb +17 -0
  353. data/views/mdc/components/actions/replaces.rb +5 -1
  354. data/views/mdc/components/actions/resolver.rb +39 -0
  355. data/views/mdc/components/actions/snackbar.rb +3 -1
  356. data/views/mdc/components/actions/toggle_disabled.rb +10 -0
  357. data/views/mdc/components/avatar.erb +12 -7
  358. data/views/mdc/components/badge.erb +1 -1
  359. data/views/mdc/components/button.erb +2 -3
  360. data/views/mdc/components/buttons/button.erb +12 -12
  361. data/views/mdc/components/buttons/fab.erb +3 -2
  362. data/views/mdc/components/buttons/icon.erb +5 -5
  363. data/views/mdc/components/buttons/image.erb +4 -3
  364. data/views/mdc/components/card.erb +67 -44
  365. data/views/mdc/components/checkbox.erb +32 -35
  366. data/views/mdc/components/chip.erb +38 -30
  367. data/views/mdc/components/chipset.erb +18 -0
  368. data/views/mdc/components/content.erb +35 -14
  369. data/views/mdc/components/datetime.erb +6 -19
  370. data/views/mdc/components/dialog.erb +45 -25
  371. data/views/mdc/components/drag_and_drop/drag_and_drop.rb +16 -0
  372. data/views/mdc/components/event.erb +3 -5
  373. data/views/mdc/components/expansion_panel.erb +8 -6
  374. data/views/mdc/components/file_input.erb +14 -10
  375. data/views/mdc/components/form.erb +4 -19
  376. data/views/mdc/components/grid.erb +20 -17
  377. data/views/mdc/components/hidden_field.erb +3 -4
  378. data/views/mdc/components/icon.erb +7 -5
  379. data/views/mdc/components/icon_toggle.erb +9 -8
  380. data/views/mdc/components/image.erb +23 -5
  381. data/views/mdc/components/image_list.erb +38 -0
  382. data/views/mdc/components/link.erb +3 -13
  383. data/views/mdc/components/list.erb +4 -2
  384. data/views/mdc/components/list/avatar.erb +2 -1
  385. data/views/mdc/components/list/header.erb +5 -3
  386. data/views/mdc/components/list/hidden_field.erb +3 -0
  387. data/views/mdc/components/list/icon.erb +2 -1
  388. data/views/mdc/components/list/line.erb +19 -9
  389. data/views/mdc/components/list/menu.erb +7 -2
  390. data/views/mdc/components/list/separator.erb +1 -1
  391. data/views/mdc/components/menu.erb +14 -6
  392. data/views/mdc/components/number_field.erb +38 -0
  393. data/views/mdc/components/page_title.erb +2 -2
  394. data/views/mdc/components/progress.erb +11 -0
  395. data/views/mdc/components/radio_button.erb +5 -6
  396. data/views/mdc/components/render.erb +2 -3
  397. data/views/mdc/components/rich_text_area.erb +13 -10
  398. data/views/mdc/components/select.erb +28 -12
  399. data/views/mdc/components/separator.erb +3 -0
  400. data/views/mdc/components/shared/hint_error_display.erb +9 -0
  401. data/views/mdc/components/shared/input_label.erb +7 -0
  402. data/views/mdc/components/slider.erb +3 -1
  403. data/views/mdc/components/stepper.erb +1 -1
  404. data/views/mdc/components/stepper/step.erb +1 -1
  405. data/views/mdc/components/switch.erb +8 -7
  406. data/views/mdc/components/tab_bar.erb +7 -1
  407. data/views/mdc/components/table.erb +26 -13
  408. data/views/mdc/components/table/checkbox.erb +6 -3
  409. data/views/mdc/components/table/column.erb +18 -0
  410. data/views/mdc/components/table/footer.erb +8 -0
  411. data/views/mdc/components/table/header.erb +5 -4
  412. data/views/mdc/components/table/pagination.erb +2 -6
  413. data/views/mdc/components/table/row.erb +5 -5
  414. data/views/mdc/components/text_area.erb +9 -11
  415. data/views/mdc/components/text_field.erb +29 -37
  416. data/views/mdc/components/tooltip.erb +2 -2
  417. data/views/mdc/components/typography.erb +7 -5
  418. data/views/mdc/components/unordered_list.erb +10 -0
  419. data/views/mdc/components/unordered_list/icon.erb +3 -0
  420. data/views/mdc/components/unordered_list/list_item.erb +7 -0
  421. data/views/mdc/layout.erb +41 -29
  422. data/views/mdc/package-lock.json +2222 -1327
  423. data/views/mdc/package.json +47 -29
  424. data/views/mdc/web.erb +4 -0
  425. data/views/mdc/webpack.config.js +13 -1
  426. metadata +218 -26
  427. data/lib/voom-presenters.rb +0 -9
  428. data/lib/voom/presenters-engine.rb +0 -44
  429. data/lib/voom/presenters.rb +0 -19
  430. data/public/.gitignore +0 -2
  431. data/scripts/bump.sh +0 -5
  432. data/scripts/changelog.sh +0 -5
  433. data/scripts/deploy-demo.sh +0 -3
  434. data/scripts/release.sh +0 -5
  435. data/scripts/tag.sh +0 -5
  436. data/views/mdc/assets/js/dialog-polyfill.js +0 -738
  437. data/views/mdc/assets/scss/components/icon-toggles.scss +0 -9
  438. data/views/mdc/assets/scss/components/vendor/flatpickr.min.css +0 -13
  439. data/views/mdc/body/drawer.erb +0 -18
  440. data/views/mdc/components/google_map.erb +0 -9
@@ -1,5 +1,3 @@
1
- require 'voom/presenters/dsl/components/mixins/event'
2
-
3
1
  module Voom
4
2
  module Presenters
5
3
  module DSL
@@ -9,7 +7,7 @@ module Voom
9
7
  attr_reader :event_parent_id
10
8
 
11
9
  def initialize(**attribs_, &block)
12
- super(type: :icon,
10
+ super(type: :icon,
13
11
  **attribs_, &block)
14
12
  @event_parent_id = @id
15
13
  end
@@ -1,6 +1,3 @@
1
- require 'voom/presenters/dsl/components/mixins/common'
2
- require 'voom/presenters/dsl/components/mixins/attaches'
3
-
4
1
  module Voom
5
2
  module Presenters
6
3
  module DSL
@@ -1,19 +1,31 @@
1
- require 'voom/presenters/dsl/components/input'
2
-
3
1
  module Voom
4
2
  module Presenters
5
3
  module DSL
6
4
  module Components
7
5
  class FileInput < Input
8
- attr_reader :button_label, :input_label
6
+ include Mixins::Append
7
+ include Mixins::Buttons
8
+ include Mixins::Grids
9
+
10
+ attr_reader :accept, :preview, :components
9
11
 
10
12
  def initialize(**attribs_, &block)
11
13
  super(type: :file_input, **attribs_, &block)
12
14
 
13
- @button_label = attribs.delete(:button_label) { 'Choose a file' }
14
- @input_label = attribs.delete(:input_label) { 'No file selected' }
15
-
15
+ @accept = attribs.delete(:accept) { nil }
16
+ @preview = attribs.delete(:preview) { nil }
17
+ @components = []
16
18
  expand!
19
+ default_button
20
+ end
21
+
22
+ def value(value=nil)
23
+ return @value if locked?
24
+ @value = value
25
+ end
26
+ private
27
+ def default_button
28
+ button(icon: :cloud_upload) unless components.any?
17
29
  end
18
30
  end
19
31
  end
@@ -6,7 +6,7 @@ module Voom
6
6
  attr_accessor :footer_type, :menus
7
7
 
8
8
  def initialize(type: nil, **attribs_, &block)
9
- @footer_type = h(type) || :small
9
+ @footer_type = type || :small
10
10
  super(type: :footer, **attribs_, &block)
11
11
  @menus = []
12
12
  expand!
@@ -14,7 +14,7 @@ module Voom
14
14
 
15
15
  def menu(title=nil, **attribs, &block)
16
16
  return @menus if locked?
17
- @menus << Menu.new(title,parent: self,
17
+ @menus << Menu.new(title,parent: self,
18
18
  **attribs, &block)
19
19
  end
20
20
 
@@ -1,20 +1,3 @@
1
- require 'voom/presenters/dsl/components/hidden_field'
2
- require 'voom/presenters/dsl/components/text_field'
3
- require 'voom/presenters/dsl/components/text_area'
4
- require 'voom/presenters/dsl/components/mixins/event'
5
- require 'voom/presenters/dsl/components/mixins/grids'
6
- require 'voom/presenters/dsl/components/mixins/append'
7
- require 'voom/presenters/dsl/components/mixins/text_fields'
8
- require 'voom/presenters/dsl/components/mixins/selects'
9
- require 'voom/presenters/dsl/components/mixins/buttons'
10
- require 'voom/presenters/dsl/components/mixins/toggles'
11
- require 'voom/presenters/dsl/components/mixins/attaches'
12
- require 'voom/presenters/dsl/components/mixins/expansion_panels'
13
- require 'voom/presenters/dsl/components/mixins/content'
14
- require 'voom/presenters/dsl/components/mixins/typography'
15
- require 'voom/presenters/dsl/components/mixins/date_time_fields'
16
- require 'voom/presenters/dsl/components/mixins/file_inputs'
17
-
18
1
  module Voom
19
2
  module Presenters
20
3
  module DSL
@@ -32,6 +15,8 @@ module Voom
32
15
  include Mixins::Content
33
16
  include Mixins::Typography
34
17
  include Mixins::FileInputs
18
+ include Mixins::Images
19
+ include Mixins::Tables
35
20
 
36
21
  attr_reader :components, :shows_errors
37
22
 
@@ -1,62 +1,30 @@
1
- require 'voom/presenters/dsl/components/mixins/common'
2
- require 'voom/presenters/dsl/components/mixins/images'
3
- require 'voom/presenters/dsl/components/mixins/icons'
4
- require 'voom/presenters/dsl/components/mixins/event'
5
- require 'voom/presenters/dsl/components/mixins/attaches'
6
- require 'voom/presenters/dsl/components/mixins/dialogs'
7
- require 'voom/presenters/dsl/components/mixins/chips'
8
- require 'voom/presenters/dsl/components/mixins/snackbars'
9
- require 'voom/presenters/dsl/components/mixins/selects'
10
- require 'voom/presenters/dsl/components/mixins/text_fields'
11
- require 'voom/presenters/dsl/components/mixins/date_time_fields'
12
- require 'voom/presenters/dsl/components/mixins/steppers'
13
- require 'voom/presenters/dsl/components/mixins/sliders'
14
- require 'voom/presenters/dsl/components/mixins/file_inputs'
15
-
16
1
  module Voom
17
2
  module Presenters
18
3
  module DSL
19
4
  module Components
20
- module Padding
21
- def coerce_padding(padding)
22
- case padding
23
- when true, :full
24
- [:top, :right, :bottom, :left]
25
- when false, :none
26
- []
27
- else
28
- Array(padding)
29
- end
30
- end
31
-
32
- def validate_padding(padding_)
33
- validation_msg = 'Padding must either be true or :full, false or :none, '\
34
- 'or an array containing zero ore more of the following :top, :right, :bottom, :left!'
35
- if padding_.respond_to?(:pop)
36
- raise Errors::ParameterValidation, validation_msg if (padding_ - %i(top right bottom left)).any?
37
- else
38
- raise Errors::ParameterValidation, validation_msg unless padding_===true ||
39
- padding_===false ||
40
- %i(full none).include(padding_)
41
- end
42
- padding_
43
- end
44
-
45
- end
46
- class Grid < Base
5
+ class Grid < EventBase
47
6
  include Mixins::Attaches
48
7
  include Mixins::Dialogs
49
8
  include Mixins::Snackbars
9
+ include Mixins::Progress
10
+ include Mixins::Padding
50
11
 
51
- attr_accessor :columns, :color, :padding, :wide
12
+ attr_reader :columns,
13
+ :color,
14
+ :padding,
15
+ :wide,
16
+ :gutter,
17
+ :height
52
18
 
53
19
  def initialize(color: nil, **attribs_, &block)
54
20
  super(type: :grid, **attribs_, &block)
55
21
  @columns = []
56
- @color = h(color)
22
+ @color = color
57
23
  padding = attribs.delete(:padding) {nil}
58
- @padding = validate_padding(coerce_padding(padding)).uniq if padding != nil
24
+ @padding = validate_padding(coerce_padding(padding, default_level: 3)).uniq if padding != nil
59
25
  @wide = attribs.delete(:wide) {false}
26
+ @gutter = coerce_gutter(attribs.delete(:gutter) {nil})
27
+ @height = attribs.delete(:height) {nil}
60
28
  expand!
61
29
  end
62
30
 
@@ -67,13 +35,28 @@ module Voom
67
35
  end
68
36
 
69
37
  private
70
- include Padding
38
+
39
+ def coerce_gutter(gutter)
40
+ case gutter
41
+ when true, :full, :all
42
+ true
43
+ when false, :none
44
+ false
45
+ when nil
46
+ nil
47
+ else
48
+ raise Errors::ParameterValidation, "Grid gutter was: #{gutter}. "\
49
+ 'Allowed gutter values are true, false, :full, :all, :none! and nil'
50
+ end
51
+ end
52
+
53
+ include Mixins::Padding
71
54
  class Column < EventBase
72
55
  include Mixins::Common
73
56
  include Mixins::Icons
74
57
  include Mixins::Attaches
75
58
  include Mixins::Dialogs
76
- include Mixins::Chips
59
+ include Mixins::Chipset
77
60
  include Mixins::TextFields
78
61
  include Mixins::DateTimeFields
79
62
  include Mixins::Selects
@@ -82,10 +65,20 @@ module Voom
82
65
  include Mixins::Steppers
83
66
  include Mixins::Sliders
84
67
  include Mixins::FileInputs
68
+ include Mixins::Avatar
69
+ include Mixins::Progress
70
+ include Mixins::Padding
85
71
 
86
- include Padding
87
-
88
- attr_reader :size, :desktop, :tablet, :phone, :color, :components, :padding
72
+ attr_reader :size,
73
+ :desktop,
74
+ :tablet,
75
+ :phone,
76
+ :color,
77
+ :components,
78
+ :padding,
79
+ :align,
80
+ :overflow,
81
+ :height
89
82
 
90
83
  def initialize(**attribs_, &block)
91
84
  super(type: :column, **attribs_, &block)
@@ -94,12 +87,21 @@ module Voom
94
87
  @tablet = attribs.delete(:tablet)
95
88
  @phone = attribs.delete(:phone)
96
89
  @color = attribs.delete(:color)
90
+ @align = validate_alignment(attribs.delete(:align) {:left})
91
+ @overflow = attribs.delete(:overflow){true}
97
92
  @components = []
98
93
  padding = attribs.delete(:padding) {nil}
99
94
  @padding = validate_padding(coerce_padding(padding)).uniq if padding != nil
95
+ @height = attribs.delete(:height) {nil}
100
96
  expand!
101
97
  end
102
98
 
99
+ def validate_alignment(align)
100
+ valid_alignment = %i(right left)
101
+ raise "Invalid value for column alignment: #{align}. "\
102
+ "Valid values are #{valid_alignment.join(' ,')}." unless valid_alignment.include?(align)
103
+ align
104
+ end
103
105
  end
104
106
  end
105
107
  end
@@ -3,13 +3,16 @@ module Voom
3
3
  module DSL
4
4
  module Components
5
5
  class Header < Base
6
- attr_accessor :title, :image
6
+ attr_accessor :title, :image, :placement
7
+
8
+ VALID_PLACEMENTS = %i[static fixed].freeze
7
9
 
8
10
  def initialize(**attribs_, &block)
9
11
  super(type: :header,
10
12
  **attribs_, &block)
11
13
  self.title(attribs.delete(:title)) if attribs.key?(:title)
12
14
  @image = attribs.delete(:image)
15
+ @placement = validate_placement(attribs.delete(:placement) { :static })
13
16
  expand!
14
17
  end
15
18
 
@@ -35,6 +38,19 @@ module Voom
35
38
  @title = Components::Typography.new(parent: self, type: :text, text: text, **attribs, &block)
36
39
  end
37
40
 
41
+ private
42
+
43
+ def validate_placement(value)
44
+ return unless value
45
+
46
+ placement = value.to_sym
47
+
48
+ unless VALID_PLACEMENTS.include?(placement)
49
+ raise Errors::ParameterValidation, "Invalid placement specified: #{placement}"
50
+ end
51
+
52
+ placement
53
+ end
38
54
  end
39
55
  end
40
56
  end
@@ -1,5 +1,3 @@
1
- require 'voom/presenters/dsl/components/input'
2
-
3
1
  module Voom
4
2
  module Presenters
5
3
  module DSL
@@ -1,16 +1,14 @@
1
- require 'voom/presenters/dsl/components/mixins/event'
2
- require 'voom/presenters/dsl/components/mixins/tooltips'
3
- require 'voom/presenters/dsl/components/icon_base'
4
-
5
1
  module Voom
6
2
  module Presenters
7
3
  module DSL
8
4
  module Components
9
5
  class Icon < IconBase
10
6
  include Mixins::Tooltips
7
+ attr_accessor :text
11
8
 
12
9
  def initialize(**attribs_, &block)
13
10
  super(**attribs_, &block)
11
+ @text = attribs.delete(:text)
14
12
  expand!
15
13
  end
16
14
  end
@@ -1,21 +1,19 @@
1
- require 'voom/presenters/dsl/components/mixins/event'
2
- require 'voom/presenters/dsl/components/mixins/tooltips'
3
-
4
1
  module Voom
5
2
  module Presenters
6
3
  module DSL
7
4
  module Components
8
5
  class IconBase < EventBase
9
6
  include Mixins::Tooltips
10
- attr_reader :icon, :color, :size, :position
7
+ attr_reader :icon, :color, :size, :position, :hidden
11
8
 
12
9
  def initialize(**attribs_, &block)
13
10
  super(type: :icon,
14
11
  **attribs_, &block)
15
- @icon = attribs.delete(:icon)
12
+ @icon = attribs.delete(:icon)
16
13
  @color = attribs.delete(:color)
17
- @size = attribs.delete(:size)
18
- @position = Array(attribs.delete(:position)).compact
14
+ @size = attribs.delete(:size){ :default }
15
+ @position = Array(attribs.delete(:position)).compact
16
+ @hidden = attribs.delete(:hidden) {false}
19
17
  end
20
18
  end
21
19
  end
@@ -1,17 +1,15 @@
1
- require 'voom/presenters/dsl/components/toggle_base'
2
-
3
1
  module Voom
4
2
  module Presenters
5
3
  module DSL
6
4
  module Components
7
5
  class IconToggle < ToggleBase
8
- attr_accessor :icon, :selected, :disabled
6
+ attr_accessor :icon, :on_icon, :selected
9
7
 
10
8
  def initialize(**attribs_, &block)
11
9
  super(type: :icon_toggle, **attribs_, &block)
12
10
  @icon = attribs.delete(:icon)
11
+ @on_icon = attribs.delete(:on_icon) { @icon }
13
12
  @selected = attribs.delete(:selected) { false }
14
- @disabled = attribs.delete(:disabled) { false }
15
13
  expand!
16
14
  end
17
15
  end
@@ -1,6 +1,3 @@
1
- require 'voom/presenters/dsl/components/mixins/event'
2
- require 'voom/presenters/dsl/components/mixins/tooltips'
3
-
4
1
  module Voom
5
2
  module Presenters
6
3
  module DSL
@@ -8,27 +5,78 @@ module Voom
8
5
  class Image < EventBase
9
6
  include Mixins::Tooltips
10
7
 
11
- attr_accessor :image, :height, :width, :position, :selected, :url
8
+ VALID_FIT_TYPES = %i[contain cover fill fit].freeze
9
+ DEFAULT_POSITION = :center
10
+
11
+ attr_accessor :image,
12
+ :description,
13
+ :url,
14
+ :min_height,
15
+ :height,
16
+ :max_height,
17
+ :min_width,
18
+ :width,
19
+ :max_width,
20
+ :border,
21
+ :border_color,
22
+ :border_radius,
23
+ :fit,
24
+ :position
12
25
 
13
26
  def initialize(**attribs_, &block)
14
- super(type: :image,
15
- **attribs_, &block)
27
+ super(type: :image, **attribs_, &block)
28
+
16
29
  @image = attribs.delete(:image)
17
- @height = attribs.delete(:height)
18
- @width = attribs.delete(:width)
19
- @position = Array(attribs.delete(:position)).compact
20
- @selected = attribs.delete(:selected)
30
+ @description = attribs.delete(:description)
31
+
32
+ @min_width = validate_size(attribs.delete(:min_width))
33
+ @width = validate_size(attribs.delete(:width))
34
+ @max_width = validate_size(attribs.delete(:max_width))
35
+
36
+ @min_height = validate_size(attribs.delete(:min_height))
37
+ @height = validate_size(attribs.delete(:height))
38
+ @max_height = validate_size(attribs.delete(:max_height))
39
+
40
+ @border = attribs.delete(:border)
41
+ @border_color = attribs.delete(:border_color) { :primary }
42
+ @border_radius = attribs.delete(:border_radius)
43
+
44
+ @fit = validate_fit(attribs.delete(:fit) { :contain })
45
+ @position = Array(attribs.delete(:position) { DEFAULT_POSITION }).compact
46
+
21
47
  @url = build_url
48
+
22
49
  expand!
23
50
  end
24
-
51
+
25
52
  private
53
+
26
54
  def build_url
27
- return nil unless image
28
- return image if image.start_with?('/') || @image.start_with?('http')
55
+ return unless image
56
+ return image if image.start_with?('/') || image.start_with?('http')
57
+
29
58
  @parent.router.url(render: image, context: {})
30
59
  end
31
60
 
61
+ def validate_fit(fit)
62
+ return unless fit
63
+
64
+ fit = fit.to_sym
65
+
66
+ unless VALID_FIT_TYPES.include?(fit)
67
+ raise Errors::ParameterValidation, "Invalid image fit specified: #{fit}"
68
+ end
69
+
70
+ fit
71
+ end
72
+
73
+ # Ensure all size values have a unit, defaulting to pixels.
74
+ def validate_size(value)
75
+ return unless value
76
+ return "#{value}px" if value.to_s.match?(/\A\d+\Z/)
77
+
78
+ value
79
+ end
32
80
  end
33
81
  end
34
82
  end