foundation6-jekyll-base 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (160) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +2 -0
  4. data/_includes/footer.html +1 -0
  5. data/_includes/head.html +16 -0
  6. data/_includes/header.html +1 -0
  7. data/_includes/javascripts.html +4 -0
  8. data/_layouts/default.html +18 -0
  9. data/_layouts/home.html +26 -0
  10. data/_layouts/page.html +15 -0
  11. data/_layouts/post.html +25 -0
  12. data/_sass/_vendor/normalize-scss/sass/_normalize.scss +3 -0
  13. data/_sass/_vendor/normalize-scss/sass/normalize/_import-now.scss +11 -0
  14. data/_sass/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss +676 -0
  15. data/_sass/_vendor/normalize-scss/sass/normalize/_variables.scss +36 -0
  16. data/_sass/_vendor/normalize-scss/sass/normalize/_vertical-rhythm.scss +61 -0
  17. data/_sass/_vendor/sassy-lists/stylesheets/functions/_purge.scss +38 -0
  18. data/_sass/_vendor/sassy-lists/stylesheets/functions/_remove.scss +31 -0
  19. data/_sass/_vendor/sassy-lists/stylesheets/functions/_replace.scss +46 -0
  20. data/_sass/_vendor/sassy-lists/stylesheets/functions/_to-list.scss +27 -0
  21. data/_sass/_vendor/sassy-lists/stylesheets/helpers/_missing-dependencies.scss +25 -0
  22. data/_sass/_vendor/sassy-lists/stylesheets/helpers/_true.scss +13 -0
  23. data/_sass/foundation/_global.scss +219 -0
  24. data/_sass/foundation/components/_accordion-menu.scss +36 -0
  25. data/_sass/foundation/components/_accordion.scss +150 -0
  26. data/_sass/foundation/components/_badge.scss +63 -0
  27. data/_sass/foundation/components/_breadcrumbs.scss +97 -0
  28. data/_sass/foundation/components/_button-group.scss +249 -0
  29. data/_sass/foundation/components/_button.scss +303 -0
  30. data/_sass/foundation/components/_callout.scss +106 -0
  31. data/_sass/foundation/components/_card.scss +121 -0
  32. data/_sass/foundation/components/_close-button.scss +102 -0
  33. data/_sass/foundation/components/_drilldown.scss +93 -0
  34. data/_sass/foundation/components/_dropdown-menu.scss +226 -0
  35. data/_sass/foundation/components/_dropdown.scss +72 -0
  36. data/_sass/foundation/components/_flex-video.scss +1 -0
  37. data/_sass/foundation/components/_flex.scss +28 -0
  38. data/_sass/foundation/components/_float.scss +27 -0
  39. data/_sass/foundation/components/_label.scss +64 -0
  40. data/_sass/foundation/components/_media-object.scss +114 -0
  41. data/_sass/foundation/components/_menu-icon.scss +9 -0
  42. data/_sass/foundation/components/_menu.scss +371 -0
  43. data/_sass/foundation/components/_off-canvas.scss +329 -0
  44. data/_sass/foundation/components/_orbit.scss +196 -0
  45. data/_sass/foundation/components/_pagination.scss +193 -0
  46. data/_sass/foundation/components/_progress-bar.scss +64 -0
  47. data/_sass/foundation/components/_responsive-embed.scss +67 -0
  48. data/_sass/foundation/components/_reveal.scss +178 -0
  49. data/_sass/foundation/components/_slider.scss +138 -0
  50. data/_sass/foundation/components/_sticky.scss +38 -0
  51. data/_sass/foundation/components/_switch.scss +247 -0
  52. data/_sass/foundation/components/_table.scss +329 -0
  53. data/_sass/foundation/components/_tabs.scss +196 -0
  54. data/_sass/foundation/components/_thumbnail.scss +67 -0
  55. data/_sass/foundation/components/_title-bar.scss +84 -0
  56. data/_sass/foundation/components/_tooltip.scss +107 -0
  57. data/_sass/foundation/components/_top-bar.scss +173 -0
  58. data/_sass/foundation/components/_visibility.scss +132 -0
  59. data/_sass/foundation/forms/_checkbox.scss +41 -0
  60. data/_sass/foundation/forms/_error.scss +88 -0
  61. data/_sass/foundation/forms/_fieldset.scss +54 -0
  62. data/_sass/foundation/forms/_forms.scss +34 -0
  63. data/_sass/foundation/forms/_help-text.scss +30 -0
  64. data/_sass/foundation/forms/_input-group.scss +135 -0
  65. data/_sass/foundation/forms/_label.scss +50 -0
  66. data/_sass/foundation/forms/_meter.scss +110 -0
  67. data/_sass/foundation/forms/_progress.scss +94 -0
  68. data/_sass/foundation/forms/_range.scss +149 -0
  69. data/_sass/foundation/forms/_select.scss +85 -0
  70. data/_sass/foundation/forms/_text.scss +170 -0
  71. data/_sass/foundation/foundation.scss +118 -0
  72. data/_sass/foundation/grid/_classes.scss +176 -0
  73. data/_sass/foundation/grid/_column.scss +112 -0
  74. data/_sass/foundation/grid/_flex-grid.scss +307 -0
  75. data/_sass/foundation/grid/_grid.scss +44 -0
  76. data/_sass/foundation/grid/_gutter.scss +82 -0
  77. data/_sass/foundation/grid/_layout.scss +76 -0
  78. data/_sass/foundation/grid/_position.scss +76 -0
  79. data/_sass/foundation/grid/_row.scss +99 -0
  80. data/_sass/foundation/grid/_size.scss +24 -0
  81. data/_sass/foundation/settings/_settings.scss +621 -0
  82. data/_sass/foundation/typography/_alignment.scss +22 -0
  83. data/_sass/foundation/typography/_base.scss +509 -0
  84. data/_sass/foundation/typography/_helpers.scss +78 -0
  85. data/_sass/foundation/typography/_print.scss +81 -0
  86. data/_sass/foundation/typography/_typography.scss +26 -0
  87. data/_sass/foundation/util/_breakpoint.scss +281 -0
  88. data/_sass/foundation/util/_color.scss +126 -0
  89. data/_sass/foundation/util/_direction.scss +31 -0
  90. data/_sass/foundation/util/_flex.scss +85 -0
  91. data/_sass/foundation/util/_math.scss +72 -0
  92. data/_sass/foundation/util/_mixins.scss +276 -0
  93. data/_sass/foundation/util/_selector.scss +41 -0
  94. data/_sass/foundation/util/_unit.scss +152 -0
  95. data/_sass/foundation/util/_util.scss +13 -0
  96. data/_sass/foundation/util/_value.scss +140 -0
  97. data/assets/js/app.js +1 -0
  98. data/assets/js/vendor/foundation/foundation.d.ts +496 -0
  99. data/assets/js/vendor/foundation/foundation.js +10207 -0
  100. data/assets/js/vendor/foundation/foundation.min.js +4 -0
  101. data/assets/js/vendor/foundation/plugins/foundation.abide.js +637 -0
  102. data/assets/js/vendor/foundation/plugins/foundation.abide.min.js +1 -0
  103. data/assets/js/vendor/foundation/plugins/foundation.accordion.js +252 -0
  104. data/assets/js/vendor/foundation/plugins/foundation.accordion.min.js +1 -0
  105. data/assets/js/vendor/foundation/plugins/foundation.accordionMenu.js +318 -0
  106. data/assets/js/vendor/foundation/plugins/foundation.accordionMenu.min.js +1 -0
  107. data/assets/js/vendor/foundation/plugins/foundation.core.js +386 -0
  108. data/assets/js/vendor/foundation/plugins/foundation.core.min.js +1 -0
  109. data/assets/js/vendor/foundation/plugins/foundation.drilldown.js +565 -0
  110. data/assets/js/vendor/foundation/plugins/foundation.drilldown.min.js +1 -0
  111. data/assets/js/vendor/foundation/plugins/foundation.dropdown.js +465 -0
  112. data/assets/js/vendor/foundation/plugins/foundation.dropdown.min.js +1 -0
  113. data/assets/js/vendor/foundation/plugins/foundation.dropdownMenu.js +486 -0
  114. data/assets/js/vendor/foundation/plugins/foundation.dropdownMenu.min.js +1 -0
  115. data/assets/js/vendor/foundation/plugins/foundation.equalizer.js +374 -0
  116. data/assets/js/vendor/foundation/plugins/foundation.equalizer.min.js +1 -0
  117. data/assets/js/vendor/foundation/plugins/foundation.interchange.js +233 -0
  118. data/assets/js/vendor/foundation/plugins/foundation.interchange.min.js +1 -0
  119. data/assets/js/vendor/foundation/plugins/foundation.magellan.js +285 -0
  120. data/assets/js/vendor/foundation/plugins/foundation.magellan.min.js +1 -0
  121. data/assets/js/vendor/foundation/plugins/foundation.offcanvas.js +474 -0
  122. data/assets/js/vendor/foundation/plugins/foundation.offcanvas.min.js +1 -0
  123. data/assets/js/vendor/foundation/plugins/foundation.orbit.js +566 -0
  124. data/assets/js/vendor/foundation/plugins/foundation.orbit.min.js +1 -0
  125. data/assets/js/vendor/foundation/plugins/foundation.responsiveMenu.js +169 -0
  126. data/assets/js/vendor/foundation/plugins/foundation.responsiveMenu.min.js +1 -0
  127. data/assets/js/vendor/foundation/plugins/foundation.responsiveToggle.js +177 -0
  128. data/assets/js/vendor/foundation/plugins/foundation.responsiveToggle.min.js +1 -0
  129. data/assets/js/vendor/foundation/plugins/foundation.reveal.js +633 -0
  130. data/assets/js/vendor/foundation/plugins/foundation.reveal.min.js +1 -0
  131. data/assets/js/vendor/foundation/plugins/foundation.slider.js +762 -0
  132. data/assets/js/vendor/foundation/plugins/foundation.slider.min.js +1 -0
  133. data/assets/js/vendor/foundation/plugins/foundation.sticky.js +518 -0
  134. data/assets/js/vendor/foundation/plugins/foundation.sticky.min.js +1 -0
  135. data/assets/js/vendor/foundation/plugins/foundation.tabs.js +512 -0
  136. data/assets/js/vendor/foundation/plugins/foundation.tabs.min.js +1 -0
  137. data/assets/js/vendor/foundation/plugins/foundation.toggler.js +169 -0
  138. data/assets/js/vendor/foundation/plugins/foundation.toggler.min.js +1 -0
  139. data/assets/js/vendor/foundation/plugins/foundation.tooltip.js +492 -0
  140. data/assets/js/vendor/foundation/plugins/foundation.tooltip.min.js +1 -0
  141. data/assets/js/vendor/foundation/plugins/foundation.util.box.js +196 -0
  142. data/assets/js/vendor/foundation/plugins/foundation.util.box.min.js +1 -0
  143. data/assets/js/vendor/foundation/plugins/foundation.util.keyboard.js +163 -0
  144. data/assets/js/vendor/foundation/plugins/foundation.util.keyboard.min.js +1 -0
  145. data/assets/js/vendor/foundation/plugins/foundation.util.mediaQuery.js +233 -0
  146. data/assets/js/vendor/foundation/plugins/foundation.util.mediaQuery.min.js +1 -0
  147. data/assets/js/vendor/foundation/plugins/foundation.util.motion.js +103 -0
  148. data/assets/js/vendor/foundation/plugins/foundation.util.motion.min.js +1 -0
  149. data/assets/js/vendor/foundation/plugins/foundation.util.nest.js +74 -0
  150. data/assets/js/vendor/foundation/plugins/foundation.util.nest.min.js +1 -0
  151. data/assets/js/vendor/foundation/plugins/foundation.util.timerAndImageLoader.js +90 -0
  152. data/assets/js/vendor/foundation/plugins/foundation.util.timerAndImageLoader.min.js +1 -0
  153. data/assets/js/vendor/foundation/plugins/foundation.util.touch.js +352 -0
  154. data/assets/js/vendor/foundation/plugins/foundation.util.touch.min.js +1 -0
  155. data/assets/js/vendor/foundation/plugins/foundation.util.triggers.js +261 -0
  156. data/assets/js/vendor/foundation/plugins/foundation.util.triggers.min.js +1 -0
  157. data/assets/js/vendor/foundation/plugins/foundation.zf.responsiveAccordionTabs.js +262 -0
  158. data/assets/js/vendor/foundation/plugins/foundation.zf.responsiveAccordionTabs.min.js +1 -0
  159. data/assets/main.scss +6 -0
  160. metadata +232 -0
