j1-template 2020.0.22 → 2020.0.24

Sign up to get free protection for your applications and to get access to all the features.
Files changed (266) hide show
  1. checksums.yaml +4 -4
  2. data/_includes/themes/j1/layouts/content_generator_page.html +1 -1
  3. data/_includes/themes/j1/layouts/content_generator_post.html +63 -161
  4. data/_includes/themes/j1/modules/connectors/ad/google-adsense.html +14 -0
  5. data/_includes/themes/j1/modules/connectors/analytic/google-analytics.html +1 -3
  6. data/_includes/themes/j1/modules/connectors/comment/disqus.html +37 -24
  7. data/_includes/themes/j1/modules/navigator/generator.html +8 -3
  8. data/_includes/themes/j1/modules/navigator/procedures/topsearch.proc +36 -26
  9. data/_includes/themes/j1/procedures/layouts/module_writer.proc +1 -1
  10. data/_includes/themes/j1/procedures/posts/create_series_header.proc +9 -5
  11. data/assets/data/banner.html +1 -1
  12. data/assets/data/fam.html +124 -0
  13. data/assets/data/mmenu_sidebar.html +3 -3
  14. data/assets/data/panel.html +9 -9
  15. data/assets/data/quicklinks.html +13 -13
  16. data/assets/error_pages/HTTP204.html +1 -0
  17. data/assets/error_pages/HTTP400.html +3 -2
  18. data/assets/error_pages/HTTP401.html +3 -2
  19. data/assets/error_pages/HTTP403.html +3 -2
  20. data/assets/error_pages/HTTP404.html +3 -2
  21. data/assets/error_pages/HTTP500.html +3 -2
  22. data/assets/error_pages/HTTP501.html +3 -2
  23. data/assets/error_pages/HTTP502.html +3 -2
  24. data/assets/error_pages/HTTP503.html +3 -2
  25. data/assets/error_pages/HTTP520.html +3 -2
  26. data/assets/error_pages/HTTP521.html +3 -2
  27. data/assets/error_pages/HTTP533.html +3 -2
  28. data/assets/themes/j1/adapter/js/{ssm.js → fam.js} +248 -138
  29. data/assets/themes/j1/adapter/js/framer.js +72 -56
  30. data/assets/themes/j1/adapter/js/gallery_customizer.js +2 -1
  31. data/assets/themes/j1/adapter/js/j1.js +8 -2
  32. data/assets/themes/j1/adapter/js/{searcher.js → lunr_search.js} +68 -65
  33. data/assets/themes/j1/adapter/js/toccer.js +62 -30
  34. data/assets/themes/j1/core/css/bootstrap.css +7154 -0
  35. data/assets/themes/j1/core/css/bootstrap.min.css +6 -0
  36. data/assets/themes/j1/core/css/custom.scss +28 -0
  37. data/assets/themes/j1/core/css/globals.css +14523 -0
  38. data/assets/themes/j1/core/css/globals.min.css +1 -0
  39. data/assets/themes/j1/core/css/globals.scss +28 -0
  40. data/assets/themes/j1/core/css/theme_extensions.css +11558 -0
  41. data/assets/themes/j1/core/css/theme_extensions.min.css +1 -0
  42. data/assets/themes/j1/core/css/themes/bootstrap/bootstrap.css +7 -4
  43. data/assets/themes/j1/core/css/themes/bootstrap/bootstrap.min.css +2 -2
  44. data/assets/themes/j1/core/css/themes/uno-dark/bootstrap.css +7 -4
  45. data/assets/themes/j1/core/css/themes/uno-dark/bootstrap.min.css +2 -2
  46. data/assets/themes/j1/core/css/themes/uno-light/bootstrap.css +514 -417
  47. data/assets/themes/j1/core/css/themes/uno-light/bootstrap.min.css +2 -2
  48. data/assets/themes/j1/core/css/uno.css +11823 -0
  49. data/assets/themes/j1/core/css/uno.min.css +1 -0
  50. data/assets/themes/j1/core/css/uno.scss +28 -0
  51. data/assets/themes/j1/core/css/vendor.css +5 -4
  52. data/assets/themes/j1/core/css/vendor.min.css +1 -1
  53. data/assets/themes/j1/core/css/vendor.scss +28 -0
  54. data/assets/themes/j1/core/js/template.js +6 -11
  55. data/assets/themes/j1/core/js/template.js.map +1 -1
  56. data/assets/themes/j1/core/js/template.min.js +1 -1
  57. data/assets/themes/j1/modules/bmd/js/bootstrap-material-design.js +6 -0
  58. data/assets/themes/j1/modules/cash/js/cash.js +1374 -0
  59. data/assets/themes/j1/modules/cash/js/cash.min.js +42 -0
  60. data/assets/themes/j1/modules/fam/css/uno/fam.css +369 -0
  61. data/assets/themes/j1/modules/fam/js/fam.js +477 -0
  62. data/assets/themes/j1/modules/iframeResizer/examples/frame.nested.html +1 -1
  63. data/assets/themes/j1/modules/iframeResizer/js/{iframeResizer.js → resizer.js} +0 -0
  64. data/assets/themes/j1/modules/iframeResizer/js/{iframeResizer.map → resizer.map} +0 -0
  65. data/assets/themes/j1/modules/iframeResizer/js/{iframeResizer.min.js → resizer.min.js} +0 -0
  66. data/assets/themes/j1/modules/jquery/js/require.js +2145 -0
  67. data/assets/themes/j1/modules/jquery/js/require.min.js +5 -0
  68. data/assets/themes/j1/modules/lunrSearch/css/lunr_search.css +32 -0
  69. data/assets/themes/j1/modules/lunrSearch/css/lunr_search.min.css +25 -0
  70. data/assets/themes/j1/modules/lunrSearch/js/dateformat.js +125 -0
  71. data/assets/themes/j1/modules/lunrSearch/js/dateformat.min.js +14 -0
  72. data/assets/themes/j1/modules/lunrSearch/js/lunr.js +3475 -0
  73. data/assets/themes/j1/modules/lunrSearch/js/lunr.min.js +51 -0
  74. data/assets/themes/j1/modules/lunrSearch/js/lunr_search.js +184 -0
  75. data/assets/themes/j1/modules/lunrSearch/js/lunr_search.min.js +17 -0
  76. data/assets/themes/j1/modules/lunrSearch/js/mustache.js +772 -0
  77. data/assets/themes/j1/modules/lunrSearch/js/mustache.min.js +772 -0
  78. data/assets/themes/j1/modules/lunrSearch/js/uri.js +2340 -0
  79. data/assets/themes/j1/modules/lunrSearch/js/uri.min.js +93 -0
  80. data/assets/themes/j1/modules/materialize/js/anime.js +1283 -0
  81. data/assets/themes/j1/modules/materialize/js/anime.min.js +34 -0
  82. data/assets/themes/j1/modules/materialize/js/autocomplete.js +450 -0
  83. data/assets/themes/j1/modules/materialize/js/buttons.js +409 -0
  84. data/assets/themes/j1/modules/materialize/js/cards.js +40 -0
  85. data/assets/themes/j1/modules/materialize/js/carousel.js +717 -0
  86. data/assets/themes/j1/modules/materialize/js/cash-dom.js +1044 -0
  87. data/assets/themes/j1/modules/materialize/js/cash.js +960 -0
  88. data/assets/themes/j1/modules/materialize/js/characterCounter.js +136 -0
  89. data/assets/themes/j1/modules/materialize/js/chips.js +481 -0
  90. data/assets/themes/j1/modules/materialize/js/collapsible.js +275 -0
  91. data/assets/themes/j1/modules/materialize/js/component.js +44 -0
  92. data/assets/themes/j1/modules/materialize/js/datepicker.js +975 -0
  93. data/assets/themes/j1/modules/materialize/js/dropdown.js +617 -0
  94. data/assets/themes/j1/modules/materialize/js/forms.js +275 -0
  95. data/assets/themes/j1/modules/materialize/js/global.js +427 -0
  96. data/assets/themes/j1/modules/materialize/js/materialbox.js +453 -0
  97. data/assets/themes/j1/modules/materialize/js/modal.js +382 -0
  98. data/assets/themes/j1/modules/materialize/js/parallax.js +138 -0
  99. data/assets/themes/j1/modules/materialize/js/pushpin.js +145 -0
  100. data/assets/themes/j1/modules/materialize/js/range.js +263 -0
  101. data/assets/themes/j1/modules/materialize/js/ripple.js +335 -0
  102. data/assets/themes/j1/modules/materialize/js/scrollspy.js +295 -0
  103. data/assets/themes/j1/modules/materialize/js/select.js +432 -0
  104. data/assets/themes/j1/modules/materialize/js/sidenav.js +580 -0
  105. data/assets/themes/j1/modules/materialize/js/slider.js +359 -0
  106. data/assets/themes/j1/modules/materialize/js/tabs.js +402 -0
  107. data/assets/themes/j1/modules/materialize/js/tapTarget.js +314 -0
  108. data/assets/themes/j1/modules/materialize/js/timepicker.js +647 -0
  109. data/assets/themes/j1/modules/materialize/js/toasts.js +310 -0
  110. data/assets/themes/j1/modules/materialize/js/tooltip.js +303 -0
  111. data/assets/themes/j1/modules/materialize/js/waves.js +335 -0
  112. data/assets/themes/j1/modules/materialize/scss/components/_badges.scss +55 -0
  113. data/assets/themes/j1/modules/materialize/scss/components/_buttons.scss +322 -0
  114. data/assets/themes/j1/modules/materialize/scss/components/_cards.scss +195 -0
  115. data/assets/themes/j1/modules/materialize/scss/components/_carousel.scss +90 -0
  116. data/assets/themes/j1/modules/materialize/scss/components/_chips.scss +90 -0
  117. data/assets/themes/j1/modules/materialize/scss/components/_collapsible.scss +91 -0
  118. data/assets/themes/j1/modules/materialize/scss/components/_color-classes.scss +32 -0
  119. data/assets/themes/j1/modules/materialize/scss/components/_color-variables.scss +370 -0
  120. data/assets/themes/j1/modules/materialize/scss/components/_datepicker.scss +191 -0
  121. data/assets/themes/j1/modules/materialize/scss/components/_dropdown.scss +85 -0
  122. data/assets/themes/j1/modules/materialize/scss/components/_global.scss +769 -0
  123. data/assets/themes/j1/modules/materialize/scss/components/_grid.scss +156 -0
  124. data/assets/themes/j1/modules/materialize/scss/components/_icons-material-design.scss +5 -0
  125. data/assets/themes/j1/modules/materialize/scss/components/_materialbox.scss +43 -0
  126. data/assets/themes/j1/modules/materialize/scss/components/_modal.scss +94 -0
  127. data/assets/themes/j1/modules/materialize/scss/components/_navbar.scss +208 -0
  128. data/assets/themes/j1/modules/materialize/scss/components/_normalize.scss +447 -0
  129. data/assets/themes/j1/modules/materialize/scss/components/_preloader.scss +334 -0
  130. data/assets/themes/j1/modules/materialize/scss/components/_pulse.scss +34 -0
  131. data/assets/themes/j1/modules/materialize/scss/components/_sidenav.scss +216 -0
  132. data/assets/themes/j1/modules/materialize/scss/components/_slider.scss +92 -0
  133. data/assets/themes/j1/modules/materialize/scss/components/_table_of_contents.scss +33 -0
  134. data/assets/themes/j1/modules/materialize/scss/components/_tabs.scss +99 -0
  135. data/assets/themes/j1/modules/materialize/scss/components/_tapTarget.scss +103 -0
  136. data/assets/themes/j1/modules/materialize/scss/components/_timepicker.scss +183 -0
  137. data/assets/themes/j1/modules/materialize/scss/components/_toast.scss +58 -0
  138. data/assets/themes/j1/modules/materialize/scss/components/_tooltip.scss +32 -0
  139. data/assets/themes/j1/modules/materialize/scss/components/_transitions.scss +13 -0
  140. data/assets/themes/j1/modules/materialize/scss/components/_typography.scss +60 -0
  141. data/assets/themes/j1/modules/materialize/scss/components/_variables.scss +349 -0
  142. data/assets/themes/j1/modules/materialize/scss/components/_waves.scss +114 -0
  143. data/assets/themes/j1/modules/materialize/scss/components/forms/_checkboxes.scss +200 -0
  144. data/assets/themes/j1/modules/materialize/scss/components/forms/_file-input.scss +44 -0
  145. data/assets/themes/j1/modules/materialize/scss/components/forms/_forms.scss +22 -0
  146. data/assets/themes/j1/modules/materialize/scss/components/forms/_input-fields.scss +354 -0
  147. data/assets/themes/j1/modules/materialize/scss/components/forms/_radio-buttons.scss +115 -0
  148. data/assets/themes/j1/modules/materialize/scss/components/forms/_range.scss +161 -0
  149. data/assets/themes/j1/modules/materialize/scss/components/forms/_select.scss +180 -0
  150. data/assets/themes/j1/modules/materialize/scss/components/forms/_switches.scss +89 -0
  151. data/assets/themes/j1/modules/materialize/scss/materialize.scss +41 -0
  152. data/assets/themes/j1/modules/{bsThemeSwitcher → themeSwitcher}/js/switcher.js +0 -0
  153. data/assets/themes/j1/modules/{bsThemeSwitcher → themeSwitcher}/js/switcher.min.js +0 -0
  154. data/lib/j1/version.rb +1 -1
  155. data/lib/starter_web/Gemfile +12 -16
  156. data/lib/starter_web/_config.yml +95 -21
  157. data/lib/starter_web/_data/blocks/banner.yml +1 -1
  158. data/lib/starter_web/_data/blocks/panel.yml +6 -6
  159. data/lib/starter_web/_data/j1_config.yml +7 -6
  160. data/lib/starter_web/_data/layouts/home.yml +13 -3
  161. data/lib/starter_web/_data/layouts/page.yml +10 -0
  162. data/lib/starter_web/_data/layouts/post.yml +10 -0
  163. data/lib/starter_web/_data/modules/defaults/{ssm.yml → fam.yml} +12 -15
  164. data/lib/starter_web/_data/modules/defaults/lunr_search.yml +171 -0
  165. data/lib/starter_web/_data/modules/defaults/navigator.yml +4 -4
  166. data/lib/starter_web/_data/modules/defaults/toccer.yml +4 -2
  167. data/lib/starter_web/_data/modules/fam.yml +158 -0
  168. data/lib/starter_web/_data/modules/{back2top.yml → lunr_search.yml} +15 -9
  169. data/lib/starter_web/_data/modules/navigator.yml +2 -2
  170. data/lib/starter_web/_data/modules/navigator_menu.yml +57 -6
  171. data/lib/starter_web/_data/modules/toccer.yml +0 -73
  172. data/lib/starter_web/_data/resources.yml +151 -104
  173. data/lib/starter_web/_includes/attributes.asciidoc +2 -2
  174. data/lib/starter_web/_includes/breadcrumbs.html +11 -0
  175. data/lib/starter_web/_plugins/debug.rb +0 -1
  176. data/lib/starter_web/_plugins/filters.rb +0 -1
  177. data/lib/starter_web/_plugins/{lorem-inline.rb → lorem_inline.rb} +1 -2
  178. data/lib/starter_web/_plugins/lunr_index.rb +313 -0
  179. data/lib/starter_web/_plugins/prettify.rb +0 -3
  180. data/lib/starter_web/_plugins/simple_search_filter.rb +0 -1
  181. data/lib/starter_web/_plugins/symlink_watcher.rb +2 -3
  182. data/lib/starter_web/assets/images/modules/attics/banner/lunr-banner-1280x800.jpg +0 -0
  183. data/lib/starter_web/assets/images/pages/winlogbeat/coordinate-map.png +0 -0
  184. data/lib/starter_web/assets/images/pages/winlogbeat/kibana-powershell.jpg +0 -0
  185. data/lib/starter_web/assets/images/pages/winlogbeat/option_ignore_outgoing.png +0 -0
  186. data/lib/starter_web/assets/images/pages/winlogbeat/winlogbeat-dashboard.png +0 -0
  187. data/lib/starter_web/collections/posts/public/featured/_posts/2018-05-01-confusion-about-base-url.adoc +2 -4
  188. data/lib/starter_web/collections/posts/public/featured/_posts/2019-05-01-top-open-source-static-site-generators.adoc +4 -2
  189. data/lib/starter_web/collections/posts/public/featured/_posts/2019-06-01-about-cookies.adoc +3 -2
  190. data/lib/starter_web/collections/posts/public/series/_posts/2018-11-01-docker-using-shared-folders.adoc +5 -4
  191. data/lib/starter_web/collections/posts/public/series/_posts/2020-01-01-post-test-series.adoc +144 -0
  192. data/lib/starter_web/collections/posts/public/series/_posts/2020-01-02-post-test-series.adoc +146 -0
  193. data/lib/starter_web/collections/posts/public/series/_posts/2020-01-03-post-test-series.adoc +146 -0
  194. data/lib/starter_web/collections/posts/public/series/_posts/2020-01-04-post-test-series.adoc +146 -0
  195. data/lib/starter_web/collections/posts/public/test_posts/_posts/2020-09-11-test_post.adoc +2 -4
  196. data/lib/starter_web/collections/posts/public/wikipedia/_posts/2016-11-20-minneapolis.adoc +2 -3
  197. data/lib/starter_web/collections/posts/public/wikipedia/_posts/2016-11-24-narcisse-snake-dens.adoc +2 -7
  198. data/lib/starter_web/collections/posts/public/wikipedia/_posts/2016-11-26-columbia-river.adoc +2 -6
  199. data/lib/starter_web/index.html +16 -10
  200. data/lib/starter_web/package.json +5 -2
  201. data/lib/starter_web/pages/public/about/about_site.adoc +0 -2
  202. data/lib/starter_web/pages/public/about/become_a_patron.adoc +1 -3
  203. data/lib/starter_web/pages/public/blog/navigator/archive.html +8 -1
  204. data/lib/starter_web/pages/public/blog/navigator/archive/categoryview.html +7 -3
  205. data/lib/starter_web/pages/public/blog/navigator/archive/dateview.html +8 -1
  206. data/lib/starter_web/pages/public/blog/navigator/archive/tagview.html +7 -2
  207. data/lib/starter_web/pages/public/blog/navigator/index.html +6 -2
  208. data/lib/starter_web/pages/public/learn/kickstarter/web_in_a_day/100_meet_and_greet_jekyll.adoc +3 -4
  209. data/lib/starter_web/pages/public/learn/kickstarter/web_in_a_day/200_preparations.adoc +3 -4
  210. data/lib/starter_web/pages/public/learn/kickstarter/web_in_a_day/300_first_awesome_web.adoc +3 -4
  211. data/lib/starter_web/pages/public/learn/roundtrip/100_present_images.adoc +25 -20
  212. data/lib/starter_web/pages/public/learn/roundtrip/100_present_videos.adoc +14 -12
  213. data/lib/starter_web/pages/public/learn/roundtrip/200_typography.adoc +20 -20
  214. data/lib/starter_web/pages/public/learn/roundtrip/300_icon_fonts.adoc +13 -8
  215. data/lib/starter_web/pages/public/learn/roundtrip/400_asciidoc_extensions.adoc +14 -9
  216. data/lib/starter_web/pages/public/learn/roundtrip/410_bs_modals_extentions.adoc +9 -6
  217. data/lib/starter_web/pages/public/learn/roundtrip/420_responsive_tables_extensions.adoc +62 -8
  218. data/lib/starter_web/pages/public/learn/roundtrip/500_themes.adoc +9 -7
  219. data/lib/starter_web/pages/public/learn/roundtrip/600_lunr.adoc +237 -0
  220. data/lib/starter_web/pages/public/learn/roundtrip/610_fam.adoc +302 -0
  221. data/lib/starter_web/pages/public/learn/where_to_go.adoc +3 -7
  222. data/lib/starter_web/pages/public/legal/de/100_impress.adoc +3 -2
  223. data/lib/starter_web/pages/public/legal/de/200_terms_of_use.adoc +2 -1
  224. data/lib/starter_web/pages/public/legal/de/300_privacy.adoc +2 -1
  225. data/lib/starter_web/pages/public/legal/de/400_license_agreement.adoc +2 -1
  226. data/lib/starter_web/pages/public/legal/de/500_support.adoc +2 -1
  227. data/lib/starter_web/pages/public/legal/en/000_copyright.adoc +30 -27
  228. data/lib/starter_web/pages/public/legal/en/100_impress.adoc +8 -5
  229. data/lib/starter_web/pages/public/legal/en/200_terms_of_use.adoc +12 -8
  230. data/lib/starter_web/pages/public/legal/en/300_privacy.adoc +7 -0
  231. data/lib/starter_web/pages/public/legal/en/400_license_agreement.adoc +8 -1
  232. data/lib/starter_web/pages/public/legal/en/500_support.adoc +8 -1
  233. data/lib/starter_web/pages/public/previewer/bootstrap_theme.adoc +3 -1
  234. data/lib/starter_web/pages/public/previewer/iframer.adoc +36 -28
  235. data/lib/starter_web/pages/public/previewer/justified_gallery.html +2 -1
  236. data/lib/starter_web/pages/public/previewer/mdi_icons_preview.adoc +2 -1
  237. data/lib/starter_web/pages/public/previewer/rouge.adoc +4 -2
  238. data/lib/starter_web/pages/public/previewer/twitter_emoji_preview.adoc +2 -1
  239. data/lib/starter_web/pages/public/test_pages/breadcrumbs_tester.adoc +62 -0
  240. data/lib/starter_web/pages/public/test_pages/deck_of_posts.adoc +3 -0
  241. data/lib/starter_web/pages/public/test_pages/floating_actions_button.adoc +523 -0
  242. data/lib/starter_web/pages/public/test_pages/floating_ad.adoc +1 -0
  243. data/lib/starter_web/pages/public/test_pages/floating_div.adoc +1 -0
  244. data/lib/starter_web/pages/public/test_pages/lunr_tester.adoc +89 -0
  245. data/lib/starter_web/pages/public/test_pages/nav_pagination_tester.adoc +1 -0
  246. data/lib/starter_web/pages/public/test_pages/page_attribute_tester.adoc +1 -0
  247. data/lib/starter_web/pages/public/test_pages/responsive_images.adoc +3 -2
  248. data/lib/starter_web/pages/public/test_pages/responsive_tables.adoc +1 -0
  249. data/lib/starter_web/pages/public/test_pages/toccer_tester.adoc +2245 -0
  250. data/lib/starter_web/utilsrv/_defaults/package.json +1 -1
  251. data/lib/starter_web/utilsrv/package.json +1 -1
  252. metadata +137 -29
  253. data/assets/data/search.json +0 -165
  254. data/assets/data/ssm.html +0 -242
  255. data/assets/themes/j1/adapter/js/back2top.js +0 -231
  256. data/assets/themes/j1/modules/jekyllSearch/js/simple-jekyll-search.js +0 -468
  257. data/assets/themes/j1/modules/jekyllSearch/js/simple-jekyll-search.min.js +0 -6
  258. data/assets/themes/j1/modules/tocbot/css/theme/uno.css +0 -95
  259. data/assets/themes/j1/modules/tocbot/css/theme/uno.min.css +0 -15
  260. data/assets/themes/j1/modules/tocbot/css/tocbot.css +0 -75
  261. data/assets/themes/j1/modules/tocbot/css/tocbot.min.css +0 -19
  262. data/assets/themes/j1/modules/tocbot/js/tocbot.js +0 -19
  263. data/assets/themes/j1/modules/tocbot/js/tocbot.min.js +0 -19
  264. data/lib/starter_web/_data/modules/defaults/back2top.yml +0 -146
  265. data/lib/starter_web/_data/modules/defaults/stickybits.yml +0 -36
  266. data/lib/starter_web/_data/modules/ssm.yml +0 -142
