foundation_front_end 0.1.0

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.
Files changed (38) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +21 -0
  5. data/README.md +64 -0
  6. data/Rakefile +1 -0
  7. data/bin/console +14 -0
  8. data/bin/setup +7 -0
  9. data/foundation_front_end.gemspec +32 -0
  10. data/lib/foundation_front_end.rb +21 -0
  11. data/lib/foundation_front_end/version.rb +3 -0
  12. data/vendor/assets/javascripts/foundation.min.js +6376 -0
  13. data/vendor/assets/javascripts/foundation/foundation.abide.js +408 -0
  14. data/vendor/assets/javascripts/foundation/foundation.accordion.js +88 -0
  15. data/vendor/assets/javascripts/foundation/foundation.alert.js +43 -0
  16. data/vendor/assets/javascripts/foundation/foundation.clearing.js +586 -0
  17. data/vendor/assets/javascripts/foundation/foundation.dropdown.js +463 -0
  18. data/vendor/assets/javascripts/foundation/foundation.equalizer.js +104 -0
  19. data/vendor/assets/javascripts/foundation/foundation.interchange.js +359 -0
  20. data/vendor/assets/javascripts/foundation/foundation.joyride.js +932 -0
  21. data/vendor/assets/javascripts/foundation/foundation.js +725 -0
  22. data/vendor/assets/javascripts/foundation/foundation.magellan.js +215 -0
  23. data/vendor/assets/javascripts/foundation/foundation.offcanvas.js +152 -0
  24. data/vendor/assets/javascripts/foundation/foundation.orbit.js +476 -0
  25. data/vendor/assets/javascripts/foundation/foundation.reveal.js +498 -0
  26. data/vendor/assets/javascripts/foundation/foundation.slider.js +281 -0
  27. data/vendor/assets/javascripts/foundation/foundation.tab.js +249 -0
  28. data/vendor/assets/javascripts/foundation/foundation.tooltip.js +339 -0
  29. data/vendor/assets/javascripts/foundation/foundation.topbar.js +458 -0
  30. data/vendor/assets/javascripts/vendor/fastclick.js +8 -0
  31. data/vendor/assets/javascripts/vendor/jquery.cookie.js +8 -0
  32. data/vendor/assets/javascripts/vendor/jquery.js +27 -0
  33. data/vendor/assets/javascripts/vendor/modernizr.js +8 -0
  34. data/vendor/assets/javascripts/vendor/placeholder.js +2 -0
  35. data/vendor/assets/stylesheets/foundation.css +6324 -0
  36. data/vendor/assets/stylesheets/foundation.min.css +1 -0
  37. data/vendor/assets/stylesheets/normalize.css +424 -0
  38. metadata +110 -0