@@ -0,0 +1 @@
1
+ "use strict";function _classCallCheck(n,e){if(!(n instanceof e))throw new TypeError("Cannot call a class as a function")}var _createClass=function(){function n(n,e){for(var i=0;i<e.length;i++){var t=e[i];t.enumerable=t.enumerable||!1,t.configurable=!0,"value"in t&&(t.writable=!0),Object.defineProperty(n,t.key,t)}}return function(e,i,t){return i&&n(e.prototype,i),t&&n(e,t),e}}();!function(n){var e=function(){function e(i,t){_classCallCheck(this,e),this.$element=i,this.options=n.extend({},e.defaults,this.$element.data(),t),Foundation.Nest.Feather(this.$element,"accordion"),this._init(),Foundation.registerPlugin(this,"AccordionMenu"),Foundation.Keyboard.register("AccordionMenu",{ENTER:"toggle",SPACE:"toggle",ARROW_RIGHT:"open",ARROW_UP:"up",ARROW_DOWN:"down",ARROW_LEFT:"close",ESCAPE:"closeAll"})}return _createClass(e,[{key:"_init",value:function(){this.$element.find("[data-submenu]").not(".is-active").slideUp(0),this.$element.attr({role:"menu","aria-multiselectable":this.options.multiOpen}),this.$menuLinks=this.$element.find(".is-accordion-submenu-parent"),this.$menuLinks.each(function(){var e=this.id||Foundation.GetYoDigits(6,"acc-menu-link"),i=n(this),t=i.children("[data-submenu]"),a=t[0].id||Foundation.GetYoDigits(6,"acc-menu"),s=t.hasClass("is-active");i.attr({"aria-controls":a,"aria-expanded":s,role:"menuitem",id:e}),t.attr({"aria-labelledby":e,"aria-hidden":!s,role:"menu",id:a})});var e=this.$element.find(".is-active");if(e.length){var i=this;e.each(function(){i.down(n(this))})}this._events()}},{key:"_events",value:function(){var e=this;this.$element.find("li").each(function(){var i=n(this).children("[data-submenu]");i.length&&n(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",function(n){n.preventDefault(),e.toggle(i)})}).on("keydown.zf.accordionmenu",function(i){var t,a,s=n(this),o=s.parent("ul").children("li"),d=s.children("[data-submenu]");o.each(function(e){if(n(this).is(s))return t=o.eq(Math.max(0,e-1)).find("a").first(),a=o.eq(Math.min(e+1,o.length-1)).find("a").first(),n(this).children("[data-submenu]:visible").length&&(a=s.find("li:first-child").find("a").first()),n(this).is(":first-child")?t=s.parents("li").first().find("a").first():t.parents("li").first().children("[data-submenu]:visible").length&&(t=t.parents("li").find("li:last-child").find("a").first()),void(n(this).is(":last-child")&&(a=s.parents("li").first().next("li").find("a").first()))}),Foundation.Keyboard.handleKey(i,"AccordionMenu",{open:function(){d.is(":hidden")&&(e.down(d),d.find("li").first().find("a").first().focus())},close:function(){d.length&&!d.is(":hidden")?e.up(d):s.parent("[data-submenu]").length&&(e.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return t.focus(),!0},down:function(){return a.focus(),!0},toggle:function(){s.children("[data-submenu]").length&&e.toggle(s.children("[data-submenu]"))},closeAll:function(){e.hideAll()},handled:function(n){n&&i.preventDefault(),i.stopImmediatePropagation()}})})}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(n){n.is(":animated")||(n.is(":hidden")?this.down(n):this.up(n))}},{key:"down",value:function(n){var e=this;this.options.multiOpen||this.up(this.$element.find(".is-active").not(n.parentsUntil(this.$element).add(n))),n.addClass("is-active").attr({"aria-hidden":!1}).parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),n.slideDown(e.options.slideSpeed,function(){e.$element.trigger("down.zf.accordionMenu",[n])})}},{key:"up",value:function(n){var e=this;n.slideUp(e.options.slideSpeed,function(){e.$element.trigger("up.zf.accordionMenu",[n])});var i=n.find("[data-submenu]").slideUp(0).addBack().attr("aria-hidden",!0);i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1)}},{key:"destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),Foundation.Nest.Burn(this.$element,"accordion"),Foundation.unregisterPlugin(this)}}]),e}();e.defaults={slideSpeed:250,multiOpen:!0},Foundation.plugin(e,"AccordionMenu")}(jQuery);
@@ -0,0 +1,386 @@
1
+ !function ($) {
2
+
3
+ "use strict";
4
+
5
+ var FOUNDATION_VERSION = '6.3.1';
6
+
7
+ // Global Foundation object
8
+ // This is attached to the window, or used as a module for AMD/Browserify
9
+ var Foundation = {
10
+ version: FOUNDATION_VERSION,
11
+
12
+ /**
13
+ * Stores initialized plugins.
14
+ */
15
+ _plugins: {},
16
+
17
+ /**
18
+ * Stores generated unique ids for plugin instances
19
+ */
20
+ _uuids: [],
21
+
22
+ /**
23
+ * Returns a boolean for RTL support
24
+ */
25
+ rtl: function () {
26
+ return $('html').attr('dir') === 'rtl';
27
+ },
28
+ /**
29
+ * Defines a Foundation plugin, adding it to the `Foundation` namespace and the list of plugins to initialize when reflowing.
30
+ * @param {Object} plugin - The constructor of the plugin.
31
+ */
32
+ plugin: function (plugin, name) {
33
+ // Object key to use when adding to global Foundation object
34
+ // Examples: Foundation.Reveal, Foundation.OffCanvas
35
+ var className = name || functionName(plugin);
36
+ // Object key to use when storing the plugin, also used to create the identifying data attribute for the plugin
37
+ // Examples: data-reveal, data-off-canvas
38
+ var attrName = hyphenate(className);
39
+
40
+ // Add to the Foundation object and the plugins list (for reflowing)
41
+ this._plugins[attrName] = this[className] = plugin;
42
+ },
43
+ /**
44
+ * @function
45
+ * Populates the _uuids array with pointers to each individual plugin instance.
46
+ * Adds the `zfPlugin` data-attribute to programmatically created plugins to allow use of $(selector).foundation(method) calls.
47
+ * Also fires the initialization event for each plugin, consolidating repetitive code.
48
+ * @param {Object} plugin - an instance of a plugin, usually `this` in context.
49
+ * @param {String} name - the name of the plugin, passed as a camelCased string.
50
+ * @fires Plugin#init
51
+ */
52
+ registerPlugin: function (plugin, name) {
53
+ var pluginName = name ? hyphenate(name) : functionName(plugin.constructor).toLowerCase();
54
+ plugin.uuid = this.GetYoDigits(6, pluginName);
55
+
56
+ if (!plugin.$element.attr('data-' + pluginName)) {
57
+ plugin.$element.attr('data-' + pluginName, plugin.uuid);
58
+ }
59
+ if (!plugin.$element.data('zfPlugin')) {
60
+ plugin.$element.data('zfPlugin', plugin);
61
+ }
62
+ /**
63
+ * Fires when the plugin has initialized.
64
+ * @event Plugin#init
65
+ */
66
+ plugin.$element.trigger('init.zf.' + pluginName);
67
+
68
+ this._uuids.push(plugin.uuid);
69
+
70
+ return;
71
+ },
72
+ /**
73
+ * @function
74
+ * Removes the plugins uuid from the _uuids array.
75
+ * Removes the zfPlugin data attribute, as well as the data-plugin-name attribute.
76
+ * Also fires the destroyed event for the plugin, consolidating repetitive code.
77
+ * @param {Object} plugin - an instance of a plugin, usually `this` in context.
78
+ * @fires Plugin#destroyed
79
+ */
80
+ unregisterPlugin: function (plugin) {
81
+ var pluginName = hyphenate(functionName(plugin.$element.data('zfPlugin').constructor));
82
+
83
+ this._uuids.splice(this._uuids.indexOf(plugin.uuid), 1);
84
+ plugin.$element.removeAttr('data-' + pluginName).removeData('zfPlugin')
85
+ /**
86
+ * Fires when the plugin has been destroyed.
87
+ * @event Plugin#destroyed
88
+ */
89
+ .trigger('destroyed.zf.' + pluginName);
90
+ for (var prop in plugin) {
91
+ plugin[prop] = null; //clean up script to prep for garbage collection.
92
+ }
93
+ return;
94
+ },
95
+
96
+ /**
97
+ * @function
98
+ * Causes one or more active plugins to re-initialize, resetting event listeners, recalculating positions, etc.
99
+ * @param {String} plugins - optional string of an individual plugin key, attained by calling `$(element).data('pluginName')`, or string of a plugin class i.e. `'dropdown'`
100
+ * @default If no argument is passed, reflow all currently active plugins.
101
+ */
102
+ reInit: function (plugins) {
103
+ var isJQ = plugins instanceof $;
104
+ try {
105
+ if (isJQ) {
106
+ plugins.each(function () {
107
+ $(this).data('zfPlugin')._init();
108
+ });
109
+ } else {
110
+ var type = typeof plugins,
111
+ _this = this,
112
+ fns = {
113
+ 'object': function (plgs) {
114
+ plgs.forEach(function (p) {
115
+ p = hyphenate(p);
116
+ $('[data-' + p + ']').foundation('_init');
117
+ });
118
+ },
119
+ 'string': function () {
120
+ plugins = hyphenate(plugins);
121
+ $('[data-' + plugins + ']').foundation('_init');
122
+ },
123
+ 'undefined': function () {
124
+ this['object'](Object.keys(_this._plugins));
125
+ }
126
+ };
127
+ fns[type](plugins);
128
+ }
129
+ } catch (err) {
130
+ console.error(err);
131
+ } finally {
132
+ return plugins;
133
+ }
134
+ },
135
+
136
+ /**
137
+ * returns a random base-36 uid with namespacing
138
+ * @function
139
+ * @param {Number} length - number of random base-36 digits desired. Increase for more random strings.
140
+ * @param {String} namespace - name of plugin to be incorporated in uid, optional.
141
+ * @default {String} '' - if no plugin name is provided, nothing is appended to the uid.
142
+ * @returns {String} - unique id
143
+ */
144
+ GetYoDigits: function (length, namespace) {
145
+ length = length || 6;
146
+ return Math.round(Math.pow(36, length + 1) - Math.random() * Math.pow(36, length)).toString(36).slice(1) + (namespace ? '-' + namespace : '');
147
+ },
148
+ /**
149
+ * Initialize plugins on any elements within `elem` (and `elem` itself) that aren't already initialized.
150
+ * @param {Object} elem - jQuery object containing the element to check inside. Also checks the element itself, unless it's the `document` object.
151
+ * @param {String|Array} plugins - A list of plugins to initialize. Leave this out to initialize everything.
152
+ */
153
+ reflow: function (elem, plugins) {
154
+
155
+ // If plugins is undefined, just grab everything
156
+ if (typeof plugins === 'undefined') {
157
+ plugins = Object.keys(this._plugins);
158
+ }
159
+ // If plugins is a string, convert it to an array with one item
160
+ else if (typeof plugins === 'string') {
161
+ plugins = [plugins];
162
+ }
163
+
164
+ var _this = this;
165
+
166
+ // Iterate through each plugin
167
+ $.each(plugins, function (i, name) {
168
+ // Get the current plugin
169
+ var plugin = _this._plugins[name];
170
+
171
+ // Localize the search to all elements inside elem, as well as elem itself, unless elem === document
172
+ var $elem = $(elem).find('[data-' + name + ']').addBack('[data-' + name + ']');
173
+
174
+ // For each plugin found, initialize it
175
+ $elem.each(function () {
176
+ var $el = $(this),
177
+ opts = {};
178
+ // Don't double-dip on plugins
179
+ if ($el.data('zfPlugin')) {
180
+ console.warn("Tried to initialize " + name + " on an element that already has a Foundation plugin.");
181
+ return;
182
+ }
183
+
184
+ if ($el.attr('data-options')) {
185
+ var thing = $el.attr('data-options').split(';').forEach(function (e, i) {
186
+ var opt = e.split(':').map(function (el) {
187
+ return el.trim();
188
+ });
189
+ if (opt[0]) opts[opt[0]] = parseValue(opt[1]);
190
+ });
191
+ }
192
+ try {
193
+ $el.data('zfPlugin', new plugin($(this), opts));
194
+ } catch (er) {
195
+ console.error(er);
196
+ } finally {
197
+ return;
198
+ }
199
+ });
200
+ });
201
+ },
202
+ getFnName: functionName,
203
+ transitionend: function ($elem) {
204
+ var transitions = {
205
+ 'transition': 'transitionend',
206
+ 'WebkitTransition': 'webkitTransitionEnd',
207
+ 'MozTransition': 'transitionend',
208
+ 'OTransition': 'otransitionend'
209
+ };
210
+ var elem = document.createElement('div'),
211
+ end;
212
+
213
+ for (var t in transitions) {
214
+ if (typeof elem.style[t] !== 'undefined') {
215
+ end = transitions[t];
216
+ }
217
+ }
218
+ if (end) {
219
+ return end;
220
+ } else {
221
+ end = setTimeout(function () {
222
+ $elem.triggerHandler('transitionend', [$elem]);
223
+ }, 1);
224
+ return 'transitionend';
225
+ }
226
+ }
227
+ };
228
+
229
+ Foundation.util = {
230
+ /**
231
+ * Function for applying a debounce effect to a function call.
232
+ * @function
233
+ * @param {Function} func - Function to be called at end of timeout.
234
+ * @param {Number} delay - Time in ms to delay the call of `func`.
235
+ * @returns function
236
+ */
237
+ throttle: function (func, delay) {
238
+ var timer = null;
239
+
240
+ return function () {
241
+ var context = this,
242
+ args = arguments;
243
+
244
+ if (timer === null) {
245
+ timer = setTimeout(function () {
246
+ func.apply(context, args);
247
+ timer = null;
248
+ }, delay);
249
+ }
250
+ };
251
+ }
252
+ };
253
+
254
+ // TODO: consider not making this a jQuery function
255
+ // TODO: need way to reflow vs. re-initialize
256
+ /**
257
+ * The Foundation jQuery method.
258
+ * @param {String|Array} method - An action to perform on the current jQuery object.
259
+ */
260
+ var foundation = function (method) {
261
+ var type = typeof method,
262
+ $meta = $('meta.foundation-mq'),
263
+ $noJS = $('.no-js');
264
+
265
+ if (!$meta.length) {
266
+ $('<meta class="foundation-mq">').appendTo(document.head);
267
+ }
268
+ if ($noJS.length) {
269
+ $noJS.removeClass('no-js');
270
+ }
271
+
272
+ if (type === 'undefined') {
273
+ //needs to initialize the Foundation object, or an individual plugin.
274
+ Foundation.MediaQuery._init();
275
+ Foundation.reflow(this);
276
+ } else if (type === 'string') {
277
+ //an individual method to invoke on a plugin or group of plugins
278
+ var args = Array.prototype.slice.call(arguments, 1); //collect all the arguments, if necessary
279
+ var plugClass = this.data('zfPlugin'); //determine the class of plugin
280
+
281
+ if (plugClass !== undefined && plugClass[method] !== undefined) {
282
+ //make sure both the class and method exist
283
+ if (this.length === 1) {
284
+ //if there's only one, call it directly.
285
+ plugClass[method].apply(plugClass, args);
286
+ } else {
287
+ this.each(function (i, el) {
288
+ //otherwise loop through the jQuery collection and invoke the method on each
289
+ plugClass[method].apply($(el).data('zfPlugin'), args);
290
+ });
291
+ }
292
+ } else {
293
+ //error for no class or no method
294
+ throw new ReferenceError("We're sorry, '" + method + "' is not an available method for " + (plugClass ? functionName(plugClass) : 'this element') + '.');
295
+ }
296
+ } else {
297
+ //error for invalid argument type
298
+ throw new TypeError('We\'re sorry, ' + type + ' is not a valid parameter. You must use a string representing the method you wish to invoke.');
299
+ }
300
+ return this;
301
+ };
302
+
303
+ window.Foundation = Foundation;
304
+ $.fn.foundation = foundation;
305
+
306
+ // Polyfill for requestAnimationFrame
307
+ (function () {
308
+ if (!Date.now || !window.Date.now) window.Date.now = Date.now = function () {
309
+ return new Date().getTime();
310
+ };
311
+
312
+ var vendors = ['webkit', 'moz'];
313
+ for (var i = 0; i < vendors.length && !window.requestAnimationFrame; ++i) {
314
+ var vp = vendors[i];
315
+ window.requestAnimationFrame = window[vp + 'RequestAnimationFrame'];
316
+ window.cancelAnimationFrame = window[vp + 'CancelAnimationFrame'] || window[vp + 'CancelRequestAnimationFrame'];
317
+ }
318
+ if (/iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent) || !window.requestAnimationFrame || !window.cancelAnimationFrame) {
319
+ var lastTime = 0;
320
+ window.requestAnimationFrame = function (callback) {
321
+ var now = Date.now();
322
+ var nextTime = Math.max(lastTime + 16, now);
323
+ return setTimeout(function () {
324
+ callback(lastTime = nextTime);
325
+ }, nextTime - now);
326
+ };
327
+ window.cancelAnimationFrame = clearTimeout;
328
+ }
329
+ /**
330
+ * Polyfill for performance.now, required by rAF
331
+ */
332
+ if (!window.performance || !window.performance.now) {
333
+ window.performance = {
334
+ start: Date.now(),
335
+ now: function () {
336
+ return Date.now() - this.start;
337
+ }
338
+ };
339
+ }
340
+ })();
341
+ if (!Function.prototype.bind) {
342
+ Function.prototype.bind = function (oThis) {
343
+ if (typeof this !== 'function') {
344
+ // closest thing possible to the ECMAScript 5
345
+ // internal IsCallable function
346
+ throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');
347
+ }
348
+
349
+ var aArgs = Array.prototype.slice.call(arguments, 1),
350
+ fToBind = this,
351
+ fNOP = function () {},
352
+ fBound = function () {
353
+ return fToBind.apply(this instanceof fNOP ? this : oThis, aArgs.concat(Array.prototype.slice.call(arguments)));
354
+ };
355
+
356
+ if (this.prototype) {
357
+ // native functions don't have a prototype
358
+ fNOP.prototype = this.prototype;
359
+ }
360
+ fBound.prototype = new fNOP();
361
+
362
+ return fBound;
363
+ };
364
+ }
365
+ // Polyfill to get the name of a function in IE9
366
+ function functionName(fn) {
367
+ if (Function.prototype.name === undefined) {
368
+ var funcNameRegex = /function\s([^(]{1,})\(/;
369
+ var results = funcNameRegex.exec(fn.toString());
370
+ return results && results.length > 1 ? results[1].trim() : "";
371
+ } else if (fn.prototype === undefined) {
372
+ return fn.constructor.name;
373
+ } else {
374
+ return fn.prototype.constructor.name;
375
+ }
376
+ }
377
+ function parseValue(str) {
378
+ if ('true' === str) return true;else if ('false' === str) return false;else if (!isNaN(str * 1)) return parseFloat(str);
379
+ return str;
380
+ }
381
+ // Convert PascalCase to kebab-case
382
+ // Thank you: http://stackoverflow.com/a/8955580
383
+ function hyphenate(str) {
384
+ return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
385
+ }
386
+ }(jQuery);
@@ -0,0 +1 @@
1
+ !function(t){"use strict";function n(t){if(void 0===Function.prototype.name){var n=/function\s([^(]{1,})\(/,i=n.exec(t.toString());return i&&i.length>1?i[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function i(t){return"true"===t||"false"!==t&&(isNaN(1*t)?t:parseFloat(t))}function e(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}var o="6.3.1",r={version:o,_plugins:{},_uuids:[],rtl:function(){return"rtl"===t("html").attr("dir")},plugin:function(t,i){var o=i||n(t),r=e(o);this._plugins[r]=this[o]=t},registerPlugin:function(t,i){var o=i?e(i):n(t.constructor).toLowerCase();t.uuid=this.GetYoDigits(6,o),t.$element.attr("data-"+o)||t.$element.attr("data-"+o,t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf."+o),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var i=e(n(t.$element.data("zfPlugin").constructor));this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-"+i).removeData("zfPlugin").trigger("destroyed.zf."+i);for(var o in t)t[o]=null},reInit:function(n){var i=n instanceof t;try{if(i)n.each(function(){t(this).data("zfPlugin")._init()});else{var o=typeof n,r=this,a={object:function(n){n.forEach(function(n){n=e(n),t("[data-"+n+"]").foundation("_init")})},string:function(){n=e(n),t("[data-"+n+"]").foundation("_init")},undefined:function(){this.object(Object.keys(r._plugins))}};a[o](n)}}catch(t){console.error(t)}finally{return n}},GetYoDigits:function(t,n){return t=t||6,Math.round(Math.pow(36,t+1)-Math.random()*Math.pow(36,t)).toString(36).slice(1)+(n?"-"+n:"")},reflow:function(n,e){"undefined"==typeof e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var o=this;t.each(e,function(e,r){var a=o._plugins[r],u=t(n).find("[data-"+r+"]").addBack("[data-"+r+"]");u.each(function(){var n=t(this),e={};if(n.data("zfPlugin"))return void console.warn("Tried to initialize "+r+" on an element that already has a Foundation plugin.");if(n.attr("data-options")){n.attr("data-options").split(";").forEach(function(t,n){var o=t.split(":").map(function(t){return t.trim()});o[0]&&(e[o[0]]=i(o[1]))})}try{n.data("zfPlugin",new a(t(this),e))}catch(t){console.error(t)}finally{return}})})},getFnName:n,transitionend:function(t){var n,i={transition:"transitionend",WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"otransitionend"},e=document.createElement("div");for(var o in i)"undefined"!=typeof e.style[o]&&(n=i[o]);return n?n:(n=setTimeout(function(){t.triggerHandler("transitionend",[t])},1),"transitionend")}};r.util={throttle:function(t,n){var i=null;return function(){var e=this,o=arguments;null===i&&(i=setTimeout(function(){t.apply(e,o),i=null},n))}}};var a=function(i){var e=typeof i,o=t("meta.foundation-mq"),a=t(".no-js");if(o.length||t('<meta class="foundation-mq">').appendTo(document.head),a.length&&a.removeClass("no-js"),"undefined"===e)r.MediaQuery._init(),r.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, "+e+" is not a valid parameter. You must use a string representing the method you wish to invoke.");var u=Array.prototype.slice.call(arguments,1),s=this.data("zfPlugin");if(void 0===s||void 0===s[i])throw new ReferenceError("We're sorry, '"+i+"' is not an available method for "+(s?n(s):"this element")+".");1===this.length?s[i].apply(s,u):this.each(function(n,e){s[i].apply(t(e).data("zfPlugin"),u)})}return this};window.Foundation=r,t.fn.foundation=a,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],n=0;n<t.length&&!window.requestAnimationFrame;++n){var i=t[n];window.requestAnimationFrame=window[i+"RequestAnimationFrame"],window.cancelAnimationFrame=window[i+"CancelAnimationFrame"]||window[i+"CancelRequestAnimationFrame"]}if(/iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent)||!window.requestAnimationFrame||!window.cancelAnimationFrame){var e=0;window.requestAnimationFrame=function(t){var n=Date.now(),i=Math.max(e+16,n);return setTimeout(function(){t(e=i)},i-n)},window.cancelAnimationFrame=clearTimeout}window.performance&&window.performance.now||(window.performance={start:Date.now(),now:function(){return Date.now()-this.start}})}(),Function.prototype.bind||(Function.prototype.bind=function(t){if("function"!=typeof this)throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");var n=Array.prototype.slice.call(arguments,1),i=this,e=function(){},o=function(){return i.apply(this instanceof e?this:t,n.concat(Array.prototype.slice.call(arguments)))};return this.prototype&&(e.prototype=this.prototype),o.prototype=new e,o})}(jQuery);
@@ -0,0 +1,565 @@
1
+ 'use strict';
2
+
3
+ var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
4
+
5
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
6
+
7
+ !function ($) {
8
+
9
+ /**
10
+ * Drilldown module.
11
+ * @module foundation.drilldown
12
+ * @requires foundation.util.keyboard
13
+ * @requires foundation.util.motion
14
+ * @requires foundation.util.nest
15
+ */
16
+
17
+ var Drilldown = function () {
18
+ /**
19
+ * Creates a new instance of a drilldown menu.
20
+ * @class
21
+ * @param {jQuery} element - jQuery object to make into an accordion menu.
22
+ * @param {Object} options - Overrides to the default plugin settings.
23
+ */
24
+ function Drilldown(element, options) {
25
+ _classCallCheck(this, Drilldown);
26
+
27
+ this.$element = element;
28
+ this.options = $.extend({}, Drilldown.defaults, this.$element.data(), options);
29
+
30
+ Foundation.Nest.Feather(this.$element, 'drilldown');
31
+
32
+ this._init();
33
+
34
+ Foundation.registerPlugin(this, 'Drilldown');
35
+ Foundation.Keyboard.register('Drilldown', {
36
+ 'ENTER': 'open',
37
+ 'SPACE': 'open',
38
+ 'ARROW_RIGHT': 'next',
39
+ 'ARROW_UP': 'up',
40
+ 'ARROW_DOWN': 'down',
41
+ 'ARROW_LEFT': 'previous',
42
+ 'ESCAPE': 'close',
43
+ 'TAB': 'down',
44
+ 'SHIFT_TAB': 'up'
45
+ });
46
+ }
47
+
48
+ /**
49
+ * Initializes the drilldown by creating jQuery collections of elements
50
+ * @private
51
+ */
52
+
53
+
54
+ _createClass(Drilldown, [{
55
+ key: '_init',
56
+ value: function _init() {
57
+ this.$submenuAnchors = this.$element.find('li.is-drilldown-submenu-parent').children('a');
58
+ this.$submenus = this.$submenuAnchors.parent('li').children('[data-submenu]');
59
+ this.$menuItems = this.$element.find('li').not('.js-drilldown-back').attr('role', 'menuitem').find('a');
60
+ this.$element.attr('data-mutate', this.$element.attr('data-drilldown') || Foundation.GetYoDigits(6, 'drilldown'));
61
+
62
+ this._prepareMenu();
63
+ this._registerEvents();
64
+
65
+ this._keyboardEvents();
66
+ }
67
+
68
+ /**
69
+ * prepares drilldown menu by setting attributes to links and elements
70
+ * sets a min height to prevent content jumping
71
+ * wraps the element if not already wrapped
72
+ * @private
73
+ * @function
74
+ */
75
+
76
+ }, {
77
+ key: '_prepareMenu',
78
+ value: function _prepareMenu() {
79
+ var _this = this;
80
+ // if(!this.options.holdOpen){
81
+ // this._menuLinkEvents();
82
+ // }
83
+ this.$submenuAnchors.each(function () {
84
+ var $link = $(this);
85
+ var $sub = $link.parent();
86
+ if (_this.options.parentLink) {
87
+ $link.clone().prependTo($sub.children('[data-submenu]')).wrap('<li class="is-submenu-parent-item is-submenu-item is-drilldown-submenu-item" role="menu-item"></li>');
88
+ }
89
+ $link.data('savedHref', $link.attr('href')).removeAttr('href').attr('tabindex', 0);
90
+ $link.children('[data-submenu]').attr({
91
+ 'aria-hidden': true,
92
+ 'tabindex': 0,
93
+ 'role': 'menu'
94
+ });
95
+ _this._events($link);
96
+ });
97
+ this.$submenus.each(function () {
98
+ var $menu = $(this),
99
+ $back = $menu.find('.js-drilldown-back');
100
+ if (!$back.length) {
101
+ switch (_this.options.backButtonPosition) {
102
+ case "bottom":
103
+ $menu.append(_this.options.backButton);
104
+ break;
105
+ case "top":
106
+ $menu.prepend(_this.options.backButton);
107
+ break;
108
+ default:
109
+ console.error("Unsupported backButtonPosition value '" + _this.options.backButtonPosition + "'");
110
+ }
111
+ }
112
+ _this._back($menu);
113
+ });
114
+
115
+ this.$submenus.addClass('invisible');
116
+ if (!this.options.autoHeight) {
117
+ this.$submenus.addClass('drilldown-submenu-cover-previous');
118
+ }
119
+
120
+ // create a wrapper on element if it doesn't exist.
121
+ if (!this.$element.parent().hasClass('is-drilldown')) {
122
+ this.$wrapper = $(this.options.wrapper).addClass('is-drilldown');
123
+ if (this.options.animateHeight) this.$wrapper.addClass('animate-height');
124
+ this.$element.wrap(this.$wrapper);
125
+ }
126
+ // set wrapper
127
+ this.$wrapper = this.$element.parent();
128
+ this.$wrapper.css(this._getMaxDims());
129
+ }
130
+ }, {
131
+ key: '_resize',
132
+ value: function _resize() {
133
+ this.$wrapper.css({ 'max-width': 'none', 'min-height': 'none' });
134
+ // _getMaxDims has side effects (boo) but calling it should update all other necessary heights & widths
135
+ this.$wrapper.css(this._getMaxDims());
136
+ }
137
+
138
+ /**
139
+ * Adds event handlers to elements in the menu.
140
+ * @function
141
+ * @private
142
+ * @param {jQuery} $elem - the current menu item to add handlers to.
143
+ */
144
+
145
+ }, {
146
+ key: '_events',
147
+ value: function _events($elem) {
148
+ var _this = this;
149
+
150
+ $elem.off('click.zf.drilldown').on('click.zf.drilldown', function (e) {
151
+ if ($(e.target).parentsUntil('ul', 'li').hasClass('is-drilldown-submenu-parent')) {
152
+ e.stopImmediatePropagation();
153
+ e.preventDefault();
154
+ }
155
+
156
+ // if(e.target !== e.currentTarget.firstElementChild){
157
+ // return false;
158
+ // }
159
+ _this._show($elem.parent('li'));
160
+
161
+ if (_this.options.closeOnClick) {
162
+ var $body = $('body');
163
+ $body.off('.zf.drilldown').on('click.zf.drilldown', function (e) {
164
+ if (e.target === _this.$element[0] || $.contains(_this.$element[0], e.target)) {
165
+ return;
166
+ }
167
+ e.preventDefault();
168
+ _this._hideAll();
169
+ $body.off('.zf.drilldown');
170
+ });
171
+ }
172
+ });
173
+ this.$element.on('mutateme.zf.trigger', this._resize.bind(this));
174
+ }
175
+
176
+ /**
177
+ * Adds event handlers to the menu element.
178
+ * @function
179
+ * @private
180
+ */
181
+
182
+ }, {
183
+ key: '_registerEvents',
184
+ value: function _registerEvents() {
185
+ if (this.options.scrollTop) {
186
+ this._bindHandler = this._scrollTop.bind(this);
187
+ this.$element.on('open.zf.drilldown hide.zf.drilldown closed.zf.drilldown', this._bindHandler);
188
+ }
189
+ }
190
+
191
+ /**
192
+ * Scroll to Top of Element or data-scroll-top-element
193
+ * @function
194
+ * @fires Drilldown#scrollme
195
+ */
196
+
197
+ }, {
198
+ key: '_scrollTop',
199
+ value: function _scrollTop() {
200
+ var _this = this;
201
+ var $scrollTopElement = _this.options.scrollTopElement != '' ? $(_this.options.scrollTopElement) : _this.$element,
202
+ scrollPos = parseInt($scrollTopElement.offset().top + _this.options.scrollTopOffset);
203
+ $('html, body').stop(true).animate({ scrollTop: scrollPos }, _this.options.animationDuration, _this.options.animationEasing, function () {
204
+ /**
205
+ * Fires after the menu has scrolled
206
+ * @event Drilldown#scrollme
207
+ */
208
+ if (this === $('html')[0]) _this.$element.trigger('scrollme.zf.drilldown');
209
+ });
210
+ }
211
+
212
+ /**
213
+ * Adds keydown event listener to `li`'s in the menu.
214
+ * @private
215
+ */
216
+
217
+ }, {
218
+ key: '_keyboardEvents',
219
+ value: function _keyboardEvents() {
220
+ var _this = this;
221
+
222
+ this.$menuItems.add(this.$element.find('.js-drilldown-back > a, .is-submenu-parent-item > a')).on('keydown.zf.drilldown', function (e) {
223
+ var $element = $(this),
224
+ $elements = $element.parent('li').parent('ul').children('li').children('a'),
225
+ $prevElement,
226
+ $nextElement;
227
+
228
+ $elements.each(function (i) {
229
+ if ($(this).is($element)) {
230
+ $prevElement = $elements.eq(Math.max(0, i - 1));
231
+ $nextElement = $elements.eq(Math.min(i + 1, $elements.length - 1));
232
+ return;
233
+ }
234
+ });
235
+
236
+ Foundation.Keyboard.handleKey(e, 'Drilldown', {
237
+ next: function () {
238
+ if ($element.is(_this.$submenuAnchors)) {
239
+ _this._show($element.parent('li'));
240
+ $element.parent('li').one(Foundation.transitionend($element), function () {
241
+ $element.parent('li').find('ul li a').filter(_this.$menuItems).first().focus();
242
+ });
243
+ return true;
244
+ }
245
+ },
246
+ previous: function () {
247
+ _this._hide($element.parent('li').parent('ul'));
248
+ $element.parent('li').parent('ul').one(Foundation.transitionend($element), function () {
249
+ setTimeout(function () {
250
+ $element.parent('li').parent('ul').parent('li').children('a').first().focus();
251
+ }, 1);
252
+ });
253
+ return true;
254
+ },
255
+ up: function () {
256
+ $prevElement.focus();
257
+ // Don't tap focus on first element in root ul
258
+ return !$element.is(_this.$element.find('> li:first-child > a'));
259
+ },
260
+ down: function () {
261
+ $nextElement.focus();
262
+ // Don't tap focus on last element in root ul
263
+ return !$element.is(_this.$element.find('> li:last-child > a'));
264
+ },
265
+ close: function () {
266
+ // Don't close on element in root ul
267
+ if (!$element.is(_this.$element.find('> li > a'))) {
268
+ _this._hide($element.parent().parent());
269
+ $element.parent().parent().siblings('a').focus();
270
+ }
271
+ },
272
+ open: function () {
273
+ if (!$element.is(_this.$menuItems)) {
274
+ // not menu item means back button
275
+ _this._hide($element.parent('li').parent('ul'));
276
+ $element.parent('li').parent('ul').one(Foundation.transitionend($element), function () {
277
+ setTimeout(function () {
278
+ $element.parent('li').parent('ul').parent('li').children('a').first().focus();
279
+ }, 1);
280
+ });
281
+ return true;
282
+ } else if ($element.is(_this.$submenuAnchors)) {
283
+ _this._show($element.parent('li'));
284
+ $element.parent('li').one(Foundation.transitionend($element), function () {
285
+ $element.parent('li').find('ul li a').filter(_this.$menuItems).first().focus();
286
+ });
287
+ return true;
288
+ }
289
+ },
290
+ handled: function (preventDefault) {
291
+ if (preventDefault) {
292
+ e.preventDefault();
293
+ }
294
+ e.stopImmediatePropagation();
295
+ }
296
+ });
297
+ }); // end keyboardAccess
298
+ }
299
+
300
+ /**
301
+ * Closes all open elements, and returns to root menu.
302
+ * @function
303
+ * @fires Drilldown#closed
304
+ */
305
+
306
+ }, {
307
+ key: '_hideAll',
308
+ value: function _hideAll() {
309
+ var $elem = this.$element.find('.is-drilldown-submenu.is-active').addClass('is-closing');
310
+ if (this.options.autoHeight) this.$wrapper.css({ height: $elem.parent().closest('ul').data('calcHeight') });
311
+ $elem.one(Foundation.transitionend($elem), function (e) {
312
+ $elem.removeClass('is-active is-closing');
313
+ });
314
+ /**
315
+ * Fires when the menu is fully closed.
316
+ * @event Drilldown#closed
317
+ */
318
+ this.$element.trigger('closed.zf.drilldown');
319
+ }
320
+
321
+ /**
322
+ * Adds event listener for each `back` button, and closes open menus.
323
+ * @function
324
+ * @fires Drilldown#back
325
+ * @param {jQuery} $elem - the current sub-menu to add `back` event.
326
+ */
327
+
328
+ }, {
329
+ key: '_back',
330
+ value: function _back($elem) {
331
+ var _this = this;
332
+ $elem.off('click.zf.drilldown');
333
+ $elem.children('.js-drilldown-back').on('click.zf.drilldown', function (e) {
334
+ e.stopImmediatePropagation();
335
+ // console.log('mouseup on back');
336
+ _this._hide($elem);
337
+
338
+ // If there is a parent submenu, call show
339
+ var parentSubMenu = $elem.parent('li').parent('ul').parent('li');
340
+ if (parentSubMenu.length) {
341
+ _this._show(parentSubMenu);
342
+ }
343
+ });
344
+ }
345
+
346
+ /**
347
+ * Adds event listener to menu items w/o submenus to close open menus on click.
348
+ * @function
349
+ * @private
350
+ */
351
+
352
+ }, {
353
+ key: '_menuLinkEvents',
354
+ value: function _menuLinkEvents() {
355
+ var _this = this;
356
+ this.$menuItems.not('.is-drilldown-submenu-parent').off('click.zf.drilldown').on('click.zf.drilldown', function (e) {
357
+ // e.stopImmediatePropagation();
358
+ setTimeout(function () {
359
+ _this._hideAll();
360
+ }, 0);
361
+ });
362
+ }
363
+
364
+ /**
365
+ * Opens a submenu.
366
+ * @function
367
+ * @fires Drilldown#open
368
+ * @param {jQuery} $elem - the current element with a submenu to open, i.e. the `li` tag.
369
+ */
370
+
371
+ }, {
372
+ key: '_show',
373
+ value: function _show($elem) {
374
+ if (this.options.autoHeight) this.$wrapper.css({ height: $elem.children('[data-submenu]').data('calcHeight') });
375
+ $elem.attr('aria-expanded', true);
376
+ $elem.children('[data-submenu]').addClass('is-active').removeClass('invisible').attr('aria-hidden', false);
377
+ /**
378
+ * Fires when the submenu has opened.
379
+ * @event Drilldown#open
380
+ */
381
+ this.$element.trigger('open.zf.drilldown', [$elem]);
382
+ }
383
+ }, {
384
+ key: '_hide',
385
+
386
+
387
+ /**
388
+ * Hides a submenu
389
+ * @function
390
+ * @fires Drilldown#hide
391
+ * @param {jQuery} $elem - the current sub-menu to hide, i.e. the `ul` tag.
392
+ */
393
+ value: function _hide($elem) {
394
+ if (this.options.autoHeight) this.$wrapper.css({ height: $elem.parent().closest('ul').data('calcHeight') });
395
+ var _this = this;
396
+ $elem.parent('li').attr('aria-expanded', false);
397
+ $elem.attr('aria-hidden', true).addClass('is-closing');
398
+ $elem.addClass('is-closing').one(Foundation.transitionend($elem), function () {
399
+ $elem.removeClass('is-active is-closing');
400
+ $elem.blur().addClass('invisible');
401
+ });
402
+ /**
403
+ * Fires when the submenu has closed.
404
+ * @event Drilldown#hide
405
+ */
406
+ $elem.trigger('hide.zf.drilldown', [$elem]);
407
+ }
408
+
409
+ /**
410
+ * Iterates through the nested menus to calculate the min-height, and max-width for the menu.
411
+ * Prevents content jumping.
412
+ * @function
413
+ * @private
414
+ */
415
+
416
+ }, {
417
+ key: '_getMaxDims',
418
+ value: function _getMaxDims() {
419
+ var maxHeight = 0,
420
+ result = {},
421
+ _this = this;
422
+ this.$submenus.add(this.$element).each(function () {
423
+ var numOfElems = $(this).children('li').length;
424
+ var height = Foundation.Box.GetDimensions(this).height;
425
+ maxHeight = height > maxHeight ? height : maxHeight;
426
+ if (_this.options.autoHeight) {
427
+ $(this).data('calcHeight', height);
428
+ if (!$(this).hasClass('is-drilldown-submenu')) result['height'] = height;
429
+ }
430
+ });
431
+
432
+ if (!this.options.autoHeight) result['min-height'] = maxHeight + 'px';
433
+
434
+ result['max-width'] = this.$element[0].getBoundingClientRect().width + 'px';
435
+
436
+ return result;
437
+ }
438
+
439
+ /**
440
+ * Destroys the Drilldown Menu
441
+ * @function
442
+ */
443
+
444
+ }, {
445
+ key: 'destroy',
446
+ value: function destroy() {
447
+ if (this.options.scrollTop) this.$element.off('.zf.drilldown', this._bindHandler);
448
+ this._hideAll();
449
+ this.$element.off('mutateme.zf.trigger');
450
+ Foundation.Nest.Burn(this.$element, 'drilldown');
451
+ this.$element.unwrap().find('.js-drilldown-back, .is-submenu-parent-item').remove().end().find('.is-active, .is-closing, .is-drilldown-submenu').removeClass('is-active is-closing is-drilldown-submenu').end().find('[data-submenu]').removeAttr('aria-hidden tabindex role');
452
+ this.$submenuAnchors.each(function () {
453
+ $(this).off('.zf.drilldown');
454
+ });
455
+
456
+ this.$submenus.removeClass('drilldown-submenu-cover-previous');
457
+
458
+ this.$element.find('a').each(function () {
459
+ var $link = $(this);
460
+ $link.removeAttr('tabindex');
461
+ if ($link.data('savedHref')) {
462
+ $link.attr('href', $link.data('savedHref')).removeData('savedHref');
463
+ } else {
464
+ return;
465
+ }
466
+ });
467
+ Foundation.unregisterPlugin(this);
468
+ }
469
+ }]);
470
+
471
+ return Drilldown;
472
+ }();
473
+
474
+ Drilldown.defaults = {
475
+ /**
476
+ * Markup used for JS generated back button. Prepended or appended (see backButtonPosition) to submenu lists and deleted on `destroy` method, 'js-drilldown-back' class required. Remove the backslash (`\`) if copy and pasting.
477
+ * @option
478
+ * @type {string}
479
+ * @default '<li class="js-drilldown-back"><a tabindex="0">Back</a></li>'
480
+ */
481
+ backButton: '<li class="js-drilldown-back"><a tabindex="0">Back</a></li>',
482
+ /**
483
+ * Position the back button either at the top or bottom of drilldown submenus. Can be `'left'` or `'bottom'`.
484
+ * @option
485
+ * @type {string}
486
+ * @default top
487
+ */
488
+ backButtonPosition: 'top',
489
+ /**
490
+ * Markup used to wrap drilldown menu. Use a class name for independent styling; the JS applied class: `is-drilldown` is required. Remove the backslash (`\`) if copy and pasting.
491
+ * @option
492
+ * @type {string}
493
+ * @default '<div></div>'
494
+ */
495
+ wrapper: '<div></div>',
496
+ /**
497
+ * Adds the parent link to the submenu.
498
+ * @option
499
+ * @type {boolean}
500
+ * @default false
501
+ */
502
+ parentLink: false,
503
+ /**
504
+ * Allow the menu to return to root list on body click.
505
+ * @option
506
+ * @type {boolean}
507
+ * @default false
508
+ */
509
+ closeOnClick: false,
510
+ /**
511
+ * Allow the menu to auto adjust height.
512
+ * @option
513
+ * @type {boolean}
514
+ * @default false
515
+ */
516
+ autoHeight: false,
517
+ /**
518
+ * Animate the auto adjust height.
519
+ * @option
520
+ * @type {boolean}
521
+ * @default false
522
+ */
523
+ animateHeight: false,
524
+ /**
525
+ * Scroll to the top of the menu after opening a submenu or navigating back using the menu back button
526
+ * @option
527
+ * @type {boolean}
528
+ * @default false
529
+ */
530
+ scrollTop: false,
531
+ /**
532
+ * String jquery selector (for example 'body') of element to take offset().top from, if empty string the drilldown menu offset().top is taken
533
+ * @option
534
+ * @type {string}
535
+ * @default ''
536
+ */
537
+ scrollTopElement: '',
538
+ /**
539
+ * ScrollTop offset
540
+ * @option
541
+ * @type {number}
542
+ * @default 0
543
+ */
544
+ scrollTopOffset: 0,
545
+ /**
546
+ * Scroll animation duration
547
+ * @option
548
+ * @type {number}
549
+ * @default 500
550
+ */
551
+ animationDuration: 500,
552
+ /**
553
+ * Scroll animation easing. Can be `'swing'` or `'linear'`.
554
+ * @option
555
+ * @type {string}
556
+ * @see {@link https://api.jquery.com/animate|JQuery animate}
557
+ * @default 'swing'
558
+ */
559
+ animationEasing: 'swing'
560
+ // holdOpen: false
561
+ };
562
+
563
+ // Window exports
564
+ Foundation.plugin(Drilldown, 'Drilldown');
565
+ }(jQuery);