materialize-sass 0.95.3.4 → 0.96.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (30) hide show
  1. data/README.md +1 -1
  2. data/app/assets/javascripts/materialize-sprockets.js +2 -1
  3. data/app/assets/javascripts/materialize.js +832 -522
  4. data/app/assets/javascripts/materialize/character_counter.js +59 -0
  5. data/app/assets/javascripts/materialize/dropdown.js +64 -61
  6. data/app/assets/javascripts/materialize/forms.js +14 -0
  7. data/app/assets/javascripts/materialize/global.js +13 -0
  8. data/app/assets/javascripts/materialize/init.js +5 -1
  9. data/app/assets/javascripts/materialize/leanModal.js +4 -5
  10. data/app/assets/javascripts/materialize/parallax.js +9 -12
  11. data/app/assets/javascripts/materialize/scrollFire.js +24 -24
  12. data/app/assets/javascripts/materialize/toasts.js +6 -2
  13. data/app/assets/stylesheets/materialize/components/_buttons.scss +16 -7
  14. data/app/assets/stylesheets/materialize/components/_cards.scss +9 -9
  15. data/app/assets/stylesheets/materialize/components/_collapsible.scss +19 -1
  16. data/app/assets/stylesheets/materialize/components/_color.scss +3 -2
  17. data/app/assets/stylesheets/materialize/components/_dropdown.scss +16 -10
  18. data/app/assets/stylesheets/materialize/components/_form.scss +93 -5
  19. data/app/assets/stylesheets/materialize/components/_global.scss +37 -6
  20. data/app/assets/stylesheets/materialize/components/_modal.scss +2 -2
  21. data/app/assets/stylesheets/materialize/components/_navbar.scss +5 -7
  22. data/app/assets/stylesheets/materialize/components/_normalize.scss +2 -2
  23. data/app/assets/stylesheets/materialize/components/_prefixer.scss +4 -4
  24. data/app/assets/stylesheets/materialize/components/_sideNav.scss +6 -0
  25. data/app/assets/stylesheets/materialize/components/_tabs.scss +1 -2
  26. data/app/assets/stylesheets/materialize/components/_typography.scss +2 -1
  27. data/app/assets/stylesheets/materialize/components/_variables.scss +1 -0
  28. data/lib/materialize-sass/version.rb +1 -1
  29. metadata +16 -7
  30. checksums.yaml +0 -7
@@ -0,0 +1,59 @@
1
+ (function ($) {
2
+
3
+ $.fn.characterCounter = function(){
4
+ return this.each(function(){
5
+
6
+ itHasLengthAttribute = $(this).attr('length') != undefined;
7
+
8
+ if(itHasLengthAttribute){
9
+ $(this).on('input', updateCounter);
10
+ $(this).on('focus', updateCounter);
11
+ $(this).on('blur', removeCounterElement);
12
+
13
+ addCounterElement($(this));
14
+ }
15
+
16
+ });
17
+ };
18
+
19
+ function updateCounter(){
20
+ var maxLength = +$(this).attr('length'),
21
+ actualLength = +$(this).val().length,
22
+ isValidLength = actualLength <= maxLength;
23
+
24
+ $(this).parent().find('span[class="character-counter"]')
25
+ .html( actualLength + '/' + maxLength);
26
+
27
+ addInputStyle(isValidLength, $(this));
28
+ }
29
+
30
+ function addCounterElement($input){
31
+ $counterElement = $('<span/>')
32
+ .addClass('character-counter')
33
+ .css('float','right')
34
+ .css('font-size','12px')
35
+ .css('height', 1);
36
+
37
+ $input.parent().append($counterElement);
38
+ }
39
+
40
+ function removeCounterElement(){
41
+ $(this).parent().find('span[class="character-counter"]').html('');
42
+ }
43
+
44
+ function addInputStyle(isValidLength, $input){
45
+ inputHasInvalidClass = $input.hasClass('invalid');
46
+ if (isValidLength && inputHasInvalidClass) {
47
+ $input.removeClass('invalid');
48
+ }
49
+ else if(!isValidLength && !inputHasInvalidClass){
50
+ $input.removeClass('valid');
51
+ $input.addClass('invalid');
52
+ }
53
+ }
54
+
55
+ $(document).ready(function(){
56
+ $('input, textarea').characterCounter();
57
+ });
58
+
59
+ }( jQuery ));
@@ -7,7 +7,7 @@
7
7
  return this;