@@ -0,0 +1,580 @@
1
+ (function($, anim) {
2
+ 'use strict';
3
+
4
+ let _defaults = {
5
+ edge: 'left',
6
+ draggable: true,
7
+ inDuration: 250,
8
+ outDuration: 200,
9
+ onOpenStart: null,
10
+ onOpenEnd: null,
11
+ onCloseStart: null,
12
+ onCloseEnd: null,
13
+ preventScrolling: true
14
+ };
15
+
16
+ /**
17
+ * @class
18
+ */
19
+ class Sidenav extends Component {
20
+ /**
21
+ * Construct Sidenav instance and set up overlay
22
+ * @constructor
23
+ * @param {Element} el
24
+ * @param {Object} options
25
+ */
26
+ constructor(el, options) {
27
+ super(Sidenav, el, options);
28
+
29
+ this.el.M_Sidenav = this;
30
+ this.id = this.$el.attr('id');
31
+
32
+ /**
33
+ * Options for the Sidenav
34
+ * @member Sidenav#options
35
+ * @prop {String} [edge='left'] - Side of screen on which Sidenav appears
36
+ * @prop {Boolean} [draggable=true] - Allow swipe gestures to open/close Sidenav
37
+ * @prop {Number} [inDuration=250] - Length in ms of enter transition
38
+ * @prop {Number} [outDuration=200] - Length in ms of exit transition
39
+ * @prop {Function} onOpenStart - Function called when sidenav starts entering
40
+ * @prop {Function} onOpenEnd - Function called when sidenav finishes entering
41
+ * @prop {Function} onCloseStart - Function called when sidenav starts exiting
42
+ * @prop {Function} onCloseEnd - Function called when sidenav finishes exiting
43
+ */
44
+ this.options = $.extend({}, Sidenav.defaults, options);
45
+
46
+ /**
47
+ * Describes open/close state of Sidenav
48
+ * @type {Boolean}
49
+ */
50
+ this.isOpen = false;
51
+
52
+ /**
53
+ * Describes if Sidenav is fixed
54
+ * @type {Boolean}
55
+ */
56
+ this.isFixed = this.el.classList.contains('sidenav-fixed');
57
+
58
+ /**
59
+ * Describes if Sidenav is being draggeed
60
+ * @type {Boolean}
61
+ */
62
+ this.isDragged = false;
63
+
64
+ // Window size variables for window resize checks
65
+ this.lastWindowWidth = window.innerWidth;
66
+ this.lastWindowHeight = window.innerHeight;
67
+
68
+ this._createOverlay();
69
+ this._createDragTarget();
70
+ this._setupEventHandlers();
71
+ this._setupClasses();
72
+ this._setupFixed();
73
+
74
+ Sidenav._sidenavs.push(this);
75
+ }
76
+
77
+ static get defaults() {
78
+ return _defaults;
79
+ }
80
+
81
+ static init(els, options) {
82
+ return super.init(this, els, options);
83
+ }
84
+
85
+ /**
86
+ * Get Instance
87
+ */
88
+ static getInstance(el) {
89
+ let domElem = !!el.jquery ? el[0] : el;
90
+ return domElem.M_Sidenav;
91
+ }
92
+
93
+ /**
94
+ * Teardown component
95
+ */
96
+ destroy() {
97
+ this._removeEventHandlers();
98
+ this._enableBodyScrolling();
99
+ this._overlay.parentNode.removeChild(this._overlay);
100
+ this.dragTarget.parentNode.removeChild(this.dragTarget);
101
+ this.el.M_Sidenav = undefined;
102
+ this.el.style.transform = '';
103
+
104
+ let index = Sidenav._sidenavs.indexOf(this);
105
+ if (index >= 0) {
106
+ Sidenav._sidenavs.splice(index, 1);
107
+ }
108
+ }
109
+
110
+ _createOverlay() {
111
+ let overlay = document.createElement('div');
112
+ this._closeBound = this.close.bind(this);
113
+ overlay.classList.add('sidenav-overlay');
114
+
115
+ overlay.addEventListener('click', this._closeBound);
116
+
117
+ document.body.appendChild(overlay);
118
+ this._overlay = overlay;
119
+ }
120
+
121
+ _setupEventHandlers() {
122
+ if (Sidenav._sidenavs.length === 0) {
123
+ document.body.addEventListener('click', this._handleTriggerClick);
124
+ }
125
+
126
+ this._handleDragTargetDragBound = this._handleDragTargetDrag.bind(this);
127
+ this._handleDragTargetReleaseBound = this._handleDragTargetRelease.bind(this);
128
+ this._handleCloseDragBound = this._handleCloseDrag.bind(this);
129
+ this._handleCloseReleaseBound = this._handleCloseRelease.bind(this);
130
+ this._handleCloseTriggerClickBound = this._handleCloseTriggerClick.bind(this);
131
+
132
+ this.dragTarget.addEventListener('touchmove', this._handleDragTargetDragBound);
133
+ this.dragTarget.addEventListener('touchend', this._handleDragTargetReleaseBound);
134
+ this._overlay.addEventListener('touchmove', this._handleCloseDragBound);
135
+ this._overlay.addEventListener('touchend', this._handleCloseReleaseBound);
136
+ this.el.addEventListener('touchmove', this._handleCloseDragBound);
137
+ this.el.addEventListener('touchend', this._handleCloseReleaseBound);
138
+ this.el.addEventListener('click', this._handleCloseTriggerClickBound);
139
+
140
+ // Add resize for side nav fixed
141
+ if (this.isFixed) {
142
+ this._handleWindowResizeBound = this._handleWindowResize.bind(this);
143
+ window.addEventListener('resize', this._handleWindowResizeBound);
144
+ }
145
+ }
146
+
147
+ _removeEventHandlers() {
148
+ if (Sidenav._sidenavs.length === 1) {
149
+ document.body.removeEventListener('click', this._handleTriggerClick);
150
+ }
151
+
152
+ this.dragTarget.removeEventListener('touchmove', this._handleDragTargetDragBound);
153
+ this.dragTarget.removeEventListener('touchend', this._handleDragTargetReleaseBound);
154
+ this._overlay.removeEventListener('touchmove', this._handleCloseDragBound);
155
+ this._overlay.removeEventListener('touchend', this._handleCloseReleaseBound);
156
+ this.el.removeEventListener('touchmove', this._handleCloseDragBound);
157
+ this.el.removeEventListener('touchend', this._handleCloseReleaseBound);
158
+ this.el.removeEventListener('click', this._handleCloseTriggerClickBound);
159
+
160
+ // Remove resize for side nav fixed
161
+ if (this.isFixed) {
162
+ window.removeEventListener('resize', this._handleWindowResizeBound);
163
+ }
164
+ }
165
+
166
+ /**
167
+ * Handle Trigger Click
168
+ * @param {Event} e
169
+ */
170
+ _handleTriggerClick(e) {
171
+ let $trigger = $(e.target).closest('.sidenav-trigger');
172
+ if (e.target && $trigger.length) {
173
+ let sidenavId = M.getIdFromTrigger($trigger[0]);
174
+
175
+ let sidenavInstance = document.getElementById(sidenavId).M_Sidenav;
176
+ if (sidenavInstance) {
177
+ sidenavInstance.open($trigger);
178
+ }
179
+ e.preventDefault();
180
+ }
181
+ }
182
+
183
+ /**
184
+ * Set variables needed at the beggining of drag
185
+ * and stop any current transition.
186
+ * @param {Event} e
187
+ */
188
+ _startDrag(e) {
189
+ let clientX = e.targetTouches[0].clientX;
190
+ this.isDragged = true;
191
+ this._startingXpos = clientX;
192
+ this._xPos = this._startingXpos;
193
+ this._time = Date.now();
194
+ this._width = this.el.getBoundingClientRect().width;
195
+ this._overlay.style.display = 'block';
196
+ this._initialScrollTop = this.isOpen ? this.el.scrollTop : M.getDocumentScrollTop();
197
+ this._verticallyScrolling = false;
198
+ anim.remove(this.el);
199
+ anim.remove(this._overlay);
200
+ }
201
+
202
+ /**
203
+ * Set variables needed at each drag move update tick
204
+ * @param {Event} e
205
+ */
206
+ _dragMoveUpdate(e) {
207
+ let clientX = e.targetTouches[0].clientX;
208
+ let currentScrollTop = this.isOpen ? this.el.scrollTop : M.getDocumentScrollTop();
209
+ this.deltaX = Math.abs(this._xPos - clientX);
210
+ this._xPos = clientX;
211
+ this.velocityX = this.deltaX / (Date.now() - this._time);
212
+ this._time = Date.now();
213
+ if (this._initialScrollTop !== currentScrollTop) {
214
+ this._verticallyScrolling = true;
215
+ }
216
+ }
217
+
218
+ /**
219
+ * Handles Dragging of Sidenav
220
+ * @param {Event} e
221
+ */
222
+ _handleDragTargetDrag(e) {
223
+ // Check if draggable
224
+ if (!this.options.draggable || this._isCurrentlyFixed() || this._verticallyScrolling) {
225
+ return;
226
+ }
227
+
228
+ // If not being dragged, set initial drag start variables
229
+ if (!this.isDragged) {
230
+ this._startDrag(e);
231
+ }
232
+
233
+ // Run touchmove updates
234
+ this._dragMoveUpdate(e);
235
+
236
+ // Calculate raw deltaX
237
+ let totalDeltaX = this._xPos - this._startingXpos;
238
+
239
+ // dragDirection is the attempted user drag direction
240
+ let dragDirection = totalDeltaX > 0 ? 'right' : 'left';
241
+
242
+ // Don't allow totalDeltaX to exceed Sidenav width or be dragged in the opposite direction
243
+ totalDeltaX = Math.min(this._width, Math.abs(totalDeltaX));
244
+ if (this.options.edge === dragDirection) {
245
+ totalDeltaX = 0;
246
+ }
247
+
248
+ /**
249
+ * transformX is the drag displacement
250
+ * transformPrefix is the initial transform placement
251
+ * Invert values if Sidenav is right edge
252
+ */
253
+ let transformX = totalDeltaX;
254
+ let transformPrefix = 'translateX(-100%)';
255
+ if (this.options.edge === 'right') {
256
+ transformPrefix = 'translateX(100%)';
257
+ transformX = -transformX;
258
+ }
259
+
260
+ // Calculate open/close percentage of sidenav, with open = 1 and close = 0
261
+ this.percentOpen = Math.min(1, totalDeltaX / this._width);
262
+
263
+ // Set transform and opacity styles
264
+ this.el.style.transform = `${transformPrefix} translateX(${transformX}px)`;
265
+ this._overlay.style.opacity = this.percentOpen;
266
+ }
267
+
268
+ /**
269
+ * Handle Drag Target Release
270
+ */
271
+ _handleDragTargetRelease() {
272
+ if (this.isDragged) {
273
+ if (this.percentOpen > 0.2) {
274
+ this.open();
275
+ } else {
276
+ this._animateOut();
277
+ }
278
+
279
+ this.isDragged = false;
280
+ this._verticallyScrolling = false;
281
+ }
282
+ }
283
+
284
+ /**
285
+ * Handle Close Drag
286
+ * @param {Event} e
287
+ */
288
+ _handleCloseDrag(e) {
289
+ if (this.isOpen) {
290
+ // Check if draggable
291
+ if (!this.options.draggable || this._isCurrentlyFixed() || this._verticallyScrolling) {
292
+ return;
293
+ }
294
+
295
+ // If not being dragged, set initial drag start variables
296
+ if (!this.isDragged) {
297
+ this._startDrag(e);
298
+ }
299
+
300
+ // Run touchmove updates
301
+ this._dragMoveUpdate(e);
302
+
303
+ // Calculate raw deltaX
304
+ let totalDeltaX = this._xPos - this._startingXpos;
305
+
306
+ // dragDirection is the attempted user drag direction
307
+ let dragDirection = totalDeltaX > 0 ? 'right' : 'left';
308
+
309
+ // Don't allow totalDeltaX to exceed Sidenav width or be dragged in the opposite direction
310
+ totalDeltaX = Math.min(this._width, Math.abs(totalDeltaX));
311
+ if (this.options.edge !== dragDirection) {
312
+ totalDeltaX = 0;
313
+ }
314
+
315
+ let transformX = -totalDeltaX;
316
+ if (this.options.edge === 'right') {
317
+ transformX = -transformX;
318
+ }
319
+
320
+ // Calculate open/close percentage of sidenav, with open = 1 and close = 0
321
+ this.percentOpen = Math.min(1, 1 - totalDeltaX / this._width);
322
+
323
+ // Set transform and opacity styles
324
+ this.el.style.transform = `translateX(${transformX}px)`;
325
+ this._overlay.style.opacity = this.percentOpen;
326
+ }
327
+ }
328
+
329
+ /**
330
+ * Handle Close Release
331
+ */
332
+ _handleCloseRelease() {
333
+ if (this.isOpen && this.isDragged) {
334
+ if (this.percentOpen > 0.8) {
335
+ this._animateIn();
336
+ } else {
337
+ this.close();
338
+ }
339
+
340
+ this.isDragged = false;
341
+ this._verticallyScrolling = false;
342
+ }
343
+ }
344
+
345
+ /**
346
+ * Handles closing of Sidenav when element with class .sidenav-close
347
+ */
348
+ _handleCloseTriggerClick(e) {
349
+ let $closeTrigger = $(e.target).closest('.sidenav-close');
350
+ if ($closeTrigger.length && !this._isCurrentlyFixed()) {
351
+ this.close();
352
+ }
353
+ }
354
+
355
+ /**
356
+ * Handle Window Resize
357
+ */
358
+ _handleWindowResize() {
359
+ // Only handle horizontal resizes
360
+ if (this.lastWindowWidth !== window.innerWidth) {
361
+ if (window.innerWidth > 992) {
362
+ this.open();
363
+ } else {
364
+ this.close();
365
+ }
366
+ }
367
+
368
+ this.lastWindowWidth = window.innerWidth;
369
+ this.lastWindowHeight = window.innerHeight;
370
+ }
371
+
372
+ _setupClasses() {
373
+ if (this.options.edge === 'right') {
374
+ this.el.classList.add('right-aligned');
375
+ this.dragTarget.classList.add('right-aligned');
376
+ }
377
+ }
378
+
379
+ _removeClasses() {
380
+ this.el.classList.remove('right-aligned');
381
+ this.dragTarget.classList.remove('right-aligned');
382
+ }
383
+
384
+ _setupFixed() {
385
+ if (this._isCurrentlyFixed()) {
386
+ this.open();
387
+ }
388
+ }
389
+
390
+ _isCurrentlyFixed() {
391
+ return this.isFixed && window.innerWidth > 992;
392
+ }
393
+
394
+ _createDragTarget() {
395
+ let dragTarget = document.createElement('div');
396
+ dragTarget.classList.add('drag-target');
397
+ document.body.appendChild(dragTarget);
398
+ this.dragTarget = dragTarget;
399
+ }
400
+
401
+ _preventBodyScrolling() {
402
+ let body = document.body;
403
+ body.style.overflow = 'hidden';
404
+ }
405
+
406
+ _enableBodyScrolling() {
407
+ let body = document.body;
408
+ body.style.overflow = '';
409
+ }
410
+
411
+ open() {
412
+ if (this.isOpen === true) {
413
+ return;
414
+ }
415
+
416
+ this.isOpen = true;
417
+
418
+ // Run onOpenStart callback
419
+ if (typeof this.options.onOpenStart === 'function') {
420
+ this.options.onOpenStart.call(this, this.el);
421
+ }
422
+
423
+ // Handle fixed Sidenav
424
+ if (this._isCurrentlyFixed()) {
425
+ anim.remove(this.el);
426
+ anim({
427
+ targets: this.el,
428
+ translateX: 0,
429
+ duration: 0,
430
+ easing: 'easeOutQuad'
431
+ });
432
+ this._enableBodyScrolling();
433
+ this._overlay.style.display = 'none';
434
+
435
+ // Handle non-fixed Sidenav
436
+ } else {
437
+ if (this.options.preventScrolling) {
438
+ this._preventBodyScrolling();
439
+ }
440
+
441
+ if (!this.isDragged || this.percentOpen != 1) {
442
+ this._animateIn();
443
+ }
444
+ }
445
+ }
446
+
447
+ close() {
448
+ if (this.isOpen === false) {
449
+ return;
450
+ }
451
+
452
+ this.isOpen = false;
453
+
454
+ // Run onCloseStart callback
455
+ if (typeof this.options.onCloseStart === 'function') {
456
+ this.options.onCloseStart.call(this, this.el);
457
+ }
458
+
459
+ // Handle fixed Sidenav
460
+ if (this._isCurrentlyFixed()) {
461
+ let transformX = this.options.edge === 'left' ? '-105%' : '105%';
462
+ this.el.style.transform = `translateX(${transformX})`;
463
+
464
+ // Handle non-fixed Sidenav
465
+ } else {
466
+ this._enableBodyScrolling();
467
+
468
+ if (!this.isDragged || this.percentOpen != 0) {
469
+ this._animateOut();
470
+ } else {
471
+ this._overlay.style.display = 'none';
472
+ }
473
+ }
474
+ }
475
+
476
+ _animateIn() {
477
+ this._animateSidenavIn();
478
+ this._animateOverlayIn();
479
+ }
480
+
481
+ _animateSidenavIn() {
482
+ let slideOutPercent = this.options.edge === 'left' ? -1 : 1;
483
+ if (this.isDragged) {
484
+ slideOutPercent =
485
+ this.options.edge === 'left'
486
+ ? slideOutPercent + this.percentOpen
487
+ : slideOutPercent - this.percentOpen;
488
+ }
489
+
490
+ anim.remove(this.el);
491
+ anim({
492
+ targets: this.el,
493
+ translateX: [`${slideOutPercent * 100}%`, 0],
494
+ duration: this.options.inDuration,
495
+ easing: 'easeOutQuad',
496
+ complete: () => {
497
+ // Run onOpenEnd callback
498
+ if (typeof this.options.onOpenEnd === 'function') {
499
+ this.options.onOpenEnd.call(this, this.el);
500
+ }
501
+ }
502
+ });
503
+ }
504
+
505
+ _animateOverlayIn() {
506
+ let start = 0;
507
+ if (this.isDragged) {
508
+ start = this.percentOpen;
509
+ } else {
510
+ $(this._overlay).css({
511
+ display: 'block'
512
+ });
513
+ }
514
+
515
+ anim.remove(this._overlay);
516
+ anim({
517
+ targets: this._overlay,
518
+ opacity: [start, 1],
519
+ duration: this.options.inDuration,
520
+ easing: 'easeOutQuad'
521
+ });
522
+ }
523
+
524
+ _animateOut() {
525
+ this._animateSidenavOut();
526
+ this._animateOverlayOut();
527
+ }
528
+
529
+ _animateSidenavOut() {
530
+ let endPercent = this.options.edge === 'left' ? -1 : 1;
531
+ let slideOutPercent = 0;
532
+ if (this.isDragged) {
533
+ slideOutPercent =
534
+ this.options.edge === 'left'
535
+ ? endPercent + this.percentOpen
536
+ : endPercent - this.percentOpen;
537
+ }
538
+
539
+ anim.remove(this.el);
540
+ anim({
541
+ targets: this.el,
542
+ translateX: [`${slideOutPercent * 100}%`, `${endPercent * 105}%`],
543
+ duration: this.options.outDuration,
544
+ easing: 'easeOutQuad',
545
+ complete: () => {
546
+ // Run onOpenEnd callback
547
+ if (typeof this.options.onCloseEnd === 'function') {
548
+ this.options.onCloseEnd.call(this, this.el);
549
+ }
550
+ }
551
+ });
552
+ }
553
+
554
+ _animateOverlayOut() {
555
+ anim.remove(this._overlay);
556
+ anim({
557
+ targets: this._overlay,
558
+ opacity: 0,
559
+ duration: this.options.outDuration,
560
+ easing: 'easeOutQuad',
561
+ complete: () => {
562
+ $(this._overlay).css('display', 'none');
563
+ }
564
+ });
565
+ }
566
+ }
567
+
568
+ /**
569
+ * @static
570
+ * @memberof Sidenav
571
+ * @type {Array.<Sidenav>}
572
+ */
573
+ Sidenav._sidenavs = [];
574
+
575
+ M.Sidenav = Sidenav;
576
+
577
+ if (M.jQueryLoaded) {
578
+ M.initializeJqueryWrapper(Sidenav, 'sidenav', 'M_Sidenav');
579
+ }
580
+ })(cash, M.anime);