integral 1.0.1 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (637) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +11 -49
  3. data/Rakefile +1 -1
  4. data/app/assets/images/integral/defaults/no_image_available.jpg +0 -0
  5. data/app/assets/images/logo.png +0 -0
  6. data/app/assets/javascripts/ckeditor/my_config.js.erb +26 -18
  7. data/app/assets/javascripts/ckeditor/plugins/autoembed/lang/lv.js +8 -0
  8. data/app/assets/javascripts/ckeditor/plugins/autoembed/plugin.js +1 -1
  9. data/app/assets/javascripts/ckeditor/plugins/autogrow/plugin.js +14 -14
  10. data/app/assets/javascripts/ckeditor/plugins/autogrow/samples/autogrow.html +8 -8
  11. data/app/assets/javascripts/ckeditor/plugins/codemirror/css/codemirror.min.css +1 -1
  12. data/app/assets/javascripts/ckeditor/plugins/codemirror/icons/autoformat.png +0 -0
  13. data/app/assets/javascripts/ckeditor/plugins/codemirror/icons/searchcode.png +0 -0
  14. data/app/assets/javascripts/ckeditor/plugins/codemirror/icons/uncommentselectedrange.png +0 -0
  15. data/app/assets/javascripts/ckeditor/plugins/codemirror/images/autocomplete.png +0 -0
  16. data/app/assets/javascripts/ckeditor/plugins/codemirror/images/autoformat.png +0 -0
  17. data/app/assets/javascripts/ckeditor/plugins/codemirror/images/commentselectedrange.png +0 -0
  18. data/app/assets/javascripts/ckeditor/plugins/codemirror/images/searchcode.png +0 -0
  19. data/app/assets/javascripts/ckeditor/plugins/codemirror/images/uncommentselectedrange.png +0 -0
  20. data/app/assets/javascripts/ckeditor/plugins/codemirror/js/beautify.min.js +2 -2
  21. data/app/assets/javascripts/ckeditor/plugins/codemirror/js/codemirror.addons.min.js +2 -2
  22. data/app/assets/javascripts/ckeditor/plugins/codemirror/js/codemirror.addons.search.min.js +1 -1
  23. data/app/assets/javascripts/ckeditor/plugins/codemirror/js/codemirror.min.js +1 -6
  24. data/app/assets/javascripts/ckeditor/plugins/codemirror/js/codemirror.mode.bbcodemixed.min.js +1 -1
  25. data/app/assets/javascripts/ckeditor/plugins/codemirror/js/codemirror.mode.handlebars.min.js +1 -0
  26. data/app/assets/javascripts/ckeditor/plugins/codemirror/js/codemirror.mode.htmlmixed.min.js +2 -2
  27. data/app/assets/javascripts/ckeditor/plugins/codemirror/js/codemirror.mode.javascript.min.js +1 -1
  28. data/app/assets/javascripts/ckeditor/plugins/codemirror/js/codemirror.mode.php.min.js +3 -3
  29. data/app/assets/javascripts/ckeditor/plugins/codemirror/js/codemirror.mode.twig.min.js +1 -1
  30. data/app/assets/javascripts/ckeditor/plugins/codemirror/lang/bg.js +7 -7
  31. data/app/assets/javascripts/ckeditor/plugins/codemirror/plugin.js +231 -217
  32. data/app/assets/javascripts/ckeditor/plugins/codemirror/theme/darcula.css +46 -0
  33. data/app/assets/javascripts/ckeditor/plugins/codemirror/theme/gruvbox-dark.css +34 -0
  34. data/app/assets/javascripts/ckeditor/plugins/codemirror/theme/idea.css +42 -0
  35. data/app/assets/javascripts/ckeditor/plugins/codemirror/theme/lesser-dark.css +1 -1
  36. data/app/assets/javascripts/ckeditor/plugins/codemirror/theme/lucario.css +37 -0
  37. data/app/assets/javascripts/ckeditor/plugins/codemirror/theme/monokai.css +5 -0
  38. data/app/assets/javascripts/ckeditor/plugins/codemirror/theme/oceanic-next.css +44 -0
  39. data/app/assets/javascripts/ckeditor/plugins/codemirror/theme/shadowfox.css +52 -0
  40. data/app/assets/javascripts/ckeditor/plugins/codemirror/theme/ssms.css +16 -0
  41. data/app/assets/javascripts/ckeditor/plugins/embedbase/lang/ar.js +15 -0
  42. data/app/assets/javascripts/ckeditor/plugins/embedbase/lang/lv.js +15 -0
  43. data/app/assets/javascripts/ckeditor/plugins/embedbase/plugin.js +1 -1
  44. data/app/assets/javascripts/ckeditor/plugins/foundation-callout/icons/copywidget.png +0 -0
  45. data/app/assets/javascripts/ckeditor/plugins/foundation-callout/icons/editwidget.png +0 -0
  46. data/app/assets/javascripts/ckeditor/plugins/foundation-callout/icons/hidpi/copywidget.png +0 -0
  47. data/app/assets/javascripts/ckeditor/plugins/foundation-callout/icons/hidpi/editwidget.png +0 -0
  48. data/app/assets/javascripts/ckeditor/plugins/foundation-callout/icons/hidpi/removewidget.png +0 -0
  49. data/app/assets/javascripts/ckeditor/plugins/foundation-callout/icons/hidpi/widget.png +0 -0
  50. data/app/assets/javascripts/ckeditor/plugins/foundation-callout/icons/removewidget.png +0 -0
  51. data/app/assets/javascripts/ckeditor/plugins/foundation-callout/icons/widget.png +0 -0
  52. data/app/assets/javascripts/ckeditor/plugins/foundation-callout/plugin.js +86 -0
  53. data/app/assets/javascripts/ckeditor/plugins/image2/dev/assets/image1.jpg +0 -0
  54. data/app/assets/javascripts/ckeditor/plugins/image2/dev/assets/image2.jpg +0 -0
  55. data/app/assets/javascripts/ckeditor/plugins/image2/dev/contents.css +35 -0
  56. data/app/assets/javascripts/ckeditor/plugins/image2/dev/image2.html +339 -0
  57. data/app/assets/javascripts/ckeditor/plugins/image2/dialogs/image2.js +553 -0
  58. data/app/assets/javascripts/ckeditor/plugins/image2/icons/hidpi/image.png +0 -0
  59. data/app/assets/javascripts/ckeditor/plugins/image2/icons/image.png +0 -0
  60. data/app/assets/javascripts/ckeditor/plugins/image2/lang/af.js +21 -0
  61. data/app/assets/javascripts/ckeditor/plugins/image2/lang/ar.js +21 -0
  62. data/app/assets/javascripts/ckeditor/plugins/image2/lang/az.js +21 -0
  63. data/app/assets/javascripts/ckeditor/plugins/image2/lang/bg.js +21 -0
  64. data/app/assets/javascripts/ckeditor/plugins/image2/lang/bn.js +21 -0
  65. data/app/assets/javascripts/ckeditor/plugins/image2/lang/bs.js +21 -0
  66. data/app/assets/javascripts/ckeditor/plugins/image2/lang/ca.js +21 -0
  67. data/app/assets/javascripts/ckeditor/plugins/image2/lang/cs.js +21 -0
  68. data/app/assets/javascripts/ckeditor/plugins/image2/lang/cy.js +21 -0
  69. data/app/assets/javascripts/ckeditor/plugins/image2/lang/da.js +21 -0
  70. data/app/assets/javascripts/ckeditor/plugins/image2/lang/de-ch.js +21 -0
  71. data/app/assets/javascripts/ckeditor/plugins/image2/lang/de.js +21 -0
  72. data/app/assets/javascripts/ckeditor/plugins/image2/lang/el.js +21 -0
  73. data/app/assets/javascripts/ckeditor/plugins/image2/lang/en-au.js +21 -0
  74. data/app/assets/javascripts/ckeditor/plugins/image2/lang/en-ca.js +21 -0
  75. data/app/assets/javascripts/ckeditor/plugins/image2/lang/en-gb.js +21 -0
  76. data/app/assets/javascripts/ckeditor/plugins/image2/lang/en.js +21 -0
  77. data/app/assets/javascripts/ckeditor/plugins/image2/lang/eo.js +21 -0
  78. data/app/assets/javascripts/ckeditor/plugins/image2/lang/es-mx.js +21 -0
  79. data/app/assets/javascripts/ckeditor/plugins/image2/lang/es.js +21 -0
  80. data/app/assets/javascripts/ckeditor/plugins/image2/lang/et.js +21 -0
  81. data/app/assets/javascripts/ckeditor/plugins/image2/lang/eu.js +21 -0
  82. data/app/assets/javascripts/ckeditor/plugins/image2/lang/fa.js +21 -0
  83. data/app/assets/javascripts/ckeditor/plugins/image2/lang/fi.js +21 -0
  84. data/app/assets/javascripts/ckeditor/plugins/image2/lang/fo.js +21 -0
  85. data/app/assets/javascripts/ckeditor/plugins/image2/lang/fr-ca.js +21 -0
  86. data/app/assets/javascripts/ckeditor/plugins/image2/lang/fr.js +21 -0
  87. data/app/assets/javascripts/ckeditor/plugins/image2/lang/gl.js +21 -0
  88. data/app/assets/javascripts/ckeditor/plugins/image2/lang/gu.js +21 -0
  89. data/app/assets/javascripts/ckeditor/plugins/image2/lang/he.js +21 -0
  90. data/app/assets/javascripts/ckeditor/plugins/image2/lang/hi.js +21 -0
  91. data/app/assets/javascripts/ckeditor/plugins/image2/lang/hr.js +21 -0
  92. data/app/assets/javascripts/ckeditor/plugins/image2/lang/hu.js +21 -0
  93. data/app/assets/javascripts/ckeditor/plugins/image2/lang/id.js +21 -0
  94. data/app/assets/javascripts/ckeditor/plugins/image2/lang/is.js +21 -0
  95. data/app/assets/javascripts/ckeditor/plugins/image2/lang/it.js +21 -0
  96. data/app/assets/javascripts/ckeditor/plugins/image2/lang/ja.js +21 -0
  97. data/app/assets/javascripts/ckeditor/plugins/image2/lang/ka.js +21 -0
  98. data/app/assets/javascripts/ckeditor/plugins/image2/lang/km.js +21 -0
  99. data/app/assets/javascripts/ckeditor/plugins/image2/lang/ko.js +21 -0
  100. data/app/assets/javascripts/ckeditor/plugins/image2/lang/ku.js +21 -0
  101. data/app/assets/javascripts/ckeditor/plugins/image2/lang/lt.js +21 -0
  102. data/app/assets/javascripts/ckeditor/plugins/image2/lang/lv.js +21 -0
  103. data/app/assets/javascripts/ckeditor/plugins/image2/lang/mk.js +21 -0
  104. data/app/assets/javascripts/ckeditor/plugins/image2/lang/mn.js +21 -0
  105. data/app/assets/javascripts/ckeditor/plugins/image2/lang/ms.js +21 -0
  106. data/app/assets/javascripts/ckeditor/plugins/image2/lang/nb.js +21 -0
  107. data/app/assets/javascripts/ckeditor/plugins/image2/lang/nl.js +21 -0
  108. data/app/assets/javascripts/ckeditor/plugins/image2/lang/no.js +21 -0
  109. data/app/assets/javascripts/ckeditor/plugins/image2/lang/oc.js +21 -0
  110. data/app/assets/javascripts/ckeditor/plugins/image2/lang/pl.js +21 -0
  111. data/app/assets/javascripts/ckeditor/plugins/image2/lang/pt-br.js +21 -0
  112. data/app/assets/javascripts/ckeditor/plugins/image2/lang/pt.js +21 -0
  113. data/app/assets/javascripts/ckeditor/plugins/image2/lang/ro.js +21 -0
  114. data/app/assets/javascripts/ckeditor/plugins/image2/lang/ru.js +21 -0
  115. data/app/assets/javascripts/ckeditor/plugins/image2/lang/si.js +21 -0
  116. data/app/assets/javascripts/ckeditor/plugins/image2/lang/sk.js +21 -0
  117. data/app/assets/javascripts/ckeditor/plugins/image2/lang/sl.js +21 -0
  118. data/app/assets/javascripts/ckeditor/plugins/image2/lang/sq.js +21 -0
  119. data/app/assets/javascripts/ckeditor/plugins/image2/lang/sr-latn.js +21 -0
  120. data/app/assets/javascripts/ckeditor/plugins/image2/lang/sr.js +21 -0
  121. data/app/assets/javascripts/ckeditor/plugins/image2/lang/sv.js +21 -0
  122. data/app/assets/javascripts/ckeditor/plugins/image2/lang/th.js +21 -0
  123. data/app/assets/javascripts/ckeditor/plugins/image2/lang/tr.js +21 -0
  124. data/app/assets/javascripts/ckeditor/plugins/image2/lang/tt.js +21 -0
  125. data/app/assets/javascripts/ckeditor/plugins/image2/lang/ug.js +21 -0
  126. data/app/assets/javascripts/ckeditor/plugins/image2/lang/uk.js +21 -0
  127. data/app/assets/javascripts/ckeditor/plugins/image2/lang/vi.js +21 -0
  128. data/app/assets/javascripts/ckeditor/plugins/image2/lang/zh-cn.js +21 -0
  129. data/app/assets/javascripts/ckeditor/plugins/image2/lang/zh.js +21 -0
  130. data/app/assets/javascripts/ckeditor/plugins/image2/plugin.js +1720 -0
  131. data/app/assets/javascripts/ckeditor/plugins/image2/samples/assets/image1.jpg +0 -0
  132. data/app/assets/javascripts/ckeditor/plugins/image2/samples/assets/image2.jpg +0 -0
  133. data/app/assets/javascripts/ckeditor/plugins/image2/samples/image2.html +68 -0
  134. data/app/assets/javascripts/ckeditor/plugins/lineutils/dev/dnd.html +4 -4
  135. data/app/assets/javascripts/ckeditor/plugins/lineutils/dev/magicfinger.html +4 -4
  136. data/app/assets/javascripts/ckeditor/plugins/lineutils/plugin.js +7 -7
  137. data/app/assets/javascripts/ckeditor/plugins/linkballoon/README.md +5 -0
  138. data/app/assets/javascripts/ckeditor/plugins/linkballoon/assets/demo.png +0 -0
  139. data/app/assets/javascripts/ckeditor/plugins/linkballoon/plugin.js +25 -0
  140. data/app/assets/javascripts/ckeditor/plugins/notification/lang/az.js +7 -0
  141. data/app/assets/javascripts/ckeditor/plugins/notification/lang/bg.js +7 -0
  142. data/app/assets/javascripts/ckeditor/plugins/notification/lang/ca.js +7 -0
  143. data/app/assets/javascripts/ckeditor/plugins/notification/lang/cs.js +2 -2
  144. data/app/assets/javascripts/ckeditor/plugins/notification/lang/da.js +2 -2
  145. data/app/assets/javascripts/ckeditor/plugins/notification/lang/de-ch.js +2 -2
  146. data/app/assets/javascripts/ckeditor/plugins/notification/lang/de.js +2 -2
  147. data/app/assets/javascripts/ckeditor/plugins/notification/lang/en-au.js +7 -0
  148. data/app/assets/javascripts/ckeditor/plugins/notification/lang/en.js +2 -2
  149. data/app/assets/javascripts/ckeditor/plugins/notification/lang/eo.js +2 -2
  150. data/app/assets/javascripts/ckeditor/plugins/notification/lang/es-mx.js +7 -0
  151. data/app/assets/javascripts/ckeditor/plugins/notification/lang/es.js +7 -0
  152. data/app/assets/javascripts/ckeditor/plugins/notification/lang/et.js +7 -0
  153. data/app/assets/javascripts/ckeditor/plugins/notification/lang/eu.js +2 -2
  154. data/app/assets/javascripts/ckeditor/plugins/notification/lang/fa.js +7 -0
  155. data/app/assets/javascripts/ckeditor/plugins/notification/lang/fr.js +3 -3
  156. data/app/assets/javascripts/ckeditor/plugins/notification/lang/gl.js +2 -2
  157. data/app/assets/javascripts/ckeditor/plugins/notification/lang/hr.js +7 -0
  158. data/app/assets/javascripts/ckeditor/plugins/notification/lang/hu.js +7 -0
  159. data/app/assets/javascripts/ckeditor/plugins/notification/lang/id.js +2 -2
  160. data/app/assets/javascripts/ckeditor/plugins/notification/lang/it.js +2 -2
  161. data/app/assets/javascripts/ckeditor/plugins/notification/lang/ja.js +7 -0
  162. data/app/assets/javascripts/ckeditor/plugins/notification/lang/km.js +2 -2
  163. data/app/assets/javascripts/ckeditor/plugins/notification/lang/ko.js +2 -2
  164. data/app/assets/javascripts/ckeditor/plugins/notification/lang/ku.js +2 -2
  165. data/app/assets/javascripts/ckeditor/plugins/notification/lang/lv.js +7 -0
  166. data/app/assets/javascripts/ckeditor/plugins/notification/lang/nb.js +2 -2
  167. data/app/assets/javascripts/ckeditor/plugins/notification/lang/nl.js +2 -2
  168. data/app/assets/javascripts/ckeditor/plugins/notification/lang/oc.js +7 -0
  169. data/app/assets/javascripts/ckeditor/plugins/notification/lang/pl.js +2 -2
  170. data/app/assets/javascripts/ckeditor/plugins/notification/lang/pt-br.js +2 -2
  171. data/app/assets/javascripts/ckeditor/plugins/notification/lang/pt.js +2 -2
  172. data/app/assets/javascripts/ckeditor/plugins/notification/lang/ro.js +7 -0
  173. data/app/assets/javascripts/ckeditor/plugins/notification/lang/ru.js +2 -2
  174. data/app/assets/javascripts/ckeditor/plugins/notification/lang/sk.js +7 -0
  175. data/app/assets/javascripts/ckeditor/plugins/notification/lang/sq.js +7 -0
  176. data/app/assets/javascripts/ckeditor/plugins/notification/lang/sv.js +2 -2
  177. data/app/assets/javascripts/ckeditor/plugins/notification/lang/tr.js +2 -2
  178. data/app/assets/javascripts/ckeditor/plugins/notification/lang/ug.js +2 -2
  179. data/app/assets/javascripts/ckeditor/plugins/notification/lang/uk.js +2 -2
  180. data/app/assets/javascripts/ckeditor/plugins/notification/lang/zh-cn.js +3 -3
  181. data/app/assets/javascripts/ckeditor/plugins/notification/lang/zh.js +2 -2
  182. data/app/assets/javascripts/ckeditor/plugins/notification/plugin.js +794 -784
  183. data/app/assets/javascripts/ckeditor/plugins/openlink/README.md +50 -0
  184. data/app/assets/javascripts/ckeditor/plugins/openlink/icons/hidpi/openLink.png +0 -0
  185. data/app/assets/javascripts/ckeditor/plugins/openlink/icons/openLink.png +0 -0
  186. data/app/assets/javascripts/ckeditor/plugins/openlink/lang/bg.js +7 -0
  187. data/app/assets/javascripts/ckeditor/plugins/openlink/lang/de.js +7 -0
  188. data/app/assets/javascripts/ckeditor/plugins/openlink/lang/en.js +7 -0
  189. data/app/assets/javascripts/ckeditor/plugins/openlink/lang/pl.js +7 -0
  190. data/app/assets/javascripts/ckeditor/plugins/openlink/lang/ru.js +7 -0
  191. data/app/assets/javascripts/ckeditor/plugins/openlink/lang/uk.js +7 -0
  192. data/app/assets/javascripts/ckeditor/plugins/openlink/plugin.js +178 -0
  193. data/app/assets/javascripts/ckeditor/plugins/placeholder/dev/placeholder.html +5 -5
  194. data/app/assets/javascripts/ckeditor/plugins/placeholder/dialogs/placeholder.js +2 -2
  195. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/af.js +2 -2
  196. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/ar.js +2 -2
  197. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/az.js +2 -2
  198. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/bg.js +5 -5
  199. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/ca.js +2 -2
  200. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/cs.js +2 -2
  201. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/cy.js +2 -2
  202. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/da.js +2 -2
  203. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/de-ch.js +2 -2
  204. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/de.js +2 -2
  205. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/el.js +2 -2
  206. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/en-au.js +12 -0
  207. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/en-gb.js +2 -2
  208. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/en.js +2 -2
  209. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/eo.js +2 -2
  210. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/es-mx.js +2 -2
  211. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/es.js +2 -2
  212. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/et.js +2 -2
  213. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/eu.js +2 -2
  214. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/fa.js +2 -2
  215. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/fi.js +2 -2
  216. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/fr-ca.js +2 -2
  217. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/fr.js +2 -2
  218. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/gl.js +2 -2
  219. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/he.js +2 -2
  220. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/hr.js +2 -2
  221. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/hu.js +2 -2
  222. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/id.js +2 -2
  223. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/it.js +2 -2
  224. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/ja.js +2 -2
  225. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/km.js +2 -2
  226. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/ko.js +2 -2
  227. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/ku.js +2 -2
  228. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/lv.js +5 -5
  229. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/nb.js +2 -2
  230. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/nl.js +2 -2
  231. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/no.js +2 -2
  232. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/oc.js +2 -2
  233. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/pl.js +2 -2
  234. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/pt-br.js +2 -2
  235. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/pt.js +2 -2
  236. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/ro.js +12 -0
  237. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/ru.js +2 -2
  238. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/si.js +2 -2
  239. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/sk.js +2 -2
  240. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/sl.js +2 -2
  241. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/sq.js +2 -2
  242. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/sv.js +2 -2
  243. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/th.js +2 -2
  244. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/tr.js +2 -2
  245. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/tt.js +2 -2
  246. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/ug.js +2 -2
  247. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/uk.js +2 -2
  248. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/vi.js +2 -2
  249. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/zh-cn.js +2 -2
  250. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/zh.js +2 -2
  251. data/app/assets/javascripts/ckeditor/plugins/placeholder/plugin.js +3 -3
  252. data/app/assets/javascripts/ckeditor/plugins/placeholder/samples/placeholder.html +6 -6
  253. data/app/assets/javascripts/ckeditor/plugins/widget/dev/assets/simplebox/dialogs/simplebox.js +4 -4
  254. data/app/assets/javascripts/ckeditor/plugins/widget/dev/assets/simplebox/plugin.js +3 -3
  255. data/app/assets/javascripts/ckeditor/plugins/widget/dev/console.js +2 -2
  256. data/app/assets/javascripts/ckeditor/plugins/widget/dev/nestedwidgets.html +2 -2
  257. data/app/assets/javascripts/ckeditor/plugins/widget/dev/widgetstyles.html +2 -2
  258. data/app/assets/javascripts/ckeditor/plugins/widget/lang/af.js +2 -2
  259. data/app/assets/javascripts/ckeditor/plugins/widget/lang/ar.js +2 -2
  260. data/app/assets/javascripts/ckeditor/plugins/widget/lang/az.js +2 -2
  261. data/app/assets/javascripts/ckeditor/plugins/widget/lang/bg.js +3 -3
  262. data/app/assets/javascripts/ckeditor/plugins/widget/lang/ca.js +2 -2
  263. data/app/assets/javascripts/ckeditor/plugins/widget/lang/cs.js +2 -2
  264. data/app/assets/javascripts/ckeditor/plugins/widget/lang/cy.js +2 -2
  265. data/app/assets/javascripts/ckeditor/plugins/widget/lang/da.js +2 -2
  266. data/app/assets/javascripts/ckeditor/plugins/widget/lang/de-ch.js +2 -2
  267. data/app/assets/javascripts/ckeditor/plugins/widget/lang/de.js +2 -2
  268. data/app/assets/javascripts/ckeditor/plugins/widget/lang/el.js +2 -2
  269. data/app/assets/javascripts/ckeditor/plugins/widget/lang/en-au.js +8 -0
  270. data/app/assets/javascripts/ckeditor/plugins/widget/lang/en-gb.js +2 -2
  271. data/app/assets/javascripts/ckeditor/plugins/widget/lang/en.js +2 -2
  272. data/app/assets/javascripts/ckeditor/plugins/widget/lang/eo.js +2 -2
  273. data/app/assets/javascripts/ckeditor/plugins/widget/lang/es-mx.js +2 -2
  274. data/app/assets/javascripts/ckeditor/plugins/widget/lang/es.js +2 -2
  275. data/app/assets/javascripts/ckeditor/plugins/widget/lang/et.js +8 -0
  276. data/app/assets/javascripts/ckeditor/plugins/widget/lang/eu.js +2 -2
  277. data/app/assets/javascripts/ckeditor/plugins/widget/lang/fa.js +3 -3
  278. data/app/assets/javascripts/ckeditor/plugins/widget/lang/fi.js +2 -2
  279. data/app/assets/javascripts/ckeditor/plugins/widget/lang/fr.js +2 -2
  280. data/app/assets/javascripts/ckeditor/plugins/widget/lang/gl.js +2 -2
  281. data/app/assets/javascripts/ckeditor/plugins/widget/lang/he.js +2 -2
  282. data/app/assets/javascripts/ckeditor/plugins/widget/lang/hr.js +2 -2
  283. data/app/assets/javascripts/ckeditor/plugins/widget/lang/hu.js +2 -2
  284. data/app/assets/javascripts/ckeditor/plugins/widget/lang/id.js +2 -2
  285. data/app/assets/javascripts/ckeditor/plugins/widget/lang/it.js +2 -2
  286. data/app/assets/javascripts/ckeditor/plugins/widget/lang/ja.js +2 -2
  287. data/app/assets/javascripts/ckeditor/plugins/widget/lang/km.js +2 -2
  288. data/app/assets/javascripts/ckeditor/plugins/widget/lang/ko.js +2 -2
  289. data/app/assets/javascripts/ckeditor/plugins/widget/lang/ku.js +2 -2
  290. data/app/assets/javascripts/ckeditor/plugins/widget/lang/lv.js +3 -3
  291. data/app/assets/javascripts/ckeditor/plugins/widget/lang/nb.js +2 -2
  292. data/app/assets/javascripts/ckeditor/plugins/widget/lang/nl.js +2 -2
  293. data/app/assets/javascripts/ckeditor/plugins/widget/lang/no.js +2 -2
  294. data/app/assets/javascripts/ckeditor/plugins/widget/lang/oc.js +2 -2
  295. data/app/assets/javascripts/ckeditor/plugins/widget/lang/pl.js +2 -2
  296. data/app/assets/javascripts/ckeditor/plugins/widget/lang/pt-br.js +2 -2
  297. data/app/assets/javascripts/ckeditor/plugins/widget/lang/pt.js +2 -2
  298. data/app/assets/javascripts/ckeditor/plugins/widget/lang/ro.js +8 -0
  299. data/app/assets/javascripts/ckeditor/plugins/widget/lang/ru.js +2 -2
  300. data/app/assets/javascripts/ckeditor/plugins/widget/lang/sk.js +2 -2
  301. data/app/assets/javascripts/ckeditor/plugins/widget/lang/sl.js +2 -2
  302. data/app/assets/javascripts/ckeditor/plugins/widget/lang/sq.js +3 -3
  303. data/app/assets/javascripts/ckeditor/plugins/widget/lang/sv.js +2 -2
  304. data/app/assets/javascripts/ckeditor/plugins/widget/lang/tr.js +2 -2
  305. data/app/assets/javascripts/ckeditor/plugins/widget/lang/tt.js +2 -2
  306. data/app/assets/javascripts/ckeditor/plugins/widget/lang/ug.js +2 -2
  307. data/app/assets/javascripts/ckeditor/plugins/widget/lang/uk.js +2 -2
  308. data/app/assets/javascripts/ckeditor/plugins/widget/lang/vi.js +2 -2
  309. data/app/assets/javascripts/ckeditor/plugins/widget/lang/zh-cn.js +2 -2
  310. data/app/assets/javascripts/ckeditor/plugins/widget/lang/zh.js +2 -2
  311. data/app/assets/javascripts/ckeditor/plugins/widget/plugin.js +235 -64
  312. data/app/assets/javascripts/ckeditor/plugins/widgetselection/plugin.js +6 -11
  313. data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/ar.js +1 -0
  314. data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/bg.js +17 -0
  315. data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/ca.js +1 -0
  316. data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/cs.js +15 -0
  317. data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/da.js +1 -0
  318. data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/de.js +1 -0
  319. data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/el.js +1 -0
  320. data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/en.js +5 -1
  321. data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/es.js +1 -0
  322. data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/eu.js +17 -0
  323. data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/fa.js +13 -0
  324. data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/fi.js +1 -0
  325. data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/fr.js +1 -0
  326. data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/he.js +1 -0
  327. data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/hr.js +1 -0
  328. data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/hu.js +14 -0
  329. data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/it.js +4 -3
  330. data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/ja.js +5 -5
  331. data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/ko.js +16 -0
  332. data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/nl.js +3 -2
  333. data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/no.js +1 -0
  334. data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/pl.js +4 -3
  335. data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/pt-br.js +1 -0
  336. data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/pt.js +1 -0
  337. data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/ro.js +15 -0
  338. data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/ru.js +2 -1
  339. data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/sk.js +15 -0
  340. data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/sv.js +5 -3
  341. data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/tr.js +1 -0
  342. data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/uk.js +17 -0
  343. data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/zh-cn.js +1 -0
  344. data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/zh.js +14 -0
  345. data/app/assets/javascripts/ckeditor/plugins/wordcount/plugin.js +485 -302
  346. data/app/assets/javascripts/ckeditor/plugins/wordcount/samples/maxParagraphs.html +26 -0
  347. data/app/assets/javascripts/integral/backend.js +197 -26
  348. data/app/assets/javascripts/integral/frontend.js +37 -2
  349. data/app/assets/javascripts/integral/support/character_counter.js +14 -8
  350. data/app/assets/javascripts/integral/support/confirm_modal.coffee +2 -2
  351. data/app/assets/javascripts/integral/support/date_picker.coffee +54 -59
  352. data/app/assets/javascripts/integral/support/gallery.coffee +85 -43
  353. data/app/assets/javascripts/integral/support/grid.coffee +11 -4
  354. data/app/assets/javascripts/integral/support/lib/lazysizes.js +755 -0
  355. data/app/assets/javascripts/integral/support/lib/materialize-tags.js +49 -44
  356. data/app/assets/javascripts/integral/support/list.coffee +1 -0
  357. data/app/assets/javascripts/integral/support/ls.instagram.js +57 -0
  358. data/app/assets/javascripts/integral/support/ls.twitter.js +66 -0
  359. data/app/assets/javascripts/integral/support/record_selector.coffee +3 -1
  360. data/app/assets/javascripts/integral/support/remote_form.coffee +18 -11
  361. data/app/assets/javascripts/integral/support/slug_generator.coffee +1 -0
  362. data/app/assets/stylesheets/integral/backend.sass +36 -24
  363. data/app/assets/stylesheets/integral/backend/_foundation_settings.scss +5 -6
  364. data/app/assets/stylesheets/integral/backend/dashboard-layout.scss +31 -64
  365. data/app/assets/stylesheets/integral/backend/devise.sass +2 -3
  366. data/app/assets/stylesheets/integral/backend/materialize-tags.sass +2 -1
  367. data/app/assets/stylesheets/integral/backend/modules/dropdown_pane_notifications.scss +150 -0
  368. data/app/assets/stylesheets/integral/backend/modules/dropdown_pane_profile.scss +59 -0
  369. data/app/assets/stylesheets/integral/backend/modules/timeline.scss +214 -0
  370. data/app/assets/stylesheets/integral/backend/shared.sass +121 -13
  371. data/app/assets/stylesheets/integral/frontend.scss +45 -0
  372. data/app/assets/stylesheets/integral/frontend/_foundation_settings.scss +2 -2
  373. data/app/assets/stylesheets/integral/frontend/blog.sass +155 -142
  374. data/app/assets/stylesheets/integral/frontend/layout.sass +13 -3
  375. data/app/assets/stylesheets/integral/frontend/modules/article-footer.scss +55 -0
  376. data/app/assets/stylesheets/integral/frontend/modules/article.scss +34 -0
  377. data/app/assets/stylesheets/integral/frontend/modules/horizontal-post.scss +44 -0
  378. data/app/assets/stylesheets/integral/frontend/modules/inline-articles.scss +23 -0
  379. data/app/assets/stylesheets/integral/frontend/modules/latest-post.scss +37 -0
  380. data/app/assets/stylesheets/integral/frontend/modules/list-widget.scss +50 -0
  381. data/app/assets/stylesheets/integral/frontend/modules/piped-list.scss +33 -0
  382. data/app/assets/stylesheets/integral/frontend/modules/post-tags.scss +19 -0
  383. data/app/assets/stylesheets/integral/frontend/modules/scroll-container.scss +9 -0
  384. data/app/assets/stylesheets/integral/frontend/modules/sidebar-articles.scss +42 -0
  385. data/app/assets/stylesheets/integral/frontend/modules/sidebar-tags.scss +6 -0
  386. data/app/assets/stylesheets/integral/frontend/modules/sidebar-widget.scss +47 -0
  387. data/app/assets/stylesheets/integral/frontend/modules/vertical-post.scss +31 -0
  388. data/app/assets/stylesheets/integral/frontend/share_modal.sass +0 -5
  389. data/app/assets/stylesheets/integral/support/gallery.sass +18 -2
  390. data/app/assets/stylesheets/integral/support/media-query-indicator.sass +9 -3
  391. data/app/controllers/integral/application_controller.rb +10 -3
  392. data/app/controllers/integral/backend/activities_controller.rb +31 -26
  393. data/app/controllers/integral/backend/base_controller.rb +265 -26
  394. data/app/controllers/integral/backend/categories_controller.rb +49 -0
  395. data/app/controllers/integral/backend/images_controller.rb +39 -56
  396. data/app/controllers/integral/backend/lists_controller.rb +16 -104
  397. data/app/controllers/integral/backend/notification_subscriptions_controller.rb +23 -0
  398. data/app/controllers/integral/backend/pages_controller.rb +15 -117
  399. data/app/controllers/integral/backend/posts_controller.rb +22 -108
  400. data/app/controllers/integral/backend/settings_controller.rb +7 -8
  401. data/app/controllers/integral/backend/static_pages_controller.rb +14 -0
  402. data/app/controllers/integral/backend/users_controller.rb +61 -79
  403. data/app/controllers/integral/blog_controller.rb +12 -0
  404. data/app/controllers/integral/categories_controller.rb +45 -0
  405. data/app/controllers/integral/pages_controller.rb +7 -3
  406. data/app/controllers/integral/posts_controller.rb +7 -9
  407. data/app/controllers/integral/tags_controller.rb +5 -2
  408. data/app/decorators/integral/base_decorator.rb +16 -0
  409. data/app/decorators/integral/category_decorator.rb +30 -0
  410. data/app/decorators/integral/image_decorator.rb +3 -3
  411. data/app/decorators/integral/list_decorator.rb +1 -13
  412. data/app/decorators/integral/notification/notification_decorator.rb +74 -0
  413. data/app/decorators/integral/page_decorator.rb +1 -13
  414. data/app/decorators/integral/paginating_decorator.rb +6 -0
  415. data/app/decorators/integral/post_decorator.rb +44 -4
  416. data/app/decorators/integral/user_decorator.rb +1 -13
  417. data/app/decorators/integral/version_decorator.rb +58 -15
  418. data/app/helpers/integral/application_helper.rb +7 -0
  419. data/app/helpers/integral/backend/base_helper.rb +139 -13
  420. data/app/helpers/integral/blog_helper.rb +46 -0
  421. data/app/helpers/integral/social_helper.rb +0 -23
  422. data/app/jobs/integral/application_job.rb +1 -0
  423. data/app/jobs/integral/newsletter_signup_job.rb +0 -2
  424. data/app/jobs/integral/webhook/delivery_job.rb +37 -0
  425. data/app/mailers/integral/contact_mailer.rb +4 -1
  426. data/app/mailers/integral/devise_mailer.rb +6 -0
  427. data/app/models/concerns/integral/lazy_contentable.rb +54 -0
  428. data/app/models/concerns/integral/notification/subscribable.rb +67 -0
  429. data/app/models/concerns/integral/webhook/delivery.rb +30 -0
  430. data/app/models/concerns/integral/webhook/observable.rb +23 -0
  431. data/app/models/integral/application_record.rb +9 -0
  432. data/app/models/integral/category.rb +29 -0
  433. data/app/models/integral/category_version.rb +8 -0
  434. data/app/models/integral/image.rb +40 -3
  435. data/app/models/integral/list.rb +11 -4
  436. data/app/models/integral/list_item.rb +15 -16
  437. data/app/models/integral/list_item_connection.rb +6 -0
  438. data/app/models/integral/notification/notification.rb +28 -0
  439. data/app/models/integral/notification/subscription.rb +14 -0
  440. data/app/models/integral/page.rb +32 -10
  441. data/app/models/integral/post.rb +39 -14
  442. data/app/models/integral/user.rb +51 -2
  443. data/app/models/integral/version.rb +2 -2
  444. data/app/models/integral/webhook/endpoint.rb +40 -0
  445. data/app/models/integral/webhook/event.rb +20 -0
  446. data/app/policies/integral/base_policy.rb +7 -11
  447. data/app/policies/integral/category_policy.rb +9 -0
  448. data/app/policies/integral/page_policy.rb +1 -0
  449. data/app/policies/integral/version_policy.rb +0 -8
  450. data/app/serializers/integral/post_serializer.rb +24 -0
  451. data/app/uploaders/integral/avatar_uploader.rb +1 -1
  452. data/app/views/devise/invitations/edit.haml +1 -4
  453. data/app/views/devise/mailer/invitation_instructions.inky-haml +20 -0
  454. data/app/views/devise/sessions/new.haml +2 -2
  455. data/app/views/integral/backend/activities/_activity.haml +21 -0
  456. data/app/views/integral/backend/activities/grid/_dropdown_actions.haml +1 -0
  457. data/app/views/integral/backend/activities/grid/_row_content.haml +13 -0
  458. data/app/views/integral/backend/activities/index.haml +7 -13
  459. data/app/views/integral/backend/activities/shared/_grid.haml +35 -19
  460. data/app/views/integral/backend/activities/shared/index.haml +15 -0
  461. data/app/views/integral/backend/activities/shared/{_log.haml → show.haml} +7 -7
  462. data/app/views/integral/backend/activities/show.haml +1 -1
  463. data/app/views/integral/backend/categories/_modal.haml +24 -0
  464. data/app/views/integral/backend/images/_form.haml +16 -28
  465. data/app/views/integral/backend/images/edit.haml +2 -2
  466. data/app/views/integral/backend/images/grid/_dropdown_actions.haml +5 -0
  467. data/app/views/integral/backend/images/grid/_row_content.haml +5 -0
  468. data/app/views/integral/backend/images/index.haml +11 -17
  469. data/app/views/integral/backend/images/list.haml +11 -0
  470. data/app/views/integral/backend/images/show.haml +26 -0
  471. data/app/views/integral/backend/lists/_form.haml +7 -20
  472. data/app/views/integral/backend/lists/_item_container.haml +1 -1
  473. data/app/views/integral/backend/lists/_item_modal.haml +3 -3
  474. data/app/views/integral/backend/lists/_list_item_fields.haml +3 -2
  475. data/app/views/integral/backend/lists/_manager.haml +11 -13
  476. data/app/views/integral/backend/lists/edit.haml +22 -1
  477. data/app/views/integral/backend/lists/grid/_dropdown_actions.haml +9 -0
  478. data/app/views/integral/backend/lists/grid/_row_content.haml +3 -0
  479. data/app/views/integral/backend/lists/index.haml +11 -17
  480. data/app/views/integral/backend/lists/list.haml +11 -0
  481. data/app/views/integral/backend/lists/show.haml +27 -23
  482. data/app/views/integral/backend/notifications/_notification.haml +21 -0
  483. data/app/views/integral/backend/pages/_form.haml +20 -47
  484. data/app/views/integral/backend/pages/edit.haml +18 -0
  485. data/app/views/integral/backend/pages/grid/_dropdown_actions.haml +11 -0
  486. data/app/views/integral/backend/pages/grid/_row_content.haml +5 -0
  487. data/app/views/integral/backend/pages/index.haml +11 -21
  488. data/app/views/integral/backend/pages/list.haml +15 -0
  489. data/app/views/integral/backend/pages/show.haml +32 -0
  490. data/app/views/integral/backend/posts/_form.haml +19 -51
  491. data/app/views/integral/backend/posts/edit.haml +5 -10
  492. data/app/views/integral/backend/posts/grid/_dropdown_actions.haml +10 -0
  493. data/app/views/integral/backend/posts/grid/_row_content.haml +6 -0
  494. data/app/views/integral/backend/posts/index.haml +13 -19
  495. data/app/views/integral/backend/posts/list.haml +13 -0
  496. data/app/views/integral/backend/posts/new.haml +0 -1
  497. data/app/views/integral/backend/posts/show.haml +31 -0
  498. data/app/views/integral/backend/settings/sections/_social.haml +1 -3
  499. data/app/views/integral/backend/shared/_activity_modal.haml +13 -0
  500. data/app/views/integral/backend/shared/_breadcrumbs.haml +7 -4
  501. data/app/views/integral/backend/shared/_image_preview.haml +10 -3
  502. data/app/views/integral/backend/shared/_image_selector.haml +1 -1
  503. data/app/views/integral/backend/shared/_notification_subscription_toggle.haml +22 -0
  504. data/app/views/integral/backend/shared/action_bar/_index.haml +9 -0
  505. data/app/views/integral/backend/shared/action_bar/_show.haml +3 -0
  506. data/app/views/integral/backend/shared/cards/_at_a_glance.haml +3 -3
  507. data/app/views/integral/backend/shared/cards/_categories.haml +33 -0
  508. data/app/views/integral/backend/{static_pages/_card.haml → shared/cards/_object.haml} +1 -1
  509. data/app/views/integral/backend/shared/cards/_recent_activity.haml +20 -0
  510. data/app/views/integral/backend/shared/cards/_recent_resources.haml +17 -0
  511. data/app/views/integral/backend/shared/cards/_recent_user_activity.haml +1 -0
  512. data/app/views/integral/backend/shared/cards/_top_post_authors.haml +18 -0
  513. data/app/views/integral/backend/shared/cards/_welcome.haml +24 -25
  514. data/app/views/integral/backend/shared/{_empty_grid.haml → grid/_empty.haml} +0 -0
  515. data/app/views/integral/backend/shared/grid/_form.haml +9 -0
  516. data/app/views/integral/backend/shared/grid/_grid.haml +21 -0
  517. data/app/views/integral/backend/shared/{_pagination.haml → grid/_pagination.haml} +0 -0
  518. data/app/views/integral/backend/shared/grid/_row_layout.haml +8 -0
  519. data/app/views/integral/backend/shared/record_selector/_collection.haml +1 -0
  520. data/app/views/integral/backend/shared/record_selector/_modal.haml +9 -10
  521. data/app/views/integral/backend/shared/record_selector/_record.haml +6 -4
  522. data/app/views/integral/backend/static_pages/dashboard.haml +17 -15
  523. data/app/views/integral/backend/users/_form.haml +35 -47
  524. data/app/views/integral/backend/users/edit.haml +1 -1
  525. data/app/views/integral/backend/users/grid/_dropdown_actions.haml +17 -0
  526. data/app/views/integral/backend/users/grid/_row_content.haml +8 -0
  527. data/app/views/integral/backend/users/index.haml +11 -17
  528. data/app/views/integral/backend/users/list.haml +12 -0
  529. data/app/views/integral/backend/users/show.haml +22 -19
  530. data/app/views/integral/categories/show.haml +5 -0
  531. data/app/views/integral/pages/_demo.haml +2 -2
  532. data/app/views/integral/posts/_article_footer.haml +17 -0
  533. data/app/views/integral/posts/_card.haml +11 -0
  534. data/app/views/integral/posts/_latest_post.haml +8 -0
  535. data/app/views/integral/posts/_most_read_section.haml +8 -0
  536. data/app/views/integral/posts/_post.haml +11 -0
  537. data/app/views/integral/posts/_similar_posts.haml +5 -0
  538. data/app/views/integral/posts/index.haml +7 -5
  539. data/app/views/integral/posts/templates/default.haml +35 -35
  540. data/app/views/integral/shared/_share_modal.haml +0 -3
  541. data/app/views/integral/shared/_social_list_items.haml +6 -12
  542. data/app/views/integral/shared/_subscribe_modal.haml +14 -0
  543. data/app/views/integral/shared/blog/_categories.haml +15 -0
  544. data/app/views/integral/shared/blog/_layout.haml +9 -0
  545. data/app/views/integral/shared/blog/_sidebar.haml +10 -0
  546. data/app/views/integral/shared/gallery/_placeholder.haml +2 -2
  547. data/app/views/integral/shared/gallery/_slide.haml +2 -2
  548. data/app/views/integral/shared/gallery/gallery.haml +5 -2
  549. data/app/views/integral/shared/sidebar/_item.haml +8 -0
  550. data/app/views/integral/shared/sidebar/_newsletter_signup.haml +7 -0
  551. data/app/views/integral/shared/sidebar/_popular_posts.haml +7 -0
  552. data/app/views/integral/shared/sidebar/_popular_tags.haml +7 -0
  553. data/app/views/integral/shared/sidebar/_recent_posts.haml +7 -0
  554. data/app/views/integral/tags/index.haml +2 -2
  555. data/app/views/integral/tags/show.haml +3 -6
  556. data/app/views/layouts/integral/backend.html.haml +27 -5
  557. data/app/views/layouts/integral/backend/_create_dropdown.haml +1 -30
  558. data/app/views/layouts/integral/backend/_main_menu_items.haml +1 -91
  559. data/app/views/layouts/integral/frontend.html.haml +3 -3
  560. data/config/initializers/devise.rb +1 -1
  561. data/config/locales/en.yml +131 -56
  562. data/config/routes.rb +2 -0
  563. data/db/migrate/20190414172018_create_webhook_endpoints.rb +10 -0
  564. data/db/migrate/20190929191412_add_integral_post_categories.rb +13 -0
  565. data/db/migrate/20191203090008_add_image_to_integral_categories.rb +6 -0
  566. data/db/migrate/20200401210442_create_category_versions.rb +20 -0
  567. data/db/migrate/20200407022636_create_integral_notifications.rb +25 -0
  568. data/db/migrate/20200421223602_add_status_to_integral_users.rb +5 -0
  569. data/db/seeds.rb +16 -10
  570. data/lib/generators/integral/assets_generator.rb +54 -0
  571. data/lib/generators/integral/install_generator.rb +37 -3
  572. data/lib/generators/integral/views_generator.rb +66 -0
  573. data/lib/generators/templates/app.yml +0 -1
  574. data/lib/generators/templates/integral.rb +5 -0
  575. data/lib/generators/templates/routes.rb +7 -0
  576. data/lib/generators/templates/seeds.rb +2 -0
  577. data/lib/integral.rb +4 -30
  578. data/lib/integral/acts_as_integral.rb +115 -0
  579. data/lib/integral/acts_as_listable.rb +3 -3
  580. data/lib/integral/chart_renderer/base.rb +2 -0
  581. data/lib/integral/content_renderer.rb +3 -3
  582. data/lib/integral/engine.rb +12 -2
  583. data/lib/integral/grids/activities_grid.rb +15 -2
  584. data/lib/integral/grids/lists_grid.rb +1 -0
  585. data/lib/integral/grids/posts_grid.rb +5 -1
  586. data/lib/integral/grids/users_grid.rb +5 -0
  587. data/lib/integral/list_item_renderer.rb +4 -2
  588. data/lib/integral/list_renderer.rb +6 -1
  589. data/lib/integral/middleware/page_router.rb +15 -6
  590. data/lib/integral/router.rb +41 -7
  591. data/lib/integral/version.rb +1 -1
  592. data/lib/integral/widgets/recent_posts.rb +1 -1
  593. data/lib/integral/widgets/swiper_list.rb +3 -2
  594. data/public/images/integral/demo/continous-integration.png +0 -0
  595. data/public/images/integral/demo/foundation-frontend-framework.jpg +0 -0
  596. data/public/images/integral/demo/heroku.png +0 -0
  597. data/public/images/integral/demo/integral-cms-without-hassle.jpg +0 -0
  598. data/public/images/integral/demo/integral-features-activity-tracking.jpg +0 -0
  599. data/public/images/integral/demo/integral-features-contact-form.png +0 -0
  600. data/public/images/integral/demo/integral-features-design.jpg +0 -0
  601. data/public/images/integral/demo/integral-features-dynamic-pages.jpg +0 -0
  602. data/public/images/integral/demo/integral-features-image-management.jpg +0 -0
  603. data/public/images/integral/demo/integral-features-integrated-blog.jpg +0 -0
  604. data/public/images/integral/demo/integral-features-list-management.jpg +0 -0
  605. data/public/images/integral/demo/integral-features-seo-ready.jpg +0 -0
  606. data/public/images/integral/demo/integral-features-user-management.jpg +0 -0
  607. data/public/images/integral/demo/integral-presentation.png +0 -0
  608. data/public/integral/ckeditor_demo_content.html +0 -13
  609. data/spec/factories.rb +30 -8
  610. metadata +322 -127
  611. data/app/assets/javascripts/ckeditor/plugins/wordcount/lang/jp.js +0 -13
  612. data/app/assets/javascripts/integral/support/date_picker/picker.date.js +0 -1435
  613. data/app/assets/javascripts/integral/support/date_picker/picker.js +0 -1132
  614. data/app/assets/stylesheets/integral/frontend.sass +0 -26
  615. data/app/assets/stylesheets/integral/support/date-picker.scss +0 -16
  616. data/app/assets/stylesheets/integral/support/date_picker/_default.date.scss +0 -452
  617. data/app/assets/stylesheets/integral/support/date_picker/_default.scss +0 -201
  618. data/app/assets/stylesheets/integral/support/date_picker/materialize_clockpicker.sass +0 -220
  619. data/app/assets/stylesheets/integral/wysiwyg.sass +0 -13
  620. data/app/views/devise/mailer/invitation_instructions.html.erb +0 -13
  621. data/app/views/integral/backend/activities/_grid.haml +0 -23
  622. data/app/views/integral/backend/activities/shared/_listing.haml +0 -14
  623. data/app/views/integral/backend/images/_grid.haml +0 -16
  624. data/app/views/integral/backend/lists/_grid.haml +0 -16
  625. data/app/views/integral/backend/pages/_grid.haml +0 -21
  626. data/app/views/integral/backend/pages/activities.haml +0 -2
  627. data/app/views/integral/backend/pages/activity.haml +0 -1
  628. data/app/views/integral/backend/pages/edit.html.haml +0 -15
  629. data/app/views/integral/backend/posts/_grid.haml +0 -25
  630. data/app/views/integral/backend/posts/activities.haml +0 -3
  631. data/app/views/integral/backend/posts/activity.haml +0 -1
  632. data/app/views/integral/backend/shared/_grid.haml +0 -18
  633. data/app/views/integral/backend/users/_grid.haml +0 -19
  634. data/app/views/integral/posts/_item.haml +0 -16
  635. data/app/views/integral/shared/_blog_layout.haml +0 -15
  636. data/app/views/integral/shared/_blog_sidebar.haml +0 -49
  637. data/lib/integral/slack_bot.rb +0 -45