8
8
  };
9
9
 
10
- $.fn.dropdown = function (options) {
10
+ $.fn.dropdown = function (option) {
11
11
  var defaults = {
12
12
  inDuration: 300,
13
13
  outDuration: 225,
@@ -17,9 +17,9 @@
17
17
  belowOrigin: false
18
18
  }
19
19
 
20
- options = $.extend(defaults, options);
21
20
  this.each(function(){
22
21
  var origin = $(this);
22
+ var options = $.extend({}, defaults, option);
23
23
 
24
24
  // Dropdown menu
25
25
  var activates = $("#"+ origin.attr('data-activates'));
@@ -41,13 +41,16 @@
41
41
 
42
42
  updateOptions();
43
43
 
44
- // Move Dropdown menu to body. This allows for absolute positioning to work
45
- if ( !(activates.parent().is($('body'))) ) {
46
- activates.detach();
47
- $('body').append(activates);
44
+ // Attach dropdown to its activator
45
+ if (origin.hasClass('select-dropdown')) {
46
+ origin.after(activates)
48
47
  }
48
+ else {
49
+ origin.append(activates);
50
+ }
51
+
52
+
49
53
 
50
- var dropdownRealHeight = activates.height();
51
54
 
52
55
  /*
53
56
  Helper function to position and resize dropdown.
@@ -57,6 +60,7 @@
57
60
  // Check html data attributes
58
61
  updateOptions();
59
62
 
63
+ // Constrain width
60
64
  if (options.constrain_width == true) {
61
65
  activates.css('width', origin.outerWidth());
62
66
  }
@@ -71,79 +75,63 @@
71
75
  var width_difference = 0;
72
76
  var gutter_spacing = options.gutter;
73
77
 
78
+
74
79
  if (offsetLeft + activates.innerWidth() > $(window).width()) {
75
80
  width_difference = origin.innerWidth() - activates.innerWidth();
76
81
  gutter_spacing = gutter_spacing * -1;
77
82
  }
78
- if (elementOrParentIsFixed(origin[0])) {
83
+ // If fixed placement
84
+ if (Materialize.elementOrParentIsFixed(origin[0])) {
79
85
  activates.css({
80
- display: 'block',
81
- position: 'fixed',
82
- height: 0,
83
- top: origin.offset().top - $(window).scrollTop() + offset,
84
- left: origin.offset().left + width_difference + gutter_spacing
86
+ top: 0 + offset,
87
+ left: 0 + width_difference + gutter_spacing
85
88
  });
86
89
  }
90
+ // If relative placement
87
91
  else {
92
+
88
93
  activates.css({
89
- display: 'block',
90
- top: origin.offset().top + offset,
91
- left: origin.offset().left + width_difference + gutter_spacing,
92
- height: 0
94
+ position: 'absolute',
95
+ top: 0 + offset,
96
+ left: 0 + width_difference + gutter_spacing
93
97
  });
98
+
94
99
  }
95
- activates.velocity({opacity: 1}, {duration: options.inDuration, queue: false, easing: 'easeOutQuad'})
96
- .velocity(
97
- {
98
- height: dropdownRealHeight
99
- },
100
- {duration: options.inDuration,
100
+
101
+ // Show dropdown
102
+ activates.stop(true, true).css('opacity', 0)
103
+ .slideDown({
101
104
  queue: false,
105
+ duration: options.inDuration,
102
106
  easing: 'easeOutCubic',
103
- complete: function(){
104
- activates.css('overflow-y', 'auto')
107
+ complete: function() {
108
+ $(this).css('height', '');
105
109
  }
106
- });
107
- }
108
- function elementOrParentIsFixed(element) {
109
- var $element = $(element);
110
- var $checkElements = $element.add($element.parents());
111
- var isFixed = false;
112
- $checkElements.each(function(){
113
- if ($(this).css("position") === "fixed") {
114
- isFixed = true;
115
- return false;
116
- }
117
- });
118
- return isFixed;
110
+ })
111
+ .animate( {opacity: 1}, {queue: false, duration: options.inDuration, easing: 'easeOutSine'});
112
+
113
+
119
114
  }
120
115
 
116
+
121
117
  function hideDropdown() {
122
- activates.velocity(
123
- {
124
- opacity: 0
125
- },
126
- {
127
- duration: options.outDuration,
128
- easing: 'easeOutQuad',
129
- complete: function(){
130
- activates.css({
131
- display: 'none',
132
- 'overflow-y': ''
133
- });
134
- }
135
- });
118
+ activates.fadeOut(options.outDuration);
136
119
  }
137
120
 
121
+ activates.on('hover', function(e) {
122
+ e.stopPropagation();
123
+ });
124
+
138
125
  // Hover
139
126
  if (options.hover) {
127
+ origin.unbind('click.' + origin.attr('id'));
140
128
  // Hover handler to show dropdown
141
- origin.on('mouseover', function(e){ // Mouse over
129
+ origin.on('mouseenter', function(e){ // Mouse over
142
130
  placeDropdown();
143
131
  });
144
132
 
145
- // Document click handler
146
- activates.on('mouseleave', function(e){ // Mouse out
133
+ origin.on('mouseleave', function(e){ // Mouse out
134
+ activates.stop(true, true);
147
135
  hideDropdown();
148
136
  });
149
137
 
@@ -154,18 +142,33 @@
154
142
  // Click handler to show dropdown
155
143
  origin.unbind('click.' + origin.attr('id'));
156
144
  origin.bind('click.'+origin.attr('id'), function(e){
157
- if (origin[0] == e.currentTarget) {
158
-
145
+ // Handles case for select plugin
146
+ if (origin.hasClass('select-dropdown')) {
147
+ return false;
148
+ }
149
+ if ( origin[0] == e.currentTarget && ($(e.target).closest('.dropdown-content').length === 0) ) {
159
150
  e.preventDefault(); // Prevents button click from moving window
160
151
  placeDropdown();
161
- }
152
+ open = true;
162
153
 
163
- $(document).bind('click.'+ activates.attr('id'), function (e) {
164
- if (!activates.is(e.target) && !origin.is(e.target) && (!origin.find(e.target).length > 0) ) {
154
+ }
155
+ // If origin is clicked and menu is open, close menu
156
+ else {
157
+ if (open === true) {
165
158
  hideDropdown();
166
159
  $(document).unbind('click.' + activates.attr('id'));
160
+ open = false;
167
161
  }
168
- });
162
+ }
163
+ // If menu open, add click close handler to document
164
+ if (open === true) {
165
+ $(document).bind('click.'+ activates.attr('id'), function (e) {
166
+ if (!activates.is(e.target) && !origin.is(e.target) && (!origin.find(e.target).length > 0) ) {
167
+ hideDropdown();
168
+ $(document).unbind('click.' + activates.attr('id'));
169
+ }
170
+ });
171
+ }
169
172
  });
170
173
 
171
174
  } // End else
@@ -37,6 +37,7 @@
37
37
  $(document).on('reset', function(e) {
38
38
  if ($(e.target).is('form')) {
39
39
  $(this).find(input_selector).removeClass('valid').removeClass('invalid');
40
+ $(this).find(input_selector).siblings('label, i').removeClass('active');
40
41
 
41
42
  // Reset select
42
43
  $(this).find('select.initialized').each(function () {
@@ -227,9 +228,16 @@
227
228
  $('ul#select-options-'+lastID).remove();
228
229
  }
229
230
 
231
+ // If destroying the select, remove the selelct-id and reset it to it's uninitialized state.
232
+ if(callback === 'destroy') {
233
+ $select.data('select-id', null).removeClass('initialized');
234
+ return;
235
+ }
236
+
230
237
  var uniqueID = Materialize.guid();
231
238
  $select.data('select-id', uniqueID);
232
239
  var wrapper = $('<div class="select-wrapper"></div>');
240
+ wrapper.addClass($select.attr('class'));
233
241
  var options = $('<ul id="select-options-' + uniqueID+'" class="dropdown-content select-dropdown"></ul>');
234
242
  var selectOptions = $select.children('option');
235
243
  if ($select.find('option:selected') !== undefined) {
@@ -279,6 +287,12 @@
279
287
  if (!$select.is(':disabled')) {
280
288
  $newSelect.dropdown({"hover": false});
281
289
  }
290
+
291
+ // Copy tabindex
292
+ if ($select.attr('tabindex')) {
293
+ $($newSelect[0]).attr('tabindex', $select.attr('tabindex'));
294
+ }
295
+
282
296
  $select.addClass('initialized');
283
297
 
284
298
  $newSelect.on('focus', function(){
@@ -13,6 +13,19 @@ Materialize.guid = (function() {
13
13
  };
14
14
  })();
15
15
 
16
+ Materialize.elementOrParentIsFixed = function(element) {
17
+ var $element = $(element);
18
+ var $checkElements = $element.add($element.parents());
19
+ var isFixed = false;
20
+ $checkElements.each(function(){
21
+ if ($(this).css("position") === "fixed") {
22
+ isFixed = true;
23
+ return false;
24
+ }
25
+ });
26
+ return isFixed;
27
+ }
28
+
16
29
  // Velocity has conflicts when loaded with jQuery, this will check for it
17
30
  var Vel;
18
31
  if ($) { Vel = $.Velocity } else { Vel = Velocity};
@@ -8,9 +8,13 @@
8
8
  if (/^#[0-9A-F]{6}$/i.test(rgb)) { return rgb; }
9
9
 
10
10
  rgb = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
11
+
12
+ if (rgb === null) { return "N/A"; }
13
+
11
14
  function hex(x) {
12
15
  return ("0" + parseInt(x).toString(16)).slice(-2);
13
16
  }
17
+
14
18
  return "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);
15
19
  }
16
20
 
@@ -19,7 +23,7 @@
19
23
  var color = $(this).css('background-color'),
20
24
  classes = $(this).attr('class');
21
25
  $(this).html(rgb2hex(color) + " " + classes);
22
- if (classes.indexOf("darken") >= 0) {
26
+ if (classes.indexOf("darken") >= 0 || $(this).hasClass('black')) {
23
27
  $(this).css('color', 'rgba(255,255,255,.9');
24
28
  }
25
29
  });
@@ -7,8 +7,8 @@
7
7
 
8
8
  var defaults = {
9
9
  opacity: 0.5,
10
- in_duration: 300,
11
- out_duration: 200,
10
+ in_duration: 350,
11
+ out_duration: 250,
12
12
  ready: undefined,
13
13
  complete: undefined,
14
14
  dismissible: true
@@ -45,7 +45,6 @@
45
45
 
46
46
  // Define Bottom Sheet animation
47
47
  if ($(modal).hasClass('bottom-sheet')) {
48
- console.log("Bottom");
49
48
  $(modal).velocity({bottom: "0", opacity: 1}, {
50
49
  duration: options.in_duration,
51
50
  queue: false,
@@ -80,7 +79,7 @@
80
79
  $.fn.extend({
81
80
  closeModal: function(options) {
82
81
  var defaults = {
83
- out_duration: 200,
82
+ out_duration: 250,
84
83
  complete: undefined
85
84
  }
86
85
  var options = $.extend(defaults, options);
@@ -130,7 +129,7 @@
130
129
  return this.each(function() {
131
130
  // Close Handlers
132
131
  $(this).click(function(e) {
133
- var modal_id = $(this).attr("href");
132
+ var modal_id = $(this).attr("href") || '#' + $(this).data('target');
134
133
  $(modal_id).openModal(options);
135
134
  e.preventDefault();
136
135
  }); // done set on click
@@ -7,20 +7,16 @@
7
7
  var $this = $(this);
8
8
  $this.addClass('parallax');
9
9
 
10
- $this.find('img').each(function () {
11
- $(this).css('background-image', 'url(' + $(this).attr('src') + ')' );
12
- $(this).attr('src', 'data:image/gif;base64,R0lGODlhAQABAIABAP///wAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==');
13
- });
14
-
15
10
  function updateParallax(initial) {
16
11
  var container_height;
17
- if (window_width < 992) {
12
+ if (window_width < 601) {
18
13
  container_height = ($this.height() > 0) ? $this.height() : $this.children("img").height();
19
14
  }
20
15
  else {
21
16
  container_height = ($this.height() > 0) ? $this.height() : 500;
22
17
  }
23
- var img_height = $this.children("img").height();
18
+ var $img = $this.children("img").first();
19
+ var img_height = $img.height();
24
20
  var parallax_dist = img_height - container_height;
25
21
  var bottom = $this.offset().top + container_height;
26
22
  var top = $this.offset().top;
@@ -28,14 +24,15 @@
28
24
  var windowHeight = window.innerHeight;
29
25
  var windowBottom = scrollTop + windowHeight;
30
26
  var percentScrolled = (windowBottom - top) / (container_height + windowHeight);
31
- var parallax = -1 * parallax_dist * percentScrolled;
27
+ var parallax = Math.round((parallax_dist * percentScrolled));
32
28
 
33
- if ((bottom > scrollTop) && (top < (scrollTop + windowHeight))) {
34
- $this.children("img").first().css('bottom', parallax + "px");
35
- }
36
29
  if (initial) {
37
- $this.children("img").first().css('display', 'block');
30
+ $img.css('display', 'block');
38
31
  }
32
+ if ((bottom > scrollTop) && (top < (scrollTop + windowHeight))) {
33
+ $img.css('transform', "translate3D(-50%," + parallax + "px, 0)");
34
+ }
35
+
39
36
  }
40
37
 
41
38
  // Wait for image load
@@ -12,32 +12,32 @@
12
12
 
13
13
  // Rate limit to 100ms
14
14
  setInterval(function() {
15
- if(didScroll) {
16
- didScroll = false;
17
-
18
- var windowScroll = window.pageYOffset + window.innerHeight;
19
-
20
- for (var i = 0 ; i < options.length; i++) {
21
- // Get options from each line
22
- var value = options[i];
23
- var selector = value.selector,
24
- offset = value.offset,
25
- callback = value.callback;
26
-
27
- var currentElement = document.querySelector(selector);
28
- if ( currentElement !== null) {
29
- var elementOffset = currentElement.getBoundingClientRect().top + document.body.scrollTop;
30
-
31
- if (windowScroll > (elementOffset + offset)) {
32
- if (value.done != true) {
33
- var callbackFunc = new Function(callback);
34
- callbackFunc();
35
- value.done = true;
36
- }
15
+ if(didScroll) {
16
+ didScroll = false;
17
+
18
+ var windowScroll = window.pageYOffset + window.innerHeight;
19
+
20
+ for (var i = 0 ; i < options.length; i++) {
21
+ // Get options from each line
22
+ var value = options[i];
23
+ var selector = value.selector,
24
+ offset = value.offset,
25
+ callback = value.callback;
26
+
27
+ var currentElement = document.querySelector(selector);
28
+ if ( currentElement !== null) {
29
+ var elementOffset = currentElement.getBoundingClientRect().top + document.body.scrollTop;
30
+
31
+ if (windowScroll > (elementOffset + offset)) {
32
+ if (value.done != true) {
33
+ var callbackFunc = new Function(callback);
34
+ callbackFunc();
35
+ value.done = true;
37
36
  }
38
37
  }
39
- };
40
- }
38
+ }
39
+ };
40
+ }
41
41
  }, 100);
42
42
 
43
43