mtl 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (158) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/Gemfile +9 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +104 -0
  6. data/Rakefile +6 -0
  7. data/app/assets/javascripts/mtl/clickables.coffee +25 -0
  8. data/app/assets/javascripts/mtl/collapsible.coffee +43 -0
  9. data/app/assets/javascripts/mtl/configuration.coffee.erb +1 -0
  10. data/app/assets/javascripts/mtl/document_modal.coffee +130 -0
  11. data/app/assets/javascripts/mtl/dropdown.coffee +24 -0
  12. data/app/assets/javascripts/mtl/hooks.coffee +14 -0
  13. data/app/assets/javascripts/mtl/icon.coffee.erb +17 -0
  14. data/app/assets/javascripts/mtl/modal.coffee +32 -0
  15. data/app/assets/javascripts/mtl/select.coffee +44 -0
  16. data/app/assets/javascripts/mtl/templates.coffee +4 -0
  17. data/app/assets/javascripts/mtl/toc.coffee +31 -0
  18. data/app/assets/javascripts/mtl.js +42 -0
  19. data/app/assets/stylesheets/mtl/all.scss +69 -0
  20. data/app/assets/stylesheets/mtl/extend/_avatars.scss +37 -0
  21. data/app/assets/stylesheets/mtl/extend/_buttons.scss +31 -0
  22. data/app/assets/stylesheets/mtl/extend/_cards.scss +21 -0
  23. data/app/assets/stylesheets/mtl/extend/_chips.scss +3 -0
  24. data/app/assets/stylesheets/mtl/extend/_collection-files.scss +108 -0
  25. data/app/assets/stylesheets/mtl/extend/_document-modals.scss +95 -0
  26. data/app/assets/stylesheets/mtl/extend/_dropdown.scss +12 -0
  27. data/app/assets/stylesheets/mtl/extend/_forms.scss +66 -0
  28. data/app/assets/stylesheets/mtl/extend/_global.scss +77 -0
  29. data/app/assets/stylesheets/mtl/extend/_grid.scss +25 -0
  30. data/app/assets/stylesheets/mtl/extend/_material-icons.scss +37 -0
  31. data/app/assets/stylesheets/mtl/extend/_mixins.scss +10 -0
  32. data/app/assets/stylesheets/mtl/extend/_roboto-rails.scss +49 -0
  33. data/app/assets/stylesheets/mtl/extend/_side-nav.scss +22 -0
  34. data/app/assets/stylesheets/mtl/extend/_toc.scss +12 -0
  35. data/app/assets/stylesheets/mtl/extend/_typography.scss +32 -0
  36. data/app/assets/stylesheets/mtl/extend/forms/_input-fields.scss +50 -0
  37. data/app/assets/stylesheets/mtl/layouts/_default.scss +220 -0
  38. data/app/assets/stylesheets/mtl/layouts/_single.scss +25 -0
  39. data/app/views/mtl/header.html.erb +25 -0
  40. data/bin/coffeelint.rb +16 -0
  41. data/lib/generators/mtl/install_generator.rb +20 -0
  42. data/lib/generators/mtl/templates/_color.scss +410 -0
  43. data/lib/generators/mtl/templates/_variables.scss +330 -0
  44. data/lib/generators/mtl/templates/mtl.scss +8 -0
  45. data/lib/generators/mtl/templates/simple_form.rb +211 -0
  46. data/lib/mtl/rails/card_file_presenter.rb +70 -0
  47. data/lib/mtl/rails/view_helpers.rb +412 -0
  48. data/lib/mtl/simple_form/suffix.rb +52 -0
  49. data/lib/mtl/version.rb +6 -0
  50. data/lib/mtl.rb +38 -0
  51. data/mtl.gemspec +35 -0
  52. data/package.json +11 -0
  53. data/spec/mtl/rails/card_file_presenter_spec.rb +126 -0
  54. data/spec/mtl/rails/view_helpers_spec.rb +193 -0
  55. data/spec/mtl/simple_form/suffix_spec.rb +39 -0
  56. data/spec/mtl_spec.rb +34 -0
  57. data/spec/spec_helper.rb +18 -0
  58. data/spec/support/dom.rb +15 -0
  59. data/vendor/assets/fonts/material-icons/MaterialIcons-Regular.eot +0 -0
  60. data/vendor/assets/fonts/material-icons/MaterialIcons-Regular.ijmap +1 -0
  61. data/vendor/assets/fonts/material-icons/MaterialIcons-Regular.svg +2373 -0
  62. data/vendor/assets/fonts/material-icons/MaterialIcons-Regular.ttf +0 -0
  63. data/vendor/assets/fonts/material-icons/MaterialIcons-Regular.woff +0 -0
  64. data/vendor/assets/fonts/material-icons/MaterialIcons-Regular.woff2 +0 -0
  65. data/vendor/assets/fonts/roboto/Roboto-Bold.eot +0 -0
  66. data/vendor/assets/fonts/roboto/Roboto-Bold.ttf +0 -0
  67. data/vendor/assets/fonts/roboto/Roboto-Bold.woff +0 -0
  68. data/vendor/assets/fonts/roboto/Roboto-Bold.woff2 +0 -0
  69. data/vendor/assets/fonts/roboto/Roboto-Light.eot +0 -0
  70. data/vendor/assets/fonts/roboto/Roboto-Light.ttf +0 -0
  71. data/vendor/assets/fonts/roboto/Roboto-Light.woff +0 -0
  72. data/vendor/assets/fonts/roboto/Roboto-Light.woff2 +0 -0
  73. data/vendor/assets/fonts/roboto/Roboto-Medium.eot +0 -0
  74. data/vendor/assets/fonts/roboto/Roboto-Medium.ttf +0 -0
  75. data/vendor/assets/fonts/roboto/Roboto-Medium.woff +0 -0
  76. data/vendor/assets/fonts/roboto/Roboto-Medium.woff2 +0 -0
  77. data/vendor/assets/fonts/roboto/Roboto-Regular.eot +0 -0
  78. data/vendor/assets/fonts/roboto/Roboto-Regular.ttf +0 -0
  79. data/vendor/assets/fonts/roboto/Roboto-Regular.woff +0 -0
  80. data/vendor/assets/fonts/roboto/Roboto-Regular.woff2 +0 -0
  81. data/vendor/assets/fonts/roboto/Roboto-Thin.eot +0 -0
  82. data/vendor/assets/fonts/roboto/Roboto-Thin.ttf +0 -0
  83. data/vendor/assets/fonts/roboto/Roboto-Thin.woff +0 -0
  84. data/vendor/assets/fonts/roboto/Roboto-Thin.woff2 +0 -0
  85. data/vendor/assets/javascripts/lodash.js +16607 -0
  86. data/vendor/assets/javascripts/materialize/animation.js +9 -0
  87. data/vendor/assets/javascripts/materialize/buttons.js +91 -0
  88. data/vendor/assets/javascripts/materialize/cards.js +26 -0
  89. data/vendor/assets/javascripts/materialize/carousel.js +454 -0
  90. data/vendor/assets/javascripts/materialize/character_counter.js +72 -0
  91. data/vendor/assets/javascripts/materialize/chips.js +267 -0
  92. data/vendor/assets/javascripts/materialize/collapsible.js +160 -0
  93. data/vendor/assets/javascripts/materialize/date_picker/picker.date.js +1430 -0
  94. data/vendor/assets/javascripts/materialize/date_picker/picker.js +1123 -0
  95. data/vendor/assets/javascripts/materialize/dropdown.js +265 -0
  96. data/vendor/assets/javascripts/materialize/forms.js +681 -0
  97. data/vendor/assets/javascripts/materialize/global.js +45 -0
  98. data/vendor/assets/javascripts/materialize/hammer.min.js +1 -0
  99. data/vendor/assets/javascripts/materialize/init.js +173 -0
  100. data/vendor/assets/javascripts/materialize/initial.js +11 -0
  101. data/vendor/assets/javascripts/materialize/jquery.easing.1.3.js +205 -0
  102. data/vendor/assets/javascripts/materialize/jquery.hammer.js +33 -0
  103. data/vendor/assets/javascripts/materialize/jquery.timeago.min.js +1 -0
  104. data/vendor/assets/javascripts/materialize/leanModal.js +192 -0
  105. data/vendor/assets/javascripts/materialize/materialbox.js +269 -0
  106. data/vendor/assets/javascripts/materialize/parallax.js +58 -0
  107. data/vendor/assets/javascripts/materialize/prism.js +8 -0
  108. data/vendor/assets/javascripts/materialize/pushpin.js +71 -0
  109. data/vendor/assets/javascripts/materialize/scrollFire.js +48 -0
  110. data/vendor/assets/javascripts/materialize/scrollspy.js +283 -0
  111. data/vendor/assets/javascripts/materialize/sideNav.js +352 -0
  112. data/vendor/assets/javascripts/materialize/slider.js +321 -0
  113. data/vendor/assets/javascripts/materialize/tabs.js +148 -0
  114. data/vendor/assets/javascripts/materialize/toasts.js +136 -0
  115. data/vendor/assets/javascripts/materialize/tooltip.js +230 -0
  116. data/vendor/assets/javascripts/materialize/transitions.js +169 -0
  117. data/vendor/assets/javascripts/materialize/velocity.min.js +5 -0
  118. data/vendor/assets/javascripts/materialize/waves.js +338 -0
  119. data/vendor/assets/javascripts/pdfobject.js +254 -0
  120. data/vendor/assets/stylesheets/materialize/_buttons.scss +211 -0
  121. data/vendor/assets/stylesheets/materialize/_cards.scss +185 -0
  122. data/vendor/assets/stylesheets/materialize/_carousel.scss +85 -0
  123. data/vendor/assets/stylesheets/materialize/_chips.scss +74 -0
  124. data/vendor/assets/stylesheets/materialize/_collapsible.scss +90 -0
  125. data/vendor/assets/stylesheets/materialize/_color.scss +412 -0
  126. data/vendor/assets/stylesheets/materialize/_dropdown.scss +57 -0
  127. data/vendor/assets/stylesheets/materialize/_global.scss +781 -0
  128. data/vendor/assets/stylesheets/materialize/_grid.scss +147 -0
  129. data/vendor/assets/stylesheets/materialize/_icons-material-design.scss +5 -0
  130. data/vendor/assets/stylesheets/materialize/_materialbox.scss +42 -0
  131. data/vendor/assets/stylesheets/materialize/_mixins.scss +5 -0
  132. data/vendor/assets/stylesheets/materialize/_modal.scss +90 -0
  133. data/vendor/assets/stylesheets/materialize/_navbar.scss +182 -0
  134. data/vendor/assets/stylesheets/materialize/_normalize.scss +424 -0
  135. data/vendor/assets/stylesheets/materialize/_prefixer.scss +384 -0
  136. data/vendor/assets/stylesheets/materialize/_preloader.scss +334 -0
  137. data/vendor/assets/stylesheets/materialize/_roboto.scss +49 -0
  138. data/vendor/assets/stylesheets/materialize/_sideNav.scss +219 -0
  139. data/vendor/assets/stylesheets/materialize/_slider.scss +92 -0
  140. data/vendor/assets/stylesheets/materialize/_table_of_contents.scss +33 -0
  141. data/vendor/assets/stylesheets/materialize/_tabs.scss +56 -0
  142. data/vendor/assets/stylesheets/materialize/_toast.scss +65 -0
  143. data/vendor/assets/stylesheets/materialize/_tooltip.scss +32 -0
  144. data/vendor/assets/stylesheets/materialize/_typography.scss +61 -0
  145. data/vendor/assets/stylesheets/materialize/_variables.scss +313 -0
  146. data/vendor/assets/stylesheets/materialize/_waves.scss +177 -0
  147. data/vendor/assets/stylesheets/materialize/date_picker/_default.date.scss +435 -0
  148. data/vendor/assets/stylesheets/materialize/date_picker/_default.scss +201 -0
  149. data/vendor/assets/stylesheets/materialize/date_picker/_default.time.scss +125 -0
  150. data/vendor/assets/stylesheets/materialize/forms/_checkboxes.scss +220 -0
  151. data/vendor/assets/stylesheets/materialize/forms/_file-input.scss +38 -0
  152. data/vendor/assets/stylesheets/materialize/forms/_forms.scss +22 -0
  153. data/vendor/assets/stylesheets/materialize/forms/_input-fields.scss +273 -0
  154. data/vendor/assets/stylesheets/materialize/forms/_radio-buttons.scss +119 -0
  155. data/vendor/assets/stylesheets/materialize/forms/_range.scss +159 -0
  156. data/vendor/assets/stylesheets/materialize/forms/_select.scss +116 -0
  157. data/vendor/assets/stylesheets/materialize/forms/_switches.scss +78 -0
  158. metadata +309 -0
