diff --git a/.gitignore b/.gitignore
new file mode 100644
index 000000000..ba694f76f
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,20 @@
+# See https://help.github.com/articles/ignoring-files for more about ignoring files.
+#
+# If you find yourself ignoring temporary files generated by your text editor
+# or operating system, you probably want to add a global ignore instead:
+# git config --global core.excludesfile '~/.gitignore_global'
+
+# Ignore bundler config.
+/.bundle
+/.env
+
+# Ignore all logfiles and tempfiles.
+/log/*
+/tmp/*
+!/log/.keep
+!/tmp/.keep
+
+/node_modules
+/yarn-error.log
+
+.byebug_history
diff --git a/Gemfile b/Gemfile
new file mode 100644
index 000000000..4a563c900
--- /dev/null
+++ b/Gemfile
@@ -0,0 +1,82 @@
+source 'https://rubygems.org'
+
+git_source(:github) do |repo_name|
+ repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
+ "https://github.com/#{repo_name}.git"
+end
+
+#Added by JULIA:
+gem 'httparty'
+gem 'awesome_print'
+gem 'foundation-rails'
+
+
+# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
+gem 'rails', '~> 5.1.4'
+# Use postgresql as the database for Active Record
+gem 'pg', '~> 0.18'
+# Use Puma as the app server
+gem 'puma', '~> 3.7'
+# Use SCSS for stylesheets
+gem 'sass-rails', '~> 5.0'
+# Use Uglifier as compressor for JavaScript assets
+gem 'uglifier', '>= 1.3.0'
+# See https://github.com/rails/execjs#readme for more supported runtimes
+# gem 'therubyracer', platforms: :ruby
+
+# Use CoffeeScript for .coffee assets and views
+# gem 'coffee-rails', '~> 4.2'
+# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks
+gem 'turbolinks', '~> 5'
+# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
+gem 'jbuilder', '~> 2.5'
+# Use Redis adapter to run Action Cable in production
+# gem 'redis', '~> 3.0'
+# Use ActiveModel has_secure_password
+# gem 'bcrypt', '~> 3.1.7'
+
+# Use Capistrano for deployment
+# gem 'capistrano-rails', group: :development
+
+group :development, :test do
+ # Call 'byebug' anywhere in the code to stop execution and get a debugger console
+ gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
+ # Adds support for Capybara system testing and selenium driver
+ gem 'capybara', '~> 2.13'
+ gem 'selenium-webdriver'
+ #ADDED BY JULIA:
+ gem 'minitest-vcr'
+ gem 'webmock'
+ gem 'dotenv-rails'
+ gem 'better_errors'
+ gem 'pry-rails'
+ gem 'binding_of_caller'
+ gem 'test_helper'
+end
+
+group :development do
+ # Access an IRB console on exception pages or by using <%= console %> anywhere in the code.
+ gem 'web-console', '>= 3.3.0'
+ gem 'listen', '>= 3.0.5', '< 3.2'
+ # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
+ gem 'spring'
+ gem 'spring-watcher-listen', '~> 2.0.0'
+end
+
+# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
+gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
+
+gem 'jquery-turbolinks'
+gem 'awesome_print'
+
+group :development do
+ gem 'better_errors'
+ gem 'pry-rails'
+ gem 'binding_of_caller'
+end
+
+group :test do
+ gem 'minitest-rails'
+ gem 'minitest-reporters'
+ gem 'minitest-vcr'
+end
diff --git a/Gemfile.lock b/Gemfile.lock
new file mode 100644
index 000000000..c4827dc11
--- /dev/null
+++ b/Gemfile.lock
@@ -0,0 +1,254 @@
+GEM
+ remote: https://rubygems.org/
+ specs:
+ actioncable (5.1.4)
+ actionpack (= 5.1.4)
+ nio4r (~> 2.0)
+ websocket-driver (~> 0.6.1)
+ actionmailer (5.1.4)
+ actionpack (= 5.1.4)
+ actionview (= 5.1.4)
+ activejob (= 5.1.4)
+ mail (~> 2.5, >= 2.5.4)
+ rails-dom-testing (~> 2.0)
+ actionpack (5.1.4)
+ actionview (= 5.1.4)
+ activesupport (= 5.1.4)
+ rack (~> 2.0)
+ rack-test (>= 0.6.3)
+ rails-dom-testing (~> 2.0)
+ rails-html-sanitizer (~> 1.0, >= 1.0.2)
+ actionview (5.1.4)
+ activesupport (= 5.1.4)
+ builder (~> 3.1)
+ erubi (~> 1.4)
+ rails-dom-testing (~> 2.0)
+ rails-html-sanitizer (~> 1.0, >= 1.0.3)
+ activejob (5.1.4)
+ activesupport (= 5.1.4)
+ globalid (>= 0.3.6)
+ activemodel (5.1.4)
+ activesupport (= 5.1.4)
+ activerecord (5.1.4)
+ activemodel (= 5.1.4)
+ activesupport (= 5.1.4)
+ arel (~> 8.0)
+ activesupport (5.1.4)
+ concurrent-ruby (~> 1.0, >= 1.0.2)
+ i18n (~> 0.7)
+ minitest (~> 5.1)
+ tzinfo (~> 1.1)
+ addressable (2.5.2)
+ public_suffix (>= 2.0.2, < 4.0)
+ ansi (1.5.0)
+ arel (8.0.0)
+ awesome_print (1.8.0)
+ better_errors (2.4.0)
+ coderay (>= 1.0.0)
+ erubi (>= 1.0.0)
+ rack (>= 0.9.0)
+ bindex (0.5.0)
+ binding_of_caller (0.7.3)
+ debug_inspector (>= 0.0.1)
+ builder (3.2.3)
+ byebug (9.1.0)
+ capybara (2.15.4)
+ addressable
+ mini_mime (>= 0.1.3)
+ nokogiri (>= 1.3.3)
+ rack (>= 1.0.0)
+ rack-test (>= 0.5.4)
+ xpath (~> 2.0)
+ childprocess (0.8.0)
+ ffi (~> 1.0, >= 1.0.11)
+ coderay (1.1.2)
+ concurrent-ruby (1.0.5)
+ crack (0.4.3)
+ safe_yaml (~> 1.0.0)
+ crass (1.0.2)
+ debug_inspector (0.0.3)
+ dotenv (2.2.1)
+ dotenv-rails (2.2.1)
+ dotenv (= 2.2.1)
+ railties (>= 3.2, < 5.2)
+ erubi (1.7.0)
+ execjs (2.7.0)
+ ffi (1.9.18)
+ foundation-rails (5.4.5.0)
+ railties (>= 3.1.0)
+ sass (>= 3.2.0)
+ globalid (0.4.1)
+ activesupport (>= 4.2.0)
+ hashdiff (0.3.7)
+ httparty (0.15.6)
+ multi_xml (>= 0.5.2)
+ i18n (0.9.0)
+ concurrent-ruby (~> 1.0)
+ jbuilder (2.7.0)
+ activesupport (>= 4.2.0)
+ multi_json (>= 1.2)
+ jquery-turbolinks (2.1.0)
+ railties (>= 3.1.0)
+ turbolinks
+ listen (3.1.5)
+ rb-fsevent (~> 0.9, >= 0.9.4)
+ rb-inotify (~> 0.9, >= 0.9.7)
+ ruby_dep (~> 1.2)
+ loofah (2.1.1)
+ crass (~> 1.0.2)
+ nokogiri (>= 1.5.9)
+ mail (2.7.0)
+ mini_mime (>= 0.1.1)
+ method_source (0.9.0)
+ mini_mime (0.1.4)
+ mini_portile2 (2.3.0)
+ minispec-metadata (2.0.0)
+ minitest
+ minitest (5.10.3)
+ minitest-rails (3.0.0)
+ minitest (~> 5.8)
+ railties (~> 5.0)
+ minitest-reporters (1.1.18)
+ ansi
+ builder
+ minitest (>= 5.0)
+ ruby-progressbar
+ minitest-vcr (1.4.0)
+ minispec-metadata (~> 2.0)
+ minitest (>= 4.7.5)
+ vcr (>= 2.9)
+ multi_json (1.12.2)
+ multi_xml (0.6.0)
+ nio4r (2.1.0)
+ nokogiri (1.8.1)
+ mini_portile2 (~> 2.3.0)
+ pg (0.21.0)
+ pry (0.11.2)
+ coderay (~> 1.1.0)
+ method_source (~> 0.9.0)
+ pry-rails (0.3.6)
+ pry (>= 0.10.4)
+ public_suffix (3.0.0)
+ puma (3.10.0)
+ rack (2.0.3)
+ rack-test (0.7.0)
+ rack (>= 1.0, < 3)
+ rails (5.1.4)
+ actioncable (= 5.1.4)
+ actionmailer (= 5.1.4)
+ actionpack (= 5.1.4)
+ actionview (= 5.1.4)
+ activejob (= 5.1.4)
+ activemodel (= 5.1.4)
+ activerecord (= 5.1.4)
+ activesupport (= 5.1.4)
+ bundler (>= 1.3.0)
+ railties (= 5.1.4)
+ sprockets-rails (>= 2.0.0)
+ rails-dom-testing (2.0.3)
+ activesupport (>= 4.2.0)
+ nokogiri (>= 1.6)
+ rails-html-sanitizer (1.0.3)
+ loofah (~> 2.0)
+ railties (5.1.4)
+ actionpack (= 5.1.4)
+ activesupport (= 5.1.4)
+ method_source
+ rake (>= 0.8.7)
+ thor (>= 0.18.1, < 2.0)
+ rake (12.2.1)
+ rb-fsevent (0.10.2)
+ rb-inotify (0.9.10)
+ ffi (>= 0.5.0, < 2)
+ ruby-progressbar (1.9.0)
+ ruby_dep (1.5.0)
+ rubyzip (1.2.1)
+ safe_yaml (1.0.4)
+ sass (3.5.3)
+ sass-listen (~> 4.0.0)
+ sass-listen (4.0.0)
+ rb-fsevent (~> 0.9, >= 0.9.4)
+ rb-inotify (~> 0.9, >= 0.9.7)
+ sass-rails (5.0.6)
+ railties (>= 4.0.0, < 6)
+ sass (~> 3.1)
+ sprockets (>= 2.8, < 4.0)
+ sprockets-rails (>= 2.0, < 4.0)
+ tilt (>= 1.1, < 3)
+ selenium-webdriver (3.6.0)
+ childprocess (~> 0.5)
+ rubyzip (~> 1.0)
+ spring (2.0.2)
+ activesupport (>= 4.2)
+ spring-watcher-listen (2.0.1)
+ listen (>= 2.7, < 4.0)
+ spring (>= 1.2, < 3.0)
+ sprockets (3.7.1)
+ concurrent-ruby (~> 1.0)
+ rack (> 1, < 3)
+ sprockets-rails (3.2.1)
+ actionpack (>= 4.0)
+ activesupport (>= 4.0)
+ sprockets (>= 3.0.0)
+ test_helper (0.0.1)
+ thor (0.20.0)
+ thread_safe (0.3.6)
+ tilt (2.0.8)
+ turbolinks (5.0.1)
+ turbolinks-source (~> 5)
+ turbolinks-source (5.0.3)
+ tzinfo (1.2.4)
+ thread_safe (~> 0.1)
+ uglifier (3.2.0)
+ execjs (>= 0.3.0, < 3)
+ vcr (3.0.3)
+ web-console (3.5.1)
+ actionview (>= 5.0)
+ activemodel (>= 5.0)
+ bindex (>= 0.4.0)
+ railties (>= 5.0)
+ webmock (3.1.0)
+ addressable (>= 2.3.6)
+ crack (>= 0.3.2)
+ hashdiff
+ websocket-driver (0.6.5)
+ websocket-extensions (>= 0.1.0)
+ websocket-extensions (0.1.2)
+ xpath (2.1.0)
+ nokogiri (~> 1.3)
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ awesome_print
+ better_errors
+ binding_of_caller
+ byebug
+ capybara (~> 2.13)
+ dotenv-rails
+ foundation-rails
+ httparty
+ jbuilder (~> 2.5)
+ jquery-turbolinks
+ listen (>= 3.0.5, < 3.2)
+ minitest-rails
+ minitest-reporters
+ minitest-vcr
+ pg (~> 0.18)
+ pry-rails
+ puma (~> 3.7)
+ rails (~> 5.1.4)
+ sass-rails (~> 5.0)
+ selenium-webdriver
+ spring
+ spring-watcher-listen (~> 2.0.0)
+ test_helper
+ turbolinks (~> 5)
+ tzinfo-data
+ uglifier (>= 1.3.0)
+ web-console (>= 3.3.0)
+ webmock
+
+BUNDLED WITH
+ 1.16.0.pre.3
diff --git a/Rakefile b/Rakefile
new file mode 100644
index 000000000..e85f91391
--- /dev/null
+++ b/Rakefile
@@ -0,0 +1,6 @@
+# Add your own tasks in files placed in lib/tasks ending in .rake,
+# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
+
+require_relative 'config/application'
+
+Rails.application.load_tasks
diff --git a/app/assets/config/manifest.js b/app/assets/config/manifest.js
new file mode 100644
index 000000000..b16e53d6d
--- /dev/null
+++ b/app/assets/config/manifest.js
@@ -0,0 +1,3 @@
+//= link_tree ../images
+//= link_directory ../javascripts .js
+//= link_directory ../stylesheets .css
diff --git a/app/assets/images/.keep b/app/assets/images/.keep
new file mode 100644
index 000000000..e69de29bb
diff --git a/app/assets/images/cutting-board-header.png b/app/assets/images/cutting-board-header.png
new file mode 100644
index 000000000..0616febd9
Binary files /dev/null and b/app/assets/images/cutting-board-header.png differ
diff --git a/app/assets/images/fruit-1323080.jpg b/app/assets/images/fruit-1323080.jpg
new file mode 100644
index 000000000..2a7de8f8b
Binary files /dev/null and b/app/assets/images/fruit-1323080.jpg differ
diff --git a/app/assets/images/fruits-863072.jpg b/app/assets/images/fruits-863072.jpg
new file mode 100644
index 000000000..988ca5487
Binary files /dev/null and b/app/assets/images/fruits-863072.jpg differ
diff --git a/app/assets/images/italian-cuisine.jpg b/app/assets/images/italian-cuisine.jpg
new file mode 100644
index 000000000..44131ccfd
Binary files /dev/null and b/app/assets/images/italian-cuisine.jpg differ
diff --git a/app/assets/images/mushroom_assortment.jpg b/app/assets/images/mushroom_assortment.jpg
new file mode 100644
index 000000000..1b49b2d58
Binary files /dev/null and b/app/assets/images/mushroom_assortment.jpg differ
diff --git a/app/assets/images/salad-2068220.jpg b/app/assets/images/salad-2068220.jpg
new file mode 100644
index 000000000..e92c3755a
Binary files /dev/null and b/app/assets/images/salad-2068220.jpg differ
diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js
new file mode 100644
index 000000000..46b20359f
--- /dev/null
+++ b/app/assets/javascripts/application.js
@@ -0,0 +1,15 @@
+// This is a manifest file that'll be compiled into application.js, which will include all the files
+// listed below.
+//
+// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, or any plugin's
+// vendor/assets/javascripts directory can be referenced here using a relative path.
+//
+// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
+// compiled file. JavaScript code in this file should be added after the last require_* statement.
+//
+// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
+// about supported directives.
+//
+//= require rails-ujs
+//= require turbolinks
+//= require_tree .
diff --git a/app/assets/javascripts/cable.js b/app/assets/javascripts/cable.js
new file mode 100644
index 000000000..739aa5f02
--- /dev/null
+++ b/app/assets/javascripts/cable.js
@@ -0,0 +1,13 @@
+// Action Cable provides the framework to deal with WebSockets in Rails.
+// You can generate new channels where WebSocket features live using the `rails generate channel` command.
+//
+//= require action_cable
+//= require_self
+//= require_tree ./channels
+
+(function() {
+ this.App || (this.App = {});
+
+ App.cable = ActionCable.createConsumer();
+
+}).call(this);
diff --git a/app/assets/javascripts/channels/.keep b/app/assets/javascripts/channels/.keep
new file mode 100644
index 000000000..e69de29bb
diff --git a/app/assets/javascripts/foundation.js b/app/assets/javascripts/foundation.js
new file mode 100644
index 000000000..5c04ab3a6
--- /dev/null
+++ b/app/assets/javascripts/foundation.js
@@ -0,0 +1,11729 @@
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // identity function for calling harmony imports with the correct context
+/******/ __webpack_require__.i = function(value) { return value; };
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 35);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports) {
+
+module.exports = jQuery;
+
+/***/ }),
+/* 1 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return rtl; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return GetYoDigits; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return transitionend; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery__ = __webpack_require__(0);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_jquery__);
+
+
+
+
+// Core Foundation Utilities, utilized in a number of places.
+
+/**
+ * Returns a boolean for RTL support
+ */
+function rtl() {
+ return __WEBPACK_IMPORTED_MODULE_0_jquery___default()('html').attr('dir') === 'rtl';
+}
+
+/**
+ * returns a random base-36 uid with namespacing
+ * @function
+ * @param {Number} length - number of random base-36 digits desired. Increase for more random strings.
+ * @param {String} namespace - name of plugin to be incorporated in uid, optional.
+ * @default {String} '' - if no plugin name is provided, nothing is appended to the uid.
+ * @returns {String} - unique id
+ */
+function GetYoDigits(length, namespace) {
+ length = length || 6;
+ return Math.round(Math.pow(36, length + 1) - Math.random() * Math.pow(36, length)).toString(36).slice(1) + (namespace ? '-' + namespace : '');
+}
+
+function transitionend($elem) {
+ var transitions = {
+ 'transition': 'transitionend',
+ 'WebkitTransition': 'webkitTransitionEnd',
+ 'MozTransition': 'transitionend',
+ 'OTransition': 'otransitionend'
+ };
+ var elem = document.createElement('div'),
+ end;
+
+ for (var t in transitions) {
+ if (typeof elem.style[t] !== 'undefined') {
+ end = transitions[t];
+ }
+ }
+ if (end) {
+ return end;
+ } else {
+ end = setTimeout(function () {
+ $elem.triggerHandler('transitionend', [$elem]);
+ }, 1);
+ return 'transitionend';
+ }
+}
+
+
+
+/***/ }),
+/* 2 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Plugin; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery__ = __webpack_require__(0);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_jquery__);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_core__ = __webpack_require__(1);
+
+
+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; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+
+
+
+// Abstract class for providing lifecycle hooks. Expect plugins to define AT LEAST
+// {function} _setup (replaces previous constructor),
+// {function} _destroy (replaces previous destroy)
+
+var Plugin = function () {
+ function Plugin(element, options) {
+ _classCallCheck(this, Plugin);
+
+ this._setup(element, options);
+ var pluginName = getPluginName(this);
+ this.uuid = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__foundation_util_core__["a" /* GetYoDigits */])(6, pluginName);
+
+ if (!this.$element.attr('data-' + pluginName)) {
+ this.$element.attr('data-' + pluginName, this.uuid);
+ }
+ if (!this.$element.data('zfPlugin')) {
+ this.$element.data('zfPlugin', this);
+ }
+ /**
+ * Fires when the plugin has initialized.
+ * @event Plugin#init
+ */
+ this.$element.trigger('init.zf.' + pluginName);
+ }
+
+ _createClass(Plugin, [{
+ key: 'destroy',
+ value: function destroy() {
+ this._destroy();
+ var pluginName = getPluginName(this);
+ this.$element.removeAttr('data-' + pluginName).removeData('zfPlugin')
+ /**
+ * Fires when the plugin has been destroyed.
+ * @event Plugin#destroyed
+ */
+ .trigger('destroyed.zf.' + pluginName);
+ for (var prop in this) {
+ this[prop] = null; //clean up script to prep for garbage collection.
+ }
+ }
+ }]);
+
+ return Plugin;
+}();
+
+// Convert PascalCase to kebab-case
+// Thank you: http://stackoverflow.com/a/8955580
+
+
+function hyphenate(str) {
+ return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
+}
+
+function getPluginName(obj) {
+ if (typeof obj.constructor.name !== 'undefined') {
+ return hyphenate(obj.constructor.name);
+ } else {
+ return hyphenate(obj.className);
+ }
+}
+
+
+
+/***/ }),
+/* 3 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return MediaQuery; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery__ = __webpack_require__(0);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_jquery__);
+
+
+
+
+// Default set of media queries
+var defaultQueries = {
+ 'default': 'only screen',
+ landscape: 'only screen and (orientation: landscape)',
+ portrait: 'only screen and (orientation: portrait)',
+ retina: 'only screen and (-webkit-min-device-pixel-ratio: 2),' + 'only screen and (min--moz-device-pixel-ratio: 2),' + 'only screen and (-o-min-device-pixel-ratio: 2/1),' + 'only screen and (min-device-pixel-ratio: 2),' + 'only screen and (min-resolution: 192dpi),' + 'only screen and (min-resolution: 2dppx)'
+};
+
+// matchMedia() polyfill - Test a CSS media type/query in JS.
+// Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas, David Knight. Dual MIT/BSD license
+var matchMedia = window.matchMedia || function () {
+ 'use strict';
+
+ // For browsers that support matchMedium api such as IE 9 and webkit
+
+ var styleMedia = window.styleMedia || window.media;
+
+ // For those that don't support matchMedium
+ if (!styleMedia) {
+ var style = document.createElement('style'),
+ script = document.getElementsByTagName('script')[0],
+ info = null;
+
+ style.type = 'text/css';
+ style.id = 'matchmediajs-test';
+
+ script && script.parentNode && script.parentNode.insertBefore(style, script);
+
+ // 'style.currentStyle' is used by IE <= 8 and 'window.getComputedStyle' for all other browsers
+ info = 'getComputedStyle' in window && window.getComputedStyle(style, null) || style.currentStyle;
+
+ styleMedia = {
+ matchMedium: function (media) {
+ var text = '@media ' + media + '{ #matchmediajs-test { width: 1px; } }';
+
+ // 'style.styleSheet' is used by IE <= 8 and 'style.textContent' for all other browsers
+ if (style.styleSheet) {
+ style.styleSheet.cssText = text;
+ } else {
+ style.textContent = text;
+ }
+
+ // Test if media query is true or false
+ return info.width === '1px';
+ }
+ };
+ }
+
+ return function (media) {
+ return {
+ matches: styleMedia.matchMedium(media || 'all'),
+ media: media || 'all'
+ };
+ };
+}();
+
+var MediaQuery = {
+ queries: [],
+
+ current: '',
+
+ /**
+ * Initializes the media query helper, by extracting the breakpoint list from the CSS and activating the breakpoint watcher.
+ * @function
+ * @private
+ */
+ _init: function () {
+ var self = this;
+ var $meta = __WEBPACK_IMPORTED_MODULE_0_jquery___default()('meta.foundation-mq');
+ if (!$meta.length) {
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default()('').appendTo(document.head);
+ }
+
+ var extractedStyles = __WEBPACK_IMPORTED_MODULE_0_jquery___default()('.foundation-mq').css('font-family');
+ var namedQueries;
+
+ namedQueries = parseStyleToObject(extractedStyles);
+
+ for (var key in namedQueries) {
+ if (namedQueries.hasOwnProperty(key)) {
+ self.queries.push({
+ name: key,
+ value: 'only screen and (min-width: ' + namedQueries[key] + ')'
+ });
+ }
+ }
+
+ this.current = this._getCurrentSize();
+
+ this._watcher();
+ },
+
+
+ /**
+ * Checks if the screen is at least as wide as a breakpoint.
+ * @function
+ * @param {String} size - Name of the breakpoint to check.
+ * @returns {Boolean} `true` if the breakpoint matches, `false` if it's smaller.
+ */
+ atLeast: function (size) {
+ var query = this.get(size);
+
+ if (query) {
+ return matchMedia(query).matches;
+ }
+
+ return false;
+ },
+
+
+ /**
+ * Checks if the screen matches to a breakpoint.
+ * @function
+ * @param {String} size - Name of the breakpoint to check, either 'small only' or 'small'. Omitting 'only' falls back to using atLeast() method.
+ * @returns {Boolean} `true` if the breakpoint matches, `false` if it does not.
+ */
+ is: function (size) {
+ size = size.trim().split(' ');
+ if (size.length > 1 && size[1] === 'only') {
+ if (size[0] === this._getCurrentSize()) return true;
+ } else {
+ return this.atLeast(size[0]);
+ }
+ return false;
+ },
+
+
+ /**
+ * Gets the media query of a breakpoint.
+ * @function
+ * @param {String} size - Name of the breakpoint to get.
+ * @returns {String|null} - The media query of the breakpoint, or `null` if the breakpoint doesn't exist.
+ */
+ get: function (size) {
+ for (var i in this.queries) {
+ if (this.queries.hasOwnProperty(i)) {
+ var query = this.queries[i];
+ if (size === query.name) return query.value;
+ }
+ }
+
+ return null;
+ },
+
+
+ /**
+ * Gets the current breakpoint name by testing every breakpoint and returning the last one to match (the biggest one).
+ * @function
+ * @private
+ * @returns {String} Name of the current breakpoint.
+ */
+ _getCurrentSize: function () {
+ var matched;
+
+ for (var i = 0; i < this.queries.length; i++) {
+ var query = this.queries[i];
+
+ if (matchMedia(query.value).matches) {
+ matched = query;
+ }
+ }
+
+ if (typeof matched === 'object') {
+ return matched.name;
+ } else {
+ return matched;
+ }
+ },
+
+
+ /**
+ * Activates the breakpoint watcher, which fires an event on the window whenever the breakpoint changes.
+ * @function
+ * @private
+ */
+ _watcher: function () {
+ var _this = this;
+
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default()(window).off('resize.zf.mediaquery').on('resize.zf.mediaquery', function () {
+ var newSize = _this._getCurrentSize(),
+ currentSize = _this.current;
+
+ if (newSize !== currentSize) {
+ // Change the current media query
+ _this.current = newSize;
+
+ // Broadcast the media query change on the window
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default()(window).trigger('changed.zf.mediaquery', [newSize, currentSize]);
+ }
+ });
+ }
+};
+
+// Thank you: https://github.com/sindresorhus/query-string
+function parseStyleToObject(str) {
+ var styleObject = {};
+
+ if (typeof str !== 'string') {
+ return styleObject;
+ }
+
+ str = str.trim().slice(1, -1); // browsers re-quote string style values
+
+ if (!str) {
+ return styleObject;
+ }
+
+ styleObject = str.split('&').reduce(function (ret, param) {
+ var parts = param.replace(/\+/g, ' ').split('=');
+ var key = parts[0];
+ var val = parts[1];
+ key = decodeURIComponent(key);
+
+ // missing `=` should be `null`:
+ // http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters
+ val = val === undefined ? null : decodeURIComponent(val);
+
+ if (!ret.hasOwnProperty(key)) {
+ ret[key] = val;
+ } else if (Array.isArray(ret[key])) {
+ ret[key].push(val);
+ } else {
+ ret[key] = [ret[key], val];
+ }
+ return ret;
+ }, {});
+
+ return styleObject;
+}
+
+
+
+/***/ }),
+/* 4 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Keyboard; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery__ = __webpack_require__(0);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_jquery__);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_core__ = __webpack_require__(1);
+/*******************************************
+ * *
+ * This util was created by Marius Olbertz *
+ * Please thank Marius on GitHub /owlbertz *
+ * or the web http://www.mariusolbertz.de/ *
+ * *
+ ******************************************/
+
+
+
+
+
+
+var keyCodes = {
+ 9: 'TAB',
+ 13: 'ENTER',
+ 27: 'ESCAPE',
+ 32: 'SPACE',
+ 35: 'END',
+ 36: 'HOME',
+ 37: 'ARROW_LEFT',
+ 38: 'ARROW_UP',
+ 39: 'ARROW_RIGHT',
+ 40: 'ARROW_DOWN'
+};
+
+var commands = {};
+
+// Functions pulled out to be referenceable from internals
+function findFocusable($element) {
+ if (!$element) {
+ return false;
+ }
+ return $element.find('a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]').filter(function () {
+ if (!__WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).is(':visible') || __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).attr('tabindex') < 0) {
+ return false;
+ } //only have visible elements and those that have a tabindex greater or equal 0
+ return true;
+ });
+}
+
+function parseKey(event) {
+ var key = keyCodes[event.which || event.keyCode] || String.fromCharCode(event.which).toUpperCase();
+
+ // Remove un-printable characters, e.g. for `fromCharCode` calls for CTRL only events
+ key = key.replace(/\W+/, '');
+
+ if (event.shiftKey) key = 'SHIFT_' + key;
+ if (event.ctrlKey) key = 'CTRL_' + key;
+ if (event.altKey) key = 'ALT_' + key;
+
+ // Remove trailing underscore, in case only modifiers were used (e.g. only `CTRL_ALT`)
+ key = key.replace(/_$/, '');
+
+ return key;
+}
+
+var Keyboard = {
+ keys: getKeyCodes(keyCodes),
+
+ /**
+ * Parses the (keyboard) event and returns a String that represents its key
+ * Can be used like Foundation.parseKey(event) === Foundation.keys.SPACE
+ * @param {Event} event - the event generated by the event handler
+ * @return String key - String that represents the key pressed
+ */
+ parseKey: parseKey,
+
+ /**
+ * Handles the given (keyboard) event
+ * @param {Event} event - the event generated by the event handler
+ * @param {String} component - Foundation component's name, e.g. Slider or Reveal
+ * @param {Objects} functions - collection of functions that are to be executed
+ */
+ handleKey: function (event, component, functions) {
+ var commandList = commands[component],
+ keyCode = this.parseKey(event),
+ cmds,
+ command,
+ fn;
+
+ if (!commandList) return console.warn('Component not defined!');
+
+ if (typeof commandList.ltr === 'undefined') {
+ // this component does not differentiate between ltr and rtl
+ cmds = commandList; // use plain list
+ } else {
+ // merge ltr and rtl: if document is rtl, rtl overwrites ltr and vice versa
+ if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__foundation_util_core__["c" /* rtl */])()) cmds = __WEBPACK_IMPORTED_MODULE_0_jquery___default.a.extend({}, commandList.ltr, commandList.rtl);else cmds = __WEBPACK_IMPORTED_MODULE_0_jquery___default.a.extend({}, commandList.rtl, commandList.ltr);
+ }
+ command = cmds[keyCode];
+
+ fn = functions[command];
+ if (fn && typeof fn === 'function') {
+ // execute function if exists
+ var returnValue = fn.apply();
+ if (functions.handled || typeof functions.handled === 'function') {
+ // execute function when event was handled
+ functions.handled(returnValue);
+ }
+ } else {
+ if (functions.unhandled || typeof functions.unhandled === 'function') {
+ // execute function when event was not handled
+ functions.unhandled();
+ }
+ }
+ },
+
+
+ /**
+ * Finds all focusable elements within the given `$element`
+ * @param {jQuery} $element - jQuery object to search within
+ * @return {jQuery} $focusable - all focusable elements within `$element`
+ */
+
+ findFocusable: findFocusable,
+
+ /**
+ * Returns the component name name
+ * @param {Object} component - Foundation component, e.g. Slider or Reveal
+ * @return String componentName
+ */
+
+ register: function (componentName, cmds) {
+ commands[componentName] = cmds;
+ },
+
+
+ // TODO9438: These references to Keyboard need to not require global. Will 'this' work in this context?
+ //
+ /**
+ * Traps the focus in the given element.
+ * @param {jQuery} $element jQuery object to trap the foucs into.
+ */
+ trapFocus: function ($element) {
+ var $focusable = findFocusable($element),
+ $firstFocusable = $focusable.eq(0),
+ $lastFocusable = $focusable.eq(-1);
+
+ $element.on('keydown.zf.trapfocus', function (event) {
+ if (event.target === $lastFocusable[0] && parseKey(event) === 'TAB') {
+ event.preventDefault();
+ $firstFocusable.focus();
+ } else if (event.target === $firstFocusable[0] && parseKey(event) === 'SHIFT_TAB') {
+ event.preventDefault();
+ $lastFocusable.focus();
+ }
+ });
+ },
+
+ /**
+ * Releases the trapped focus from the given element.
+ * @param {jQuery} $element jQuery object to release the focus for.
+ */
+ releaseFocus: function ($element) {
+ $element.off('keydown.zf.trapfocus');
+ }
+};
+
+/*
+ * Constants for easier comparing.
+ * Can be used like Foundation.parseKey(event) === Foundation.keys.SPACE
+ */
+function getKeyCodes(kcs) {
+ var k = {};
+ for (var kc in kcs) {
+ k[kcs[kc]] = kcs[kc];
+ }return k;
+}
+
+
+
+/***/ }),
+/* 5 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Triggers; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery__ = __webpack_require__(0);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_jquery__);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_motion__ = __webpack_require__(6);
+
+
+
+
+
+var MutationObserver = function () {
+ var prefixes = ['WebKit', 'Moz', 'O', 'Ms', ''];
+ for (var i = 0; i < prefixes.length; i++) {
+ if (prefixes[i] + 'MutationObserver' in window) {
+ return window[prefixes[i] + 'MutationObserver'];
+ }
+ }
+ return false;
+}();
+
+var triggers = function (el, type) {
+ el.data(type).split(' ').forEach(function (id) {
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default()('#' + id)[type === 'close' ? 'trigger' : 'triggerHandler'](type + '.zf.trigger', [el]);
+ });
+};
+
+var Triggers = {
+ Listeners: {
+ Basic: {},
+ Global: {}
+ },
+ Initializers: {}
+};
+
+Triggers.Listeners.Basic = {
+ openListener: function () {
+ triggers(__WEBPACK_IMPORTED_MODULE_0_jquery___default()(this), 'open');
+ },
+ closeListener: function () {
+ var id = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).data('close');
+ if (id) {
+ triggers(__WEBPACK_IMPORTED_MODULE_0_jquery___default()(this), 'close');
+ } else {
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).trigger('close.zf.trigger');
+ }
+ },
+ toggleListener: function () {
+ var id = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).data('toggle');
+ if (id) {
+ triggers(__WEBPACK_IMPORTED_MODULE_0_jquery___default()(this), 'toggle');
+ } else {
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).trigger('toggle.zf.trigger');
+ }
+ },
+ closeableListener: function (e) {
+ e.stopPropagation();
+ var animation = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).data('closable');
+
+ if (animation !== '') {
+ __WEBPACK_IMPORTED_MODULE_1__foundation_util_motion__["a" /* Motion */].animateOut(__WEBPACK_IMPORTED_MODULE_0_jquery___default()(this), animation, function () {
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).trigger('closed.zf');
+ });
+ } else {
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).fadeOut().trigger('closed.zf');
+ }
+ },
+ toggleFocusListener: function () {
+ var id = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).data('toggle-focus');
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default()('#' + id).triggerHandler('toggle.zf.trigger', [__WEBPACK_IMPORTED_MODULE_0_jquery___default()(this)]);
+ }
+};
+
+// Elements with [data-open] will reveal a plugin that supports it when clicked.
+Triggers.Initializers.addOpenListener = function ($elem) {
+ $elem.off('click.zf.trigger', Triggers.Listeners.Basic.openListener);
+ $elem.on('click.zf.trigger', '[data-open]', Triggers.Listeners.Basic.openListener);
+};
+
+// Elements with [data-close] will close a plugin that supports it when clicked.
+// If used without a value on [data-close], the event will bubble, allowing it to close a parent component.
+Triggers.Initializers.addCloseListener = function ($elem) {
+ $elem.off('click.zf.trigger', Triggers.Listeners.Basic.closeListener);
+ $elem.on('click.zf.trigger', '[data-close]', Triggers.Listeners.Basic.closeListener);
+};
+
+// Elements with [data-toggle] will toggle a plugin that supports it when clicked.
+Triggers.Initializers.addToggleListener = function ($elem) {
+ $elem.off('click.zf.trigger', Triggers.Listeners.Basic.toggleListener);
+ $elem.on('click.zf.trigger', '[data-toggle]', Triggers.Listeners.Basic.toggleListener);
+};
+
+// Elements with [data-closable] will respond to close.zf.trigger events.
+Triggers.Initializers.addCloseableListener = function ($elem) {
+ $elem.off('close.zf.trigger', Triggers.Listeners.Basic.closeableListener);
+ $elem.on('close.zf.trigger', '[data-closeable], [data-closable]', Triggers.Listeners.Basic.closeableListener);
+};
+
+// Elements with [data-toggle-focus] will respond to coming in and out of focus
+Triggers.Initializers.addToggleFocusListener = function ($elem) {
+ $elem.off('focus.zf.trigger blur.zf.trigger', Triggers.Listeners.Basic.toggleFocusListener);
+ $elem.on('focus.zf.trigger blur.zf.trigger', '[data-toggle-focus]', Triggers.Listeners.Basic.toggleFocusListener);
+};
+
+// More Global/complex listeners and triggers
+Triggers.Listeners.Global = {
+ resizeListener: function ($nodes) {
+ if (!MutationObserver) {
+ //fallback for IE 9
+ $nodes.each(function () {
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).triggerHandler('resizeme.zf.trigger');
+ });
+ }
+ //trigger all listening elements and signal a resize event
+ $nodes.attr('data-events', "resize");
+ },
+ scrollListener: function ($nodes) {
+ if (!MutationObserver) {
+ //fallback for IE 9
+ $nodes.each(function () {
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).triggerHandler('scrollme.zf.trigger');
+ });
+ }
+ //trigger all listening elements and signal a scroll event
+ $nodes.attr('data-events', "scroll");
+ },
+ closeMeListener: function (e, pluginId) {
+ var plugin = e.namespace.split('.')[0];
+ var plugins = __WEBPACK_IMPORTED_MODULE_0_jquery___default()('[data-' + plugin + ']').not('[data-yeti-box="' + pluginId + '"]');
+
+ plugins.each(function () {
+ var _this = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this);
+ _this.triggerHandler('close.zf.trigger', [_this]);
+ });
+ }
+};
+
+// Global, parses whole document.
+Triggers.Initializers.addClosemeListener = function (pluginName) {
+ var yetiBoxes = __WEBPACK_IMPORTED_MODULE_0_jquery___default()('[data-yeti-box]'),
+ plugNames = ['dropdown', 'tooltip', 'reveal'];
+
+ if (pluginName) {
+ if (typeof pluginName === 'string') {
+ plugNames.push(pluginName);
+ } else if (typeof pluginName === 'object' && typeof pluginName[0] === 'string') {
+ plugNames.concat(pluginName);
+ } else {
+ console.error('Plugin names must be strings');
+ }
+ }
+ if (yetiBoxes.length) {
+ var listeners = plugNames.map(function (name) {
+ return 'closeme.zf.' + name;
+ }).join(' ');
+
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default()(window).off(listeners).on(listeners, Triggers.Listeners.Global.closeMeListener);
+ }
+};
+
+function debounceGlobalListener(debounce, trigger, listener) {
+ var timer = void 0,
+ args = Array.prototype.slice.call(arguments, 3);
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default()(window).off(trigger).on(trigger, function (e) {
+ if (timer) {
+ clearTimeout(timer);
+ }
+ timer = setTimeout(function () {
+ listener.apply(null, args);
+ }, debounce || 10); //default time to emit scroll event
+ });
+}
+
+Triggers.Initializers.addResizeListener = function (debounce) {
+ var $nodes = __WEBPACK_IMPORTED_MODULE_0_jquery___default()('[data-resize]');
+ if ($nodes.length) {
+ debounceGlobalListener(debounce, 'resize.zf.trigger', Triggers.Listeners.Global.resizeListener, $nodes);
+ }
+};
+
+Triggers.Initializers.addScrollListener = function (debounce) {
+ var $nodes = __WEBPACK_IMPORTED_MODULE_0_jquery___default()('[data-scroll]');
+ if ($nodes.length) {
+ debounceGlobalListener(debounce, 'scroll.zf.trigger', Triggers.Listeners.Global.scrollListener, $nodes);
+ }
+};
+
+Triggers.Initializers.addMutationEventsListener = function ($elem) {
+ if (!MutationObserver) {
+ return false;
+ }
+ var $nodes = $elem.find('[data-resize], [data-scroll], [data-mutate]');
+
+ //element callback
+ var listeningElementsMutation = function (mutationRecordsList) {
+ var $target = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(mutationRecordsList[0].target);
+
+ //trigger the event handler for the element depending on type
+ switch (mutationRecordsList[0].type) {
+ case "attributes":
+ if ($target.attr("data-events") === "scroll" && mutationRecordsList[0].attributeName === "data-events") {
+ $target.triggerHandler('scrollme.zf.trigger', [$target, window.pageYOffset]);
+ }
+ if ($target.attr("data-events") === "resize" && mutationRecordsList[0].attributeName === "data-events") {
+ $target.triggerHandler('resizeme.zf.trigger', [$target]);
+ }
+ if (mutationRecordsList[0].attributeName === "style") {
+ $target.closest("[data-mutate]").attr("data-events", "mutate");
+ $target.closest("[data-mutate]").triggerHandler('mutateme.zf.trigger', [$target.closest("[data-mutate]")]);
+ }
+ break;
+
+ case "childList":
+ $target.closest("[data-mutate]").attr("data-events", "mutate");
+ $target.closest("[data-mutate]").triggerHandler('mutateme.zf.trigger', [$target.closest("[data-mutate]")]);
+ break;
+
+ default:
+ return false;
+ //nothing
+ }
+ };
+
+ if ($nodes.length) {
+ //for each element that needs to listen for resizing, scrolling, or mutation add a single observer
+ for (var i = 0; i <= $nodes.length - 1; i++) {
+ var elementObserver = new MutationObserver(listeningElementsMutation);
+ elementObserver.observe($nodes[i], { attributes: true, childList: true, characterData: false, subtree: true, attributeFilter: ["data-events", "style"] });
+ }
+ }
+};
+
+Triggers.Initializers.addSimpleListeners = function () {
+ var $document = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(document);
+
+ Triggers.Initializers.addOpenListener($document);
+ Triggers.Initializers.addCloseListener($document);
+ Triggers.Initializers.addToggleListener($document);
+ Triggers.Initializers.addCloseableListener($document);
+ Triggers.Initializers.addToggleFocusListener($document);
+};
+
+Triggers.Initializers.addGlobalListeners = function () {
+ var $document = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(document);
+ Triggers.Initializers.addMutationEventsListener($document);
+ Triggers.Initializers.addResizeListener();
+ Triggers.Initializers.addScrollListener();
+ Triggers.Initializers.addClosemeListener();
+};
+
+Triggers.init = function ($, Foundation) {
+ if (typeof $.triggersInitialized === 'undefined') {
+ var $document = $(document);
+
+ if (document.readyState === "complete") {
+ Triggers.Initializers.addSimpleListeners();
+ Triggers.Initializers.addGlobalListeners();
+ } else {
+ $(window).on('load', function () {
+ Triggers.Initializers.addSimpleListeners();
+ Triggers.Initializers.addGlobalListeners();
+ });
+ }
+
+ $.triggersInitialized = true;
+ }
+
+ if (Foundation) {
+ Foundation.Triggers = Triggers;
+ // Legacy included to be backwards compatible for now.
+ Foundation.IHearYou = Triggers.Initializers.addGlobalListeners;
+ }
+};
+
+
+
+/***/ }),
+/* 6 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return Move; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Motion; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery__ = __webpack_require__(0);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_jquery__);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_core__ = __webpack_require__(1);
+
+
+
+
+
+/**
+ * Motion module.
+ * @module foundation.motion
+ */
+
+var initClasses = ['mui-enter', 'mui-leave'];
+var activeClasses = ['mui-enter-active', 'mui-leave-active'];
+
+var Motion = {
+ animateIn: function (element, animation, cb) {
+ animate(true, element, animation, cb);
+ },
+
+ animateOut: function (element, animation, cb) {
+ animate(false, element, animation, cb);
+ }
+};
+
+function Move(duration, elem, fn) {
+ var anim,
+ prog,
+ start = null;
+ // console.log('called');
+
+ if (duration === 0) {
+ fn.apply(elem);
+ elem.trigger('finished.zf.animate', [elem]).triggerHandler('finished.zf.animate', [elem]);
+ return;
+ }
+
+ function move(ts) {
+ if (!start) start = ts;
+ // console.log(start, ts);
+ prog = ts - start;
+ fn.apply(elem);
+
+ if (prog < duration) {
+ anim = window.requestAnimationFrame(move, elem);
+ } else {
+ window.cancelAnimationFrame(anim);
+ elem.trigger('finished.zf.animate', [elem]).triggerHandler('finished.zf.animate', [elem]);
+ }
+ }
+ anim = window.requestAnimationFrame(move);
+}
+
+/**
+ * Animates an element in or out using a CSS transition class.
+ * @function
+ * @private
+ * @param {Boolean} isIn - Defines if the animation is in or out.
+ * @param {Object} element - jQuery or HTML object to animate.
+ * @param {String} animation - CSS class to use.
+ * @param {Function} cb - Callback to run when animation is finished.
+ */
+function animate(isIn, element, animation, cb) {
+ element = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(element).eq(0);
+
+ if (!element.length) return;
+
+ var initClass = isIn ? initClasses[0] : initClasses[1];
+ var activeClass = isIn ? activeClasses[0] : activeClasses[1];
+
+ // Set up the animation
+ reset();
+
+ element.addClass(animation).css('transition', 'none');
+
+ requestAnimationFrame(function () {
+ element.addClass(initClass);
+ if (isIn) element.show();
+ });
+
+ // Start the animation
+ requestAnimationFrame(function () {
+ element[0].offsetWidth;
+ element.css('transition', '').addClass(activeClass);
+ });
+
+ // Clean up the animation when it finishes
+ element.one(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__foundation_util_core__["b" /* transitionend */])(element), finish);
+
+ // Hides the element (for out animations), resets the element, and runs a callback
+ function finish() {
+ if (!isIn) element.hide();
+ reset();
+ if (cb) cb.apply(element);
+ }
+
+ // Resets transitions and removes motion-specific classes
+ function reset() {
+ element[0].style.transitionDuration = 0;
+ element.removeClass(initClass + ' ' + activeClass + ' ' + animation);
+ }
+}
+
+
+
+/***/ }),
+/* 7 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Box; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_util_core__ = __webpack_require__(1);
+
+
+
+
+var Box = {
+ ImNotTouchingYou: ImNotTouchingYou,
+ OverlapArea: OverlapArea,
+ GetDimensions: GetDimensions,
+ GetOffsets: GetOffsets,
+ GetExplicitOffsets: GetExplicitOffsets
+};
+
+/**
+ * Compares the dimensions of an element to a container and determines collision events with container.
+ * @function
+ * @param {jQuery} element - jQuery object to test for collisions.
+ * @param {jQuery} parent - jQuery object to use as bounding container.
+ * @param {Boolean} lrOnly - set to true to check left and right values only.
+ * @param {Boolean} tbOnly - set to true to check top and bottom values only.
+ * @default if no parent object passed, detects collisions with `window`.
+ * @returns {Boolean} - true if collision free, false if a collision in any direction.
+ */
+function ImNotTouchingYou(element, parent, lrOnly, tbOnly, ignoreBottom) {
+ return OverlapArea(element, parent, lrOnly, tbOnly, ignoreBottom) === 0;
+};
+
+function OverlapArea(element, parent, lrOnly, tbOnly, ignoreBottom) {
+ var eleDims = GetDimensions(element),
+ topOver,
+ bottomOver,
+ leftOver,
+ rightOver;
+ if (parent) {
+ var parDims = GetDimensions(parent);
+
+ bottomOver = parDims.height + parDims.offset.top - (eleDims.offset.top + eleDims.height);
+ topOver = eleDims.offset.top - parDims.offset.top;
+ leftOver = eleDims.offset.left - parDims.offset.left;
+ rightOver = parDims.width + parDims.offset.left - (eleDims.offset.left + eleDims.width);
+ } else {
+ bottomOver = eleDims.windowDims.height + eleDims.windowDims.offset.top - (eleDims.offset.top + eleDims.height);
+ topOver = eleDims.offset.top - eleDims.windowDims.offset.top;
+ leftOver = eleDims.offset.left - eleDims.windowDims.offset.left;
+ rightOver = eleDims.windowDims.width - (eleDims.offset.left + eleDims.width);
+ }
+
+ bottomOver = ignoreBottom ? 0 : Math.min(bottomOver, 0);
+ topOver = Math.min(topOver, 0);
+ leftOver = Math.min(leftOver, 0);
+ rightOver = Math.min(rightOver, 0);
+
+ if (lrOnly) {
+ return leftOver + rightOver;
+ }
+ if (tbOnly) {
+ return topOver + bottomOver;
+ }
+
+ // use sum of squares b/c we care about overlap area.
+ return Math.sqrt(topOver * topOver + bottomOver * bottomOver + leftOver * leftOver + rightOver * rightOver);
+}
+
+/**
+ * Uses native methods to return an object of dimension values.
+ * @function
+ * @param {jQuery || HTML} element - jQuery object or DOM element for which to get the dimensions. Can be any element other that document or window.
+ * @returns {Object} - nested object of integer pixel values
+ * TODO - if element is window, return only those values.
+ */
+function GetDimensions(elem) {
+ elem = elem.length ? elem[0] : elem;
+
+ if (elem === window || elem === document) {
+ throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");
+ }
+
+ var rect = elem.getBoundingClientRect(),
+ parRect = elem.parentNode.getBoundingClientRect(),
+ winRect = document.body.getBoundingClientRect(),
+ winY = window.pageYOffset,
+ winX = window.pageXOffset;
+
+ return {
+ width: rect.width,
+ height: rect.height,
+ offset: {
+ top: rect.top + winY,
+ left: rect.left + winX
+ },
+ parentDims: {
+ width: parRect.width,
+ height: parRect.height,
+ offset: {
+ top: parRect.top + winY,
+ left: parRect.left + winX
+ }
+ },
+ windowDims: {
+ width: winRect.width,
+ height: winRect.height,
+ offset: {
+ top: winY,
+ left: winX
+ }
+ }
+ };
+}
+
+/**
+ * Returns an object of top and left integer pixel values for dynamically rendered elements,
+ * such as: Tooltip, Reveal, and Dropdown. Maintained for backwards compatibility, and where
+ * you don't know alignment, but generally from
+ * 6.4 forward you should use GetExplicitOffsets, as GetOffsets conflates position and alignment.
+ * @function
+ * @param {jQuery} element - jQuery object for the element being positioned.
+ * @param {jQuery} anchor - jQuery object for the element's anchor point.
+ * @param {String} position - a string relating to the desired position of the element, relative to it's anchor
+ * @param {Number} vOffset - integer pixel value of desired vertical separation between anchor and element.
+ * @param {Number} hOffset - integer pixel value of desired horizontal separation between anchor and element.
+ * @param {Boolean} isOverflow - if a collision event is detected, sets to true to default the element to full width - any desired offset.
+ * TODO alter/rewrite to work with `em` values as well/instead of pixels
+ */
+function GetOffsets(element, anchor, position, vOffset, hOffset, isOverflow) {
+ console.log("NOTE: GetOffsets is deprecated in favor of GetExplicitOffsets and will be removed in 6.5");
+ switch (position) {
+ case 'top':
+ return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__foundation_util_core__["c" /* rtl */])() ? GetExplicitOffsets(element, anchor, 'top', 'left', vOffset, hOffset, isOverflow) : GetExplicitOffsets(element, anchor, 'top', 'right', vOffset, hOffset, isOverflow);
+ case 'bottom':
+ return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__foundation_util_core__["c" /* rtl */])() ? GetExplicitOffsets(element, anchor, 'bottom', 'left', vOffset, hOffset, isOverflow) : GetExplicitOffsets(element, anchor, 'bottom', 'right', vOffset, hOffset, isOverflow);
+ case 'center top':
+ return GetExplicitOffsets(element, anchor, 'top', 'center', vOffset, hOffset, isOverflow);
+ case 'center bottom':
+ return GetExplicitOffsets(element, anchor, 'bottom', 'center', vOffset, hOffset, isOverflow);
+ case 'center left':
+ return GetExplicitOffsets(element, anchor, 'left', 'center', vOffset, hOffset, isOverflow);
+ case 'center right':
+ return GetExplicitOffsets(element, anchor, 'right', 'center', vOffset, hOffset, isOverflow);
+ case 'left bottom':
+ return GetExplicitOffsets(element, anchor, 'bottom', 'left', vOffset, hOffset, isOverflow);
+ case 'right bottom':
+ return GetExplicitOffsets(element, anchor, 'bottom', 'right', vOffset, hOffset, isOverflow);
+ // Backwards compatibility... this along with the reveal and reveal full
+ // classes are the only ones that didn't reference anchor
+ case 'center':
+ return {
+ left: $eleDims.windowDims.offset.left + $eleDims.windowDims.width / 2 - $eleDims.width / 2 + hOffset,
+ top: $eleDims.windowDims.offset.top + $eleDims.windowDims.height / 2 - ($eleDims.height / 2 + vOffset)
+ };
+ case 'reveal':
+ return {
+ left: ($eleDims.windowDims.width - $eleDims.width) / 2 + hOffset,
+ top: $eleDims.windowDims.offset.top + vOffset
+ };
+ case 'reveal full':
+ return {
+ left: $eleDims.windowDims.offset.left,
+ top: $eleDims.windowDims.offset.top
+ };
+ break;
+ default:
+ return {
+ left: __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__foundation_util_core__["c" /* rtl */])() ? $anchorDims.offset.left - $eleDims.width + $anchorDims.width - hOffset : $anchorDims.offset.left + hOffset,
+ top: $anchorDims.offset.top + $anchorDims.height + vOffset
+ };
+
+ }
+}
+
+function GetExplicitOffsets(element, anchor, position, alignment, vOffset, hOffset, isOverflow) {
+ var $eleDims = GetDimensions(element),
+ $anchorDims = anchor ? GetDimensions(anchor) : null;
+
+ var topVal, leftVal;
+
+ // set position related attribute
+
+ switch (position) {
+ case 'top':
+ topVal = $anchorDims.offset.top - ($eleDims.height + vOffset);
+ break;
+ case 'bottom':
+ topVal = $anchorDims.offset.top + $anchorDims.height + vOffset;
+ break;
+ case 'left':
+ leftVal = $anchorDims.offset.left - ($eleDims.width + hOffset);
+ break;
+ case 'right':
+ leftVal = $anchorDims.offset.left + $anchorDims.width + hOffset;
+ break;
+ }
+
+ // set alignment related attribute
+ switch (position) {
+ case 'top':
+ case 'bottom':
+ switch (alignment) {
+ case 'left':
+ leftVal = $anchorDims.offset.left + hOffset;
+ break;
+ case 'right':
+ leftVal = $anchorDims.offset.left - $eleDims.width + $anchorDims.width - hOffset;
+ break;
+ case 'center':
+ leftVal = isOverflow ? hOffset : $anchorDims.offset.left + $anchorDims.width / 2 - $eleDims.width / 2 + hOffset;
+ break;
+ }
+ break;
+ case 'right':
+ case 'left':
+ switch (alignment) {
+ case 'bottom':
+ topVal = $anchorDims.offset.top - vOffset + $anchorDims.height - $eleDims.height;
+ break;
+ case 'top':
+ topVal = $anchorDims.offset.top + vOffset;
+ break;
+ case 'center':
+ topVal = $anchorDims.offset.top + vOffset + $anchorDims.height / 2 - $eleDims.height / 2;
+ break;
+ }
+ break;
+ }
+ return { top: topVal, left: leftVal };
+}
+
+
+
+/***/ }),
+/* 8 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return onImagesLoaded; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery__ = __webpack_require__(0);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_jquery__);
+
+
+
+
+/**
+ * Runs a callback function when images are fully loaded.
+ * @param {Object} images - Image(s) to check if loaded.
+ * @param {Func} callback - Function to execute when image is fully loaded.
+ */
+function onImagesLoaded(images, callback) {
+ var self = this,
+ unloaded = images.length;
+
+ if (unloaded === 0) {
+ callback();
+ }
+
+ images.each(function () {
+ // Check if image is loaded
+ if (this.complete && this.naturalWidth !== undefined) {
+ singleImageLoaded();
+ } else {
+ // If the above check failed, simulate loading on detached element.
+ var image = new Image();
+ // Still count image as loaded if it finalizes with an error.
+ var events = "load.zf.images error.zf.images";
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default()(image).one(events, function me(event) {
+ // Unbind the event listeners. We're using 'one' but only one of the two events will have fired.
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).off(events, me);
+ singleImageLoaded();
+ });
+ image.src = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).attr('src');
+ }
+ });
+
+ function singleImageLoaded() {
+ unloaded--;
+ if (unloaded === 0) {
+ callback();
+ }
+ }
+}
+
+
+
+/***/ }),
+/* 9 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Nest; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery__ = __webpack_require__(0);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_jquery__);
+
+
+
+
+var Nest = {
+ Feather: function (menu) {
+ var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'zf';
+
+ menu.attr('role', 'menubar');
+
+ var items = menu.find('li').attr({ 'role': 'menuitem' }),
+ subMenuClass = 'is-' + type + '-submenu',
+ subItemClass = subMenuClass + '-item',
+ hasSubClass = 'is-' + type + '-submenu-parent',
+ applyAria = type !== 'accordion'; // Accordions handle their own ARIA attriutes.
+
+ items.each(function () {
+ var $item = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this),
+ $sub = $item.children('ul');
+
+ if ($sub.length) {
+ $item.addClass(hasSubClass);
+ $sub.addClass('submenu ' + subMenuClass).attr({ 'data-submenu': '' });
+ if (applyAria) {
+ $item.attr({
+ 'aria-haspopup': true,
+ 'aria-label': $item.children('a:first').text()
+ });
+ // Note: Drilldowns behave differently in how they hide, and so need
+ // additional attributes. We should look if this possibly over-generalized
+ // utility (Nest) is appropriate when we rework menus in 6.4
+ if (type === 'drilldown') {
+ $item.attr({ 'aria-expanded': false });
+ }
+ }
+ $sub.addClass('submenu ' + subMenuClass).attr({
+ 'data-submenu': '',
+ 'role': 'menu'
+ });
+ if (type === 'drilldown') {
+ $sub.attr({ 'aria-hidden': true });
+ }
+ }
+
+ if ($item.parent('[data-submenu]').length) {
+ $item.addClass('is-submenu-item ' + subItemClass);
+ }
+ });
+
+ return;
+ },
+ Burn: function (menu, type) {
+ var //items = menu.find('li'),
+ subMenuClass = 'is-' + type + '-submenu',
+ subItemClass = subMenuClass + '-item',
+ hasSubClass = 'is-' + type + '-submenu-parent';
+
+ menu.find('>li, .menu, .menu > li').removeClass(subMenuClass + ' ' + subItemClass + ' ' + hasSubClass + ' is-submenu-item submenu is-active').removeAttr('data-submenu').css('display', '');
+ }
+};
+
+
+
+/***/ }),
+/* 10 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Accordion; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery__ = __webpack_require__(0);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_jquery__);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__ = __webpack_require__(4);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_core__ = __webpack_require__(1);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__foundation_plugin__ = __webpack_require__(2);
+
+
+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; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+
+
+
+
+
+/**
+ * Accordion module.
+ * @module foundation.accordion
+ * @requires foundation.util.keyboard
+ */
+
+var Accordion = function (_Plugin) {
+ _inherits(Accordion, _Plugin);
+
+ function Accordion() {
+ _classCallCheck(this, Accordion);
+
+ return _possibleConstructorReturn(this, (Accordion.__proto__ || Object.getPrototypeOf(Accordion)).apply(this, arguments));
+ }
+
+ _createClass(Accordion, [{
+ key: '_setup',
+
+ /**
+ * Creates a new instance of an accordion.
+ * @class
+ * @name Accordion
+ * @fires Accordion#init
+ * @param {jQuery} element - jQuery object to make into an accordion.
+ * @param {Object} options - a plain object with settings to override the default options.
+ */
+ value: function _setup(element, options) {
+ this.$element = element;
+ this.options = __WEBPACK_IMPORTED_MODULE_0_jquery___default.a.extend({}, Accordion.defaults, this.$element.data(), options);
+
+ this.className = 'Accordion'; // ie9 back compat
+ this._init();
+
+ __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__["a" /* Keyboard */].register('Accordion', {
+ 'ENTER': 'toggle',
+ 'SPACE': 'toggle',
+ 'ARROW_DOWN': 'next',
+ 'ARROW_UP': 'previous'
+ });
+ }
+
+ /**
+ * Initializes the accordion by animating the preset active pane(s).
+ * @private
+ */
+
+ }, {
+ key: '_init',
+ value: function _init() {
+ var _this3 = this;
+
+ this.$element.attr('role', 'tablist');
+ this.$tabs = this.$element.children('[data-accordion-item]');
+
+ this.$tabs.each(function (idx, el) {
+ var $el = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(el),
+ $content = $el.children('[data-tab-content]'),
+ id = $content[0].id || __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__foundation_util_core__["a" /* GetYoDigits */])(6, 'accordion'),
+ linkId = el.id || id + '-label';
+
+ $el.find('a:first').attr({
+ 'aria-controls': id,
+ 'role': 'tab',
+ 'id': linkId,
+ 'aria-expanded': false,
+ 'aria-selected': false
+ });
+
+ $content.attr({ 'role': 'tabpanel', 'aria-labelledby': linkId, 'aria-hidden': true, 'id': id });
+ });
+ var $initActive = this.$element.find('.is-active').children('[data-tab-content]');
+ this.firstTimeInit = true;
+ if ($initActive.length) {
+ this.down($initActive, this.firstTimeInit);
+ this.firstTimeInit = false;
+ }
+
+ this._checkDeepLink = function () {
+ var anchor = window.location.hash;
+ //need a hash and a relevant anchor in this tabset
+ if (anchor.length) {
+ var $link = _this3.$element.find('[href$="' + anchor + '"]'),
+ $anchor = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(anchor);
+
+ if ($link.length && $anchor) {
+ if (!$link.parent('[data-accordion-item]').hasClass('is-active')) {
+ _this3.down($anchor, _this3.firstTimeInit);
+ _this3.firstTimeInit = false;
+ };
+
+ //roll up a little to show the titles
+ if (_this3.options.deepLinkSmudge) {
+ var _this = _this3;
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default()(window).load(function () {
+ var offset = _this.$element.offset();
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default()('html, body').animate({ scrollTop: offset.top }, _this.options.deepLinkSmudgeDelay);
+ });
+ }
+
+ /**
+ * Fires when the zplugin has deeplinked at pageload
+ * @event Accordion#deeplink
+ */
+ _this3.$element.trigger('deeplink.zf.accordion', [$link, $anchor]);
+ }
+ }
+ };
+
+ //use browser to open a tab, if it exists in this tabset
+ if (this.options.deepLink) {
+ this._checkDeepLink();
+ }
+
+ this._events();
+ }
+
+ /**
+ * Adds event handlers for items within the accordion.
+ * @private
+ */
+
+ }, {
+ key: '_events',
+ value: function _events() {
+ var _this = this;
+
+ this.$tabs.each(function () {
+ var $elem = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this);
+ var $tabContent = $elem.children('[data-tab-content]');
+ if ($tabContent.length) {
+ $elem.children('a').off('click.zf.accordion keydown.zf.accordion').on('click.zf.accordion', function (e) {
+ e.preventDefault();
+ _this.toggle($tabContent);
+ }).on('keydown.zf.accordion', function (e) {
+ __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__["a" /* Keyboard */].handleKey(e, 'Accordion', {
+ toggle: function () {
+ _this.toggle($tabContent);
+ },
+ next: function () {
+ var $a = $elem.next().find('a').focus();
+ if (!_this.options.multiExpand) {
+ $a.trigger('click.zf.accordion');
+ }
+ },
+ previous: function () {
+ var $a = $elem.prev().find('a').focus();
+ if (!_this.options.multiExpand) {
+ $a.trigger('click.zf.accordion');
+ }
+ },
+ handled: function () {
+ e.preventDefault();
+ e.stopPropagation();
+ }
+ });
+ });
+ }
+ });
+ if (this.options.deepLink) {
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default()(window).on('popstate', this._checkDeepLink);
+ }
+ }
+
+ /**
+ * Toggles the selected content pane's open/close state.
+ * @param {jQuery} $target - jQuery object of the pane to toggle (`.accordion-content`).
+ * @function
+ */
+
+ }, {
+ key: 'toggle',
+ value: function toggle($target) {
+ if ($target.closest('[data-accordion]').is('[disabled]')) {
+ console.info('Cannot toggle an accordion that is disabled.');
+ return;
+ }
+ if ($target.parent().hasClass('is-active')) {
+ this.up($target);
+ } else {
+ this.down($target);
+ }
+ //either replace or update browser history
+ if (this.options.deepLink) {
+ var anchor = $target.prev('a').attr('href');
+
+ if (this.options.updateHistory) {
+ history.pushState({}, '', anchor);
+ } else {
+ history.replaceState({}, '', anchor);
+ }
+ }
+ }
+
+ /**
+ * Opens the accordion tab defined by `$target`.
+ * @param {jQuery} $target - Accordion pane to open (`.accordion-content`).
+ * @param {Boolean} firstTime - flag to determine if reflow should happen.
+ * @fires Accordion#down
+ * @function
+ */
+
+ }, {
+ key: 'down',
+ value: function down($target, firstTime) {
+ var _this4 = this;
+
+ /**
+ * checking firstTime allows for initial render of the accordion
+ * to render preset is-active panes.
+ */
+ if ($target.closest('[data-accordion]').is('[disabled]') && !firstTime) {
+ console.info('Cannot call down on an accordion that is disabled.');
+ return;
+ }
+ $target.attr('aria-hidden', false).parent('[data-tab-content]').addBack().parent().addClass('is-active');
+
+ if (!this.options.multiExpand && !firstTime) {
+ var $currentActive = this.$element.children('.is-active').children('[data-tab-content]');
+ if ($currentActive.length) {
+ this.up($currentActive.not($target));
+ }
+ }
+
+ $target.slideDown(this.options.slideSpeed, function () {
+ /**
+ * Fires when the tab is done opening.
+ * @event Accordion#down
+ */
+ _this4.$element.trigger('down.zf.accordion', [$target]);
+ });
+
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default()('#' + $target.attr('aria-labelledby')).attr({
+ 'aria-expanded': true,
+ 'aria-selected': true
+ });
+ }
+
+ /**
+ * Closes the tab defined by `$target`.
+ * @param {jQuery} $target - Accordion tab to close (`.accordion-content`).
+ * @fires Accordion#up
+ * @function
+ */
+
+ }, {
+ key: 'up',
+ value: function up($target) {
+ if ($target.closest('[data-accordion]').is('[disabled]')) {
+ console.info('Cannot call up on an accordion that is disabled.');
+ return;
+ }
+
+ var $aunts = $target.parent().siblings(),
+ _this = this;
+
+ if (!this.options.allowAllClosed && !$aunts.hasClass('is-active') || !$target.parent().hasClass('is-active')) {
+ return;
+ }
+
+ $target.slideUp(_this.options.slideSpeed, function () {
+ /**
+ * Fires when the tab is done collapsing up.
+ * @event Accordion#up
+ */
+ _this.$element.trigger('up.zf.accordion', [$target]);
+ });
+
+ $target.attr('aria-hidden', true).parent().removeClass('is-active');
+
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default()('#' + $target.attr('aria-labelledby')).attr({
+ 'aria-expanded': false,
+ 'aria-selected': false
+ });
+ }
+
+ /**
+ * Destroys an instance of an accordion.
+ * @fires Accordion#destroyed
+ * @function
+ */
+
+ }, {
+ key: '_destroy',
+ value: function _destroy() {
+ this.$element.find('[data-tab-content]').stop(true).slideUp(0).css('display', '');
+ this.$element.find('a').off('.zf.accordion');
+ if (this.options.deepLink) {
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default()(window).off('popstate', this._checkDeepLink);
+ }
+ }
+ }]);
+
+ return Accordion;
+}(__WEBPACK_IMPORTED_MODULE_3__foundation_plugin__["a" /* Plugin */]);
+
+Accordion.defaults = {
+ /**
+ * Amount of time to animate the opening of an accordion pane.
+ * @option
+ * @type {number}
+ * @default 250
+ */
+ slideSpeed: 250,
+ /**
+ * Allow the accordion to have multiple open panes.
+ * @option
+ * @type {boolean}
+ * @default false
+ */
+ multiExpand: false,
+ /**
+ * Allow the accordion to close all panes.
+ * @option
+ * @type {boolean}
+ * @default false
+ */
+ allowAllClosed: false,
+ /**
+ * Allows the window to scroll to content of pane specified by hash anchor
+ * @option
+ * @type {boolean}
+ * @default false
+ */
+ deepLink: false,
+
+ /**
+ * Adjust the deep link scroll to make sure the top of the accordion panel is visible
+ * @option
+ * @type {boolean}
+ * @default false
+ */
+ deepLinkSmudge: false,
+
+ /**
+ * Animation time (ms) for the deep link adjustment
+ * @option
+ * @type {number}
+ * @default 300
+ */
+ deepLinkSmudgeDelay: 300,
+
+ /**
+ * Update the browser history with the open accordion
+ * @option
+ * @type {boolean}
+ * @default false
+ */
+ updateHistory: false
+};
+
+
+
+/***/ }),
+/* 11 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return AccordionMenu; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery__ = __webpack_require__(0);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_jquery__);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__ = __webpack_require__(4);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_nest__ = __webpack_require__(9);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__foundation_util_core__ = __webpack_require__(1);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__foundation_plugin__ = __webpack_require__(2);
+
+
+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; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+
+
+
+
+
+
+/**
+ * AccordionMenu module.
+ * @module foundation.accordionMenu
+ * @requires foundation.util.keyboard
+ * @requires foundation.util.nest
+ */
+
+var AccordionMenu = function (_Plugin) {
+ _inherits(AccordionMenu, _Plugin);
+
+ function AccordionMenu() {
+ _classCallCheck(this, AccordionMenu);
+
+ return _possibleConstructorReturn(this, (AccordionMenu.__proto__ || Object.getPrototypeOf(AccordionMenu)).apply(this, arguments));
+ }
+
+ _createClass(AccordionMenu, [{
+ key: '_setup',
+
+ /**
+ * Creates a new instance of an accordion menu.
+ * @class
+ * @name AccordionMenu
+ * @fires AccordionMenu#init
+ * @param {jQuery} element - jQuery object to make into an accordion menu.
+ * @param {Object} options - Overrides to the default plugin settings.
+ */
+ value: function _setup(element, options) {
+ this.$element = element;
+ this.options = __WEBPACK_IMPORTED_MODULE_0_jquery___default.a.extend({}, AccordionMenu.defaults, this.$element.data(), options);
+ this.className = 'AccordionMenu'; // ie9 back compat
+
+ this._init();
+
+ __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__["a" /* Keyboard */].register('AccordionMenu', {
+ 'ENTER': 'toggle',
+ 'SPACE': 'toggle',
+ 'ARROW_RIGHT': 'open',
+ 'ARROW_UP': 'up',
+ 'ARROW_DOWN': 'down',
+ 'ARROW_LEFT': 'close',
+ 'ESCAPE': 'closeAll'
+ });
+ }
+
+ /**
+ * Initializes the accordion menu by hiding all nested menus.
+ * @private
+ */
+
+ }, {
+ key: '_init',
+ value: function _init() {
+ __WEBPACK_IMPORTED_MODULE_2__foundation_util_nest__["a" /* Nest */].Feather(this.$element, 'accordion');
+
+ var _this = this;
+
+ this.$element.find('[data-submenu]').not('.is-active').slideUp(0); //.find('a').css('padding-left', '1rem');
+ this.$element.attr({
+ 'role': 'tree',
+ 'aria-multiselectable': this.options.multiOpen
+ });
+
+ this.$menuLinks = this.$element.find('.is-accordion-submenu-parent');
+ this.$menuLinks.each(function () {
+ var linkId = this.id || __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__foundation_util_core__["a" /* GetYoDigits */])(6, 'acc-menu-link'),
+ $elem = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this),
+ $sub = $elem.children('[data-submenu]'),
+ subId = $sub[0].id || __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__foundation_util_core__["a" /* GetYoDigits */])(6, 'acc-menu'),
+ isActive = $sub.hasClass('is-active');
+
+ if (_this.options.submenuToggle) {
+ $elem.addClass('has-submenu-toggle');
+ $elem.children('a').after('');
+ } else {
+ $elem.attr({
+ 'aria-controls': subId,
+ 'aria-expanded': isActive,
+ 'id': linkId
+ });
+ }
+ $sub.attr({
+ 'aria-labelledby': linkId,
+ 'aria-hidden': !isActive,
+ 'role': 'group',
+ 'id': subId
+ });
+ });
+ this.$element.find('li').attr({
+ 'role': 'treeitem'
+ });
+ var initPanes = this.$element.find('.is-active');
+ if (initPanes.length) {
+ var _this = this;
+ initPanes.each(function () {
+ _this.down(__WEBPACK_IMPORTED_MODULE_0_jquery___default()(this));
+ });
+ }
+ this._events();
+ }
+
+ /**
+ * Adds event handlers for items within the menu.
+ * @private
+ */
+
+ }, {
+ key: '_events',
+ value: function _events() {
+ var _this = this;
+
+ this.$element.find('li').each(function () {
+ var $submenu = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).children('[data-submenu]');
+
+ if ($submenu.length) {
+ if (_this.options.submenuToggle) {
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).children('.submenu-toggle').off('click.zf.accordionMenu').on('click.zf.accordionMenu', function (e) {
+ _this.toggle($submenu);
+ });
+ } else {
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).children('a').off('click.zf.accordionMenu').on('click.zf.accordionMenu', function (e) {
+ e.preventDefault();
+ _this.toggle($submenu);
+ });
+ }
+ }
+ }).on('keydown.zf.accordionmenu', function (e) {
+ var $element = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this),
+ $elements = $element.parent('ul').children('li'),
+ $prevElement,
+ $nextElement,
+ $target = $element.children('[data-submenu]');
+
+ $elements.each(function (i) {
+ if (__WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).is($element)) {
+ $prevElement = $elements.eq(Math.max(0, i - 1)).find('a').first();
+ $nextElement = $elements.eq(Math.min(i + 1, $elements.length - 1)).find('a').first();
+
+ if (__WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).children('[data-submenu]:visible').length) {
+ // has open sub menu
+ $nextElement = $element.find('li:first-child').find('a').first();
+ }
+ if (__WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).is(':first-child')) {
+ // is first element of sub menu
+ $prevElement = $element.parents('li').first().find('a').first();
+ } else if ($prevElement.parents('li').first().children('[data-submenu]:visible').length) {
+ // if previous element has open sub menu
+ $prevElement = $prevElement.parents('li').find('li:last-child').find('a').first();
+ }
+ if (__WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).is(':last-child')) {
+ // is last element of sub menu
+ $nextElement = $element.parents('li').first().next('li').find('a').first();
+ }
+
+ return;
+ }
+ });
+
+ __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__["a" /* Keyboard */].handleKey(e, 'AccordionMenu', {
+ open: function () {
+ if ($target.is(':hidden')) {
+ _this.down($target);
+ $target.find('li').first().find('a').first().focus();
+ }
+ },
+ close: function () {
+ if ($target.length && !$target.is(':hidden')) {
+ // close active sub of this item
+ _this.up($target);
+ } else if ($element.parent('[data-submenu]').length) {
+ // close currently open sub
+ _this.up($element.parent('[data-submenu]'));
+ $element.parents('li').first().find('a').first().focus();
+ }
+ },
+ up: function () {
+ $prevElement.focus();
+ return true;
+ },
+ down: function () {
+ $nextElement.focus();
+ return true;
+ },
+ toggle: function () {
+ if (_this.options.submenuToggle) {
+ return false;
+ }
+ if ($element.children('[data-submenu]').length) {
+ _this.toggle($element.children('[data-submenu]'));
+ return true;
+ }
+ },
+ closeAll: function () {
+ _this.hideAll();
+ },
+ handled: function (preventDefault) {
+ if (preventDefault) {
+ e.preventDefault();
+ }
+ e.stopImmediatePropagation();
+ }
+ });
+ }); //.attr('tabindex', 0);
+ }
+
+ /**
+ * Closes all panes of the menu.
+ * @function
+ */
+
+ }, {
+ key: 'hideAll',
+ value: function hideAll() {
+ this.up(this.$element.find('[data-submenu]'));
+ }
+
+ /**
+ * Opens all panes of the menu.
+ * @function
+ */
+
+ }, {
+ key: 'showAll',
+ value: function showAll() {
+ this.down(this.$element.find('[data-submenu]'));
+ }
+
+ /**
+ * Toggles the open/close state of a submenu.
+ * @function
+ * @param {jQuery} $target - the submenu to toggle
+ */
+
+ }, {
+ key: 'toggle',
+ value: function toggle($target) {
+ if (!$target.is(':animated')) {
+ if (!$target.is(':hidden')) {
+ this.up($target);
+ } else {
+ this.down($target);
+ }
+ }
+ }
+
+ /**
+ * Opens the sub-menu defined by `$target`.
+ * @param {jQuery} $target - Sub-menu to open.
+ * @fires AccordionMenu#down
+ */
+
+ }, {
+ key: 'down',
+ value: function down($target) {
+ var _this = this;
+
+ if (!this.options.multiOpen) {
+ this.up(this.$element.find('.is-active').not($target.parentsUntil(this.$element).add($target)));
+ }
+
+ $target.addClass('is-active').attr({ 'aria-hidden': false });
+
+ if (this.options.submenuToggle) {
+ $target.prev('.submenu-toggle').attr({ 'aria-expanded': true });
+ } else {
+ $target.parent('.is-accordion-submenu-parent').attr({ 'aria-expanded': true });
+ }
+
+ $target.slideDown(_this.options.slideSpeed, function () {
+ /**
+ * Fires when the menu is done opening.
+ * @event AccordionMenu#down
+ */
+ _this.$element.trigger('down.zf.accordionMenu', [$target]);
+ });
+ }
+
+ /**
+ * Closes the sub-menu defined by `$target`. All sub-menus inside the target will be closed as well.
+ * @param {jQuery} $target - Sub-menu to close.
+ * @fires AccordionMenu#up
+ */
+
+ }, {
+ key: 'up',
+ value: function up($target) {
+ var _this = this;
+ $target.slideUp(_this.options.slideSpeed, function () {
+ /**
+ * Fires when the menu is done collapsing up.
+ * @event AccordionMenu#up
+ */
+ _this.$element.trigger('up.zf.accordionMenu', [$target]);
+ });
+
+ var $menus = $target.find('[data-submenu]').slideUp(0).addBack().attr('aria-hidden', true);
+
+ if (this.options.submenuToggle) {
+ $menus.prev('.submenu-toggle').attr('aria-expanded', false);
+ } else {
+ $menus.parent('.is-accordion-submenu-parent').attr('aria-expanded', false);
+ }
+ }
+
+ /**
+ * Destroys an instance of accordion menu.
+ * @fires AccordionMenu#destroyed
+ */
+
+ }, {
+ key: '_destroy',
+ value: function _destroy() {
+ this.$element.find('[data-submenu]').slideDown(0).css('display', '');
+ this.$element.find('a').off('click.zf.accordionMenu');
+
+ if (this.options.submenuToggle) {
+ this.$element.find('.has-submenu-toggle').removeClass('has-submenu-toggle');
+ this.$element.find('.submenu-toggle').remove();
+ }
+
+ __WEBPACK_IMPORTED_MODULE_2__foundation_util_nest__["a" /* Nest */].Burn(this.$element, 'accordion');
+ }
+ }]);
+
+ return AccordionMenu;
+}(__WEBPACK_IMPORTED_MODULE_4__foundation_plugin__["a" /* Plugin */]);
+
+AccordionMenu.defaults = {
+ /**
+ * Amount of time to animate the opening of a submenu in ms.
+ * @option
+ * @type {number}
+ * @default 250
+ */
+ slideSpeed: 250,
+ /**
+ * Adds a separate submenu toggle button. This allows the parent item to have a link.
+ * @option
+ * @example true
+ */
+ submenuToggle: false,
+ /**
+ * The text used for the submenu toggle if enabled. This is used for screen readers only.
+ * @option
+ * @example true
+ */
+ submenuToggleText: 'Toggle menu',
+ /**
+ * Allow the menu to have multiple open panes.
+ * @option
+ * @type {boolean}
+ * @default true
+ */
+ multiOpen: true
+};
+
+
+
+/***/ }),
+/* 12 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Drilldown; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery__ = __webpack_require__(0);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_jquery__);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__ = __webpack_require__(4);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_nest__ = __webpack_require__(9);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__foundation_util_core__ = __webpack_require__(1);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__foundation_util_box__ = __webpack_require__(7);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__foundation_plugin__ = __webpack_require__(2);
+
+
+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; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+
+
+
+
+
+
+
+/**
+ * Drilldown module.
+ * @module foundation.drilldown
+ * @requires foundation.util.keyboard
+ * @requires foundation.util.nest
+ * @requires foundation.util.box
+ */
+
+var Drilldown = function (_Plugin) {
+ _inherits(Drilldown, _Plugin);
+
+ function Drilldown() {
+ _classCallCheck(this, Drilldown);
+
+ return _possibleConstructorReturn(this, (Drilldown.__proto__ || Object.getPrototypeOf(Drilldown)).apply(this, arguments));
+ }
+
+ _createClass(Drilldown, [{
+ key: '_setup',
+
+ /**
+ * Creates a new instance of a drilldown menu.
+ * @class
+ * @name Drilldown
+ * @param {jQuery} element - jQuery object to make into an accordion menu.
+ * @param {Object} options - Overrides to the default plugin settings.
+ */
+ value: function _setup(element, options) {
+ this.$element = element;
+ this.options = __WEBPACK_IMPORTED_MODULE_0_jquery___default.a.extend({}, Drilldown.defaults, this.$element.data(), options);
+ this.className = 'Drilldown'; // ie9 back compat
+
+ this._init();
+
+ __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__["a" /* Keyboard */].register('Drilldown', {
+ 'ENTER': 'open',
+ 'SPACE': 'open',
+ 'ARROW_RIGHT': 'next',
+ 'ARROW_UP': 'up',
+ 'ARROW_DOWN': 'down',
+ 'ARROW_LEFT': 'previous',
+ 'ESCAPE': 'close',
+ 'TAB': 'down',
+ 'SHIFT_TAB': 'up'
+ });
+ }
+
+ /**
+ * Initializes the drilldown by creating jQuery collections of elements
+ * @private
+ */
+
+ }, {
+ key: '_init',
+ value: function _init() {
+ __WEBPACK_IMPORTED_MODULE_2__foundation_util_nest__["a" /* Nest */].Feather(this.$element, 'drilldown');
+
+ if (this.options.autoApplyClass) {
+ this.$element.addClass('drilldown');
+ }
+
+ this.$element.attr({
+ 'role': 'tree',
+ 'aria-multiselectable': false
+ });
+ this.$submenuAnchors = this.$element.find('li.is-drilldown-submenu-parent').children('a');
+ this.$submenus = this.$submenuAnchors.parent('li').children('[data-submenu]').attr('role', 'group');
+ this.$menuItems = this.$element.find('li').not('.js-drilldown-back').attr('role', 'treeitem').find('a');
+ this.$element.attr('data-mutate', this.$element.attr('data-drilldown') || __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__foundation_util_core__["a" /* GetYoDigits */])(6, 'drilldown'));
+
+ this._prepareMenu();
+ this._registerEvents();
+
+ this._keyboardEvents();
+ }
+
+ /**
+ * prepares drilldown menu by setting attributes to links and elements
+ * sets a min height to prevent content jumping
+ * wraps the element if not already wrapped
+ * @private
+ * @function
+ */
+
+ }, {
+ key: '_prepareMenu',
+ value: function _prepareMenu() {
+ var _this = this;
+ // if(!this.options.holdOpen){
+ // this._menuLinkEvents();
+ // }
+ this.$submenuAnchors.each(function () {
+ var $link = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this);
+ var $sub = $link.parent();
+ if (_this.options.parentLink) {
+ $link.clone().prependTo($sub.children('[data-submenu]')).wrap('
');
+ }
+ $link.data('savedHref', $link.attr('href')).removeAttr('href').attr('tabindex', 0);
+ $link.children('[data-submenu]').attr({
+ 'aria-hidden': true,
+ 'tabindex': 0,
+ 'role': 'group'
+ });
+ _this._events($link);
+ });
+ this.$submenus.each(function () {
+ var $menu = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this),
+ $back = $menu.find('.js-drilldown-back');
+ if (!$back.length) {
+ switch (_this.options.backButtonPosition) {
+ case "bottom":
+ $menu.append(_this.options.backButton);
+ break;
+ case "top":
+ $menu.prepend(_this.options.backButton);
+ break;
+ default:
+ console.error("Unsupported backButtonPosition value '" + _this.options.backButtonPosition + "'");
+ }
+ }
+ _this._back($menu);
+ });
+
+ this.$submenus.addClass('invisible');
+ if (!this.options.autoHeight) {
+ this.$submenus.addClass('drilldown-submenu-cover-previous');
+ }
+
+ // create a wrapper on element if it doesn't exist.
+ if (!this.$element.parent().hasClass('is-drilldown')) {
+ this.$wrapper = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this.options.wrapper).addClass('is-drilldown');
+ if (this.options.animateHeight) this.$wrapper.addClass('animate-height');
+ this.$element.wrap(this.$wrapper);
+ }
+ // set wrapper
+ this.$wrapper = this.$element.parent();
+ this.$wrapper.css(this._getMaxDims());
+ }
+ }, {
+ key: '_resize',
+ value: function _resize() {
+ this.$wrapper.css({ 'max-width': 'none', 'min-height': 'none' });
+ // _getMaxDims has side effects (boo) but calling it should update all other necessary heights & widths
+ this.$wrapper.css(this._getMaxDims());
+ }
+
+ /**
+ * Adds event handlers to elements in the menu.
+ * @function
+ * @private
+ * @param {jQuery} $elem - the current menu item to add handlers to.
+ */
+
+ }, {
+ key: '_events',
+ value: function _events($elem) {
+ var _this = this;
+
+ $elem.off('click.zf.drilldown').on('click.zf.drilldown', function (e) {
+ if (__WEBPACK_IMPORTED_MODULE_0_jquery___default()(e.target).parentsUntil('ul', 'li').hasClass('is-drilldown-submenu-parent')) {
+ e.stopImmediatePropagation();
+ e.preventDefault();
+ }
+
+ // if(e.target !== e.currentTarget.firstElementChild){
+ // return false;
+ // }
+ _this._show($elem.parent('li'));
+
+ if (_this.options.closeOnClick) {
+ var $body = __WEBPACK_IMPORTED_MODULE_0_jquery___default()('body');
+ $body.off('.zf.drilldown').on('click.zf.drilldown', function (e) {
+ if (e.target === _this.$element[0] || __WEBPACK_IMPORTED_MODULE_0_jquery___default.a.contains(_this.$element[0], e.target)) {
+ return;
+ }
+ e.preventDefault();
+ _this._hideAll();
+ $body.off('.zf.drilldown');
+ });
+ }
+ });
+ }
+
+ /**
+ * Adds event handlers to the menu element.
+ * @function
+ * @private
+ */
+
+ }, {
+ key: '_registerEvents',
+ value: function _registerEvents() {
+ if (this.options.scrollTop) {
+ this._bindHandler = this._scrollTop.bind(this);
+ this.$element.on('open.zf.drilldown hide.zf.drilldown closed.zf.drilldown', this._bindHandler);
+ }
+ this.$element.on('mutateme.zf.trigger', this._resize.bind(this));
+ }
+
+ /**
+ * Scroll to Top of Element or data-scroll-top-element
+ * @function
+ * @fires Drilldown#scrollme
+ */
+
+ }, {
+ key: '_scrollTop',
+ value: function _scrollTop() {
+ var _this = this;
+ var $scrollTopElement = _this.options.scrollTopElement != '' ? __WEBPACK_IMPORTED_MODULE_0_jquery___default()(_this.options.scrollTopElement) : _this.$element,
+ scrollPos = parseInt($scrollTopElement.offset().top + _this.options.scrollTopOffset, 10);
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default()('html, body').stop(true).animate({ scrollTop: scrollPos }, _this.options.animationDuration, _this.options.animationEasing, function () {
+ /**
+ * Fires after the menu has scrolled
+ * @event Drilldown#scrollme
+ */
+ if (this === __WEBPACK_IMPORTED_MODULE_0_jquery___default()('html')[0]) _this.$element.trigger('scrollme.zf.drilldown');
+ });
+ }
+
+ /**
+ * Adds keydown event listener to `li`'s in the menu.
+ * @private
+ */
+
+ }, {
+ key: '_keyboardEvents',
+ value: function _keyboardEvents() {
+ var _this = this;
+
+ this.$menuItems.add(this.$element.find('.js-drilldown-back > a, .is-submenu-parent-item > a')).on('keydown.zf.drilldown', function (e) {
+ var $element = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this),
+ $elements = $element.parent('li').parent('ul').children('li').children('a'),
+ $prevElement,
+ $nextElement;
+
+ $elements.each(function (i) {
+ if (__WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).is($element)) {
+ $prevElement = $elements.eq(Math.max(0, i - 1));
+ $nextElement = $elements.eq(Math.min(i + 1, $elements.length - 1));
+ return;
+ }
+ });
+
+ __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__["a" /* Keyboard */].handleKey(e, 'Drilldown', {
+ next: function () {
+ if ($element.is(_this.$submenuAnchors)) {
+ _this._show($element.parent('li'));
+ $element.parent('li').one(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__foundation_util_core__["b" /* transitionend */])($element), function () {
+ $element.parent('li').find('ul li a').filter(_this.$menuItems).first().focus();
+ });
+ return true;
+ }
+ },
+ previous: function () {
+ _this._hide($element.parent('li').parent('ul'));
+ $element.parent('li').parent('ul').one(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__foundation_util_core__["b" /* transitionend */])($element), function () {
+ setTimeout(function () {
+ $element.parent('li').parent('ul').parent('li').children('a').first().focus();
+ }, 1);
+ });
+ return true;
+ },
+ up: function () {
+ $prevElement.focus();
+ // Don't tap focus on first element in root ul
+ return !$element.is(_this.$element.find('> li:first-child > a'));
+ },
+ down: function () {
+ $nextElement.focus();
+ // Don't tap focus on last element in root ul
+ return !$element.is(_this.$element.find('> li:last-child > a'));
+ },
+ close: function () {
+ // Don't close on element in root ul
+ if (!$element.is(_this.$element.find('> li > a'))) {
+ _this._hide($element.parent().parent());
+ $element.parent().parent().siblings('a').focus();
+ }
+ },
+ open: function () {
+ if (!$element.is(_this.$menuItems)) {
+ // not menu item means back button
+ _this._hide($element.parent('li').parent('ul'));
+ $element.parent('li').parent('ul').one(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__foundation_util_core__["b" /* transitionend */])($element), function () {
+ setTimeout(function () {
+ $element.parent('li').parent('ul').parent('li').children('a').first().focus();
+ }, 1);
+ });
+ return true;
+ } else if ($element.is(_this.$submenuAnchors)) {
+ _this._show($element.parent('li'));
+ $element.parent('li').one(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__foundation_util_core__["b" /* transitionend */])($element), function () {
+ $element.parent('li').find('ul li a').filter(_this.$menuItems).first().focus();
+ });
+ return true;
+ }
+ },
+ handled: function (preventDefault) {
+ if (preventDefault) {
+ e.preventDefault();
+ }
+ e.stopImmediatePropagation();
+ }
+ });
+ }); // end keyboardAccess
+ }
+
+ /**
+ * Closes all open elements, and returns to root menu.
+ * @function
+ * @fires Drilldown#closed
+ */
+
+ }, {
+ key: '_hideAll',
+ value: function _hideAll() {
+ var $elem = this.$element.find('.is-drilldown-submenu.is-active').addClass('is-closing');
+ if (this.options.autoHeight) this.$wrapper.css({ height: $elem.parent().closest('ul').data('calcHeight') });
+ $elem.one(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__foundation_util_core__["b" /* transitionend */])($elem), function (e) {
+ $elem.removeClass('is-active is-closing');
+ });
+ /**
+ * Fires when the menu is fully closed.
+ * @event Drilldown#closed
+ */
+ this.$element.trigger('closed.zf.drilldown');
+ }
+
+ /**
+ * Adds event listener for each `back` button, and closes open menus.
+ * @function
+ * @fires Drilldown#back
+ * @param {jQuery} $elem - the current sub-menu to add `back` event.
+ */
+
+ }, {
+ key: '_back',
+ value: function _back($elem) {
+ var _this = this;
+ $elem.off('click.zf.drilldown');
+ $elem.children('.js-drilldown-back').on('click.zf.drilldown', function (e) {
+ e.stopImmediatePropagation();
+ // console.log('mouseup on back');
+ _this._hide($elem);
+
+ // If there is a parent submenu, call show
+ var parentSubMenu = $elem.parent('li').parent('ul').parent('li');
+ if (parentSubMenu.length) {
+ _this._show(parentSubMenu);
+ }
+ });
+ }
+
+ /**
+ * Adds event listener to menu items w/o submenus to close open menus on click.
+ * @function
+ * @private
+ */
+
+ }, {
+ key: '_menuLinkEvents',
+ value: function _menuLinkEvents() {
+ var _this = this;
+ this.$menuItems.not('.is-drilldown-submenu-parent').off('click.zf.drilldown').on('click.zf.drilldown', function (e) {
+ // e.stopImmediatePropagation();
+ setTimeout(function () {
+ _this._hideAll();
+ }, 0);
+ });
+ }
+
+ /**
+ * Opens a submenu.
+ * @function
+ * @fires Drilldown#open
+ * @param {jQuery} $elem - the current element with a submenu to open, i.e. the `li` tag.
+ */
+
+ }, {
+ key: '_show',
+ value: function _show($elem) {
+ if (this.options.autoHeight) this.$wrapper.css({ height: $elem.children('[data-submenu]').data('calcHeight') });
+ $elem.attr('aria-expanded', true);
+ $elem.children('[data-submenu]').addClass('is-active').removeClass('invisible').attr('aria-hidden', false);
+ /**
+ * Fires when the submenu has opened.
+ * @event Drilldown#open
+ */
+ this.$element.trigger('open.zf.drilldown', [$elem]);
+ }
+ }, {
+ key: '_hide',
+
+
+ /**
+ * Hides a submenu
+ * @function
+ * @fires Drilldown#hide
+ * @param {jQuery} $elem - the current sub-menu to hide, i.e. the `ul` tag.
+ */
+ value: function _hide($elem) {
+ if (this.options.autoHeight) this.$wrapper.css({ height: $elem.parent().closest('ul').data('calcHeight') });
+ var _this = this;
+ $elem.parent('li').attr('aria-expanded', false);
+ $elem.attr('aria-hidden', true).addClass('is-closing');
+ $elem.addClass('is-closing').one(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__foundation_util_core__["b" /* transitionend */])($elem), function () {
+ $elem.removeClass('is-active is-closing');
+ $elem.blur().addClass('invisible');
+ });
+ /**
+ * Fires when the submenu has closed.
+ * @event Drilldown#hide
+ */
+ $elem.trigger('hide.zf.drilldown', [$elem]);
+ }
+
+ /**
+ * Iterates through the nested menus to calculate the min-height, and max-width for the menu.
+ * Prevents content jumping.
+ * @function
+ * @private
+ */
+
+ }, {
+ key: '_getMaxDims',
+ value: function _getMaxDims() {
+ var maxHeight = 0,
+ result = {},
+ _this = this;
+ this.$submenus.add(this.$element).each(function () {
+ var numOfElems = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).children('li').length;
+ var height = __WEBPACK_IMPORTED_MODULE_4__foundation_util_box__["a" /* Box */].GetDimensions(this).height;
+ maxHeight = height > maxHeight ? height : maxHeight;
+ if (_this.options.autoHeight) {
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).data('calcHeight', height);
+ if (!__WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).hasClass('is-drilldown-submenu')) result['height'] = height;
+ }
+ });
+
+ if (!this.options.autoHeight) result['min-height'] = maxHeight + 'px';
+
+ result['max-width'] = this.$element[0].getBoundingClientRect().width + 'px';
+
+ return result;
+ }
+
+ /**
+ * Destroys the Drilldown Menu
+ * @function
+ */
+
+ }, {
+ key: '_destroy',
+ value: function _destroy() {
+ if (this.options.scrollTop) this.$element.off('.zf.drilldown', this._bindHandler);
+ this._hideAll();
+ this.$element.off('mutateme.zf.trigger');
+ __WEBPACK_IMPORTED_MODULE_2__foundation_util_nest__["a" /* Nest */].Burn(this.$element, 'drilldown');
+ 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');
+ this.$submenuAnchors.each(function () {
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).off('.zf.drilldown');
+ });
+
+ this.$submenus.removeClass('drilldown-submenu-cover-previous invisible');
+
+ this.$element.find('a').each(function () {
+ var $link = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this);
+ $link.removeAttr('tabindex');
+ if ($link.data('savedHref')) {
+ $link.attr('href', $link.data('savedHref')).removeData('savedHref');
+ } else {
+ return;
+ }
+ });
+ }
+ }]);
+
+ return Drilldown;
+}(__WEBPACK_IMPORTED_MODULE_5__foundation_plugin__["a" /* Plugin */]);
+
+Drilldown.defaults = {
+ /**
+ * Drilldowns depend on styles in order to function properly; in the default build of Foundation these are
+ * on the `drilldown` class. This option auto-applies this class to the drilldown upon initialization.
+ * @option
+ * @type {boolian}
+ * @default true
+ */
+ autoApplyClass: true,
+ /**
+ * 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.
+ * @option
+ * @type {string}
+ * @default 'Back'
+ */
+ backButton: 'Back',
+ /**
+ * Position the back button either at the top or bottom of drilldown submenus. Can be `'left'` or `'bottom'`.
+ * @option
+ * @type {string}
+ * @default top
+ */
+ backButtonPosition: 'top',
+ /**
+ * 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.
+ * @option
+ * @type {string}
+ * @default ''
+ */
+ wrapper: '',
+ /**
+ * Adds the parent link to the submenu.
+ * @option
+ * @type {boolean}
+ * @default false
+ */
+ parentLink: false,
+ /**
+ * Allow the menu to return to root list on body click.
+ * @option
+ * @type {boolean}
+ * @default false
+ */
+ closeOnClick: false,
+ /**
+ * Allow the menu to auto adjust height.
+ * @option
+ * @type {boolean}
+ * @default false
+ */
+ autoHeight: false,
+ /**
+ * Animate the auto adjust height.
+ * @option
+ * @type {boolean}
+ * @default false
+ */
+ animateHeight: false,
+ /**
+ * Scroll to the top of the menu after opening a submenu or navigating back using the menu back button
+ * @option
+ * @type {boolean}
+ * @default false
+ */
+ scrollTop: false,
+ /**
+ * String jquery selector (for example 'body') of element to take offset().top from, if empty string the drilldown menu offset().top is taken
+ * @option
+ * @type {string}
+ * @default ''
+ */
+ scrollTopElement: '',
+ /**
+ * ScrollTop offset
+ * @option
+ * @type {number}
+ * @default 0
+ */
+ scrollTopOffset: 0,
+ /**
+ * Scroll animation duration
+ * @option
+ * @type {number}
+ * @default 500
+ */
+ animationDuration: 500,
+ /**
+ * Scroll animation easing. Can be `'swing'` or `'linear'`.
+ * @option
+ * @type {string}
+ * @see {@link https://api.jquery.com/animate|JQuery animate}
+ * @default 'swing'
+ */
+ animationEasing: 'swing'
+ // holdOpen: false
+};
+
+
+
+/***/ }),
+/* 13 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return DropdownMenu; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery__ = __webpack_require__(0);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_jquery__);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__ = __webpack_require__(4);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_nest__ = __webpack_require__(9);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__foundation_util_box__ = __webpack_require__(7);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__foundation_util_core__ = __webpack_require__(1);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__foundation_plugin__ = __webpack_require__(2);
+
+
+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; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+
+
+
+
+
+
+
+/**
+ * DropdownMenu module.
+ * @module foundation.dropdown-menu
+ * @requires foundation.util.keyboard
+ * @requires foundation.util.box
+ * @requires foundation.util.nest
+ */
+
+var DropdownMenu = function (_Plugin) {
+ _inherits(DropdownMenu, _Plugin);
+
+ function DropdownMenu() {
+ _classCallCheck(this, DropdownMenu);
+
+ return _possibleConstructorReturn(this, (DropdownMenu.__proto__ || Object.getPrototypeOf(DropdownMenu)).apply(this, arguments));
+ }
+
+ _createClass(DropdownMenu, [{
+ key: '_setup',
+
+ /**
+ * Creates a new instance of DropdownMenu.
+ * @class
+ * @name DropdownMenu
+ * @fires DropdownMenu#init
+ * @param {jQuery} element - jQuery object to make into a dropdown menu.
+ * @param {Object} options - Overrides to the default plugin settings.
+ */
+ value: function _setup(element, options) {
+ this.$element = element;
+ this.options = __WEBPACK_IMPORTED_MODULE_0_jquery___default.a.extend({}, DropdownMenu.defaults, this.$element.data(), options);
+ this.className = 'DropdownMenu'; // ie9 back compat
+
+ this._init();
+
+ __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__["a" /* Keyboard */].register('DropdownMenu', {
+ 'ENTER': 'open',
+ 'SPACE': 'open',
+ 'ARROW_RIGHT': 'next',
+ 'ARROW_UP': 'up',
+ 'ARROW_DOWN': 'down',
+ 'ARROW_LEFT': 'previous',
+ 'ESCAPE': 'close'
+ });
+ }
+
+ /**
+ * Initializes the plugin, and calls _prepareMenu
+ * @private
+ * @function
+ */
+
+ }, {
+ key: '_init',
+ value: function _init() {
+ __WEBPACK_IMPORTED_MODULE_2__foundation_util_nest__["a" /* Nest */].Feather(this.$element, 'dropdown');
+
+ var subs = this.$element.find('li.is-dropdown-submenu-parent');
+ this.$element.children('.is-dropdown-submenu-parent').children('.is-dropdown-submenu').addClass('first-sub');
+
+ this.$menuItems = this.$element.find('[role="menuitem"]');
+ this.$tabs = this.$element.children('[role="menuitem"]');
+ this.$tabs.find('ul.is-dropdown-submenu').addClass(this.options.verticalClass);
+
+ if (this.options.alignment === 'auto') {
+ if (this.$element.hasClass(this.options.rightClass) || __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_4__foundation_util_core__["c" /* rtl */])() || this.$element.parents('.top-bar-right').is('*')) {
+ this.options.alignment = 'right';
+ subs.addClass('opens-left');
+ } else {
+ this.options.alignment = 'left';
+ subs.addClass('opens-right');
+ }
+ } else {
+ if (this.options.alignment === 'right') {
+ subs.addClass('opens-left');
+ } else {
+ subs.addClass('opens-right');
+ }
+ }
+ this.changed = false;
+ this._events();
+ }
+ }, {
+ key: '_isVertical',
+ value: function _isVertical() {
+ return this.$tabs.css('display') === 'block' || this.$element.css('flex-direction') === 'column';
+ }
+ }, {
+ key: '_isRtl',
+ value: function _isRtl() {
+ return this.$element.hasClass('align-right') || __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_4__foundation_util_core__["c" /* rtl */])() && !this.$element.hasClass('align-left');
+ }
+
+ /**
+ * Adds event listeners to elements within the menu
+ * @private
+ * @function
+ */
+
+ }, {
+ key: '_events',
+ value: function _events() {
+ var _this = this,
+ hasTouch = 'ontouchstart' in window || typeof window.ontouchstart !== 'undefined',
+ parClass = 'is-dropdown-submenu-parent';
+
+ // used for onClick and in the keyboard handlers
+ var handleClickFn = function (e) {
+ var $elem = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(e.target).parentsUntil('ul', '.' + parClass),
+ hasSub = $elem.hasClass(parClass),
+ hasClicked = $elem.attr('data-is-click') === 'true',
+ $sub = $elem.children('.is-dropdown-submenu');
+
+ if (hasSub) {
+ if (hasClicked) {
+ if (!_this.options.closeOnClick || !_this.options.clickOpen && !hasTouch || _this.options.forceFollow && hasTouch) {
+ return;
+ } else {
+ e.stopImmediatePropagation();
+ e.preventDefault();
+ _this._hide($elem);
+ }
+ } else {
+ e.preventDefault();
+ e.stopImmediatePropagation();
+ _this._show($sub);
+ $elem.add($elem.parentsUntil(_this.$element, '.' + parClass)).attr('data-is-click', true);
+ }
+ }
+ };
+
+ if (this.options.clickOpen || hasTouch) {
+ this.$menuItems.on('click.zf.dropdownmenu touchstart.zf.dropdownmenu', handleClickFn);
+ }
+
+ // Handle Leaf element Clicks
+ if (_this.options.closeOnClickInside) {
+ this.$menuItems.on('click.zf.dropdownmenu', function (e) {
+ var $elem = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this),
+ hasSub = $elem.hasClass(parClass);
+ if (!hasSub) {
+ _this._hide();
+ }
+ });
+ }
+
+ if (!this.options.disableHover) {
+ this.$menuItems.on('mouseenter.zf.dropdownmenu', function (e) {
+ var $elem = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this),
+ hasSub = $elem.hasClass(parClass);
+
+ if (hasSub) {
+ clearTimeout($elem.data('_delay'));
+ $elem.data('_delay', setTimeout(function () {
+ _this._show($elem.children('.is-dropdown-submenu'));
+ }, _this.options.hoverDelay));
+ }
+ }).on('mouseleave.zf.dropdownmenu', function (e) {
+ var $elem = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this),
+ hasSub = $elem.hasClass(parClass);
+ if (hasSub && _this.options.autoclose) {
+ if ($elem.attr('data-is-click') === 'true' && _this.options.clickOpen) {
+ return false;
+ }
+
+ clearTimeout($elem.data('_delay'));
+ $elem.data('_delay', setTimeout(function () {
+ _this._hide($elem);
+ }, _this.options.closingTime));
+ }
+ });
+ }
+ this.$menuItems.on('keydown.zf.dropdownmenu', function (e) {
+ var $element = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(e.target).parentsUntil('ul', '[role="menuitem"]'),
+ isTab = _this.$tabs.index($element) > -1,
+ $elements = isTab ? _this.$tabs : $element.siblings('li').add($element),
+ $prevElement,
+ $nextElement;
+
+ $elements.each(function (i) {
+ if (__WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).is($element)) {
+ $prevElement = $elements.eq(i - 1);
+ $nextElement = $elements.eq(i + 1);
+ return;
+ }
+ });
+
+ var nextSibling = function () {
+ $nextElement.children('a:first').focus();
+ e.preventDefault();
+ },
+ prevSibling = function () {
+ $prevElement.children('a:first').focus();
+ e.preventDefault();
+ },
+ openSub = function () {
+ var $sub = $element.children('ul.is-dropdown-submenu');
+ if ($sub.length) {
+ _this._show($sub);
+ $element.find('li > a:first').focus();
+ e.preventDefault();
+ } else {
+ return;
+ }
+ },
+ closeSub = function () {
+ //if ($element.is(':first-child')) {
+ var close = $element.parent('ul').parent('li');
+ close.children('a:first').focus();
+ _this._hide(close);
+ e.preventDefault();
+ //}
+ };
+ var functions = {
+ open: openSub,
+ close: function () {
+ _this._hide(_this.$element);
+ _this.$menuItems.eq(0).children('a').focus(); // focus to first element
+ e.preventDefault();
+ },
+ handled: function () {
+ e.stopImmediatePropagation();
+ }
+ };
+
+ if (isTab) {
+ if (_this._isVertical()) {
+ // vertical menu
+ if (_this._isRtl()) {
+ // right aligned
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default.a.extend(functions, {
+ down: nextSibling,
+ up: prevSibling,
+ next: closeSub,
+ previous: openSub
+ });
+ } else {
+ // left aligned
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default.a.extend(functions, {
+ down: nextSibling,
+ up: prevSibling,
+ next: openSub,
+ previous: closeSub
+ });
+ }
+ } else {
+ // horizontal menu
+ if (_this._isRtl()) {
+ // right aligned
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default.a.extend(functions, {
+ next: prevSibling,
+ previous: nextSibling,
+ down: openSub,
+ up: closeSub
+ });
+ } else {
+ // left aligned
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default.a.extend(functions, {
+ next: nextSibling,
+ previous: prevSibling,
+ down: openSub,
+ up: closeSub
+ });
+ }
+ }
+ } else {
+ // not tabs -> one sub
+ if (_this._isRtl()) {
+ // right aligned
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default.a.extend(functions, {
+ next: closeSub,
+ previous: openSub,
+ down: nextSibling,
+ up: prevSibling
+ });
+ } else {
+ // left aligned
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default.a.extend(functions, {
+ next: openSub,
+ previous: closeSub,
+ down: nextSibling,
+ up: prevSibling
+ });
+ }
+ }
+ __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__["a" /* Keyboard */].handleKey(e, 'DropdownMenu', functions);
+ });
+ }
+
+ /**
+ * Adds an event handler to the body to close any dropdowns on a click.
+ * @function
+ * @private
+ */
+
+ }, {
+ key: '_addBodyHandler',
+ value: function _addBodyHandler() {
+ var $body = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(document.body),
+ _this = this;
+ $body.off('mouseup.zf.dropdownmenu touchend.zf.dropdownmenu').on('mouseup.zf.dropdownmenu touchend.zf.dropdownmenu', function (e) {
+ var $link = _this.$element.find(e.target);
+ if ($link.length) {
+ return;
+ }
+
+ _this._hide();
+ $body.off('mouseup.zf.dropdownmenu touchend.zf.dropdownmenu');
+ });
+ }
+
+ /**
+ * Opens a dropdown pane, and checks for collisions first.
+ * @param {jQuery} $sub - ul element that is a submenu to show
+ * @function
+ * @private
+ * @fires DropdownMenu#show
+ */
+
+ }, {
+ key: '_show',
+ value: function _show($sub) {
+ var idx = this.$tabs.index(this.$tabs.filter(function (i, el) {
+ return __WEBPACK_IMPORTED_MODULE_0_jquery___default()(el).find($sub).length > 0;
+ }));
+ var $sibs = $sub.parent('li.is-dropdown-submenu-parent').siblings('li.is-dropdown-submenu-parent');
+ this._hide($sibs, idx);
+ $sub.css('visibility', 'hidden').addClass('js-dropdown-active').parent('li.is-dropdown-submenu-parent').addClass('is-active');
+ var clear = __WEBPACK_IMPORTED_MODULE_3__foundation_util_box__["a" /* Box */].ImNotTouchingYou($sub, null, true);
+ if (!clear) {
+ var oldClass = this.options.alignment === 'left' ? '-right' : '-left',
+ $parentLi = $sub.parent('.is-dropdown-submenu-parent');
+ $parentLi.removeClass('opens' + oldClass).addClass('opens-' + this.options.alignment);
+ clear = __WEBPACK_IMPORTED_MODULE_3__foundation_util_box__["a" /* Box */].ImNotTouchingYou($sub, null, true);
+ if (!clear) {
+ $parentLi.removeClass('opens-' + this.options.alignment).addClass('opens-inner');
+ }
+ this.changed = true;
+ }
+ $sub.css('visibility', '');
+ if (this.options.closeOnClick) {
+ this._addBodyHandler();
+ }
+ /**
+ * Fires when the new dropdown pane is visible.
+ * @event DropdownMenu#show
+ */
+ this.$element.trigger('show.zf.dropdownmenu', [$sub]);
+ }
+
+ /**
+ * Hides a single, currently open dropdown pane, if passed a parameter, otherwise, hides everything.
+ * @function
+ * @param {jQuery} $elem - element with a submenu to hide
+ * @param {Number} idx - index of the $tabs collection to hide
+ * @private
+ */
+
+ }, {
+ key: '_hide',
+ value: function _hide($elem, idx) {
+ var $toClose;
+ if ($elem && $elem.length) {
+ $toClose = $elem;
+ } else if (idx !== undefined) {
+ $toClose = this.$tabs.not(function (i, el) {
+ return i === idx;
+ });
+ } else {
+ $toClose = this.$element;
+ }
+ var somethingToClose = $toClose.hasClass('is-active') || $toClose.find('.is-active').length > 0;
+
+ if (somethingToClose) {
+ $toClose.find('li.is-active').add($toClose).attr({
+ 'data-is-click': false
+ }).removeClass('is-active');
+
+ $toClose.find('ul.js-dropdown-active').removeClass('js-dropdown-active');
+
+ if (this.changed || $toClose.find('opens-inner').length) {
+ var oldClass = this.options.alignment === 'left' ? 'right' : 'left';
+ $toClose.find('li.is-dropdown-submenu-parent').add($toClose).removeClass('opens-inner opens-' + this.options.alignment).addClass('opens-' + oldClass);
+ this.changed = false;
+ }
+ /**
+ * Fires when the open menus are closed.
+ * @event DropdownMenu#hide
+ */
+ this.$element.trigger('hide.zf.dropdownmenu', [$toClose]);
+ }
+ }
+
+ /**
+ * Destroys the plugin.
+ * @function
+ */
+
+ }, {
+ key: '_destroy',
+ value: function _destroy() {
+ this.$menuItems.off('.zf.dropdownmenu').removeAttr('data-is-click').removeClass('is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner');
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default()(document.body).off('.zf.dropdownmenu');
+ __WEBPACK_IMPORTED_MODULE_2__foundation_util_nest__["a" /* Nest */].Burn(this.$element, 'dropdown');
+ }
+ }]);
+
+ return DropdownMenu;
+}(__WEBPACK_IMPORTED_MODULE_5__foundation_plugin__["a" /* Plugin */]);
+
+/**
+ * Default settings for plugin
+ */
+
+
+DropdownMenu.defaults = {
+ /**
+ * Disallows hover events from opening submenus
+ * @option
+ * @type {boolean}
+ * @default false
+ */
+ disableHover: false,
+ /**
+ * Allow a submenu to automatically close on a mouseleave event, if not clicked open.
+ * @option
+ * @type {boolean}
+ * @default true
+ */
+ autoclose: true,
+ /**
+ * Amount of time to delay opening a submenu on hover event.
+ * @option
+ * @type {number}
+ * @default 50
+ */
+ hoverDelay: 50,
+ /**
+ * Allow a submenu to open/remain open on parent click event. Allows cursor to move away from menu.
+ * @option
+ * @type {boolean}
+ * @default false
+ */
+ clickOpen: false,
+ /**
+ * Amount of time to delay closing a submenu on a mouseleave event.
+ * @option
+ * @type {number}
+ * @default 500
+ */
+
+ closingTime: 500,
+ /**
+ * Position of the menu relative to what direction the submenus should open. Handled by JS. Can be `'auto'`, `'left'` or `'right'`.
+ * @option
+ * @type {string}
+ * @default 'auto'
+ */
+ alignment: 'auto',
+ /**
+ * Allow clicks on the body to close any open submenus.
+ * @option
+ * @type {boolean}
+ * @default true
+ */
+ closeOnClick: true,
+ /**
+ * Allow clicks on leaf anchor links to close any open submenus.
+ * @option
+ * @type {boolean}
+ * @default true
+ */
+ closeOnClickInside: true,
+ /**
+ * Class applied to vertical oriented menus, Foundation default is `vertical`. Update this if using your own class.
+ * @option
+ * @type {string}
+ * @default 'vertical'
+ */
+ verticalClass: 'vertical',
+ /**
+ * Class applied to right-side oriented menus, Foundation default is `align-right`. Update this if using your own class.
+ * @option
+ * @type {string}
+ * @default 'align-right'
+ */
+ rightClass: 'align-right',
+ /**
+ * Boolean to force overide the clicking of links to perform default action, on second touch event for mobile.
+ * @option
+ * @type {boolean}
+ * @default true
+ */
+ forceFollow: true
+};
+
+
+
+/***/ }),
+/* 14 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SmoothScroll; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery__ = __webpack_require__(0);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_jquery__);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_core__ = __webpack_require__(1);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_plugin__ = __webpack_require__(2);
+
+
+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; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+
+
+
+
+/**
+ * SmoothScroll module.
+ * @module foundation.smooth-scroll
+ */
+
+var SmoothScroll = function (_Plugin) {
+ _inherits(SmoothScroll, _Plugin);
+
+ function SmoothScroll() {
+ _classCallCheck(this, SmoothScroll);
+
+ return _possibleConstructorReturn(this, (SmoothScroll.__proto__ || Object.getPrototypeOf(SmoothScroll)).apply(this, arguments));
+ }
+
+ _createClass(SmoothScroll, [{
+ key: '_setup',
+
+ /**
+ * Creates a new instance of SmoothScroll.
+ * @class
+ * @name SmoothScroll
+ * @fires SmoothScroll#init
+ * @param {Object} element - jQuery object to add the trigger to.
+ * @param {Object} options - Overrides to the default plugin settings.
+ */
+ value: function _setup(element, options) {
+ this.$element = element;
+ this.options = __WEBPACK_IMPORTED_MODULE_0_jquery___default.a.extend({}, SmoothScroll.defaults, this.$element.data(), options);
+ this.className = 'SmoothScroll'; // ie9 back compat
+
+ this._init();
+ }
+
+ /**
+ * Initialize the SmoothScroll plugin
+ * @private
+ */
+
+ }, {
+ key: '_init',
+ value: function _init() {
+ var id = this.$element[0].id || __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__foundation_util_core__["a" /* GetYoDigits */])(6, 'smooth-scroll');
+ var _this = this;
+ this.$element.attr({
+ 'id': id
+ });
+
+ this._events();
+ }
+
+ /**
+ * Initializes events for SmoothScroll.
+ * @private
+ */
+
+ }, {
+ key: '_events',
+ value: function _events() {
+ var _this = this;
+
+ // click handler function.
+ var handleLinkClick = function (e) {
+ // exit function if the event source isn't coming from an anchor with href attribute starts with '#'
+ if (!__WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).is('a[href^="#"]')) {
+ return false;
+ }
+
+ var arrival = this.getAttribute('href');
+
+ _this._inTransition = true;
+
+ SmoothScroll.scrollToLoc(arrival, _this.options, function () {
+ _this._inTransition = false;
+ });
+
+ e.preventDefault();
+ };
+
+ this.$element.on('click.zf.smoothScroll', handleLinkClick);
+ this.$element.on('click.zf.smoothScroll', 'a[href^="#"]', handleLinkClick);
+ }
+
+ /**
+ * Function to scroll to a given location on the page.
+ * @param {String} loc - A properly formatted jQuery id selector. Example: '#foo'
+ * @param {Object} options - The options to use.
+ * @param {Function} callback - The callback function.
+ * @static
+ * @function
+ */
+
+ }], [{
+ key: 'scrollToLoc',
+ value: function scrollToLoc(loc) {
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : SmoothScroll.defaults;
+ var callback = arguments[2];
+
+ // Do nothing if target does not exist to prevent errors
+ if (!__WEBPACK_IMPORTED_MODULE_0_jquery___default()(loc).length) {
+ return false;
+ }
+
+ var scrollPos = Math.round(__WEBPACK_IMPORTED_MODULE_0_jquery___default()(loc).offset().top - options.threshold / 2 - options.offset);
+
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default()('html, body').stop(true).animate({ scrollTop: scrollPos }, options.animationDuration, options.animationEasing, function () {
+ if (callback && typeof callback == "function") {
+ callback();
+ }
+ });
+ }
+ }]);
+
+ return SmoothScroll;
+}(__WEBPACK_IMPORTED_MODULE_2__foundation_plugin__["a" /* Plugin */]);
+
+/**
+ * Default settings for plugin.
+ */
+
+
+SmoothScroll.defaults = {
+ /**
+ * Amount of time, in ms, the animated scrolling should take between locations.
+ * @option
+ * @type {number}
+ * @default 500
+ */
+ animationDuration: 500,
+ /**
+ * Animation style to use when scrolling between locations. Can be `'swing'` or `'linear'`.
+ * @option
+ * @type {string}
+ * @default 'linear'
+ * @see {@link https://api.jquery.com/animate|Jquery animate}
+ */
+ animationEasing: 'linear',
+ /**
+ * Number of pixels to use as a marker for location changes.
+ * @option
+ * @type {number}
+ * @default 50
+ */
+ threshold: 50,
+ /**
+ * Number of pixels to offset the scroll of the page on item click if using a sticky nav bar.
+ * @option
+ * @type {number}
+ * @default 0
+ */
+ offset: 0
+};
+
+
+
+/***/ }),
+/* 15 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Tabs; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery__ = __webpack_require__(0);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_jquery__);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__ = __webpack_require__(4);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_imageLoader__ = __webpack_require__(8);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__foundation_plugin__ = __webpack_require__(2);
+
+
+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; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+
+
+
+
+/**
+ * Tabs module.
+ * @module foundation.tabs
+ * @requires foundation.util.keyboard
+ * @requires foundation.util.imageLoader if tabs contain images
+ */
+
+var Tabs = function (_Plugin) {
+ _inherits(Tabs, _Plugin);
+
+ function Tabs() {
+ _classCallCheck(this, Tabs);
+
+ return _possibleConstructorReturn(this, (Tabs.__proto__ || Object.getPrototypeOf(Tabs)).apply(this, arguments));
+ }
+
+ _createClass(Tabs, [{
+ key: '_setup',
+
+ /**
+ * Creates a new instance of tabs.
+ * @class
+ * @name Tabs
+ * @fires Tabs#init
+ * @param {jQuery} element - jQuery object to make into tabs.
+ * @param {Object} options - Overrides to the default plugin settings.
+ */
+ value: function _setup(element, options) {
+ this.$element = element;
+ this.options = __WEBPACK_IMPORTED_MODULE_0_jquery___default.a.extend({}, Tabs.defaults, this.$element.data(), options);
+ this.className = 'Tabs'; // ie9 back compat
+
+ this._init();
+ __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__["a" /* Keyboard */].register('Tabs', {
+ 'ENTER': 'open',
+ 'SPACE': 'open',
+ 'ARROW_RIGHT': 'next',
+ 'ARROW_UP': 'previous',
+ 'ARROW_DOWN': 'next',
+ 'ARROW_LEFT': 'previous'
+ // 'TAB': 'next',
+ // 'SHIFT_TAB': 'previous'
+ });
+ }
+
+ /**
+ * Initializes the tabs by showing and focusing (if autoFocus=true) the preset active tab.
+ * @private
+ */
+
+ }, {
+ key: '_init',
+ value: function _init() {
+ var _this3 = this;
+
+ var _this = this;
+
+ this.$element.attr({ 'role': 'tablist' });
+ this.$tabTitles = this.$element.find('.' + this.options.linkClass);
+ this.$tabContent = __WEBPACK_IMPORTED_MODULE_0_jquery___default()('[data-tabs-content="' + this.$element[0].id + '"]');
+
+ this.$tabTitles.each(function () {
+ var $elem = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this),
+ $link = $elem.find('a'),
+ isActive = $elem.hasClass('' + _this.options.linkActiveClass),
+ hash = $link.attr('data-tabs-target') || $link[0].hash.slice(1),
+ linkId = $link[0].id ? $link[0].id : hash + '-label',
+ $tabContent = __WEBPACK_IMPORTED_MODULE_0_jquery___default()('#' + hash);
+
+ $elem.attr({ 'role': 'presentation' });
+
+ $link.attr({
+ 'role': 'tab',
+ 'aria-controls': hash,
+ 'aria-selected': isActive,
+ 'id': linkId,
+ 'tabindex': isActive ? '0' : '-1'
+ });
+
+ $tabContent.attr({
+ 'role': 'tabpanel',
+ 'aria-labelledby': linkId
+ });
+
+ if (!isActive) {
+ $tabContent.attr('aria-hidden', 'true');
+ }
+
+ if (isActive && _this.options.autoFocus) {
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default()(window).load(function () {
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default()('html, body').animate({ scrollTop: $elem.offset().top }, _this.options.deepLinkSmudgeDelay, function () {
+ $link.focus();
+ });
+ });
+ }
+ });
+ if (this.options.matchHeight) {
+ var $images = this.$tabContent.find('img');
+
+ if ($images.length) {
+ __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__foundation_util_imageLoader__["a" /* onImagesLoaded */])($images, this._setHeight.bind(this));
+ } else {
+ this._setHeight();
+ }
+ }
+
+ //current context-bound function to open tabs on page load or history popstate
+ this._checkDeepLink = function () {
+ var anchor = window.location.hash;
+ //need a hash and a relevant anchor in this tabset
+ if (anchor.length) {
+ var $link = _this3.$element.find('[href$="' + anchor + '"]');
+ if ($link.length) {
+ _this3.selectTab(__WEBPACK_IMPORTED_MODULE_0_jquery___default()(anchor), true);
+
+ //roll up a little to show the titles
+ if (_this3.options.deepLinkSmudge) {
+ var offset = _this3.$element.offset();
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default()('html, body').animate({ scrollTop: offset.top }, _this3.options.deepLinkSmudgeDelay);
+ }
+
+ /**
+ * Fires when the zplugin has deeplinked at pageload
+ * @event Tabs#deeplink
+ */
+ _this3.$element.trigger('deeplink.zf.tabs', [$link, __WEBPACK_IMPORTED_MODULE_0_jquery___default()(anchor)]);
+ }
+ }
+ };
+
+ //use browser to open a tab, if it exists in this tabset
+ if (this.options.deepLink) {
+ this._checkDeepLink();
+ }
+
+ this._events();
+ }
+
+ /**
+ * Adds event handlers for items within the tabs.
+ * @private
+ */
+
+ }, {
+ key: '_events',
+ value: function _events() {
+ this._addKeyHandler();
+ this._addClickHandler();
+ this._setHeightMqHandler = null;
+
+ if (this.options.matchHeight) {
+ this._setHeightMqHandler = this._setHeight.bind(this);
+
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default()(window).on('changed.zf.mediaquery', this._setHeightMqHandler);
+ }
+
+ if (this.options.deepLink) {
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default()(window).on('popstate', this._checkDeepLink);
+ }
+ }
+
+ /**
+ * Adds click handlers for items within the tabs.
+ * @private
+ */
+
+ }, {
+ key: '_addClickHandler',
+ value: function _addClickHandler() {
+ var _this = this;
+
+ this.$element.off('click.zf.tabs').on('click.zf.tabs', '.' + this.options.linkClass, function (e) {
+ e.preventDefault();
+ e.stopPropagation();
+ _this._handleTabChange(__WEBPACK_IMPORTED_MODULE_0_jquery___default()(this));
+ });
+ }
+
+ /**
+ * Adds keyboard event handlers for items within the tabs.
+ * @private
+ */
+
+ }, {
+ key: '_addKeyHandler',
+ value: function _addKeyHandler() {
+ var _this = this;
+
+ this.$tabTitles.off('keydown.zf.tabs').on('keydown.zf.tabs', function (e) {
+ if (e.which === 9) return;
+
+ var $element = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this),
+ $elements = $element.parent('ul').children('li'),
+ $prevElement,
+ $nextElement;
+
+ $elements.each(function (i) {
+ if (__WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).is($element)) {
+ if (_this.options.wrapOnKeys) {
+ $prevElement = i === 0 ? $elements.last() : $elements.eq(i - 1);
+ $nextElement = i === $elements.length - 1 ? $elements.first() : $elements.eq(i + 1);
+ } else {
+ $prevElement = $elements.eq(Math.max(0, i - 1));
+ $nextElement = $elements.eq(Math.min(i + 1, $elements.length - 1));
+ }
+ return;
+ }
+ });
+
+ // handle keyboard event with keyboard util
+ __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__["a" /* Keyboard */].handleKey(e, 'Tabs', {
+ open: function () {
+ $element.find('[role="tab"]').focus();
+ _this._handleTabChange($element);
+ },
+ previous: function () {
+ $prevElement.find('[role="tab"]').focus();
+ _this._handleTabChange($prevElement);
+ },
+ next: function () {
+ $nextElement.find('[role="tab"]').focus();
+ _this._handleTabChange($nextElement);
+ },
+ handled: function () {
+ e.stopPropagation();
+ e.preventDefault();
+ }
+ });
+ });
+ }
+
+ /**
+ * Opens the tab `$targetContent` defined by `$target`. Collapses active tab.
+ * @param {jQuery} $target - Tab to open.
+ * @param {boolean} historyHandled - browser has already handled a history update
+ * @fires Tabs#change
+ * @function
+ */
+
+ }, {
+ key: '_handleTabChange',
+ value: function _handleTabChange($target, historyHandled) {
+
+ /**
+ * Check for active class on target. Collapse if exists.
+ */
+ if ($target.hasClass('' + this.options.linkActiveClass)) {
+ if (this.options.activeCollapse) {
+ this._collapseTab($target);
+
+ /**
+ * Fires when the zplugin has successfully collapsed tabs.
+ * @event Tabs#collapse
+ */
+ this.$element.trigger('collapse.zf.tabs', [$target]);
+ }
+ return;
+ }
+
+ var $oldTab = this.$element.find('.' + this.options.linkClass + '.' + this.options.linkActiveClass),
+ $tabLink = $target.find('[role="tab"]'),
+ hash = $tabLink.attr('data-tabs-target') || $tabLink[0].hash.slice(1),
+ $targetContent = this.$tabContent.find('#' + hash);
+
+ //close old tab
+ this._collapseTab($oldTab);
+
+ //open new tab
+ this._openTab($target);
+
+ //either replace or update browser history
+ if (this.options.deepLink && !historyHandled) {
+ var anchor = $target.find('a').attr('href');
+
+ if (this.options.updateHistory) {
+ history.pushState({}, '', anchor);
+ } else {
+ history.replaceState({}, '', anchor);
+ }
+ }
+
+ /**
+ * Fires when the plugin has successfully changed tabs.
+ * @event Tabs#change
+ */
+ this.$element.trigger('change.zf.tabs', [$target, $targetContent]);
+
+ //fire to children a mutation event
+ $targetContent.find("[data-mutate]").trigger("mutateme.zf.trigger");
+ }
+
+ /**
+ * Opens the tab `$targetContent` defined by `$target`.
+ * @param {jQuery} $target - Tab to Open.
+ * @function
+ */
+
+ }, {
+ key: '_openTab',
+ value: function _openTab($target) {
+ var $tabLink = $target.find('[role="tab"]'),
+ hash = $tabLink.attr('data-tabs-target') || $tabLink[0].hash.slice(1),
+ $targetContent = this.$tabContent.find('#' + hash);
+
+ $target.addClass('' + this.options.linkActiveClass);
+
+ $tabLink.attr({
+ 'aria-selected': 'true',
+ 'tabindex': '0'
+ });
+
+ $targetContent.addClass('' + this.options.panelActiveClass).removeAttr('aria-hidden');
+ }
+
+ /**
+ * Collapses `$targetContent` defined by `$target`.
+ * @param {jQuery} $target - Tab to Open.
+ * @function
+ */
+
+ }, {
+ key: '_collapseTab',
+ value: function _collapseTab($target) {
+ var $target_anchor = $target.removeClass('' + this.options.linkActiveClass).find('[role="tab"]').attr({
+ 'aria-selected': 'false',
+ 'tabindex': -1
+ });
+
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default()('#' + $target_anchor.attr('aria-controls')).removeClass('' + this.options.panelActiveClass).attr({ 'aria-hidden': 'true' });
+ }
+
+ /**
+ * Public method for selecting a content pane to display.
+ * @param {jQuery | String} elem - jQuery object or string of the id of the pane to display.
+ * @param {boolean} historyHandled - browser has already handled a history update
+ * @function
+ */
+
+ }, {
+ key: 'selectTab',
+ value: function selectTab(elem, historyHandled) {
+ var idStr;
+
+ if (typeof elem === 'object') {
+ idStr = elem[0].id;
+ } else {
+ idStr = elem;
+ }
+
+ if (idStr.indexOf('#') < 0) {
+ idStr = '#' + idStr;
+ }
+
+ var $target = this.$tabTitles.find('[href$="' + idStr + '"]').parent('.' + this.options.linkClass);
+
+ this._handleTabChange($target, historyHandled);
+ }
+ }, {
+ key: '_setHeight',
+
+ /**
+ * Sets the height of each panel to the height of the tallest panel.
+ * If enabled in options, gets called on media query change.
+ * If loading content via external source, can be called directly or with _reflow.
+ * If enabled with `data-match-height="true"`, tabs sets to equal height
+ * @function
+ * @private
+ */
+ value: function _setHeight() {
+ var max = 0,
+ _this = this; // Lock down the `this` value for the root tabs object
+
+ this.$tabContent.find('.' + this.options.panelClass).css('height', '').each(function () {
+
+ var panel = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this),
+ isActive = panel.hasClass('' + _this.options.panelActiveClass); // get the options from the parent instead of trying to get them from the child
+
+ if (!isActive) {
+ panel.css({ 'visibility': 'hidden', 'display': 'block' });
+ }
+
+ var temp = this.getBoundingClientRect().height;
+
+ if (!isActive) {
+ panel.css({
+ 'visibility': '',
+ 'display': ''
+ });
+ }
+
+ max = temp > max ? temp : max;
+ }).css('height', max + 'px');
+ }
+
+ /**
+ * Destroys an instance of an tabs.
+ * @fires Tabs#destroyed
+ */
+
+ }, {
+ key: '_destroy',
+ value: function _destroy() {
+ this.$element.find('.' + this.options.linkClass).off('.zf.tabs').hide().end().find('.' + this.options.panelClass).hide();
+
+ if (this.options.matchHeight) {
+ if (this._setHeightMqHandler != null) {
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default()(window).off('changed.zf.mediaquery', this._setHeightMqHandler);
+ }
+ }
+
+ if (this.options.deepLink) {
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default()(window).off('popstate', this._checkDeepLink);
+ }
+ }
+ }]);
+
+ return Tabs;
+}(__WEBPACK_IMPORTED_MODULE_3__foundation_plugin__["a" /* Plugin */]);
+
+Tabs.defaults = {
+ /**
+ * Allows the window to scroll to content of pane specified by hash anchor
+ * @option
+ * @type {boolean}
+ * @default false
+ */
+ deepLink: false,
+
+ /**
+ * Adjust the deep link scroll to make sure the top of the tab panel is visible
+ * @option
+ * @type {boolean}
+ * @default false
+ */
+ deepLinkSmudge: false,
+
+ /**
+ * Animation time (ms) for the deep link adjustment
+ * @option
+ * @type {number}
+ * @default 300
+ */
+ deepLinkSmudgeDelay: 300,
+
+ /**
+ * Update the browser history with the open tab
+ * @option
+ * @type {boolean}
+ * @default false
+ */
+ updateHistory: false,
+
+ /**
+ * Allows the window to scroll to content of active pane on load if set to true.
+ * Not recommended if more than one tab panel per page.
+ * @option
+ * @type {boolean}
+ * @default false
+ */
+ autoFocus: false,
+
+ /**
+ * Allows keyboard input to 'wrap' around the tab links.
+ * @option
+ * @type {boolean}
+ * @default true
+ */
+ wrapOnKeys: true,
+
+ /**
+ * Allows the tab content panes to match heights if set to true.
+ * @option
+ * @type {boolean}
+ * @default false
+ */
+ matchHeight: false,
+
+ /**
+ * Allows active tabs to collapse when clicked.
+ * @option
+ * @type {boolean}
+ * @default false
+ */
+ activeCollapse: false,
+
+ /**
+ * Class applied to `li`'s in tab link list.
+ * @option
+ * @type {string}
+ * @default 'tabs-title'
+ */
+ linkClass: 'tabs-title',
+
+ /**
+ * Class applied to the active `li` in tab link list.
+ * @option
+ * @type {string}
+ * @default 'is-active'
+ */
+ linkActiveClass: 'is-active',
+
+ /**
+ * Class applied to the content containers.
+ * @option
+ * @type {string}
+ * @default 'tabs-panel'
+ */
+ panelClass: 'tabs-panel',
+
+ /**
+ * Class applied to the active content container.
+ * @option
+ * @type {string}
+ * @default 'is-active'
+ */
+ panelActiveClass: 'is-active'
+};
+
+
+
+/***/ }),
+/* 16 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Positionable; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_util_box__ = __webpack_require__(7);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_plugin__ = __webpack_require__(2);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_core__ = __webpack_require__(1);
+
+
+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; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+
+
+
+
+var POSITIONS = ['left', 'right', 'top', 'bottom'];
+var VERTICAL_ALIGNMENTS = ['top', 'bottom', 'center'];
+var HORIZONTAL_ALIGNMENTS = ['left', 'right', 'center'];
+
+var ALIGNMENTS = {
+ 'left': VERTICAL_ALIGNMENTS,
+ 'right': VERTICAL_ALIGNMENTS,
+ 'top': HORIZONTAL_ALIGNMENTS,
+ 'bottom': HORIZONTAL_ALIGNMENTS
+};
+
+function nextItem(item, array) {
+ var currentIdx = array.indexOf(item);
+ if (currentIdx === array.length - 1) {
+ return array[0];
+ } else {
+ return array[currentIdx + 1];
+ }
+}
+
+var Positionable = function (_Plugin) {
+ _inherits(Positionable, _Plugin);
+
+ function Positionable() {
+ _classCallCheck(this, Positionable);
+
+ return _possibleConstructorReturn(this, (Positionable.__proto__ || Object.getPrototypeOf(Positionable)).apply(this, arguments));
+ }
+
+ _createClass(Positionable, [{
+ key: '_init',
+
+ /**
+ * Abstract class encapsulating the tether-like explicit positioning logic
+ * including repositioning based on overlap.
+ * Expects classes to define defaults for vOffset, hOffset, position,
+ * alignment, allowOverlap, and allowBottomOverlap. They can do this by
+ * extending the defaults, or (for now recommended due to the way docs are
+ * generated) by explicitly declaring them.
+ *
+ **/
+
+ value: function _init() {
+ this.triedPositions = {};
+ this.position = this.options.position === 'auto' ? this._getDefaultPosition() : this.options.position;
+ this.alignment = this.options.alignment === 'auto' ? this._getDefaultAlignment() : this.options.alignment;
+ }
+ }, {
+ key: '_getDefaultPosition',
+ value: function _getDefaultPosition() {
+ return 'bottom';
+ }
+ }, {
+ key: '_getDefaultAlignment',
+ value: function _getDefaultAlignment() {
+ switch (this.position) {
+ case 'bottom':
+ case 'top':
+ return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__foundation_util_core__["c" /* rtl */])() ? 'right' : 'left';
+ case 'left':
+ case 'right':
+ return 'bottom';
+ }
+ }
+
+ /**
+ * Adjusts the positionable possible positions by iterating through alignments
+ * and positions.
+ * @function
+ * @private
+ */
+
+ }, {
+ key: '_reposition',
+ value: function _reposition() {
+ if (this._alignmentsExhausted(this.position)) {
+ this.position = nextItem(this.position, POSITIONS);
+ this.alignment = ALIGNMENTS[this.position][0];
+ } else {
+ this._realign();
+ }
+ }
+
+ /**
+ * Adjusts the dropdown pane possible positions by iterating through alignments
+ * on the current position.
+ * @function
+ * @private
+ */
+
+ }, {
+ key: '_realign',
+ value: function _realign() {
+ this._addTriedPosition(this.position, this.alignment);
+ this.alignment = nextItem(this.alignment, ALIGNMENTS[this.position]);
+ }
+ }, {
+ key: '_addTriedPosition',
+ value: function _addTriedPosition(position, alignment) {
+ this.triedPositions[position] = this.triedPositions[position] || [];
+ this.triedPositions[position].push(alignment);
+ }
+ }, {
+ key: '_positionsExhausted',
+ value: function _positionsExhausted() {
+ var isExhausted = true;
+ for (var i = 0; i < POSITIONS.length; i++) {
+ isExhausted = isExhausted && this._alignmentsExhausted(POSITIONS[i]);
+ }
+ return isExhausted;
+ }
+ }, {
+ key: '_alignmentsExhausted',
+ value: function _alignmentsExhausted(position) {
+ return this.triedPositions[position] && this.triedPositions[position].length == ALIGNMENTS[position].length;
+ }
+
+ // When we're trying to center, we don't want to apply offset that's going to
+ // take us just off center, so wrap around to return 0 for the appropriate
+ // offset in those alignments. TODO: Figure out if we want to make this
+ // configurable behavior... it feels more intuitive, especially for tooltips, but
+ // it's possible someone might actually want to start from center and then nudge
+ // slightly off.
+
+ }, {
+ key: '_getVOffset',
+ value: function _getVOffset() {
+ return this.options.vOffset;
+ }
+ }, {
+ key: '_getHOffset',
+ value: function _getHOffset() {
+ return this.options.hOffset;
+ }
+ }, {
+ key: '_setPosition',
+ value: function _setPosition($anchor, $element, $parent) {
+ if ($anchor.attr('aria-expanded') === 'false') {
+ return false;
+ }
+ var $eleDims = __WEBPACK_IMPORTED_MODULE_0__foundation_util_box__["a" /* Box */].GetDimensions($element),
+ $anchorDims = __WEBPACK_IMPORTED_MODULE_0__foundation_util_box__["a" /* Box */].GetDimensions($anchor);
+
+ $element.offset(__WEBPACK_IMPORTED_MODULE_0__foundation_util_box__["a" /* Box */].GetExplicitOffsets($element, $anchor, this.position, this.alignment, this._getVOffset(), this._getHOffset()));
+
+ if (!this.options.allowOverlap) {
+ var overlaps = {};
+ var minOverlap = 100000000;
+ // default coordinates to how we start, in case we can't figure out better
+ var minCoordinates = { position: this.position, alignment: this.alignment };
+ while (!this._positionsExhausted()) {
+ var overlap = __WEBPACK_IMPORTED_MODULE_0__foundation_util_box__["a" /* Box */].OverlapArea($element, $parent, false, false, this.options.allowBottomOverlap);
+ if (overlap === 0) {
+ return;
+ }
+
+ if (overlap < minOverlap) {
+ minOverlap = overlap;
+ minCoordinates = { position: this.position, alignment: this.alignment };
+ }
+
+ this._reposition();
+
+ $element.offset(__WEBPACK_IMPORTED_MODULE_0__foundation_util_box__["a" /* Box */].GetExplicitOffsets($element, $anchor, this.position, this.alignment, this._getVOffset(), this._getHOffset()));
+ }
+ // If we get through the entire loop, there was no non-overlapping
+ // position available. Pick the version with least overlap.
+ this.position = minCoordinates.position;
+ this.alignment = minCoordinates.alignment;
+ $element.offset(__WEBPACK_IMPORTED_MODULE_0__foundation_util_box__["a" /* Box */].GetExplicitOffsets($element, $anchor, this.position, this.alignment, this._getVOffset(), this._getHOffset()));
+ }
+ }
+ }]);
+
+ return Positionable;
+}(__WEBPACK_IMPORTED_MODULE_1__foundation_plugin__["a" /* Plugin */]);
+
+Positionable.defaults = {
+ /**
+ * Position of positionable relative to anchor. Can be left, right, bottom, top, or auto.
+ * @option
+ * @type {string}
+ * @default 'auto'
+ */
+ position: 'auto',
+ /**
+ * Alignment of positionable relative to anchor. Can be left, right, bottom, top, center, or auto.
+ * @option
+ * @type {string}
+ * @default 'auto'
+ */
+ alignment: 'auto',
+ /**
+ * Allow overlap of container/window. If false, dropdown positionable first
+ * try to position as defined by data-position and data-alignment, but
+ * reposition if it would cause an overflow.
+ * @option
+ * @type {boolean}
+ * @default false
+ */
+ allowOverlap: false,
+ /**
+ * Allow overlap of only the bottom of the container. This is the most common
+ * behavior for dropdowns, allowing the dropdown to extend the bottom of the
+ * screen but not otherwise influence or break out of the container.
+ * @option
+ * @type {boolean}
+ * @default true
+ */
+ allowBottomOverlap: true,
+ /**
+ * Number of pixels the positionable should be separated vertically from anchor
+ * @option
+ * @type {number}
+ * @default 0
+ */
+ vOffset: 0,
+ /**
+ * Number of pixels the positionable should be separated horizontally from anchor
+ * @option
+ * @type {number}
+ * @default 0
+ */
+ hOffset: 0
+};
+
+
+
+/***/ }),
+/* 17 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Touch; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery__ = __webpack_require__(0);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_jquery__);
+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; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+//**************************************************
+//**Work inspired by multiple jquery swipe plugins**
+//**Done by Yohai Ararat ***************************
+//**************************************************
+
+
+
+var Touch = {};
+
+var startPosX,
+ startPosY,
+ startTime,
+ elapsedTime,
+ isMoving = false;
+
+function onTouchEnd() {
+ // alert(this);
+ this.removeEventListener('touchmove', onTouchMove);
+ this.removeEventListener('touchend', onTouchEnd);
+ isMoving = false;
+}
+
+function onTouchMove(e) {
+ if (__WEBPACK_IMPORTED_MODULE_0_jquery___default.a.spotSwipe.preventDefault) {
+ e.preventDefault();
+ }
+ if (isMoving) {
+ var x = e.touches[0].pageX;
+ var y = e.touches[0].pageY;
+ var dx = startPosX - x;
+ var dy = startPosY - y;
+ var dir;
+ elapsedTime = new Date().getTime() - startTime;
+ if (Math.abs(dx) >= __WEBPACK_IMPORTED_MODULE_0_jquery___default.a.spotSwipe.moveThreshold && elapsedTime <= __WEBPACK_IMPORTED_MODULE_0_jquery___default.a.spotSwipe.timeThreshold) {
+ dir = dx > 0 ? 'left' : 'right';
+ }
+ // else if(Math.abs(dy) >= $.spotSwipe.moveThreshold && elapsedTime <= $.spotSwipe.timeThreshold) {
+ // dir = dy > 0 ? 'down' : 'up';
+ // }
+ if (dir) {
+ e.preventDefault();
+ onTouchEnd.call(this);
+ __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).trigger('swipe', dir).trigger('swipe' + dir);
+ }
+ }
+}
+
+function onTouchStart(e) {
+ if (e.touches.length == 1) {
+ startPosX = e.touches[0].pageX;
+ startPosY = e.touches[0].pageY;
+ isMoving = true;
+ startTime = new Date().getTime();
+ this.addEventListener('touchmove', onTouchMove, false);
+ this.addEventListener('touchend', onTouchEnd, false);
+ }
+}
+
+function init() {
+ this.addEventListener && this.addEventListener('touchstart', onTouchStart, false);
+}
+
+function teardown() {
+ this.removeEventListener('touchstart', onTouchStart);
+}
+
+var SpotSwipe = function () {
+ function SpotSwipe($) {
+ _classCallCheck(this, SpotSwipe);
+
+ this.version = '1.0.0';
+ this.enabled = 'ontouchstart' in document.documentElement;
+ this.preventDefault = false;
+ this.moveThreshold = 75;
+ this.timeThreshold = 200;
+ this.$ = $;
+ this._init();
+ }
+
+ _createClass(SpotSwipe, [{
+ key: '_init',
+ value: function _init() {
+ var $ = this.$;
+ $.event.special.swipe = { setup: init };
+
+ $.each(['left', 'up', 'down', 'right'], function () {
+ $.event.special['swipe' + this] = { setup: function () {
+ $(this).on('swipe', $.noop);
+ } };
+ });
+ }
+ }]);
+
+ return SpotSwipe;
+}();
+
+/****************************************************
+ * As far as I can tell, both setupSpotSwipe and *
+ * setupTouchHandler should be idempotent, *
+ * because they directly replace functions & *
+ * values, and do not add event handlers directly. *
+ ****************************************************/
+
+Touch.setupSpotSwipe = function ($) {
+ $.spotSwipe = new SpotSwipe($);
+};
+
+/****************************************************
+ * Method for adding pseudo drag events to elements *
+ ***************************************************/
+Touch.setupTouchHandler = function ($) {
+ $.fn.addTouch = function () {
+ this.each(function (i, el) {
+ $(el).bind('touchstart touchmove touchend touchcancel', function () {
+ //we pass the original event object because the jQuery event
+ //object is normalized to w3c specs and does not provide the TouchList
+ handleTouch(event);
+ });
+ });
+
+ var handleTouch = function (event) {
+ var touches = event.changedTouches,
+ first = touches[0],
+ eventTypes = {
+ touchstart: 'mousedown',
+ touchmove: 'mousemove',
+ touchend: 'mouseup'
+ },
+ type = eventTypes[event.type],
+ simulatedEvent;
+
+ if ('MouseEvent' in window && typeof window.MouseEvent === 'function') {
+ simulatedEvent = new window.MouseEvent(type, {
+ 'bubbles': true,
+ 'cancelable': true,
+ 'screenX': first.screenX,
+ 'screenY': first.screenY,
+ 'clientX': first.clientX,
+ 'clientY': first.clientY
+ });
+ } else {
+ simulatedEvent = document.createEvent('MouseEvent');
+ simulatedEvent.initMouseEvent(type, true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY, false, false, false, false, 0 /*left*/, null);
+ }
+ first.target.dispatchEvent(simulatedEvent);
+ };
+ };
+};
+
+Touch.init = function ($) {
+ if (typeof $.spotSwipe === 'undefined') {
+ Touch.setupSpotSwipe($);
+ Touch.setupTouchHandler($);
+ }
+};
+
+
+
+/***/ }),
+/* 18 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Abide; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery__ = __webpack_require__(0);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_jquery__);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_plugin__ = __webpack_require__(2);
+
+
+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; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+
+
+
+/**
+ * Abide module.
+ * @module foundation.abide
+ */
+
+var Abide = function (_Plugin) {
+ _inherits(Abide, _Plugin);
+
+ function Abide() {
+ _classCallCheck(this, Abide);
+
+ return _possibleConstructorReturn(this, (Abide.__proto__ || Object.getPrototypeOf(Abide)).apply(this, arguments));
+ }
+
+ _createClass(Abide, [{
+ key: '_setup',
+
+ /**
+ * Creates a new instance of Abide.
+ * @class
+ * @name Abide
+ * @fires Abide#init
+ * @param {Object} element - jQuery object to add the trigger to.
+ * @param {Object} options - Overrides to the default plugin settings.
+ */
+ value: function _setup(element) {
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ this.$element = element;
+ this.options = __WEBPACK_IMPORTED_MODULE_0_jquery___default.a.extend(true, {}, Abide.defaults, this.$element.data(), options);
+
+ this.className = 'Abide'; // ie9 back compat
+ this._init();
+ }
+
+ /**
+ * Initializes the Abide plugin and calls functions to get Abide functioning on load.
+ * @private
+ */
+
+ }, {
+ key: '_init',
+ value: function _init() {
+ this.$inputs = this.$element.find('input, textarea, select');
+
+ this._events();
+ }
+
+ /**
+ * Initializes events for Abide.
+ * @private
+ */
+
+ }, {
+ key: '_events',
+ value: function _events() {
+ var _this3 = this;
+
+ this.$element.off('.abide').on('reset.zf.abide', function () {
+ _this3.resetForm();
+ }).on('submit.zf.abide', function () {
+ return _this3.validateForm();
+ });
+
+ if (this.options.validateOn === 'fieldChange') {
+ this.$inputs.off('change.zf.abide').on('change.zf.abide', function (e) {
+ _this3.validateInput(__WEBPACK_IMPORTED_MODULE_0_jquery___default()(e.target));
+ });
+ }
+
+ if (this.options.liveValidate) {
+ this.$inputs.off('input.zf.abide').on('input.zf.abide', function (e) {
+ _this3.validateInput(__WEBPACK_IMPORTED_MODULE_0_jquery___default()(e.target));
+ });
+ }
+
+ if (this.options.validateOnBlur) {
+ this.$inputs.off('blur.zf.abide').on('blur.zf.abide', function (e) {
+ _this3.validateInput(__WEBPACK_IMPORTED_MODULE_0_jquery___default()(e.target));
+ });
+ }
+ }
+
+ /**
+ * Calls necessary functions to update Abide upon DOM change
+ * @private
+ */
+
+ }, {
+ key: '_reflow',
+ value: function _reflow() {
+ this._init();
+ }
+
+ /**
+ * Checks whether or not a form element has the required attribute and if it's checked or not
+ * @param {Object} element - jQuery object to check for required attribute
+ * @returns {Boolean} Boolean value depends on whether or not attribute is checked or empty
+ */
+
+ }, {
+ key: 'requiredCheck',
+ value: function requiredCheck($el) {
+ if (!$el.attr('required')) return true;
+
+ var isGood = true;
+
+ switch ($el[0].type) {
+ case 'checkbox':
+ isGood = $el[0].checked;
+ break;
+
+ case 'select':
+ case 'select-one':
+ case 'select-multiple':
+ var opt = $el.find('option:selected');
+ if (!opt.length || !opt.val()) isGood = false;
+ break;
+
+ default:
+ if (!$el.val() || !$el.val().length) isGood = false;
+ }
+
+ return isGood;
+ }
+
+ /**
+ * Get:
+ * - Based on $el, the first element(s) corresponding to `formErrorSelector` in this order:
+ * 1. The element's direct sibling('s).
+ * 2. The element's parent's children.
+ * - Element(s) with the attribute `[data-form-error-for]` set with the element's id.
+ *
+ * This allows for multiple form errors per input, though if none are found, no form errors will be shown.
+ *
+ * @param {Object} $el - jQuery object to use as reference to find the form error selector.
+ * @returns {Object} jQuery object with the selector.
+ */
+
+ }, {
+ key: 'findFormError',
+ value: function findFormError($el) {
+ var id = $el[0].id;
+ var $error = $el.siblings(this.options.formErrorSelector);
+
+ if (!$error.length) {
+ $error = $el.parent().find(this.options.formErrorSelector);
+ }
+
+ $error = $error.add(this.$element.find('[data-form-error-for="' + id + '"]'));
+
+ return $error;
+ }
+
+ /**
+ * Get the first element in this order:
+ * 2. The