gumbie 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +29 -0
  6. data/Rakefile +1 -0
  7. data/gumbie.gemspec +25 -0
  8. data/lib/gumbie/version.rb +3 -0
  9. data/lib/gumbie.rb +7 -0
  10. data/vendor/assets/fonts/icons/entypo.eot +0 -0
  11. data/vendor/assets/fonts/icons/entypo.ttf +0 -0
  12. data/vendor/assets/fonts/icons/entypo.woff +0 -0
  13. data/vendor/assets/javascripts/libs/gumby.init.js +47 -0
  14. data/vendor/assets/javascripts/libs/gumby.js +258 -0
  15. data/vendor/assets/javascripts/libs/gumby.min.js +1 -0
  16. data/vendor/assets/javascripts/libs/jquery-1.10.1.min.js +6 -0
  17. data/vendor/assets/javascripts/libs/jquery-1.10.1.min.map +1 -0
  18. data/vendor/assets/javascripts/libs/jquery-2.0.2.min.js +6 -0
  19. data/vendor/assets/javascripts/libs/jquery-2.0.2.min.map +1 -0
  20. data/vendor/assets/javascripts/libs/jquery.mobile.custom.min.js +3 -0
  21. data/vendor/assets/javascripts/libs/modernizr-2.6.2.min.js +4 -0
  22. data/vendor/assets/javascripts/libs/ui/gumby.checkbox.js +101 -0
  23. data/vendor/assets/javascripts/libs/ui/gumby.fixed.js +240 -0
  24. data/vendor/assets/javascripts/libs/ui/gumby.navbar.js +115 -0
  25. data/vendor/assets/javascripts/libs/ui/gumby.radiobtn.js +90 -0
  26. data/vendor/assets/javascripts/libs/ui/gumby.retina.js +81 -0
  27. data/vendor/assets/javascripts/libs/ui/gumby.skiplink.js +157 -0
  28. data/vendor/assets/javascripts/libs/ui/gumby.tabs.js +80 -0
  29. data/vendor/assets/javascripts/libs/ui/gumby.toggleswitch.js +264 -0
  30. data/vendor/assets/javascripts/libs/ui/jquery.validation.js +142 -0
  31. data/vendor/assets/javascripts/main.js +23 -0
  32. data/vendor/assets/javascripts/plugins.js +4 -0
  33. data/vendor/assets/stylesheets/gumby.css +1683 -0
  34. data/vendor/assets/stylesheets/style.css +4 -0
  35. metadata +134 -0
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Gumby Tabs
3
+ */
4
+ !function($) {
5
+
6
+ 'use strict';
7
+
8
+ function Tabs($el) {
9
+
10
+ Gumby.debug('Initializing Tabs', $el);
11
+
12
+ this.$el = $el;
13
+ this.$nav = this.$el.find('> ul.tab-nav > li');
14
+ this.$content = this.$el.children('.tab-content');
15
+
16
+ var scope = this;
17
+
18
+ // listen for click event on tab nav and custom gumby set event
19
+ this.$nav.children('a').on(Gumby.click, function(e) {
20
+ e.preventDefault();
21
+ scope.click($(this));
22
+ });
23
+
24
+ // listen for gumby.set value for dynamically set tabs
25
+ this.$el.on('gumby.set', function(e, index) {
26
+ Gumby.debug('Set event triggered', scope.$el);
27
+ scope.set(e, index);
28
+ });
29
+ }
30
+
31
+ // handle tab nav click event
32
+ Tabs.prototype.click = function($this) {
33
+ // index of item to activate
34
+ var index = $this.parent().index();
35
+
36
+ if(this.$nav.eq(index).add(this.$content.eq(index)).hasClass('active')) {
37
+ return;
38
+ }
39
+
40
+ Gumby.debug('Setting active tab to '+index, this.$el);
41
+
42
+ // deactivate other tab navigation and content
43
+ this.$nav.add(this.$content).removeClass('active');
44
+
45
+ // activate this tab nav link and content
46
+ this.$nav.eq(index).add(this.$content.eq(index)).addClass('active');
47
+
48
+ // trigger gumby.change event and pass current active tab index
49
+ Gumby.debug('Triggering onChange event', this.$el);
50
+ this.$el.trigger('gumby.onChange', index);
51
+ };
52
+
53
+ // set specific tab
54
+ Tabs.prototype.set = function(e, index) {
55
+ this.$nav.eq(index).find('a').trigger(Gumby.click);
56
+ };
57
+
58
+ // add initialisation
59
+ Gumby.addInitalisation('tabs', function() {
60
+ $('.tabs').each(function() {
61
+ var $this = $(this);
62
+ // this element has already been initialized
63
+ if($this.data('isTabs')) {
64
+ return true;
65
+ }
66
+ // mark element as initialized
67
+ $this.data('isTabs', true);
68
+ new Tabs($this);
69
+ });
70
+ });
71
+
72
+ // register UI module
73
+ Gumby.UIModule({
74
+ module: 'tabs',
75
+ events: ['onChange', 'set'],
76
+ init: function() {
77
+ Gumby.initialize('tabs');
78
+ }
79
+ });
80
+ }(jQuery);
@@ -0,0 +1,264 @@
1
+ /**
2
+ * Gumby Toggles/Switches
3
+ */
4
+ !function($) {
5
+
6
+ 'use strict';
7
+
8
+ // Toggle constructor
9
+ function Toggle($el) {
10
+ this.$el = $($el);
11
+ this.targets = [];
12
+ this.on = '';
13
+ this.className = '';
14
+ this.self = false;
15
+
16
+ if(this.$el.length) {
17
+ Gumby.debug('Initializing Toggle', $el);
18
+ this.init();
19
+ }
20
+ }
21
+
22
+ // Switch constructor
23
+ function Switch($el) {
24
+ this.$el = $($el);
25
+ this.targets = [];
26
+ this.on = '';
27
+ this.className = '';
28
+ this.self = false;
29
+
30
+ if(this.$el.length) {
31
+ Gumby.debug('Initializing Switch', $el);
32
+ this.init();
33
+ }
34
+ }
35
+
36
+ // intialise toggles, switches will inherit method
37
+ Toggle.prototype.init = function() {
38
+ var scope = this;
39
+
40
+ // set up module based on attributes
41
+ this.setup();
42
+
43
+ // bind to specified event and trigger
44
+ this.$el.on(this.on, function(e) {
45
+ e.preventDefault();
46
+ scope.trigger(scope.triggered);
47
+
48
+ // listen for gumby.trigger to dynamically trigger toggle/switch
49
+ }).on('gumby.trigger', function() {
50
+ Gumby.debug('Trigger event triggered', scope.$el);
51
+ scope.trigger(scope.triggered);
52
+ // re-initialize module
53
+ }).on('gumby.initialize', function() {
54
+ Gumby.debug('Re-initializing '+scope.constructor, $el);
55
+ scope.setup();
56
+ });
57
+ };
58
+
59
+ // set up module based on attributes
60
+ Toggle.prototype.setup = function() {
61
+ this.targets = this.parseTargets();
62
+ this.on = Gumby.selectAttr.apply(this.$el, ['on']) || Gumby.click;
63
+ this.className = Gumby.selectAttr.apply(this.$el, ['classname']) || 'active';
64
+ this.self = Gumby.selectAttr.apply(this.$el, ['self']) === 'false';
65
+ };
66
+
67
+ // parse data-for attribute, switches will inherit method
68
+ Toggle.prototype.parseTargets = function() {
69
+ var targetStr = Gumby.selectAttr.apply(this.$el, ['trigger']),
70
+ secondaryTargets = 0,
71
+ targets = [];
72
+
73
+ // no targets so return false
74
+ if(!targetStr) {
75
+ return false;
76
+ }
77
+
78
+ secondaryTargets = targetStr.indexOf('|');
79
+
80
+ // no secondary targets specified so return single target
81
+ if(secondaryTargets === -1) {
82
+ if(!this.checkTargets([targetStr])) {
83
+ return false;
84
+ }
85
+ return [$(targetStr)];
86
+ }
87
+
88
+ // return array of both targets, split and return 0, 1
89
+ targets = targetStr.split('|');
90
+ if(!this.checkTargets(targets)) {
91
+ return false;
92
+ }
93
+ return targets.length > 1 ? [$(targets[0]), $(targets[1])] : [$(targets[0])];
94
+ };
95
+
96
+ Toggle.prototype.checkTargets = function(targets) {
97
+ var i = 0;
98
+
99
+ for(i; i < targets.length; i++) {
100
+ if(targets[i] && !$(targets[i]).length) {
101
+ Gumby.error('Cannot find '+this.constructor.name+' target: '+targets[i]);
102
+ return false;
103
+ }
104
+ }
105
+
106
+ return true;
107
+ };
108
+
109
+ // call triggered event and pass target data
110
+ Toggle.prototype.triggered = function() {
111
+ // trigger gumby.onTrigger event and pass array of target status data
112
+ Gumby.debug('Triggering onTrigger event', this.$el);
113
+ this.$el.trigger('gumby.onTrigger', [this.$el.hasClass(this.className)]);
114
+ };
115
+
116
+ // Switch object inherits from Toggle
117
+ Switch.prototype = new Toggle();
118
+ Switch.prototype.constructor = Switch;
119
+
120
+ // Toggle specific trigger method
121
+ Toggle.prototype.trigger = function(cb) {
122
+
123
+ Gumby.debug('Triggering Toggle', this.$el);
124
+
125
+ var $target;
126
+
127
+ // no targets just toggle active class on toggle
128
+ if(!this.targets) {
129
+ this.$el.toggleClass(this.className);
130
+
131
+ // combine single target with toggle and toggle active class
132
+ } else if(this.targets.length == 1) {
133
+ this.$el.add(this.targets[0]).toggleClass(this.className);
134
+
135
+ // if two targets check active state of first
136
+ // always combine toggle and first target
137
+ } else if(this.targets.length > 1) {
138
+ if(this.targets[0].hasClass(this.className)) {
139
+ $target = this.targets[0];
140
+
141
+ // add this element to it unless gumby-self set
142
+ if(!this.self) {
143
+ $target = $target.add(this.$el);
144
+ }
145
+
146
+ $target.removeClass(this.className);
147
+ this.targets[1].addClass(this.className);
148
+ } else {
149
+ $target = this.targets[0];
150
+
151
+ // add this element to it unless gumby-self set
152
+ if(!this.self) {
153
+ $target = $target.add(this.$el);
154
+ }
155
+
156
+ $target.addClass(this.className);
157
+ this.targets[1].removeClass(this.className);
158
+ }
159
+ }
160
+
161
+ // call event handler here, applying scope of object Switch/Toggle
162
+ if(cb && typeof cb === 'function') {
163
+ cb.apply(this);
164
+ }
165
+ };
166
+
167
+ // Switch specific trigger method
168
+ Switch.prototype.trigger = function(cb) {
169
+
170
+ Gumby.debug('Triggering Switch', this.$el);
171
+
172
+ var $target;
173
+
174
+ // no targets just add active class to switch
175
+ if(!this.targets) {
176
+ this.$el.addClass(this.className);
177
+
178
+ // combine single target with switch and add active class
179
+ } else if(this.targets.length == 1) {
180
+ $target = this.targets[0];
181
+
182
+ // add this element to it unless gumby-self set
183
+ if(!this.self) {
184
+ $target = $target.add(this.$el);
185
+ }
186
+
187
+ $target.addClass(this.className);
188
+
189
+ // if two targets check active state of first
190
+ // always combine switch and first target
191
+ } else if(this.targets.length > 1) {
192
+ $target = this.targets[0];
193
+
194
+ // add this element to it unless gumby-self set
195
+ if(!this.self) {
196
+ $target = $target.add(this.$el);
197
+ }
198
+
199
+ $target.addClass(this.className);
200
+ this.targets[1].removeClass(this.className);
201
+ }
202
+
203
+ // call event handler here, applying scope of object Switch/Toggle
204
+ if(cb && typeof cb === 'function') {
205
+ cb.apply(this);
206
+ }
207
+ };
208
+
209
+ // add toggle initialisation
210
+ Gumby.addInitalisation('toggles', function(all) {
211
+ $('.toggle').each(function() {
212
+ var $this = $(this);
213
+
214
+ // this element has already been initialized
215
+ // and we're only initializing new modules
216
+ if($this.data('isToggle') && !all) {
217
+ return true;
218
+
219
+ // this element has already been initialized
220
+ // and we need to reinitialize it
221
+ } else if($this.data('isToggle') && all) {
222
+ $this.trigger('gumby.initialize');
223
+ }
224
+
225
+ // mark element as initialized
226
+ $this.data('isToggle', true);
227
+ new Toggle($this);
228
+ });
229
+ });
230
+
231
+ // add switches initialisation
232
+ Gumby.addInitalisation('switches', function(all) {
233
+ $('.switch').each(function() {
234
+ var $this = $(this);
235
+
236
+ // this element has already been initialized
237
+ // and we're only initializing new modules
238
+ if($this.data('isSwitch') && !all) {
239
+ return true;
240
+
241
+ // this element has already been initialized
242
+ // and we need to reinitialize it
243
+ } else if($this.data('isSwitch') && all) {
244
+ $this.trigger('gumby.initialize');
245
+ return true;
246
+ }
247
+
248
+ // mark element as initialized
249
+ $this.data('isSwitch', true);
250
+ new Switch($this);
251
+ });
252
+ });
253
+
254
+ // register UI module
255
+ Gumby.UIModule({
256
+ module: 'toggleswitch',
257
+ events: ['initialize', 'trigger', 'onTrigger'],
258
+ init: function() {
259
+ // Run initialize methods
260
+ Gumby.initialize('switches');
261
+ Gumby.initialize('toggles');
262
+ }
263
+ });
264
+ }(jQuery);
@@ -0,0 +1,142 @@
1
+ /**
2
+ * Gumby jQuery Validation Plugin
3
+ */
4
+ !function($) {
5
+
6
+ 'use strict';
7
+
8
+ function Validation($this, req) {
9
+
10
+ if(Gumby) {
11
+ Gumby.debug('Initializing Validation', $this);
12
+ }
13
+
14
+ // input and holder .field
15
+ this.$this = $this;
16
+ this.$field = this.$this.parents('.field');
17
+
18
+ // supplied validation function with default length check
19
+ this.req = req || function() {
20
+ return !!this.$this.val().length;
21
+ };
22
+
23
+ // reference to this class
24
+ var scope = this;
25
+
26
+ // checkboxes and radio buttons use gumby.onChange event to validate
27
+ if(this.$this.is('[type=checkbox], [type=radio]')) {
28
+ this.$field = this.$this.parent('label');
29
+ this.$field.on('gumby.onChange', function() {
30
+ scope.validate();
31
+ });
32
+
33
+ // selects validate on change
34
+ } else if(this.$this.is('select')) {
35
+ this.$field = this.$this.parents('.picker');
36
+ this.$field.on('change', function() {
37
+ scope.validate();
38
+ });
39
+
40
+ // others (text input, textarea) use blur
41
+ } else {
42
+ this.$this.on('blur', function(e) {
43
+ // ignore tab
44
+ if(e.which !== 9) {
45
+ scope.validate();
46
+ }
47
+ });
48
+ }
49
+ }
50
+
51
+ // validate field
52
+ Validation.prototype.validate = function() {
53
+
54
+ var result = this.req(this.$this);
55
+
56
+ // failed
57
+ if(!result) {
58
+ this.$field.removeClass('success').addClass('danger');
59
+
60
+ // passed
61
+ } else {
62
+ //} else if(this.$field.hasClass('danger')) {
63
+ this.$field.removeClass('danger').addClass('success');
64
+ }
65
+
66
+ return result;
67
+ };
68
+
69
+ // jQuery plugin definition
70
+ $.fn.validation = function(options) {
71
+
72
+ var // extend params with defaults
73
+ settings = $.extend({
74
+ submit : false,
75
+ fail: false,
76
+ required : []
77
+ }, options),
78
+ // store validation objects
79
+ validations = [];
80
+
81
+ // init each form plugin is called on
82
+ return this.each(function() {
83
+
84
+ // no required fields so plugin is pointless
85
+ if(!settings.required.length) {
86
+ return false;
87
+ }
88
+
89
+ var $this = $(this),
90
+ reqLength = settings.required.length,
91
+ i;
92
+
93
+ // loop round each required field and instantiate new validation object
94
+ for(i = 0; i < reqLength; i++) {
95
+ validations.push(new Validation(
96
+ $this.find('[name="'+settings.required[i].name+'"]'),
97
+ settings.required[i].validate || false
98
+ ));
99
+ }
100
+
101
+ // hijack submit event
102
+ $this.on('submit', function(e) {
103
+
104
+ // reference to whole form pass/fail
105
+ var failed = false;
106
+
107
+ // if no passed attribute found we should halt form submit
108
+ if(!$this.data('passed')) {
109
+ e.preventDefault();
110
+
111
+ // loop round validation objects and validate each
112
+ var reqLength = validations.length, i;
113
+ for(i = 0; i < reqLength; i++) {
114
+ if(!validations[i].validate()) {
115
+ failed = true;
116
+ }
117
+ }
118
+
119
+ // passed
120
+ if(!failed) {
121
+ // if submit method present call that otherwise submit form
122
+ if(settings.submit && typeof settings.submit === 'function') {
123
+ settings.submit($this.serializeArray());
124
+ return;
125
+ }
126
+
127
+ // store passed bool and re-submit
128
+ $this.data('passed', true).submit();
129
+
130
+ // failed
131
+ } else {
132
+ // call fail method if present
133
+ if(settings.fail && typeof settings.fail === 'function') {
134
+ settings.fail();
135
+ return;
136
+ }
137
+ }
138
+ }
139
+ });
140
+ });
141
+ };
142
+ }(jQuery);
@@ -0,0 +1,23 @@
1
+ // Gumby is ready to go
2
+ Gumby.ready(function() {
3
+ Gumby.log('Gumby is ready to go...', Gumby.dump());
4
+
5
+ // placeholder polyfil
6
+ if(Gumby.isOldie || Gumby.$dom.find('html').hasClass('ie9')) {
7
+ $('input, textarea').placeholder();
8
+ }
9
+
10
+ // skip link and toggle on one element
11
+ // when the skip link completes, trigger the switch
12
+ $('#skip-switch').on('gumby.onComplete', function() {
13
+ $(this).trigger('gumby.trigger');
14
+ });
15
+
16
+ // Oldie document loaded
17
+ }).oldie(function() {
18
+ Gumby.warn("This is an oldie browser...");
19
+
20
+ // Touch devices loaded
21
+ }).touch(function() {
22
+ Gumby.log("This is a touch enabled device...");
23
+ });
@@ -0,0 +1,4 @@
1
+ /*! http://mths.be/placeholder v2.0.7 by @mathias */
2
+ ;(function(f,h,$){var a='placeholder' in h.createElement('input'),d='placeholder' in h.createElement('textarea'),i=$.fn,c=$.valHooks,k,j;if(a&&d){j=i.placeholder=function(){return this};j.input=j.textarea=true}else{j=i.placeholder=function(){var l=this;l.filter((a?'textarea':':input')+'[placeholder]').not('.placeholder').bind({'focus.placeholder':b,'blur.placeholder':e}).data('placeholder-enabled',true).trigger('blur.placeholder');return l};j.input=a;j.textarea=d;k={get:function(m){var l=$(m);return l.data('placeholder-enabled')&&l.hasClass('placeholder')?'':m.value},set:function(m,n){var l=$(m);if(!l.data('placeholder-enabled')){return m.value=n}if(n==''){m.value=n;if(m!=h.activeElement){e.call(m)}}else{if(l.hasClass('placeholder')){b.call(m,true,n)||(m.value=n)}else{m.value=n}}return l}};a||(c.input=k);d||(c.textarea=k);$(function(){$(h).delegate('form','submit.placeholder',function(){var l=$('.placeholder',this).each(b);setTimeout(function(){l.each(e)},10)})});$(f).bind('beforeunload.placeholder',function(){$('.placeholder').each(function(){this.value=''})})}function g(m){var l={},n=/^jQuery\d+$/;$.each(m.attributes,function(p,o){if(o.specified&&!n.test(o.name)){l[o.name]=o.value}});return l}function b(m,n){var l=this,o=$(l);if(l.value==o.attr('placeholder')&&o.hasClass('placeholder')){if(o.data('placeholder-password')){o=o.hide().next().show().attr('id',o.removeAttr('id').data('placeholder-id'));if(m===true){return o[0].value=n}o.focus()}else{l.value='';o.removeClass('placeholder');l==h.activeElement&&l.select()}}}function e(){var q,l=this,p=$(l),m=p,o=this.id;if(l.value==''){if(l.type=='password'){if(!p.data('placeholder-textinput')){try{q=p.clone().attr({type:'text'})}catch(n){q=$('<input>').attr($.extend(g(this),{type:'text'}))}q.removeAttr('name').data({'placeholder-password':true,'placeholder-id':o}).bind('focus.placeholder',b);p.data({'placeholder-textinput':q,'placeholder-id':o}).before(q)}p=p.removeAttr('id').hide().prev().attr('id',o).show()}p.addClass('placeholder');p[0].value=p.attr('placeholder')}else{p.removeClass('placeholder')}}}(this,document,jQuery));
3
+
4
+ // place any jQuery/helper plugins in here, instead of separate, slower script files.