@@ -0,0 +1,9 @@
1
+ // Custom Easing
2
+ jQuery.extend( jQuery.easing,
3
+ {
4
+ easeInOutMaterial: function (x, t, b, c, d) {
5
+ if ((t/=d/2) < 1) return c/2*t*t + b;
6
+ return c/4*((t-=2)*t*t + 2) + b;
7
+ }
8
+ });
9
+
@@ -0,0 +1,91 @@
1
+ (function ($) {
2
+ $(document).ready(function() {
3
+
4
+ // jQuery reverse
5
+ $.fn.reverse = [].reverse;
6
+
7
+ // Hover behaviour: make sure this doesn't work on .click-to-toggle FABs!
8
+ $(document).on('mouseenter.fixedActionBtn', '.fixed-action-btn:not(.click-to-toggle)', function(e) {
9
+ var $this = $(this);
10
+ openFABMenu($this);
11
+ });
12
+ $(document).on('mouseleave.fixedActionBtn', '.fixed-action-btn:not(.click-to-toggle)', function(e) {
13
+ var $this = $(this);
14
+ closeFABMenu($this);
15
+ });
16
+
17
+ // Toggle-on-click behaviour.
18
+ $(document).on('click.fixedActionBtn', '.fixed-action-btn.click-to-toggle > a', function(e) {
19
+ var $this = $(this);
20
+ var $menu = $this.parent();
21
+ if ($menu.hasClass('active')) {
22
+ closeFABMenu($menu);
23
+ } else {
24
+ openFABMenu($menu);
25
+ }
26
+ });
27
+
28
+ });
29
+
30
+ $.fn.extend({
31
+ openFAB: function() {
32
+ openFABMenu($(this));
33
+ },
34
+ closeFAB: function() {
35
+ closeFABMenu($(this));
36
+ }
37
+ });
38
+
39
+
40
+ var openFABMenu = function (btn) {
41
+ $this = btn;
42
+ if ($this.hasClass('active') === false) {
43
+
44
+ // Get direction option
45
+ var horizontal = $this.hasClass('horizontal');
46
+ var offsetY, offsetX;
47
+
48
+ if (horizontal === true) {
49
+ offsetX = 40;
50
+ } else {
51
+ offsetY = 40;
52
+ }
53
+
54
+ $this.addClass('active');
55
+ $this.find('ul .btn-floating').velocity(
56
+ { scaleY: ".4", scaleX: ".4", translateY: offsetY + 'px', translateX: offsetX + 'px'},
57
+ { duration: 0 });
58
+
59
+ var time = 0;
60
+ $this.find('ul .btn-floating').reverse().each( function () {
61
+ $(this).velocity(
62
+ { opacity: "1", scaleX: "1", scaleY: "1", translateY: "0", translateX: '0'},
63
+ { duration: 80, delay: time });
64
+ time += 40;
65
+ });
66
+ }
67
+ };
68
+
69
+ var closeFABMenu = function (btn) {
70
+ $this = btn;
71
+ // Get direction option
72
+ var horizontal = $this.hasClass('horizontal');
73
+ var offsetY, offsetX;
74
+
75
+ if (horizontal === true) {
76
+ offsetX = 40;
77
+ } else {
78
+ offsetY = 40;
79
+ }
80
+
81
+ $this.removeClass('active');
82
+ var time = 0;
83
+ $this.find('ul .btn-floating').velocity("stop", true);
84
+ $this.find('ul .btn-floating').velocity(
85
+ { opacity: "0", scaleX: ".4", scaleY: ".4", translateY: offsetY + 'px', translateX: offsetX + 'px'},
86
+ { duration: 80 }
87
+ );
88
+ };
89
+
90
+
91
+ }( jQuery ));
@@ -0,0 +1,26 @@
1
+ (function ($) {
2
+ $(document).ready(function() {
3
+
4
+ $(document).on('click.card', '.card', function (e) {
5
+ if ($(this).find('> .card-reveal').length) {
6
+ if ($(e.target).is($('.card-reveal .card-title')) || $(e.target).is($('.card-reveal .card-title i'))) {
7
+ // Make Reveal animate down and display none
8
+ $(this).find('.card-reveal').velocity(
9
+ {translateY: 0}, {
10
+ duration: 225,
11
+ queue: false,
12
+ easing: 'easeInOutQuad',
13
+ complete: function() { $(this).css({ display: 'none'}); }
14
+ }
15
+ );
16
+ }
17
+ else if ($(e.target).is($('.card .activator')) ||
18
+ $(e.target).is($('.card .activator i')) ) {
19
+ $(e.target).closest('.card').css('overflow', 'hidden');
20
+ $(this).find('.card-reveal').css({ display: 'block'}).velocity("stop", false).velocity({translateY: '-100%'}, {duration: 300, queue: false, easing: 'easeInOutQuad'});
21
+ }
22
+ }
23
+ });
24
+
25
+ });
26
+ }( jQuery ));
@@ -0,0 +1,454 @@
1
+ (function ($) {
2
+
3
+ var methods = {
4
+
5
+ init : function(options) {
6
+ var defaults = {
7
+ time_constant: 200, // ms
8
+ dist: -100, // zoom scale TODO: make this more intuitive as an option
9
+ shift: 0, // spacing for center image
10
+ padding: 0, // Padding between non center items
11
+ full_width: false, // Change to full width styles
12
+ indicators: false, // Toggle indicators
13
+ no_wrap: false // Don't wrap around and cycle through items.
14
+ };
15
+ options = $.extend(defaults, options);
16
+
17
+ return this.each(function() {
18
+
19
+ var images, offset, center, pressed, dim, count,
20
+ reference, referenceY, amplitude, target, velocity,
21
+ xform, frame, timestamp, ticker, dragged, vertical_dragged;
22
+ var $indicators = $('<ul class="indicators"></ul>');
23
+
24
+
25
+ // Initialize
26
+ var view = $(this);
27
+ var showIndicators = view.attr('data-indicators') || options.indicators;
28
+
29
+ // Don't double initialize.
30
+ if (view.hasClass('initialized')) {
31
+ // Redraw carousel.
32
+ $(this).trigger('carouselNext', [0.000001]);
33
+ return true;
34
+ }
35
+
36
+
37
+ // Options
38
+ if (options.full_width) {
39
+ options.dist = 0;
40
+ var firstImage = view.find('.carousel-item img').first();
41
+ if (firstImage.length) {
42
+ imageHeight = firstImage.load(function(){
43
+ view.css('height', $(this).height());
44
+ });
45
+ } else {
46
+ imageHeight = view.find('.carousel-item').first().height();
47
+ view.css('height', imageHeight);
48
+ }
49
+
50
+ // Offset fixed items when indicators.
51
+ if (showIndicators) {
52
+ view.find('.carousel-fixed-item').addClass('with-indicators');
53
+ }
54
+ }
55
+
56
+
57
+ view.addClass('initialized');
58
+ pressed = false;
59
+ offset = target = 0;
60
+ images = [];
61
+ item_width = view.find('.carousel-item').first().innerWidth();
62
+ dim = item_width * 2 + options.padding;
63
+
64
+ view.find('.carousel-item').each(function (i) {
65
+ images.push($(this)[0]);
66
+ if (showIndicators) {
67
+ var $indicator = $('<li class="indicator-item"></li>');
68
+
69
+ // Add active to first by default.
70
+ if (i === 0) {
71
+ $indicator.addClass('active');
72
+ }
73
+
74
+ // Handle clicks on indicators.
75
+ $indicator.click(function () {
76
+ var index = $(this).index();
77
+ cycleTo(index);
78
+ });
79
+ $indicators.append($indicator);
80
+ }
81
+ });
82
+
83
+ if (showIndicators) {
84
+ view.append($indicators);
85
+ }
86
+ count = images.length;
87
+
88
+
89
+ function setupEvents() {
90
+ if (typeof window.ontouchstart !== 'undefined') {
91
+ view[0].addEventListener('touchstart', tap);
92
+ view[0].addEventListener('touchmove', drag);
93
+ view[0].addEventListener('touchend', release);
94
+ }
95
+ view[0].addEventListener('mousedown', tap);
96
+ view[0].addEventListener('mousemove', drag);
97
+ view[0].addEventListener('mouseup', release);
98
+ view[0].addEventListener('mouseleave', release);
99
+ view[0].addEventListener('click', click);
100
+ }
101
+
102
+ function xpos(e) {
103
+ // touch event
104
+ if (e.targetTouches && (e.targetTouches.length >= 1)) {
105
+ return e.targetTouches[0].clientX;
106
+ }
107
+
108
+ // mouse event
109
+ return e.clientX;
110
+ }
111
+
112
+ function ypos(e) {
113
+ // touch event
114
+ if (e.targetTouches && (e.targetTouches.length >= 1)) {
115
+ return e.targetTouches[0].clientY;
116
+ }
117
+
118
+ // mouse event
119
+ return e.clientY;
120
+ }
121
+
122
+ function wrap(x) {
123
+ return (x >= count) ? (x % count) : (x < 0) ? wrap(count + (x % count)) : x;
124
+ }
125
+
126
+ function scroll(x) {
127
+ var i, half, delta, dir, tween, el, alignment, xTranslation;
128
+
129
+ offset = (typeof x === 'number') ? x : offset;
130
+ center = Math.floor((offset + dim / 2) / dim);
131
+ delta = offset - center * dim;
132
+ dir = (delta < 0) ? 1 : -1;
133
+ tween = -dir * delta * 2 / dim;
134
+ half = count >> 1;
135
+
136
+ if (!options.full_width) {
137
+ alignment = 'translateX(' + (view[0].clientWidth - item_width) / 2 + 'px) ';
138
+ alignment += 'translateY(' + (view[0].clientHeight - item_width) / 2 + 'px)';
139
+ } else {
140
+ alignment = 'translateX(0)';
141
+ }
142
+
143
+ // Set indicator active
144
+ if (showIndicators) {
145
+ var diff = (center % count);
146
+ var activeIndicator = $indicators.find('.indicator-item.active');
147
+ if (activeIndicator.index() !== diff) {
148
+ activeIndicator.removeClass('active');
149
+ $indicators.find('.indicator-item').eq(diff).addClass('active');
150
+ }
151
+ }
152
+
153
+ // center
154
+ // Don't show wrapped items.
155
+ if (!options.no_wrap || (center >= 0 && center < count)) {
156
+ el = images[wrap(center)];
157
+ el.style[xform] = alignment +
158
+ ' translateX(' + (-delta / 2) + 'px)' +
159
+ ' translateX(' + (dir * options.shift * tween * i) + 'px)' +
160
+ ' translateZ(' + (options.dist * tween) + 'px)';
161
+ el.style.zIndex = 0;
162
+ if (options.full_width) { tweenedOpacity = 1; }
163
+ else { tweenedOpacity = 1 - 0.2 * tween; }
164
+ el.style.opacity = tweenedOpacity;
165
+ el.style.display = 'block';
166
+ }
167
+
168
+ for (i = 1; i <= half; ++i) {
169
+ // right side
170
+ if (options.full_width) {
171
+ zTranslation = options.dist;
172
+ tweenedOpacity = (i === half && delta < 0) ? 1 - tween : 1;
173
+ } else {
174
+ zTranslation = options.dist * (i * 2 + tween * dir);
175
+ tweenedOpacity = 1 - 0.2 * (i * 2 + tween * dir);
176
+ }
177
+ // Don't show wrapped items.
178
+ if (!options.no_wrap || center + i < count) {
179
+ el = images[wrap(center + i)];
180
+ el.style[xform] = alignment +
181
+ ' translateX(' + (options.shift + (dim * i - delta) / 2) + 'px)' +
182
+ ' translateZ(' + zTranslation + 'px)';
183
+ el.style.zIndex = -i;
184
+ el.style.opacity = tweenedOpacity;
185
+ el.style.display = 'block';
186
+ }
187
+
188
+
189
+ // left side
190
+ if (options.full_width) {
191
+ zTranslation = options.dist;
192
+ tweenedOpacity = (i === half && delta > 0) ? 1 - tween : 1;
193
+ } else {
194
+ zTranslation = options.dist * (i * 2 - tween * dir);
195
+ tweenedOpacity = 1 - 0.2 * (i * 2 - tween * dir);
196
+ }
197
+ // Don't show wrapped items.
198
+ if (!options.no_wrap || center - i >= 0) {
199
+ el = images[wrap(center - i)];
200
+ el.style[xform] = alignment +
201
+ ' translateX(' + (-options.shift + (-dim * i - delta) / 2) + 'px)' +
202
+ ' translateZ(' + zTranslation + 'px)';
203
+ el.style.zIndex = -i;
204
+ el.style.opacity = tweenedOpacity;
205
+ el.style.display = 'block';
206
+ }
207
+ }
208
+
209
+ // center
210
+ // Don't show wrapped items.
211
+ if (!options.no_wrap || (center >= 0 && center < count)) {
212
+ el = images[wrap(center)];
213
+ el.style[xform] = alignment +
214
+ ' translateX(' + (-delta / 2) + 'px)' +
215
+ ' translateX(' + (dir * options.shift * tween) + 'px)' +
216
+ ' translateZ(' + (options.dist * tween) + 'px)';
217
+ el.style.zIndex = 0;
218
+ if (options.full_width) { tweenedOpacity = 1; }
219
+ else { tweenedOpacity = 1 - 0.2 * tween; }
220
+ el.style.opacity = tweenedOpacity;
221
+ el.style.display = 'block';
222
+ }
223
+ }
224
+
225
+ function track() {
226
+ var now, elapsed, delta, v;
227
+
228
+ now = Date.now();
229
+ elapsed = now - timestamp;
230
+ timestamp = now;
231
+ delta = offset - frame;
232
+ frame = offset;
233
+
234
+ v = 1000 * delta / (1 + elapsed);
235
+ velocity = 0.8 * v + 0.2 * velocity;
236
+ }
237
+
238
+ function autoScroll() {
239
+ var elapsed, delta;
240
+
241
+ if (amplitude) {
242
+ elapsed = Date.now() - timestamp;
243
+ delta = amplitude * Math.exp(-elapsed / options.time_constant);
244
+ if (delta > 2 || delta < -2) {
245
+ scroll(target - delta);
246
+ requestAnimationFrame(autoScroll);
247
+ } else {
248
+ scroll(target);
249
+ }
250
+ }
251
+ }
252
+
253
+ function click(e) {
254
+ // Disable clicks if carousel was dragged.
255
+ if (dragged) {
256
+ e.preventDefault();
257
+ e.stopPropagation();
258
+ return false;
259
+
260
+ } else if (!options.full_width) {
261
+ var clickedIndex = $(e.target).closest('.carousel-item').index();
262
+ var diff = (center % count) - clickedIndex;
263
+
264
+ // Disable clicks if carousel was shifted by click
265
+ if (diff !== 0) {
266
+ e.preventDefault();
267
+ e.stopPropagation();
268
+ }
269
+ cycleTo(clickedIndex);
270
+ }
271
+ }
272
+
273
+ function cycleTo(n) {
274
+ var diff = (center % count) - n;
275
+
276
+ // Account for wraparound.
277
+ if (!options.no_wrap) {
278
+ if (diff < 0) {
279
+ if (Math.abs(diff + count) < Math.abs(diff)) { diff += count; }
280
+
281
+ } else if (diff > 0) {
282
+ if (Math.abs(diff - count) < diff) { diff -= count; }
283
+ }
284
+ }
285
+
286
+ // Call prev or next accordingly.
287
+ if (diff < 0) {
288
+ view.trigger('carouselNext', [Math.abs(diff)]);
289
+
290
+ } else if (diff > 0) {
291
+ view.trigger('carouselPrev', [diff]);
292
+ }
293
+ }
294
+
295
+ function tap(e) {
296
+ pressed = true;
297
+ dragged = false;
298
+ vertical_dragged = false;
299
+ reference = xpos(e);
300
+ referenceY = ypos(e);
301
+
302
+ velocity = amplitude = 0;
303
+ frame = offset;
304
+ timestamp = Date.now();
305
+ clearInterval(ticker);
306
+ ticker = setInterval(track, 100);
307
+
308
+ }
309
+
310
+ function drag(e) {
311
+ var x, delta, deltaY;
312
+ if (pressed) {
313
+ x = xpos(e);
314
+ y = ypos(e);
315
+ delta = reference - x;
316
+ deltaY = Math.abs(referenceY - y);
317
+ if (deltaY < 30 && !vertical_dragged) {
318
+ // If vertical scrolling don't allow dragging.
319
+ if (delta > 2 || delta < -2) {
320
+ dragged = true;
321
+ reference = x;
322
+ scroll(offset + delta);
323
+ }
324
+
325
+ } else if (dragged) {
326
+ // If dragging don't allow vertical scroll.
327
+ e.preventDefault();
328
+ e.stopPropagation();
329
+ return false;
330
+
331
+ } else {
332
+ // Vertical scrolling.
333
+ vertical_dragged = true;
334
+ }
335
+ }
336
+
337
+ if (dragged) {
338
+ // If dragging don't allow vertical scroll.
339
+ e.preventDefault();
340
+ e.stopPropagation();
341
+ return false;
342
+ }
343
+ }
344
+
345
+ function release(e) {
346
+ if (pressed) {
347
+ pressed = false;
348
+ } else {
349
+ return;
350
+ }
351
+
352
+ clearInterval(ticker);
353
+ target = offset;
354
+ if (velocity > 10 || velocity < -10) {
355
+ amplitude = 0.9 * velocity;
356
+ target = offset + amplitude;
357
+ }
358
+ target = Math.round(target / dim) * dim;
359
+
360
+ // No wrap of items.
361
+ if (options.no_wrap) {
362
+ if (target >= dim * (count - 1)) {
363
+ target = dim * (count - 1);
364
+ } else if (target < 0) {
365
+ target = 0;
366
+ }
367
+ }
368
+ amplitude = target - offset;
369
+ timestamp = Date.now();
370
+ requestAnimationFrame(autoScroll);
371
+
372
+ if (dragged) {
373
+ e.preventDefault();
374
+ e.stopPropagation();
375
+ }
376
+ return false;
377
+ }
378
+
379
+ xform = 'transform';
380
+ ['webkit', 'Moz', 'O', 'ms'].every(function (prefix) {
381
+ var e = prefix + 'Transform';
382
+ if (typeof document.body.style[e] !== 'undefined') {
383
+ xform = e;
384
+ return false;
385
+ }
386
+ return true;
387
+ });
388
+
389
+
390
+
391
+ window.onresize = scroll;
392
+
393
+ setupEvents();
394
+ scroll(offset);
395
+
396
+ $(this).on('carouselNext', function(e, n) {
397
+ if (n === undefined) {
398
+ n = 1;
399
+ }
400
+ target = offset + dim * n;
401
+ if (offset !== target) {
402
+ amplitude = target - offset;
403
+ timestamp = Date.now();
404
+ requestAnimationFrame(autoScroll);
405
+ }
406
+ });
407
+
408
+ $(this).on('carouselPrev', function(e, n) {
409
+ if (n === undefined) {
410
+ n = 1;
411
+ }
412
+ target = offset - dim * n;
413
+ if (offset !== target) {
414
+ amplitude = target - offset;
415
+ timestamp = Date.now();
416
+ requestAnimationFrame(autoScroll);
417
+ }
418
+ });
419
+
420
+ $(this).on('carouselSet', function(e, n) {
421
+ if (n === undefined) {
422
+ n = 0;
423
+ }
424
+ cycleTo(n);
425
+ });
426
+
427
+ });
428
+
429
+
430
+
431
+ },
432
+ next : function(n) {
433
+ $(this).trigger('carouselNext', [n]);
434
+ },
435
+ prev : function(n) {
436
+ $(this).trigger('carouselPrev', [n]);
437
+ },
438
+ set : function(n) {
439
+ $(this).trigger('carouselSet', [n]);
440
+ }
441
+ };
442
+
443
+
444
+ $.fn.carousel = function(methodOrOptions) {
445
+ if ( methods[methodOrOptions] ) {
446
+ return methods[ methodOrOptions ].apply( this, Array.prototype.slice.call( arguments, 1 ));
447
+ } else if ( typeof methodOrOptions === 'object' || ! methodOrOptions ) {
448
+ // Default to "init"
449
+ return methods.init.apply( this, arguments );
450
+ } else {
451
+ $.error( 'Method ' + methodOrOptions + ' does not exist on jQuery.carousel' );
452
+ }
453
+ }; // Plugin end
454
+ }( jQuery ));
@@ -0,0 +1,72 @@
1
+ (function ($) {
2
+
3
+ $.fn.characterCounter = function(){
4
+ return this.each(function(){
5
+ var $input = $(this);
6
+ var $counterElement = $input.parent().find('span[class="character-counter"]');
7
+
8
+ // character counter has already been added appended to the parent container
9
+ if ($counterElement.length) {
10
+ return;
11
+ }
12
+
13
+ var itHasLengthAttribute = $input.attr('length') !== undefined;
14
+
15
+ if(itHasLengthAttribute){
16
+ $input.on('input', updateCounter);
17
+ $input.on('focus', updateCounter);
18
+ $input.on('blur', removeCounterElement);
19
+
20
+ addCounterElement($input);
21
+ }
22
+
23
+ });
24
+ };
25
+
26
+ function updateCounter(){
27
+ var maxLength = +$(this).attr('length'),
28
+ actualLength = +$(this).val().length,
29
+ isValidLength = actualLength <= maxLength;
30
+
31
+ $(this).parent().find('span[class="character-counter"]')
32
+ .html( actualLength + '/' + maxLength);
33
+
34
+ addInputStyle(isValidLength, $(this));
35
+ }
36
+
37
+ function addCounterElement($input) {
38
+ var $counterElement = $input.parent().find('span[class="character-counter"]');
39
+
40
+ if ($counterElement.length) {
41
+ return;
42
+ }
43
+
44
+ $counterElement = $('<span/>')
45
+ .addClass('character-counter')
46
+ .css('float','right')
47
+ .css('font-size','12px')
48
+ .css('height', 1);
49
+
50
+ $input.parent().append($counterElement);
51
+ }
52
+
53
+ function removeCounterElement(){
54
+ $(this).parent().find('span[class="character-counter"]').html('');
55
+ }
56
+
57
+ function addInputStyle(isValidLength, $input){
58
+ var inputHasInvalidClass = $input.hasClass('invalid');
59
+ if (isValidLength && inputHasInvalidClass) {
60
+ $input.removeClass('invalid');
61
+ }
62
+ else if(!isValidLength && !inputHasInvalidClass){
63
+ $input.removeClass('valid');
64
+ $input.addClass('invalid');
65
+ }
66
+ }
67
+
68
+ $(document).ready(function(){
69
+ $('input, textarea').characterCounter();
70
+ });
71
+
72
+ }( jQuery ));