gumby 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/gumby/version.rb +1 -1
- data/vendor/assets/fonts/humans.txt +47 -0
- data/vendor/assets/javascripts/gumby.js +150 -129
- data/vendor/assets/javascripts/ui/gumby.checkbox.js +24 -22
- data/vendor/assets/javascripts/ui/gumby.fixed.js +50 -145
- data/vendor/assets/javascripts/ui/gumby.radiobtn.js +21 -14
- data/vendor/assets/javascripts/ui/gumby.tabs.js +0 -1
- data/vendor/assets/javascripts/ui/gumby.toggleswitch.js +34 -50
- metadata +2 -6
- data/vendor/assets/javascripts/gumby.init.js +0 -27
- data/vendor/assets/javascripts/gumby.min.js +0 -1
- data/vendor/assets/javascripts/ui/gumby.fittext.js +0 -107
- data/vendor/assets/javascripts/ui/gumby.navbar.js +0 -115
data/lib/gumby/version.rb
CHANGED
@@ -0,0 +1,47 @@
|
|
1
|
+
/* TEAM */
|
2
|
+
|
3
|
+
Digital Surgeons
|
4
|
+
Twitter: @digitalsurgeons
|
5
|
+
Twitter: @gumbycss
|
6
|
+
Web: www.digitalsurgeons.com
|
7
|
+
Web: www.gumbyframework.com
|
8
|
+
|
9
|
+
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
10
|
+
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
11
|
+
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
12
|
+
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:~~~====~,,,,,,,,,,,,,
|
13
|
+
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,=================+,,,,,,,,,,,,,
|
14
|
+
,,,,,,,,,,,,,,,,,,,,,,,,,,,,:==================,,,,,,,,,,,,,
|
15
|
+
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,+=================:,,,,,,,,,,,,
|
16
|
+
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,==================:,,,,,,,,,,,,
|
17
|
+
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~=================~,,,,,,,,,,,,
|
18
|
+
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~=================~,,,,,,,,,,,,
|
19
|
+
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,=================~,,,,,,,,,,,,
|
20
|
+
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,==================,,,,,,,,,,,,
|
21
|
+
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,==================,,,,,,,,,,,,
|
22
|
+
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,==================,,,,,,,,,,,,
|
23
|
+
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,==================,,,,,,,,,,,,
|
24
|
+
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,==================,,,,,,,,,,,,
|
25
|
+
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~==============:,,,,,,,,,,,,,,
|
26
|
+
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,==========:,,,,,,,,,,,,,,,,,,,
|
27
|
+
,,,,,,,,,,,,,,,,,,,,,,,,:~=========:,,,,,,,,,,,,,,,,,,,,,,,,
|
28
|
+
,,,,,,,,,,,,,,,,,:================,,,,,,,,,,,,,,,,,,,,,,,,,,
|
29
|
+
,,,,,,,,,,,,:=====================,,,,,,,,,,,,,,,,,,,,,,,,,,
|
30
|
+
,,,,,,,,,,,=======================,,,,,,,,,,,,,,,,,,,,,,,,,,
|
31
|
+
,,,,,,,,,,,=======================:,,,,,,,,,,,,,,,,,,,,,,,,,
|
32
|
+
,,,,,,,,,,,=======================~,,,,,,,,,,,,,,,,,,,,,,,,,
|
33
|
+
,,,,,,,,,,,,=~====================~,,,,,,,,,,,,,,,,,,,,,,,,,
|
34
|
+
,,,,,,,,,,,,=~~~~~~~~~~~~~~~~~~~~~=,,,,,,,,,,,,,,,,,,,,,,,,,
|
35
|
+
,,,,,,,,,,,,~~==~~~~~~~~~~~~~~=====,,,,,,,,,,,,,,,,,,,,,,,,,
|
36
|
+
,,,,,,,,,,,,,=~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,
|
37
|
+
,,,,,,,,,,,,,=~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,
|
38
|
+
,,,,,,,,,,,,,,~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,
|
39
|
+
,,,,,,,,,,,,,,~~~~~~~~~~~~~~~~:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
40
|
+
,,,,,,,,,,,,,,~~~~~~~~~~~~~:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
41
|
+
,,,,,,,,,,,,,,,~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
42
|
+
,,,,,,,,,,,,,,,~~~~:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
43
|
+
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
44
|
+
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,..
|
45
|
+
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,....
|
46
|
+
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.....
|
47
|
+
|
@@ -17,134 +17,155 @@
|
|
17
17
|
*/
|
18
18
|
!function() {
|
19
19
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
20
|
+
'use strict';
|
21
|
+
|
22
|
+
function Gumby() {
|
23
|
+
this.$dom = $(document);
|
24
|
+
this.isOldie = !!this.$dom.find('html').hasClass('oldie');
|
25
|
+
this.click = this.detectClickEvent();
|
26
|
+
this.uiModules = {};
|
27
|
+
this.inits = {};
|
28
|
+
this.onReady = false;
|
29
|
+
this.onOldie = false;
|
30
|
+
|
31
|
+
var scope = this;
|
32
|
+
|
33
|
+
// when document is ready init
|
34
|
+
this.$dom.ready(function() {
|
35
|
+
|
36
|
+
// call oldie callback if available
|
37
|
+
if(scope.isOldie && scope.onOldie) {
|
38
|
+
scope.onOldie();
|
39
|
+
}
|
40
|
+
|
41
|
+
// init UI modules
|
42
|
+
scope.initUIModules();
|
43
|
+
|
44
|
+
// call ready callback if available
|
45
|
+
if(scope.onReady) {
|
46
|
+
scope.onReady();
|
47
|
+
}
|
48
|
+
});
|
49
|
+
}
|
50
|
+
|
51
|
+
// public helper - return debuggin object including uiModules object
|
52
|
+
Gumby.prototype.debug = function() {
|
53
|
+
return {
|
54
|
+
$dom: this.$dom,
|
55
|
+
isOldie: this.isOldie,
|
56
|
+
uiModules: this.uiModules
|
57
|
+
};
|
58
|
+
};
|
59
|
+
|
60
|
+
// public helper - set Gumby ready callback
|
61
|
+
Gumby.prototype.ready = function(code) {
|
62
|
+
if(code && typeof code === 'function') {
|
63
|
+
this.onReady = code;
|
64
|
+
}
|
65
|
+
};
|
66
|
+
|
67
|
+
// public helper - set oldie callback
|
68
|
+
Gumby.prototype.oldie = function(code) {
|
69
|
+
if(code && typeof code === 'function') {
|
70
|
+
this.onOldie = code;
|
71
|
+
}
|
72
|
+
};
|
73
|
+
|
74
|
+
// grab attribute value, testing data- gumby- and no prefix
|
75
|
+
Gumby.prototype.selectAttr = function() {
|
76
|
+
var i = 0;
|
77
|
+
|
78
|
+
// any number of attributes can be passed
|
79
|
+
for(; i < arguments.length; i++) {
|
80
|
+
// various formats
|
81
|
+
var attr = arguments[i],
|
82
|
+
dataAttr = 'data-'+arguments[i],
|
83
|
+
gumbyAttr = 'gumby-'+arguments[i];
|
84
|
+
|
85
|
+
// first test for data-attr
|
86
|
+
if(this.attr(dataAttr)) {
|
87
|
+
return this.attr(dataAttr);
|
88
|
+
|
89
|
+
// next test for gumby-attr
|
90
|
+
} else if(this.attr(gumbyAttr)) {
|
91
|
+
return this.attr(gumbyAttr);
|
92
|
+
|
93
|
+
// finally no prefix
|
94
|
+
} else if(this.attr(attr)) {
|
95
|
+
return this.attr(attr);
|
96
|
+
}
|
97
|
+
}
|
98
|
+
|
99
|
+
// none found
|
100
|
+
return false;
|
101
|
+
};
|
102
|
+
|
103
|
+
// add an initialisation method
|
104
|
+
Gumby.prototype.addInitalisation = function(ref, code) {
|
105
|
+
this.inits[ref] = code;
|
106
|
+
};
|
107
|
+
|
108
|
+
// initialize a uiModule
|
109
|
+
Gumby.prototype.initialize = function(ref) {
|
110
|
+
if(this.inits[ref] && typeof this.inits[ref] === 'function') {
|
111
|
+
this.inits[ref]();
|
112
|
+
}
|
113
|
+
};
|
114
|
+
|
115
|
+
// store a UI module
|
116
|
+
Gumby.prototype.UIModule = function(data) {
|
117
|
+
var module = data.module;
|
118
|
+
this.uiModules[module] = data;
|
119
|
+
};
|
120
|
+
|
121
|
+
// loop round and init all UI modules
|
122
|
+
Gumby.prototype.initUIModules = function() {
|
123
|
+
var x;
|
124
|
+
for(x in this.uiModules) {
|
125
|
+
this.uiModules[x].init();
|
126
|
+
}
|
127
|
+
};
|
128
|
+
|
129
|
+
// use touchy events if available otherwise click
|
130
|
+
Gumby.prototype.detectClickEvent = function() {
|
131
|
+
if(Modernizr.touch) {
|
132
|
+
this.setupTapEvent();
|
133
|
+
return 'gumbyTap';
|
134
|
+
} else {
|
135
|
+
return 'click';
|
136
|
+
}
|
137
|
+
};
|
138
|
+
|
139
|
+
// set up gumbyTap jQuery.specialEvent
|
140
|
+
Gumby.prototype.setupTapEvent = function() {
|
141
|
+
$.event.special.gumbyTap = {
|
142
|
+
setup: function(data) {
|
143
|
+
$(this).bind('touchstart touchend touchmove', $.event.special.gumbyTap.handler);
|
144
|
+
},
|
145
|
+
|
146
|
+
teardown: function() {
|
147
|
+
$(this).unbind('touchstart touchend touchmove', $.event.special.gumbyTap.handler);
|
148
|
+
},
|
149
|
+
|
150
|
+
handler: function(event) {
|
151
|
+
var $this = $(this);
|
152
|
+
// touch start event so store ref to tap event starting
|
153
|
+
if(event.type === 'touchstart') {
|
154
|
+
$this.data('gumbyTouchStart', true);
|
155
|
+
// touchmove event so cancel tap event
|
156
|
+
} else if(event.type === 'touchmove') {
|
157
|
+
$this.data('gumbyTouchStart', false);
|
158
|
+
// touchend event so if tap event ref still present, we have a tap!
|
159
|
+
} else if($this.data('gumbyTouchStart')) {
|
160
|
+
$this.data('gumbyTouchStart', false);
|
161
|
+
event.type = "gumbyTap";
|
162
|
+
$this.click(function(e) { e.stopImmediatePropagation(); });
|
163
|
+
$.event.handle.apply(this, arguments);
|
164
|
+
}
|
165
|
+
}
|
166
|
+
};
|
167
|
+
};
|
168
|
+
|
169
|
+
window.Gumby = new Gumby();
|
149
170
|
|
150
171
|
}();
|
@@ -12,18 +12,7 @@
|
|
12
12
|
|
13
13
|
// listen for click event and custom gumby check/uncheck events
|
14
14
|
this.$el.on(Gumby.click, function(e) {
|
15
|
-
|
16
|
-
e.stopImmediatePropagation();
|
17
|
-
|
18
|
-
// prevent checkbox checking, we'll do that manually
|
19
|
-
e.preventDefault();
|
20
|
-
|
21
|
-
// check/uncheck
|
22
|
-
if(scope.$el.hasClass('checked')) {
|
23
|
-
scope.update(false);
|
24
|
-
} else {
|
25
|
-
scope.update(true);
|
26
|
-
}
|
15
|
+
scope.click(e);
|
27
16
|
}).on('gumby.check', function() {
|
28
17
|
scope.update(true);
|
29
18
|
}).on('gumby.uncheck', function() {
|
@@ -36,24 +25,37 @@
|
|
36
25
|
}
|
37
26
|
}
|
38
27
|
|
39
|
-
//
|
40
|
-
Checkbox.prototype.
|
28
|
+
// handle checkbox click event
|
29
|
+
Checkbox.prototype.click = function(e) {
|
41
30
|
|
42
|
-
|
43
|
-
|
31
|
+
// element responsible for event trigger
|
32
|
+
var $target = $(e.target);
|
44
33
|
|
45
|
-
//
|
46
|
-
|
34
|
+
// prevent propagation
|
35
|
+
e.stopPropagation();
|
47
36
|
|
48
|
-
|
37
|
+
// prevent checkbox checking, we'll do that manually
|
38
|
+
e.preventDefault();
|
49
39
|
|
50
|
-
|
51
|
-
|
40
|
+
// check/uncheck
|
41
|
+
if(this.$el.hasClass('checked')) {
|
42
|
+
this.update(false);
|
43
|
+
} else {
|
44
|
+
this.update(true);
|
45
|
+
}
|
46
|
+
};
|
47
|
+
|
48
|
+
// update checkbox, check equals true/false to sepcify check/uncheck
|
49
|
+
Checkbox.prototype.update = function(check) {
|
50
|
+
// check checkbox - check input, add checked class, append <i>
|
51
|
+
if(check) {
|
52
|
+
this.$el.find('input').attr('checked', true).end()
|
53
|
+
.addClass('checked').append('<i class="icon-check" />')
|
52
54
|
.trigger('gumby.onCheck').trigger('gumby.onChange');
|
53
55
|
|
54
56
|
// uncheck checkbox - uncheck input, remove checked class, remove <i>
|
55
57
|
} else {
|
56
|
-
|
58
|
+
this.$el.find('input').attr('checked', false).end()
|
57
59
|
.find('i').remove().end()
|
58
60
|
.removeClass('checked').trigger('gumby.onUncheck').trigger('gumby.onChange');
|
59
61
|
}
|
@@ -7,162 +7,67 @@
|
|
7
7
|
|
8
8
|
function Fixed($el) {
|
9
9
|
this.$el = $el;
|
10
|
-
|
11
|
-
this.fixedPoint = '';
|
12
|
-
this.
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
this
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
width: 0
|
21
|
-
};
|
22
|
-
|
23
|
-
// set up module based on attributes
|
24
|
-
this.setup();
|
25
|
-
|
26
|
-
var scope = this;
|
27
|
-
|
28
|
-
// monitor scroll and update fixed elements accordingly
|
29
|
-
$(window).on('scroll load', function() {
|
30
|
-
scope.monitorScroll();
|
31
|
-
});
|
32
|
-
|
33
|
-
// reinitialize event listener
|
34
|
-
this.$el.on('gumby.initialize', function() {
|
35
|
-
scope.setup();
|
36
|
-
});
|
37
|
-
}
|
38
|
-
|
39
|
-
// set up module based on attributes
|
40
|
-
Fixed.prototype.setup = function() {
|
41
|
-
var scope = this;
|
42
|
-
|
43
|
-
this.fixedPoint = this.parseAttrValue(Gumby.selectAttr.apply(this.$el, ['fixed']));
|
44
|
-
|
45
|
-
// pin point is optional
|
46
|
-
this.pinPoint = Gumby.selectAttr.apply(this.$el, ['pin']) || false;
|
47
|
-
|
48
|
-
// offset from fixed point
|
49
|
-
this.offset = Number(Gumby.selectAttr.apply(this.$el, ['offset'])) || 0;
|
50
|
-
|
51
|
-
// offset from pin point
|
52
|
-
this.pinOffset = Number(Gumby.selectAttr.apply(this.$el, ['pinoffset'])) || 0;
|
53
|
-
|
54
|
-
// top position when fixed
|
55
|
-
this.top = Number(Gumby.selectAttr.apply(this.$el, ['top'])) || 0;
|
56
|
-
|
57
|
-
// constrain can be turned off
|
58
|
-
this.constrainEl = Gumby.selectAttr.apply(this.$el, ['constrain']) || true;
|
59
|
-
if(this.constrainEl === 'false') {
|
60
|
-
this.constrainEl = false;
|
61
|
-
}
|
62
|
-
|
63
|
-
// reference to the parent, row/column
|
64
|
-
this.$parent = this.$el.parents('.columns, .column, .row');
|
65
|
-
this.$parent = this.$parent.length ? this.$parent.first() : false;
|
66
|
-
this.parentRow = this.$parent ? !!this.$parent.hasClass('row') : false;
|
67
|
-
|
68
|
-
// if optional pin point set then parse now
|
69
|
-
if(this.pinPoint) {
|
70
|
-
this.pinPoint = this.parseAttrValue(this.pinPoint);
|
10
|
+
this.$holder = Gumby.selectAttr.apply(this.$el, ['holder']);
|
11
|
+
this.fixedPoint = Gumby.selectAttr.apply(this.$el, ['fixed']);
|
12
|
+
this.unfixPoint = false;
|
13
|
+
|
14
|
+
// if holder attr set then create jQuery object
|
15
|
+
// otherwise use window for scrolling cals
|
16
|
+
if(this.$holder) {
|
17
|
+
this.$holder = $(this.$holder);
|
18
|
+
} else {
|
19
|
+
this.$holder = $(window);
|
71
20
|
}
|
72
21
|
|
73
|
-
//
|
74
|
-
if(this
|
75
|
-
|
76
|
-
this.
|
77
|
-
|
78
|
-
$(window).resize(function() {
|
79
|
-
if(scope.state) {
|
80
|
-
scope.measure();
|
81
|
-
scope.constrain();
|
82
|
-
}
|
83
|
-
});
|
22
|
+
// fix/unfix points specified
|
23
|
+
if(this.fixedPoint.indexOf('|') > -1) {
|
24
|
+
var points = this.fixedPoint.split('|');
|
25
|
+
this.fixedPoint = points[0];
|
26
|
+
this.unfixPoint = points[1];
|
84
27
|
}
|
85
|
-
};
|
86
|
-
|
87
|
-
// monitor scroll and trigger changes based on position
|
88
|
-
Fixed.prototype.monitorScroll = function() {
|
89
|
-
var scrollAmount = $(window).scrollTop(),
|
90
|
-
// recalculate selector attributes as position may have changed
|
91
|
-
fixedPoint = this.fixedPoint instanceof jQuery ? this.fixedPoint.offset().top : this.fixedPoint,
|
92
|
-
pinPoint = false;
|
93
28
|
|
94
|
-
//
|
95
|
-
|
96
|
-
|
29
|
+
// parse possible parameters
|
30
|
+
this.fixedPoint = this.parseAttrValue(this.fixedPoint);
|
31
|
+
if(this.unfixPoint) {
|
32
|
+
this.unfixPoint = this.parseAttrValue(this.unfixPoint);
|
97
33
|
}
|
98
34
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
if((scrollAmount >= fixedPoint) && this.state !== 'fixed') {
|
105
|
-
if(!pinPoint || scrollAmount < pinPoint) {
|
106
|
-
this.fix();
|
107
|
-
}
|
108
|
-
// unfix it
|
109
|
-
} else if(scrollAmount < fixedPoint && this.state === 'fixed') {
|
110
|
-
this.unfix();
|
35
|
+
var scope = this;
|
36
|
+
this.$holder.scroll(function() {
|
37
|
+
scope.scroll();
|
38
|
+
});
|
39
|
+
}
|
111
40
|
|
112
|
-
|
113
|
-
|
114
|
-
|
41
|
+
// handle scroll event on window/specified holder
|
42
|
+
Fixed.prototype.scroll = function() {
|
43
|
+
var offset = this.$holder.scrollTop(),
|
44
|
+
fixedPoint = this.fixedPoint,
|
45
|
+
unfixPoint = this.unfixPoint,
|
46
|
+
endPoint = this.endPoint;
|
47
|
+
|
48
|
+
// if fixed point, unfix point or end point are DOM fragements
|
49
|
+
// then re-calculate values as could have been updated
|
50
|
+
fixedPoint = fixedPoint instanceof jQuery ? this.fixedPoint.offset().top : this.fixedPoint;
|
51
|
+
unfixPoint = unfixPoint instanceof jQuery ? this.unfixPoint.offset().top : this.unfixPoint;
|
52
|
+
|
53
|
+
// ensure unfix point is never reached if not set
|
54
|
+
if(!unfixPoint) {
|
55
|
+
unfixPoint = offset * 2;
|
115
56
|
}
|
116
|
-
};
|
117
57
|
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
this.$el.css({
|
122
|
-
'top' : 0 + this.top
|
123
|
-
}).addClass('fixed').removeClass('unfixed pinned').trigger('gumby.onFixed');
|
58
|
+
// scrolled past fixed point and no fixed class present
|
59
|
+
if((offset >= fixedPoint) && (offset < unfixPoint) && !this.$el.hasClass('fixed')) {
|
60
|
+
this.$el.addClass('fixed').trigger('gumby.onFixed');
|
124
61
|
|
125
|
-
//
|
126
|
-
if(this.$
|
127
|
-
this.
|
62
|
+
// before fixed point, pass 0 to onUnfixed event
|
63
|
+
} else if((offset <= fixedPoint) && this.$el.hasClass('fixed')) {
|
64
|
+
this.$el.removeClass('fixed').trigger('gumby.onUnfixed', 0);
|
128
65
|
}
|
129
|
-
};
|
130
66
|
|
131
|
-
|
132
|
-
|
133
|
-
this.
|
134
|
-
|
135
|
-
};
|
136
|
-
|
137
|
-
// pin the element in position
|
138
|
-
Fixed.prototype.pin = function() {
|
139
|
-
this.state = 'pinned';
|
140
|
-
this.$el.css({
|
141
|
-
'top' : this.$el.offset().top
|
142
|
-
}).addClass('pinned fixed').removeClass('unfixed').trigger('gumby.onPinned');
|
143
|
-
};
|
144
|
-
|
145
|
-
// constrain elements dimensions to match width/height
|
146
|
-
Fixed.prototype.constrain = function() {
|
147
|
-
this.$el.css({
|
148
|
-
left: this.measurements.left,
|
149
|
-
width: this.measurements.width
|
150
|
-
});
|
151
|
-
};
|
152
|
-
|
153
|
-
// measure up the parent for constraining
|
154
|
-
Fixed.prototype.measure = function() {
|
155
|
-
var offsets = this.$parent.offset(), parentPadding;
|
156
|
-
|
157
|
-
this.measurements.left = offsets.left;
|
158
|
-
this.measurements.width = this.$parent.width();
|
159
|
-
|
160
|
-
// if element has a parent row then need to consider padding
|
161
|
-
if(this.parentRow) {
|
162
|
-
parentPadding = Number(this.$parent.css('paddingLeft').replace(/px/, ''));
|
163
|
-
if(parentPadding) {
|
164
|
-
this.measurements.left += parentPadding;
|
165
|
-
}
|
67
|
+
// after unfix point, pass 1 to onUnfixed event
|
68
|
+
// separate conditional as should override
|
69
|
+
if(unfixPoint && (offset >= unfixPoint) && this.$el.hasClass('fixed')) {
|
70
|
+
this.$el.removeClass('fixed').trigger('gumby.onUnfixed', 1);
|
166
71
|
}
|
167
72
|
};
|
168
73
|
|
@@ -177,7 +82,7 @@
|
|
177
82
|
// selector specified
|
178
83
|
} else {
|
179
84
|
var $el = $(attr);
|
180
|
-
return $el;
|
85
|
+
return $el.length ? $el : false;
|
181
86
|
}
|
182
87
|
};
|
183
88
|
|
@@ -12,14 +12,7 @@
|
|
12
12
|
|
13
13
|
// listen for click event and custom gumby check event
|
14
14
|
this.$el.on(Gumby.click, function(e) {
|
15
|
-
|
16
|
-
e.stopImmediatePropagation();
|
17
|
-
|
18
|
-
// prevent radio button checking, we'll do that manually
|
19
|
-
e.preventDefault();
|
20
|
-
|
21
|
-
// check radio button
|
22
|
-
scope.update();
|
15
|
+
scope.click(e);
|
23
16
|
}).on('gumby.check', function() {
|
24
17
|
scope.update();
|
25
18
|
});
|
@@ -30,23 +23,37 @@
|
|
30
23
|
}
|
31
24
|
}
|
32
25
|
|
26
|
+
// handle radio button click event
|
27
|
+
RadioBtn.prototype.click = function(e) {
|
28
|
+
|
29
|
+
// element responsible for event trigger
|
30
|
+
var $target = $(e.target);
|
31
|
+
|
32
|
+
// prevent propagation
|
33
|
+
e.stopPropagation();
|
34
|
+
|
35
|
+
// prevent radio button checking, we'll do that manually
|
36
|
+
e.preventDefault();
|
37
|
+
|
38
|
+
// check radio button
|
39
|
+
this.update();
|
40
|
+
};
|
41
|
+
|
33
42
|
// check radio button, uncheck all others in name group
|
34
43
|
RadioBtn.prototype.update = function() {
|
35
44
|
var // this specific radio button
|
36
45
|
$input = this.$el.find('input[type=radio]'),
|
37
|
-
$span = this.$el.find('span'),
|
38
46
|
// the group of radio buttons
|
39
47
|
group = 'input[name="'+$input.attr('name')+'"]';
|
40
48
|
|
41
49
|
// uncheck radio buttons in same group - uncheck input, remove checked class, remove <i>
|
42
50
|
$('.radio').has(group).removeClass('checked')
|
43
|
-
|
44
|
-
|
51
|
+
.find('input').attr('checked', false).end()
|
52
|
+
.find('i').remove();
|
45
53
|
|
46
54
|
// check this radio button - check input, add checked class, append <i>
|
47
|
-
$input.
|
48
|
-
|
49
|
-
this.$el.addClass('checked').trigger('gumby.onChange');
|
55
|
+
$input.attr('checked', true);
|
56
|
+
this.$el.append('<i class="icon-dot" />').addClass('checked').trigger('gumby.onChange');
|
50
57
|
};
|
51
58
|
|
52
59
|
// add initialisation
|
@@ -29,39 +29,29 @@
|
|
29
29
|
|
30
30
|
// intialise toggles, switches will inherit method
|
31
31
|
Toggle.prototype.init = function() {
|
32
|
-
|
32
|
+
this.targets = this.parseTargets();
|
33
|
+
this.on = Gumby.selectAttr.apply(this.$el, ['on']) || Gumby.click;
|
33
34
|
|
34
|
-
|
35
|
-
this.setup();
|
35
|
+
var scope = this;
|
36
36
|
|
37
37
|
// bind to specified event and trigger
|
38
38
|
this.$el.on(this.on, function(e) {
|
39
|
-
// stop propagation
|
40
|
-
e.stopImmediatePropagation();
|
41
|
-
|
42
39
|
// only disable default if <a>
|
43
40
|
if($(this).prop('tagName') === 'A') {
|
44
41
|
e.preventDefault();
|
45
42
|
}
|
46
43
|
|
44
|
+
// stop propagation
|
45
|
+
e.stopPropagation();
|
46
|
+
|
47
47
|
scope.trigger(scope.triggered);
|
48
48
|
|
49
49
|
// listen for gumby.trigger to dynamically trigger toggle/switch
|
50
50
|
}).on('gumby.trigger', function() {
|
51
51
|
scope.trigger(scope.triggered);
|
52
|
-
// re-initialize module
|
53
|
-
}).on('gumby.initialize', function() {
|
54
|
-
scope.setup();
|
55
52
|
});
|
56
53
|
};
|
57
54
|
|
58
|
-
// set up module based on attributes
|
59
|
-
Toggle.prototype.setup = function() {
|
60
|
-
this.targets = this.parseTargets();
|
61
|
-
this.on = Gumby.selectAttr.apply(this.$el, ['on']) || Gumby.click;
|
62
|
-
this.className = Gumby.selectAttr.apply(this.$el, ['classname']) || 'active';
|
63
|
-
};
|
64
|
-
|
65
55
|
// parse data-for attribute, switches will inherit method
|
66
56
|
Toggle.prototype.parseTargets = function() {
|
67
57
|
var targetStr = Gumby.selectAttr.apply(this.$el, ['trigger']),
|
@@ -81,38 +71,49 @@
|
|
81
71
|
}
|
82
72
|
|
83
73
|
// return array of both targets, split and return 0, 1
|
84
|
-
targets = targetStr.split('|');
|
74
|
+
var targets = targetStr.split('|');
|
85
75
|
return targets.length > 1 ? [$(targets[0]), $(targets[1])] : [$(targets[0])];
|
86
76
|
};
|
87
77
|
|
88
78
|
// call triggered event and pass target data
|
89
79
|
Toggle.prototype.triggered = function() {
|
80
|
+
var targetLength = this.targets.length,
|
81
|
+
// if no targets then use toggle/switch itself
|
82
|
+
targetData = !targetLength ? [this.$el.hasClass('active')] : [],
|
83
|
+
i;
|
84
|
+
|
85
|
+
// loop round targets and store boolean indicating if selector is active
|
86
|
+
for(i = 0; i < targetLength; i++) {
|
87
|
+
targetData.push(this.targets[i].hasClass('active'));
|
88
|
+
}
|
89
|
+
|
90
90
|
// trigger gumby.onTrigger event and pass array of target status data
|
91
|
-
this.$el.trigger('gumby.onTrigger',
|
91
|
+
this.$el.trigger('gumby.onTrigger', targetData);
|
92
92
|
};
|
93
93
|
|
94
94
|
// Switch object inherits from Toggle
|
95
95
|
Switch.prototype = new Toggle();
|
96
|
+
Switch.constructor = Switch;
|
96
97
|
|
97
98
|
// Toggle specific trigger method
|
98
99
|
Toggle.prototype.trigger = function(cb) {
|
99
100
|
// no targets just toggle active class on toggle
|
100
101
|
if(!this.targets) {
|
101
|
-
this.$el.toggleClass(
|
102
|
+
this.$el.toggleClass('active');
|
102
103
|
|
103
104
|
// combine single target with toggle and toggle active class
|
104
105
|
} else if(this.targets.length == 1) {
|
105
|
-
this.$el.add(this.targets[0]).toggleClass(
|
106
|
+
this.$el.add(this.targets[0]).toggleClass('active');
|
106
107
|
|
107
108
|
// if two targets check active state of first
|
108
109
|
// always combine toggle and first target
|
109
110
|
} else if(this.targets.length > 1) {
|
110
|
-
if(this.targets[0].hasClass(
|
111
|
-
this.$el.add(this.targets[0]).removeClass(
|
112
|
-
this.targets[1].addClass(
|
111
|
+
if(this.targets[0].hasClass('active')) {
|
112
|
+
this.$el.add(this.targets[0]).removeClass('active');
|
113
|
+
this.targets[1].addClass('active');
|
113
114
|
} else {
|
114
|
-
this.targets[1].removeClass(
|
115
|
-
this.$el.add(this.targets[0]).addClass(
|
115
|
+
this.targets[1].removeClass('active');
|
116
|
+
this.$el.add(this.targets[0]).addClass('active');
|
116
117
|
}
|
117
118
|
}
|
118
119
|
|
@@ -126,17 +127,17 @@
|
|
126
127
|
Switch.prototype.trigger = function(cb) {
|
127
128
|
// no targets just add active class to switch
|
128
129
|
if(!this.targets) {
|
129
|
-
this.$el.addClass(
|
130
|
+
this.$el.addClass('active');
|
130
131
|
|
131
132
|
// combine single target with switch and add active class
|
132
133
|
} else if(this.targets.length == 1) {
|
133
|
-
this.$el.add(this.targets[0]).addClass(
|
134
|
+
this.$el.add(this.targets[0]).addClass('active');
|
134
135
|
|
135
136
|
// if two targets check active state of first
|
136
137
|
// always combine switch and first target
|
137
138
|
} else if(this.targets.length > 1) {
|
138
|
-
this.$el.add(this.targets[0]).addClass(
|
139
|
-
this.targets[1].removeClass(
|
139
|
+
this.$el.add(this.targets[0]).addClass('active');
|
140
|
+
this.targets[1].removeClass('active');
|
140
141
|
}
|
141
142
|
|
142
143
|
// call event handler here, applying scope of object Switch/Toggle
|
@@ -146,21 +147,13 @@
|
|
146
147
|
};
|
147
148
|
|
148
149
|
// add toggle initialisation
|
149
|
-
Gumby.addInitalisation('toggles', function(
|
150
|
+
Gumby.addInitalisation('toggles', function() {
|
150
151
|
$('.toggle').each(function() {
|
151
152
|
var $this = $(this);
|
152
|
-
|
153
153
|
// this element has already been initialized
|
154
|
-
|
155
|
-
if($this.data('isToggle') && !all) {
|
154
|
+
if($this.data('isToggle')) {
|
156
155
|
return true;
|
157
|
-
|
158
|
-
// this element has already been initialized
|
159
|
-
// and we need to reinitialize it
|
160
|
-
} else if($this.data('isToggle') && all) {
|
161
|
-
$this.trigger('gumby.initialize');
|
162
156
|
}
|
163
|
-
|
164
157
|
// mark element as initialized
|
165
158
|
$this.data('isToggle', true);
|
166
159
|
new Toggle($this);
|
@@ -168,22 +161,13 @@
|
|
168
161
|
});
|
169
162
|
|
170
163
|
// add switches initialisation
|
171
|
-
Gumby.addInitalisation('switches', function(
|
164
|
+
Gumby.addInitalisation('switches', function() {
|
172
165
|
$('.switch').each(function() {
|
173
166
|
var $this = $(this);
|
174
|
-
|
175
167
|
// this element has already been initialized
|
176
|
-
|
177
|
-
if($this.data('isSwitch') && !all) {
|
178
|
-
return true;
|
179
|
-
|
180
|
-
// this element has already been initialized
|
181
|
-
// and we need to reinitialize it
|
182
|
-
} else if($this.data('isSwitch') && all) {
|
183
|
-
$this.trigger('gumby.initialize');
|
168
|
+
if($this.data('isSwitch')) {
|
184
169
|
return true;
|
185
170
|
}
|
186
|
-
|
187
171
|
// mark element as initialized
|
188
172
|
$this.data('isSwitch', true);
|
189
173
|
new Switch($this);
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gumby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -58,17 +58,13 @@ files:
|
|
58
58
|
- gumby.gemspec
|
59
59
|
- lib/gumby.rb
|
60
60
|
- lib/gumby/version.rb
|
61
|
+
- vendor/assets/fonts/humans.txt
|
61
62
|
- vendor/assets/fonts/icons/entypo.eot
|
62
63
|
- vendor/assets/fonts/icons/entypo.ttf
|
63
64
|
- vendor/assets/fonts/icons/entypo.woff
|
64
|
-
- vendor/assets/javascripts/.DS_Store
|
65
|
-
- vendor/assets/javascripts/gumby.init.js
|
66
65
|
- vendor/assets/javascripts/gumby.js
|
67
|
-
- vendor/assets/javascripts/gumby.min.js
|
68
66
|
- vendor/assets/javascripts/ui/gumby.checkbox.js
|
69
|
-
- vendor/assets/javascripts/ui/gumby.fittext.js
|
70
67
|
- vendor/assets/javascripts/ui/gumby.fixed.js
|
71
|
-
- vendor/assets/javascripts/ui/gumby.navbar.js
|
72
68
|
- vendor/assets/javascripts/ui/gumby.radiobtn.js
|
73
69
|
- vendor/assets/javascripts/ui/gumby.retina.js
|
74
70
|
- vendor/assets/javascripts/ui/gumby.skiplink.js
|
@@ -1,27 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* Gumby Init
|
3
|
-
*/
|
4
|
-
|
5
|
-
// test for touch event support
|
6
|
-
Modernizr.load({
|
7
|
-
test: Modernizr.touch,
|
8
|
-
|
9
|
-
// if present load custom jQuery mobile build and update Gumby.click
|
10
|
-
yep: Gumby.path+'/jquery.mobile.custom.min.js',
|
11
|
-
callback: function(url, result, key) {
|
12
|
-
// check jQuery mobile has successfully loaded before using tap events
|
13
|
-
if($.mobile) {
|
14
|
-
window.Gumby.click += ' tap';
|
15
|
-
}
|
16
|
-
},
|
17
|
-
|
18
|
-
// either way initialize Gumby
|
19
|
-
complete: function() {
|
20
|
-
window.Gumby.init();
|
21
|
-
|
22
|
-
// if AMD return Gumby object to define
|
23
|
-
if(typeof define == "function" && define.amd) {
|
24
|
-
define(window.Gumby);
|
25
|
-
}
|
26
|
-
}
|
27
|
-
});
|
@@ -1 +0,0 @@
|
|
1
|
-
!function(){"use strict";function t(){this.$dom=$(document),this.isOldie=!!this.$dom.find("html").hasClass("oldie"),this.click="click",this.onReady=this.onOldie=this.onTouch=!1,this.uiModules={},this.inits={},this.path=$("script[gumby-path]").attr("gumby-path")||"js/libs",this.breakpoint=Number($("script[gumby-breakpoint]").attr("gumby-breakpoint"))||1024}t.prototype.init=function(){var t=this;this.$dom.ready(function(){t.initUIModules(),t.onReady&&t.onReady(),t.isOldie&&t.onOldie&&t.onOldie(),Modernizr.touch&&t.onTouch&&t.onTouch()})},t.prototype.ready=function(t){t&&"function"==typeof t&&(this.onReady=t)},t.prototype.oldie=function(t){t&&"function"==typeof t&&(this.onOldie=t)},t.prototype.touch=function(t){t&&"function"==typeof t&&(this.onTouch=t)},t.prototype.debug=function(){return{$dom:this.$dom,isOldie:this.isOldie,uiModules:this.uiModules,click:this.click}},t.prototype.selectAttr=function(){for(var t=0;t<arguments.length;t++){var i=arguments[t],e="data-"+arguments[t],s="gumby-"+arguments[t];if(this.is("["+e+"]"))return this.attr(e)?this.attr(e):!0;if(this.is("["+s+"]"))return this.attr(s)?this.attr(s):!0;if(this.is("["+i+"]"))return this.attr(i)?this.attr(i):!0}return!1},t.prototype.addInitalisation=function(t,i){this.inits[t]=i},t.prototype.initialize=function(t,i){this.inits[t]&&"function"==typeof this.inits[t]&&this.inits[t](i)},t.prototype.UIModule=function(t){var i=t.module;this.uiModules[i]=t},t.prototype.initUIModules=function(){var t;for(t in this.uiModules)this.uiModules[t].init()},window.Gumby=new t}(),!function(){"use strict";function t(t){this.$el=t;var i=this;this.$el.on(Gumby.click,function(t){t.stopImmediatePropagation(),t.preventDefault(),i.$el.hasClass("checked")?i.update(!1):i.update(!0)}).on("gumby.check",function(){i.update(!0)}).on("gumby.uncheck",function(){i.update(!1)}),i.$el.hasClass("checked")&&i.update(!0)}t.prototype.update=function(t){var i=this.$el.find("input"),e=this.$el.find("span");t?(e.append('<i class="icon-check" />'),i.prop("checked",!0).end().addClass("checked").trigger("gumby.onCheck").trigger("gumby.onChange")):i.prop("checked",!1).end().find("i").remove().end().removeClass("checked").trigger("gumby.onUncheck").trigger("gumby.onChange")},Gumby.addInitalisation("checkboxes",function(){$(".checkbox").each(function(){var i=$(this);return i.data("isCheckbox")?!0:(i.data("isCheckbox",!0),new t(i),void 0)})}),Gumby.UIModule({module:"checkbox",events:["onCheck","onUncheck","onChange","check","uncheck"],init:function(){Gumby.initialize("checkboxes")}})}(),!function(){"use strict";function t(t){this.$el=t,this.rate=0,this.fontSizes={},this.setup();var i=this;this.$el.on("gumby.initialize",function(){i.setup()}),$(window).on("load resize orientationchange",function(){i.resize()})}t.prototype.setup=function(){this.rate=Number(Gumby.selectAttr.apply(this.$el,["rate"]))||1,this.fontSizes=this.parseSizes(Gumby.selectAttr.apply(this.$el,["sizes"]))},t.prototype.resize=function(){this.$el.css("font-size",this.calculateSize())},t.prototype.calculateSize=function(){return Math.max(Math.min(this.$el.width()/(10*this.rate),parseFloat(this.fontSizes.max)),parseFloat(this.fontSizes.min))},t.prototype.parseSizes=function(t){var i={min:Number.NEGATIVE_INFINITY,max:Number.POSITIVE_INFINITY};return t?(t.indexOf("|")>-1&&(t=t.split("|"),i.min=Number(t[0])||i.min,i.max=Number(t[1])||i.max),i.min=Number(t)||i.min,i):i},Gumby.addInitalisation("fittext",function(i){$(".fittext").each(function(){var e=$(this);return e.data("isFittext")&&!i?!0:e.data("isFittext")&&i?(e.trigger("gumby.initialize"),!0):(e.data("isFittext",!0),new t(e),void 0)})}),Gumby.UIModule({module:"fittext",events:[],init:function(){Gumby.initialize("fittext")}})}(),!function(){"use strict";function t(t){this.$el=t,this.fixedPoint="",this.pinPoint=!1,this.offset=0,this.pinOffset=0,this.top=0,this.constrainEl=!0,this.state=!1,this.measurements={left:0,width:0},this.setup();var i=this;$(window).on("scroll load",function(){i.monitorScroll()}),this.$el.on("gumby.initialize",function(){i.setup()})}t.prototype.setup=function(){var t=this;this.fixedPoint=this.parseAttrValue(Gumby.selectAttr.apply(this.$el,["fixed"])),this.pinPoint=Gumby.selectAttr.apply(this.$el,["pin"])||!1,this.offset=Number(Gumby.selectAttr.apply(this.$el,["offset"]))||0,this.pinOffset=Number(Gumby.selectAttr.apply(this.$el,["pinoffset"]))||0,this.top=Number(Gumby.selectAttr.apply(this.$el,["top"]))||0,this.constrainEl=Gumby.selectAttr.apply(this.$el,["constrain"])||!0,"false"===this.constrainEl&&(this.constrainEl=!1),this.$parent=this.$el.parents(".columns, .column, .row"),this.$parent=this.$parent.length?this.$parent.first():!1,this.parentRow=this.$parent?!!this.$parent.hasClass("row"):!1,this.pinPoint&&(this.pinPoint=this.parseAttrValue(this.pinPoint)),this.$parent&&this.constrainEl&&(this.measure(),$(window).resize(function(){t.state&&(t.measure(),t.constrain())}))},t.prototype.monitorScroll=function(){var t=$(window).scrollTop(),i=this.fixedPoint instanceof jQuery?this.fixedPoint.offset().top:this.fixedPoint,e=!1;this.pinPoint&&(e=this.pinPoint instanceof jQuery?this.pinPoint.offset().top:this.pinPoint),this.offset&&(i-=this.offset),this.pinOffset&&(e-=this.pinOffset),t>=i&&"fixed"!==this.state?(!e||e>t)&&this.fix():i>t&&"fixed"===this.state?this.unfix():e&&t>=e&&"pinned"!==this.state&&this.pin()},t.prototype.fix=function(){this.state="fixed",this.$el.css({top:0+this.top}).addClass("fixed").removeClass("unfixed pinned").trigger("gumby.onFixed"),this.$parent&&this.constrain()},t.prototype.unfix=function(){this.state="unfixed",this.$el.addClass("unfixed").removeClass("fixed pinned").trigger("gumby.onUnfixed")},t.prototype.pin=function(){this.state="pinned",this.$el.css({top:this.$el.offset().top}).addClass("pinned fixed").removeClass("unfixed").trigger("gumby.onPinned")},t.prototype.constrain=function(){this.$el.css({left:this.measurements.left,width:this.measurements.width})},t.prototype.measure=function(){var t,i=this.$parent.offset();this.measurements.left=i.left,this.measurements.width=this.$parent.width(),this.parentRow&&(t=Number(this.$parent.css("paddingLeft").replace(/px/,"")),t&&(this.measurements.left+=t))},t.prototype.parseAttrValue=function(t){if($.isNumeric(t))return Number(t);if("top"===t)return this.$el.offset().top;var i=$(t);return i},Gumby.addInitalisation("fixed",function(){$("[data-fixed],[gumby-fixed],[fixed]").each(function(){var i=$(this);return i.data("isFixed")?!0:(i.data("isFixed",!0),new t(i),void 0)})}),Gumby.UIModule({module:"fixed",events:["onFixed","onUnfixed"],init:function(){Gumby.initialize("fixed")}})}(),!function(){"use strict";function t(t){this.$el=t,this.$dropDowns=this.$el.find("li:has(.dropdown)");var i=this;this.$dropDowns.on("tap",this.toggleDropdown).on("swiperight",this.openLink),"#"!==this.$dropDowns.children("a").attr("href")&&this.$dropDowns.children("a").append('<i class="icon-popup"></i>').children("i").on("tap",this.openLink),$(window).on("mousemove touchstart",function(t){t.stopImmediatePropagation(),"mousemove"===t.type&&i.$dropDowns.on("mouseover mouseout",i.toggleDropdown)})}var i=Gumby.$dom.find("html");return!Modernizr.touch||$(window).width()>Gumby.breakpoint?(i.addClass("gumby-no-touch"),void 0):(i.addClass("gumby-touch"),t.prototype.toggleDropdown=function(t){t.stopImmediatePropagation(),t.preventDefault();var i=$(this);i.hasClass("active")?i.removeClass("active"):i.addClass("active")},t.prototype.openLink=function(t){t.stopImmediatePropagation(),t.preventDefault();var i,e,s=$(this);s.is("i")?i=s.parent("a"):s.is("li")&&(i=s.children("a")),e=i.attr("href"),"blank"==i.attr("target")?window.open(e):window.location=e},Gumby.addInitalisation("navbars",function(){$(".navbar").each(function(){var i=$(this);return i.data("isNavbar")?!0:(i.data("isNavbar",!0),new t(i),void 0)})}),Gumby.UIModule({module:"navbar",events:[],init:function(){Gumby.initialize("navbars")}}),void 0)}(),!function(){"use strict";function t(t){this.$el=t;var i=this;this.$el.on(Gumby.click,function(t){t.stopImmediatePropagation(),t.preventDefault(),i.update()}).on("gumby.check",function(){i.update()}),i.$el.hasClass("checked")&&i.update()}t.prototype.update=function(){var t=this.$el.find("input[type=radio]"),i=this.$el.find("span"),e='input[name="'+t.attr("name")+'"]';$(".radio").has(e).removeClass("checked").find("input").prop("checked",!1).end().find("i").remove(),t.prop("checked",!0),i.append('<i class="icon-dot" />'),this.$el.addClass("checked").trigger("gumby.onChange")},Gumby.addInitalisation("radiobtns",function(){$(".radio").each(function(){var i=$(this);return i.data("isRadioBtn")?!0:(i.data("isRadioBtn",!0),new t(i),void 0)})}),Gumby.UIModule({module:"radiobtn",events:["onChange","check"],init:function(){Gumby.initialize("radiobtns")}})}(),!function(){"use strict";function t(t){this.$el=t,this.imageSrc=this.$el.attr("src"),this.retinaSrc=this.fetchRetinaImage(),this.$retinaImg=$(new Image);var i=this;return this.retinaSrc?(this.$retinaImg.attr("src",this.retinaSrc).load(function(){i.retinaImageLoaded()}),void 0):!1}t.prototype.fetchRetinaImage=function(){var t=this.imageSrc,i=this.imageSrc.search(/(\.|\/)(gif|jpe?g|png)$/i);return 0>i?!1:t.substr(0,i)+"@2x"+t.substr(i,t.length)},t.prototype.retinaImageLoaded=function(){this.$el.attr("src",this.$retinaImg.attr("src")).trigger("gumby.onRetina")},Gumby.addInitalisation("retina",function(){!window.devicePixelRatio||window.devicePixelRatio<=1||$("img[data-retina],img[gumby-retina],img[retina]").each(function(){var i=$(this);return i.data("isRetina")?!0:(i.data("isRetina",!0),new t(i),void 0)})}),Gumby.UIModule({module:"retina",events:["onRetina"],init:function(){Gumby.initialize("retina")}})}(),!function(){"use strict";function t(t){this.$el=t,this.targetPos=0,this.duration=0,this.offset=!1,this.easing="",this.update=!1,this.setup();var i=this;this.$el.on(Gumby.click+" gumby.skip",function(t){t.stopImmediatePropagation(),t.preventDefault(),i.update?i.calculateTarget(i.skipTo):i.skipTo()}).on("gumby.initialize",function(){i.setup()})}t.prototype.setup=function(){this.duration=Number(Gumby.selectAttr.apply(this.$el,["duration"]))||200,this.offset=Gumby.selectAttr.apply(this.$el,["offset"])||!1,this.easing=Gumby.selectAttr.apply(this.$el,["easing"])||"swing",this.update=Gumby.selectAttr.apply(this.$el,["update"])?!0:!1,this.calculateTarget()},t.prototype.calculateTarget=function(t){var i,e=Gumby.selectAttr.apply(this.$el,["goto"]);if("top"==e)this.targetPos=0;else if($.isNumeric(e))this.targetPos=Number(e);else{if(i=$(e),!i)return!1;this.targetPos=i.offset().top}t&&t.apply(this)},t.prototype.skipTo=function(){var t=this;$("html,body").animate({scrollTop:this.calculateOffset()},this.duration,this.easing).promise().done(function(){t.$el.trigger("gumby.onComplete")})},t.prototype.calculateOffset=function(){if(!this.offset)return this.targetPos;var t=this.offset.substr(0,1),i=Number(this.offset.substr(1,this.offset.length));return"-"===t?this.targetPos-i:"+"===t?this.targetPos+i:void 0},Gumby.addInitalisation("skiplinks",function(i){$(".skiplink > a, .skip").each(function(){var e=$(this);return e.data("isSkipLink")&&!i?!0:e.data("isSkipLink")&&i?(e.trigger("gumby.initialize"),!0):(e.data("isSkipLink",!0),new t(e),void 0)})}),Gumby.UIModule({module:"skiplink",events:["onComplete","skip"],init:function(){Gumby.initialize("skiplinks")}})}(),!function(){"use strict";function t(t){this.$el=t,this.$nav=this.$el.find("ul.tab-nav > li"),this.$content=this.$el.find(".tab-content");var i=this;this.$nav.children("a").on(Gumby.click,function(t){t.stopImmediatePropagation(),t.preventDefault(),i.click($(this))}),this.$el.on("gumby.set",function(t,e){i.set(t,e)})}t.prototype.click=function(t){var i=t.parent().index();this.$nav.add(this.$content).removeClass("active"),this.$nav.eq(i).add(this.$content.eq(i)).addClass("active"),this.$el.trigger("gumby.onChange",i)},t.prototype.set=function(t,i){this.$nav.eq(i).find("a").trigger(Gumby.click)},Gumby.addInitalisation("tabs",function(){$(".tabs").each(function(){var i=$(this);return i.data("isTabs")?!0:(i.data("isTabs",!0),new t(i),void 0)})}),Gumby.UIModule({module:"tabs",events:["onChange","set"],init:function(){Gumby.initialize("tabs")}})}(),!function(){"use strict";function t(t){this.$el=$(t),this.targets=[],this.on="",this.$el.length&&this.init()}function i(t){this.$el=$(t),this.targets=[],this.on="",this.$el.length&&this.init()}t.prototype.init=function(){var t=this;this.setup(),this.$el.on(this.on,function(i){i.stopImmediatePropagation(),"A"===$(this).prop("tagName")&&i.preventDefault(),t.trigger(t.triggered)}).on("gumby.trigger",function(){t.trigger(t.triggered)}).on("gumby.initialize",function(){t.setup()})},t.prototype.setup=function(){this.targets=this.parseTargets(),this.on=Gumby.selectAttr.apply(this.$el,["on"])||Gumby.click,this.className=Gumby.selectAttr.apply(this.$el,["classname"])||"active"},t.prototype.parseTargets=function(){var t=Gumby.selectAttr.apply(this.$el,["trigger"]),i=0,e=[];return t?(i=t.indexOf("|"),-1===i?[$(t)]:(e=t.split("|"),e.length>1?[$(e[0]),$(e[1])]:[$(e[0])])):!1},t.prototype.triggered=function(){this.$el.trigger("gumby.onTrigger",[this.$el.hasClass(this.className)])},i.prototype=new t,t.prototype.trigger=function(t){this.targets?1==this.targets.length?this.$el.add(this.targets[0]).toggleClass(this.className):this.targets.length>1&&(this.targets[0].hasClass(this.className)?(this.$el.add(this.targets[0]).removeClass(this.className),this.targets[1].addClass(this.className)):(this.targets[1].removeClass(this.className),this.$el.add(this.targets[0]).addClass(this.className))):this.$el.toggleClass(this.className),t&&"function"==typeof t&&t.apply(this)},i.prototype.trigger=function(t){this.targets?1==this.targets.length?this.$el.add(this.targets[0]).addClass(this.className):this.targets.length>1&&(this.$el.add(this.targets[0]).addClass(this.className),this.targets[1].removeClass(this.className)):this.$el.addClass(this.className),t&&"function"==typeof t&&t.apply(this)},Gumby.addInitalisation("toggles",function(i){$(".toggle").each(function(){var e=$(this);return e.data("isToggle")&&!i?!0:(e.data("isToggle")&&i&&e.trigger("gumby.initialize"),e.data("isToggle",!0),new t(e),void 0)})}),Gumby.addInitalisation("switches",function(t){$(".switch").each(function(){var e=$(this);return e.data("isSwitch")&&!t?!0:e.data("isSwitch")&&t?(e.trigger("gumby.initialize"),!0):(e.data("isSwitch",!0),new i(e),void 0)})}),Gumby.UIModule({module:"toggleswitch",events:["trigger","onTrigger"],init:function(){Gumby.initialize("switches"),Gumby.initialize("toggles")}})}(),!function(t){"use strict";function i(t,i){this.$this=t,this.$field=this.$this.parents(".field"),this.req=i||function(){return!!this.$this.val().length};var e=this;this.$this.is("[type=checkbox], [type=radio]")?(this.$field=this.$this.parent("label"),this.$field.on("gumby.onChange",function(){e.validate()})):this.$this.is("select")?(this.$field=this.$this.parents(".picker"),this.$field.on("change",function(){e.validate()})):this.$this.on("blur",function(t){9!==t.which&&e.validate()})}i.prototype.validate=function(){var t=this.req(this.$this);return t?this.$field.removeClass("danger").addClass("success"):this.$field.removeClass("success").addClass("danger"),t},t.fn.validation=function(e){var s=t.extend({submit:!1,fail:!1,required:[]},e),n=[];return this.each(function(){if(!s.required.length)return!1;var e,a=t(this),o=s.required.length;for(e=0;o>e;e++)n.push(new i(a.find('[name="'+s.required[e].name+'"]'),s.required[e].validate||!1));a.on("submit",function(t){var i=!1;if(!a.data("passed")){t.preventDefault();var e,o=n.length;for(e=0;o>e;e++)n[e].validate()||(i=!0);if(i){if(s.fail&&"function"==typeof s.fail)return s.fail(),void 0}else{if(s.submit&&"function"==typeof s.submit)return s.submit(a.serializeArray()),void 0;a.data("passed",!0).submit()}}})})}}(jQuery),Modernizr.load({test:Modernizr.touch,yep:Gumby.path+"/jquery.mobile.custom.min.js",callback:function(){$.mobile&&(window.Gumby.click+=" tap")},complete:function(){window.Gumby.init(),"function"==typeof define&&define.amd&&define(window.Gumby)}});
|
@@ -1,107 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* Gumby FitText
|
3
|
-
*
|
4
|
-
* Adapted from the awesome FitText jQuery plugin
|
5
|
-
* brought to you by Paravel - http://paravelinc.com/
|
6
|
-
*/
|
7
|
-
!function() {
|
8
|
-
|
9
|
-
'use strict';
|
10
|
-
|
11
|
-
function FitText($el) {
|
12
|
-
this.$el = $el;
|
13
|
-
|
14
|
-
this.rate = 0;
|
15
|
-
this.fontSizes = {};
|
16
|
-
|
17
|
-
// set up module based on attributes
|
18
|
-
this.setup();
|
19
|
-
|
20
|
-
var scope = this;
|
21
|
-
|
22
|
-
// re-initialize module
|
23
|
-
this.$el.on('gumby.initialize', function() {
|
24
|
-
scope.setup();
|
25
|
-
});
|
26
|
-
|
27
|
-
// lets go
|
28
|
-
$(window).on('load resize orientationchange', function() {
|
29
|
-
scope.resize();
|
30
|
-
});
|
31
|
-
}
|
32
|
-
|
33
|
-
// set up module based on attributes
|
34
|
-
FitText.prototype.setup = function() {
|
35
|
-
// optional compressor rate
|
36
|
-
this.rate = Number(Gumby.selectAttr.apply(this.$el, ['rate'])) || 1;
|
37
|
-
// optional font sizes (min|max)
|
38
|
-
this.fontSizes = this.parseSizes(Gumby.selectAttr.apply(this.$el, ['sizes']));
|
39
|
-
};
|
40
|
-
|
41
|
-
// apply the resizing
|
42
|
-
FitText.prototype.resize = function() {
|
43
|
-
this.$el.css('font-size', this.calculateSize());
|
44
|
-
};
|
45
|
-
|
46
|
-
// calculate the font size
|
47
|
-
FitText.prototype.calculateSize = function() {
|
48
|
-
return Math.max(Math.min(this.$el.width() / (this.rate*10), parseFloat(this.fontSizes.max)), parseFloat(this.fontSizes.min));
|
49
|
-
};
|
50
|
-
|
51
|
-
// parse size attributes with min|max syntax
|
52
|
-
FitText.prototype.parseSizes = function(attrStr) {
|
53
|
-
var sizes = {
|
54
|
-
min: Number.NEGATIVE_INFINITY,
|
55
|
-
max: Number.POSITIVE_INFINITY
|
56
|
-
};
|
57
|
-
|
58
|
-
// attribute is optional
|
59
|
-
if(!attrStr) { return sizes; }
|
60
|
-
|
61
|
-
// min and/or max specified
|
62
|
-
if(attrStr.indexOf('|') > -1) {
|
63
|
-
attrStr = attrStr.split('|');
|
64
|
-
|
65
|
-
// both are optional
|
66
|
-
sizes.min = Number(attrStr[0]) || sizes.min;
|
67
|
-
sizes.max = Number(attrStr[1]) || sizes.max;
|
68
|
-
}
|
69
|
-
|
70
|
-
// only one value specific without | so use as min
|
71
|
-
sizes.min = Number(attrStr) || sizes.min;
|
72
|
-
|
73
|
-
return sizes;
|
74
|
-
};
|
75
|
-
|
76
|
-
// add initialisation
|
77
|
-
Gumby.addInitalisation('fittext', function(all) {
|
78
|
-
$('.fittext').each(function() {
|
79
|
-
var $this = $(this);
|
80
|
-
|
81
|
-
// this element has already been initialized
|
82
|
-
// and we're only initializing new modules
|
83
|
-
if($this.data('isFittext') && !all) {
|
84
|
-
return true;
|
85
|
-
|
86
|
-
// this element has already been initialized
|
87
|
-
// and we need to reinitialize it
|
88
|
-
} else if($this.data('isFittext') && all) {
|
89
|
-
$this.trigger('gumby.initialize');
|
90
|
-
return true;
|
91
|
-
}
|
92
|
-
|
93
|
-
// mark element as initialized
|
94
|
-
$this.data('isFittext', true);
|
95
|
-
new FitText($this);
|
96
|
-
});
|
97
|
-
});
|
98
|
-
|
99
|
-
// register UI module
|
100
|
-
Gumby.UIModule({
|
101
|
-
module: 'fittext',
|
102
|
-
events: [],
|
103
|
-
init: function() {
|
104
|
-
Gumby.initialize('fittext');
|
105
|
-
}
|
106
|
-
});
|
107
|
-
}();
|
@@ -1,115 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* Gumby Navbar
|
3
|
-
*/
|
4
|
-
!function() {
|
5
|
-
|
6
|
-
'use strict';
|
7
|
-
|
8
|
-
var $html = Gumby.$dom.find('html');
|
9
|
-
|
10
|
-
// define and init module on touch enabled devices only
|
11
|
-
// when we are at tablet size or smaller
|
12
|
-
if(!Modernizr.touch || $(window).width() > Gumby.breakpoint) {
|
13
|
-
|
14
|
-
// add Gumby no touch class
|
15
|
-
$html.addClass('gumby-no-touch');
|
16
|
-
return;
|
17
|
-
}
|
18
|
-
|
19
|
-
// add Gumby touch class
|
20
|
-
$html.addClass('gumby-touch');
|
21
|
-
|
22
|
-
function Navbar($el) {
|
23
|
-
this.$el = $el;
|
24
|
-
this.$dropDowns = this.$el.find('li:has(.dropdown)');
|
25
|
-
var scope = this;
|
26
|
-
|
27
|
-
// when navbar items
|
28
|
-
this.$dropDowns
|
29
|
-
// are tapped hide/show dropdowns
|
30
|
-
.on('tap', this.toggleDropdown)
|
31
|
-
// are swiped right open link
|
32
|
-
.on('swiperight', this.openLink);
|
33
|
-
|
34
|
-
// if there's a link set
|
35
|
-
if(this.$dropDowns.children('a').attr('href') !== '#') {
|
36
|
-
// append an icon
|
37
|
-
this.$dropDowns.children('a').append('<i class="icon-popup"></i>').children('i')
|
38
|
-
// and bind to click event to open link
|
39
|
-
.on('tap', this.openLink);
|
40
|
-
}
|
41
|
-
|
42
|
-
// on mousemove and touchstart toggle modernizr classes and disable/enable this module
|
43
|
-
// workaround for Pixel and other multi input devices
|
44
|
-
$(window).on('mousemove touchstart', function(e) {
|
45
|
-
e.stopImmediatePropagation();
|
46
|
-
if(e.type === 'mousemove') {
|
47
|
-
scope.$dropDowns.on('mouseover mouseout', scope.toggleDropdown);
|
48
|
-
}
|
49
|
-
});
|
50
|
-
}
|
51
|
-
|
52
|
-
Navbar.prototype.toggleDropdown = function(e) {
|
53
|
-
// prevent click from triggering here too
|
54
|
-
e.stopImmediatePropagation();
|
55
|
-
e.preventDefault();
|
56
|
-
|
57
|
-
var $this = $(this);
|
58
|
-
|
59
|
-
if($this.hasClass('active')) {
|
60
|
-
$this.removeClass('active');
|
61
|
-
} else {
|
62
|
-
$this.addClass('active');
|
63
|
-
}
|
64
|
-
};
|
65
|
-
|
66
|
-
// handle opening list item link
|
67
|
-
Navbar.prototype.openLink = function(e) {
|
68
|
-
e.stopImmediatePropagation();
|
69
|
-
e.preventDefault();
|
70
|
-
|
71
|
-
var $this = $(this),
|
72
|
-
$el, href;
|
73
|
-
|
74
|
-
// tapped icon
|
75
|
-
if($this.is('i')) {
|
76
|
-
$el = $this.parent('a');
|
77
|
-
// swiped li
|
78
|
-
} else if($this.is('li')) {
|
79
|
-
$el = $this.children('a');
|
80
|
-
}
|
81
|
-
|
82
|
-
href = $el.attr('href');
|
83
|
-
|
84
|
-
// open in new window
|
85
|
-
if($el.attr('target') == 'blank') {
|
86
|
-
window.open(href);
|
87
|
-
// regular relocation
|
88
|
-
} else {
|
89
|
-
window.location = href;
|
90
|
-
}
|
91
|
-
};
|
92
|
-
|
93
|
-
// add initialisation
|
94
|
-
Gumby.addInitalisation('navbars', function() {
|
95
|
-
$('.navbar').each(function() {
|
96
|
-
var $this = $(this);
|
97
|
-
// this element has already been initialized
|
98
|
-
if($this.data('isNavbar')) {
|
99
|
-
return true;
|
100
|
-
}
|
101
|
-
// mark element as initialized
|
102
|
-
$this.data('isNavbar', true);
|
103
|
-
new Navbar($this);
|
104
|
-
});
|
105
|
-
});
|
106
|
-
|
107
|
-
// register UI module
|
108
|
-
Gumby.UIModule({
|
109
|
-
module: 'navbar',
|
110
|
-
events: [],
|
111
|
-
init: function() {
|
112
|
-
Gumby.initialize('navbars');
|
113
|
-
}
|
114
|
-
});
|
115
|
-
}();
|