@@ -1,68 +1,65 @@
1
1
  # Handles interaction with galleries
2
2
  class this.Gallery
3
3
  @init: ->
4
- new Gallery()
5
-
6
- # Initiate a Gallery
7
- #
8
- # @usage new Gallery($('form'))
9
- constructor: (opts={}) ->
10
- @placeholder = $('#gallery-placeholder')
11
- @_setupEvents()
12
-
13
-
14
- # Create listeners and handlers for form events
15
- _setupEvents: =>
16
4
  # Watch for when a user opens a gallery
17
5
  $('.js-gallery-link').on "click", (event) =>
18
- @_open_or_create_gallery(event)
6
+ target = event.currentTarget.dataset.target
7
+ url = event.currentTarget.dataset.url
8
+ @open_or_create_gallery(target, url)
19
9
 
20
- # Open Gallery or create it and open placeholder
21
- _open_or_create_gallery: (event) =>
22
- galleryId = event.currentTarget.dataset.target
23
- return @_handleError() if galleryId == undefined
10
+ # Open Gallery or create new one
11
+ @open_or_create_gallery: (id, url) =>
12
+ return Gallery.handleError() if id == undefined
24
13
 
25
- gallery = $("##{galleryId}")
14
+ gallery = $("##{id}")
26
15
  if gallery.length > 0
