gumby 0.0.4 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
-
}();
|