@@ -0,0 +1,281 @@
1
+ ;(function ($, window, document, undefined) {
2
+ 'use strict';
3
+
4
+ Foundation.libs.slider = {
5
+ name : 'slider',
6
+
7
+ version : '5.5.2',
8
+
9
+ settings : {
10
+ start : 0,
11
+ end : 100,
12
+ step : 1,
13
+ precision : null,
14
+ initial : null,
15
+ display_selector : '',
16
+ vertical : false,
17
+ trigger_input_change : false,
18
+ on_change : function () {}
19
+ },
20
+
21
+ cache : {},
22
+
23
+ init : function (scope, method, options) {
24
+ Foundation.inherit(this, 'throttle');
25
+ this.bindings(method, options);
26
+ this.reflow();
27
+ },
28
+
29
+ events : function () {
30
+ var self = this;
31
+
32
+ $(this.scope)
33
+ .off('.slider')
34
+ .on('mousedown.fndtn.slider touchstart.fndtn.slider pointerdown.fndtn.slider',
35
+ '[' + self.attr_name() + ']:not(.disabled, [disabled]) .range-slider-handle', function (e) {
36
+ if (!self.cache.active) {
37
+ e.preventDefault();
38
+ self.set_active_slider($(e.target));
39
+ }
40
+ })
41
+ .on('mousemove.fndtn.slider touchmove.fndtn.slider pointermove.fndtn.slider', function (e) {
42
+ if (!!self.cache.active) {
43
+ e.preventDefault();
44
+ if ($.data(self.cache.active[0], 'settings').vertical) {
45
+ var scroll_offset = 0;
46
+ if (!e.pageY) {
47
+ scroll_offset = window.scrollY;
48
+ }
49
+ self.calculate_position(self.cache.active, self.get_cursor_position(e, 'y') + scroll_offset);
50
+ } else {
51
+ self.calculate_position(self.cache.active, self.get_cursor_position(e, 'x'));
52
+ }
53
+ }
54
+ })
55
+ .on('mouseup.fndtn.slider touchend.fndtn.slider pointerup.fndtn.slider', function (e) {
56
+ self.remove_active_slider();
57
+ })
58
+ .on('change.fndtn.slider', function (e) {
59
+ self.settings.on_change();
60
+ });
61
+
62
+ self.S(window)
63
+ .on('resize.fndtn.slider', self.throttle(function (e) {
64
+ self.reflow();
65
+ }, 300));
66
+
67
+ // update slider value as users change input value
68
+ this.S('[' + this.attr_name() + ']').each(function () {
69
+ var slider = $(this),
70
+ handle = slider.children('.range-slider-handle')[0],
71
+ settings = self.initialize_settings(handle);
72
+
73
+ if (settings.display_selector != '') {
74
+ $(settings.display_selector).each(function(){
75
+ if (this.hasOwnProperty('value')) {
76
+ $(this).change(function(){
77
+ // is there a better way to do this?
78
+ slider.foundation("slider", "set_value", $(this).val());
79
+ });
80
+ }
81
+ });
82
+ }
83
+ });
84
+ },
85
+
86
+ get_cursor_position : function (e, xy) {
87
+ var pageXY = 'page' + xy.toUpperCase(),
88
+ clientXY = 'client' + xy.toUpperCase(),
89
+ position;
90
+
91
+ if (typeof e[pageXY] !== 'undefined') {
92
+ position = e[pageXY];
93
+ } else if (typeof e.originalEvent[clientXY] !== 'undefined') {
94
+ position = e.originalEvent[clientXY];
95
+ } else if (e.originalEvent.touches && e.originalEvent.touches[0] && typeof e.originalEvent.touches[0][clientXY] !== 'undefined') {
96
+ position = e.originalEvent.touches[0][clientXY];
97
+ } else if (e.currentPoint && typeof e.currentPoint[xy] !== 'undefined') {
98
+ position = e.currentPoint[xy];
99
+ }
100
+
101
+ return position;
102
+ },
103
+
104
+ set_active_slider : function ($handle) {
105
+ this.cache.active = $handle;
106
+ },
107
+
108
+ remove_active_slider : function () {
109
+ this.cache.active = null;
110
+ },
111
+
112
+ calculate_position : function ($handle, cursor_x) {
113
+ var self = this,
114
+ settings = $.data($handle[0], 'settings'),
115
+ handle_l = $.data($handle[0], 'handle_l'),
116
+ handle_o = $.data($handle[0], 'handle_o'),
117
+ bar_l = $.data($handle[0], 'bar_l'),
118
+ bar_o = $.data($handle[0], 'bar_o');
119
+
120
+ requestAnimationFrame(function () {
121
+ var pct;
122
+
123
+ if (Foundation.rtl && !settings.vertical) {
124
+ pct = self.limit_to(((bar_o + bar_l - cursor_x) / bar_l), 0, 1);
125
+ } else {
126
+ pct = self.limit_to(((cursor_x - bar_o) / bar_l), 0, 1);
127
+ }
128
+
129
+ pct = settings.vertical ? 1 - pct : pct;
130
+
131
+ var norm = self.normalized_value(pct, settings.start, settings.end, settings.step, settings.precision);
132
+
133
+ self.set_ui($handle, norm);
134
+ });
135
+ },
136
+
137
+ set_ui : function ($handle, value) {
138
+ var settings = $.data($handle[0], 'settings'),
139
+ handle_l = $.data($handle[0], 'handle_l'),
140
+ bar_l = $.data($handle[0], 'bar_l'),
141
+ norm_pct = this.normalized_percentage(value, settings.start, settings.end),
142
+ handle_offset = norm_pct * (bar_l - handle_l) - 1,
143
+ progress_bar_length = norm_pct * 100,
144
+ $handle_parent = $handle.parent(),
145
+ $hidden_inputs = $handle.parent().children('input[type=hidden]');
146
+
147
+ if (Foundation.rtl && !settings.vertical) {
148
+ handle_offset = -handle_offset;
149
+ }
150
+
151
+ handle_offset = settings.vertical ? -handle_offset + bar_l - handle_l + 1 : handle_offset;
152
+ this.set_translate($handle, handle_offset, settings.vertical);
153
+
154
+ if (settings.vertical) {
155
+ $handle.siblings('.range-slider-active-segment').css('height', progress_bar_length + '%');
156
+ } else {
157
+ $handle.siblings('.range-slider-active-segment').css('width', progress_bar_length + '%');
158
+ }
159
+
160
+ $handle_parent.attr(this.attr_name(), value).trigger('change.fndtn.slider');
161
+
162
+ $hidden_inputs.val(value);
163
+ if (settings.trigger_input_change) {
164
+ $hidden_inputs.trigger('change.fndtn.slider');
165
+ }
166
+
167
+ if (!$handle[0].hasAttribute('aria-valuemin')) {
168
+ $handle.attr({
169
+ 'aria-valuemin' : settings.start,
170
+ 'aria-valuemax' : settings.end
171
+ });
172
+ }
173
+ $handle.attr('aria-valuenow', value);
174
+
175
+ if (settings.display_selector != '') {
176
+ $(settings.display_selector).each(function () {
177
+ if (this.hasAttribute('value')) {
178
+ $(this).val(value);
179
+ } else {
180
+ $(this).text(value);
181
+ }
182
+ });
183
+ }
184
+
185
+ },
186
+
187
+ normalized_percentage : function (val, start, end) {
188
+ return Math.min(1, (val - start) / (end - start));
189
+ },
190
+
191
+ normalized_value : function (val, start, end, step, precision) {
192
+ var range = end - start,
193
+ point = val * range,
194
+ mod = (point - (point % step)) / step,
195
+ rem = point % step,
196
+ round = ( rem >= step * 0.5 ? step : 0);
197
+ return ((mod * step + round) + start).toFixed(precision);
198
+ },
199
+
200
+ set_translate : function (ele, offset, vertical) {
201
+ if (vertical) {
202
+ $(ele)
203
+ .css('-webkit-transform', 'translateY(' + offset + 'px)')
204
+ .css('-moz-transform', 'translateY(' + offset + 'px)')
205
+ .css('-ms-transform', 'translateY(' + offset + 'px)')
206
+ .css('-o-transform', 'translateY(' + offset + 'px)')
207
+ .css('transform', 'translateY(' + offset + 'px)');
208
+ } else {
209
+ $(ele)
210
+ .css('-webkit-transform', 'translateX(' + offset + 'px)')
211
+ .css('-moz-transform', 'translateX(' + offset + 'px)')
212
+ .css('-ms-transform', 'translateX(' + offset + 'px)')
213
+ .css('-o-transform', 'translateX(' + offset + 'px)')
214
+ .css('transform', 'translateX(' + offset + 'px)');
215
+ }
216
+ },
217
+
218
+ limit_to : function (val, min, max) {
219
+ return Math.min(Math.max(val, min), max);
220
+ },
221
+
222
+ initialize_settings : function (handle) {
223
+ var settings = $.extend({}, this.settings, this.data_options($(handle).parent())),
224
+ decimal_places_match_result;
225
+
226
+ if (settings.precision === null) {
227
+ decimal_places_match_result = ('' + settings.step).match(/\.([\d]*)/);
228
+ settings.precision = decimal_places_match_result && decimal_places_match_result[1] ? decimal_places_match_result[1].length : 0;
229
+ }
230
+
231
+ if (settings.vertical) {
232
+ $.data(handle, 'bar_o', $(handle).parent().offset().top);
233
+ $.data(handle, 'bar_l', $(handle).parent().outerHeight());
234
+ $.data(handle, 'handle_o', $(handle).offset().top);
235
+ $.data(handle, 'handle_l', $(handle).outerHeight());
236
+ } else {
237
+ $.data(handle, 'bar_o', $(handle).parent().offset().left);
238
+ $.data(handle, 'bar_l', $(handle).parent().outerWidth());
239
+ $.data(handle, 'handle_o', $(handle).offset().left);
240
+ $.data(handle, 'handle_l', $(handle).outerWidth());
241
+ }
242
+
243
+ $.data(handle, 'bar', $(handle).parent());
244
+ return $.data(handle, 'settings', settings);
245
+ },
246
+
247
+ set_initial_position : function ($ele) {
248
+ var settings = $.data($ele.children('.range-slider-handle')[0], 'settings'),
249
+ initial = ((typeof settings.initial == 'number' && !isNaN(settings.initial)) ? settings.initial : Math.floor((settings.end - settings.start) * 0.5 / settings.step) * settings.step + settings.start),
250
+ $handle = $ele.children('.range-slider-handle');
251
+ this.set_ui($handle, initial);
252
+ },
253
+
254
+ set_value : function (value) {
255
+ var self = this;
256
+ $('[' + self.attr_name() + ']', this.scope).each(function () {
257
+ $(this).attr(self.attr_name(), value);
258
+ });
259
+ if (!!$(this.scope).attr(self.attr_name())) {
260
+ $(this.scope).attr(self.attr_name(), value);
261
+ }
262
+ self.reflow();
263
+ },
264
+
265
+ reflow : function () {
266
+ var self = this;
267
+ self.S('[' + this.attr_name() + ']').each(function () {
268
+ var handle = $(this).children('.range-slider-handle')[0],
269
+ val = $(this).attr(self.attr_name());
270
+ self.initialize_settings(handle);
271
+
272
+ if (val) {
273
+ self.set_ui($(handle), parseFloat(val));
274
+ } else {
275
+ self.set_initial_position($(this));
276
+ }
277
+ });
278
+ }
279
+ };
280
+
281
+ }(jQuery, window, window.document));
@@ -0,0 +1,249 @@
1
+ ;(function ($, window, document, undefined) {
2
+ 'use strict';
3
+
4
+ Foundation.libs.tab = {
5
+ name : 'tab',
6
+
7
+ version : '5.5.2',
8
+
9
+ settings : {
10
+ active_class : 'active',
11
+ callback : function () {},
12
+ deep_linking : false,
13
+ scroll_to_content : true,
14
+ is_hover : false
15
+ },
16
+
17
+ default_tab_hashes : [],
18
+
19
+ init : function (scope, method, options) {
20
+ var self = this,
21
+ S = this.S;
22
+
23
+ // Store the default active tabs which will be referenced when the
24
+ // location hash is absent, as in the case of navigating the tabs and
25
+ // returning to the first viewing via the browser Back button.
26
+ S('[' + this.attr_name() + '] > .active > a', this.scope).each(function () {
27
+ self.default_tab_hashes.push(this.hash);
28
+ });
29
+
30
+ // store the initial href, which is used to allow correct behaviour of the
31
+ // browser back button when deep linking is turned on.
32
+ self.entry_location = window.location.href;
33
+
34
+ this.bindings(method, options);
35
+ this.handle_location_hash_change();
36
+ },
37
+
38
+ events : function () {
39
+ var self = this,
40
+ S = this.S;
41
+
42
+ var usual_tab_behavior = function (e, target) {
43
+ var settings = S(target).closest('[' + self.attr_name() + ']').data(self.attr_name(true) + '-init');
44
+ if (!settings.is_hover || Modernizr.touch) {
45
+ e.preventDefault();
46
+ e.stopPropagation();
47
+ self.toggle_active_tab(S(target).parent());
48
+ }
49
+ };
50
+
51
+ S(this.scope)
52
+ .off('.tab')
53
+ // Key event: focus/tab key
54
+ .on('keydown.fndtn.tab', '[' + this.attr_name() + '] > * > a', function(e) {
55
+ var el = this;
56
+ var keyCode = e.keyCode || e.which;
57
+ // if user pressed tab key
58
+ if (keyCode == 9) {
59
+ e.preventDefault();
60
+ // TODO: Change usual_tab_behavior into accessibility function?
61
+ usual_tab_behavior(e, el);
62
+ }
63
+ })
64
+ // Click event: tab title
65
+ .on('click.fndtn.tab', '[' + this.attr_name() + '] > * > a', function(e) {
66
+ var el = this;
67
+ usual_tab_behavior(e, el);
68
+ })
69
+ // Hover event: tab title
70
+ .on('mouseenter.fndtn.tab', '[' + this.attr_name() + '] > * > a', function (e) {
71
+ var settings = S(this).closest('[' + self.attr_name() + ']').data(self.attr_name(true) + '-init');
72
+ if (settings.is_hover) {
73
+ self.toggle_active_tab(S(this).parent());
74
+ }
75
+ });
76
+
77
+ // Location hash change event
78
+ S(window).on('hashchange.fndtn.tab', function (e) {
79
+ e.preventDefault();
80
+ self.handle_location_hash_change();
81
+ });
82
+ },
83
+
84
+ handle_location_hash_change : function () {
85
+
86
+ var self = this,
87
+ S = this.S;
88
+
89
+ S('[' + this.attr_name() + ']', this.scope).each(function () {
90
+ var settings = S(this).data(self.attr_name(true) + '-init');
91
+ if (settings.deep_linking) {
92
+ // Match the location hash to a label
93
+ var hash;
94
+ if (settings.scroll_to_content) {
95
+ hash = self.scope.location.hash;
96
+ } else {
97
+ // prefix the hash to prevent anchor scrolling
98
+ hash = self.scope.location.hash.replace('fndtn-', '');
99
+ }
100
+ if (hash != '') {
101
+ // Check whether the location hash references a tab content div or
102
+ // another element on the page (inside or outside the tab content div)
103
+ var hash_element = S(hash);
104
+ if (hash_element.hasClass('content') && hash_element.parent().hasClass('tabs-content')) {
105
+ // Tab content div
106
+ self.toggle_active_tab($('[' + self.attr_name() + '] > * > a[href=' + hash + ']').parent());
107
+ } else {
108
+ // Not the tab content div. If inside the tab content, find the
109
+ // containing tab and toggle it as active.
110
+ var hash_tab_container_id = hash_element.closest('.content').attr('id');
111
+ if (hash_tab_container_id != undefined) {
112
+ self.toggle_active_tab($('[' + self.attr_name() + '] > * > a[href=#' + hash_tab_container_id + ']').parent(), hash);
113
+ }
114
+ }
115
+ } else {
116
+ // Reference the default tab hashes which were initialized in the init function
117
+ for (var ind = 0; ind < self.default_tab_hashes.length; ind++) {
118
+ self.toggle_active_tab($('[' + self.attr_name() + '] > * > a[href=' + self.default_tab_hashes[ind] + ']').parent());
119
+ }
120
+ }
121
+ }
122
+ });
123
+ },
124
+
125
+ toggle_active_tab : function (tab, location_hash) {
126
+ var self = this,
127
+ S = self.S,
128
+ tabs = tab.closest('[' + this.attr_name() + ']'),
129
+ tab_link = tab.find('a'),
130
+ anchor = tab.children('a').first(),
131
+ target_hash = '#' + anchor.attr('href').split('#')[1],
132
+ target = S(target_hash),
133
+ siblings = tab.siblings(),
134
+ settings = tabs.data(this.attr_name(true) + '-init'),
135
+ interpret_keyup_action = function (e) {
136
+ // Light modification of Heydon Pickering's Practical ARIA Examples: http://heydonworks.com/practical_aria_examples/js/a11y.js
137
+
138
+ // define current, previous and next (possible) tabs
139
+
140
+ var $original = $(this);
141
+ var $prev = $(this).parents('li').prev().children('[role="tab"]');
142
+ var $next = $(this).parents('li').next().children('[role="tab"]');
143
+ var $target;
144
+
145
+ // find the direction (prev or next)
146
+
147
+ switch (e.keyCode) {
148
+ case 37:
149
+ $target = $prev;
150
+ break;
151
+ case 39:
152
+ $target = $next;
153
+ break;
154
+ default:
155
+ $target = false
156
+ break;
157
+ }
158
+
159
+ if ($target.length) {
160
+ $original.attr({
161
+ 'tabindex' : '-1',
162
+ 'aria-selected' : null
163
+ });
164
+ $target.attr({
165
+ 'tabindex' : '0',
166
+ 'aria-selected' : true
167
+ }).focus();
168
+ }
169
+
170
+ // Hide panels
171
+
172
+ $('[role="tabpanel"]')
173
+ .attr('aria-hidden', 'true');
174
+
175
+ // Show panel which corresponds to target
176
+
177
+ $('#' + $(document.activeElement).attr('href').substring(1))
178
+ .attr('aria-hidden', null);
179
+
180
+ },
181
+ go_to_hash = function(hash) {
182
+ // This function allows correct behaviour of the browser's back button when deep linking is enabled. Without it
183
+ // the user would get continually redirected to the default hash.
184
+ var is_entry_location = window.location.href === self.entry_location,
185
+ default_hash = settings.scroll_to_content ? self.default_tab_hashes[0] : is_entry_location ? window.location.hash :'fndtn-' + self.default_tab_hashes[0].replace('#', '')
186
+
187
+ if (!(is_entry_location && hash === default_hash)) {
188
+ window.location.hash = hash;
189
+ }
190
+ };
191
+
192
+ // allow usage of data-tab-content attribute instead of href
193
+ if (anchor.data('tab-content')) {
194
+ target_hash = '#' + anchor.data('tab-content').split('#')[1];
195
+ target = S(target_hash);
196
+ }
197
+
198
+ if (settings.deep_linking) {
199
+
200
+ if (settings.scroll_to_content) {
201
+
202
+ // retain current hash to scroll to content
203
+ go_to_hash(location_hash || target_hash);
204
+
205
+ if (location_hash == undefined || location_hash == target_hash) {
206
+ tab.parent()[0].scrollIntoView();
207
+ } else {
208
+ S(target_hash)[0].scrollIntoView();
209
+ }
210
+ } else {
211
+ // prefix the hashes so that the browser doesn't scroll down
212
+ if (location_hash != undefined) {
213
+ go_to_hash('fndtn-' + location_hash.replace('#', ''));
214
+ } else {
215
+ go_to_hash('fndtn-' + target_hash.replace('#', ''));
216
+ }
217
+ }
218
+ }
219
+
220
+ // WARNING: The activation and deactivation of the tab content must
221
+ // occur after the deep linking in order to properly refresh the browser
222
+ // window (notably in Chrome).
223
+ // Clean up multiple attr instances to done once
224
+ tab.addClass(settings.active_class).triggerHandler('opened');
225
+ tab_link.attr({'aria-selected' : 'true', tabindex : 0});
226
+ siblings.removeClass(settings.active_class)
227
+ siblings.find('a').attr({'aria-selected' : 'false', tabindex : -1});
228
+ target.siblings().removeClass(settings.active_class).attr({'aria-hidden' : 'true', tabindex : -1});
229
+ target.addClass(settings.active_class).attr('aria-hidden', 'false').removeAttr('tabindex');
230
+ settings.callback(tab);
231
+ target.triggerHandler('toggled', [target]);
232
+ tabs.triggerHandler('toggled', [tab]);
233
+
234
+ tab_link.off('keydown').on('keydown', interpret_keyup_action );
235
+ },
236
+
237
+ data_attr : function (str) {
238
+ if (this.namespace.length > 0) {
239
+ return this.namespace + '-' + str;
240
+ }
241
+
242
+ return str;
243
+ },
244
+
245
+ off : function () {},
246
+
247
+ reflow : function () {}
248
+ };
249
+ }(jQuery, window, window.document));