27
16
  gallery.foundation('open')
28
17
  else
29
- url = event.currentTarget.dataset.url
30
- return @_handleError() if url == undefined
31
- @_createGallery(galleryId, url)
18
+ return Gallery.handleError() if url == undefined
19
+ new Gallery(id, url)
20
+
21
+ @handleError: =>
22
+ toastr['error']('Sorry, an unexpected error occurred. Please try again later.')
23
+
24
+ # Initiate a Gallery
25
+ #
26
+ # @usage new Gallery('myGallery', 'link-to-gallery-content')
27
+ constructor: (id, url, opts={}) ->
28
+ placeholder = $('#gallery-placeholder')
32
29
 
33
- # What happens after AJAX request is complete
34
- _createGallery: (id, url) =>
35
30
  # Copy placeholder gallery, set ID, initialize & open
36
- gallery = @placeholder.clone().appendTo('body')
37
- gallery.attr('id', id)
38
- gallery.foundation()
39
- gallery.foundation('open')
31
+ @$container = placeholder.clone().appendTo('body')
32
+ @youtubeEmbeds = []
33
+ @$container.attr('id', id)
34
+ @$container.foundation()
35
+ @$container.foundation('open')
40
36
 
41
37
  # Download gallery content
42
38
  $.ajax
43
39
  url: url,
44
- context: gallery
45
40
  .success (data, textStatus, jqXHR) =>
46
- @_setupGallery(gallery, data)
41
+ @_setupGallery(data)
47
42
  .error (e, data, status, xhr) =>
48
- @_handleError()
43
+ Gallery.handleError()
49
44
 
50
- _setupGallery: (gallery, data) =>
45
+ _setupGallery: (data) =>
51
46
  # Copy gallery into Modal
52
- gallery.find('.content').html(data)
53
- galleryContent = gallery.find('.content')
47
+ @$container.find('.content').html(data)
48
+ @$galleryContent = @$container.find('.content')
49
+
50
+ @_setupYoutube()
54
51
 
55
- mainSwiper = galleryContent.find('.main-swiper')
56
- # Setup galleries
57
- if mainSwiper.length > 0
58
- projectGalleryTop = new Swiper(mainSwiper[0], {
52
+ @$mainSwiper = @$galleryContent.find('.main-swiper')
53
+ # Setup galleries (when present)
54
+ if @$mainSwiper.length > 0
55
+ projectGalleryTop = new Swiper(@$mainSwiper[0], {
59
56
  spaceBetween: 10,
60
57
  navigation: {
61
58
  nextEl: '.swiper-button-next',
62
59
  prevEl: '.swiper-button-prev',
63
60
  },
64
61
  })
65
- projectGalleryThumbs = new Swiper(galleryContent.find('.thumb-swiper'), {
62
+ projectGalleryThumbs = new Swiper(@$galleryContent.find('.thumb-swiper'), {
66
63
  spaceBetween: 10,
67
64
  centeredSlides: true,
68
65
  slidesPerView: 'auto',
@@ -72,11 +69,56 @@ class this.Gallery
72
69
  projectGalleryTop.controller.control = projectGalleryThumbs
73
70
  projectGalleryThumbs.controller.control = projectGalleryTop
74
71
 
75
- # Show/hide content and placeholder
76
- gallery.find('.placeholder').css('display', 'none')
77
- galleryContent.css('visibility', 'initial')
72
+ @_setSwiperSize()
78
73
 
79
- _handleError: =>
80
- toastr['error']('Sorry, an unexpected error occurred. Please try again later.')
74
+ window.addEventListener 'resize', =>
75
+ @_setSwiperSize()
76
+
77
+ # Listen for arrow keys
78
+ $(document).keydown (event) =>
79
+ return unless @$container.is(':focus')
80
+
81
+ switch event.which
82
+ when 37 # Left
83
+ projectGalleryThumbs.slidePrev()
84
+ when 39 # Right
85
+ projectGalleryThumbs.slideNext()
86
+ else
87
+ return # Exit this handler for other keys
88
+
89
+ # Show/hide content and placeholder
90
+ @$container.find('.placeholder').css('display', 'none')
91
+ @$galleryContent.css('visibility', 'initial')
92
+
93
+ _setSwiperSize: =>
94
+ revealHeight = @$container.height()
95
+ if @$mainSwiper.length > 0
96
+ thumbSwiperHeight = @$galleryContent.find('.thumb-swiper').height()
97
+ revealAvailableHeight = revealHeight - thumbSwiperHeight
98
+ @$mainSwiper.height(revealAvailableHeight)
99
+ else
100
+ @$galleryContent.height(revealHeight)
101
+
102
+ _setupYoutube: =>
103
+ embeds = @$container.find('iframe')
104
+ if embeds.length > 0
105
+ if typeof YT == 'undefined'
106
+ # Download YT script and wait until API is ready
107
+ # TODO: Clean up wait hack
108
+ console.log('Downloading YT script')
109
+ $.getScript "https://www.youtube.com/iframe_api", =>
110
+ setTimeout =>
111
+ @_setupEmbeds(embeds)
112
+ , 1500
113
+ else
114
+ @_setupEmbeds(embeds)
115
+
116
+ _setupEmbeds: (embeds) =>
117
+ embeds.each (index, element) =>
118
+ player = new YT.Player(element)
119
+ @youtubeEmbeds.push(player)
81
120
 
121
+ @$container.on 'closed.zf.reveal', =>
122
+ @youtubeEmbeds.forEach (element) =>
123
+ element.pauseVideo()
82
124
 
@@ -26,6 +26,13 @@ class this.Grid
26
26
  @container.on 'change', 'input[type=checkbox][data-filter]', (ev) =>
27
27
  @_toggleFilterValue(ev.target.dataset.filter, ev.target.dataset.value)
28
28
 
29
+ @container.on 'change', 'select[data-filter], input[type=text][data-filter]', (ev) =>
30
+ filterName = ev.target.dataset.filter
31
+ filter = @form.find("input[name='#{filterName}']")
32
+ filter.val(ev.target.value)
33
+
34
+ @_redrawGrid()
35
+
29
36
  @form.on 'change', 'select[data-filter]', (ev) =>
30
37
  @_redrawGrid()
31
38
 
@@ -52,13 +59,13 @@ class this.Grid
52
59
  @container.html(data.content)
53
60
 
54
61
  @gridCount.text(data.count)
62
+
63
+ @form.on "ajax:complete", (event, data, status, xhr) =>
55
64
  @container.removeClass('loading')
56
65
  @container.find('[data-grid-container]').removeClass('loading')
57
66
 
58
- # @form.on "ajax:complete", (event, data, status, xhr) =>
59
- # console.log 'Complete!'
60
- # @form.on "ajax:error", (event, data, status, xhr) =>
61
- # console.log 'Error!'
67
+ @form.on "ajax:error", (event, data, status, xhr) =>
68
+ toastr['error']('Unfortunately an error took place. Please try again later.')
62
69
 
63
70
  _updateSort: (order, desc)->
64
71
  @orderField.val(order)
@@ -0,0 +1,755 @@
1
+ /* 5.2.0 - https://github.com/aFarkas/lazysizes */
2
+ (function(window, factory) {
3
+ var lazySizes = factory(window, window.document, Date);
4
+ window.lazySizes = lazySizes;
5
+ if(typeof module == 'object' && module.exports){
6
+ module.exports = lazySizes;
7
+ }
8
+ }(typeof window != 'undefined' ?
9
+ window : {}, function l(window, document, Date) { // Pass in the windoe Date function also for SSR because the Date class can be lost
10
+ 'use strict';
11
+ /*jshint eqnull:true */
12
+
13
+ var lazysizes, lazySizesCfg;
14
+
15
+ (function(){
16
+ var prop;
17
+
18
+ var lazySizesDefaults = {
19
+ lazyClass: 'lazyload',
20
+ loadedClass: 'lazyloaded',
21
+ loadingClass: 'lazyloading',
22
+ preloadClass: 'lazypreload',
23
+ errorClass: 'lazyerror',
24
+ //strictClass: 'lazystrict',
25
+ autosizesClass: 'lazyautosizes',
26
+ srcAttr: 'data-src',
27
+ srcsetAttr: 'data-srcset',
28
+ sizesAttr: 'data-sizes',
29
+ //preloadAfterLoad: false,
30
+ minSize: 40,
31
+ customMedia: {},
32
+ init: true,
33
+ expFactor: 1.5,
34
+ hFac: 0.8,
35
+ loadMode: 2,
36
+ loadHidden: true,
37
+ ricTimeout: 0,
38
+ throttleDelay: 125,
39
+ };
40
+
41
+ lazySizesCfg = window.lazySizesConfig || window.lazysizesConfig || {};
42
+
43
+ for(prop in lazySizesDefaults){
44
+ if(!(prop in lazySizesCfg)){
45
+ lazySizesCfg[prop] = lazySizesDefaults[prop];
46
+ }
47
+ }
48
+ })();
49
+
50
+ if (!document || !document.getElementsByClassName) {
51
+ return {
52
+ init: function () {},
53
+ cfg: lazySizesCfg,
54
+ noSupport: true,
55
+ };
56
+ }
57
+
58
+ var docElem = document.documentElement;
59
+
60
+ var supportPicture = window.HTMLPictureElement;
61
+
62
+ var _addEventListener = 'addEventListener';
63
+
64
+ var _getAttribute = 'getAttribute';
65
+
66
+ /**
67
+ * Update to bind to window because 'this' becomes null during SSR
68
+ * builds.
69
+ */
70
+ var addEventListener = window[_addEventListener].bind(window);
71
+
72
+ var setTimeout = window.setTimeout;
73
+
74
+ var requestAnimationFrame = window.requestAnimationFrame || setTimeout;
75
+
76
+ var requestIdleCallback = window.requestIdleCallback;
77
+
78
+ var regPicture = /^picture$/i;
79
+
80
+ var loadEvents = ['load', 'error', 'lazyincluded', '_lazyloaded'];
81
+
82
+ var regClassCache = {};
83
+
84
+ var forEach = Array.prototype.forEach;
85
+
86
+ var hasClass = function(ele, cls) {
87
+ if(!regClassCache[cls]){
88
+ regClassCache[cls] = new RegExp('(\\s|^)'+cls+'(\\s|$)');
89
+ }
90
+ return regClassCache[cls].test(ele[_getAttribute]('class') || '') && regClassCache[cls];
91
+ };
92
+
93
+ var addClass = function(ele, cls) {
94
+ if (!hasClass(ele, cls)){
95
+ ele.setAttribute('class', (ele[_getAttribute]('class') || '').trim() + ' ' + cls);
96
+ }
97
+ };
98
+
99
+ var removeClass = function(ele, cls) {
100
+ var reg;
101
+ if ((reg = hasClass(ele,cls))) {
102
+ ele.setAttribute('class', (ele[_getAttribute]('class') || '').replace(reg, ' '));
103
+ }
104
+ };
105
+
106
+ var addRemoveLoadEvents = function(dom, fn, add){
107
+ var action = add ? _addEventListener : 'removeEventListener';
108
+ if(add){
109
+ addRemoveLoadEvents(dom, fn);
110
+ }
111
+ loadEvents.forEach(function(evt){
112
+ dom[action](evt, fn);
113
+ });
114
+ };
115
+
116
+ var triggerEvent = function(elem, name, detail, noBubbles, noCancelable){
117
+ var event = document.createEvent('Event');
118
+
119
+ if(!detail){
120
+ detail = {};
121
+ }
122
+
123
+ detail.instance = lazysizes;
124
+
125
+ event.initEvent(name, !noBubbles, !noCancelable);
126
+
127
+ event.detail = detail;
128
+
129
+ elem.dispatchEvent(event);
130
+ return event;
131
+ };
132
+
133
+ var updatePolyfill = function (el, full){
134
+ var polyfill;
135
+ if( !supportPicture && ( polyfill = (window.picturefill || lazySizesCfg.pf) ) ){
136
+ if(full && full.src && !el[_getAttribute]('srcset')){
137
+ el.setAttribute('srcset', full.src);
138
+ }
139
+ polyfill({reevaluate: true, elements: [el]});
140
+ } else if(full && full.src){
141
+ el.src = full.src;
142
+ }
143
+ };
144
+
145
+ var getCSS = function (elem, style){
146
+ return (getComputedStyle(elem, null) || {})[style];
147
+ };
148
+
149
+ var getWidth = function(elem, parent, width){
150
+ width = width || elem.offsetWidth;
151
+
152
+ while(width < lazySizesCfg.minSize && parent && !elem._lazysizesWidth){
153
+ width = parent.offsetWidth;
154
+ parent = parent.parentNode;
155
+ }
156
+
157
+ return width;
158
+ };
159
+
160
+ var rAF = (function(){
161
+ var running, waiting;
162
+ var firstFns = [];
163
+ var secondFns = [];
164
+ var fns = firstFns;
165
+
166
+ var run = function(){
167
+ var runFns = fns;
168
+
169
+ fns = firstFns.length ? secondFns : firstFns;
170
+
171
+ running = true;
172
+ waiting = false;
173
+
174
+ while(runFns.length){
175
+ runFns.shift()();
176
+ }
177
+
178
+ running = false;
179
+ };
180
+
181
+ var rafBatch = function(fn, queue){
182
+ if(running && !queue){
183
+ fn.apply(this, arguments);
184
+ } else {
185
+ fns.push(fn);
186
+
187
+ if(!waiting){
188
+ waiting = true;
189
+ (document.hidden ? setTimeout : requestAnimationFrame)(run);
190
+ }
191
+ }
192
+ };
193
+
194
+ rafBatch._lsFlush = run;
195
+
196
+ return rafBatch;
197
+ })();
198
+
199
+ var rAFIt = function(fn, simple){
200
+ return simple ?
201
+ function() {
202
+ rAF(fn);
203
+ } :
204
+ function(){
205
+ var that = this;
206
+ var args = arguments;
207
+ rAF(function(){
208
+ fn.apply(that, args);
209
+ });
210
+ }
211
+ ;
212
+ };
213
+
214
+ var throttle = function(fn){
215
+ var running;
216
+ var lastTime = 0;
217
+ var gDelay = lazySizesCfg.throttleDelay;
218
+ var rICTimeout = lazySizesCfg.ricTimeout;
219
+ var run = function(){
220
+ running = false;
221
+ lastTime = Date.now();
222
+ fn();
223
+ };
224
+ var idleCallback = requestIdleCallback && rICTimeout > 49 ?
225
+ function(){
226
+ requestIdleCallback(run, {timeout: rICTimeout});
227
+
228
+ if(rICTimeout !== lazySizesCfg.ricTimeout){
229
+ rICTimeout = lazySizesCfg.ricTimeout;
230
+ }
231
+ } :
232
+ rAFIt(function(){
233
+ setTimeout(run);
234
+ }, true)
235
+ ;
236
+
237
+ return function(isPriority){
238
+ var delay;
239
+
240
+ if((isPriority = isPriority === true)){
241
+ rICTimeout = 33;
242
+ }
243
+
244
+ if(running){
245
+ return;
246
+ }
247
+
248
+ running = true;
249
+
250
+ delay = gDelay - (Date.now() - lastTime);
251
+
252
+ if(delay < 0){
253
+ delay = 0;
254
+ }
255
+
256
+ if(isPriority || delay < 9){
257
+ idleCallback();
258
+ } else {
259
+ setTimeout(idleCallback, delay);
260
+ }
261
+ };
262
+ };
263
+
264
+ //based on http://modernjavascript.blogspot.de/2013/08/building-better-debounce.html
265
+ var debounce = function(func) {
266
+ var timeout, timestamp;
267
+ var wait = 99;
268
+ var run = function(){
269
+ timeout = null;
270
+ func();
271
+ };
272
+ var later = function() {
273
+ var last = Date.now() - timestamp;
274
+
275
+ if (last < wait) {
276
+ setTimeout(later, wait - last);
277
+ } else {
278
+ (requestIdleCallback || run)(run);
279
+ }
280
+ };
281
+
282
+ return function() {
283
+ timestamp = Date.now();
284
+
285
+ if (!timeout) {
286
+ timeout = setTimeout(later, wait);
287
+ }
288
+ };
289
+ };
290
+
291
+ var loader = (function(){
292
+ var preloadElems, isCompleted, resetPreloadingTimer, loadMode, started;
293
+
294
+ var eLvW, elvH, eLtop, eLleft, eLright, eLbottom, isBodyHidden;
295
+
296
+ var regImg = /^img$/i;
297
+ var regIframe = /^iframe$/i;
298
+
299
+ var supportScroll = ('onscroll' in window) && !(/(gle|ing)bot/.test(navigator.userAgent));
300
+
301
+ var shrinkExpand = 0;
302
+ var currentExpand = 0;
303
+
304
+ var isLoading = 0;
305
+ var lowRuns = -1;
306
+
307
+ var resetPreloading = function(e){
308
+ isLoading--;
309
+ if(!e || isLoading < 0 || !e.target){
310
+ isLoading = 0;
311
+ }
312
+ };
313
+
314
+ var isVisible = function (elem) {
315
+ if (isBodyHidden == null) {
316
+ isBodyHidden = getCSS(document.body, 'visibility') == 'hidden';
317
+ }
318
+
319
+ return isBodyHidden || !(getCSS(elem.parentNode, 'visibility') == 'hidden' && getCSS(elem, 'visibility') == 'hidden');
320
+ };
321
+
322
+ var isNestedVisible = function(elem, elemExpand){
323
+ var outerRect;
324
+ var parent = elem;
325
+ var visible = isVisible(elem);
326
+
327
+ eLtop -= elemExpand;
328
+ eLbottom += elemExpand;
329
+ eLleft -= elemExpand;
330
+ eLright += elemExpand;
331
+
332
+ while(visible && (parent = parent.offsetParent) && parent != document.body && parent != docElem){
333
+ visible = ((getCSS(parent, 'opacity') || 1) > 0);
334
+
335
+ if(visible && getCSS(parent, 'overflow') != 'visible'){
336
+ outerRect = parent.getBoundingClientRect();
337
+ visible = eLright > outerRect.left &&
338
+ eLleft < outerRect.right &&
339
+ eLbottom > outerRect.top - 1 &&
340
+ eLtop < outerRect.bottom + 1
341
+ ;
342
+ }
343
+ }
344
+
345
+ return visible;
346
+ };
347
+
348
+ var checkElements = function() {
349
+ var eLlen, i, rect, autoLoadElem, loadedSomething, elemExpand, elemNegativeExpand, elemExpandVal,
350
+ beforeExpandVal, defaultExpand, preloadExpand, hFac;
351
+ var lazyloadElems = lazysizes.elements;
352
+
353
+ if((loadMode = lazySizesCfg.loadMode) && isLoading < 8 && (eLlen = lazyloadElems.length)){
354
+
355
+ i = 0;
356
+
357
+ lowRuns++;
358
+
359
+ for(; i < eLlen; i++){
360
+
361
+ if(!lazyloadElems[i] || lazyloadElems[i]._lazyRace){continue;}
362
+
363
+ if(!supportScroll || (lazysizes.prematureUnveil && lazysizes.prematureUnveil(lazyloadElems[i]))){unveilElement(lazyloadElems[i]);continue;}
364
+
365
+ if(!(elemExpandVal = lazyloadElems[i][_getAttribute]('data-expand')) || !(elemExpand = elemExpandVal * 1)){
366
+ elemExpand = currentExpand;
367
+ }
368
+
369
+ if (!defaultExpand) {
370
+ defaultExpand = (!lazySizesCfg.expand || lazySizesCfg.expand < 1) ?
371
+ docElem.clientHeight > 500 && docElem.clientWidth > 500 ? 500 : 370 :
372
+ lazySizesCfg.expand;
373
+
374
+ lazysizes._defEx = defaultExpand;
375
+
376
+ preloadExpand = defaultExpand * lazySizesCfg.expFactor;
377
+ hFac = lazySizesCfg.hFac;
378
+ isBodyHidden = null;
379
+
380
+ if(currentExpand < preloadExpand && isLoading < 1 && lowRuns > 2 && loadMode > 2 && !document.hidden){
381
+ currentExpand = preloadExpand;
382
+ lowRuns = 0;
383
+ } else if(loadMode > 1 && lowRuns > 1 && isLoading < 6){
384
+ currentExpand = defaultExpand;
385
+ } else {
386
+ currentExpand = shrinkExpand;
387
+ }
388
+ }
389
+
390
+ if(beforeExpandVal !== elemExpand){
391
+ eLvW = innerWidth + (elemExpand * hFac);
392
+ elvH = innerHeight + elemExpand;
393
+ elemNegativeExpand = elemExpand * -1;
394
+ beforeExpandVal = elemExpand;
395
+ }
396
+
397
+ rect = lazyloadElems[i].getBoundingClientRect();
398
+
399
+ if ((eLbottom = rect.bottom) >= elemNegativeExpand &&
400
+ (eLtop = rect.top) <= elvH &&
401
+ (eLright = rect.right) >= elemNegativeExpand * hFac &&
402
+ (eLleft = rect.left) <= eLvW &&
403
+ (eLbottom || eLright || eLleft || eLtop) &&
404
+ (lazySizesCfg.loadHidden || isVisible(lazyloadElems[i])) &&
405
+ ((isCompleted && isLoading < 3 && !elemExpandVal && (loadMode < 3 || lowRuns < 4)) || isNestedVisible(lazyloadElems[i], elemExpand))){
406
+ unveilElement(lazyloadElems[i]);
407
+ loadedSomething = true;
408
+ if(isLoading > 9){break;}
409
+ } else if(!loadedSomething && isCompleted && !autoLoadElem &&
410
+ isLoading < 4 && lowRuns < 4 && loadMode > 2 &&
411
+ (preloadElems[0] || lazySizesCfg.preloadAfterLoad) &&
412
+ (preloadElems[0] || (!elemExpandVal && ((eLbottom || eLright || eLleft || eLtop) || lazyloadElems[i][_getAttribute](lazySizesCfg.sizesAttr) != 'auto')))){
413
+ autoLoadElem = preloadElems[0] || lazyloadElems[i];
414
+ }
415
+ }
416
+
417
+ if(autoLoadElem && !loadedSomething){
418
+ unveilElement(autoLoadElem);
419
+ }
420
+ }
421
+ };
422
+
423
+ var throttledCheckElements = throttle(checkElements);
424
+
425
+ var switchLoadingClass = function(e){
426
+ var elem = e.target;
427
+
428
+ if (elem._lazyCache) {
429
+ delete elem._lazyCache;
430
+ return;
431
+ }
432
+
433
+ resetPreloading(e);
434
+ addClass(elem, lazySizesCfg.loadedClass);
435
+ removeClass(elem, lazySizesCfg.loadingClass);
436
+ addRemoveLoadEvents(elem, rafSwitchLoadingClass);
437
+ triggerEvent(elem, 'lazyloaded');
438
+ };
439
+ var rafedSwitchLoadingClass = rAFIt(switchLoadingClass);
440
+ var rafSwitchLoadingClass = function(e){
441
+ rafedSwitchLoadingClass({target: e.target});
442
+ };
443
+
444
+ var changeIframeSrc = function(elem, src){
445
+ try {
446
+ elem.contentWindow.location.replace(src);
447
+ } catch(e){
448
+ elem.src = src;
449
+ }
450
+ };
451
+
452
+ var handleSources = function(source){
453
+ var customMedia;
454
+
455
+ var sourceSrcset = source[_getAttribute](lazySizesCfg.srcsetAttr);
456
+
457
+ if( (customMedia = lazySizesCfg.customMedia[source[_getAttribute]('data-media') || source[_getAttribute]('media')]) ){
458
+ source.setAttribute('media', customMedia);
459
+ }
460
+
461
+ if(sourceSrcset){
462
+ source.setAttribute('srcset', sourceSrcset);
463
+ }
464
+ };
465
+
466
+ var lazyUnveil = rAFIt(function (elem, detail, isAuto, sizes, isImg){
467
+ var src, srcset, parent, isPicture, event, firesLoad;
468
+
469
+ if(!(event = triggerEvent(elem, 'lazybeforeunveil', detail)).defaultPrevented){
470
+
471
+ if(sizes){
472
+ if(isAuto){
473
+ addClass(elem, lazySizesCfg.autosizesClass);
474
+ } else {
475
+ elem.setAttribute('sizes', sizes);
476
+ }
477
+ }
478
+
479
+ srcset = elem[_getAttribute](lazySizesCfg.srcsetAttr);
480
+ src = elem[_getAttribute](lazySizesCfg.srcAttr);
481
+
482
+ if(isImg) {
483
+ parent = elem.parentNode;
484
+ isPicture = parent && regPicture.test(parent.nodeName || '');
485
+ }
486
+
487
+ firesLoad = detail.firesLoad || (('src' in elem) && (srcset || src || isPicture));
488
+
489
+ event = {target: elem};
490
+
491
+ addClass(elem, lazySizesCfg.loadingClass);
492
+
493
+ if(firesLoad){
494
+ clearTimeout(resetPreloadingTimer);
495
+ resetPreloadingTimer = setTimeout(resetPreloading, 2500);
496
+ addRemoveLoadEvents(elem, rafSwitchLoadingClass, true);
497
+ }
498
+
499
+ if(isPicture){
500
+ forEach.call(parent.getElementsByTagName('source'), handleSources);
501
+ }
502
+
503
+ if(srcset){
504
+ elem.setAttribute('srcset', srcset);
505
+ } else if(src && !isPicture){
506
+ if(regIframe.test(elem.nodeName)){
507
+ changeIframeSrc(elem, src);
508
+ } else {
509
+ elem.src = src;
510
+ }
511
+ }
512
+
513
+ if(isImg && (srcset || isPicture)){
514
+ updatePolyfill(elem, {src: src});
515
+ }
516
+ }
517
+
518
+ if(elem._lazyRace){
519
+ delete elem._lazyRace;
520
+ }
521
+ removeClass(elem, lazySizesCfg.lazyClass);
522
+
523
+ rAF(function(){
524
+ // Part of this can be removed as soon as this fix is older: https://bugs.chromium.org/p/chromium/issues/detail?id=7731 (2015)
525
+ var isLoaded = elem.complete && elem.naturalWidth > 1;
526
+
527
+ if( !firesLoad || isLoaded){
528
+ if (isLoaded) {
529
+ addClass(elem, 'ls-is-cached');
530
+ }
531
+ switchLoadingClass(event);
532
+ elem._lazyCache = true;
533
+ setTimeout(function(){
534
+ if ('_lazyCache' in elem) {
535
+ delete elem._lazyCache;
536
+ }
537
+ }, 9);
538
+ }
539
+ if (elem.loading == 'lazy') {
540
+ isLoading--;
541
+ }
542
+ }, true);
543
+ });
544
+
545
+ var unveilElement = function (elem){
546
+ if (elem._lazyRace) {return;}
547
+ var detail;
548
+
549
+ var isImg = regImg.test(elem.nodeName);
550
+
551
+ //allow using sizes="auto", but don't use. it's invalid. Use data-sizes="auto" or a valid value for sizes instead (i.e.: sizes="80vw")
552
+ var sizes = isImg && (elem[_getAttribute](lazySizesCfg.sizesAttr) || elem[_getAttribute]('sizes'));
553
+ var isAuto = sizes == 'auto';
554
+
555
+ if( (isAuto || !isCompleted) && isImg && (elem[_getAttribute]('src') || elem.srcset) && !elem.complete && !hasClass(elem, lazySizesCfg.errorClass) && hasClass(elem, lazySizesCfg.lazyClass)){return;}
556
+
557
+ detail = triggerEvent(elem, 'lazyunveilread').detail;
558
+
559
+ if(isAuto){
560
+ autoSizer.updateElem(elem, true, elem.offsetWidth);
561
+ }
562
+
563
+ elem._lazyRace = true;
564
+ isLoading++;
565
+
566
+ lazyUnveil(elem, detail, isAuto, sizes, isImg);
567
+ };
568
+
569
+ var afterScroll = debounce(function(){
570
+ lazySizesCfg.loadMode = 3;
571
+ throttledCheckElements();
572
+ });
573
+
574
+ var altLoadmodeScrollListner = function(){
575
+ if(lazySizesCfg.loadMode == 3){
576
+ lazySizesCfg.loadMode = 2;
577
+ }
578
+ afterScroll();
579
+ };
580
+
581
+ var onload = function(){
582
+ if(isCompleted){return;}
583
+ if(Date.now() - started < 999){
584
+ setTimeout(onload, 999);
585
+ return;
586
+ }
587
+
588
+
589
+ isCompleted = true;
590
+
591
+ lazySizesCfg.loadMode = 3;
592
+
593
+ throttledCheckElements();
594
+
595
+ addEventListener('scroll', altLoadmodeScrollListner, true);
596
+ };
597
+
598
+ return {
599
+ _: function(){
600
+ started = Date.now();
601
+
602
+ lazysizes.elements = document.getElementsByClassName(lazySizesCfg.lazyClass);
603
+ preloadElems = document.getElementsByClassName(lazySizesCfg.lazyClass + ' ' + lazySizesCfg.preloadClass);
604
+
605
+ addEventListener('scroll', throttledCheckElements, true);
606
+
607
+ addEventListener('resize', throttledCheckElements, true);
608
+
609
+ addEventListener('pageshow', function (e) {
610
+ if (e.persisted) {
611
+ var loadingElements = document.querySelectorAll('.' + lazySizesCfg.loadingClass);
612
+
613
+ if (loadingElements.length && loadingElements.forEach) {
614
+ requestAnimationFrame(function () {
615
+ loadingElements.forEach( function (img) {
616
+ if (img.complete) {
617
+ unveilElement(img);
618
+ }
619
+ });
620
+ });
621
+ }
622
+ }
623
+ });
624
+
625
+ if(window.MutationObserver){
626
+ new MutationObserver( throttledCheckElements ).observe( docElem, {childList: true, subtree: true, attributes: true} );
627
+ } else {
628
+ docElem[_addEventListener]('DOMNodeInserted', throttledCheckElements, true);
629
+ docElem[_addEventListener]('DOMAttrModified', throttledCheckElements, true);
630
+ setInterval(throttledCheckElements, 999);
631
+ }
632
+
633
+ addEventListener('hashchange', throttledCheckElements, true);
634
+
635
+ //, 'fullscreenchange'
636
+ ['focus', 'mouseover', 'click', 'load', 'transitionend', 'animationend'].forEach(function(name){
637
+ document[_addEventListener](name, throttledCheckElements, true);
638
+ });
639
+
640
+ if((/d$|^c/.test(document.readyState))){
641
+ onload();
642
+ } else {
643
+ addEventListener('load', onload);
644
+ document[_addEventListener]('DOMContentLoaded', throttledCheckElements);
645
+ setTimeout(onload, 20000);
646
+ }
647
+
648
+ if(lazysizes.elements.length){
649
+ checkElements();
650
+ rAF._lsFlush();
651
+ } else {
652
+ throttledCheckElements();
653
+ }
654
+ },
655
+ checkElems: throttledCheckElements,
656
+ unveil: unveilElement,
657
+ _aLSL: altLoadmodeScrollListner,
658
+ };
659
+ })();
660
+
661
+
662
+ var autoSizer = (function(){
663
+ var autosizesElems;
664
+
665
+ var sizeElement = rAFIt(function(elem, parent, event, width){
666
+ var sources, i, len;
667
+ elem._lazysizesWidth = width;
668
+ width += 'px';
669
+
670
+ elem.setAttribute('sizes', width);
671
+
672
+ if(regPicture.test(parent.nodeName || '')){
673
+ sources = parent.getElementsByTagName('source');
674
+ for(i = 0, len = sources.length; i < len; i++){
675
+ sources[i].setAttribute('sizes', width);
676
+ }
677
+ }
678
+
679
+ if(!event.detail.dataAttr){
680
+ updatePolyfill(elem, event.detail);
681
+ }
682
+ });
683
+ var getSizeElement = function (elem, dataAttr, width){
684
+ var event;
685
+ var parent = elem.parentNode;
686
+
687
+ if(parent){
688
+ width = getWidth(elem, parent, width);
689
+ event = triggerEvent(elem, 'lazybeforesizes', {width: width, dataAttr: !!dataAttr});
690
+
691
+ if(!event.defaultPrevented){
692
+ width = event.detail.width;
693
+
694
+ if(width && width !== elem._lazysizesWidth){
695
+ sizeElement(elem, parent, event, width);
696
+ }
697
+ }
698
+ }
699
+ };
700
+
701
+ var updateElementsSizes = function(){
702
+ var i;
703
+ var len = autosizesElems.length;
704
+ if(len){
705
+ i = 0;
706
+
707
+ for(; i < len; i++){
708
+ getSizeElement(autosizesElems[i]);
709
+ }
710
+ }
711
+ };
712
+
713
+ var debouncedUpdateElementsSizes = debounce(updateElementsSizes);
714
+
715
+ return {
716
+ _: function(){
717
+ autosizesElems = document.getElementsByClassName(lazySizesCfg.autosizesClass);
718
+ addEventListener('resize', debouncedUpdateElementsSizes);
719
+ },
720
+ checkElems: debouncedUpdateElementsSizes,
721
+ updateElem: getSizeElement
722
+ };
723
+ })();
724
+
725
+ var init = function(){
726
+ if(!init.i && document.getElementsByClassName){
727
+ init.i = true;
728
+ autoSizer._();
729
+ loader._();
730
+ }
731
+ };
732
+
733
+ setTimeout(function(){
734
+ if(lazySizesCfg.init){
735
+ init();
736
+ }
737
+ });
738
+
739
+ lazysizes = {
740
+ cfg: lazySizesCfg,
741
+ autoSizer: autoSizer,
742
+ loader: loader,
743
+ init: init,
744
+ uP: updatePolyfill,
745
+ aC: addClass,
746
+ rC: removeClass,
747
+ hC: hasClass,
748
+ fire: triggerEvent,
749
+ gW: getWidth,
750
+ rAF: rAF,
751
+ };
752
+
753
+ return lazysizes;
754
+ }
755
+ ));